毕业设计实战:基于Spring Boot的企业客户管理系统设计与实现

67 阅读15分钟

一、项目背景:为什么需要企业客户管理系统?

在当前企业数字化转型浪潮中,客户资源管理效率成为企业核心竞争力之一——传统客户管理依赖Excel表格、纸质档案,存在信息分散、查询困难、数据同步滞后等问题。据调研,中小企业因客户信息管理混乱,平均每月流失15%的潜在客户,且员工跟进客户的时间成本占工作时长的40%以上。此外,项目信息与收益数据割裂,导致管理层无法实时掌握业务动态,影响决策效率。

随着"数字化管理"理念的普及,基于Spring Boot的企业客户管理系统成为解决上述痛点的关键方案。系统采用B/S架构,实现"管理员统筹管理-员工高效执行"的双层协作模式,覆盖客户信息管理、项目跟踪、收益统计全流程。本毕业设计以企业实际业务需求为核心,通过信息化手段打通客户、项目、收益数据链路,帮助企业降低管理成本、提升客户转化率,为中小企业客户管理提供轻量化技术解决方案。

二、核心技术栈:企业管理系统的全链路开发工具

项目以"高稳定性、易维护性、强适配性"为目标,选用成熟的Java Web技术栈,确保系统能适配企业日常办公场景:

技术模块具体工具/技术核心作用
后端框架Spring Boot 2.x快速搭建企业级后端服务,简化配置,支持事务管理与依赖注入
开发语言Java提供稳定的面向对象编程能力,确保代码可复用性与扩展性
数据库MySQL 8.0存储客户信息、员工数据、项目详情、收益记录等核心业务数据
架构模式B/S架构支持跨设备访问,员工通过浏览器即可操作,无需安装客户端
开发工具Eclipse + NavicatEclipse用于代码编写与调试,Navicat可视化管理MySQL数据库
服务器Tomcat 9.0部署Web应用,处理多用户并发请求,保障系统稳定运行
界面技术JSP + HTML5 + CSS3构建简洁直观的管理界面,适配企业员工操作习惯

三、项目全流程:7步实现企业客户管理系统

3.1 第一步:需求分析——明确系统核心价值

传统客户管理模式存在"信息分散、协作低效、数据断层"三大痛点,本系统聚焦"集中管理、高效协作、数据可视",核心需求分为功能性与非功能性两类:

3.1.1 功能性需求

  1. 双角色权限管理
    • 管理员:首页数据概览、员工管理(新增/编辑/删除员工账号)、客户信息审核、行业类型维护、项目类型管理、收益数据统计;
    • 员工:个人信息维护、客户信息录入与跟进、项目创建与进度更新、收益数据查看。
  2. 核心业务功能
    • 客户信息管理:存储客户基础信息(名称、行业、联系方式等),支持详情查看、编辑、删除;
    • 项目跟踪管理:关联客户与项目,记录项目名称、类型、签单金额、进度,支持实时更新;
    • 收益统计管理:自动关联项目数据,记录分配类型、金额、日期,生成收益明细;
    • 基础配置管理:管理员维护行业类型、项目类型等基础数据,确保数据标准化。
  3. 辅助功能
    • 数据搜索:支持按客户名称、项目名称等关键词快速查询;
    • 数据导出:支持客户、项目数据导出为Excel,便于离线分析;
    • 权限控制:不同角色仅可见对应功能模块,确保数据安全。

3.1.2 非功能性需求

  • 稳定性:支持100+员工同时在线操作,页面响应时间≤3秒,无卡顿或崩溃;
  • 数据安全:客户联系方式、项目金额等敏感数据仅授权角色可见,防止信息泄露;
  • 易用性:界面布局符合企业员工操作习惯,核心操作(如新增客户、更新项目)不超过3步;
  • 可维护性:代码结构清晰,数据库设计规范,便于后期功能迭代与bug修复。

