返回顶部
首页 > 资讯 > 精选 >分析Java中CRM之项目思路
  • 777
分享到

分析Java中CRM之项目思路

2023-06-25 12:06:07 777人浏览 八月长安
摘要

这篇文章主要讲解了“分析Java中CRM之项目思路”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Java中CRM之项目思路”吧!一、登录模块全程思路分析登录模块:1、对用户名和密码的校验

这篇文章主要讲解了“分析Java中CRM之项目思路”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Java中CRM之项目思路”吧!

一、登录模块全程思路分析

登录模块:
1、对用户名和密码的校验,并存储在cookie中,方便后期的免登录操作。
2、对用户基本信息的修改,通过获取表单用户修改的数据,进行ajax请求,对修改之后id对应用户进行数据库信息修改
3、修改密码,获取用户输入的表单数据,进行service层校验,判断原密码,新密码确认密码,最后对数据库用户密码进行修改
4、每次修改信息后会自动清楚cookie内的数据,退出重新登录
5、service层会调用很多工具类提供便洁业务处理

⭐核心代码

controller层UserController.java

@Controller@RequestMapping("user")public class UserController extends BaseController {    @Autowired    UserService userService;    //修改密码页面跳转    @RequestMapping("toPassWordPage")    public String updatePwd(){        return "user/password";    }    //登录    @RequestMapping("login")    @ResponseBody    public ResultInfo login(User user){        ResultInfo result=new ResultInfo();        try{            //捕获异常            UserModel userModel=userService.userLogin(user.getUserName(),user.getUserPwd());            //登录成功            result.setCode(200);            result.setMsg("登录成功~");            result.setResult(userModel);        }catch (ParamsException ex){            ex.printStackTrace();            result.setCode(ex.getCode());            result.setMsg(ex.getMsg());        }catch (Exception e){            e.printStackTrace();            result.setCode(500);            result.setMsg("操作失败~");        }        return result;    }        @PostMapping("updatePwd")    @ResponseBody    public ResultInfo updatePwd(httpservletRequest req,String oldPwd,String newPwd,String againPwd){        ResultInfo result=new ResultInfo();        //获取cookie获取用户ID        int userId=LoginUserUtil.releaseUserIdFromCookie(req);       userService.updatePwd(userId,oldPwd,newPwd,againPwd);        return result;    }}

Service层UserService.java

@Servicepublic class UserService extends BaseService<User,Integer> {    @Resource    UserMapper userMapper;        public UserModel userLogin(String userName,String userPwd){        //判断用户名和密码是否为空        checkNull(userName,userPwd);        //检查是否已经存在        User user=userMapper.selectByuserName(userName);        AssertUtil.isTrue(user==null,"用户名不存在!");        //检查密码        checkPwd(userPwd,user.getUserPwd());        return buildInfo(user);    }    //设置返回信息    private UserModel buildInfo(User user) {        UserModel um=new UserModel();        um.setUserName(user.getUserName());        um.setUserId(UserIDBase64.encoderUserID(user.getId()));//对ID加密        um.setTrueName(user.getTrueName());        return um;    }    //密码验证    private void checkPwd(String userPwd, String userPwd1) {        String enPwd=Md5Util.encode(userPwd);        AssertUtil.isTrue(!enPwd.equals(userPwd1),"密码不正确!");    }    //判断是否为空    private  void checkNull(String userName,String userPwd){        //判断用户名和密码是否为空        AssertUtil.isTrue(StringUtils.isBlank(userName),"用户名不能为空!");        AssertUtil.isTrue(StringUtils.isBlank(userPwd),"用户密码不能为空!");    }        public void updatePwd(int userId,String oldPwd,String newPwd,String againPwd){        //通过id获取用户        System.out.println(userId);        User user=userMapper.selectByPrimaryKey(userId);        System.out.println(user);        //检验并修改密码        isOkForPwd(user,oldPwd,newPwd,againPwd);        //修改密码        user.setUserPwd(Md5Util.encode(newPwd));        //修改数据库内容        AssertUtil.isTrue(userMapper.updateByPrimaryKeySelective(user)<1,"操作失败");    }    //检验密码    private void isOkForPwd(User user, String oldPwd, String newPwd, String againPwd) {        //判断用户是否为空        AssertUtil.isTrue(user==null,"用户未登录或不存在!");        //原密码是否为空        AssertUtil.isTrue(StringUtils.isBlank(oldPwd),"原密码不能为空!");        //新密码判断是否为空        AssertUtil.isTrue(StringUtils.isBlank(newPwd),"新密码不能为空!");        //对原密码判断是否正确        AssertUtil.isTrue(!(user.getUserPwd().equals(Md5Util.encode(oldPwd))),"原密码不正确!");        //对新密码和原密码进行判断        AssertUtil.isTrue(oldPwd.equals(newPwd),"原密码和新密码不能一致!");        //对再次输入判断是否为空        AssertUtil.isTrue(StringUtils.isBlank(againPwd),"二次验证密码不能为空!");        //判断新密码与二次输入        AssertUtil.isTrue(!(newPwd.equals(againPwd)),"新密码与第二次输入不一致!");    }}

全局异常具体代码:GlobalExceptionResolver.java

@Componentpublic class GlobalExceptionResolver implements HandlerExceptionResolver {    @Override    public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object handler, Exception ex) {      //登录异常处理        if(ex instanceof NoLoginException){            // 如果捕获的是未登录异常,则重定向到登录页面            ModelAndView mv = new ModelAndView("redirect:/index");            return mv;        }        //实例化ModelandView 异常则跳转error        ModelAndView mv=new ModelAndView("error");        mv.addObject("code",400);        mv.addObject("msg","系统异常~");        if(handler instanceof HandlerMethod){            //则返回页面            HandlerMethod hm=(HandlerMethod) handler;            //通过反射获取注解@responseBody对象            ResponseBody resquestBody=hm.getMethod().getDeclaredAnnotation(ResponseBody.class);            //判断是否被注解            if(resquestBody==null){                //返回页面                if(ex instanceof ParamsException){                    ParamsException param=(ParamsException) ex;                    //设置                    mv.addObject("code",param.getCode());                    mv.addObject("msg",param.getMsg());                }            }else{                //返回JSON                ResultInfo result=new ResultInfo();                result.setCode(300);                result.setMsg("系统异常~");                //异常处理                if(ex instanceof ParamsException){                    ParamsException param=(ParamsException) ex;                    //设置                    result.setCode(param.getCode());                    result.setMsg(param.getMsg());                    // 设置响应类型和编码格式 (响应jsON格式)                    resp.setContentType("application/json;charset=utf-8");                    //通过数据流写出                    PrintWriter out= null;                    try {                        out = resp.getWriter();                        out.write(JSON.toJSONString(result));                        out.flush();                    } catch (IOException e) {                        e.printStackTrace();                    }finally {                        if(out!=null){                            out.close();                        }                    }                    return null;                }            }        }        return mv;    }}

拦截器NoLoginInterceptor.java

public class NoLoginInterceptor extends HandlerInterceptorAdapter {    @Resource    UserService userService;    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        //根据cookie中id值登录拦截        //获取cookie用户id        Integer userId = LoginUserUtil.releaseUserIdFromCookie(request);        if(userId==null || userService.selectByPrimaryKey(userId)==null){            throw new NoLoginException("未登录异常~");        }        return true;    }}

dao层与mappers映射层直接生成,其余静态页面和素材略....(详情代码看上传资源)

二、营销模块全程思路分析

分析Java中CRM之项目思路

分析Java中CRM之项目思路

分析Java中CRM之项目思路

营销模块:
1、主要进行营销机会的添加、删除、编辑
2、首先通过静态页面的监听,判断执行什么操作
2.1、点击添加:对应js调用addorupdata()方法-->open开启规定好大小的页面,
跳转controller下addorupdata(Integer id,Model model)方法进行判断是
否有id,无则直接转发静态资源页面addorupdata.ftl页面,此时open的小页面便
有一个空的表单页面了。
2.2、点击修改:对js调用addorupdata(id)方法-->open开启规定好大小的页面,
带id转发至controller层addorupdata(Integer id,Model model)方法判断
id是否有值,有则存入对应id的User对象于model中,转发至addorupdata.ftl页
面,此时open的小页面便是一个有内容的表单。
2.3、点击删除:js文件会直接调用deletesale(data),直接获取要删除对象的id,
多个这返回拼接一个ids=1&ids=2&ids=3发送Ajax请求至controller层调用delete(Integer[] ids)
方法对其进行处理。
3、其次,判断什么操作之后,便会弹出对应窗口addorupdata.ftl,此时对应js对其监听是否提交
3.1、点击提交,则会判断表单提交数据中是否含有id值,有则发送Ajax请求至controller层
调用updata(User user)方法对其进行修改。
3.2、点击提交,id无值,则发送Ajax请求至controller层调用add(User user)方法对其进行添加
4、删除这里直接写一个批量删除即可,无序打开小窗口,直接Ajax请求,调用controller层的delete方法进行处理

其余模块的逻辑,于营销模块思路一致,不做更多概述~,源码直接看上传资源

⭐核心代码

SaleChanceController.java

@Controller@RequestMapping("sale_chance")public class SaleChanceController extends BaseController {    @Autowired    private SaleChanceService saleChanceService;    @Autowired    private UserService userService;    //营销机会页面跳转    @RequestMapping("index")    public String toSale(){        return "/saleChance/sale_chance";    }    //添加和修改页面    @RequestMapping("addOrUpdateDialog")    public String addorUpdata(Integer id, Model model){        //如果id有值        if(id!=null){            //通过ID获取对象            SaleChance saleChance=saleChanceService.selectByPrimaryKey(id);            model.addAttribute("saleChance",saleChance);        }        return "saleChance/add_update";    }    @RequestMapping("list")    @ResponseBody    public Map<String,Object> manyPage(SaleChanceQuery query){        return saleChanceService.manyPage(query);    }        @RequestMapping("save")    @ResponseBody    public ResultInfo save(HttpServletRequest req, SaleChance saleChance){        //获取cookie中的id       int id= LoginUserUtil.releaseUserIdFromCookie(req);       //通过id创建者       String createName=userService.selectByPrimaryKey(id).getTrueName();       //设置创建者        saleChance.setCreateMan(createName);        //添加        saleChanceService.addSaleChance(saleChance);        return success("添加成功");    }        @RequestMapping("updata")    @ResponseBody    public ResultInfo updata(SaleChance saleChance){        saleChanceService.updataSale(saleChance);        return success("修改成功");    }        @RequestMapping("dels")    @ResponseBody    public ResultInfo delete(Integer[] ids){        System.out.println(Arrays.toString(ids));        saleChanceService.deleteall(ids);        return success("删除成功~");    }}

SaleChanceService.java

@Servicepublic class SaleChanceService extends BaseService<SaleChance,Integer> {    @Resource    private SaleChanceMapper saleChanceMapper;        public Map<String,Object> manyPage(SaleChanceQuery query){        Map<String, Object> map = new HashMap<>();        //设置分页        PageHelper.startPage(query.getPage(), query.getLimit());        //对数据进行分页        PageInfo<SaleChance> pageInfo = new PageInfo<>(saleChanceMapper.selectByParams(query));        map.put("code",0);        map.put("msg", "success");        map.put("count", pageInfo.getTotal());        map.put("data", pageInfo.getList());        return map;    }       @Transactional(propagation = Propagation.REQUIRED)    public void addSaleChance(SaleChance saleChance){        //判断客户名称,机会来源,联系人,联系电话,        checkInfo(saleChance.getCustomerName(),saleChance.getChanceSource(),saleChance.getLinkMan(),saleChance.getLinkPhone());        //state状态是否分配 0 未分配 1已经分配        if(StringUtils.isBlank(saleChance.getAssignMan())){            saleChance.setDevResult(0);            saleChance.setState(0);        }        if(StringUtils.isNotBlank(saleChance.getAssignMan())){            saleChance.setDevResult(1);            saleChance.setState(1);            saleChance.setAssignTime(new Date());        }        //设置默认值        saleChance.setCreateDate(new Date());        saleChance.setUpdateDate(new Date());        saleChance.setIsValid(1);        //判断插入是否成功        AssertUtil.isTrue(insertSelective(saleChance)<1,"添加失败!");    }       @Transactional(propagation = Propagation.REQUIRED)    public void updataSale(SaleChance saleChance){        //通过id判断是否存在        SaleChance sc=selectByPrimaryKey(saleChance.getId());        AssertUtil.isTrue(sc==null,"更新商机不存在!");        //基础判断        checkInfo(saleChance.getCustomerName(),saleChance.getChanceSource(),saleChance.getLinkMan(),saleChance.getLinkPhone());        //是否分配]        //原营销机会未分配,改为已经分配        if(StringUtils.isBlank(sc.getAssignMan()) && saleChance.getAssignMan()!=null){            sc.setState(1);            sc.setDevResult(1);            sc.setAssignTime(new Date());        }        //原营销机会已经分配,改为未分配        if(StringUtils.isNotBlank(sc.getAssignMan()) && StringUtils.isBlank(sc.getAssignMan())){            sc.setState(0);            sc.setDevResult(0);            sc.setAssignTime(null);            sc.setAssignMan("");        }        //插入        AssertUtil.isTrue(updateByPrimaryKeySelective(saleChance)<1,"添加失败!");    }        @Transactional(propagation = Propagation.REQUIRED)    public void  deleteall(Integer[] ids){        //判断是否为空        AssertUtil.isTrue((ids==null || ids.length==0),"删除的ID不存在!");        System.out.println(Arrays.toString(ids));        //删除是否成功        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids) < 0,"删除失败~~~");    }    //校验    private void checkInfo(String customerName, String chanceSource, String linkMan, String linkPhone) {        AssertUtil.isTrue(StringUtils.isBlank(customerName), "用户名称不能为空!");        AssertUtil.isTrue(StringUtils.isBlank(chanceSource),"机会来源不能为空!");        AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空!");        AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系电话不能为空!");        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"电话号码不合法!");    }}

感谢各位的阅读,以上就是“分析Java中CRM之项目思路”的内容了,经过本文的学习后,相信大家对分析Java中CRM之项目思路这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 分析Java中CRM之项目思路

本文链接: https://lsjlt.com/news/304754.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 分析Java中CRM之项目思路
    这篇文章主要讲解了“分析Java中CRM之项目思路”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析Java中CRM之项目思路”吧!一、登录模块全程思路分析登录模块:1、对用户名和密码的校验...
    99+
    2023-06-25
  • Java 初识CRM之项目思路解析
    CRM项目 一、登录模块全程思路分析 登录模块: 1、对用户名和密码的校验,并存储在cookie中,方便后期的免登录操作。 2、对用户基本信息的修改,通过获取表单用户修改的数据...
    99+
    2024-04-02
  • Nginx Gunicorn flask项目部署思路分析详解
    目录部署目的部署思路gunicorn启动flasknginx指向gunicorn部署目的 之前聊了很多flask的知识点,那么完成一个flask项目之后,该这么让大家使用呢,直接放...
    99+
    2022-12-08
    Nginx Gunicorn flask部署 Nginx 项目部署
  • vue自动路由之单页面项目的示例分析
    这篇文章给大家分享的是有关vue自动路由之单页面项目的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。这是一个什么项目?答:这是一个单页面的vue.js项目,主要为了实现在...
    99+
    2024-04-02
  • vue项目两种方式实现竖向表格的思路分析
    问题描述 在我们做项目中,常见的是横向表格,但是偶尔的需求,也会做竖向的表格。比如下图这样的竖向表格: 我们看到这样的效果图,第一时间想到的是使用UI框架,改一改搞定。但是饿了...
    99+
    2024-04-02
  • java项目中的多线程实践分析
    本篇内容主要讲解“java项目中的多线程实践分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java项目中的多线程实践分析”吧!项目开发中对于一些数据的处理需要用到多线程,比如文件的批量上传,...
    99+
    2023-06-25
  • Java 实战项目之CRM客户管理系统的实现流程
    一、项目简述 功能包括: 用户管理,系统管理,客户管理,客户服务,客户关怀, 销售机会,统计管理等等。 二、项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql...
    99+
    2024-04-02
  • Java项目中classpath类路径是什么
    目录一、简介二、获取classpath路径三、获取项目路径classpath 和 classpath* 区别: 总结Spring Boot 一、简介 classpath类路...
    99+
    2023-02-23
    classpath类路径 classpath在哪 查看classpath
  • Android编程入门之HelloWorld项目目录结构分析
    本文实例讲述了Android编程入门之HelloWorld项目目录结构。分享给大家供大家参考,具体如下: 我们介绍了如何搭建Android开发环境及简单地建立一个HelloWo...
    99+
    2022-06-06
    helloworld Android
  • 在项目中使用redis做缓存的一些思路
    目录在项目中redis做缓存的一些思路首先,缓存的对象有三种本人走过的一些弯路为什么没用Redis做缓存使用Table作本地缓存使用Redis作缓存让我们来思考一下下面几个问题那么使...
    99+
    2024-04-02
  • Java项目中classpath类路径如何获取
    今天小编给大家分享一下Java项目中classpath类路径如何获取的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、简介c...
    99+
    2023-07-05
  • 深入浅析java项目中的Map
    本篇文章给大家分享的是有关深入浅析java项目中的Map,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Map接口Map类似y(x)=x;这样的函数(key对应x,value对应...
    99+
    2023-05-31
    java map ava
  • 小项目中管理npm包版本的思路与方法
    背景 笔者在最近碰到一个问题: 有一些项目没有类似jenkins的自动部署平台,前端部署都是本地执行npm run build命令生成压缩包,然后放到服务器上面,解压到nginx ...
    99+
    2024-04-02
  • Android开发之项目模块化的示例分析
    这篇文章主要为大家展示了“Android开发之项目模块化的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android开发之项目模块化的示例分析”这篇文章吧。项目协同项目协同,也叫多项目...
    99+
    2023-05-30
    android
  • Java之Springcloud Gateway内置路由的示例分析
    这篇文章给大家分享的是有关Java之Springcloud Gateway内置路由的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Cloud Gateway路由匹配是Spring WebFl...
    99+
    2023-06-20
  • 分析JavaScript中时间格式化新思路toLocaleString()
    本篇内容主要讲解“分析JavaScript中时间格式化新思路toLocaleString()”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析JavaScript中时间格式化新思路toLocal...
    99+
    2023-06-25
  • vue中项目结构的示例分析
    这篇文章主要为大家展示了“vue中项目结构的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中项目结构的示例分析”这篇文章吧。新建一个项目之后,我们...
    99+
    2024-04-02
  • node vue项目开发之前后端分离的示例分析
    这篇文章主要介绍node vue项目开发之前后端分离的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!node vue项目开发最近看了近一周的vue开发,有诸多感触,我之前接触...
    99+
    2024-04-02
  • 图片路径如何在Java web项目中加载
    本篇文章为大家展示了图片路径如何在Java web项目中加载,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。(1)   src="/image/1_it.jpg"...
    99+
    2023-05-31
    javaweb ava 目中
  • java开发RocketMQ之NameServer路由管理源码分析
    目录1.前言2.路由元信息3.路由注册3.1Broker路由注册3.2NameServer处理路由注册3.3路由删除3.3.1Broker异常关闭3.3.2Broker正常关闭3.4...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作