文章目录
一、项目背景与需求拆解
最近帮朋友公司做了个在线考试系统(别问为啥接私活,问就是穷T_T),今天就把这个价值8W的项目拆解成教学版!系统核心功能包括:
- 用户权限管理(考生/教师/管理员)
- 题库管理(支持Excel批量导入!!!)
- 智能组卷策略(按难度/知识点随机抽题)
- 在线考试模块(防作弊功能是重点)
- 自动阅卷+人工复核双模式
(悄悄说)这个项目最难的不是技术实现,而是考试防作弊的逻辑设计,后面会重点讲解我们的解决方案!
二、技术选型避坑指南
2.1 基础框架选择
- Spring Boot 2.7 + MyBatis Plus(真香!)
- MySQL 8.0 + Redis 6(缓存考试题目必备)
- Shiro权限框架(比Spring Security更轻量)
(血泪教训)千万别用JSP!!!我们改用Thymeleaf模板引擎后,前后端分离真香现场~
2.2 第三方服务集成
- 阿里云OSS存储试卷附件
- 腾讯云短信验证码服务
- 七牛云实时音视频监控(防作弊核心)
- Swagger 3.0接口文档(后端开发必备)
三、数据库设计实战
3.1 核心表结构
-- 考试场次表(重点!)
CREATE TABLE exam_session (
id BIGINT PRIMARY KEY COMMENT '主键',
exam_name VARCHAR(100) NOT NULL COMMENT '考试名称',
start_time DATETIME NOT NULL COMMENT '开始时间',
end_time DATETIME NOT NULL COMMENT '结束时间',
status TINYINT DEFAULT 0 COMMENT '0未开始 1进行中 2已结束'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 题目表(注意索引优化)
CREATE TABLE question (
id BIGINT PRIMARY KEY,
content TEXT NOT NULL,
question_type TINYINT COMMENT '1单选 2多选 3判断',
answer VARCHAR(500) COMMENT 'JSON格式存储选项答案',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
(超级重要)一定要给频繁查询的字段加索引!比如exam_session的status字段,question表的create_time字段。
四、核心模块实现
4.1 智能组卷算法
// 按难度系数随机抽题
public List<Question> generatePaper(ExamRule rule) {
// 步骤1:查询满足条件的题目池
List<Question> pool = questionMapper.selectByCondition(rule);
// 步骤2:按权重随机分配
return pool.stream()
.sorted(Comparator.comparingDouble(q -> Math.random() * q.getWeight()))
.limit(rule.getTotalCount())
.collect(Collectors.toList());
}
(黑科技)使用Fisher-Yates洗牌算法保证题目随机性,避免出现重复试卷!
4.2 防作弊三件套
- 人脸识别:考试前调用活体检测API
- 切屏监控:通过WebSocket实时上报焦点事件
- 随机题目:每个考生题目顺序和选项顺序不同
五、项目部署踩坑实录
5.1 环境搭建
# 使用Docker一键部署(真香!)
docker-compose up -d mysql redis nginx
# Spring Boot打包命令
mvn clean package -DskipTests
5.2 性能优化
- 使用Redis缓存热点数据(题库、配置信息)
- MySQL读写分离(用MyCat中间件实现)
- 静态资源CDN加速(每月省下50%流量费)
六、常见问题排雷指南
❌ 问题:考试提交时网络中断怎么办?
✅ 方案:实现本地缓存自动重传机制
❌ 问题:高并发时系统卡死?
✅ 方案:使用Sentinel实现流量控制
❌ 问题:考生照片上传失败?
✅ 方案:前端分片上传 + 断点续传
七、项目扩展方向
- 增加AI自动阅卷(NLP文本分析)
- 接入微信小程序端
- 实现考试数据分析大屏
- 添加错题本功能(考生专属)
(课后作业)试着在项目中添加【考试倒计时】功能,要求精确到秒且考虑时区问题,遇到问题欢迎评论区交流~
项目源码获取:关注公众号回复"考试系统"获取精简版代码(注:已去除敏感业务逻辑)