☰
SpringBoot+Vue+MySQL企业车辆管理系统毕业设计实战全流程
2026/10/7 2:44:38 网站建设 项目流程

从选题那天起,我就打定主意做一个"能真正跑起来"的毕业设计,而不是交一个只停留在PPT上的原型。SpringBoot+Vue+MySQL这个组合,几乎是当下企业级Web开发最主流的入门三件套,网上资料多、踩坑方案全,遇到问题不至于孤立无援。最关键的是,企业车辆管理系统这个题目,功能边界清晰、业务场景日常、数据结构不算复杂但足够展开,非常适合在几个月的毕设周期内完整落地。这篇总结把我从环境搭建、数据库建模、前后端联调、部署打包到写论文答辩的全过程按真实顺序捋了一遍,准备做同类系统或者准备答辩的学弟学妹,可以直接照着这条链路走。

1. 系统功能拆解:一个企业车辆管理系统到底该管什么

很多同学拿到题目后第一件事就是建表写代码,这其实最容易翻车。我建议先花三四天把功能边界画清楚,否则后期每加一个模块都要动表结构,非常痛苦。

1.1 角色权限模型:先回答"谁在用、能用什么"

车辆管理系统里最常见的角色有三种:系统管理员、车管员(调度员)、普通员工(用车人)。我最后加了一个仅用于演示的"超级管理员"角色,用来给答辩时展示权限控制逻辑。

  • 超级管理员:可以查看所有数据、管理后台账号、修改系统配置。答辩时演示"你改不了别人的数据"就靠这个角色。
  • 车管员:负责车辆档案维护、审批用车申请、登记维保与违章记录、查看全量统计报表。
  • 普通员工:只提交用车申请、查看自己的申请进度与历史记录。

权限模型没有做得特别重,采用经典的RBAC(基于角色的访问控制),一张用户表、一张角色表、一张菜单权限表,再加一张用户角色关联表。为什么不做细粒度的数据权限?因为毕设周期有限,RBAC足以满足答辩时"不同角色登录后看到的菜单不同"这个演示点。如果想让系统显得更完整,可以在申请表里加一个归属字段,让普通员工只能查询 owner_id 等于自己ID的数据,这就是数据权限的雏形,论文里也能多写一小节。

1.2 业务模块清单:照着这张表核对不会漏

我列出最终实现的模块,供你做需求梳理时参考。每个模块我后面都会讲关键实现,但这张表可以帮你先建立整体印象:

模块核心功能涉及角色
车辆档案管理新增/编辑/删除车辆,上传行驶证照片,车辆状态管理(可用、维修中、已报废)车管员
司机信息管理司机档案CRUD、驾照到期提醒车管员
用车申请审批员工提交申请、车管员审批、状态追踪员工、车管员
车辆调度派车审批通过后分配车辆与司机,生成出车记录车管员
维保管理保养/维修记录登记,保养到期提醒车管员
违章管理违章记录登记、罚款金额、处理状态车管员
加油管理加油记录录入,统计油耗数据车管员
保险年检管理保险到期时间、年检到期时间提醒车管员
系统管理用户管理、角色管理、菜单管理、日志管理超级管理员
数据统计用车趋势、车辆使用率、费用统计图表车管员、超级管理员

这里要特别说明一下"车辆调度派车"这个模块,它是整个系统的业务核心,也是论文里可以重点展开的亮点。我的做法是:申请审批通过后,车管员在待派车列表里选择空闲车辆和可用的司机,点击派车,系统自动生成一条出车记录,同时车辆状态从"空闲"变为"出车中"。答辩时演示这个流程,比单纯演示增删改查有说服力得多。

1.3 流程设计:用车申请的全生命周期

业务流程图不需要画得多复杂,但状态流转必须清晰。我设计的申请状态有五个:待审批、已批准、已拒绝、已派车、已完成(已还车)。

  • 员工提交申请后,状态为"待审批"。
  • 车管员批准后,状态变更为"已批准",此时可以在"待派车"列表中对车辆进行分配。
  • 分配车辆和司机后,状态变更为"已派车"。
  • 车辆使用完成,车管员登记还车信息后,状态变更为"已完成",车辆状态恢复为"空闲"。

