基于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
,可在登录系统之后自行修改用户密码
private CustomerLossService customerLossService;
/**]
* 查询所有客户流失记录
* @param customerLossQuery
* @return
*/
@GetMapping("/customerLossList")
@ResponseBody
public Map<String, Object> findCustomerLoss(CustomerLossQuery customerLossQuery) {
return customerLossService.findCustomerLoss(customerLossQuery);
}
/**
* 跳转到客户流失首页
* @return
*/
@GetMapping("/customerLoss")
public String customerLoss() {
return "customerLoss/customerLoss";
}
/**
* 跳转到客户流失信息管理页面
* @param id
* @param model
* @return
*/
@GetMapping("/customerLossData")
public String customerLossData(@RequestParam("id") Integer id, Model model) {
// 根据流失客户信息id查询对应的流失客户信息
// 参数校验
AssertUtil.isTrue(id == null, "客户流失信息id不能为空");
CustomerLoss customerLoss = customerLossService.selectByPrimaryKey(id);
AssertUtil.isTrue(customerLoss == null, "查询客户流失信息失败");
model.addAttribute("customerLoss", customerLoss);
return "customerLoss/customerLossData";
}
}
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";
} else if (index == 5) {
// 服务反馈
return "customerServe/customerServeArchive";
} else {
AssertUtil.isTrue(true, "非法页面跳转");
}
return null;
}
}
/**
* 修改客户信息
* @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;
}
/**
* 查询所有客户级别
* @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, "查询客户信息失败");
@GetMapping("/toCusDevPlan")
public String toCusDevPlan(@RequestParam("id") Integer id, Model model) {
AssertUtil.isTrue(id == null, "id不能为空");
SaleChance saleChance = saleChanceService.selectByPrimaryKey(id);
AssertUtil.isTrue(saleChance == null, "所操作的记录不存在");
model.addAttribute("saleChance",saleChance);
return "cusDevPlan/cusDevPlanData";
}
/**
* 查询客户开发计划数据
* @param cusDevPlanQuery
* @return
*/
@GetMapping("/cusDevPlan")
@ResponseBody
public Map<String, Object> queryCusDevPlanList(CusDevPlanQuery cusDevPlanQuery) {
Map<String, Object> map = cusDevPlanService.querySaleChanceByParams(cusDevPlanQuery);
return map;
}
/**
* 新增开发计划项
* @param cusDevPlan
* @return
*/
@PostMapping("/addCusDevPlan")
@ResponseBody
public ResultInfo addCusDevPlan(CusDevPlan cusDevPlan) {
cusDevPlanService.addCusDevPlan(cusDevPlan);
resultInfo.setAll(200, "新增开发计划项成功", null);
return resultInfo;
}
/**
* 修改开发计划项
* @param cusDevPlan
* @return
*/
@PostMapping("/updateCusDevPlan")
}
/**
* 动态查询t_role表
* @param roleQuery
* @return
*/
@GetMapping("/roleList")
@ResponseBody
public Map<String, Object> selectByParams(RoleQuery roleQuery) {
return roleService.findRoleList(roleQuery);
}
/**
* 角色视图首页
* @return
*/
@GetMapping("/index")
public String toRolePage() {
return "role/role";
}
/**
* 新增/修改公用页面
* @param roleId
* @return
*/
@GetMapping("/toAddAndUpdatePage")
public String toAddAndUpdatePage(@Nullable Integer roleId, Model model) {
// 修改
if (roleId != null) {
Role role = roleService.selectByPrimaryKey(roleId);
AssertUtil.isTrue(role == null, "角色不存在");
model.addAttribute("role", role);
}
return "role/addAndUpdateRole";
}
/**
* 新增角色
* @param role
* @return
*/
@RequestCode("601001")
@PostMapping("/addRole")
@ResponseBody
public ResultInfo addRole(Role role) {
roleService.addRole(role);
resultInfo.setAll(200, "新增角色成功", null);
return resultInfo;
/**]
* 查询所有客户流失记录
* @param customerLossQuery
* @return
*/
@GetMapping("/customerLossList")
@ResponseBody
public Map<String, Object> findCustomerLoss(CustomerLossQuery customerLossQuery) {
return customerLossService.findCustomerLoss(customerLossQuery);
}
/**
* 跳转到客户流失首页
* @return
*/
@GetMapping("/customerLoss")
public String customerLoss() {
return "customerLoss/customerLoss";
}
/**
* 跳转到客户流失信息管理页面
* @param id
* @param model
* @return
*/
@GetMapping("/customerLossData")
public String customerLossData(@RequestParam("id") Integer id, Model model) {
// 根据流失客户信息id查询对应的流失客户信息
// 参数校验
AssertUtil.isTrue(id == null, "客户流失信息id不能为空");
CustomerLoss customerLoss = customerLossService.selectByPrimaryKey(id);
AssertUtil.isTrue(customerLoss == null, "查询客户流失信息失败");
model.addAttribute("customerLoss", customerLoss);
return "customerLoss/customerLossData";
}
}
@Autowired
private CustomerLossService customerLossService;
/**]
* 查询所有客户流失记录
* @param customerLossQuery
* @return
*/
@GetMapping("/customerLossList")
@ResponseBody
public Map<String, Object> findCustomerLoss(CustomerLossQuery customerLossQuery) {
return customerLossService.findCustomerLoss(customerLossQuery);
}
/**
* 跳转到客户流失首页
* @return
*/
@GetMapping("/customerLoss")
public String customerLoss() {
return "customerLoss/customerLoss";
}
/**
* 跳转到客户流失信息管理页面
* @param id
* @param model
* @return
*/
@GetMapping("/customerLossData")
public String customerLossData(@RequestParam("id") Integer id, Model model) {
// 根据流失客户信息id查询对应的流失客户信息
// 参数校验
AssertUtil.isTrue(id == null, "客户流失信息id不能为空");
CustomerLoss customerLoss = customerLossService.selectByPrimaryKey(id);
AssertUtil.isTrue(customerLoss == null, "查询客户流失信息失败");
model.addAttribute("customerLoss", customerLoss);
return "customerLoss/customerLossData";
}
}
return resultInfo;
}
/**
* 修改角色信息
* @param role
* @return
*/
@RequestCode("601003")
@PostMapping("/updateRole")
@ResponseBody
public ResultInfo updateRole(Role role) {
roleService.updateRole(role);
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;
}
}
/**
* 客户信息流失详情
*
* @version 1.0
*
* @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");
// 设置创建人
saleChance.setCreateMan(userName);
saleChanceService.addSaleChance(saleChance);
resultInfo.setAll(200,"新增销售机会记录成功",null);
return resultInfo;
}
@PostMapping("/updateSaleChance")
@ResponseBody
/**
* 批量删除用户
* @param ids
* @return
*/
@PostMapping("/deleteUsers")
@ResponseBody
public ResultInfo deleteUsers(@RequestParam("ids") Integer[] ids) {
userService.deleteUsers(ids);
resultInfo.setAll(200, "删除用户成功", null);
return resultInfo;
}
}
/**
* 客户管理控制器
*
* @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");
@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;
}
/**
* 查询所有客户级别
* @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不能为空");
/**
* 客户信息管理控制层
*
* @version 1.0
*/
@Controller
@RequestMapping("/customer")
public class CustomerController extends BaseController {
@Autowired
private CustomerService customerService;
@Autowired
private ResultInfo resultInfo;
/**
* 跳转到客户信息管理首页
* @return
*/
@GetMapping("/customer")
public String customer() {
return "customer/customer";
}
}
/**
* 获取指派人信息,id和userName
* @return
*/
@PostMapping("/getAssignMan")
@ResponseBody
public ResultInfo getAssignMan() {
List<Map<String, Object>> assignMans = saleChanceService.getAssignMan();
logger.info("assignMans={}",assignMans);
AssertUtil.isTrue(assignMans == null, "获取指派人信息失败");
AssertUtil.isTrue(assignMans.size() == 0, "没有可获取的指派人信息");
resultInfo.setAll(200, "获取指派人成功", assignMans);
return resultInfo;
}
/**
* 批量删除销售机会记录
* @return
*/
@PostMapping("/deleteSaleChance")
@ResponseBody
public ResultInfo deleteSaleChance(@RequestParam("ids") Integer[] ids) {
System.out.println("ids="+ids);
saleChanceService.deleteSaleChance(ids);
resultInfo.setAll(200, "删除成功", null);
return resultInfo;
}
}
/**
* 菜单资源管理控制器
*
* @version 1.0
/**
* 全局异常处理类
*
* @version 1.0
*/
@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@Autowired
private ResultInfo resultInfo;
/**
* 全局异常处理
* @param request
* @param response
* @param handler
* @param ex
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 设置默认视图
ModelAndView view = new ModelAndView("error");
view.addObject("code", "500");
view.addObject("msg", "系统资源繁忙");
// 处理未登录异常
if (ex instanceof NoLoginException) {
@ResponseBody
public ResultInfo addRole(Role role) {
roleService.addRole(role);
resultInfo.setAll(200, "新增角色成功", null);
return resultInfo;
}
/**
* 修改角色信息
* @param role
* @return
*/
@RequestCode("601003")
@PostMapping("/updateRole")
@ResponseBody
public ResultInfo updateRole(Role role) {
roleService.updateRole(role);
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;
}
}
/**
* 资源修改页面
*
* @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";
}
}
/**
* 客户信息管理控制层
*
* @version 1.0
*/
@Controller
@RequestMapping("/customer")
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不能为空");
// 校验数据库中是否存在
Module module = moduleService.selectByPrimaryKey(id);
AssertUtil.isTrue(module == null, "资源不存在");
model.addAttribute("module", module);
return "module/updateModule";
}
}