01|SpringBoot+MySQL实战:汽车企业ERP管理系统从需求分析到核心代码实现

前言:这篇文章解决什么问题?

很多同学在做 Java 管理系统或毕业设计时,最容易卡在三个地方:业务模块怎么拆、数据库表怎么设计、登录和通用 CRUD 接口怎么写。本文以“马瑞利汽车企业 ERP 管理系统”为例,把原本偏论文式的系统设计整理成一篇项目实战复盘。

项目主要基于 SpringBoot + Java + MySQL 实现,围绕汽车企业常见的客户、供应商、仓库、采购、销售、生产、薪酬、考勤等业务进行模块化设计。你可以把它当作一个企业后台管理系统的完整拆解案例,用来参考需求分析、数据库设计、接口设计和页面展示。

适合阅读人群

Java/SpringBoot 初学者、正在做课程设计或毕业设计的同学、想快速了解 ERP 管理系统模块拆分方式的开发者。

1. 项目简介

本系统面向汽车企业内部管理场景,目标是把传统分散的人工记录、库存查询、订单跟进和员工信息维护,整合到一个统一的 Web 管理平台中。系统通过浏览器与服务器进行数据交互,管理员、员工用户和仓管用户可以根据权限进入不同模块,完成数据新增、查询、修改、删除、审核和详情查看等操作。

维度

内容

项目名称

马瑞利汽车企业 ERP 管理系统

开发模式

B/S 架构,浏览器访问后台管理系统

核心目标

提升企业内部信息管理效率,减少人工记录造成的数据遗漏和查询低效

主要角色

管理员、员工用户、仓管用户

核心业务

客户信息、供应商、仓库、采购计划、销售订单、生产计划、入库/出库、员工薪酬、考勤休假、收支项目

2. 技术栈选型

这个项目的技术栈不追求复杂,而是以“能跑通完整业务闭环、易维护、适合课程设计/毕业设计展示”为主。

层级

技术/工具

作用

后端

Java、SpringBoot

实现业务接口、角色权限、数据处理和统一响应

数据库

MySQL 5.7

存储用户、仓库、订单、客户、薪酬等业务数据

前端

JavaScript、Ajax、jQuery

完成页面交互、表单提交、数据查询和后台列表展示

开发环境

IDEA、Tomcat

项目开发、运行与调试

安全相关

MD5密码加密、Token登录

完成基础身份认证和登录态保持

3. 系统架构设计

系统整体采用常见的三层结构:表现层负责页面展示与用户交互,业务逻辑层负责接口处理、权限判断和业务规则封装,数据层负责 MySQL 数据持久化。这样的结构对管理系统非常友好,后续要扩展新的业务模块时,只需要按“页面—接口—数据表”的路径逐步补充。

层级

职责

说明

表现层 UI

页面展示、表单输入、列表查询、按钮操作

让用户完成登录、查询、添加、删除、详情查看等操作

业务逻辑层 BLL

参数处理、业务校验、Token处理、统一响应

接收前端请求,调用服务层完成数据操作

数据层 DL

MySQL 数据库存储

保存用户、客户、仓库、订单、薪酬、收支等数据

4. 功能模块拆分

ERP 系统最重要的不是页面数量,而是业务边界是否清晰。本项目按用户角色和业务对象进行模块拆分,基本覆盖了企业内部管理的常见数据流。

角色/模块

可操作内容

设计重点

管理员

系统用户、客户、供应商、仓库、采购计划、销售订单、薪酬、考勤、收支项目

拥有全局维护能力,负责基础数据和业务数据管理

员工用户

个人资料、仓库信息、采购计划、销售订单、生产计划、薪酬、考勤休假

以查询和业务填报为主,权限低于管理员

仓管用户

仓库信息、入库信息、出库信息、薪酬等

重点围绕库存数量变化和商品位置管理

库存模块

商品名称、编号、位置、数量、入库、出库

ERP 中最核心的数据资产,直接影响采购和销售

订单/计划模块

采购计划、销售订单、生产计划

用于串联业务需求、库存变化和生产安排

员工管理模块

薪酬、考勤、休假、用户审核