这个状态机看着简单,但实现时最容易出问题的是"状态和历史记录的联动"。比如一次申请被拒绝后,员工不能修改原申请再提交,应该重新发起一条申请。我的做法是在前端做判断,如果状态不是"待审批",就不显示"修改"和"重新提交"按钮,后端再做一次校验,防止直接调接口绕过前端。

2. 数据库设计的几个关键决策

数据库设计直接决定开发效率和后期扩展空间,网上随便找的建表脚本往往表字段命名混乱、缺少外键约束和索引,跑通Demo没问题,一写论文就露馅。

2.1 核心表结构:不能只有车辆和申请两张表

我最终一共有12张表,这里列一下核心表的字段设计思路,具体SQL太长就不全贴了:

车辆信息表(vehicle)

  • id 主键
  • plate_number 车牌号(必填,唯一索引)
  • brand_model 品牌型号
  • purchase_date 购置日期
  • vehicle_type 车辆类型(轿车/SUV/客车/货车)
  • status 状态(空闲/出车中/维修中/已报废)
  • mileage 当前里程
  • oil_consumption 百公里油耗基准值

车牌号一定要加唯一索引,核心业务数据,重复了会出大问题。status字段用Integer存储,1到4分别代表四种状态,前端用字典表翻译,比直接存中文灵活。

用车申请表(vehicle_apply)

  • id 主键
  • apply_user_id 申请人工号
  • reason 用车事由
  • start_date / end_date 预计用车时间段
  • destination 目的地
  • approval_status 审批状态(1待审批 2已批准 3已拒绝 4已派车 5已完成)
  • apply_time 申请时间

这里有个细节我在论文里着重写了:为什么不在申请表里直接放vehicle_id和driver_id的外键?因为派车动作发生在审批通过之后,如果设计成在申请表里填写车辆ID,会出现"申请刚提交就被分配车辆"的逻辑漏洞。我单独建了一张派车记录表(dispatch_record),将申请ID、车辆ID、司机ID、实际出车时间、还车时间解耦,这样审批、派车、还车才能形成完整闭环。

维保记录表(maintenance_record)

  • id
  • vehicle_id 车辆ID
  • maintenance_type 保养/维修
  • maintenance_date 维保日期
  • cost 费用
  • next_maintenance_date 下次保养日期
  • remark 备注

这个表的目的很明确,配合定时任务,实现"保养到期提醒"。我在车管员首页放了一个提醒面板,显示所有在30天内到期或者已经过期的车辆,答辩演示效果很好。

2.2 表关系与外键策略:适度使用,不要上瘾

有些教程喜欢建一堆外键,看起来关系严谨,实际操作时很麻烦。MyBatis-Plus做复杂关联查询时,外键约束反而会限制灵活性,而且生成树状JSON时容易循环引用。

我的做法是:

  • 业务表之间保留逻辑关联,通过字段名体现逻辑外键(如 apply_user_id 对应用户表主键),但不强制创建物理外键。
  • 仅对权限相关的表(用户角色关联表)使用物理外键,保证数据一致性。
  • 所有核心查询字段(plate_number、apply_user_id、vehicle_id、approval_status)都建了普通索引。

这个设计思路答辩时老师很容易追问,我的解释是:物理外键会降低大数据量下的插入性能,而且项目用的是逻辑删除(deleted字段),物理外键会和逻辑删除冲突,所以业务表只保留逻辑关联。这个回答提前准备好,基本能堵住追问。

2.3 逻辑删除与时间字段的约定

对外称"毕设要有工程规范",实际上是为了自己后期好维护。我的约定:

  • 每张表都有deleted字段(0正常 1已删除),配合 MyBatis-Plus 的@TableLogic注解,实现软删除。
  • 每张表都有create_time和update_time,在插入和更新时自动填充,用 MyBatis-Plus 的 MetaObjectHandler 统一处理。
  • 金额字段一律用 DECIMAL(10,2),不用Double,避免精度问题。

