千家信息网

分析Java中CRM之项目思路

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要讲解了"分析Java中CRM之项目思路",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"分析Java中CRM之项目思路"吧!一、登录模块全程思
千家信息网最后更新 2026年10月31日分析Java中CRM之项目思路

这篇文章主要讲解了"分析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 {    @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映射层直接生成,其余静态页面和素材略....(详情代码看上传资源)

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

营销模块:
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 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 {    @Resource    private SaleChanceMapper saleChanceMapper;    /*//分页显示*/    public Map manyPage(SaleChanceQuery query){        Map map = new HashMap<>();        //设置分页        PageHelper.startPage(query.getPage(), query.getLimit());        //对数据进行分页        PageInfo 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之项目思路这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

密码 用户 页面 登录 数据 思路 方法 分配 营销 成功 机会 新密 分析 模块 用户名 表单 处理 项目 代码 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司排名 广州紫鲸互联网科技有限公司 科技信息互联网 科技制造互联网公司 深圳互联网科技公司 北京互联网科技有限公司 远信互联网科技 美国互联网黑科技 互联网科技公司介绍 互联网金融和金融科技 互联网巨头投资的硬核科技 欧洲十大科技互联网公司 银川新华互联网科技职业技术培训学校图片 电子科技大学互联网创业大赛 深圳艾果互联网通讯科技 互联网第三次科技革命特征 工业互联网科技创业 神州科技互联网有限公司 中国互联网公司的科技投入 安徽零酒互联网科技有限公司 亿人帮互联网科技有限公司 金融科技与互联网金融 以房互联网科技 广州凡科互联网科技 互联网科技有限公司 翻译 盛创互联网科技有限公司 世界互联网科技公司市值排名 区块链结合互联网科技 福建互联网展示科技馆设计 如何强化互联网金融科技
0