毕业设计实战:基于SpringBoot+Vue+MySQL的汽车维修预约服务系统全流程避坑指南!

47 阅读10分钟

毕业设计实战:基于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.0JSON类型存维修报告、事务保证数据一致性预约表加唯一索引防重复预约
MyBatis-Plus简化CRUD、支持乐观锁防止并发更新技师接单用version字段做乐观锁
定时任务(Quartz)处理超时未接单自动取消、定期生成报表别用最新版Spring Scheduler配置复杂
文件上传(OSS)存储车辆照片、维修报告图片本地存储需注意路径配置,建议用相对路径

2. 开发环境搭建(step by step)

  1. 后端

    # 创建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
    
  2. 前端

    # 创建Vue项目
    vue create car-repair-front
    # 安装Element UI
    npm i element-ui -S
    
  3. 数据库

    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:00B收到提示“该时间段已被预约”
技师接单超时创建预约→30分钟技师未接单系统自动取消预约,释放时间段
配件库存预警技师使用某配件→库存低于阈值管理员收到库存预警通知

2. 性能测试(重点!)

  • 压力测试:模拟50车主同时查询可预约时间,响应时间<2秒
  • 并发测试:10技师同时接单,系统无脏数据
  • 数据量:10万条历史预约记录,统计查询<3秒

3. 测试报告要点

  • 发现的问题:“时间冲突仅前端校验,后端补了唯一索引;技师状态更新不及时,加了WebSocket推送;库存扣减没加锁,用了Redis分布式锁”
  • 测试结论:“预约准确率100%,系统支持500用户同时在线,数据一致性强”

六、答辩准备:3个加分小技巧

  1. 演示流程:按“车主预约→技师接单→维修完成→车主评价”完整流程,重点展示冲突处理
  2. 讲技术亮点:“用唯一索引+乐观锁保证预约不冲突;JSON字段存储动态维修报告;时间片算法推荐最佳预约时间”
  3. 准备问题
    • Q:怎么防止技师刷单?
      A:接单需二次确认,系统记录操作日志,异常行为自动预警
    • Q:系统扩展性如何?
      A:模块化设计,可扩展在线支付、保险理赔、配件商城等模块

最后:毕设通关小私心

以上就是基于SpringBoot+Vue+MySQL的汽车维修预约系统从0到1的避坑干货!别做复杂功能(如AI故障诊断),把预约调度、状态管理、库存同步做扎实,答辩稳稳的。

需要完整源码(带预约冲突处理)、数据库脚本(含测试数据)、API文档的宝子,评论区扣“汽车维修系统”,我私发你;卡在某个功能(如时间冲突算法、WebSocket推送),也可以留言,看到必回!

点赞收藏,毕业不慌~祝宝子们顺利通过答辩! 🚗💨