完成企业内部人员数据维护

5. 关键业务流程

5.1 登录流程

用户登录时,系统先根据用户名、邮箱或手机号查询用户,再判断用户组、审核状态、账号状态,最后对输入密码进行加密比对。验证通过后,系统会生成 Token 并返回给前端,用于后续接口访问。

  1. 输入账号、邮箱或手机号以及密码。
  2. 后端查询用户表,判断用户是否存在。
  3. 读取用户组,判断该用户是否需要审核以及审核是否通过。
  4. 判断账号状态是否可用。
  5. 密码加密后与数据库密码比对,成功后生成 Token。

图1 登录界面:包含账号、密码和验证码验证。

@PostMapping("login")
public Map<String, Object> login(@RequestBody Map<String, String> data,
                                 HttpServletRequest request) {
    String username = data.get("username");
    String email = data.get("email");
    String phone = data.get("phone");
    String password = data.get("password");

    Map<String, String> query = new HashMap<>();
    if (username != null && !"".equals(username)) {
        query.put("username", username);
    } else if (email != null && !"".equals(email)) {
        query.put("email", email);
    } else if (phone != null && !"".equals(phone)) {
        query.put("phone", phone);
    } else {
        return error(30000, "账号或密码不能为空");
    }

    List resultList = service.select(query, new HashMap<>()).getResultList();
    if (resultList == null || resultList.size() <= 0) {
        return error(30000, "用户不存在");
    }

    User user = (User) resultList.get(0);
    String md5Password = service.encryption(password);
    if (!user.getPassword().equals(md5Password)) {
        return error(30000, "账号或密码不正确");
    }

    AccessToken token = new AccessToken();
    token.setToken(UUID.randomUUID().toString().replaceAll("-", ""));
    token.setUser_id(user.getUserId());
    tokenService.save(token);

    JSONObject ret = new JSONObject();
    ret.put("obj", user);
    ret.put("token", token.getToken());
    return success(ret);
}

5.2 注册流程

注册模块主要解决新用户账号创建问题。系统会先检查用户名是否已经存在,再将密码加密后保存到数据库。

图2 注册界面:提交账号、密码、昵称、邮箱、手机号等基础信息。

@PostMapping("register")
public Map<String, Object> signUp(@RequestBody User user) {
    Map<String, String> query = new HashMap<>();
    query.put("username", user.getUsername());

    List list = service.select(query, new HashMap<>()).getResultList();
    if (list.size() > 0) {
        return error(30000, "用户已存在");
    }

    user.setUserId(null);
    user.setPassword(service.encryption(user.getPassword()));
    service.save(user);
    return success(1);
}

5.3 通用新增与更新接口

后台管理系统中,大量模块都具有相似的数据维护逻辑,例如客户信息、仓库信息、生产计划、薪酬信息、收支项目等。为了减少重复代码,可以抽象出通用的新增和更新逻辑。

@PostMapping("/add")
@Transactional
public Map<String, Object> add(HttpServletRequest request) throws IOException {
    service.insert(service.readBody(request.getReader()));
    return success(1);
}

@Transactional
public void update(Map<String, String> query,
                   Map<String, String> config,
                   Map<String, Object> body) {
    StringBuffer sql = new StringBuffer("UPDATE `").append(table).append("` SET ");
    for (Map.Entry<String, Object> entry : body.entrySet()) {
        Object value = entry.getValue();
        sql.append("`").append(humpToLine(entry.getKey())).append("`").append("=");
        sql.append(value instanceof String ? "'" + value + "'" : value).append(",");
    }
    sql.deleteCharAt(sql.length() - 1);
    sql.append(toWhereSql(query, "0".equals(config.get(FindConfig.LIKE))));
    runCountSql(sql.toString()).executeUpdate();
}

代码优化提醒

原论文代码中存在字符串拼接 SQL 的写法,博客发布时建议主动补一句:生产环境更推荐使用 MyBatis/JPA 参数绑定、权限拦截器和统一异常处理,避免 SQL 注入与越权访问风险。

6. 数据库设计精简版

