如果你正在为毕业设计头疼,八成绕不开“基于SpringBoot + Vue的毕业生就业信息管理系统”这个选题。这个题目看起来满大街都是,但它能一直火不是没道理:开发量适中,业务贴近校园场景,前后端分离能展示的东西足够多,答辩时老师也不会问出超过你能力范围的问题。我手上跑的这套源码压缩包编号是08719,趁着最近重刷了一遍,把从解压到跑通、从补业务到写文档的全过程整理成一篇经验贴,希望能帮正在做同类毕设的同学少走弯路。
先说结论:这类项目真正的难点不在编码,而在“你能不能把别人的源码讲成自己的设计”。如果你只是把源码跑起来然后抄个说明书,答辩很容易被问穿。所以这篇文章除了讲SpringBoot、Vue怎么整合,也会重点说哪些点最容易被追问、哪些坑是网上教程不会告诉你的。
1. 项目整体拆解:这个毕设到底在做什么
1.1 为什么“就业信息管理系统”是计算机毕设的常青树
我做过几个不同方向的毕设辅导,发现“毕业生就业信息管理系统”这个选题几乎每个学校计算机学院都能看到。原因很简单:它的业务边界非常清晰,不需要接硬件,不需要搞算法,也碰不到复杂的并发场景,但又能把数据库设计、接口开发、前端交互、权限管理等本科阶段该展示的知识点全串起来。
往深一层说,这个系统解决的问题非常真实。每年毕业季,辅导员要统计学生就业去向,学生要到处找企业招聘信息,企业又要通过学校发布岗位。传统的做法是Excel汇总、微信群转发,数据容易乱,统计更是麻烦。把学生、企业、岗位、简历投递、签约状态都放到一个Web系统里,就是一个典型的“信息管理+流程审批”需求。这种需求在答辩时特别好讲故事,老师一听就明白你在解决什么。
另外,从工作量角度看,这个题目也很适合一个人完成。三到四个月时间,用SpringBoot做后端、Vue做前端,数据表控制在8到10张,接口控制在30个左右,既能体现工作量,又不会拖到来不及写论文。要是选个“基于神经网络的就业预测系统”,光是算法模型就够你熬几个通宵,反而没必要。
1.2 SpringBoot + Vue为什么成了毕设标配技术栈
现在很多计算机毕设题目直接把“SpringBoot + Vue”写进标题,已经快成了默认组合。我对比过SSM(Spring+SpringMVC+MyBatis)、JSP+Servlet这些老方案,也试过纯模板渲染,最后发现SpringBoot+Vue确实是目前最稳的选择。
SpringBoot最大的价值在于把大量繁琐的配置自动化了。以前写SSM要配一堆XML文件,数据源、事务、扫描路径一个漏掉就启动报错;SpringBoot内嵌了Tomcat,一个main方法就能把服务跑起来,配置集中在一个application.yml里,写起来舒服得多。对毕设来说,省下来的时间可以拿去做业务功能。
Vue这边的好处是组件化开发。页面拆成头部、导航、表单、表格、弹窗这些组件后,写起来思路很清晰。再加上Element UI这种现成的组件库,不需要自己一点一点调CSS,页面也能做得很像样。前后端分离之后,你用Postman单独测接口、前端单独调样式,两边互不干扰,联调时思路也清楚。
我把常见的技术方案放一起对比过,方便你判断自己该不该换:
| 方案 | 开发速度 | 学习成本 | 答辩观感 | 就业市场匹配度 |
|---|---|---|---|---|
| JSP + Servlet + Jdbc | 慢,大量手写循环拼接 | 低 | 看着像课设 | 基本被淘汰 |
| SSM + JSP | 中等,XML配置麻烦 | 中 | 偏传统 | 还有少量老项目用 |
| SpringBoot + Vue | 快,前后端分离清晰 | 中 | 符合当前主流 | 招聘需求很大 |
| 微服务 + 分布式 | 很快?不,反而慢 | 高 | 易翻车 | 硕士或工作经验更合适 |
所以我的建议很简单:如果你不是被导师指定了SSM,直接选SpringBoot+Vue,别犹豫。
1.3 我从源码里梳理出的核心功能边界
拿到“08719”这套压缩包之后,第一步不是急着跑,而是先看它的目录结构。我解压后发现整个项目分三块:backend(SpringBoot后端)、frontend(Vue前端)、sql(数据库初始化脚本)。数据库脚本里一共建了8张表,功能上对应三个角色。
学生端主要做这几件事:维护个人基本信息,上传/更新简历,浏览企业发布的岗位,投递简历,查看投递后的状态变化,比如“已查看”“面试通知”“已录用”,最后确认签约信息。企业端可以注册并维护公司资料,发布岗位、下线岗位,查看收到的简历,把学生标记为通过或不通过。管理员端则负责所有用户的审核、公告发布、就业数据统计,还有整个系统的参数维护。
这个边界很完整,每一块都能对应到至少一个接口和一张表。后面我会按后端、前端、联调、论文四个维度展开,把每一块具体怎么实现、怎么讲清楚都写出来。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 后端设计与SpringBoot落地要点
2.1 数据库设计:八张表如何支撑完整业务
毕设答辩老师最先爱问的就是“你的数据表怎么设计的”。这是整个系统的地基,表设计不好,后续接口全是补丁。我这里基于源码里的SQL脚本梳理出最核心的几个表,你也可以按这个思路重新建表。
第一张是用户表sys_user,这是所有登录账号的公共表。字段包括id、username、password、role、status、create_time。role用来区分学生、企业还是管理员。密码不要存明文,用BCrypt加密,这个点很加分。status字段用来做账号禁用,比如学生毕业离校、企业被管理员封禁,不用删数据,只需要改状态。
第二张是学生档案表student_info,通过user_id和sys_user关联。建议字段有student_no(学号)、name、gender、major、grade、phone、email、resume_url。resume_url建议存文件路径的字符串,而不是把文件直接塞进数据库,这样后面扩展OSS或者本地文件服务都方便。
第三张是企业信息表enterprise_info,也是通过user_id关联到sys_user。字段我建议包含company_name、industry、scale、address、contact_name、contact_phone、license_code。答辩时如果老师问为什么要和企业用户分成两张表,你可以说:用户表只管登录和权限,业务资料单独放,避免一张表字段过多,也方便企业提供资质时做审核流程。
第四张是岗位表job_position,字段包括id、company_id、title、category、description、salary_min、salary_max、city、status、create_time。岗位表要记得加一个status,用于上下架,而不是物理删除。第五张是投递记录表application_record,包含student_id、job_id、status、apply_time。status可以用0、1、2、3代表待查看、已查看、已面试、已录用,也可以用字符串,但建议用数字加一个注释,答辩时能讲清楚扩展性。
如果要做签约管理、就业统计、公告通知,再单独加contract_info、notice、sys_dict这种辅助表。整个库表设计的关键就一句话:尽量用状态字段做软删除,别直接删物理记录,这样统计数据的时候才不会出现数据对不上的尴尬。
2.2 后端接口如何划分才显得专业
一个让答辩老师印象深刻的SpringBoot项目,接口一定是按资源划分的,而不是按页面功能硬写。比如登录就是/auth/login,用户信息就是/user/info,岗位列表就是/job/page,投递就是/application/send。源码里基本也是这个套路,我看到后端Controller明显按照角色和资源做了分组。
登录认证部分,源码里用的是JWT。流程是前端提交用户名密码,后端校验通过后返回一个token,之后前端每次请求都在Header里带上Authorization,后端通过拦截器解析token,从token里取出userId,然后再去查具体是什么角色。这里有个很容易被问到的问题:为什么不用session?我的回答思路是前后端分离下后端服务无状态更好扩展,之后如果部署多份实例,也不用考虑session共享的问题。
除了登录,接口返回结构也很重要。源码里统一封装了Result对象,包含code、message、data三个字段。这样做的好处是前端axios拦截器拿到code后可以直接判断业务状态,不用每次硬抠HTTP状态码。查原码时还注意到分页接口统一返回了PageResult,里面包含total和records,前端表格分页直接渲染。
建议你在答辩前把下面几张典型接口表背熟:
| 模块 | 请求方式 | 接口路径 | 说明 |
|---|---|---|---|
| 认证 | POST | /api/auth/login | 登录,返回JWT |
| 用户 | GET | /api/user/info | 根据token获取当前用户信息 |
| 岗位 | GET | /api/job/page | 分页查询岗位 |
| 岗位 | POST | /api/job/save | 企业发布或编辑岗位 |
| 投递 | POST | /api/application/send | 学生投递简历 |
| 统计 | GET | /api/stats/employment | 管理员查看就业率统计 |
后端设计要突出的核心点是:接口路径语义化、统一返回结构、JWT鉴权。有这三点,哪怕功能简单,听起来也像正规项目。
2.3 SpringBoot开发中最容易翻车的三个细节
第一坑就是springboot版本选择。很多人现在是直接去官网生成最新的3.x版本,但拿到的毕设源码往往是基于2.5或2.7写的,硬跑起来会连环报错。springboot版本太高带来的最典型问题是包名变了,老代码里的javax.*包在3.x中改成了jakarta.*,数据库驱动、MyBatis插件、Swagger这些框架也跟着变。我的建议是老老实实用2.7.x版本,JDK用8或11,等跑通之后再考虑升级。
第二坑是Spring Data JPA和MyBatis-Plus尽量不要混用。源码里如果用的是MyBatis-Plus,就全项目统一用它,不要在一个方法里又写JpaRepository又写BaseMapper。混用会导致事务管理和SQL日志排查都很乱,而且答辩时老师一旦问两种框架的区别,你很难三句话说清楚。选定一种,全部用注解SQL或者Wrapper查询,代码干净。
第三坑是全局异常处理和事务控制。很多毕设源码只在Service里简单加@Transactional,但没配@RestControllerAdvice做统一异常返回。这样一旦SQL出错,前端会直接收到一坨看不懂的500错误页面。加上全局异常处理之后,至少能统一返回“系统繁忙,请稍后重试”。这里有个加分操作:在投递简历、企业修改岗位状态这种涉及多表更新的方法上,写上@Transactional(rollbackFor = Exception.class),并解释“保证操作要么全成功要么全回滚”。
另外提醒一句,如果源码里用了Swagger做接口文档,在SpringBoot 2.6以上版本要主动设置spring.mvc.pathmatch.matching-strategy=ant_path_matcher,否则启动时会报Springfox的路径匹配错误。这类问题网上搜“springboot版本太高”能搜到一堆解决方案,别慌,基本都是配置层面的问题。
3. 前端Vue:页面不翻车,先从环境配置开始
3.1 拿到前端项目先确认Vue版本,别急着升级
很多毕设拿到手之后第一反应就是npm install,结果装了一堆依赖后启动报错,最后发现是Vue版本和Node版本不匹配。这类项目绝大多数是Vue2,配合Element UI使用。你最好先打开package.json看一下,里面写着"vue": "^2.6.14"就是Vue2,写着"vue": "^3.2.x"才是Vue3。
为什么强调版本?因为Vue2和Vue3的API有区别,比如Vue2用Vue.use(ElementUI),Vue3用app.use(ElementPlus);Vue2的项目里一般会看到Vue.prototype.$http这种写法,Vue3里就没有了。如果你把老项目的Vue从2强行升到3,路由、自定义指令、插槽写法全要改,工作量比写新页面还大。
vue安装及环境配置这一块,最容易卡住的就是node-sass。老项目经常依赖node-sass,而这个包在Node版本过高时编译失败,报错一大片C++编译错误。我的处理办法很简单:去package.json里搜索sass相关依赖,如果有node-sass,把它改成sass或者直接删除再用npm install重装,因为现在Element UI的样式并不依赖node-sass,普通sass足够。
Node版本也要注意。我实测下来,Vue2的老项目在Node 16环境下最稳,Node 18有时候会因为OpenSSL问题报ERR_OSSL_EVP_UNSUPPORTED。碰到这个错误,不是项目代码问题,是Node版本太高,最简单的办法是下载Node 16重装,或者用nvm切换版本,千万不要去改webpack配置逃避。
3.2 Vue Router和菜单设计:答辩护体关键
页面结构上,正常这类系统有三个入口:学生端、企业端、管理员端。源码里通常在路由表上就做了区分,比如/student下面嵌套学生相关页面,/company下面嵌套企业页面,/admin下面嵌套后台管理页面。用到的嵌套路由可以简单理解成:父级组件放一个Layout壳,里面包含左侧菜单和顶部导航,子页面通过router-view渲染到内容和状态位。
如果你想让答辩更稳,建议把路由守卫的拦截逻辑搞清楚并写在demo里。核心代码大概是:
javascript复制router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token')
if (to.path !== '/login' && !token) {
next('/login')
} else {
next()
}
})
这段的意思是:没有token就无法访问任何业务页面,强制跳回登录页。这也是和JWT后端鉴权配合使用的标准写法。真要提升一点,可以加上角色校验,比如管理员才能进/admin,否则跳到403页面。但要注意别写得太复杂,毕设阶段只需要守住“未登录不能进”这一条就够了。
另外,vue插槽在表格组件里也会用到。比如Element UI的el-table-column中使用slot-scope取当前行数据,然后在操作列放“详情”“删除”按钮。这个点被老师问到时,你可以回答:插槽允许父组件向子组件传入自定义内容,这样表格列可以灵活定制。会举这个例子就够用了。
3.3 axios请求封装和本地代理配置
前端所有请求最好都走一个封装好的request模块,而不是每个页面直接axios.get。源码里基本会在src/utils/request.js里创建一个axios实例,设置baseURL: '/api',同时加上请求拦截器和响应拦截器。
请求拦截器的作用是自动从localStorage里取出token塞进请求头,这样你每个页面调接口时不用手动带token。响应拦截器则统一处理后端返回的code,比如code === 401时自动跳回登录页,code !== 200时弹错误提示。这个设计一定要看明白,答辩时经常被问“如果token过期了会怎样”。答案就是401被拦截,清掉本地token,跳转登录页。
本地开发还有一个跨域问题。后端跑在8080,前端跑在8081,直接从前端页面调接口会被浏览器拦截。最好的方式不是在后端每写一个CORS注解,而是在前端的vue.config.js里配置代理:
javascript复制module.exports = {
devServer: {
port: 8081,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
}
这样前端请求/api/auth/login时,开发服务器会把它转发到后端的/api/auth/login,浏览器只看到同源请求,就不会有跨域报错。后端也需要把context-path设置成根路径,或者在项目里配置一个CorsFilter做兜底。关于跨域的解决方式,至少能讲出代理和CORS过滤器两种,答辩基本就过了。
3.4 别被视频播放、低代码这些热词带偏
最近网上热词里总有人问vue播放m3u8、低代码平台之类的内容。我的建议是:毕设阶段老老实实做核心CRUD,不要为了炫技去加企业宣传视频功能。原因很简单,视频播放涉及流媒体协议、鉴权、转码,一旦出了兼容性问题会浪费大量时间。
如果你真的收到导师硬性要求“在企业详情页展示公司宣传视频”,最简单的做法是前端用hls.js播放m3u8,后端只需要提供一个视频文件地址,不要自己做转码。但说实话,就业信息系统的核心价值是数据而不是视频,宁可把这个时间花在就业统计图表上,性价比高得多。
4. 实操过程:源码到可演示系统,一步步跑起来
4.1 解压源码后的第一件事:盘点项目结构
很多同学拿到压缩包直接双击运行,结果当然是各种报错。我建议按下面这个顺序来:
第一步,解压到一个没有中文和空格的目录下,比如D:\project\graduate。很多人不重视这一点,其实路径里有中文会导致Maven和Node的工具链出现稀奇古怪的编码错误。
第二步,打开目录,确认三个子模块。backend目录里应该有pom.xml,frontend目录里应该有package.json,sql目录里应该有.sql脚本。没有SQL脚本的源码要谨慎,数据库表结构都得自己猜,工作量很大。
第三步,先不要碰前端,先导入SQL脚本。我习惯用Navicat或者MySQL Workbench,先建一个名为graduate_employment的数据库,字符集选utf8mb4,然后执行SQL文件。
第四步,检查后端配置文件application.yml,把数据库地址、账号、密码改成自己本地的,然后启动SpringBoot。看到Tomcat started后,用Postman测一下登录接口,确认能返回token再开始弄前端。
整个过程看起来简单,但很多人会栽在数据库密码上。源码里默认密码经常是root/123456,如果你本地不是这个形式,连不上的报错会让人误以为是代码问题。
4.2 后端启动时常见的配置细节
后端配置文件启动前要重点核对三块内容。第一块是数据源配置,我提供一个比较标准的示例:
yaml复制server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/graduate_employment?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB
mybatis-plus:
mapper-locations: classpath*:mapper/**/*.xml
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
第二块是确认mybatis-plus的逻辑删除配置。很多源码会在实体类的id字段或者status字段上加@TableLogic,这样你调用普通delete时实际上是执行update,把状态标记为已删除。如果你不知道这个配置,看数据库执行日志时会以为代码写错了,实际上那是预期的软删除。
第三块是确认文件上传目录。简历上传是就业系统里的常见需求,源码一般会把上传的文件保存到本地某个路径,比如D:/upload/。这个路径写死的问题在于你换电脑后要重新创建目录,否则上传会报“系统找不到指定的路径”。建议在配置里配置成相对路径,比如upload: ./upload,不折腾。
4.3 前端启动和前后端联调全流程
后端起来之后再去操作前端。先执行npm install,这里如果网络不好,可以把npm源换成国内镜像,再执行安装。安装完成后启动npm run serve,看到页面出来就算环境通了。
然后打开页面,先用默认管理员账号登录。登录成功后,按F12打开浏览器开发者面板,切到Network标签,点击“岗位管理”之类的菜单,观察请求是否返回正常。如果接口返回404,先看请求URL和后端Controller路径是否对得上,尤其注意有没有多一层/api前缀。前后端对/api的理解不一致,是我见过最多的联调问题。
如果接口返回200但页面没数据,多半是数据格式问题。比如后端返回的data是数组,前端却按对象读取;或者日期字段是一串时间戳,前端没做格式化。这些不要慌,打开响应数据逐字段对比即可。
联调通过后,我习惯用两个浏览器分别登录不同角色。一个用Chrome进入学生端,一个用Edge进入企业端,故意造出一条“企业发布岗位、学生投递、企业查看简历、管理员统计”的完整业务链路,方便答辩时一口气演示完。
4.4 演示环境准备:别在答辩现场手忙脚乱
越到答辩前,越要重视演示环境。我最惨的一次教训是答辩现场网络不好,前端页面一直加载不出来。后来我所有的演示项目都在本机跑通,并且提前准备好一份离线演示录屏作为Plan B。
具体准备事项包括:数据库里预置至少10条学生数据、5家企业、20个岗位,并制造出不同投递状态的数据,让就业率统计图表看起来有内容。管理员端要提前导入几条公告,学生端要确保有一条简历上传记录,企业端要有一条可以展示的求职简历。整个演示尽量控制在8到10分钟以内,先讲业务背景,再讲技术架构,最后演示核心流程。
如果在演示中途项目崩了,不要愣在那里,直接说“这个问题在开发中已经定位过,是由于XXX,我暂时先重启项目,不影响整体流程”。能从容面对故障,比假装一切完美更加分。
5. 常见问题与排查技巧实录
5.1 前后端联调高频错误速查表
我把自己做这套项目时遇到的和帮别人排查过的错误整理成了一张表,建议截图存下来:
| 错误现象 | 可能原因 | 处理建议 |
|---|---|---|
| 前端请求接口404 | 后端没有匹配到路径 | 检查Controller路由、context-path、代理前缀 |
| 后端请求跨域 | 前端直接访问了后端地址 | 配置Vue代理,或后添加CorsFilter |
| 登录成功但页面跳不回 | 路由守卫没放行 | 检查token是否写入localStorage |
| npm install报node-sass错误 | Node版本过高 | 项目不需要就删掉,或装sass |
| 数据库时间字段差8小时 | 时区没配置 | URL中加serverTimezone=Asia/Shanghai |
| 上传文件报系统找不到路径 | 上传目录不存在 | 创建目录或改成相对路径 |
| 启动时初始化bean报错 | 某些配置项失效 | 看最底层Caused by信息,别只看第一行 |
| 刷新页面后菜单状态丢失 | store状态未持久化 | 引入vuex-persistedstate或本地存储 |
这张表看起来简单,但每条都是真实排查过的。尤其是“登录成功但页面跳不回”和“刷新后登录态丢失”这两个问题,在毕设答辩中几乎必被问到。
5.2 修改源码前先想清楚三个问题
网上流传的毕设源码很多,但“08719”这类的包并不保证每个都能开箱即用。比如有的源码用的是Spring Data JPA,有的用的是MyBatis-Plus,如果你不熟悉对应的数据库访问方式,改功能时会很难受。我建议拿到源码先想清楚三个问题。
第一个问题:我能独立说清楚管理员的权限控制吗?如果项目里的登录拦截是靠拦截器判断用户角色,还是靠自定义注解,还是纯前端路由控制,这决定了答辩时的安全深度。很多毕设源码的后端甚至没有权限校验,所有接口都能直接访问,前端隐藏按钮而已。如果老师问你“学生直接访问管理接口怎么办”,答不上来就很尴尬。所以要么补一段简单的拦截器,要么明确告诉老师目前实现的是前端权限控制,并说明改进方向。
第二个问题:数据库里的测试数据能见人吗?源码里的测试数据经常是“小王”“李四”这类泛化名字,甚至还有“test123”之类。答辩前一定要把数据改成本校场景,比如专业写“软件工程”“计算机科学与技术”,企业写本地知名公司,岗位写“Java开发”“前端开发”“测试工程师”。这些细节会让评审老师觉得你真的在做毕设,而不是在跑demo。
第三个问题:我加的功能能不能用一句话说清楚?很多同学喜欢在系统里加“就业预测”“智能推荐”这种听起来很高级的功能,但实现起来只是简单排序或随机推荐。一旦被追问算法细节,马上就露馅。倒不如老老实实加一个“按专业统计就业率”的ECharts图表,既简单又实用,还能展示前端图表组件能力。
5.3 我在源码二开过程中最想吐槽的三个点
第一,部分老源码用的Lombok版本在JDK17以上会编译失败。如果你用的JDK8,基本没问题;但如果你电脑上只有JDK17,而源码里的Lombok还是1.18.20,就会报Caused by: java.lang.ExceptionInInitializerError。解决办法不是卸载JDK,而是去Maven仓库里手动升级Lombok版本到1.18.30以上。
第二,有些源码的登录密码并不是你从数据库看到的那样。因为用了BCrypt加密,数据库里存的是$2a$10$...一长串密文。你直接用SQL插一条明文admin123是没办法登录的。正确做法是运行项目后注册一个用户,或者写一个临时接口生成加密密码,再插入系统。
第三,很多源码的README写得非常简陋,甚至没有写默认账号。这时候不要傻傻去源码里搜,先看数据库的sys_user表,把状态正常的账号取出来,再确认角色,就能推断出管理员、学生、企业三种账号。有些系统的密码是统一初始化的,有些是手机号后六位,多试几次就能进。
5.4 几个能明显加分的“非官方”操作
最后分享几个我在实际操作中觉得特别有用的骚操作。第一个是在后端加一个简单的日志切面,用@Around注解统一打印请求路径、参数、耗时。这样演示时如果老师问“你怎么调试接口”,你直接切到控制台展示请求日志,比说一百句话都有说服力。
第二个是给前端页面加一个全局的loading动画。很多毕设源码在点击查询按钮时没有loading状态,体验很“原生”。加上v-loading指令后,整个系统的交互质感会提升一个台阶,而且实现成本很低,在el-table或el-dialog上加指令即可。
第三个是使用宝塔面板或Docker把前后端部署到云服务器上。现在“宝塔docker部署springboot”已经是热词了,如果时间充足,可以买一台低配云服务器,把MySQL、后端、前端Nginx都部署上去。答辩时直接让大家访问线上地址,那个冲击力完全不一样。
不是让所有同学都去学运维,只是强调一点:不要只停留在“本地能跑”的阶段。哪怕没有服务器,提前写清楚部署文档,也能体现出工程化思维。
结尾
这个项目我前后跑了两遍,第一遍纯粹是看热闹,第二遍才真正把每张表、每个接口、每个前端页面串起来。我个人实际做下来最深的体会是:SpringBoot和Vue都只是工具,真正难的是你能否把一个完整的需求转化成数据表、接口、页面和权限控制,再把这些过程讲给一个完全不了解系统细节的老师听。源码可以给你省下开发时间,但给不了你表达能力。因此无论是默认账号、软删除逻辑、JWT过期处理,还是跨域配置、数据库时区,都值得静下心来弄懂原理。最后再分享一个小技巧:答辩前自己对着镜子讲一遍完整流程,把“为什么这样设计”挂在嘴边,哪怕现场被问到不会的问题,你也不会慌乱。毕竟系统是你自己写出来的,底气应该是足的。
