1. 为什么我建议把“汽车养护系统”拿来做毕设选题
1.1 这个场景比“电商系统”“图书管理”更有区分度
每年Java方向的毕业设计,做电商、外卖、图书管理、学生管理这类选题的人太多,评委老师看到题目列表就知道你大概是哪一套模板。汽车养护系统虽然也属于管理信息系统,但它的业务场景更加垂直、具体,有完整的线下作业流程可以还原:客户开车进店、前台接待登记、技师派工施工、质检完工、结算离场,再到下一次保养提醒。你去做需求调研时,随便找一家路边的汽修美容店聊半小时,就能拿到一堆真实的业务细节,这些内容写进论文的需求分析章节,比凭空编造的系统要有说服力得多。
我在带毕业设计的过程中发现,很多同学不是不会写代码,而是不知道“系统该做什么”。汽车养护系统的业务边界非常清晰:围绕人(客户、员工)、车(车辆档案、保养记录)、钱(工单结算、配件出入库)三个维度展开。只要把这三条线理清楚,功能模块自然就出来了,论文结构也顺了。
1.2 技术栈刚好打中Java课程的核心范围
这个基于SpringBoot + Vue的智能汽车养护系统,后端用Java的SpringBoot框架,前端用Vue框架,数据存储用MySQL,涉及的技术点几乎是国内高校软件工程、计算机科学专业Java方向的“标准套餐”:
- SpringBoot:自动装配、Starter依赖管理、全局配置
- MyBatis-Plus(或MyBatis):数据持久层、条件构造器、分页查询
- MySQL:表结构设计、索引、外键约束、事务
- Vue:组件化开发、路由、状态管理、前后端分离
- RESTful API:接口设计规范
- JWT:登录鉴权、拦截器
- Scheduled定时任务:保养到期提醒
这套组合的好处是:你不会在某个环节上因为技术太偏门而卡死。网上资料多、报错能搜到解决方案、学校机房的环境也能跑起来。反过来,如果你非要选一个特别冷门的框架来彰显个性,比如Grails或者纯Node.js替代后端,答辩时一旦被问到“为什么不用课程里学的SpringBoot”,场面会比较尴尬。
1.3 题目自带“可深可浅”的弹性
同一个题目,专科层次的毕设可以只做基础CRUD加一个简单的工单流程;本科层次的毕设可以加入权限角色、保养提醒、库存预警、统计报表;如果你想冲优秀毕业论文,还可以扩展车主端小程序、Redis缓存、文件上传、Excel导入导出这些加分项。这种弹性非常难得,因为选题定下来之后,中途发现难度不够或者进度落后,都有调整空间,不会推倒重来。
2. 从需求出发:这套系统的功能边界与角色权限设计
2.1 先想明白“谁来用”,再谈页面
很多同学一上来就画页面,这是错误的顺序。做管理系统,第一步是搞清楚角色。汽车养护门店里至少有这几类人:
| 角色 | 核心诉求 | 对应功能 |
|---|---|---|
| 系统管理员 | 维护基础数据、管理账号 | 员工管理、角色权限、数据统计 |
| 前台接待/服务顾问 | 登记客户车辆、开单、结算 | 客户管理、车辆管理、预约登记、工单开单、收银 |
| 养护技师 | 查看派工任务、填写施工内容 | 工单派工、项目录入、完工确认 |
| 质检/店长 | 把控施工质量、看经营数据 | 质检审核、经营报表 |
在本科毕设里,多数实现方案是做一到三个角色的后台管理系统:登录时选择管理员或前台身份,技师角色如果没有精力去细化,可以先把“派工后技师确认开始施工”这个动作合并到前台或管理员的工单详情页里。我的建议是至少做管理员和前台两个角色,这样权限控制的代码有差异化,论文里也能画出角色用例图,工作量又不会失控。
2.2 功能模块划分:把“一个系统”拆成看得见的功能点
我按最常见的毕设交付程度,把系统拆成七个模块:
- 登录与权限模块:验证码、登录接口、JWT发放、拦截器校验、菜单权限
- 客户档案模块:客户新增、编辑、搜索、删除,客户列表带关联车辆数
- 车辆档案模块:车牌号、品牌型号、VIN码、当前里程、保险到期日、上次保养日期
- 工单管理模块:预约登记、生成工单、派工、施工项目录入、完工结算、取消
- 配件库存模块:配件信息维护、入库、出库、库存预警
- 提醒与通知模块:按日期或里程自动生成保养、保险、年检提醒
- 数据统计模块:今日营收、工单总量、月收入趋势、服务项目排行
这样拆完,你再看技术点就明白了:登录权限对应JWT和拦截器,工单管理对应事务和多表联查,配件库存对应进销存逻辑,提醒模块对应定时任务。每一个模块都能在论文里单独写一节,完全不会愁字数。
2.3 哪些功能应该保留,哪些必须砍掉
毕设和真实商业软件最大的区别是:评委看的是“你能不能完整地讲清楚一个业务闭环”,而不是“你的功能是不是比肩4S店系统”。所以下列功能建议直接砍掉或只留雏形:
- 多门店连锁、总部与分店数据同步:涉及分布式,不是毕设该碰的
- 复杂的会员储值卡、积分抵扣:牵扯金额计算和异常退款,容易把自己绕晕
- 对接短信、微信推送:需要第三方账号,演示时依赖外网,不稳定
- 复杂的库存统计算法(如先进先出、批次管理):用简单的出入库流水就够了
保留的核心闭环是:客户建档 → 车辆建档 → 预约或直接开单 → 工单指派 → 施工录入 → 结算 → 下次保养提醒。这套流程跑通了,系统的完整度已经超过大多数毕设。
3. 技术选型的底层逻辑:不是越新越好,而是“说得清楚”
3.1 SpringBoot 2.x 还是 3.x,怎么定
先说结论:如果你的JDK环境是8或11,选SpringBoot 2.7.x;如果学校统一用的JDK 17或21,可以选SpringBoot 3.x。这个选择不是你偷懒,而是毕业设计的核心目标是“稳定复现、答辩自洽”。SpringBoot 3.x从javax包迁移到了jakarta包,很多老教程里的代码直接粘过来会编译报错,springfox的Swagger2在3.x上也会有兼容问题。你在网上搜到的绝大多数教程、博客、论坛答疑帖,还是基于SpringBoot 2.x的,直接照抄的概率更大。
如果你的项目标题写着SpringBoot,答辩时老师大概率会问一句话:“SpringBoot和传统SSM相比有什么优势?”你要准备好回答:自动配置简化了繁琐的XML配置、内嵌Tomcat让部署变成java -jar一条命令、Starter机制让依赖管理更清晰。这些话术要内化,不要背,要能结合你自己的项目举例子。
3.2 ORM框架之争:JPA还是MyBatis-Plus
ORM层我强烈建议用MyBatis-Plus,而不是原生JPA或纯MyBatis。原因是毕设项目里的单表CRUD占了80%,MyBatis-Plus可以用BaseMapper内置的insert、selectById、selectPage直接搞定,不需要手写任何SQL;复杂的多表统计再用注解SQL或者XML解决。这样你的代码量显著减少,报错范围也变小。
JPA的自动建表能力确实很诱人,但它在处理“工单主表+工单明细表”这种一对多场景时,懒加载和级联保存容易出一些让人摸不着头脑的报错。如果你对Hibernate没有足够的理解,答辩时被问到“N+1查询问题”就麻烦了。MyBatis-Plus的调试直观性对新手更友好,控制台把SQL打出来,一眼就能看到问题出在哪。
3.3 前端Vue 2还是Vue 3,UI库怎么考虑
现在很多学校课程已经切到Vue3了,但如果你的课程项目还在用Vue2,就老老实实用Vue2 + Element UI,没有必要盲目追求新。Element UI的组件写法、中文文档、百度搜索结果都非常成熟,踩坑成本低。如果你选Vue3,就搭配Element Plus,构建工具用Vite,开发体验更好,但要注意Element Plus的组件API和Vue2版有差异,别混着看教程。
前端这块还有一个细节:打包产出物的处理。Vue项目执行npm run build之后会生成dist目录,你最好能把dist里的文件复制到SpringBoot的src/main/resources/static下,这样启动后端一个端口就能访问整个系统,答辩时不用开两个服务,也不会有跨域问题。这个技巧会在第6章详细讲。
3.4 中间件和辅助组件:哪些是加分项,哪些是负担
MySQL版本建议用5.7或8.0,现在新装一般就是8.0,注意驱动类名不同就行,我在第7章会专门展开。Redis不是必选,但如果你论文里写了“性能优化”章节,把登录token和验证码放Redis、缓存热点客户数据,是一个很标准、很好讲的加分点。文件上传建议用本地存储就够,在项目里建一个upload目录存车辆照片,答辩演示时不需要依赖外网OSS。
我见过一些学生为了“高大上”引入了消息队列、搜索引擎之类的组件,结果部署环节直接崩溃,最后演示都要靠录屏。记住:毕设的技术选型原则是“能讲清楚为什么用它”比“用了多新的技术”重要得多。
4. 数据库设计的几个关键决策:表结构、字段与状态机
4.1 核心表一共多少张,关系怎么画
我按常见的实现方案给你一个表清单,这些表基本覆盖了整个系统:
- sys_user(员工/用户表):账号、密码、姓名、手机号、角色、状态
- sys_role(角色表,可并入用户表用字符串字段简化)
- customer(客户表):姓名、电话、证件号、地址
- vehicle(车辆表):车牌、品牌、型号、VIN、里程、保险到期日、年检到期日
- service_item(服务项目表):项目名、类型(保养/维修/美容)、工时费、单价
- work_order(工单主表):工单号、客户、车辆、状态、接单员、技师、总金额
- order_item(工单明细表):工单关联的服务项目、数量、金额
- parts_info(配件表):配件名称、编号、规格、库存量、警戒库存
- stock_log(出入库记录表):类型、数量、操作人、关联工单
- reminder(提醒记录表):提醒类型、车辆、提醒内容、状态、日期
关系一句话就能说清:一个客户有多辆车,一辆车可以有多张工单,一张工单包含多个工单明细,一个工单可以使用多个配件并生成出库流水。论文里画ER图时,把这几张表的关系画出来就足够。
4.2 工单状态机设计:这是答辩时最能体现设计能力的部分
工单状态不建议用字符串,用一个int类型字段更清晰。我在项目里习惯这样定义:
| 状态值 | 含义 | 可操作 |
|---|---|---|
| 0 | 待接单 | 取消、派工 |
| 1 | 已派工 | 开始施工、取消 |
| 2 | 施工中 | 录入项目、完工 |
| 3 | 待质检 | 质检通过、驳回 |
| 4 | 已完工 | 结算 |
| 5 | 已结算 | 查看、打印 |
| 6 | 已取消 | 只读 |
为什么要设计成状态机而不是随意改?因为工单涉及金额和配件出库,如果技师在未完工状态下就把结算做了,整个流程就乱套了。后端在每次更新状态时做合法性校验,比如只能从0改成1、从1改成2,非法状态流转直接抛异常。答辩时把这个逻辑讲清楚,老师会认为你具备基本的业务建模能力,而不是只会写增删改查。
4.3 字段细节与约束:那些看不见的坑
金额字段统一用decimal(10,2),不要用float或double,不然累计对账的时候会出现0.1 + 0.2 = 0.30000000000000004这种经典问题。时间字段建议用datetime,状态字段和删除标记用tinyint,比如status、deleted。所有表建议加上create_time和update_time两个字段,MyBatis-Plus的自动填充功能可以帮你维护,论文里也可以提一句“通过MetaObjectHandler实现公共字段自动填充”。
字符集一定要用utf8mb4,别问为什么,你永远不知道演示环境里会不会出现一个“🚗”这样的表情字符。建表语句里统一写好ENGINE=InnoDB DEFAULT CHARSET=utf8mb4。索引方面:vehicle表的customer_id、work_order表的vehicle_id和status、reminder表的vehicle_id和type,这几个常用查询字段都加上普通索引,答辩时就能回答“为什么加索引”这个问题。
4.4 初始化数据怎么写,演示效果才能拉满
初始化SQL脚本里,除了必须有管理员账号,我强烈建议你造这样几组数据:
- 3到5个客户,每人都有一辆或多辆车,里程数各不相同
- 一辆车的保险到期日设成30天内,方便演示保险提醒
- 一辆车的当前里程距离下一次保养里程只差200公里,方便演示保养提醒
- 一个配件库存量低于警戒值,方便演示库存预警
- 近6个月的工单数据,其中包含几个不同服务项目的消费记录,方便统计图表输出
这样做的好处是,你打开系统首页时图表不是空的,表格不是空的,提醒列表有内容,评委不用等你现做数据,印象分会高很多。
5. 后端核心模块的实现思路:从登录鉴权到保养提醒
5.1 分层结构与管理约定
后端工程目录按经典结构组织,不要偷懒把所有代码塞进controller里:
com.example.care ├── common // Result、异常处理、常量 ├── config // 拦截器、跨域、定时任务配置 ├── controller // 接口层 ├── entity // 数据库实体 ├── dto // 请求参数 ├── vo // 返回视图对象 ├── mapper // 数据访问接口 ├── service // 业务逻辑接口 │ └── impl // 业务实现类 └── utils // JWT、日期工具controller只负责接收参数和返回结果,业务逻辑写在service里,数据访问全部走mapper。别看这个规范很简单,很多学生图快直接在controller里写SQL,到了维护和答辩阶段,自己都找不到代码在哪里。
5.2 统一返回结果与全局异常:让前后端对接不吵架
后端接口不管成功失败,都返回一个统一的JSON结构。我常用的Result类包含code、message、data三个字段。前端axios拦截器只需要判断code是否为200,不需要为每个接口单独处理异常状态。
全局异常处理用@RestControllerAdvice,把业务异常、参数校验异常、兜底异常分别处理。比如参数校验失败返回400,业务逻辑错误返回对应的业务码,系统异常返回500。这样做的好处是前端不会被一堆乱七八糟的错误格式搞晕,而且答辩演示时,你故意输入一个非法参数,页面能弹出友好的中文提示,评委体验特别好。
5.3 基于JWT的登录鉴权与拦截器逻辑
登录接口的流程是这样的:接收用户名和密码,查询sys_user表,用BCrypt校验密码,查不到或密码不匹配就抛业务异常;登录成功后生成一个有效期为24小时的JWT token,把用户ID和角色名放进去,返回给前端。前端拿到token存到localStorage,之后的每次请求在请求头带上Authorization: Bearer xxx。
后端写一个LoginInterceptor实现HandlerInterceptor,在preHandle方法里解析token。解析不到或过期就返回401,解析成功就把用户ID放到ThreadLocal里,后续业务代码可以从ThreadLocal拿到当前登录人。注意登录接口本身要放行,还有一些静态资源比如图片上传目录也要放行。
这里有个容易踩的坑:SpringBoot的拦截器默认不拦截静态资源,但如果你把前端dist文件放到了static目录,拦截器注册时要正确设置排除路径,否则前端页面能打开,页面里的请求却全部401。
5.4 工单创建:主表加明细,必须在一个事务里
创建工单的接口是整个系统的核心业务。前端传过来客户ID、车辆ID、选择的多个服务项目ID和数量,后端要做这几件事:
- 校验车辆存在且属于该客户
- 生成工单号,格式如WO+年月日+四位随机数
- 插入work_order主表,状态为0
- 遍历服务项目列表,逐条插入order_item明细表
- 计算总金额回填工单
- 如果工单里选了配件,校验库存并扣减,同时写入stock_log
整个过程必须加@Transactional注解。把事务传播和回滚逻辑说清楚是答辩加分项:如果第4步中途失败,第3步插入的主表记录也要一起回滚,否则数据库里会出现一张没有明细的孤儿工单。
5.5 保养提醒功能:定时任务加爬取扫描
保养提醒是智能汽车养护系统里最有“智能感”的功能。实现思路并不复杂:SpringBoot启动类加@EnableScheduling,写一个ReminderTask类,用@Scheduled(cron = "0 0 8 * * ?")每天早上8点执行一次扫描任务。
扫描逻辑分三类:
- 保险到期:vehicle表里insurance_expire_date与当天相差小于等于30天
- 年检到期:年检日期类似
- 保养到期:根据last_maintenance_date和保养周期推算,或根据next_maintenance_mileage与当前mileage_km的差值判断
扫描结果插入reminder表。为了避免每天重复生成同一条提醒,插入前要查一下同车辆同类型是否已经存在未处理的提醒。前台首页的提醒列表就是从reminder表查最近N条。
这里再补充一个经验:定时任务的执行时间写成配置项,不要硬编码。答辩时你就能讲“我用@ConfigurationProperties从application.yml读取定时执行时间,方便运维调整”。这一类细节都是拉开分差的地方。
6. 前端Vue部分的组织方式:页面、路由、状态管理与接口对接
6.1 项目初始化与目录设计
前端用Vue脚手架创建项目,目录结构建议按模块划分,不要把所有组件堆在components下面:
src ├── api // 所有接口请求封装,按模块分文件 │ ├── auth.js │ ├── workOrder.js │ └── customer.js ├── router // 路由配置 ├── store // 登录状态、用户信息 ├── views // 页面 │ ├── Login.vue │ ├── dashboard │ ├── customer │ ├── vehicle │ ├── workOrder │ ├── stock │ └── reminder ├── utils // axios封装、工具函数 └── components // 公共组件6.2 登录态管理与路由守卫
登录页提交用户名密码,成功之后把token和用户信息写进store,同时存到localStorage防止刷新丢失。路由配置里加一个全局前置守卫:
router.beforeEach((to, from, next) => { if (to.path === '/login') { next() } else if (!localStorage.getItem('token')) { next('/login') } else { next() } })这个逻辑不复杂,但有学生会问:那用户已经登录了,为什么还要在axios里做拦截?因为路由守卫只能控制页面跳转,控制不了接口请求。用户token过期了,页面能打开,但请求全部401,所以axios响应拦截器里要统一处理:遇到code是401就清除本地登录信息、跳回登录页。
6.3 工单列表页:一个标准CRUD页面的完整写法
我拿工单列表页举例,这是个经典的“表格+搜索+分页+弹窗”页面:
- 顶部搜索区:工单号、客户手机号、状态下拉框、日期范围
- 表格列:工单号、车牌号、客户姓名、服务类型、金额、状态标签、创建时间、操作按钮
- 状态列用Element的el-tag,不同的status值映射不同的颜色:待接单灰色、已派工蓝色、施工中橙色、待质检紫色、已完工绿色、已结算深绿、已取消红色
- 操作按钮根据当前状态动态显示:待接单显示“派工”和“取消”,已派工显示“开始施工”,施工中显示“完工”,待质检显示“质检通过”,已完工显示“结算”
- 新增和编辑用同一个el-dialog弹窗,打开时判断是新增还是编辑,表单校验规则用Element的rules
这个页面你要是能完整做出来,基本上Vue的组件通信、表单校验、生命周期钩子、axios请求这几个核心技能点就全部练到了。写完之后把代码结构整理清楚,论文的系统实现章节直接截图加讲解就可以。
6.4 跨域、代理与打包部署
开发阶段,前端和后端是两套服务,必然面临跨域。最省事的方案是在vue.config.js里配置devServer的proxy,把/api开头的请求代理到后端地址:
devServer: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } }这样前端页面上的请求都是相对路径/api/xxx,浏览器不会跨域,后端也不需要配置CORS。但如果后端也加了CORS配置,要注意别让代理和CORS叠加出奇怪的错误,二选一就行。
部署阶段,为了方便答辩演示,我前面推荐了“把dist复制到SpringBoot的static目录”方案。具体做法是:前端执行npm run build,把生成的dist目录里的内容复制到后端src/main/resources/static下,重新打包后端,启动后访问http://localhost:8080就能打开完整系统。这个方案答辩时最稳妥,不需要现场启动两个服务,也不依赖Nginx。
7. 联调、调试与部署环节里最容易踩的坑
7.1 MySQL 5.7/8.0的连接细节
MySQL相关的坑,我见过太多学生卡在这里。首先是驱动类名:MySQL 5.x用的驱动类是com.mysql.jdbc.Driver,MySQL 8.x改成了com.mysql.cj.jdbc.Driver,你如果复制了老配置文件,启动直接报ClassNotFoundException。
JDBC连接串也需要注意:
jdbc:mysql://localhost:3306/car_care?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/ShanghaiserverTimezone这个参数在5.7上可加可不加,在8.0上如果不加,很可能报时区相关的异常。useSSL=false是为了避免本地调试时SSL握手报错。另外MySQL 8.0默认的密码认证插件是caching_sha2_password,如果你用的驱动版本比较老,会报Unable to load authentication plugin错误,解决办法是换一个较新的mysql-connector-java版本,或者在MySQL客户端里把用户认证插件改成mysql_native_password。这个细节写成一条注意事项放进论文测试章节,字数也算得实在。
7.2 SpringBoot版本与三方库的兼容性问题
现在热搜词里经常能看到“springboot版本太高”这种问题,确实如此。常见的坑包括:
- SpringBoot 3.x必须搭配JDK 17以上,你用JDK 8跑会直接启动失败
- 老牌Swagger库springfox在SpringBoot 3.x里启动报空指针,需要换成springdoc-openapi
- javax.servlet、javax.annotation这些包在SpringBoot 3.x里变成了jakarta开头,从网上复制的工具类代码需要大量改import
- 有些MyBatis-Plus版本对SpringBoot 3的支持不完整,要用专门的mybatis-plus-spring-boot3-starter
我的建议是:如果学校没有强制要求JDK 17,就用SpringBoot 2.7.x + JDK 8/11 + MyBatis-Plus 3.5.x,这套组合非常成熟,网络上几乎每个报错都能搜到现成解决方案。使用外部库之前一定要先看它是否兼容你的SpringBoot主版本。
7.3 Vue前端环境与npm依赖问题
npm install慢是新手最容易心态崩的环节。解决办法很简单,设置国内npm镜像:
npm config set registry https://registry.npmmirror.com还有一个经典坑是node-sass。node-sass需要编译原生模块,经常出现安装失败,而Vue CLI创建的项目里sass-loader默认可能依赖它。建议改用sass包,或者直接避免使用scss语法,用Element的默认样式加普通CSS就能完成90%的页面效果。
如果你在页面上看到类似“Unknown custom element”的警告,通常是两个原因:组件没有import并注册,或者Element UI没有完整引入。我习惯在main.js里全量引入Element UI,毕设项目用全量引入最简单,按需引入是优化方向,但优先级不高。
7.4 联调阶段:先测接口,再对页面
我调试前后端分离项目有一个固定习惯:写完一个后端模块,先不用急着写前端页面,用Postman或APIFox把接口全部测一遍。包括正常参数、缺失参数、错误参数、无token请求、token过期这几种场景。接口通了,再开始写前端页面。
如果页面调接口报错,优先看两个地方:前端浏览器Console里的报错,以及Network面板里HTTP响应状态码和返回体;后端看控制台SQL日志和异常堆栈。MyBatis-Plus可以在application.yml里配置:
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl这样每条SQL都会打印到控制台,你能看到实际执行的语句和参数,排查多表联查很快。很多学生对着一句“请求失败”的提示猜半天,其实只要打开Network面板,就发现是404还是500,方向立刻清楚了。
8. 论文、答辩与“完整源码交付物”的整理节奏
8.1 论文结构:不是写作文,是复述系统怎么落地
汽车养护系统毕业设计的论文结构,我建议严格按软件工程标准章节来写。第一章绪论写背景和意义,不用长篇大论,三页左右足够,引用几条行业数据就能支撑。第二章相关技术介绍,SpringBoot、Vue、MySQL、MyBatis-Plus各写一页,重点写你为什么选它,不要抄百科。第三章需求分析是重点,把角色用例、功能需求、非功能需求写清楚,配上用例图和流程图。第四章系统设计包括总体架构、模块设计、数据库设计,ER图和表结构必须要详细。第五章系统实现按模块逐个写,每个模块都贴上核心代码并解释。第六章系统测试写测试用例、测试结果、缺陷修复过程。最后是总结与展望。
数据库设计部分,建议把每张表的字段用表格列出来,注明类型、约束、说明。选题报告和开题报告里如果有系统功能图,后面论文的大章节尽量保持一致,避免出现前后矛盾这种低级错误被答辩老师抓包。
8.2 答辩前必须准备的几个高频问题
根据我旁听答辩的经验,老师问来问去就那么几个方向。你把下面的问题提前想明白,基本就能稳住:
- SpringBoot相比传统SSM简化在哪里?结合你的项目举例,比如内嵌Tomcat不需要单独部署、自动配置减少XML。
- 数据表之间的关联关系?画出表关系,说明外键和索引怎么设计。
- 工单状态为什么用数字而不用字符串?说状态机的好处,避免非法流转。
- 事务在哪里用?工单创建和配件的出库为什么必须在一个事务里?说清楚回滚场景。
- 如果两个技师同时操作同一张工单怎么办?可以提乐观锁或状态校验,即使没做,也要说出你的思考。
- 前端和后端是怎么通信的?RESTful接口加axios封装,token如何传递。
- 定时任务会不会重复提醒?提示去重逻辑,已经处理过的提醒不会再次生成。
这些问题你准备得越充分,答辩越从容,哪怕有一个当时没做,你也可以说“当前版本采用了更简单的实现,后续可以通过什么方案升级”,老师一般不会追打。
8.3 交付物清单与代码讲解的顺序
标题里带了“附源码、mysql、文档、调试+代码讲解”,这说明很多人买毕设项目最在意的就是拿到手里能不能跑起来。我建议你交付或者整理自己的项目时,也按这个思路组织好:
- 源代码工程:后端一个文件夹,前端一个文件夹,README写清环境要求
- 数据库脚本:建库建表脚本和初始化数据脚本分开,避免执行报错
- 论文文档:Word版论文、开题报告、任务书、答辩PPT
- 演示视频:录一个完整的操作演示,备用
- 调试说明文档:从安装JDK到启动后端的每一步截图
代码讲解的顺序按业务闭环走:先把数据库还原,再启动后端,用Postman测一遍登录和工单创建接口,接着启动前端,演示登录后按“客户管理→车辆管理→开单/派工→施工结算→提醒中心”的路线走一遍,最后打开定时任务和权限拦截的代码讲设计。这样听的人能跟着你的业务逻辑走,而不是听你从头念一遍代码。
整套做下来,你会发现这个选题真正锻炼人的不是写代码本身,而是把一个完整业务从需求分析、建模、实现到测试交付的全过程跑通。如果你正在纠结毕设选题,汽车养护系统是一个性价比很高的选项,难度适中、方向垂直、技术栈通用,最重要的是你能把每一步都讲明白,这就够了。