基于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版本;
安装教程
-
在mysql(默认为mysql8)中创建名为
crm
的数据库,并执行源码根目录的crm.sql
脚本生成数据库表以及数据 2. 将项目源码导入idea中,指定项目的jdk版本为jdk8或以上,并标记为maven项目,下载所需依赖 3. 修改application.yml
中针对于数据库的配置(主要是数据库名和数据库密码) 4. 修改logback.xml中,第4行,日志文件的存储地址,改为自己的路径; -
启动项目测试是否正常,默认启动地址首页为
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