3.2 第二步:系统设计——构建前后端架构

系统采用MVC设计模式,实现"视图-控制器-模型"分离,确保业务逻辑与数据层解耦,提升系统可维护性:

3.2.1 系统总体架构

  1. 表现层(View层)
    • 管理员后台:包含首页数据看板、员工管理、客户审核、项目配置、收益统计模块;
    • 员工工作台:包含个人中心、客户信息管理、项目跟踪、收益查看模块;
    • 公共登录/注册页:支持管理员与员工账号登录,员工账号支持注册(需管理员审核)。
  2. 业务逻辑层(Controller层)
    • 核心业务处理:用户登录验证、客户信息CRUD、项目进度更新、收益数据计算;
    • 权限控制:基于角色拦截非法请求,确保管理员与员工操作边界清晰。
  3. 数据访问层(Model层)
    • 数据持久化:通过MyBatis框架实现数据库操作,简化SQL编写;
    • 事务管理:确保项目创建与收益分配等关联操作的数据一致性。

3.2.2 核心数据库设计

系统设计5张核心业务表,覆盖员工、客户、项目、收益全链路数据,确保数据关联性与完整性:

表名核心字段作用
yuangong(员工表)id、gonghao(工号)、mima(密码)、xingming(姓名)、shouji(手机)、youxiang(邮箱)存储员工账号与基础信息
kehuxinxi(客户信息表)id、kehumingcheng(客户名称)、xingyeleixing(行业类型)、shouji(手机)、shenfenzheng(身份证)、gonghao(关联员工工号)存储客户基础信息与跟进员工关联
xiangmuxinxi(项目信息表)id、xiangmumingcheng(项目名称)、xiangmuleixing(项目类型)、kehumingcheng(关联客户)、qiandanjine(签单金额)、xiangmujindu(项目进度)存储项目详情与客户关联
xiangmushouyi(项目收益表)id、xiangmumingcheng(关联项目)、qiandanjine(签单金额)、fenpeileixing(分配类型)、fenpeijine(分配金额)、riqi(日期)存储项目收益分配数据
xingyeleixing(行业类型表)id、leixingmingcheng(类型名称)、addtime(创建时间)存储客户行业分类数据(管理员维护)

3.3 第三步:后端核心功能实现——Spring Boot架构

基于Spring Boot框架实现后端核心业务逻辑,重点解决"数据关联"与"权限控制"问题,确保系统安全与业务合规:

3.3.1 客户信息管理功能实现

@RestController
@RequestMapping("/api/kehuxinxi")
public class KeHuXinXiController {
    
    @Autowired
    private KeHuXinXiService keHuService;
    
    @Autowired
    private YuanGongService yuanGongService;
    
    /**
     * 员工新增客户信息
     */
    @PostMapping("/add")
    public ResponseEntity<String> addKeHu(@RequestBody KeHuXinXiDTO keHuDTO, HttpServletRequest request) {
        try {
            // 1. 获取当前登录员工工号(从Session中获取)
            String gonghao = (String) request.getSession().getAttribute("gonghao");
            if (gonghao == null || "".equals(gonghao)) {
                return ResponseEntity.badRequest().body("请先登录");
            }
            
            // 2. 验证员工是否存在
            YuanGong yuanGong = yuanGongService.getByGongHao(gonghao);
            if (yuanGong == null) {
                return ResponseEntity.badRequest().body("员工信息不存在");
            }
            
            // 3. 转换DTO为实体,关联当前员工
            KeHuXinXi keHu = new KeHuXinXi();
            BeanUtils.copyProperties(keHuDTO, keHu);
            keHu.setGonghao(gonghao);
            keHu.setXingming(yuanGong.getXingming()); // 关联员工姓名
            keHu.setAddtime(new Date()); // 新增时间
            
            // 4. 保存客户信息
            boolean success = keHuService.save(keHu);
            if (success) {
                return ResponseEntity.ok("客户信息新增成功");
            } else {
                return ResponseEntity.internalServerError().body("新增失败,请重试");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.internalServerError().body("系统异常,新增失败");
        }
    }
    
    /**
     * 管理员查询所有客户信息(支持审核)
     */
    @GetMapping("/admin/list")
    public ResponseEntity<List<KeHuXinXi>> getKeHuListByAdmin(
            @RequestParam(required = false) String kehumingcheng) {
        try {
            // 构建查询条件(支持按客户名称模糊查询)
            Map<String, Object> condition = new HashMap<>();
            if (StringUtils.hasText(kehumingcheng)) {
                condition.put("kehumingcheng", "%" + kehumingcheng + "%");
            }
            
            List<KeHuXinXi> keHuList = keHuService.getListByCondition(condition);
            return ResponseEntity.ok(keHuList);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.internalServerError().body(null);
        }
    }
}

3.3.2 项目收益关联功能实现

@Service
@Transactional
public class XiangMuShouYiService {
    