这里踩过一个坑:逻辑删除字段加上了,但没在实体上标注@TableLogic,导致删除操作变成了物理DELETE。MyBatis-Plus只有在实体类标注了 @TableLogic 后才会自动改写SQL为UPDATE,否则就是真的删数据。第一次没注意,把一条测试数据删了又插不回来,后来查MySQL日志才发现是走的物理删除。

3. 后端SpringBoot实现中的核心点

后端框架的选型,SpringBoot 2.7.x是最稳妥的选择,JDK用1.8,不要一上来就用SpringBoot 3.0和JDK17,很多教程和依赖在3.x下不兼容。网络安全和接口鉴权我用了Sa-Token,比Spring Security轻量很多,学起来快,API也直观。

3.1 项目分层与目录结构

很多人写毕设代码时所有逻辑全堆在Controller里,答辩时被老师问"你用了什么设计模式"就很尴尬。我的目录结构是这样的:

com.company.vehicle ├── controller(接口层) ├── service(业务层 + impl实现) ├── mapper(数据访问层) ├── entity(实体类) ├── dto(入参DTO对象) ├── vo(返回视图对象) ├── config(配置类:Sa-Token拦截、跨域、元数据填充) ├── utils(通用工具类:日期处理、Excel导出) └── exception(统一异常处理)

核心思想是Controller很薄,只做参数接收和结果封装;业务逻辑写在Service中;Mapper只做数据库交互。这样分工清晰,论文里写"代码分层明确,符合单一职责原则"才站得住脚。

3.2 登录认证:Sa-Token的接入与踩坑

Sa-Token接入非常简单,依赖引入后,在application.yml配置一下,登录成功后调用StpUtil.login(userId),然后前端在请求头里带上 token 即可。

有几个容易被忽略的坑必须提醒:

  • 跨域配置必须允许携带请求头,否则前端取到token也发不出去。我在WebMvcConfigurer里配置CorsRegistry时,allowedHeaders设置了Authorization和Content-Type,allowCredentials设为true。
  • Sa-Token的token需要设置过期时间。默认是永不过期还是较长时间我记不清了,还是建议明确配置sa-token.timeout为 86400(24小时),防止答辩现场登录状态失效。
  • 后端拦截器放行登录接口和静态资源,不然登录都访问不了。我的配置放行了/auth/login、/auth/captcha、/error,其余路径全部拦截。

登录逻辑还应该有一个验证码。我用的是Hutool的CaptchaUtil,生成一个算术验证码图片,把答案存到Session上,前端输入后提交,后端校验。这个不复杂,但能让系统看起来更完整。

3.3 权限控制:拦截器 + 注解实现功能级权限

Sa-Token里提供了@SaCheckRole和@SaCheckPermission注解,可以直接加在Controller方法上,实现功能级权限控制。

我定义了两类权限码:

  • vehicle:add、vehicle:edit、vehicle:delete用于车辆管理。
  • apply:submit用于员工提交申请。
  • apply:approve用于审批操作。
  • dispatch:assign用于派车操作。

在Sa-Token登录配置里,登录成功后查询当前用户角色关联的权限码集合,调用StpUtil.login之前先放进StpUtil.getSession(),这样拦截器就能直接读取。原理上跟Spring Security的权限集合类似,但用起来舒服多了。

答辩演示时,我只需要切换账号登录,点击"新增车辆"按钮,如果是员工账号登录,前端拿到403后弹出提示"无权限操作",整个过程非常直观。

3.4 定时任务:到期提醒的实现

这个功能是我很自豪的一个点。"车辆保养到期提醒"看似简单,用对了方式能体现你的工程思维。

