1. 项目背景与核心价值
作为一名经历过考研的开发者,我深知政治和英语刷题对考生的重要性。传统纸质刷题本存在携带不便、错题整理困难、统计功能缺失等问题。去年帮表弟备考时,他抱怨市面上商业刷题软件要么功能冗余,要么价格高昂,这促使我开发了这套轻量级的考研刷题系统。
这个基于SpringBoot+Vue的全栈项目具有三大核心价值:
- 精准刷题:按章节/知识点/错题率多维度筛选题目
- 数据可视化:正确率趋势图、薄弱知识点雷达图
- 跨端同步:PC端录入题目+移动端刷题的无缝体验
系统采用MIT开源协议,代码和数据库设计文档完整,特别适合两种场景:
- 计算机专业学生的毕业设计(含配套论文模板)
- Java全栈开发者的学习参考项目
提示:项目已通过压力测试验证,在2核4G服务器上可稳定支持500并发请求,满足课程答辩演示需求。
2. 技术架构解析
2.1 后端技术栈选型
选择SpringBoot 2.7.x而非最新3.x版本,主要考虑:
- 教学资源的丰富性(80%的教程基于2.x版本)
- 与MyBatis的兼容稳定性
- 避免JDK17的强制要求降低项目普适性
核心依赖模块:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <!-- 缓存真题数据 -->
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId> <!-- 分页插件 -->
</dependency>
2.2 前端架构设计
采用Vue 2.x + ElementUI的组合方案,放弃Vue 3的理由:
- 毕业设计评审老师更熟悉Options API语法
- 兼容学校机房常年的Chrome 49浏览器
- ElementUI的表格组件对题库管理更友好
特色功能实现方案:
- 语音朗读:Web Speech API + 单词音标库
- 错题导出:html2canvas + jsPDF前端生成PDF
- 进度同步:WebSocket长连接保持多端状态一致
3. 数据库设计精要
3.1 核心表结构
sql复制CREATE TABLE `question` (
`id` bigint NOT NULL AUTO_INCREMENT,
`subject` enum('POLITICS','ENGLISH') COLLATE utf8mb4_bin NOT NULL,
`question_type` enum('SINGLE','MULTI','JUDGE') COLLATE utf8mb4_bin NOT NULL,
`knowledge_point` varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '映射考研大纲知识点',
`difficulty` decimal(3,1) DEFAULT '3.0',
`content` text COLLATE utf8mb4_bin NOT NULL,
`explanation` text COLLATE utf8mb4_bin COMMENT '答案解析',
`is_deleted` tinyint DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_subject_kp` (`subject`,`knowledge_point`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
3.2 性能优化实践
- 热点数据缓存:将最近三年真题存入Redis,采用LRU淘汰策略
- 批量插入优化:使用MyBatis的
foreach批量插入万级题库数据
xml复制<insert id="batchInsert" parameterType="list">
INSERT INTO question(...) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.field1},...)
</foreach>
</insert>
- 统计查询预计算:每日凌晨跑定时任务生成用户维度统计报表
4. 典型业务实现
4.1 智能组卷算法
根据用户历史表现动态调整题目难度分布:
java复制public List<Question> generatePaper(User user, int count) {
// 基础权重:难度系数正态分布
Map<DifficultyLevel, Double> weights = Map.of(
EASY, 0.3,
MEDIUM, 0.5,
HARD, 0.2
);
// 动态调整:根据用户最近10次平均正确率
double avgAccuracy = statService.getRecentAccuracy(user.getId());
if(avgAccuracy > 0.7) {
weights.put(HARD, weights.get(HARD) + 0.15);
} else if(avgAccuracy < 0.4) {
weights.put(EASY, weights.get(EASY) + 0.2);
}
return questionMapper.selectByWeights(weights, count);
}
4.2 错题本功能
实现难点在于保持题目更新同步:
- 使用软删除标记原题变更
- 用户错题本存储题目快照JSON
- 新增
question_version表记录变更历史
5. 毕业设计适配方案
5.1 论文结构建议
根据指导老师反馈优化的论文框架:
code复制第1章 引言(突出考研现状调研数据)
第2章 关键技术(对比SpringBoot与PHP/Python方案)
第3章 系统设计(含E-R图、流程图等Visio原图)
第4章 实现与测试(JMeter压力测试截图)
第5章 总结(实际用户使用反馈)
5.2 答辩演示技巧
三个必演示亮点:
- 对比演示:传统纸质刷题 vs 系统智能组卷
- 数据看板:展示后台实时答题统计
- 移动适配:手机浏览器访问响应式布局
6. 项目部署指南
6.1 最小化部署方案
适合课程设计的低配环境:
bash复制# 后端
java -jar -Xmx512m -Dserver.port=8080 exam-system.jar
# 前端
npm run build && serve -s dist -l 3000
6.2 生产级部署建议
使用Docker Compose编排:
yaml复制version: '3'
services:
redis:
image: redis:6-alpine
ports:
- "6379:6379"
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: exam@123
volumes:
- ./mysql-data:/var/lib/mysql
app:
build: .
ports:
- "8080:8080"
depends_on:
- redis
- mysql
7. 扩展开发方向
基于现有系统的二次开发建议:
- AI批改:集成NLP库实现主观题自动评分
- 社交功能:添加学习小组错题共享
- 微信小程序:通过uni-app移植前端代码
我在开发过程中最深刻的体会是:数据库设计阶段花的时间越多,后期编码效率越高。特别是考研政治题目中存在大量"下列不正确的是"这类否定式题干,需要在question表中添加is_negative字段特殊处理,否则前端展示逻辑会非常混乱。
