1. 项目概述
这个基于SpringBoot的汽车维修保养服务信息系统是我去年指导的一个计算机专业毕业设计项目。作为一个在汽车后市场信息化领域摸爬滚打多年的从业者,我见证过太多汽修店从纸质工单到数字化管理的转型过程。这个系统正是针对中小型汽修门店的典型业务场景设计的全栈解决方案,包含了从客户预约到工单结算的完整业务流程。
系统采用当前企业级开发的主流技术栈:后端基于SpringBoot 2.7 + MyBatis Plus,前端使用Vue 3 + Element Plus,数据库选用MySQL 8.0。特别值得一提的是,我们在权限控制方面采用了RBAC模型,并集成了JWT认证,这在同类毕业设计中是比较少见的完整实现。
提示:这个项目的完整源码和文档已经整理成开箱即用的套件,包含部署手册和API文档,适合作为Java全栈开发的练手项目。
2. 核心功能模块设计
2.1 维修工单管理系统
工单模块采用状态机设计模式,定义了"待接单→检测中→维修中→待验收→已完成"五个核心状态。每个状态转换都设计了对应的业务校验规则,比如只有具备"质检员"角色的员工才能执行"维修中→待验收"的状态变更。
数据库表设计方面,我们采用主子表结构:
- 主表
repair_order存储工单基础信息 - 子表
repair_items记录维修项目明细 - 关联表
order_parts管理配件使用情况
// 状态机转换示例代码 public enum OrderStatus { PENDING("待接单", Arrays.asList("检测中")), CHECKING("检测中", Arrays.asList("维修中", "已取消")), REPAIRING("维修中", Arrays.asList("待验收")), PENDING_ACCEPTANCE("待验收", Arrays.asList("已完成")), COMPLETED("已完成", Collections.emptyList()); // 状态转换校验逻辑 public boolean canTransferTo(String targetStatus) { return nextStatus.contains(targetStatus); } }2.2 智能预约调度模块
为了解决汽修店常见的"扎堆预约"问题,我们开发了基于时间片段的预约算法。系统将每天划分为48个30分钟的时间段,根据以下因素动态调整可预约量:
- 当前在店车辆数
- 工位使用情况
- 技师排班表
- 预估项目耗时
前端使用FullCalendar组件实现可视化预约界面,支持拖拽调整预约时间。后台则通过Redis缓存热门时段的预约余量,减轻数据库压力。
2.3 配件库存管理
采用进销存模型设计,包含以下关键特性:
- 实时库存预警(低于安全库存自动提醒)
- 批次管理(支持先进先出)
- 供应商评价系统
- 采购建议生成(基于历史消耗预测)
库存变更采用双写模式:先写操作日志表inventory_log,再更新库存表parts_stock,确保数据可追溯。
3. 技术实现细节
3.1 后端架构设计
我们采用经典的三层架构:
controller → service → dao但做了以下优化:
- 在service层引入
@Transactional注解管理事务 - 使用MyBatis Plus的LambdaQueryWrapper构建类型安全的查询条件
- 自定义统一异常处理(
@ControllerAdvice) - 接口幂等性设计(防重复提交)
3.2 前端工程化实践
Vue项目配置了以下关键优化:
- 路由懒加载
- API请求拦截器(自动添加JWT)
- 基于keep-alive的组件缓存
- 自定义指令实现按钮级权限控制
// 权限指令示例 Vue.directive('permission', { inserted(el, binding) { if (!store.getters.permissions.includes(binding.value)) { el.parentNode.removeChild(el); } } })3.3 数据库优化策略
针对汽修业务特点,我们实施了这些优化:
- 为工单表创建复合索引(
status + create_time) - 大文本字段(如故障描述)使用垂直分表
- 配置MySQL连接池参数(最大连接数=CPU核心数*2 + 1)
- 慢查询监控(超过500ms自动记录)
4. 部署与运维方案
4.1 环境准备清单
| 组件 | 版本要求 | 备注 |
|---|---|---|
| JDK | 11+ | 推荐Amazon Corretto |
| MySQL | 8.0+ | 需配置大小写敏感 |
| Redis | 6.0+ | 作缓存和会话存储 |
| Node.js | 16+ | 前端构建依赖 |
4.2 容器化部署
我们提供了Docker Compose的一键部署方案:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - ./mysql/data:/var/lib/mysql backend: build: ./backend ports: - "8080:8080" depends_on: - mysql - redis frontend: build: ./frontend ports: - "80:80"4.3 性能调优参数
在application.yml中配置这些关键参数:
spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000 redis: lettuce: pool: max-active: 16 max-wait: 100005. 典型问题解决方案
5.1 高并发场景下的库存扣减
采用Redis分布式锁+乐观锁双重保障:
public boolean deductStock(Long partId, int quantity) { String lockKey = "stock_lock:" + partId; try { // 获取分布式锁 Boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS); if (Boolean.TRUE.equals(locked)) { // 乐观锁更新 int updated = partMapper.updateStock( partId, quantity, LocalDateTime.now()); return updated > 0; } return false; } finally { redisTemplate.delete(lockKey); } }5.2 大数据量工单查询
对于超过3个月的工单数据,我们实现了自动归档机制:
- 每月1日凌晨执行归档任务
- 将历史数据迁移到
order_archive表 - 原表只保留最近3个月数据
- 提供统一查询接口自动路由
5.3 微信支付集成
处理支付回调时的注意事项:
- 验证签名(防伪造请求)
- 处理幂等(相同支付号只处理一次)
- 异步更新订单状态
- 失败重试机制(最多3次)
@Transactional public void handlePayNotify(PayNotifyDTO dto) { // 1. 验证签名 if (!wxPayService.verifySign(dto)) { throw new RuntimeException("签名验证失败"); } // 2. 检查是否已处理 if (orderMapper.checkPayProcessed(dto.getOutTradeNo())) { return; } // 3. 更新订单状态 orderMapper.updatePayStatus(dto.getOutTradeNo(), "已支付"); // 4. 记录支付日志 payLogMapper.insert(new PayLog(dto)); }6. 项目扩展方向
在实际部署后,可以考虑以下增强功能:
- 对接OBD设备自动读取故障码
- 增加AI配件推荐引擎
- 开发微信小程序客户版
- 实现供应链金融模块
这个项目最让我自豪的是完整实现了汽修业务的全流程数字化管理,特别是工单状态机的设计,后来被本地几家汽修店直接采用。对于想学习SpringBoot全栈开发的同学,建议重点关注权限设计和事务管理这两个企业级应用的核心难点。