原创

基于SpringBoot2+vue3的客户关系管理系统(crm)

温馨提示:
本文最后更新于 2026年05月28日,已超过 13 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

1. 资源

浏览全文可获取

2. 项目简介

本项目为客户关系管理系统,用于企业管理客户信息、员工信息、客户线索、沟通记录及客户积分等。系统支持管理员员工两种角色,提供客户信息维护、线索跟进、沟通记录登记、积分增减等功能,帮助提升客户管理效率。

项目采用前后端分离架构,后端基于 Spring Boot,前端基于 Vue + Element UI。

3. 技术栈

层次 技术
后端框架 Spring Boot 2.2.2.RELEASE,MyBatis-Plus 2.3,Apache Shiro 1.3.2
数据库 MySQL 5.7.32-log
前端框架 Vue 2.x,Element UI,ECharts,vue-amap(高德地图),vue-json-excel
构建工具 Maven
其他工具 POI(Excel导入导出),Fastjson,Hutool

4. 详细介绍

4.1 模块与功能

4.1.1 客户管理

  • 客户信息增删改查,字段包括:客户姓名、手机号、身份证号、照片、性别、邮箱、积分、详细介绍。
  • 每个客户归属于一名负责的员工(员工与客户关联)。
  • 积分字段由“客户积分”模块自动累加。

4.1.2 员工管理

  • 员工账号管理(用户名、密码、姓名、手机号、身份证号、头像、性别、邮箱、是否禁用)。
  • 员工初始密码为 123456,支持重置密码。
  • 员工登录后只能操作自己负责的客户及相关记录。

4.1.3 客户线索管理

  • 记录潜在客户线索,字段包括:姓名、手机号、身份证号、照片、性别、邮箱、线索类型(字典维护)、线索详情。
  • 线索由员工添加,可转为正式客户(需通过业务操作)。

4.1.4 沟通记录管理

  • 员工与客户的每次沟通记录,包含:沟通标题、沟通类型(字典维护)、沟通时间、沟通详情。
  • 关联客户和员工,支持按员工或客户查询。

4.1.5 客户积分管理

  • 记录客户积分增加明细,积分增加类型(字典维护,如年度反馈、购买商品增加、人头奖励等)。
  • 增加积分时自动累加到对应客户的积分字段。

4.1.6 基础数据管理(字典管理)

  • 维护系统中使用的下拉选项:性别类型、是否禁用、线索类型、沟通类型、积分增加类型。
  • 字典数据支持动态增删改查。

4.1.7 管理员功能

  • 管理员可以管理所有模块的数据,包括员工、客户、线索、沟通记录、积分、字典。
  • 管理员可重置员工密码、禁用/启用员工账号。

4.2 数据库设计

表名 说明 关键字段
yuangong 员工表 账户、密码、姓名、手机号、身份证号、头像、性别、邮箱、是否禁用
kehu 客户表 负责员工ID、姓名、手机号、身份证号、照片、性别、邮箱、积分、详细介绍
kehuxiansuo 客户线索表 员工ID、姓名、手机号、身份证号、照片、性别、邮箱、线索类型、线索详情
goutong 沟通记录表 员工ID、客户ID、沟通标题、沟通类型、沟通时间、沟通详情
kehujifen 客户积分明细表 员工ID、客户ID、增加类型、备注、增加积分数量、增加时间
dictionary 字典表 字段代码、字段名、编码、编码名字、父ID、备注
users 管理员表 用户名、密码、角色
token 登录Token表 用户ID、用户名、表名、角色、token、过期时间
config 配置表 配置参数名称、值(如百度地图AK、人脸识别API Key等)

4.3 权限与角色

  • 管理员(表 users):拥有所有后台管理权限,可管理员工、客户、线索、沟通记录、积分、字典等。
  • 员工(表 yuangong):登录后只能查看和操作自己负责的客户、自己添加的线索、自己的沟通记录、自己给客户增加的积分。员工无权限管理字典和其他员工数据。

