基于javaweb+mysql的springbootcrm客户关系管理系统(java+springboot+echarts+freemarker+layui+maven+mysql)

基于javaweb+mysql的springbootcrm客户关系管理系统(java+springboot+echarts+freemarker+layui+maven+mysql)

运行环境

Java≥8、MySQL≥5.7

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

基于javaweb+mysql的SpringBootcrm客户关系管理系统(java+springboot+echarts+freemarker+layui+maven+mysql)

CRM智能办公

项目介绍

本应用是一个客户关系管理系统,主要包括五大模块,分别是营销管理,客户管理,服务管理,统计报表和系统管理,为客户关系管理提供简单的数据管理与分析

技术选型方面,该项目是一个SpringBoot的单体应用,项目使用SpringBoot2框架快速开发,数据访问层使用Mybatis框架,页面渲染引擎使用Freemarker,页面样式使用Layui,日志方面选用的是logback,统计报表部分使用的是ECharts,数据库使用的Mysql 8.0版本;

安装教程

  1. 在mysql(默认为mysql8)中创建名为crm的数据库,并执行源码根目录的crm.sql脚本生成数据库表以及数据 2. 将项目源码导入idea中,指定项目的jdk版本为jdk8或以上,并标记为maven项目,下载所需依赖 3. 修改application.yml中针对于数据库的配置(主要是数据库名和数据库密码) 4. 修改logback.xml中,第4行,日志文件的存储地址,改为自己的路径;

  2. 启动项目测试是否正常,默认启动地址首页为http://localhost:1212/crm,默认数据库中的管理员为admin,密码为123456,可在登录系统之后自行修改用户密码

        return resultInfo;
    }

    @PostMapping("/deleteCustomerServe")
    @ResponseBody
    public ResultInfo deleteCustomerServe(@RequestParam("state") String state, @RequestParam("id") Integer id) {
        customerServeService.deleteCustomerServe(state, id);
        resultInfo.setAll(200, "服务删除成功", null);
        return resultInfo;
    }

    @PostMapping("/updateState")
    @ResponseBody
    public ResultInfo updateState(@RequestParam("id") Integer id, @RequestParam("state") String state, @RequestParam("flag") Integer flag) {
        customerServeService.updateState(id, state, flag);
        resultInfo.setAll(200, "服务审核完毕", null);
        return resultInfo;
    }

    @GetMapping("/toCustomerServeAssignerPage")
    public String toCustomerServeAssignerPage(@RequestParam("id") Integer id, Model model) {
        model.addAttribute("customerServe", customerServeService.selectCustomerServeById(id));
        return "customerServe/customerServeAssignerForEdit";
    }

    @GetMapping("/toCustomerServeBackPage")
    public String toCustomerServeBackPage(@RequestParam("id") Integer id, Model model) {
        model.addAttribute("customerServe", customerServeService.selectCustomerServeById(id));
        return "customerServe/customerServeBackForEdit";
    }

    /**
     * 客户管理模块的视图有此方法执行跳转
     *
     * @return
     */
    @GetMapping("/index/{index}")
    public String index(@PathVariable("index") Integer index) {
        // 校验参数
        AssertUtil.isTrue(index == null, "非法页面跳转");
        if (index == 1) {
            // 服务创建
            return "customerServe/customerServe";
        } else if (index == 2) {
            // 服务分配
            return "customerServe/customerServeAssigner";
        } else if (index == 3) {
            // 服务处理
            return "customerServe/customerServeHandle";
        } else if (index == 4) {
            // 服务反馈
            return "customerServe/customerServeBack";
        // 参数校验
        AssertUtil.isTrue(id == null, "客户流失信息id不能为空");
        CustomerLoss customerLoss = customerLossService.selectByPrimaryKey(id);
        AssertUtil.isTrue(customerLoss == null, "查询客户流失信息失败");
        model.addAttribute("customerLoss", customerLoss);
        return "customerLoss/customerLossData";
    }

}
package com.wuhunyu.controller;

/**
 * 字典管理控制器
 *
 * @version 1.0
 */
@Controller
@RequestMapping("/dic")
public class DataDicController extends BaseController {

    @Autowired
    private DataDicService dataDicService;

    @Autowired
    private ResultInfo resultInfo;

