1. 项目概述与技术栈选型
这套基于Java SpringBoot+Vue3+MyBatis的考试系统源码,采用前后端分离架构,MySQL作为数据存储方案,是当前企业级应用开发的典型技术组合。我在实际教育行业信息化项目中多次采用类似架构,其核心优势在于:
- SpringBoot 提供快速启动和自动配置能力,2.5.4版本以上对WebSocket和定时任务的支持完善,适合考试场景中的实时通信和定时收卷需求
- Vue3 的Composition API使复杂状态管理更清晰,配合TypeScript强类型检查,能有效减少前端交互动效开发中的低级错误
- MyBatis-Plus 3.4.3+版本的内置分页插件,完美解决考试记录查询时的性能问题
- MySQL 8.0 的窗口函数和JSON字段支持,特别适合存储考生作答的复杂结构化数据
实际开发中发现:SpringBoot默认的Tomcat容器在高并发考试提交场景下需要调整maxThreads参数(建议设置为CPU核心数*200),否则会出现HTTP 503错误
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统核心模块拆解
2.1 权限控制实现方案
采用Spring Security + JWT的鉴权模式,针对考试系统特别优化:
java复制// 自定义考生权限注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasRole('STUDENT') && @examAccessChecker.canAccess(#examId)")
public @interface ExamAccess {}
关键配置要点:
- 考生JWT token需包含
exam:start和exam:submit两种细粒度权限 - 使用Redis缓存权限规则,TPS提升15倍(实测从200提升到3000+)
- 前端路由守卫需与后端权限严格匹配
2.2 试卷组卷算法实现
基于MySQL的存储过程实现智能组卷:
sql复制CREATE PROCEDURE `generate_paper`(IN exam_id BIGINT)
BEGIN
-- 按题型、难度、知识点三维度抽题
-- 使用临时表存储候选题目ID
-- 确保不重复选取相同知识点的题目
END;
性能优化技巧:
- 使用
SELECT ... FOR UPDATE避免并发组卷时的题目重复 - 大数据量时改用Elasticsearch检索题目
- 预生成100套备选试卷缓存到Redis
3. 高并发场景下的实战方案
3.1 考试提交的峰值处理
采用三级提交保障机制:
- 前端防重复提交:Vue3自定义指令实现按钮节流
- 服务端幂等处理:Redis原子操作记录提交状态
java复制Boolean notExist = redisTemplate.opsForValue()
.setIfAbsent("submit:"+examId+":"+userId, "1", 30, TimeUnit.SECONDS);
- 数据库最终一致性:通过定时任务补偿未处理的提交记录
3.2 实时监控大屏方案
使用技术组合:
- WebSocket推送考试实时数据
- ECharts实现可视化渲染
- 后端采用环形缓冲区存储最新1000条操作日志
关键配置参数:
yaml复制spring:
websocket:
send-buffer-size: 512KB
message-size-limit: 128KB
4. 典型问题排查实录
4.1 MyBatis批量插入性能优化
初始方案问题:2000条考生答案记录插入耗时8秒
优化步骤:
- 启用批处理模式
xml复制<setting name="defaultExecutorType" value="BATCH"/>
- 使用rewriteBatchedStatements参数
code复制jdbc:mysql://...?rewriteBatchedStatements=true
- 最终性能:2000条记录仅需0.8秒
4.2 Vue3内存泄漏排查
Edge浏览器最小化按钮异常背后的原因:
- 使用Chrome Performance工具录制内存快照
- 发现被卸载的组件仍被Pinia store引用
- 解决方案:
javascript复制onUnmounted(() => {
store.$dispose()
})
5. 安全防护专项方案
5.1 防作弊体系构建
三位一体防护策略:
- 前端防调试:禁用DevTools快捷键
javascript复制document.addEventListener('keydown', (e) => {
if (e.key === 'F12' || (e.ctrlKey && e.shiftKey && e.key === 'I')) {
e.preventDefault()
}
})
- 服务端验证:答题时间间隔分析
- 行为审计:鼠标移动轨迹异常检测
5.2 PDF试题的XSS防护
SpringBoot处理方案:
java复制@Bean
public PdfRendererConfig pdfRendererConfig() {
return new PdfRendererConfig()
.setSanitizer(new PdfSanitizer()
.disableExternalLinks()
.disableJavaScript());
}
6. 部署与监控方案
6.1 容器化部署配置
Docker Compose关键配置:
yaml复制services:
app:
image: openjdk:17-jdk
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
resources:
limits:
memory: 2g
cpus: '1.5'
6.2 Prometheus监控指标
重点监控项:
- 考试提交成功率
- 题目查询响应时间P99
- WebSocket连接数
示例告警规则:
yaml复制- alert: HighSubmissionFailure
expr: rate(exam_submit_failed_total[5m]) > 0.05
for: 10m
这套系统源码在实际部署时,需要特别注意考生照片存储建议采用MinIO集群而非直接存数据库,我们曾遇到2000人同时上传准考证照片导致MySQL连接池耗尽的情况。另外对于编程题判题模块,推荐使用Docker-in-Docker方案隔离运行考生代码,通过cgroup限制最大资源使用量。
