ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SpringBoot+Vue车辆管理系统:从环境搭建到前后端分离实战

SpringBoot+Vue车辆管理系统:从环境搭建到前后端分离实战 1. 引子这套车辆管理系统到底能帮你什么如果你正在为毕设、课设或者前后端分离的练手项目发愁我想这个基于 SpringBoot Vue 的车辆管理系统可能会帮到你。后端用 Java SpringBoot MySQL前端用 Vue Element UI是一套非常经典的全栈实战项目。它的代码层面覆盖了登录鉴权、权限控制、车辆信息管理、司机管理、用车申请、审批流程、数据看板等完整业务闭环基本能让你把一个真实业务系统从零到一的链路走通。先说适合谁。如果你是准备做毕业设计的学生这套代码可以帮你省掉大量从无到有的摸索时间把精力放在“理解业务流程”和“写论文讲清楚设计”上。如果你是刚学完 SSM 或者 SpringBoot 基础、想趁热打铁做一个完整项目验证自己能力的学习者这套系统的模块划分足够清晰跟着走一遍等于把前后端联调、接口设计、权限模型这几块硬骨头都啃了一遍。我之前帮好几个学弟学妹做过类似的课设指导发现大家最容易卡住的地方反而不是业务代码而是环境配置和前后端联调。有一些人花了两三天都启动不了项目原因就是端口冲突、MySQL 版本过高导致驱动配置失效或者是 Node 版本太新导致 Vue 依赖安装失败。所以这篇文章我不打算只做功能的罗列而是把我在实际运行这套系统时踩过的坑、验证过的步骤以及排查思路一并写出来。你可以把它当成一份完整的项目复现笔记来用。2. 系统整体设计与技术选型分析2.1 为什么是 SpringBoot Vue 这套组合现在 Java 相关的 Web 项目最主流的组合基本就是 SpringBoot 做后端接口Vue 做前端页面。这套组合实际上已经成了行业里 Java 全栈开发的事实标准。从后端角度看SpringBoot 最大的优势是“约定大于配置”。它内置 Tomcat不需要额外部署独立的 Servlet 容器也不再需要写大量 XML 配置。你只需要一个类加几个注解就能启动一个 Web 应用。传统的 SSMSpring SpringMVC MyBatis项目需要手动配置数据源、事务管理器、视图解析器哪怕一个小项目也要来回调半天。而 SpringBoot 的自动配置机制把这些繁琐的工作都接手了对课设和毕设来说省下的时间非常可观。从前端角度看Vue 的核心思路是组件化和数据驱动。传统的页面开发要手动操作 DOM数据变了还要自己同步更新页面逻辑一多就乱。Vue 的响应式系统解决了这个问题——你只需要维护数据状态页面会自动跟着变化。再加上 Element UI 这套现成的组件库表格、表单、弹窗、消息提示全部都有现成组件视觉上不会太“简陋”对课设来说也是一个加分项。我个人的看法是这套技术栈对学习和毕业设计的意义不只是“能跑”而是它贴近企业真实开发模式。现在绝大多数中小型互联网公司的内部管理系统都是这种前后端分离的架构。你做一次这样的项目等于提前熟悉了未来工作里天天要用的协作方式。2.2 核心功能模块拆解这个车辆管理系统不是简单的一张车辆增删改查的表。它把整个用车流程串起来了我大致拆成这样几个模块登录与用户管理支持登录、退出、用户信息的增删改查还做了角色区分。系统权限控制管理员、普通用户等不同角色能看到的菜单和能操作的按钮不一样背后用的是权限控制。车辆信息管理车辆的品牌、型号、车牌号、状态空闲、使用中、维修中都由这个模块维护。司机信息管理维护司机的基本档案、联系方式、驾驶证信息等。用车申请管理用户提交用车申请填写用车时间、目的地、事由等然后由有权限的人审批。审批管理审批通过后车辆状态会被占用归还后重新变为空闲。数据统计看板用图表展示车辆使用率、申请数量一类的统计数据这部分一般是加分项但实现起来也不复杂。为什么说这套系统的模块划分值得学习因为它涵盖了管理系统中最高频的一套模式——单表 CRUD 主子表关联 审批流状态流转。你之后不论换什么业务场景比如会议室预约、设备借用、任务派发核心骨架都和这个差不多。把这一套吃透你的能力迁移会非常快。2.3 为什么选 MySQL 而不是其他数据库数据存储用的 MySQL这也是实际开发中最常见的组合。MySQL 免费、稳定、资料多对毕设和课设来说完全够用。虽然近年来 PostgreSQL 热度很高但考虑到中文资料、工具链、面试中出现的频率MySQL 目前依然是 Java 技术栈中最稳妥的选择。需要注意的一个问题是 MySQL 版本。之前帮别人排查环境时就遇到过 MySQL 8.x 和旧版驱动配置的兼容性问题。如果你用的是 MySQL 8.xapplication.yml里的驱动名要写com.mysql.cj.jdbc.Driver而不是最早的com.mysql.jdbc.Driver。同时 URL 里建议加上serverTimezoneAsia/Shanghai和useSSLfalse。否则会报时区错误或者 SSL 连接错误这两个坑出现的频率非常高。3. 开发环境准备与项目启动流程3.1 环境版本建议在开始之前先把环境装好。这套系统实测下来比较稳定的版本组合是组件推荐版本备注JDK1.8 或 8u201不要用太高版本尤其避免直接用 JDK17 跑老项目Maven3.6.x3.8 也能用但仓库镜像建议配置阿里云MySQL5.7 或 8.0如果你用的是 8.0注意驱动和时区配置Node.js14.x 或 16.x不要太新Vue2 项目对 Node18 兼容性出过问题npm / cnpm建议用 cnpm 或 pnpm国内网络环境下 npm 装 Vue 依赖很慢甚至会失败IDEIDEA 2021社区版或专业版都可以专业版对 Spring 的调试更方便这里我特别想强调一下 Node 版本的问题。Vue2 项目在 Node 17 以上版本运行npm install时经常会出现opensslErrorStack: [error:03000086:digital envelope routines::initialization error]这样的报错。这个错误的原因是 OpenSSL 的版本更新导致的哈希算法兼容问题。如果你非要在这个 Node 版本下安装和运行可以在package.json的 scripts 里加一句dev: set NODE_OPTIONS--openssl-legacy-provider vue-cli-service serveWindows 下。但更省心的做法是直接装一个 Node 14一步到位。3.2 数据库初始化操作项目里一般会带 SQL 脚本文件建议用 Navicat 或者其他数据库客户端导入。步骤是新建一个数据库字符集选utf8mb4排序规则选utf8mb4_general_ci然后执行项目里的.sql脚本。我有一次给学弟远程排查发现导入之后登录一直报用户名或密码错误后来查了半天原来是 SQL 脚本里带的管理员账号密码是经过 MD5 加密存储的。所以如果你改了 SQL 里的密码字段前端页面登录时也要确认后端登录逻辑是按照同样的加密方式去校验的。这类问题不会报语法错误排查起来特别隐蔽。再说一个小习惯导入脚本之后建议先查一下核心表的数据是否完整比如用户表里有没有管理员角色表和管理员是否关联上。很多项目启动时报空指针其实不是代码问题而是初始化数据不完整导致的。3.3 后端启动步骤后端的启动流程我用下来基本是三步走。第一步确认本地 Maven 环境没问题。在 IDEA 里打开项目的pom.xml等 Maven 把依赖都下载完。这一步在国内网络环境可能会等很久建议在 Maven 的settings.xml里配置阿里云镜像。配置方法很简单在mirrors标签里加一段mirror idaliyun/id mirrorOfcentral/mirrorOf nameAliyun Maven Mirror/name urlhttps://maven.aliyun.com/repository/public/url /mirror第二步修改application.yml或application-dev.yml。重点看三块数据源的 URL、用户名、密码是否正确端口号是否被占用默认一般是8080MyBatis 的 mapper 路径是否扫描到了。第三步直接运行启动类看到 SpringBoot 的日志里出现 “Started Application” 字样就说明后端起来了。在这个过程中最容易出现的问题就是端口被占用。我之前有个同学电脑上跑着两个项目端口冲突后报APPLICATION FAILED TO START他当时看报错信息非常长完全慌了。其实解决办法很简单——要么关掉占用端口的进程要么改server.port。3.4 前端启动步骤前端部分是这样的用 IDEA 或者 VS Code 打开前端目录在终端执行npm install安装依赖。这一步如果卡住大概率是网络源的问题。可以执行npm config set registry https://registry.npmmirror.com这样就把 npm 源换成了国内镜像。然后重新执行npm install。依赖装好后运行npm run serve本地开发服务器默认跑在8080端口但很多情况下后端已经占用了 8080所以前端会提示你选另一个端口比如8081。如果你看到前端自动跳转到 8081 且能够打开登录页那就说明前端服务正常了。前后端联调的配置一般写在vue.config.js里通过 proxy 把请求转发到后端地址。比如devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这意味着前端发的/api开头请求会被代理到后端的8080端口。如果你自己改动过端口或后端路径前缀这个配置也要对应调整不然后端接口永远连不上。4. 核心业务与代码实现思路4.1 后端的分层结构与关键注解这套系统的后端代码结构上比较清晰基本遵循了经典的三层架构Controller 接收请求Service 处理业务逻辑Mapper 做数据持久化。除此之外还有 entity 实体类、dto 传输对象、common 公共类等。在我看过的许多课设项目里这样分层已经算很规范的了。举个例子一个车辆列表查询的流程是这样的前端调用/car/list接口Controller 接收带有分页参数和查询条件的请求把参数包装后交给 Service 层Service 层调用 Mapper 接口Mapper 在 XML 文件里写具体的 SQL 查询最后结果返回给前端。整个链路职责清楚改一个环节不会牵动其他层。这也是为什么我建议做毕设的同学一定不要嫌分层麻烦把代码全部压在一个类里。虽然跑起来是一样的但写论文的时候你会非常痛苦因为你自己都说不清模块之间的调用关系。Controller 关键注解就是RestController、RequestMapping、GetMapping/PostMapping这几个。特别注意RestController是Controller和ResponseBody的组合返回的数据会直接序列化为 JSON这也是前后端分离项目的基础。4.2 登录认证与权限控制是怎么实现的登录这部分我看到的有两种常见实现一种是基于 Session一种是基于 JWT。这套系统用的是 JWTJSON Web Token的方式也是现在比较主流的方案。JWT 的基本流程是这样的前端用户输入用户名密码登录接口校验通过。后端生成一个加密的 Token 字符串里面包含用户 ID、用户名、过期时间等信息返回给前端。前端把 Token 存到本地一般是 localStorage 或者 sessionStorage。之后前端每次发请求都在请求头里带上Authorization: Bearer token。后端用一个拦截器或者过滤器统一校验这个 Token校验通过才放行。如果过期了或者被篡改就直接返回 401提示登录过期。在代码里你会看到一个JwtUtil或者类似命名的工具类里面有生成 Token 和解析 Token 的方法。基于 JWT 的登录方案在前后端分离环境下比 Session 更好用因为后端不需要保存用户的登录状态服务器重启也不影响已有 Token 的可用性。对课设答辩来说这也好讲——一张图就能把流程画清楚比“服务端保存了登录状态”这种话更有说服力。权限控制则是配合拦截器做的有些功能只有管理员能访问普通用户访问会提示没有权限。这块建议你在部署完源码之后自己用两个不同角色的账号登录试一遍对理解权限模型很有帮助。4.3 车辆管理的核心 CRUD 接口车辆信息管理的本质是对一张表的增删改查。别小看这几个接口加了分页、条件查询、状态校验之后就复杂了一些。我挑几个容易忽略的点说一说。第一个是分页查询。后端通常会封装一个分页请求对象包含当前页码pageNum每页条数pageSize以及多个查询条件比如车牌号模糊查询、车辆状态精确查询。MyBatis 的 PageHelper 插件是这里最常用的工具它能拦截 SQL在原有查询语句后面自动拼上 LIMIT 语句不需要你手写麻烦的分页 SQL。用起来就是PageHelper.startPage(pageNum, pageSize); ListCar cars carMapper.selectByCondition(condition); PageInfoCar pageInfo new PageInfo(cars);需要注意的坑是用了PageHelper.startPage之后必须在下一条查询语句之前生效而且只能用一次。假如你在调用查询之前又执行了别的数据库操作分页效果可能就串到别的 SQL 上去了导致数据异常这类 bug 不好查只能靠对插件机制的理解。第二个是逻辑删除。很多管理系统都不直接物理删除车辆数据而是加一个deleted字段查询的时候默认带上deleted 0的条件。这样做的好处是误删时可以恢复数据数据也更有追溯价值。你在代码里看到删除接口并没有执行真正意义上的DELETE而是执行UPDATE就是这个原因。第三个是状态校验。一辆正在使用中的车不应该被删除或分配给其他人所以在删除接口里要先判断车辆状态。这类“先检查再操作”的逻辑几乎在所有业务里都能用到。做课设时养成这个习惯代码会严谨很多。4.4 前端页面与交互实现前端部分核心的目录结构是views放页面组件router放路由配置api放接口请求方法components放公共组件。页面这块做得比较典型的是登录页、首页数据看板和车辆信息管理页。拿车辆信息管理页来说页面上方是搜索表单区中间是表格区右下角有分页器行内操作包含编辑和删除按钮。点击新增或编辑时弹出一个表单弹窗提交时把数据传到后端接口。前端有几个细节值得你留意。第一个是路由守卫。在router/index.js里通常会配置beforeEach钩子判断用户是否已经登录。没登录的话跳转到登录页登录了才能访问其他页面。这个逻辑是所有管理系统都需要的你必须理解它为什么存在——不然你会发现直接在前端删掉登录页就能绕过认证这对系统来说是不可接受的漏洞。第二个是 Axios 请求封装。项目里一般会把 axios 实例单独抽取出来集中设置超时时间、请求头、拦截器。响应拦截器里会统一处理后端返回的状态码比如 200 是成功401 是登录失效统一跳回登录页。这样页面里就不用每个请求都写一遍错误处理了。第三个就是组件的双向绑定和数据刷新逻辑。页面删除一条数据之后要重新调用查询接口刷新表格不能只在页面上手动把这一行删了否则刷新页面后数据又会出现。很多新手写前端都会在这里栽跟头。还有一个值得加分的可视化看板通常用 ECharts 来实现。后端只需要提供一个统计接口返回比如“每个月份用车申请数量”、“各状态车辆分布”这样的聚合数据前端用 ECharts 的图表组件渲染成折线图或者饼图。答辩时打开这个页面比单纯怼着一张数据表有说服力得多。5. 常见问题与排查技巧全记录5.1 项目启动时报错速查表我整理了平时帮人排查时遇到最高频的几个报错你可以直接当速查表用现象可能原因解决办法后端启动时报APPLICATION FAILED TO START端口被占用换端口或找到占用进程并结束启动时报数据库连接失败数据源配置错误、MySQL 没启动、密码不对检查application.yml的 URL、用户名、密码报 SSL 连接错误没禁用 SSL 或时区未设置URL 加useSSLfalseserverTimezoneAsia/Shanghai前端npm install卡着不动npm 源访问慢换 npm 镜像源前端安装依赖报 OpenSSL 错误Node 版本太新用 Node 14或者设置NODE_OPTIONS--openssl-legacy-provider登录后接口返回 401Token 过期或没传请求头登录后看是否有缓存 Token请求头样式是否正确页面能开但接口 404前后端口或路径不一致检查vue.config.js里的代理配置5.2 登录不了的排查思路如果出现登录不上的情况不要急着改代码按这个顺序排查效率最高。第一步打开浏览器 F12看 Network 里登录接口到底有没有请求发出去。如果根本没有这个请求问题大概率出在前端 Axios 封装或者跨域配置上。第二步看后端控制台是否有日志输出。如果后端没有任何日志说明请求没到后端问题还是在前端转发环节如果后端有日志但返回的是 500那就是 SQL 或业务逻辑出了问题。第三步检查数据库里的用户数据是否正确。确认用户名密码没错、用户状态是正常的密码字段的加密方式和后端校验方式一致。说句实在话这套系统我调试过之后最大的体会是很多问题不是代码问题而是环境差异导致的。你在本地跑同一个项目和在某云服务器上跑中间可能隔了 JDK 版本、MySQL 版本、Node 版本、甚至防火墙这些无数个变量。另外还要提醒一点mysql 的 ssl 连接错误出现的频率非常高。尤其是 MySQL 8.0 默认开启了 SSL但我们的本地开发环境根本用不上。如果你在控制台看到类似Communications link failure或者 SSL 相关的报错直接在连接 URL 后面加上useSSLfalse就是最快的解决方案。5.3 几个独家避坑技巧这里的经验应该不算常见文档里会写的属于我实际操作中积累的私货。第一个改代码之前先备份一个能跑的版本。我见过太多人改代码改到项目启动不了然后忘记了原来能跑的状态。建议在项目完全跑通之后先用压缩包存一个“baseline”之后不管怎么实验随时能退回去。第二个是确认数据库表结构的时候多留意一下字段类型。比如日期字段用的是datetime还是timestamp这个影响前端显示格式。很多同学做到最后发现日期时间不对大概率是时区的问题和数据库存放的形式有关。统一在 URL 里配置时区能解决大部分问题。第三个是善用 IDEA 的断点调试。以前有个学妹问我页面没报错但表格数据一直是空的怎么排查我让她在后端查询接口的第一行打个断点然后刷新页面。结果一跑发现请求根本没进入这个方法说明前端连后端接口都没打通。断点调试这个能力真的非常值得提前练起来比到处输出日志打印要高效得多。第四个是前端控制台报错信息不要只看第一行。浏览器控制台的报错往往是一大段关键信息在堆栈的前几行。比如Cannot read property xxx of undefined重点看是哪个变量导致的。第五个小技巧如果你用的是 IDEA安装一个叫 Lombok 的插件能让后端实体类不用写一堆 getter/setter 方法代码整洁很多。很多毕设项目都用了 Lombok不装插件编译也能过因为 Maven 编译期会处理但 IDEA 的代码提示和语法检查可能会异常经常莫名其妙显示红叉。解决方式就是装上插件并启用注解处理器。6. 这套系统还能怎么扩展聊完基础运行我想说说更远一点的事。这套系统的价值不止于“跑起来交差”你可以基于它做很多个性化的扩展让它成为你简历上或者答辩时能拿得出手的项目。最简单的扩展方向是在现有模块上增加导出功能。比如车辆列表可以导出为 Excel 文件。实现方式有两大类一是用 Apache POI 直接在 Java 层生成 Excel二是前端用xlsx等库把当前表格的数据导出。建议做后端导出这样即使用户查询条件复杂、数据量大也能导出完整结果更符合实际业务。稍微复杂一点的是给车辆增加一个小程序端或者移动端页面。比如普通用户在小程序里提交用车申请管理员在后台审批。这基本不需要改动后端核心逻辑只要复用接口换个前端壳就行。对毕设来说这算一个不错的加分亮点。再高级一些可以给系统接入 Redis 做数据缓存。比如用车申请的审批记录、车辆状态这种不经常变化的数据第一次查询后放进缓存第二次查询直接走缓存减少数据库压力。答辩时讲这个设计比“用了前后端分离”更能体现你的架构意识。你可以根据自己的情况选一个方向深入。不要试图把所有扩展都做完把其中一个做扎实比每个功能都零散地接触一点收获会大得多。我在帮人看过不少课设项目之后最大的感受是做项目最忌讳贪多嚼不烂。与其部署了一个超大型的商城系统但讲不清楚里面的逻辑不如把一个车辆管理系统每一个表、每一个接口、每一个按钮背后的设计意图都吃得透透的。面试官和答辩老师其实不在乎你用了多少技术他们在乎的是你能不能把一个系统的闭环说清楚能不能对常见问题给出合理的解决思路。这套 SpringBoot Vue 的车辆管理系统最大的优点就是它足够完整也足够简单。还不太懂的东西拆开源码一行行看不会太难已经懂的东西还能在现有基础上按照自己的想法修改完善。如果你想找一套既能应付毕设课设、又能真正学到东西的源码这套很值得下功夫研究。
返回列表