4.4 业务规则

  • 员工注册或添加时,手机号、身份证号、用户名不可重复。
  • 客户手机号、身份证号在系统内唯一。
  • 客户线索的手机号、身份证号也需唯一,防止重复线索。
  • 增加客户积分时自动更新 kehu 表中的积分总数。
  • 系统启动时加载字典数据到 ServletContext 全局缓存,用于页面下拉框显示。

5. 部分代码

5.1 后端控制器示例 – 客户积分保存

// KehujifenController.java – save 方法
@RequestMapping("/save")
public R save(@RequestBody KehujifenEntity kehujifen, HttpServletRequest request){
    String role = String.valueOf(request.getSession().getAttribute("role"));
    if("员工".equals(role))
        kehujifen.setYuangongId(Integer.valueOf(String.valueOf(request.getSession().getAttribute("userId"))));

    KehuEntity kehuEntity = kehuService.selectById(kehujifen.getKehuId());
    if(kehuEntity == null)
        return R.error("查不到客户");

    kehujifen.setInsertTime(new Date());
    kehujifen.setCreateTime(new Date());
    kehujifenService.insert(kehujifen);

    kehuEntity.setKehuJifenNumber(kehuEntity.getKehuJifenNumber() + kehujifen.getKehujifenNumber());
    kehuService.updateById(kehuEntity);
    return R.ok();
}

5.2 员工登录接口

// YuangongController.java – login 方法
@IgnoreAuth
@RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
    YuangongEntity yuangong = yuangongService.selectOne(new EntityWrapper<YuangongEntity>().eq("username", username));
    if(yuangong==null || !yuangong.getPassword().equals(password))
        return R.error("账号或密码不正确");
    else if(yuangong.getJinyongTypes().intValue() != 1)
        return R.error("当前账户已被禁用");
    String token = tokenService.generateToken(yuangong.getId(),username, "yuangong", "员工");
    R r = R.ok();
    r.put("token", token);
    r.put("role","员工");
    r.put("username",yuangong.getYuangongName());
    r.put("tableName","yuangong");
    r.put("userId",yuangong.getId());
    return r;
}

5.3 字典表转换工具方法(部分)

// DictionaryServiceImpl.java – dictionaryConvert 方法
public void dictionaryConvert(Object obj, HttpServletRequest request) {
    // 获取所有 Types 字段,通过字典缓存将编码转为显示名称
    // 具体实现见代码文件
}

5.4 MyBatis 查询示例 – 沟通记录多表关联

<!-- GoutongDao.xml – selectListView -->
SELECT ... FROM goutong a
LEFT JOIN kehu kehu ON a.kehu_id = kehu.id
LEFT JOIN yuangong yuangong ON a.yuangong_id = yuangong.id
<where>
    <if test="params.yuangongId != null and params.yuangongId != ''">
        and ( a.yuangong_id = #{params.yuangongId} or kehu.yuangong_id = #{params.yuangongId} )
    </if>
    ...
</where>

5.5 前端路由配置示例

// router-static.js – 路由定义
{
    path: '/kehu',
    name: '客户',
    component: kehu
},
{
    path: '/yuangong',
    name: '员工',
    component: yuangong
},
{
    path: '/kehuxiansuo',
    name: '客户线索',
    component: kehuxiansuo
}

6. 部分截图

img1
img2
img3
img4
img5
img6
img7
img8
img9
img10
img11
img12

7. 项目总结

本客户关系管理系统基于 Spring Boot + MyBatis-Plus + Vue 构建,实现了企业客户管理的基础需求。系统具备完整的 RBAC 权限控制,支持管理员和员工双角色;数据库设计规范,字典表动态配置,扩展性良好;提供客户、线索、沟通记录、积分等核心业务功能,能够有效辅助企业进行客户关系维护。

通过该项目可以深入理解 Spring Boot 整合 MyBatis-Plus 的开发模式,以及 Vue + Element UI 后台管理系统的构建方式。

自助获取:https://fifteen.xiaobias.com/source/215

正文到此结束
本文目录