    @GetMapping("/toDicPage")
            return "customerServe/customerServeHandle";
        } else if (index == 4) {
            // 服务反馈
            return "customerServe/customerServeBack";
        } else if (index == 5) {
            // 服务反馈
            return "customerServe/customerServeArchive";
        } else {
            AssertUtil.isTrue(true, "非法页面跳转");
        }
        return null;
    }

}
package com.wuhunyu.controller;

/**
 * 客户开发计划控制器
 *
 * @version 1.0
 */
@RequestMapping("/cusDevPlan")
@Controller
public class CusDevPlanController extends BaseController {

    @Autowired
    private SaleChanceService saleChanceService;

/**
 * 客户管理控制器
 *
 * @version 1.0
 */
@Controller
@RequestMapping("/customerServe")
public class CustomerServeController extends BaseController {

    @Autowired
    private CustomerServeService customerServeService;

    @Autowired
    private ResultInfo resultInfo;

    @GetMapping("/selectCustomerServes")
    @ResponseBody
    public Map<String, Object> selectCustomerServes(CustomerServeQuery customerServeQuery, HttpServletRequest request) {
        String userName = CookieUtil.getCookieValue(request, "userName");
        return customerServeService.selectCustomerServes(customerServeQuery);
    }

    /**
     * 查询字典表数据
     * @param dicName
     * @return
     */
    @GetMapping("/selectDicByName")
    @ResponseBody
    public List<Map<String, Object>> selectDicByName(@RequestParam("dicName") String dicName) {
        return customerServeService.selectDicByName(dicName);
    }

    /**
     * 跳转到服务创建页面
     *
    }

    /**
     * 修改module资源
     * @param module
     * @return
     */
    @PostMapping("/updateModule")
    @ResponseBody
    public ResultInfo updateModule(Module module) {
        moduleService.updateModule(module);
        resultInfo.setAll(200, "修改资源成功", null);
        return resultInfo;
    }

    /**
     * 资源添加页面
     *
     * @return
     */
    @GetMapping("toAddModule")
    public String toAddModule(@RequestParam("grade") Integer grade, @RequestParam("parentId") Integer parentId, Model model) {
        // 参数校验
        AssertUtil.isTrue(!(grade == 0 || grade == 1 || grade == 2), "级别不符合规范");
        AssertUtil.isTrue(parentId == null, "父级id不能为空");
        if (grade == 0) {
            AssertUtil.isTrue(parentId != -1, "父级id错误");
        } else {
            AssertUtil.isTrue(moduleService.selectByPrimaryKey(parentId) == null, "父级id不存在");
        }
        model.addAttribute("grade", grade);
        model.addAttribute("parentId", parentId);
        return "module/addModule";
    }

