毕业设计实战:基于SpringBoot+Vue+MySQL的汽车维修预约服务系统全流程避坑指南!
谁懂啊!当初做汽车维修预约系统毕设时,光“预约时间冲突校验”就卡了3天——用户能预约已满的时间段,导致技师排班混乱,导师看了直接让我“重做预约逻辑”😫 后来踩遍无数坑才摸出高效落地流程,今天把需求分析、技术选型、核心功能到测试的核心细节说透,宝子们不用熬夜改BUG,轻松搞定毕设!
一、先搞懂“汽车维修预约系统要啥”!需求分析别瞎蒙
刚开始我以为就是个简单的表单提交,花一周做了“3D车辆故障展示”,结果导师一句“核心是预约冲突检查、技师排班、配件库存管理,不是炫酷特效”直接打回重改!后来才明白,维修预约要抓准“时间调度、资源匹配、状态流转”,这步做对,少走90%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
系统有三类核心用户:车主用户、维修技师、系统管理员(别加“配件供应商角色”!我当初加了后库存同步混乱,砍掉才顺畅):
车主用户端(核心预约功能):
- 车辆管理:添加爱车信息(车牌、车型、行驶里程)、上传车辆照片、设置默认车辆
- 预约服务:选择维修门店、预约时间段、选择服务项目、描述故障情况
- 进度跟踪:查看预约状态(待接单/维修中/已完成)、接收状态变更通知
- 历史记录:查看维修历史、评价已完成服务、管理个人资料
维修技师端(重点服务功能):
- 我的排班:查看今日/明日预约任务、设置可预约时间段
- 接单处理:接收新预约、确认接单、开始维修、填写维修报告
- 配件管理:申请配件出库、记录使用情况、库存不足预警
- 完成反馈:上传维修照片、填写维修说明、提交完成申请
系统管理员端(后台管理):
- 门店管理:维护门店信息、设置营业时间、分配技师
- 服务项目管理:维护维修项目(保养、维修、美容等)及价格
- 预约调度:查看所有预约、手动调整排班、处理异常预约
- 配件库存:管理配件入库出库、设置库存预警、生成采购清单
- 数据统计:统计各门店业务量、技师工作量、营收报表
2. 需求分析避坑指南(血泪教训!)
- 模拟真实预约流程!找同学分别扮演车主和技师:车主说“想看到实时可预约时间段”,我才加了“根据技师排班动态显示可约时间”,比瞎做“车辆VR展示”实用
- 一定要画状态流转图!用DrawIO画“预约创建→技师接单→开始维修→完成服务→车主评价”完整状态机,跟导师汇报时直观10倍
- 写约束文档!关键规则写清楚:如“预约时间需提前2小时”“同一技师同一时间只能接一单”“配件出库需关联预约单”
3. 可行性分析别敷衍!3点写清楚就能过
- 技术可行性:SpringBoot、Vue、MySQL都是当前主流,资料丰富(别用最新微服务架构!我当初试了,服务拆分卡4天,换回单体架构才顺)
- 经济可行性:工具全免费!答辩时说“开发成本0,还能帮维修店提升30%预约效率,减少客户等待时间”
- 操作可行性:界面参考滴滴预约、美团服务,车主端操作简单,技师端功能集中
二、技术选型别跟风!这套组合稳到爆
刚开始我用SpringBoot+React+WebSocket做实时通知,结果“技师接单推送”卡2天——长连接维护问题😫 后来换成SpringBoot 2.7 + Vue 2 + MySQL 8.0 + Element UI + 轮询查询,新手友好!
1. 技术栈核心选择(附避坑提醒)
| 技术工具 | 为啥选它 | 避坑提醒! |
|---|---|---|
| SpringBoot 2.7 | 快速开发、自动配置、内嵌Tomcat | 别用3.0+!部分老依赖不兼容 |
| Vue 2 + Element UI | 组件丰富、适合后台管理系统开发 | 技师端用Element,车主端可用Vant做移动端适配 |
| MySQL 8.0 | JSON类型存维修报告、事务保证数据一致性 | 预约表加唯一索引防重复预约 |
| MyBatis-Plus | 简化CRUD、支持乐观锁防止并发更新 | 技师接单用version字段做乐观锁 |
| 定时任务(Quartz) | 处理超时未接单自动取消、定期生成报表 | 别用最新版Spring Scheduler配置复杂 |
| 文件上传(OSS) | 存储车辆照片、维修报告图片 | 本地存储需注意路径配置,建议用相对路径 |
2. 开发环境搭建(step by step)
-
后端:
# 创建SpringBoot项目 spring init --dependencies=web,mybatis,mysql car-repair-system # 配置application.yml server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/car_repair?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 -
前端:
# 创建Vue项目 vue create car-repair-front # 安装Element UI npm i element-ui -S -
数据库:
CREATE DATABASE car_repair DEFAULT CHARSET utf8mb4; -- 12张核心表脚本(下文详细讲)
三、数据库设计:别让预约冲突坑了你
我当初没在数据库层面加约束,技师同一时间接两单,系统直接崩!
1. 核心表设计(10张必做表)
-- 1. 预约表(核心!)
CREATE TABLE `repair_order` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`order_no` VARCHAR(32) UNIQUE COMMENT '预约单号',
`user_id` INT NOT NULL COMMENT '车主ID',
`car_id` INT NOT NULL COMMENT '车辆ID',
`store_id` INT COMMENT '门店ID',
`technician_id` INT COMMENT '技师ID',
`service_type` INT COMMENT '服务类型',
`appoint_time` DATETIME NOT NULL COMMENT '预约时间',
`actual_start_time` DATETIME COMMENT '实际开始时间',
`actual_end_time` DATETIME COMMENT '实际结束时间',
`status` TINYINT DEFAULT 1 COMMENT '1待接单 2已接单 3维修中 4已完成 5已取消',
`fault_desc` TEXT COMMENT '故障描述',
`repair_report` JSON COMMENT '维修报告{配件:[],工时:2,费用:300}',
`user_rating` TINYINT COMMENT '用户评分1-5',
`user_comment` VARCHAR(500) COMMENT '用户评价',
UNIQUE KEY `uk_tech_time` (`technician_id`, `appoint_time`) COMMENT '技师时间唯一索引'
);
-- 2. 技师排班表(关键!)
CREATE TABLE `technician_schedule` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`technician_id` INT NOT NULL,
`work_date` DATE NOT NULL COMMENT '工作日期',
`time_slots` JSON COMMENT '可预约时间段["09:00-10:00","10:30-11:30"]',
`max_orders` INT DEFAULT 8 COMMENT '最大接单数'
);
-- 3. 配件库存表
CREATE TABLE `part_inventory` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`part_name` VARCHAR(100) NOT NULL,
`part_no` VARCHAR(50) UNIQUE COMMENT '配件编号',
`current_stock` INT DEFAULT 0,
`min_stock` INT DEFAULT 5 COMMENT '最低库存预警',
`unit_price` DECIMAL(10,2) COMMENT '单价'
);
2. 关键关联测试
-- 测试预约冲突
START TRANSACTION;
-- 1. 检查技师该时间段是否已有预约
SELECT COUNT(*) FROM repair_order
WHERE technician_id = 1
AND DATE(appoint_time) = '2024-06-15'
AND HOUR(appoint_time) = 10
AND status IN (1,2,3); -- 待接单、已接单、维修中状态
-- 2. 检查技师该日期是否排班
SELECT time_slots FROM technician_schedule
WHERE technician_id = 1
AND work_date = '2024-06-15';
-- 3. 检查配件库存是否充足
SELECT part_name, current_stock FROM part_inventory
WHERE part_no IN ('P001','P002')
AND current_stock >= 1;
COMMIT;
四、功能实现:核心模块操作+页面设计
先搞定3个核心模块,答辩足够出彩:
1. 车主端:预约下单模块(必做!)
核心是“智能时间推荐”和“实时状态更新”,别漏“冲突校验”!
<template>
<div class="appointment-page">
<!-- 步骤1:选择服务类型 -->
<el-steps :active="step">
<el-step title="选择服务"></el-step>
<el-step title="选择时间"></el-step>
<el-step title="确认订单"></el-step>
</el-steps>
<!-- 步骤2:动态时间选择 -->
<div v-if="step === 2">
<el-date-picker
v-model="selectedDate"
type="date"
placeholder="选择日期"
:disabled-date="disabledDate"
@change="loadTimeSlots">
</el-date-picker>
<div class="time-slots">
<el-radio-group v-model="selectedTime">
<el-radio
v-for="slot in availableSlots"
:key="slot.time"
:label="slot.time"
:disabled="!slot.available">
{{slot.time}} {{slot.available ? '可预约' : '已满'}}
</el-radio>
</el-radio-group>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
step: 1,
selectedDate: '',
selectedTime: '',
availableSlots: [] // 从后端获取的可预约时间段
}
},
methods: {
// 禁用今天之前的日期
disabledDate(time) {
return time.getTime() < Date.now() - 24 * 60 * 60 * 1000;
},
// 加载技师可用时间段
async loadTimeSlots() {
const resp = await this.$axios.get('/api/appointment/slots', {
params: {
date: this.selectedDate,
storeId: this.selectedStore
}
});
this.availableSlots = resp.data;
}
}
}
</script>
2. 技师端:接单维修模块(核心!)
核心是“实时任务推送”和“维修报告填写”:
@RestController
@RequestMapping("/api/technician")
public class TechnicianController {
@Autowired
private RepairOrderService orderService;
// 技师接单(乐观锁防重复接单)
@PostMapping("/accept-order")
public Result acceptOrder(@RequestParam Long orderId,
@RequestParam Long technicianId) {
return orderService.acceptOrder(orderId, technicianId);
}
// 开始维修(状态流转)
@PostMapping("/start-repair")
public Result startRepair(@RequestParam Long orderId) {
RepairOrder order = orderService.getById(orderId);
if (order.getStatus() != 2) {
return Result.error("订单状态不正确");
}
order.setStatus(3); // 维修中
order.setActualStartTime(new Date());
orderService.updateById(order);
// 推送通知给车主
pushNotification(order.getUserId(), "技师已开始维修您的车辆");
return Result.ok();
}
}
3. 管理员端:调度监控模块(答辩亮点!)
实时监控大屏,导师超爱看!
<template>
<div class="dashboard">
<!-- 今日预约统计 -->
<el-row :gutter="20">
<el-col :span="6">
<el-card>
<div class="stat-card">
<div class="stat-number">{{ todayStats.total }}</div>
<div class="stat-label">今日预约</div>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<div class="stat-card warning">
<div class="stat-number">{{ todayStats.pending }}</div>
<div class="stat-label">待接单</div>
</div>
</el-card>
</el-col>
</el-row>
<!-- 技师工作状态 -->
<el-card class="tech-status">
<div slot="header">技师实时状态</div>
<el-table :data="technicianStatus" stripe>
<el-table-column prop="name" label="技师"></el-table-column>
<el-table-column prop="currentOrder" label="当前任务"></el-table-column>
<el-table-column prop="status" label="状态">
<template slot-scope="scope">
<el-tag :type="getStatusType(scope.row.status)">
{{ scope.row.status }}
</el-tag>
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
五、测试别敷衍!这3步让答辩不翻车
我当初没测“并发预约”,答辩时演示两个用户同时预约同一时段,系统没报错!
1. 功能测试(必测3场景)
| 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|
| 冲突预约测试 | 用户A预约10:00→用户B预约相同技师10:00 | B收到提示“该时间段已被预约” |
| 技师接单超时 | 创建预约→30分钟技师未接单 | 系统自动取消预约,释放时间段 |
| 配件库存预警 | 技师使用某配件→库存低于阈值 | 管理员收到库存预警通知 |
2. 性能测试(重点!)
- 压力测试:模拟50车主同时查询可预约时间,响应时间<2秒
- 并发测试:10技师同时接单,系统无脏数据
- 数据量:10万条历史预约记录,统计查询<3秒
3. 测试报告要点
- 发现的问题:“时间冲突仅前端校验,后端补了唯一索引;技师状态更新不及时,加了WebSocket推送;库存扣减没加锁,用了Redis分布式锁”
- 测试结论:“预约准确率100%,系统支持500用户同时在线,数据一致性强”
六、答辩准备:3个加分小技巧
- 演示流程:按“车主预约→技师接单→维修完成→车主评价”完整流程,重点展示冲突处理
- 讲技术亮点:“用唯一索引+乐观锁保证预约不冲突;JSON字段存储动态维修报告;时间片算法推荐最佳预约时间”
- 准备问题:
- Q:怎么防止技师刷单?
A:接单需二次确认,系统记录操作日志,异常行为自动预警 - Q:系统扩展性如何?
A:模块化设计,可扩展在线支付、保险理赔、配件商城等模块
- Q:怎么防止技师刷单?
最后:毕设通关小私心
以上就是基于SpringBoot+Vue+MySQL的汽车维修预约系统从0到1的避坑干货!别做复杂功能(如AI故障诊断),把预约调度、状态管理、库存同步做扎实,答辩稳稳的。
需要完整源码(带预约冲突处理)、数据库脚本(含测试数据)、API文档的宝子,评论区扣“汽车维修系统”,我私发你;卡在某个功能(如时间冲突算法、WebSocket推送),也可以留言,看到必回!
点赞收藏,毕业不慌~祝宝子们顺利通过答辩! 🚗💨