Java 初识CRM之项目思路解析

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

@Service
public 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

@Component
public 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<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

@Service
public 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),"电话号码不合法!");
    }
}

总结

以上两个模块基本就是这个项目的全部思路,后面的模块思路与介绍的这两个模块思路一致,源码已上传~,1024程序员节日快乐!!🎈🎈🎈🎈

到此这篇关于Java 初识CRM之项目思路解析的文章就介绍到这了,更多相关Java CRM项目思路内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java CRM系统用户登录功能实现代码实例

    用户登录功能后台代码实现: UserMapper接口查询方法定义 /** * * @param userName * @param userPwd * @param roleName * 查询用户记录 * @return */ User queryUser(@Param("userName")String userName); <!-- 查询用户 --> <select id="queryUser" resultMap="BaseResu

  • Java 初识CRM之项目思路解析

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

  • 使用纯Java实现一个WebSSH项目的示例代码

    最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:GateOne.webssh.shellinabox等,这些项目都可以很好地实现webssh的功能,但是最终并没有采用,原因是在于这些底层大都是python写的,需要依赖很多文件,自己用的时候可以使用这种方案,快捷省事,但是做到项目中供用户使用时,总不能要求用户做到服务器中必须包含这些底层依赖,这显然不太合理,

  • 基于Java并发容器ConcurrentHashMap#put方法解析

    jdk1.7.0_79 HashMap可以说是每个Java程序员用的最多的数据结构之一了,无处不见它的身影.关于HashMap,通常也能说出它不是线程安全的.这篇文章要提到的是在多线程并发环境下的HashMap--ConcurrentHashMap,显然它必然是线程安全的,同样我们不可避免的要讨论散列表,以及它是如何实现线程安全的,它的效率又是怎样的,因为对于映射容器还有一个Hashtable也是线程安全的但它似乎只出现在笔试.面试题里,在现实编码中它已经基本被遗弃. 关于HashMap的线程不

  • Java编程ssh整合常见错误解析

    1. org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.UnsupportedOperationException: Not supported by BasicDataSource Spring不能为JAP创建事务.原因是bean.xml设定了数据源per

  • vue解决跨域路由冲突问题思路解析

    vue 简介 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架. Vue 只关注视图层, 采用自底向上增量开发的设计. Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue 学习起来非常简单,本教程基于 Vue 2.1.8 版本测试. 当我们在路由里面配置成以下代理可以解决跨域问题 proxyTable: { '/goods/*': { target: 'http://localhost:3000' }, '/users/*

  • Java设计模式模板方法模式(Template)用法解析

    这篇文章主要介绍了Java设计模式模板方法模式(Template)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象"来做调整",针对这种拥有固定算法流程,其中有固定的步凑,存在不固定的步凑的情况下就诞生了模板方法模式. 模板方法模式(Template)定义

  • Java获取配置文件的值过程解析

    这篇文章主要介绍了java获取配置文件的值过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java大型项目中都会很多系统常量,比如说数据库的账号和密码,以及各种token值等,都需要统一的管理,如果零落的散布到各个类等具体的代码中的话,在后期管理上将是一场灾难,所有需要对这些变量进行统一的管理,一般都会放到web-service.properties文件中,该文件在项目中的位置如下: web-service.properties文件里的

  • java爬取豆瓣电影示例解析

    为什么我们要爬取数据 在大数据时代,我们要获取更多数据,就要进行数据的挖掘.分析.筛选,比如当我们做一个项目的时候,需要大量真实的数据的时候,就需要去某些网站进行爬取,有些网站的数据爬取后保存到数据库还不能够直接使用,需要进行清洗.过滤后才能使用,我们知道有些数据是非常真贵的. 分析豆瓣电影网站 我们使用Chrome浏览器去访问豆瓣的网站如 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort=re

  • Java输出Hello World完美过程解析

    1. 你会不会输出"Hello World!"? 图1 图 2 当我们学习一门编程语言的时候,我们都会先学如何输出Hello World!

  • Java练手小项目实现一个项目管理系统

    目录 前言: 一.项目需求 二.功能实现 三.具体模块的实现 四.总结 前言: 时隔多日,我们学习完java的面向对象阶段,毕竟需要付诸实践,这个小项目就 作为我们第一个java面向对象解决的项目,接下来就让我们一起进入项目的世界吧 一.项目需求 • 模拟实现一个基于文本界面的 < 项目开发团队分配管理软件 > • 熟悉 Java 面向对象的高级特性,进一步掌握编程技巧和调试技巧 •主要涉及以下知识点: Ø 类的继承性和多态性 Ø 对象的值传递.接口 Ø static 和 final 修饰符

随机推荐