    @Autowired
    private XiangMuShouYiMapper shouYiMapper;
    
    @Autowired
    private XiangMuXinXiMapper xiangMuMapper;
    
    /**
     * 新增项目收益(自动关联项目签单金额)
     */
    public String addShouYi(XiangMuShouYi shouYi) {
        // 1. 验证项目是否存在
        XiangMuXinXi xiangMu = xiangMuMapper.getByXiangMuMingCheng(shouYi.getXiangmumingcheng());
        if (xiangMu == null) {
            return "关联项目不存在,请先创建项目";
        }
        
        // 2. 自动填充签单金额(与项目签单金额一致)
        shouYi.setQiandanjine(xiangMu.getQiandanjine());
        
        // 3. 验证分配金额是否合理(不超过签单金额)
        BigDecimal fenPeiJinE = new BigDecimal(shouYi.getFenpeijine());
        BigDecimal qianDanJinE = new BigDecimal(shouYi.getQiandanjine());
        if (fenPeiJinE.compareTo(qianDanJinE) > 0) {
            return "分配金额不能超过签单金额";
        }
        
        // 4. 保存收益记录
        shouYiMapper.insert(shouYi);
        return "收益记录新增成功";
    }
    
    /**
     * 员工查询个人负责项目的收益
     */
    public List<XiangMuShouYi> getShouYiByGongHao(String gonghao) {
        // 1. 先查询员工负责的项目
        List<XiangMuXinXi> xiangMuList = xiangMuMapper.getListByGongHao(gonghao);
        if (xiangMuList.isEmpty()) {
            return new ArrayList<>();
        }
        
        // 2. 提取项目名称列表,查询对应收益
        List<String> xiangMuMingChengList = xiangMuList.stream()
                .map(XiangMuXinXi::getXiangmumingcheng)
                .collect(Collectors.toList());
        
        return shouYiMapper.getListByXiangMuMingChengList(xiangMuMingChengList);
    }
}

3.4 第四步:双角色权限实现——精细化权限控制

基于Session与角色标识实现权限管理,通过过滤器拦截非法请求,确保管理员与员工操作边界清晰:

3.4.1 管理员权限(role=管理员)

  • 系统管理:维护员工账号(新增、编辑、重置密码)、审核客户信息;
  • 基础配置:管理行业类型、项目类型,确保数据标准化;
  • 数据统计:查看全公司客户、项目、收益数据,生成运营概览;
  • 权限管控:设置员工可见功能模块,防止敏感数据泄露。

3.4.2 员工权限(role=员工)

  • 个人管理:维护个人信息(修改姓名、手机、邮箱)、修改登录密码;
  • 客户管理:新增、编辑、删除个人负责的客户信息,跟进客户动态;
  • 项目管理:创建关联客户的项目,更新项目进度与签单信息;
  • 收益查看:查看个人负责项目的收益分配记录,了解业务成果。

3.4.3 权限过滤器实现

@Component
public class AuthFilter implements Filter {
    