数据库设计围绕“角色用户 + ERP业务对象”展开。为了让博客读者快速理解,不建议把论文中的所有字段完整铺开,而是保留核心表与关键字段。

数据表

核心字段

业务含义

warehouse_information

warehouse_information_id、trade_name、article_no、commodity_location、commodity_quantity

仓库商品基础信息,记录商品编号、位置和库存数量

warehousing_information

warehousing_information_id、trade_name、article_no、receipt_quantity、warehousing_date

入库记录,记录商品入库数量和入库日期

delivery_information

delivery_information_id、trade_name、article_no、delivery_quantity、issue_date

出库记录,记录商品出库数量和出库日期

customer_information

customer_information_id、customer_name、customer_gender、customer_address、contact_number

客户资料,用于销售与售后信息维护

employee_users

employee_users_id、employee_name、employee_gender、examine_state、user_id

员工账号扩展信息,关联系统用户

warehouse_keeper_user

warehouse_keeper_user_id、name、sex_of_warehouse_keeper、examine_state、user_id

仓管用户信息,负责库存业务操作

employee_compensation

employee_compensation_id、ordinary_employees、warehouse_keeper、salary_month、salary_of_this_month、issue_date

员工薪酬记录,支持按月份和发放日期管理

7. 页面效果展示

CSDN 技术文章不要只贴文字。对于管理系统类项目,建议至少展示登录页、核心列表页、库存页和业务页,这样读者可以直观看到项目完成度。

图3 系统用户管理:支持员工姓名、性别筛选以及详情查看。

图4 客户信息管理:支持客户姓名搜索、详情查看和基础信息维护。

图5 仓库信息管理:展示商品名称、编号、位置、数量,并提供入库、出库操作入口。

图6 生产计划管理:围绕商品名称、生产数量、成本核算和生产进度进行管理。

图7 员工薪酬管理:按工资月份、本月工资和发放日期维护薪酬数据。

图8 收支项目管理:用于记录项目名称、收支类型、项目日期和收支金额。

8. 系统测试思路

测试部分不建议照搬论文中的大段描述,CSDN 读者更关心“测了什么、结果怎样”。可以用一张表快速说明。

测试项

测试流程

预期结果

用户登录

输入正确/错误账号密码进行登录

正确时进入后台,错误时提示账号或密码不正确

员工信息查看

登录后进入员工用户列表

能够正常展示员工数据

员工信息添加

点击添加,填写表单并提交

提交后列表出现新增记录

员工搜索

在搜索框输入关键字并点击查询

列表展示包含关键字的数据

密码修改

管理员修改密码后重新登录

旧密码失效,新密码可登录

9. 项目总结与可优化方向

从项目完整度来看,这个系统已经覆盖了汽车企业 ERP 的基础管理场景:用户角色、仓库管理、客户资料、采购销售、生产计划、薪酬考勤和收支项目。对于课程设计或毕业设计来说,它的优势是模块完整、业务线清晰、页面展示直观。

如果要继续提升项目质量,可以从以下几个方向优化:

  1. 权限控制升级:增加拦截器或 Spring Security,细化到按钮级权限。
  2. SQL 安全升级:使用 MyBatis/JPA 参数绑定,减少字符串拼接 SQL。
  3. 库存联动:入库自动增加库存,出库自动扣减库存,并校验库存不足。
  4. 数据统计:增加销售订单、库存预警、薪酬支出、收支趋势等图表。
  5. 部署优化:使用 Docker Compose 编排 SpringBoot + MySQL,方便一键部署。
  6. 接口文档:接入 Swagger/OpenAPI,便于前后端联调。

结尾

以上就是基于 SpringBoot 的汽车企业 ERP 管理系统项目复盘。相比直接发布完整论文,把内容改成“项目背景—技术栈—架构—模块—数据库—核心代码—页面效果—测试—优化”的结构,更适合 CSDN 读者阅读,也更容易被搜索到和收藏。

如果你也在做 SpringBoot 管理系统类项目,建议优先把角色权限、核心业务表和通用 CRUD 这三部分梳理清楚;只要这三块稳定,后续添加新模块会顺很多。

更多推荐