SpringBoot+Vue+MySQL在线考试与学习交流系统:完整源码解析与二次开发指南
最近很多准备做毕业设计或者Java课程设计的同学都在找一套能直接跑起来的完整项目。SpringBootVueMySQL这套组合几乎成了此类项目的标准答案但网上能找到的源码要么缺前端、要么数据库脚本对不上、要么环境版本老到无从下手。我手里这套“语言在线考试与学习交流网页平台信息管理系统”算是比较难得的完整闭环后端SpringBoot、前端Vue、数据库MySQL三件套齐全导入就能启动前后端能正常联调连默认账号都给你备好了。这篇文章我会把它拆开揉碎从项目结构到核心代码逻辑从环境准备到二次开发把该说的细节全部讲透你拿到手不只是能跑还能真正理解每一层在干什么。1. 项目到底做了什么三大功能域拆解先别急着敲命令搞清楚这套系统是干什么的后面看代码才不会一头雾水。从标题上就能拆出三个关键词语言在线考试、学习交流、信息管理。这三个词对应的是系统的三条业务主线各自独立又有交叉。1.1 在线考试模块从题库到成绩单的完整闭环在线考试不是简单地把几张试卷搬到网页上它至少包含四个环节题库维护、组卷策略、考试作答、自动判分。这套源码在这四块都有对应的表结构和接口实现。题库维护对应的是题目表支持单选、多选、判断这类常见客观题型字段里预设了题目内容、选项、正确答案、分值、所属课程这些基础信息。组卷策略做得比较轻量没有像复杂考试系统那样支持随机抽题和难度系数权重而是以手工组卷为主——管理员从题库里挑选题目设定每道题的分值组成一张试卷。这在课程设计级别已经完全够用也更容易在答辩时讲清楚。考试作答是整套系统里交互最重的部分因为涉及倒计时、题目切换、答案暂存、交卷确认这些细节。前端Vue负责倒计时和答题卡状态展示后端SpringBoot负责接收答案、校验考试时间是否超时、计算得分。这里有个容易被忽略但很重要的设计后端在交卷接口里会再次校验当前时间是否超过了考试截止时间而不是单纯信任前端传过来的数据。这个细节值得你在答辩时主动提出来说明你考虑到了“前端限制可以被绕过”这种安全问题。自动判分逻辑是纯后端处理的。客观题判分不涉及复杂算法就是拿用户提交的答案和数据库里的正确答案做比对判断题和单选题比对字符串多选题需要处理选项顺序不一致的情况所以源码里大概率会先把选项排序再比对或者按选项的规范顺序存储。这个细节虽然不起眼但能体现出代码的严谨性。1.2 学习交流模块让平台不只是一个考试工具学习交流部分做的是轻量级社区功能。学生登录后可以在讨论区发帖提问可以浏览别人的帖子并进行回复也可以按课程分类筛选自己感兴趣的话题。这个模块在技术上并不复杂就是典型的“帖子表评论表”结构帖子和评论通过外键关联前端通过嵌套列表展示。不过在课程设计层面这个模块的意义很大。第一它让系统从“纯工具型平台”变成了“带社区属性”的平台业务上更完整第二它引入了除考试之外的第二类核心实体让你的ER图和数据表设计看起来更丰满第三它锻炼了关联查询能力一条帖子带出所有评论涉及的就是MyBatis里的多表查询和结果集映射。帖子和评论会关联用户表也就是和登录认证模块产生了联系。发帖时你要带token后端从token里解析出当前用户ID再把用户ID写入帖子表由此完成“谁发的帖”这个逻辑。这里建议你在看代码时重点观察一下它用的是简单的RequestHeader取值还是封装了一个拦截器统一处理用户信息。两种做法的代码量差别很大后者明显更优雅扩展性也更强。1.3 信息管理模块用户、课程、公告的后台支撑信息管理这类功能是所有管理系统的基础盘通常包括用户管理、课程管理、公告管理。用户管理负责学生的增删改查和角色分配课程管理是题库和试卷的归类维度公告管理则承担首页信息发布的功能。用户管理里一定会区分角色后端通过角色字段控制接口访问权限。最简单的实现是写一个拦截器检查当前登录用户的角色管理员可以访问/admin/开头的接口普通学生只能访问业务接口。更精细一点的会引入Spring Security或者Shiro但这类课程设计项目通常不会上那么重的框架一个HandlerInterceptor加一个自定义注解就能解决大部分权限问题。课程和公告部分没什么高深的技术就是标准的CRUD。但公告表一般会有一个状态字段用于控制是否在前台展示这样管理员可以提前录入公告但暂不发布。这类字段设计虽然简单但在答辩时能体现你对业务场景的真实理解。2. SpringBoot后端从MVC分层到关键接口落地的完整链路后端是整个系统的大脑这篇文章的核心价值也在于帮你看懂后端的组织方式和实现细节。SpringBoot项目的代码结构通常有固定范式但这套源码在分层上做得是否规范直接决定了你能不能快速上手改造。2.1 项目分层与包结构拿到源码先看目录结构。规范的SpringBoot项目一般是这种分包方式controller、service、mapper或者dao、entity或者pojo、config、common、utils。你手头这套源码基本沿用了这个结构这是最主流的写法没有花里胡哨的东西。entity包里放的是和数据库表对应的实体类CamelCase命名对应数据库的snake_case字段比如userId对应user_id这点在配置MyBatis时要注意驼峰映射是否开启。mapper包是数据访问层里面放接口和XML文件XML里写具体的SQL语句。service包负责业务逻辑比如考试超时判断、试卷分数汇总这类逻辑都应该在service层完成而不是直接堆在controller里。controller只负责接收请求、参数校验、调用service、封装返回结果。如果你打开某个控制层代码发现里面大段大段写着业务代码那这个项目的分层就是不合格的。合格的代码是controller非常薄service相对厚实。你可以在答辩时说清楚这个设计原则比背一堆概念更容易拿分。2.2 JWT登录认证与拦截器设计登录认证几乎是所有管理系统逃不开的环节。这套系统用的是JWT方案也就是用户登录成功后后端签发一个token返回给前端前端每次请求都把这个token放到请求头里后端通过拦截器校验token的合法性并解析出用户身份。与传统Session方案相比JWT的最大优势在于无状态——服务器不需要保存会话信息token本身就携带了用户身份和过期时间天然适合前后端分离的架构。拦截器里会先放行登录接口和注册接口其他所有接口都要经过token校验。校验时会从请求头取出Authorization字段去掉Bearer 前缀再用预设的密钥去解析签名解析成功就放行失败则返回401状态码。源码里大概率有一个自定义注解叫PassToken或者类似的名字标注了该注解的接口不需要登录就能访问。这种设计和Spring Security的permitAll思路一脉相承但实现轻量很多。你在二次开发时如果要新增一个免登录接口只要在方法上加个注解就行非常方便。2.3 考试核心接口的实现细节考试相关的接口是这套系统里含金量最高的部分我建议你重点读三个接口。第一个是获取试卷接口接收一个examId考试ID返回试卷信息和题目列表。注意题目列表返回给前端时正确答案字段必须被剔除或混淆否则学生看接口返回就能直接查到答案这在真实考试系统里是致命bug。第二个是提交试卷接口。前端把用户作答结果封装成List每项包含题目ID和用户答案后端拿到后逐题判分最后汇总总分并把成绩写入考试记录表。这里有一个性能和事务的双重考量判分是多条写操作应该放在一个事务里任何一条失败都要回滚同时逐题判分的逻辑如果循环写在controller里就太丑了抽取到service层才是正解。第三个是查询成绩接口。考试结束后学生可以查看自己的历史成绩管理员可以查看某场考试所有人的成绩排名。查询逻辑涉及多表关联要关联考试表、用户表、成绩表。这类查询是MyBatis多表查询的典型场景用resultMap做结果集映射比直接用Map接收要清晰得多。2.4 MyBatis-Plus分页与条件查询这套系统的数据访问层用的是MyBatis-Plus不是纯MyBatis。MyBatis-Plus最爽的地方在于单表CRUD不用写SQL直接用内置的BaseMapper方法就能搞定复杂查询再手写XML。分页查询走的是MyBatis-Plus的分页插件只需要在配置类里注册一个PaginationInnerInterceptor然后在controller层传入Page对象查询时自动拼接limit语句返回结果里会带上总记录数和总页数。这里有一个容易踩的坑我正好在热词里看到有“mybatis的分页插件的用法 springboot”这个搜索词说明很多人在这一步翻过车。分页插件配置有个前置条件必须配置MybatisPlusInterceptor类型的Bean而不是旧版本的PaginationInterceptor。而且分页拦截器要配置在最后一个位置否则和其他插件混用时会出问题。如果你在运行项目时发现分页不生效先检查这个Bean的配置再检查分页参数是否正常传入了Page对象。条件查询用的是MyBatis-Plus的QueryWrapper例如按用户名模糊查询用户列表就是wrapper.like(username, keyword)然后配合分页插件使用。这类查询在用户管理和课程管理里用得非常多。3. Vue前端页面的组织方式与考试流程交互前端这套Vue项目是典型的单页应用通过Vue Router控制页面跳转用Vuex或者Pinia管理全局状态。拿到源码后你会发现前端目录比后端更好读懂因为每个页面组件就是一个视图路由配置里能看到所有可访问的页面路径。3.1 路由设计与权限控制路由设计分为两个层次。第一层是基础页面路由比如登录页、注册页、首页、考试页、讨论区页。第二层是权限控制通过路由守卫实现。前端路由守卫会在页面跳转前检查本地是否存在token没有token就强制跳转到登录页有token但访问的是管理员专属页面则检查用户角色是否匹配不匹配就拦截并提示无权限。这种前端路由守卫只是用户体验层面的控制真正的安全防线还是后端接口的token校验。这一点建议你在答辩时主动讲清楚前端路由守卫防止普通用户看到管理员界面后端接口校验防止有人绕过前端直接调用接口。前后端双重控制安全性才有保障。热词里有不少“vue路由参数”相关搜索正好和这里相关。考试页面通常需要接收一个考试ID参数比如路由路径是/exam/:id进入页面时通过this.$route.params.id获取考试ID再调用后端接口获取试卷数据。如果你在二次开发时增加新的详情页比如帖子详情同样可以用动态路由传参。还有一种方式是用this.$router.push({ path: /exam, query: { id: 1 } })页面通过this.$route.query.id获取参数。两种方式各有适用场景params适合路径型参数query适合可选参数或搜索条件。3.2 axios封装与请求拦截前端项目一定会对axios做二次封装。封装的核心目标是统一处理请求头和响应体。请求拦截器里会在每个请求的header中加入token这样后端拦截器才能从请求头中取出token做校验。响应拦截器里会统一处理HTTP状态码和业务状态码403时跳转登录页500时弹出错误提示。这个封装属于所有Vue管理系统里的标准操作你在多个项目里会反复见到同一套思路。看源码时重点关注它的错误处理是否完整、是否有统一的loading效果、是否处理了token过期场景。如果token过期后只是弹出提示而不跳转登录页那就算是一个小缺陷你在答辩时可以被提问到但不要主动暴露这种短板可以在答辩前自己修好。3.3 考试倒计时与答题卡考试页是前端交互最复杂的页面。倒计时组件用setInterval实现每秒更新一次剩余时间时间归零后自动触发交卷。这里有一个需要处理的细节倒计时应该以本地存储中的考试截止时间为基准而不是简单的页面打开时间加考试时长。因为如果学生中途刷新页面setInterval重置但如果剩余时间直接从本地存的时间计算刷新后倒计时不会错乱。答题卡是一个网格状组件展示所有题目的序号红色代表已答灰色代表未答点击序号可以快速跳转到对应题目。这个功能在实现上不算难核心是维护一个答案Map键是题目ID值是用户选择的选项每当用户切换选项时更新Map同时根据Map的key数量判断当前页面有几道题已作答。交卷前一般会弹确认框提醒用户还有多少题未做是否确认交卷。这里前端可以再做一道防线禁用交卷按钮直到倒计时结束同时加确认框二次确认。虽然这些限制在后端校验面前都不算真正的约束但从用户体验角度来说是必要的。3.4 环境配置与依赖安装前端跑起来之前要确保Node环境和npm依赖都装好了。热词里关于“vue安装依赖”、“vue安装及环境配置”的搜索量一直很高可见这一步卡住了不少人。拿到前端源码后先看package.json确认Vue版本是Vue2还是Vue3这决定了你用的API是选项式还是组合式。然后执行npm install安装依赖如果网络不好或者因为Node版本原因卡住可以用npmmirror的淘宝镜像源。启动开发服务器用npm run dev默认端口一般在8080或者配置里指定。这里有一个注意事项前端开发服务器的端口必须和后端接口地址在跨域配置上对应起来否则前端请求会被同源策略拦截。最常见的解决方法是Webpack的devServer配置proxy代理把/api开头的请求转发到后端端口这样前端看起来是在请求自己的同源地址实际由代理转发到了后端。4. “可直接运行”的真相环境匹配与启动步骤标题里写了“可直接运行”但这句话有个前提——环境要对得上。很多同学拿到源码跑不起来80%的原因是JDK版本太高或太低、MySQL字符集不对、Node版本和Vue脚手架不兼容。这一章我把启动步骤和版本兼容性都讲清楚。4.1 JDK、Maven、Node的版本选择后端SpringBoot项目通常会标明依赖的JDK版本pom.xml里会有java.version配置项。这类课程设计项目绝大多数是JDK 8或者JDK 11很少有上JDK 17的。如果你本机装的是JDK 17甚至JDK 21跑SpringBoot 2.x版本的项目可能会遇到兼容问题尤其是一些第三方库的反射操作在JDK 17强模块化下会报错。最稳妥的方案是装一个JDK 8或者用IDEA里多JDK切换功能为项目单独指定JDK 8。Maven仓库的依赖下载是跑项目的第一道坎。SpringBoot项目首次启动时会下载大量依赖这个过程非常依赖网络和镜像源。建议在Maven的settings.xml里配置阿里云镜像否则依赖下载慢到怀疑人生。如果你拿到项目后pom.xml报红优先检查Maven配置和本地仓库路径。Node版本方面Vue2项目建议使用Node 14到Node 16Vue3项目可以用Node 16到Node 18。如果Node版本过高有些旧版依赖比如node-sass会编译失败报错信息通常是一大串Python和C编译错误。遇到这类问题直接换Node版本或者改用sass的分支版本能省下大量时间。建议装一个nvmNode版本管理器随时切换版本。4.2 MySQL初始化与数据库配置数据库脚本一般在源码的根目录常见文件名是init.sql、database.sql或者schema.sql。打开脚本后先看建库语句确定数据库名称然后在你本机的MySQL里执行建库和导入。执行时可以写一个source命令直接导入文件也可以打开Navicat或MySQL Workbench图形化导入。这里有一个你需要特别留意的地方字符集。中文乱码问题十有八九出在数据库默认字符集不是utf8mb4。建库时强烈建议显式指定utf8mb4对应SQL是CREATE DATABASE xxx DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci。utf8mb4是utf8的超集能正常存储emoji也是现在MySQL 8的默认推荐字符集。数据库连接配置在application.yml或application.properties里。核心配置包括URL、用户名、密码、驱动类。URL里通常还会带上characterEncodingutf8和useSSLfalse这些参数。你要做的是把用户名密码改成你本机的MySQL账号密码。这一行配置不改对的话项目启动会报数据库连接错误堆栈信息很明显。还有一个常见问题MySQL 8和MySQL 5.7的驱动类名不同。MySQL 8用com.mysql.cj.jdbc.DriverMySQL 5.7用com.mysql.jdbc.Driver。如果你的pom.xml里依赖的mysql-connector-java版本是8.x那么驱动类名必须是带cj的版本否则启动报错。看报错信息时第一关注驱动类名拼写第二关注URL是不是带了serverTimezone参数。4.3 前端和后端的启动顺序启动步骤没有严格的先后之分但推荐先启动后端再启动前端这样前端页面加载数据时后端已经就绪。后端启动是在IDEA里直接运行Application类运行前确认右上角Project SDK选的是你配置好的JDK版本。启动成功后控制台会输出SpringBoot的Logo和“Started XXX Application in XX seconds”类似字样。然后你可以用Postman或者浏览器直接访问某个免登录接口比如获取公告列表的接口确认接口返回JSON数据。前端启动是在项目根目录打开终端依次执行npm install和npm run dev。启动成功后控制台输出Local地址通常是localhost加自定义端口。浏览器打开这个地址应该能看到系统的登录页。用源码里自带的测试账号登录比如管理员账号admin/admin123学生账号student/123456账号密码通常在README或者数据库初始化脚本的注释里能查到。如果注释里没有可以直接查数据库的user表。登录成功后你就能看到完整的页面首页公告栏、考试列表、讨论区入口。点进一个考试能看到试卷页面、倒计时、答题卡。整个跑通之后这套系统就真正属于你了。5. 联调期最容易翻车的四个细节前后端分开看都能跑连到一起就出各种问题这是前后端分离项目最常见的困境。我梳理了四个高频翻车点每一个都是我在实际联调中踩过的坑。看代码时你可以对照检查这套源码是否已经处理了这些问题。5.1 跨域配置接口通了的假象与真问题前后端分离的典型特征是前后端不在同一个端口上运行。前端在8080端口后端在9090端口浏览器发起请求时就会出现跨域问题。你是否遇到过这样一个场景用Postman测试后端接口返回数据完全正常但页面里用axios请求同一个接口却报错报错信息里带着CORS字样的英文提示。这就是典型的跨域问题——浏览器限制非同源请求。解决方案有三种。第一种是后端开启CORS也就是在SpringBoot的配置类里实现WebMvcConfigurer重写addCorsMappings方法配置允许的源、请求头、请求方法、是否携带凭证。第二种是前端用Webpack的proxy代理把API请求转发到后端地址从浏览器视角看请求是同源的。第三种是Nginx反向代理这个适合生产环境部署。这套源码用哪种方案取决于实际配置建议你看一下前端根目录的vue.config.js或者webpack配置文件看有没有proxy配置再看后端有没有CorsConfig之类的配置类。两者都有也不冲突只是要小心重复配置导致的问题。我自己更推荐前端proxy方案因为前后端相对解耦前端可以不改任何代码就能把请求转发到任意后端环境。5.2 时间格式化数据库里的时间比页面展示少8小时时间问题也是联调期的高频bug尤其当数据库里存储的是datetime类型字段时。为什么后端返回给前端的时间是2025-01-01T08:00:00.00000:00这种带时区的格式因为SpringBoot默认的Jackson序列化会按UTC时区输出时间。如果你本机是北京时间东八区数据库里存的2025-01-01 16:00:00会被序列化成2025-01-01T08:00:00Z前端拿到手再转成本地时间时又加了8小时最终显示成2025-01-02 00:00:00整整乱了8个小时。解决方案是统一时间序列化格式。在SpringBoot的application.yml里可以配置spring.jackson.date-formatyyyy-MM-dd HH:mm:ss和spring.jackson.time-zoneGMT8。或者在实体类的时间字段上加JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)注解。更推荐前者全局生效不用逐个字段加注解。5.3 分页插件版本冲突查询结果集的“无底洞”MyBatis-Plus分页插件在3.4.0版本前后有比较大的API调整。旧版本用PaginationInterceptor新版本用MybatisPlusInterceptor然后addInnerInterceptor(new PaginationInnerInterceptor())。如果你把新旧版本的用法混在一起项目可能直接启动报错或者分页查询不生效返回全表数据。这个问题的排查思路很简单先看pom.xml里引用的mybatis-plus-boot-starter版本号再对照网上该版本的官方分页配置文档。版本是3.4.0以上的直接用新写法。版本是3.3.x及以下的用旧写法。注意3.4.0之后的版本PaginationInnerInterceptor的构造方法还需要指定数据库类型比如new PaginationInnerInterceptor(DbType.MYSQL)。5.4 文件上传路径图片“消失”了这套系统如果有头像上传或者公告图片上传的功能那你很可能遇到这个问题文件明明上传成功了数据库里也存了图片路径但页面上图片就是不显示。原因通常是前端把文件上传到了后端服务器的某台机器的某个目录而前端访问图片时是通过另一个路径去访问两者对不上。解决思路是了解后端文件上传的存储位置然后在前端配置一个静态资源映射。比如后端把文件存储在项目根目录下的upload文件夹那么在SpringBoot里可以通过WebMvcConfigurer的addResourceHandlers方法把/upload/**路径映射到file:绝对路径/upload/。这样前端访问localhost:9090/upload/xxx.jpg就能拿到图片。如果你在二次开发时要增加文件上传功能记得把存储路径规范化并且用UUID重命名文件避免文件名冲突。6. 基于这套源码做二次扩展四条切实可行的优化思路拿到一套能跑的源码只是起点课程设计或者毕业设计真正拉开差距的地方在于你有没有做“增量创新”。完全照抄源码只能拿个及格分但如果你能在这个基础上增加一个亮点功能就能在答辩时拿出“我不仅看懂了原有代码还做了扩展”的姿态。下面四个方向是我认为基于这套系统可以很快落地的。6.1 从“手工组卷”升级为“智能随机组卷”现在的组卷方式是管理员从题库里手工挑选题目这个逻辑在业务量小的时候没问题但如果题库里有几千道题人工出卷的效率就很低了。可以考虑增加随机组卷功能管理员只需要输入考试名称、选择课程、设定每种题型数量、设定每种题型分值系统就自动从题库里随机抽取题目并生成试卷。这个功能的实现核心是数据库查询的随机排序加限制条数也就是SELECT * FROM question WHERE type 单选 AND course_id 1 ORDER BY RAND() LIMIT 10。但在数据量大时ORDER BY RAND()的性能不太理想会有全表扫描的问题。更优的方案是先用SELECT COUNT(*)获取总数再生成一个随机偏移量配合LIMIT进行“随机翻页”查询。这样既有随机性又不至于性能崩溃。这个功能会让你的系统在“组卷”这个环节上明显比原版更专业。6.2 增加成绩分析与错题本功能现在考试结束后学生只能看到总成绩看不到每道题的对错和正确答案。你可以做一个错题本模块考试交卷后把每道题的作答结果保存到明细表包含题目ID、用户答案、是否正确、标准答案。学生端增加“错题本”页面展示所有做错的题目支持按课程筛选。再进一步可以统计每个课程的正确率用简单柱状图展示前端用ECharts就能实现。这个功能的技术难点在于成绩明细表的设计。需要新增一张表字段至少包含主键、成绩主表ID、题目ID、用户答案、是否正确。判分时除了累加总分还要逐条把明细记录写入这张表。查询成绩时根据成绩主表ID查出所有明细关联题目表获取题干和正确答案。对于答辩来说这个功能的业务逻辑清晰数据表设计合理演示效果好是个性价比很高的加分项。6.3 学习交流模块增加点赞与消息通知讨论区现在的形态是“发帖回复”的基础结构。你可以在此基础上增加一个点赞功能用户可以对帖子点赞也可以取消点赞。实现方式是一张点赞关联表包含帖子ID和用户ID唯一约束保证一个用户对一条帖子只能点赞一次。帖子详情接口返回时关联查询出点赞总数并判断当前登录用户是否已经点过赞。消息通知功能稍微复杂一点但也是在交流模块发展中最有价值的增强。当有用户回复你的帖子时可以生成一条站内通知通知内容包含“谁回复了你的帖子《标题》”以及链接。实现思路是在创建回复的service逻辑里增加一个通知记录写入动作同时标记是否已读。前端在导航栏增加一个小铃铛图标点击展开未读通知列表红点提示未读数。这个功能让系统从一个“信息展示工具”走向了“带社交属性”的平台而且前后端的交互形态更丰富。6.4 前端体验优化答辩演示的加分细节不要低估视觉和交互细节在答辩中的分量。同一个系统一个界面整洁、按钮交互流畅的版本和一个原生样式直接裸奔的版本给人留下的印象截然不同。建议你在拿到源码后把精力集中在两处改进上。第一处是登录页。把登录页做成居中卡片风格配上项目名称和简洁背景这是所有管理系统中改动成本最低但提升效果最明显的部分。第二处是表格和按钮的统一风格。如果原项目用的Element UI可以统一表格的分页样式、按钮尺寸、弹窗宽度让整体视觉保持一致。Element UI的Table组件自带分页和排序功能配置要比自己手写容易很多。第三处是增加一个首页数据看板管理员登录后显示用户总数、今日活跃考试数、讨论区帖子总数这些数据一个SQL就能查出来但展示在首页会让系统看起来完整得多。7. 源码拿到手后按这个顺序“吃透”它最后这部分写给真正想把这套源码变成自己项目的人。很多人拿到源码第一反应是打开运行跑通了就丢到一边。这种做法对能力提升几乎没有帮助。正确的阅读顺序应该是自顶向下、由表及里分四步走。第一步先看数据库脚本把表结构理清楚。打开SQL文件看每张表的字段和注释画出简单的ER图用户表关联了哪些表考试表关联了哪些表题目表和试卷表的关联方式是什么。表结构就是系统的骨架理解了骨架你才能理解后续所有代码是在操作哪些数据。第二步画接口清单。在后端controller包里把每个controller的方法名、请求路径、请求方式、作用列成一张清单。一个典型的系统大约有20到40个接口你把这些接口对应到前端页面就能建立起“页面点击了什么组件调用了哪个接口接口操作了哪张表”这条完整的调用链。第三步读核心业务逻辑。考试相关、登录认证相关的service层代码优先精读因为这两块是系统的核心也是答辩时被提问概率最高的地方。CRUD代码可以泛读跳着看关键逻辑就行。第四步动手改一个功能。比如修改登录后的默认跳转页面或者给某个字段增加校验规则。哪怕只是很小的改动也能让你理解代码的耦合方式知道改一个功能会波及哪些文件。当你成功改完一个功能并让它在页面上生效时这套源码才真正开始属于你。根据我个人经验看完这套系统再动手写一个简单管理系统的完整链路前后大概需要两周时间。第一周用来读代码和画图第二周用来改功能和调试。如果你不急着答辩把6.1到6.4里任意一个扩展功能完整实现整套源码和你的名字绑定就没有任何悬念了。要是你在环境配置或者联调阶段卡住了按着第4和第5章的顺序排查绝大多数问题都能自己解决。