    /**
     * 资源修改页面
     *
     * @return
     */
    @GetMapping("toUpdateModule")
    public String toUpdateModule(@RequestParam("id") Integer id, Model model) {
        // 校验参数
        AssertUtil.isTrue(id == null, "id不能为空");
package com.wuhunyu.controller;

/**
 * 客户贡献统计控制器
 *
 * @version 1.0
 */
@Controller
@RequestMapping("/customerCount")
public class CustomerCountController extends BaseController {

    @Autowired
    private ResultInfo resultInfo;

    @Autowired
    private CustomerCountService customerCountService;

    @GetMapping("/toCustomerContributionPage")
    public String toCustomerContributionPage() {
        return "customerCount/customerCount";
    }

    @GetMapping("/countCustomerContribution")
    @ResponseBody
    public Map<String, Object> countCustomerContribution(CustomerContributionQuery customerContributionQuery) {
        return customerCountService.countCustomerContribution(customerContributionQuery);
        return "customer/customer";
    }

    /**
     * 跳转到新增或修改页面
     * @param id
     * @param model
     * @return
     */
    @GetMapping("/toAddAndUpdatePage")
    public String toAddAndUpdatePage(@Nullable Integer id, Model model) {
        if (id != null) {
            // 修改
            // 获取客户信息
            Customer customer = customerService.selectByPrimaryKey(id);
            AssertUtil.isTrue(customer == null, "获取客户信息失败");
            model.addAttribute("customer", customer);
        }
        return "customer/addAndUpdate";
    }

    /**
     * 获取客户信息列表
     * @param customerQuery
     * @return
     */
    @GetMapping("/customerList")
    @ResponseBody
    public Map<String, Object> findCustomers(@Nullable CustomerQuery customerQuery) {
        return customerService.findCustomers(customerQuery);
    }

    /**
     * 新增客户信息
     * @param customer
     * @return
     */
    @PostMapping("/addCustomer")
    @ResponseBody
    public ResultInfo addCustomer(Customer customer) {
        customerService.addCustomer(customer);
        resultInfo.setAll(200, "添加客户信息成功", null);
                    view.addObject("code", paramsException.getCode());
                    view.addObject("msg", paramsException.getMsg());
                }else if (ex instanceof AuthException) {
                    AuthException authException = (AuthException) ex;
                    view.addObject("code", authException.getCode());
                    view.addObject("msg", authException.getMsg());
                }
                logger.error("返回视图异常:viewName={}",view.getViewName());
            } else {    // 返回json数据
                // 设置默认值
                resultInfo.setAll(500, ex.getMessage(), null);
                if (ex instanceof ParamsException) {
                    ParamsException paramsException = (ParamsException) ex;
                    resultInfo.setAll(paramsException.getCode(), paramsException.getMsg(), null);
                }else if (ex instanceof AuthException) {
                    AuthException authException = (AuthException) ex;
                    resultInfo.setAll(authException.getCode(), authException.getMsg(), null);
                }
                // 设置响应编码utf-8
                response.setContentType("application/json;charset=UTF-8");
                PrintWriter printer = null;
                try {
                    printer = response.getWriter();
                    String json = JSON.toJSONString(resultInfo);
                    printer.write(json);
                } catch (Exception e) {
                    logger.error(e.getMessage());
                } finally {
                    if (printer != null) {
                        printer.close();
                    }
                }
                logger.error("返回json数据异常:ResultInfo={}",resultInfo);
                return null;
            }
        }
        return view;
    }
}
package com.wuhunyu.controller;

        model.addAttribute("customerServe", customerServeService.selectCustomerServeById(id));
        return "customerServe/addAndUpdate";
    }

    @PostMapping("/addCustomerServe")
    @ResponseBody
    public ResultInfo addCustomerServe(CustomerServe customerServe, HttpServletRequest request) {
        String userName = CookieUtil.getCookieValue(request, "userName");
        // 设置创建人
        customerServe.setCreatePeople(userName);
        customerServeService.addCustomerServe(customerServe);
        resultInfo.setAll(200, "服务创建成功", null);
        return resultInfo;
    }

    @PostMapping("/updateCustomerServe")
    @ResponseBody
    public ResultInfo updateCustomerServe(CustomerServe customerServe, HttpServletRequest request) {
        String userName = CookieUtil.getCookieValue(request, "userName");
        customerServeService.updateCustomerServe(customerServe, userName);
        resultInfo.setAll(200, "服务更新成功", null);
        return resultInfo;
    }

    @PostMapping("/deleteCustomerServe")
    @ResponseBody
    public ResultInfo deleteCustomerServe(@RequestParam("state") String state, @RequestParam("id") Integer id) {
        customerServeService.deleteCustomerServe(state, id);
        resultInfo.setAll(200, "服务删除成功", null);
        return resultInfo;
    }

    @PostMapping("/updateState")
    @ResponseBody
    public ResultInfo updateState(@RequestParam("id") Integer id, @RequestParam("state") String state, @RequestParam("flag") Integer flag) {
        customerServeService.updateState(id, state, flag);
        resultInfo.setAll(200, "服务审核完毕", null);
        return resultInfo;
    }

    @GetMapping("/toCustomerServeAssignerPage")
    public String toCustomerServeAssignerPage(@RequestParam("id") Integer id, Model model) {
        model.addAttribute("customerServe", customerServeService.selectCustomerServeById(id));
        return "customerServe/customerServeAssignerForEdit";
    }

    @GetMapping("/toCustomerServeBackPage")
    public String toCustomerServeBackPage(@RequestParam("id") Integer id, Model model) {
        model.addAttribute("customerServe", customerServeService.selectCustomerServeById(id));
        return "customerServe/customerServeBackForEdit";

    /**
     * 获取客户信息列表
     * @param customerQuery
     * @return
     */
    @GetMapping("/customerList")
    @ResponseBody
    public Map<String, Object> findCustomers(@Nullable CustomerQuery customerQuery) {
        return customerService.findCustomers(customerQuery);
    }

    /**
     * 新增客户信息
     * @param customer
     * @return
     */
    @PostMapping("/addCustomer")
    @ResponseBody
    public ResultInfo addCustomer(Customer customer) {
        customerService.addCustomer(customer);
        resultInfo.setAll(200, "添加客户信息成功", null);
        return resultInfo;
    }

    /**
     * 修改客户信息
     * @param customer
     * @return
     */
    @PostMapping("/updateCustomer")
    @ResponseBody
    public ResultInfo updateCustomer(Customer customer) {
        customerService.updateCustomer(customer);
        resultInfo.setAll(200, "更新客户信息成功", null);
        return resultInfo;
    }

    /**
     * 批量删除客户信息
     * @param ids
     * @return
     */
    @PostMapping("/deleteCustomer")
    @ResponseBody
    public ResultInfo deleteCustomer(@RequestParam("ids") Integer[] ids) {
        customerService.deleteCustomerByIds(ids);
        resultInfo.setAll(200, "删除客户信息成功", null);
        return resultInfo;
    }
        resultInfo.setAll(200, "修改角色成功", null);
        return resultInfo;
    }

    /**
     * 批量删除角色
     * @param ids
     * @return
     */
    @RequestCode("601004")
    @PostMapping("/deleteRole")
    @ResponseBody
    public ResultInfo updateRole(@RequestParam("ids") Integer[] ids) {
        roleService.deleteRoles(ids);
        resultInfo.setAll(200, "删除角色成功", null);
        return resultInfo;
    }

}
package com.wuhunyu.controller;

