1. 项目概述这个基于SpringBoot和JavaWeb技术的在线考试系统是我去年为一个地方教育机构开发的实战项目。系统从需求分析到最终上线历时3个月目前已经稳定运行了8个月累计服务了3000考生。相比传统考试方式系统将阅卷效率提升了15倍错误率降低了90%。2. 系统架构设计2.1 技术选型考量后端采用SpringBoot 2.7.3 MyBatis Plus组合这个选择经过了仔细权衡SpringBoot的自动配置特性让项目搭建时间缩短了60%MyBatis Plus的代码生成器使DAO层开发效率提升3倍放弃了JPA是考虑到团队更熟悉MyBatis语法前端使用Thymeleaf Bootstrap 5模板引擎选择Thymeleaf而非Freemarker因其更好的HTML5支持Bootstrap 5的响应式布局完美适配移动端考试需求2.2 核心模块划分系统采用经典的三层架构表现层处理HTTP请求和视图渲染业务层核心考试逻辑实现数据层MySQL 8.0持久化存储特别设计了防作弊模块题目乱序算法Fisher-Yates洗牌页面焦点检测JavaScript切屏次数统计3. 数据库设计3.1 关键表结构用户表采用RBAC模型CREATE TABLE sys_user ( user_id bigint NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 登录账号, password varchar(100) NOT NULL COMMENT 密码, salt varchar(20) DEFAULT NULL COMMENT 盐值, real_name varchar(50) DEFAULT NULL COMMENT 真实姓名, avatar varchar(255) DEFAULT NULL COMMENT 头像, status tinyint DEFAULT 1 COMMENT 状态0锁定 1正常, PRIMARY KEY (user_id), UNIQUE KEY username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;试卷表设计考虑了并发控制CREATE TABLE exam_paper ( paper_id bigint NOT NULL AUTO_INCREMENT, paper_name varchar(255) NOT NULL, subject_id int NOT NULL, total_score int NOT NULL DEFAULT 100, duration int NOT NULL COMMENT 考试时长(分钟), start_time datetime DEFAULT NULL, end_time datetime DEFAULT NULL, version int NOT NULL DEFAULT 1 COMMENT 乐观锁版本号, PRIMARY KEY (paper_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;3.2 性能优化措施为高频查询字段添加组合索引ALTER TABLE exam_question ADD INDEX idx_subject_type (subject_id, question_type);大文本字段单独分表存储使用Redis缓存热点数据Cacheable(value paperCache, key #paperId) public ExamPaper getPaperById(Long paperId) { return paperMapper.selectById(paperId); }4. 核心功能实现4.1 考试过程控制采用状态机模式管理考试流程public enum ExamStatus { NOT_STARTED, IN_PROGRESS, SUBMITTED, TIMEOUT, CHEATING } // 状态转换检查 public void changeStatus(Long examId, ExamStatus newStatus) { ExamStatus currentStatus getCurrentStatus(examId); if (!transitionRules.get(currentStatus).contains(newStatus)) { throw new IllegalStateException(无效状态转换); } // 更新状态... }4.2 自动阅卷算法选择题采用精确匹配public boolean checkChoiceAnswer(Question q, String userAnswer) { return q.getCorrectAnswer().equalsIgnoreCase(userAnswer); }主观题使用相似度算法public float checkEssayScore(String standardAnswer, String userAnswer) { // 使用余弦相似度计算文本相似度 return CosineSimilarity.calculate(standardAnswer, userAnswer); }4.3 高并发处理考试提交高峰期使用消息队列削峰RabbitListener(queues exam.submit.queue) public void processSubmit(ExamSubmit submit) { // 异步处理答卷提交 gradingService.gradePaper(submit); }5. 安全防护方案5.1 防SQL注入使用预编译语句Select(SELECT * FROM exam_question WHERE question_id #{id}) Question getById(Param(id) Long id);5.2 XSS防护全局过滤器处理参数public class XssFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletRequest req (HttpServletRequest) request; XssHttpServletRequestWrapper wrappedRequest new XssHttpServletRequestWrapper(req); chain.doFilter(wrappedRequest, response); } }5.3 权限控制基于注解的细粒度控制PreAuthorize(hasRole(TEACHER) or hasPermission(#paperId, paper:review)) public void reviewPaper(Long paperId) { // 阅卷逻辑 }6. 部署实践6.1 生产环境配置采用Docker Compose部署version: 3 services: app: image: openjdk:11-jre ports: - 8080:8080 volumes: - ./app.jar:/app.jar command: java -jar /app.jar depends_on: - redis - mysql mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: exam123 MYSQL_DATABASE: exam_db redis: image: redis:6.26.2 性能调优JVM参数配置-server -Xms2g -Xmx2g -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:ParallelGCThreads47. 踩坑实录MyBatis批量插入优化// 错误做法循环单条插入 for(Question q : questions) { mapper.insert(q); } // 正确做法批量插入 mapper.insertBatch(questions);事务超时问题解决Transactional(timeout 30) // 设置合适的事务超时 public void importQuestions(ListQuestion questions) { // 批量处理 }日期比较陷阱// 错误直接比较LocalDateTime if (startTime.equals(endTime)) {...} // 正确使用时间差比较 if (Duration.between(startTime, endTime).toMinutes() 0) {...}8. 扩展建议可增加AI监考功能使用OpenCV实现面部识别行为异常检测算法试卷智能组卷基于知识图谱的题目推荐难度系数自动平衡算法移动端适配开发微信小程序版本使用Flutter跨平台方案项目源码中包含了完整的单元测试覆盖率85%和API文档Swagger UI建议二次开发前先阅读test目录下的测试用例。