我使用Spring自带的@Scheduled注解,每12小时执行一次,扫描维保表,找出next_maintenance_date在15天内的车辆,向车管员角色用户发送站内信。站内信我建了一张消息表,车管员登录后在右上角看到未读数字。

等等,这里有个细节:定时任务不能每次执行就向同一批用户发一次消息,否则每次重启都会往数据库里疯狂插数据。我加了一个消息去重逻辑:按 vehicle_id 和提醒类型判断,如果今天已经生成过提醒则跳过。这个细节写进论文,很容易给老师留下"考虑问题全面"的印象。

3.5 文件上传:行驶证照片的存储方案

车辆档案模块需要上传行驶证照片,我最初想存在本地路径,后来答辩时老师要求迁移,就改了方案。本地存储的问题是重启开发服务器后文件丢失,而且打包以后路径容易乱。

最终方案:上传文件保存在项目的upload/目录下,在application.yml里配置一个自定的file.upload-path。在配置类中实现了WebMvcConfigurer的addResourceHandlers,把/upload/**映射为本地绝对路径。这样一个简单的虚拟路径映射,就能让前端通过/upload/xxx.jpg访问到图片。

这里还要注意文件名不能直接用原始文件名,我把文件名改成了UUID加扩展名,避免中文或特殊字符乱码,也避免重名覆盖。

4. 前端Vue页面的搭建与调试

前端是整个系统的门面,也是答辩时老师第一眼看的东西。很多同学花大量时间折腾布局和动画,但我觉得前端最核心的还是组件封装、路由权限、状态管理、接口请求封装这四件事。

4.1 环境准备:别再在Node版本上翻车

Vue 2 + Element UI 的组合最稳妥,配合 Vue CLI 4.x 或者 Vite 搭建。如果之前有Node环境,强烈建议先执行node -v检查版本,Node 17以上在某些依赖下会报SyntaxError: Unexpected token '.',我当时就是因为Node版本太高,导致Vue CLI启动失败,后来用 nvm 切换回 Node 16.20.2 才顺利跑起来。

项目的构建方式我也带一下,后端SpringBoot和前端Vue分离开发,前后端通过API交互,本地开发时用Vue CLI自带的proxy代理,把/api请求转发到http://localhost:8080。开发期联调非常方便,不需要启动Nginx。

4.2 Axios封装:一个文件管好所有请求

前端请求不可能一个接口写一遍,我在utils/request.js里统一封装Axios实例,做了三件事:

  • 设置baseURL,所有请求自动加/api前缀。
  • 请求拦截器:从localStorage取出token,放到请求头Authorization。
  • 响应拦截器:统一处理业务状态码。服务端返回状态为401时,弹出登录过期提示并跳转到登录页;返回403时,触发全局提示"无权限操作"。

这里有个实战经验:很多毕设项目的前端对错误处理是散乱的,每一个请求都单独写失败回调。统一拦截器才能做到"后端一旦报错,前端全局弹提示",代码量直接减少一半,别人看你的代码结构也会觉得很工程化。

4.3 路由与菜单:动态生成才是亮点

普通的前端项目路由都是静态写死的,但一个权限系统应该根据当前用户的角色动态生成菜单。我的做法是:

  • 登录成功后,调用后端接口/auth/getUserInfo,拿到用户角色、权限码列表、菜单列表。
  • 前端使用 Vue Router 的addRoute方法,根据返回的菜单数据动态添加路由。
  • 菜单栏组件根据动态路由表渲染左侧导航。

答辩演示时,切换一个员工账号登录,菜单里只有"用车申请"、"我的申请"、"个人信息",管理员账号则有全部模块。视觉效果拉满,代码逻辑也不复杂,就是路由渲染时机要注意:必须在路由 beforeEach 里判断路由是否已添加,避免页面刷新时路由表被清空导致404。

4.4 ECharts报表:一行一行把逻辑讲清楚

系统管理员的首页我放了四个图表:月度用车趋势折线图、车辆类型占比饼图、费用构成柱状图、车辆使用率排名横向条形图。

ECharts的关键是后端要把统计好的数据格式返回给前端。我写了一个 DashboardController,用SQL聚合查询按月份统计申请数量,返回[{moth:'2025-04', count: 30}]格式,前端把数据 map 成 ECharts 需要的{xAxis: ['2025-04',...], series: [30,...]}。一开始我用错了格式,图表一直不显示,后来在浏览器Network里看了一下后端返回的JSON和ECharts要求的格式,才明白必须数据格式对齐。

这里的实战建议:做图表先说清数据格式,后端返回什么,前端需要什么,两端对齐再动手。如果自己写SQL聚合比较吃力,可以在mapper里写原生SQL,配合@Select注解,比用QueryWrapper硬拼容易得多。

4.5 打包放进SpringBoot:上线部署的常见路径

本地开发跑通了,最终要部署成"一个jar包跑全站",这也是很多公司实际生产的常见形态。做法是:

  1. 前端执行npm run build,生成 dist 目录。
  2. 把 dist 里的 static 文件夹和 index.html 放到SpringBoot的src/main/resources/static下。
  3. 重打包,启动后访问http://localhost:8080,就能同时看到前端页面。
  4. 与此同时,后端API加一个/api前缀,避免前端静态资源和API路径冲突。

这里有个坑必须说明:Vue Router如果启用了history模式,刷新不在首页的页面会404。因为SpringBoot的静态资源处理找不到对应路径,所有非API路径都指向了/,需要额外配置路由fallback。由于这个绕来绕去,我干脆用了createWebHashHistory(hash模式),URL里会多一个#/,配置简单、部署省心,答辩时没人注意这件事,自己也不容易出错。

5. 部署与演示:从本地跑通到交给答辩老师

部署是很多同学的噩梦,尤其数据库安装和初始化,稍不注意就卡半天。下面按我自己的真实操作顺序来讲。

5.1 数据库初始化:MySQL 5.7 还是 8.0

毕设环境里,MySQL 5.7.44 是最稳的选择,网上教程最多,遇到问题基本都能搜到。MySQL 8.0的认证插件和连接驱动有差异,如果引导里没配好,SpringBoot启动会报Public Key Retrieval is not allowed,新手容易卡住。我最后用的是MySQL 5.7,原因就一点:稳。

下载安装时有几个注意事项:

  • Windows 10 上安装时,选择 ZIP 解压版还是 MSI 安装版都可以,关键是安装完成后要设置环境变量,把MySQL的bin目录加到Path,否则命令行执行mysql命令提示"找不到命令"。
  • 初始化时执行mysqld --initialize-insecure,会自动生成一个无密码的root用户,比--initialize生成随机密码友好。
  • 启动服务后,用mysql -u root -p登录,先改root密码再建库。执行:ALTER USER 'root'@'localhost' IDENTIFIED BY 'yourpassword';
  • 然后用source命令导入数据库脚本:source /path/to/vehicle.sql;

导入脚本时要注意SQL文件的字符集,如果数据库默认是UTF8,但SQL文件里没有CHARSET=utf8mb4,导入中文会变成乱码。我用的SQL文件头部加了SET NAMES utf8mb4;,导入后数据展示正常。

5.2 SpringBoot配置:数据库连接和端口

application.yml里的核心配置:

server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/vehicle_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted

特别提醒serverTimezone=Asia/Shanghai这个参数,不写的话,日期时间字段会相差8小时或者直接报错。我当时踩了一次,后端一切正常,前端显示的时间总是比当前时间慢8小时,查了半天发现是时区问题。

5.3 启动顺序与常见启动报错

部署时一定要按正确顺序启动:数据库 → 后端 → 前端(或直接访问打包后的前端页面)。如果后端启动报错,第一步看数据库是否已启动、账号密码是否正确、库是否存在,这三个原因占了启动失败原因的80%。

另外一个高频报错:Error creating bean with name 'xxxMapper'。原因是数据库里的表名和实体类名映射不上。MyBatis-Plus默认根据实体类名驼峰转下划线找表名,如果你的表和实体类命名不一致,需要在@TableName("t_vehicle")里指定表名。我的项目全部用注解显式标注,从根上断了这个坑。

还有端口冲突,启动后显示Port 8080 was already in use,直接换端口或者在命令行执行netstat -ano | findstr 8080找到占用进程结束掉。

5.4 Docker部署MySQL的注意事项

如果你觉得安装本地MySQL麻烦,也可以用Docker跑数据库,但有几个坑必须先知道:

  • docker run时一定要映射端口,通常用-p 3306:3306,否则宿主机连接不上。
  • 需要设置MYSQL_ROOT_PASSWORD环境变量,否则容器启动后可能没有密码或者无法登录。
  • 数据要持久化,必须挂载数据卷,否则容器一删数据全没了。命令示例:
docker run -d \ --name vehicle-mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=vehicle_db \ -v /data/mysql:/var/lib/mysql \ mysql:5.7.44

我第一次跑Docker MySQL失败,是因为宿主机本地已经有一个MySQL占用了3306端口,容器映射失败。解决办法是把本地MySQL停掉,或者把容器映射端口改成3307:3306,然后后端连接URL改成jdbc:mysql://localhost:3307/vehicle_db。这两种方法都能解决,推荐用改映射端口的方式,互不干扰。

5.5 交付给老师的三种方式

很多同学问"项目源码怎么发给别人",我把它扩展成三种交付方式,方便你跟导师对接:

  • 方式一(源码工程包):将后端SpringBoot工程和前端Vue工程分别打成zip,附带数据库SQL脚本和部署文档。导师可以在自己的电脑上按文档复现。
  • 方式二(可执行jar包):前端打包后放进SpringBoot的static目录,重新打包出一个jar,导师电脑上只要配好MySQL,执行java -jar vehicle-system.jar就能访问。
  • 方式三(环境镜像):把整个部署好的虚拟机做成OVA导出,导师不用配环境,直接开虚拟机就能跑。这方式最省事,但文件体积大,一般毕设用不上。

我交付时选了方式一,因为老师明确想看源码结构。我在部署文档里写了完整的环境版本清单(JDK8、MySQL5.7、Node16、Maven3.6),每一步都配了截图,导师复现几乎没有障碍。

6. 论文与答辩:别让代码之外的东西拖后腿

代码写完了只是第一步,毕设占分比重更高的可能是论文质量和答辩表现。这块我有太多心得可以分享。

6.1 论文结构怎么搭:不用抄也能写出有逻辑的章节

我最终用了标准的六章结构:

  • 第1章 绪论:写研究背景、国内外现状、研究意义。国内现状可以引用政府发布的公车管理相关文件,国际现状写欧美企业的GPS与调度系统。
  • 第2章 相关技术介绍:SpringBoot框架、Vue前端框架、MySQL数据库、Sa-Token权限框架。重点是写原理和选型理由。
  • 第3章 系统需求分析:画用例图、数据流图、功能需求和非功能需求。
  • 第4章 系统设计:总体架构图、功能模块设计、数据库设计ER图、表结构说明。
  • 第5章 系统实现:按功能模块分别放页面截图、核心代码片段和逻辑说明。
  • 第6章 系统测试:测试环境、功能测试用例表、测试结论。

写论文最痛苦的是画图,我之前都是手画,后来学聪明了,用ProcessOn在线画用例图和流程图,ER图用Navicat直接导出,又方便又专业。

6.2 答辩评委最常问的问题

结合我答辩时的经历,把老师最爱问的问题整理在这张表里,提前准备,现场从容:

提问方向典型问题我的应答思路
技术选型为什么用SpringBoot不用SSH?SpringBoot简化配置、开箱即用,适合快速迭代;SSH配置繁琐、维护成本高,当前企业主流已是SpringBoot
权限设计多个角色权限重合怎么办?RBAC中权限是独立的,角色只是权限的集合,多个角色可以配置同一权限,通过角色菜单表做多对多关联
项目难点项目里最大的难点是什么?状态机流转和通知提醒,比如申请审批通过后如何触发派车逻辑,定时任务推送消息时如何避免重复通知
优化方向系统还有哪些可以改进的地方?接入Redis缓存热点数据、持续集成自动化部署、对接企业微信消息推送、统计分析引入大屏展示
数据安全系统怎么保证信息安全?登录接口做验证码校验、密码使用BCrypt加密存储、接口返回统一脱敏、操作日志记录关键行为
部署情况系统部署在什么环境?本地运行部署,后端8080端口,前端打包集成在SpringBoot静态资源目录,数据库为MySQL5.7

第3个"项目难点"是最值得认真准备的,我的回答围绕"申请、审批、派车、还车"这个多步状态流转展开,说明每个步骤怎么保证数据一致性,比如审批通过后才能派车、派车后车辆状态才能变更等。这个回答让评委觉得业务逻辑不是想当然写的,而是经过了设计。

6.3 演示环节的操作顺序

答辩演示不要一上来就乱点,我建议按这个顺序走流程,方便老师理解也方便你讲解:

  1. 登录页展示验证码和登录逻辑。
  2. 以超管身份登录,展示首页统计图表和整体菜单结构。
  3. 进入用户管理,演示新增一个"员工"账号。
  4. 切换到员工账号,提交一条用车申请。
  5. 切换回车管员账号,审批这条申请,然后执行派车。
  6. 查看车辆状态变化和统计数据更新。
  7. 回到超管账号,演示删除被审批的申请,展示权限不足提示。

这个流程走下来大约10分钟,覆盖了系统的所有核心业务。我事先录了一个屏幕录像备用,万一现场网络或环境出问题,也不会傻眼。

6.4 关于部署文档的写作建议

部署文档看起来不起眼,但它是给导师和评委的第一印象。我写部署文档时遵循一个原则:假设读者是一名只有基础Java知识的大三学生,每一步都要能复现。

文档内容包括:

  • 环境准备:JDK8安装、Maven安装、Node16安装、MySQL5.7安装,每个都有官网下载地址和安装截图。
  • 数据库初始化:创建数据库、导入SQL脚本、修改root密码。
  • 后端启动:用Idea导入后端工程、修改application.yml连接信息、运行主类。
  • 前端启动:安装依赖npm install、启动开发服务器npm run serve。
  • 访问地址:前端 http://localhost:8081,后端 http://localhost:8080。
  • 常见问题:端口冲突、数据库连接失败、前端依赖安装慢。

文档写完后自己按步骤从头到尾走一遍,如果能一次跑通,说明文档合格。我实际走了三遍才稳定,期间发现漏了两处细节:一处是忘记写修改root密码的命令,另一处是JDK版本没写清楚导致同学装了JDK17后项目编译报错。这两处修正后,朋友们照着文档基本都能一次成功。

最后分享一点我个人实操中的体会

做完这个毕设,我最大的收获不是背熟了SpringBoot和Vue的API,而是学会了一条独立解决问题的完整路径:遇到报错先确认环境版本,再看数据库连接,最后查业务代码和日志。这套排查逻辑放到任何项目里都通用。

另外想专门提醒一句:项目里所有的账号密码都不要写死在代码里,虽然毕设没有安全评审,但把数据库密码配置在application.yml并通过.gitignore排除提交,是一个职业习惯。答辩时如果老师问到安全相关的问题,你能回答出"密码加密存储、接口权限校验、操作日志审计"这几个点,印象分会好很多。

如果时间充裕,可以在派车模块中进一步引入地理坐标概念,演示在地图上展示车辆位置,或者把静态报表升级为大屏数据可视化,这些扩展方向都能成为论文的加分项。我当时因为时间不够没有做,只保留了这个扩展点,希望你们有机会补上。只要把主干流程做扎实,配置好部署文档,答辩时从容演示,这套毕设就已经足够优秀了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询