/**
 * 客户信息流失详情
 *
 * @version 1.0
 */
@Controller
@RequestMapping("/customerReprieve")
public class CustomerReprieveController extends BaseController {

    @Autowired
    private CustomerReprieveService customerReprieveService;


    @Autowired
    private ResultInfo resultInfo;

    /**
     * 多条件查询销售机会数据
     *
     * @param saleChanceQuery
     * @return
     */
    @GetMapping("/saleChanceList")
    @ResponseBody
    public Map<String, Object> querySaleChanceList(SaleChanceQuery saleChanceQuery) {
        // 查询客户开发计划数据
        System.out.println(saleChanceQuery);
        return saleChanceService.querySaleChanceByParams(saleChanceQuery);
    }

    /**
     * 跳转至销售机会首页
     * @return
     */
    @GetMapping("/index")
    public String SaleChance() {
        return "saleChance/saleChance";
    }

    /**
     * 跳转到销售机会新增,更新页面
     * @param id  为null表示跳转到新增页面,不为null表示跳转到更新页面
     * @return
     */
    @GetMapping("/toSaleChance")
    public String toSaleChance(@Nullable Integer id, Model model) {
        if (id != null) {
            // 访问修改页面
            SaleChance saleChance = saleChanceService.selectByPrimaryKey(id);
            model.addAttribute("saleChance", saleChance);
        }
        return "saleChance/addAndUpdate";
    }