    // 管理员专属路径
    private static final List<String> ADMIN_PATHS = Arrays.asList("/admin/", "/api/admin/");
    // 员工需登录才能访问的路径
    private static final List<String> NEED_LOGIN_PATHS = Arrays.asList("/api/kehuxinxi/", "/api/xiangmuxinxi/", "/api/xiangmushouyi/");
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String url = httpRequest.getRequestURI();
        String role = (String) httpRequest.getSession().getAttribute("role");
        
        // 1. 拦截管理员路径:非管理员角色禁止访问
        if (ADMIN_PATHS.stream().anyMatch(path -> url.startsWith(path))) {
            if (!"管理员".equals(role)) {
                httpResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
                httpResponse.getWriter().write("无管理员权限,禁止访问");
                return;
            }
        }
        
        // 2. 拦截需登录的路径:未登录用户重定向到登录页
        if (NEED_LOGIN_PATHS.stream().anyMatch(path -> url.startsWith(path)) && role == null) {
            httpResponse.sendRedirect("/login");
            return;
        }
        
        // 3. 权限校验通过,放行请求
        chain.doFilter(request, response);
    }
}

3.5 第五步:前端界面实现——简洁高效的管理界面

基于JSP + Bootstrap构建响应式界面,适配企业办公电脑屏幕,确保操作流畅、视觉清晰:

3.5.1 管理员后台界面

  • 数据看板:顶部展示客户总数、项目总数、总签单金额、活跃员工数,直观呈现企业业务概况;
  • 员工管理:表格展示所有员工账号,支持按工号搜索,操作列包含"编辑""删除""重置密码";
  • 客户审核:展示待审核客户信息,支持"通过""驳回"操作,确保客户信息真实性;
  • 收益统计:以柱状图展示月度项目收益,支持按项目类型筛选,辅助管理层决策。

3.5.2 员工工作台界面

  • 个人中心:左侧导航栏划分"客户管理""项目管理""收益查看"模块,右侧展示对应功能内容;
    • 客户管理:表单式新增客户,表格展示个人客户列表,支持快速编辑与删除;
    • 项目管理:创建项目时自动关联个人客户,下拉选择项目类型,实时更新项目进度;
    • 收益查看:列表展示个人负责项目的收益记录,包含项目名称、分配金额、日期。
  • 快捷搜索:各模块顶部设置搜索框,支持按关键词快速定位客户或项目,提升操作效率。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3.6 第六步:系统测试——确保企业级稳定运行

通过多维度测试验证系统功能、性能与安全性,测试环境模拟企业办公场景:

  • 硬件环境:Intel Core i5-10400处理器、8GB内存、512GB硬盘;
  • 软件环境:Windows 10操作系统、MySQL 8.0数据库、Tomcat 9.0服务器、Chrome浏览器。

3.6.1 功能测试

设计25组核心测试用例,覆盖登录、客户管理、项目跟踪、收益统计关键场景:

测试场景测试步骤预期结果实际结果是否通过
管理员新增员工1. 登录管理员账号;2. 进入员工管理;3. 填写工号、姓名等信息;4. 提交员工账号创建成功,列表显示新账号与预期一致
员工新增客户1. 登录员工账号;2. 进入客户管理;3. 填写客户名称、联系方式;4. 提交客户信息新增成功,关联当前员工与预期一致
项目收益关联1. 创建项目(填写签单金额);2. 新增收益记录(选择该项目);3. 输入分配金额收益记录自动填充签单金额,分配金额超限时提示与预期一致
权限拦截测试1. 员工账号访问管理员路径;2. 查看响应结果提示"无管理员权限",禁止访问与预期一致

