SSM在线考试系统毕业设计全解析:从表设计到部署实战

发布时间:2026/9/8 11:50:39
SSM在线考试系统毕业设计全解析:从表设计到部署实战 这篇要聊的是计算机专业毕业设计里非常高频的一个课题基于 SSM 框架的在线考试管理平台。说白了就是拿 Java 把“老师出题、组卷、发布考试、学生答题、自动判分、成绩统计”这一整套流程做成一个 Web 系统。技术栈一眼就能认出来Spring SpringMVC MyBatis配 MySQL 做存储前端常用 JSP Bootstrap项目通过 Maven 管理依赖扔到 Tomcat 里跑。这套组合在学校毕设里出现频率极高因为知识点覆盖全IOC、AOP、MVC 分层、ORM 映射、SQL 设计、会话管理全都能串起来。很多同学找毕设源码时只看“能不能跑”拿到手之后不关心项目结构结果导入 IDEA 后一堆红叉启动时报错也看不懂。这篇文章不打算只给源码而是把在线考试系统的核心设计思路、数据库表结构、启动流程、功能验证方式、常见踩坑点都过一遍。你会知道这个项目到底做了什么答辩时老师问起来也能答得清楚而不是“源码跑起来就完事”。如果你正在做 SSM 相关毕设或者想通过一个完整 Web 项目把 Java 后端知识串一遍这篇内容建议直接收藏。下面从能力概览开始再到实际搭建一步步拆开看。1. 核心能力速览先说项目定位。在线考试系统本质是一个多角色 Web 管理平台最常见的角色划分是管理员、教师、学生三端。能力项说明项目类型Java Web 管理系统适合毕业设计、课程设计后端框架Spring SpringMVC MyBatisSSM数据库MySQL 5.7 或 8.0关系型表设计前端方案JSP Bootstrap / LayUI或前后端分离 Vue Axios构建工具Maven运行容器Tomcat 8.5 / 9核心角色管理员、教师、学生核心功能题库管理、试卷管理、在线考试、自动阅卷、成绩统计是否支持批量任务支持常见做法是用 Excel 批量导入试题是否支持接口 API后端 Controller 本身就是接口可接前端页面也可扩展成 REST API适合场景校内课程考试、线上练习、毕设演示、SSM 框架练手从毕设角度讲这个课题的优势是“业务逻辑清晰、模块边界明显、容易出工作量”。一个完整的在线考试系统至少包含用户管理、课程管理、题库管理、试卷管理、考试发布、在线答题、自动评分、成绩查询、公告管理这些模块功能页面数量足够支撑毕设要求。需要注意SSM 本身是传统的 JSP 同步开发模式如果学校要求前后端分离可以把后端接口改造成 JSON 返回前端单独用 Vue 写。后面章节会提到具体改造思路。2. 系统功能模块与角色设计在做任何代码之前先把角色和功能边界理清。在线考试系统的用户不是一个“大而全”的账号体系而是分角色权限。管理员负责系统基础数据维护管理教师账号、学生账号、课程信息、公告发布有时候也负责全局数据统计。教师是内容生产者维护题库、创建试卷、发布考试、查看学生成绩、对主观题进行人工评分。学生是考试参与者查看可参加的考试、进入答题页面、提交试卷、查看自己的成绩和错题记录。权限控制是这类系统答辩时的高频问题。常见的实现方式有两种第一种是拦截器 角色字段请求进来先判断 Session 或 Token 里的用户角色再放行第二种是引入 Spring Security 或 Shiro。毕设用第一种就够代码量少逻辑好讲也不容易把自己绕进去。页面设计上通常有登录页、管理员后台、教师工作台、学生考试端四块。学生考试端需要注意“考试倒计时”“禁止刷新页面丢答题记录”“交卷前二次确认”这些细节做得好的话能明显提高项目评分。3. 数据库表设计与核心 SQL数据库是整个项目的基石。在线考试系统核心表通常有这几张sys_user用户表存账号、密码、角色、姓名通过role字段区分管理员/教师/学生course/subject课程表教师和课程、试题和课程关联exam_question试题表存题干、选项、答案、题型、分值exam_paper试卷表存试卷名称、所属课程、总分、考试时长、考试时间范围paper_question试卷题目关联表因为一份试卷包含多道题一道题也可以被多份试卷使用exam_record考试记录表记录某学生某场考试的提交状态、得分、开始时间exam_answer答题明细表逐题记录学生答案用来做错题分析和主观题评分grade/score成绩表也可以直接并入exam_record看设计习惯下面给出一套精简但够用的建表语句可以直接作为毕设数据库的起点。-- 用户表 CREATE TABLE sys_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password VARCHAR(100) NOT NULL, role TINYINT NOT NULL DEFAULT 3 COMMENT 1-管理员 2-教师 3-学生, real_name VARCHAR(50), create_time DATETIME DEFAULT CURRENT_TIMESTAMP );-- 试题表 CREATE TABLE exam_question ( id INT PRIMARY KEY AUTO_INCREMENT, course_id INT NOT NULL, question_type TINYINT NOT NULL COMMENT 1-单选 2-多选 3-判断 4-简答, content TEXT NOT NULL COMMENT 题干, option_a VARCHAR(255), option_b VARCHAR(255), option_c VARCHAR(255), option_d VARCHAR(255), answer VARCHAR(500) NOT NULL COMMENT 客观题答案简答题为参考答案, score INT DEFAULT 5, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );-- 试卷表 CREATE TABLE exam_paper ( id INT PRIMARY KEY AUTO_INCREMENT, paper_name VARCHAR(100) NOT NULL, course_id INT NOT NULL, total_score INT DEFAULT 100, duration INT DEFAULT 60 COMMENT 考试时长单位分钟, start_time DATETIME, end_time DATETIME, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );-- 考试记录表 CREATE TABLE exam_record ( id INT PRIMARY KEY AUTO_INCREMENT, paper_id INT NOT NULL, user_id INT NOT NULL, start_time DATETIME, submit_time DATETIME, objective_score INT DEFAULT 0, subjective_score INT DEFAULT 0, status TINYINT DEFAULT 0 COMMENT 0-未提交 1-已交卷 2-教师已阅主观题 );这里要强调表格设计不要在答辩时说“我随便建的”要能说出每个表解决什么问题表之间怎么关联。比如exam_answer表就是典型的多对多中间层它把学生答题情况和试题表关联起来后期做错题统计、成绩明细都靠这一张表。如果还要加“Excel 批量导入试题”功能需要一张导入模板表或者直接用 POI 读取 Excel 后逐条插入exam_question。性能上不用担心几百道题的级别 MySQL 插入没压力关键点是校验格式和去重。4. 在线考试系统的环境准备与前置条件在本地跑起一个 SSM 项目环境必须提前装好。这里给出一套常见配置清单具体版本建议以自己电脑上已安装的为主不一定要完全一样但尽量保持大版本一致。JDK推荐 JDK 8。SSM 项目在 JDK 8 下运行最稳很多网上源码用的也是 Java 8 语法。Maven3.6 或 3.8 都可以主要是拉取依赖和打包。MySQL5.7 或 8.0。8.0 需要关注驱动和时区配置连接串里要加serverTimezoneAsia/Shanghai。Tomcat8.5 或 9.0稳定且支持 Servlet 4.0。IDEIDEA 2020 以上或者 Eclipse。IDEA 对 Maven 项目支持更好建议直接 IDEA。数据库可视化工具Navicat、DataGrip 或 DBeaver 都行用来建库建表和排查数据。安装 JDK 后先确认环境变量是否正确打开命令行执行java -version mvn -v如果提示命令找不到说明JAVA_HOME或 Maven 的PATH没配好。这是新手最常见的环境问题不要跳到下一步。然后启动 MySQL在命令行或可视化工具里执行建库语句CREATE DATABASE exam_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;使用 utf8mb4 是为了防止中文和特殊符号乱码比 utf8 更稳妥。5. Maven 依赖与 SSM 整合配置SSM 项目的第一道坎是把 Spring、SpringMVC、MyBatis 三者配通。网上有很多源码pom.xml 里依赖版本冲突是高频问题。一个标准的 pom.xml 核心依赖大致如下dependencies !-- Spring -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.3.29/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.29/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version5.3.29/version /dependency !-- MyBatis -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.13/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.7/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- Servlet 和 JSTL -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- 文件上传 -- dependency groupIdcommons-fileupload/groupId artifactIdcommons-fileupload/artifactId version1.4/version /dependency /dependencies这套依赖组合是 SSM 项目里比较稳的搭配Spring 5.3 和 MyBatis 3.5 兼容性没有问题。数据库连接配置写在jdbc.properties里jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/exam_system?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernameroot jdbc.password123456注意驱动类名。MySQL 5.7 低版本可以用com.mysql.jdbc.Driver但 8.0 和大部分现代项目都推荐com.mysql.cj.jdbc.Driver而且一定要带时区配置不然启动时容易报The server time zone value ???ú±ê׼ʱ¼ä这类错误。Spring 配置文件里核心是把数据源、SqlSessionFactory、Mapper 扫描和事务管理器配好。这部分代码量不多但任何一个环节漏配都会导致项目起不来。6. 安装部署与启动方式SSM 项目最常见的启动方式有两种一种是 IDEA 里配置本地 Tomcat 启动另一种是 Maven 打包成 war 丢到 Tomcat webapps。下面分别说。6.1 IDEA 配置 Tomcat 启动用 IDEA 打开项目等待 Maven 依赖下载完成。点击菜单Run - Edit Configurations。添加Tomcat Server - Local。在Deployment选项卡里点选择Artifact把项目的 war exploded 添加进去。Application context设置成/exam或者留空。设置 Tomcat 端口默认 8080如果被占用就改 8081。启动前确认 MySQL 服务已开启数据库已建好jdbc.properties里的账号密码正确。启动后浏览器访问http://localhost:8080/exam/。如果启动时红色报错说端口被占用终端执行netstat -ano | findstr :8080找到占用进程后按 PID 结束进程或者直接把 Tomcat 端口换掉。6.2 Maven 打包启动在项目根目录执行mvn clean package打包成功后项目target目录下会生成.war文件把它复制到 Tomcat 的webapps目录然后启动 Tomcat 的bin/startup.bat。这种方式适合部署到服务器或演示给老师看。注意服务器上的 MySQL 账号权限和防火墙端口要提前配好。启动过程如果依赖下载慢可以在 Maven 的settings.xml里配置阿里云镜像mirror idaliyunmaven/id mirrorOf*/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror7. 核心功能测试与效果验证项目跑起来之后不能只看“登录页能打开”就认为完成。在线考试系统的核心链路要逐条测试。7.1 登录与角色权限验证使用不同角色的账号登录验证菜单显示是否不同。测试要点管理员登录后能看到用户管理、课程管理、系统管理菜单。教师登录后能看到题库管理、试卷管理、成绩管理。学生登录后只能看到考试列表、我的成绩。直接访问被禁止的 URL 时后台拦截器要能拦截并跳转到登录页或提示无权限。在 SSM 里常见的权限拦截通过 SpringMVC 拦截器实现大致逻辑如下public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Object user request.getSession().getAttribute(loginUser); if (user null) { response.sendRedirect(request.getContextPath() /login.jsp); return false; } return true; } }如果你在源码里看到的是这种拦截器说明它是基于 Session 的角色控制结构简单但要注意 Session 失效后要能正确跳转。7.2 题库管理测试用教师账号登录进入题库管理页面添加一道单选题然后编辑、删除再验证列表刷新是否正常。输入示例题干以下哪个关键字用于定义 Java 类 A. class B. struct C. function D. define 答案A 分值5保存后到数据库确认SELECT * FROM exam_question WHERE course_id 1;如果插入正常说明 MyBatis 的 insert 和表结构没问题。如果中文乱码检查连接串里的characterEncodingutf8和 JSP 页面编码。7.3 创建试卷与发布考试创建一份试卷选择单选题 10 道、判断题 5 道、简答题 2 道总分 100时长 60 分钟设置考试开始时间和结束时间然后发布。技术点在于组卷方式。毕业设计常做的是“手动选题”也就是教师从题库里勾选试题组成试卷。进阶一点可以做“随机组卷”按题型从题库中随机抽取。随机组卷的 SQL 示例SELECT * FROM exam_question WHERE course_id 1 AND question_type 1 ORDER BY RAND() LIMIT 10;随机抽取在试题量小的时候没问题量大以后性能一般但毕设场景足够。答辩时如果能提到“随机组卷用 ORDER BY RAND() 实现缺点是大数据量下随机排序消耗较高”会更加分。7.4 学生在线考试流程学生登录后看到可参加的考试列表点击“开始考试”进入答题页面。这里要重点测试考试时间倒计时是否准确。离开考试页面再回来已答题目是否保留。客观题提交后能否立即算出成绩。简答题提交后状态是否为“待阅卷”。实现倒计时一般用 JS从后端返回考试时长换算成截止时间戳前端用setInterval每秒刷新。let remainSeconds 3600; const timer setInterval(function () { remainSeconds--; const minutes Math.floor(remainSeconds / 60); const seconds remainSeconds % 60; document.getElementById(timer).innerText minutes : seconds; if (remainSeconds 0) { clearInterval(timer); document.getElementById(examForm).submit(); } }, 1000);倒计时结束自动交卷这个细节很多毕设源码没做但老师演示时往往很看重。7.5 自动阅卷与成绩统计客观题自动阅卷相对简单。学生提交答案后后端遍历答题明细根据试题答案比对计算出客观题得分。public int calculateObjectiveScore(ListExamAnswer answers) { int score 0; for (ExamAnswer answer : answers) { if (answer.getQuestionType() ! 4 answer.getUserAnswer().equals(answer.getCorrectAnswer())) { score answer.getScore(); } } return score; }这个逻辑要点是多选题要约定答案格式比如用A,B,C拼接比对时去掉多余空格并排序避免因为选项顺序不一致而判错。主观题需要教师手动阅卷。在教师工作台显示出未批阅的简答题教师给分后更新exam_record表的主观题分数。所有分数汇总后学生的最终成绩就是“客观题得分 主观题得分”。成绩统计模块常见的展示方式柱状图显示班级平均分、及格率表格展示每个学生成绩明细。这一步涉及 ECharts 图表前台引入 JS 即可后端只需要提供统计查询接口。8. 接口设计与批量任务扩展SSM 项目虽然是传统 JSP 开发但 Controller 层本身暴露的就是接口。如果要做前后端分离把 Controller 返回值改成 JSON 即可。一个 JSON 格式返回的接口示例Controller RequestMapping(/api/paper) public class PaperApiController { Autowired private ExamPaperService paperService; GetMapping(/list) ResponseBody public Result list(RequestParam Integer courseId) { return Result.success(paperService.listByCourse(courseId)); } }前端用 Axios 调用axios.get(/api/paper/list, { params: { courseId: 1 } }).then(res { console.log(res.data); });在线考试系统里比较典型的接口有登录认证接口获取考试列表接口获取试卷题目接口提交试卷接口成绩查询接口教师发布考试接口submit接口是核心学生提交试卷时后端要保证接口的幂等性。也就是同一份试卷不能重复提交否则成绩会被覆盖或重复累计。常见的处理方式是在提交时先检查exam_record中该学生该试卷的记录状态如果已经为“已交卷”直接拒绝并提示。批量任务主要体现在两个地方第一个是 Excel 批量导入试题。教师下载模板录入试题后上传后端用 Apache POI 解析 Excel校验数据后批量写入数据库。核心代码大概是这样Workbook workbook WorkbookFactory.create(inputStream); Sheet sheet workbook.getSheetAt(0); for (Row row : sheet) { if (row.getRowNum() 0) { continue; // 跳过表头 } ExamQuestion question new ExamQuestion(); question.setContent(row.getCell(0).getStringCellValue()); question.setQuestionType((int) row.getCell(1).getNumericCellValue()); question.setOptionA(row.getCell(2).getStringCellValue()); // 继续封装字段 examQuestionMapper.insert(question); }这里要加异常处理和数据校验比如题干为空、答案缺失时跳过或提示错误。批量导入如果不加事务控制就会出现“导入到一半报错前面插进去的数据回滚不干净”的问题。建议在导入方法上加上Transactional注解保证整批数据的原子性。第二个是教师同时给多个学生发布同一场考试。设计上比较简单考试表记录了paper_id和考试时间范围学生登录后通过关联查询判断自己是否在允许参加的名单内。复杂一点的会加一张exam_student关联表指定哪些学生可以参加这场考试。9. 资源占用与性能观察在线考试系统的规模通常不会太大班级考试人数一般几十到几百人因此性能要求不高。对系统的资源占用可以从三个方面观察。内存方面Tomcat 默认 JVM 堆内存一般会给 256MB 左右如果同时加载大量项目或者批量上传 Excel 较大可以在启动脚本中调整堆参数set CATALINA_OPTS-Xms256m -Xmx512m如果运行中频繁出现OutOfMemoryError优先检查是否为图片或 Excel 文件加载过多导致内存溢出而不是急着调 JVM 参数。数据库连接方面SSM 项目常用dbcp、c3p0或druid。如果用的是 Druid可以在启动日志里看到连接池初始化信息。连接池大小默认配置一般够用不建议调太大。如果出现Connection is not available, request timed out要检查是不是连接池配置过小或数据库连接未释放。在线考试过程中数据库压力主要出现在学生提交答案的那个瞬间。如果几百人同时交卷SQL 插入量会陡增。为了优化体验可以减少 N1 查询比如加载试卷时连表查一次把所有题目带出来而不是每题一次查询。还有一个容易被忽略的性能点在线考试倒计时页面的请求频率。有些同学会在前端写一个定时器每隔 1 秒向后端发送一次请求保存答题进度这样会瞬间把数据库请求量拉高。更合理的做法是前端把答题记录保存在本地变量中每分钟自动保存一次或者用户切题时保存一次。10. 常见问题与排查方法SSM 项目跑不起来绝大多数问题集中在环境、依赖、数据库连接和三方配置上。整理一份高频问题排查表如果你启动时遇到报错对照着看。问题现象可能原因排查方式解决方案IDEA 启动报端口被占用8080 被其他进程占用执行netstat -ano | findstr :8080看占用 PID关闭占用进程或修改 Tomcat 端口项目启动后页面 404部署名称不对或没有访问项目根路径检查 IDEA Deployment 中 Application context访问http://localhost:8080/项目名/后台报 ClassNotFoundExceptionMaven 依赖未下载完整或包冲突执行mvn clean compile看错误堆栈删除本地仓库对应 jar 重新拉取或调整版本数据库连接失败MySQL 未启动、账号密码错、驱动不匹配在命令行用 root 登录 MySQL 验证修改 jdbc.properties 配置中文乱码页面编码、数据库编码、连接串编码不一致检查 JSP 页面pageEncoding和 SQL 文件编码统一 utf8连接串加characterEncodingutf8MyBatis 报 Mapped Statements collection does not contain valueMapper 接口与 XML 的 namespace 不匹配检查 XML namespace 是否与接口全类名一致修正 namespace 和 statement id访问 JSP 页面时白屏或 500Controller 返回视图路径不对查看 Tomcat 日志中详细异常检查视图解析器配置和 JSP 文件位置批量导入 Excel 报错POI 版本冲突或格式不支持检查 Excel 文件是否为 xls/xlsx统一使用新版 POI 并处理文件后缀点击交卷没有反应AJAX 请求路径错误或后端异常打开浏览器开发者工具查看 Network修复请求 URL查看后端异常日志Tomcat 启动后自动关闭Servlet 初始化代码抛异常查看控制台完整堆栈根据堆栈修复依赖或配置这里重点提醒SSM 项目里 MyBatis 的 XML 映射文件必须放在 classpath 下如果在src/main/java目录下需要在 pom.xml 中额外配置资源加载否则启动后会报找不到 XML 的问题。build resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource resource directorysrc/main/resources/directory /resource /resources /build这个问题出现频率极高而且报错信息往往不直观建议提前看。11. 最佳实践与使用建议毕业设计项目做完只是第一步要让项目经得起答辩和老师检查建议按照下面的思路整理。第一分目录管理项目文件。网上很多源码把 Java 文件和配置文件混在一起拿到手第一件事不是急着跑而是先看目录结构。规范的分层是controller / service / mapper / entity / common每层职责清晰答辩时可以直接讲分层架构。第二给项目预留一套“最小可运行配置”。数据库脚本、初始化账号、配置文件单独放在sql和doc目录下这样换一台电脑也能快速跑起来。常见的做法是在项目根目录放一个README.md写清楚环境版本、数据库创建脚本、启动步骤。第三密码不要明文存储。SSM 毕设里很多项目直接把用户密码明文存在数据库虽然演示方便但答辩时老师可能会问安全性。建议至少使用 MD5 加盐或 BCrypt 加密。用 Spring 自带的DigestUtils.md5DigestAsHex就能做简单加密String hashedPassword DigestUtils.md5DigestAsHex(password.getBytes());登录校验时把用户输入的密码加密后与数据库比对避免明文密码库信息泄露。需要说明的是MD5 本身并不安全如果项目强调安全性可以替换为 BCrypt 等更强算法这个可以作为系统的一个亮点写入毕业论文。第四数据库脚本要梳理成版本记录。不要只导出一次 SQL 文件每次加表、改字段时同步更新脚本并记录修改内容。毕设答辩常见的一个问题就是“你这系统上线后要改表怎么办”这时候能回答“通过版本化 SQL 脚本管理数据库变更”会让印象分明显提升。第五结合业务场景补充测试数据。一个空荡荡的在线考试系统是没法充分演示的。建议提前录入 30 道以上试题、3 门课程、2 个教师账号、10 个学生账号、并发布一场正在进行中的考试这样打开系统后直接能演示学生进入考试到提交答卷的完整流程。第六明确版权和数据合规边界。如果你使用网上找的题库或试卷资源只用于本地学习、课程设计等授权范围内的用途不要把自己不持有版权的题目重新打包分发也不要采集或抓取其他平台的付费试卷内容用于商用项目。学生信息、考试成绩等属于个人隐私数据涉及真实数据时要注意脱敏系统本身如果部署到公网要设置强密码、及时更新数据库和框架版本避免低版本漏洞被利用。第七保底方案永远保留。答辩前把项目打成 war 包同时保留 IDEA 直接启动的方式。如果现场 Tomcat 端口被占或环境异常至少有一种方式能快速恢复演示避免现场等环境调试导致紧张。12. 总结与下一步借这个 SSM 在线考试系统核心不是“把代码跑起来”而是真正理解一个 Web 项目从数据库设计到功能闭环的全过程。最值得花时间研究的地方有三个表与表之间的关系、随机组卷和自动评分的实现思路、以及拦截器权限控制的原理。这三个点也是最容易被答辩老师追问的地方。第一次运行时建议先小参数验证导入少量试题、发布一场时长 30 分钟的小型考试、用学生账号跑通整场考试然后再扩充题库和用户数据。最容易踩的坑集中在两处一是 Maven 依赖版本冲突导致启动失败二是 MySQL 8.0 时区问题引发的数据库连接报错。这两类问题在本地环境最容易排查提前处理好能省下大量时间。如果还想继续扩展可以把这套系统往两个方向升级一是把前端改成 Vue Element UI前后端彻底分离二是引入 Redis 保存学生答题状态减少数据库频繁写入并支持断线续考。做完这两步项目的技术深度就不仅仅是“毕设水平”放到简历里也有拿得出手的亮点。先动手把基础链路跑通再逐个模块优化反而比急着堆功能更稳妥。