    @PostMapping("/addSaleChance")
    @ResponseBody
    public ResultInfo doAddSaleChance(HttpServletRequest request, SaleChance saleChance) {
        String userName = CookieUtil.getCookieValue(request, "userName");

/**
 * 客户信息流失详情
 *
 * @version 1.0
 */
@Controller
@RequestMapping("/customerReprieve")
public class CustomerReprieveController extends BaseController {

    @Autowired
    private CustomerReprieveService customerReprieveService;

    @Autowired
    private ResultInfo resultInfo;

    /**
     * 根据流失客户id查询流失客户详情信息
     * @param lossId
     * @return
     */
    @GetMapping("/customerReprieveList")
    @ResponseBody
    public Map<String, Object> findCustomerReprieveByLossId(@RequestParam("lossId") Integer lossId) {
        return customerReprieveService.findCustomerReprieveByLossId(lossId);
    }

    /**
     * 添加客户流失信息
        return customerCountService.countCustomerContribution(customerContributionQuery);
    }

    @GetMapping("/toCountCustomerMakePage")
    public String toCountCustomerMakePage() {
        return "customerCount/countCustomerMake";
    }

    @GetMapping("/countCustomerMake")
    @ResponseBody
    public ResultInfo countCustomerMake() {
        resultInfo.setAll(200, "查询客户组成信息成功", customerCountService.countCustomerMake());
        return resultInfo;
    }

    @GetMapping("/toCountCustomerLossPage")
    public String toCountCustomerLossPage() {
        return "customerCount/customerCountLoss";
    }

    @GetMapping("/countCustomerLoss")
    @ResponseBody
    public ResultInfo countCustomerLoss(CustomerLossQuery customerLossQuery) {
        resultInfo.setAll(200, "查询客户流失信息成功", customerCountService.countCustomerLoss(customerLossQuery));
        return resultInfo;
    }

}
package com.wuhunyu.controller;

    }

    /**
     * 批量删除角色
     * @param ids
     * @return
     */
    @RequestCode("601004")
    @PostMapping("/deleteRole")
    @ResponseBody
    public ResultInfo updateRole(@RequestParam("ids") Integer[] ids) {
        roleService.deleteRoles(ids);
        resultInfo.setAll(200, "删除角色成功", null);
        return resultInfo;
    }

}
package com.wuhunyu.controller;

/**
 * 客户信息流失详情
 *
 * @version 1.0
 */
@Controller
@RequestMapping("/customerReprieve")
public class CustomerReprieveController extends BaseController {

    @Autowired
    private CustomerReprieveService customerReprieveService;

    @Autowired
    private ResultInfo resultInfo;

    /**
    /**
     * 批量删除客户信息
     * @param ids
     * @return
     */
    @PostMapping("/deleteCustomer")
    @ResponseBody
    public ResultInfo deleteCustomer(@RequestParam("ids") Integer[] ids) {
        customerService.deleteCustomerByIds(ids);
        resultInfo.setAll(200, "删除客户信息成功", null);
        return resultInfo;
    }

    /**
     * 查询所有客户级别
     * @return
     */
    @GetMapping("/getLevels")
    @ResponseBody
    public List<String> findLevels() {
        return customerService.findLevels();
    }

    /**
     * 跳转到客户订单详情页面
     * @param customerId
     * @return
     */
    @GetMapping("/toCustomerOrderPage")
    public String toCustomerOrderPage(@RequestParam("customerId") Integer customerId,Model model) {
        // 校验参数
        AssertUtil.isTrue(customerId == null, "客户id不能为空");
        // 封装客户信息
        Customer customer = customerService.selectByPrimaryKey(customerId);
        AssertUtil.isTrue(customer == null, "查询客户信息失败");
        model.addAttribute("customer", customer);
        return "customerOrder/customerOrder";
    }

}
package com.wuhunyu.controller;

        model.addAttribute("parentId", parentId);
        return "module/addModule";
    }

    /**
     * 资源修改页面
     *
     * @return
     */
    @GetMapping("toUpdateModule")
    public String toUpdateModule(@RequestParam("id") Integer id, Model model) {
        // 校验参数
        AssertUtil.isTrue(id == null, "id不能为空");
        // 校验数据库中是否存在
        Module module = moduleService.selectByPrimaryKey(id);
        AssertUtil.isTrue(module == null, "资源不存在");
        model.addAttribute("module", module);
        return "module/updateModule";
    }

}
package com.wuhunyu.controller;

/**
 * 客户信息管理控制层
 *
 * @version 1.0
     * 根据流失客户id查询流失客户详情信息
     * @param lossId
     * @return
     */
    @GetMapping("/customerReprieveList")
    @ResponseBody
    public Map<String, Object> findCustomerReprieveByLossId(@RequestParam("lossId") Integer lossId) {
        return customerReprieveService.findCustomerReprieveByLossId(lossId);
    }

    /**
     * 添加客户流失信息
     * @param customerReprieve
     * @return
     */
    @PostMapping("addCustomerReprieve")
    @ResponseBody
    public ResultInfo addCustomerReprieve(CustomerReprieve customerReprieve) {
        customerReprieveService.addCustomerReprieve(customerReprieve);
        resultInfo.setAll(200, "添加客户流失信息成功", null);
        return resultInfo;
    }

    /**
     * 更新客户流失信息
     * @param customerReprieve
     * @return
     */
    @PostMapping("updateCustomerReprieve")
    @ResponseBody
    public ResultInfo updateCustomerReprieve(CustomerReprieve customerReprieve) {
        customerReprieveService.updateCustomerReprieve(customerReprieve);
        resultInfo.setAll(200, "更新客户流失信息成功", null);
        return resultInfo;
    }

    /**
     * 删除客户流失信息
     * @param ids
     * @return
     */
    @PostMapping("deleteCustomerReprieve")
    @ResponseBody
    public ResultInfo deleteCustomerReprieve(@RequestParam("ids") Integer[] ids) {
        customerReprieveService.deleteCustomerReprieveByIds(ids);
        resultInfo.setAll(200, "删除客户流失信息成功", null);
        return resultInfo;
    }

    /**
     * 确认客户流失
     * @param customerLoss
     * @return

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值