3.6.2 性能与安全测试

  • 性能测试:模拟50名员工同时新增客户、更新项目,系统响应时间≤2秒,无数据丢失;
  • 安全测试:尝试通过URL直接访问他人客户信息,系统拦截并返回403,确保数据隔离;
  • 稳定性测试:连续72小时运行,监控CPU使用率≤50%、内存占用≤40%,无崩溃或内存泄漏。

3.7 第七步:问题排查与优化——贴合企业实际需求

开发过程中针对企业场景的典型问题,制定针对性解决方案:

  1. 客户信息重复录入

    • 问题:员工可能重复录入同一客户,导致数据冗余;
    • 解决方案:在新增客户时,通过"客户名称+手机号"唯一校验,若已存在则提示"该客户已录入",并关联至已有记录。
  2. 项目与收益数据不同步

    • 问题:项目签单金额修改后,收益记录中的签单金额未同步更新;
    • 解决方案:使用MySQL触发器,当项目表qiandanjine字段修改时,自动更新关联收益记录的qiandanjine字段。
  3. 员工离职后客户交接

    • 问题:员工离职后,其负责的客户无人跟进,信息易丢失;
    • 解决方案:管理员新增"客户交接"功能,可将离职员工的客户批量分配给其他员工,确保业务连续性。

四、毕业设计复盘:经验与教训

4.1 开发过程中的挑战

  1. 业务逻辑梳理:企业客户管理涉及"客户-项目-收益"多维度关联,初期因未明确数据链路,导致表结构设计冗余,后期重构数据库索引才解决查询效率问题;
  2. 权限边界把控:需细化管理员与员工的操作权限(如员工不能删除他人客户),初期因过滤器规则不完善,出现权限漏洞,通过补充测试用例才完全覆盖;
  3. 用户体验优化:企业员工对操作效率要求高,初期界面按钮布局分散,通过调研企业办公软件(如钉钉、企业微信)的设计风格,调整界面布局,提升操作流畅度。

4.2 给学弟学妹的建议

  1. 需求调研先行:开发管理系统前,需深入了解用户(如企业管理员、员工)的实际操作场景,避免"想当然"设计功能,可通过问卷或访谈收集真实需求;
  2. 技术选型务实:优先选择自己熟悉的技术栈,如本项目用Spring Boot而非微服务,降低开发难度,确保按时完成;
  3. 重视数据设计:数据库表结构是系统根基,设计时需考虑数据关联性与扩展性,避免后期频繁修改表结构;
  4. 测试覆盖全面:除功能测试外,需重点关注权限安全、数据一致性测试,尤其是企业系统,数据安全与稳定性直接影响用户信任。

五、项目资源与未来展望

5.1 项目核心资源

本项目提供完整的企业级开发资源,可直接用于毕业设计或中小企业实际部署:

  • 后端源码:完整的Spring Boot项目(含Controller、Service、Mapper层代码,注释清晰);
  • 前端资源:JSP页面、CSS/JS文件、图标资源,支持直接部署到Tomcat;
  • 数据库脚本:MySQL建表语句、测试数据(含管理员账号、示例客户/项目数据);
  • 部署文档:详细的环境配置步骤(Java、MySQL、Tomcat安装)、项目部署流程;
  • 答辩PPT模板:包含项目背景、技术栈、功能演示、测试结果,适配毕业设计答辩。

5.2 系统扩展方向

  1. 移动端适配:开发微信小程序版,支持员工在外出时通过手机录入客户信息、更新项目进度;
  2. 客户跟进提醒:添加定时任务,对超3天未跟进的客户,自动向负责员工发送邮件提醒;
  3. 数据可视化报表:集成ECharts,生成客户转化率、项目完成率等多维度报表,辅助管理层决策;
  4. 第三方集成:对接企业微信/钉钉,实现单点登录,无需重复输入账号密码,提升办公效率。

如果本文对您的Spring Boot学习、企业管理类毕业设计有帮助,欢迎点赞 + 收藏 + 关注,后续会分享更多企业级项目实战案例!