1. 企业级在线考试系统架构解析
这套基于SpringBoot+Vue+MyBatis的在线考试系统,是我在参与某大型教育机构数字化转型项目时的核心产出。不同于市面上简单的答题系统,我们设计的这套方案需要支撑日均10万+的并发考试请求,同时保证系统的高可用性和数据安全性。
1.1 为什么选择这个技术栈?
SpringBoot+Vue+MyBatis的组合在2018年我们做技术选型时还不是主流方案,但经过多次压力测试和原型验证,我们发现这个技术栈在开发效率、性能表现和团队适配度上达到了最佳平衡:
-
SpringBoot:当时对比了传统的SSM框架和SpringBoot,后者在微服务支持和自动化配置方面的优势明显。特别是当需要快速扩展考试监控、阅卷分析等子模块时,SpringBoot的starter机制让新功能集成变得异常简单。
-
Vue.js:相比Angular和React,Vue的渐进式特性更适合教育类应用。我们的教师用户很多不擅长复杂操作,Vue的单文件组件和响应式数据绑定可以构建更直观的界面。实测下来,同样功能的考试管理页面,Vue版本比之前jQuery实现的版本代码量减少40%。
-
MyBatis:考虑到考试系统有大量复杂的数据统计查询(如按班级、科目、时间维度分析成绩),MyBatis的SQL灵活性比JPA更符合需求。我们特别设计了动态SQL模板来处理多条件组合查询。
技术选型心得:不要盲目追求新技术,2018年已经有团队推荐我们用Spring Cloud,但实际评估发现单体架构足够支撑初期需求。直到用户量突破50万后才开始做服务拆分。
1.2 核心业务场景分析
系统主要解决三类用户的痛点:
管理员视角:
- 需要同时管理数百场考试的开考、监考、阅卷流程
- 实时监控服务器负载,预防考试期间系统崩溃
- 按部门/角色精细化控制权限
教师视角:
- 批量导入上千道试题的需求很常见
- 自动组卷时要能按知识点、难度系数筛选题目
- 主观题阅卷需要协作批改功能
学生视角:
- 考试倒计时、自动保存答题进度是刚需
- 成绩分析要能看到错题解析和知识点薄弱环节
- 移动端适配必须完善(实测30%考试通过手机完成)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与优化实战
2.1 核心表结构设计解析
用户表(user_profile)的设计有几个关键点值得说明:
sql复制CREATE TABLE `user_profile` (
`user_id` BIGINT NOT NULL COMMENT '使用雪花算法生成ID,避免自增ID暴露用户量',
`password_hash` VARCHAR(100) NOT NULL COMMENT 'BCrypt加密存储,要求强度10',
`role_type` TINYINT NOT NULL COMMENT '1-超级管理员 2-学科管理员 3-教师 4-学生',
`register_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_login` DATETIME COMMENT '用于识别僵尸账号',
PRIMARY KEY (`user_id`),
UNIQUE KEY `idx_account` (`account_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
设计考量:
- 放弃使用邮箱/手机号作为账号,采用独立account_name字段,方便后期支持多种登录方式
- 密码存储使用BCrypt而不是MD5/SHA,每个用户的salt独立生成
- utf8mb4_bin排序规则确保账号大小写敏感
2.2 题库设计的特殊处理
题库表(question_bank)需要支持多种题型:
sql复制CREATE TABLE `question_bank` (
`question_id` BIGINT NOT NULL,
`question_type` TINYINT NOT NULL COMMENT '1-单选 2-多选 3-填空 4-判断 5-简答',
`question_text` TEXT NOT NULL COMMENT '支持富文本格式',
`options_json` JSON COMMENT '用于存储动态选项,替代原来的option_a/b/c/d',
`answer_schema` JSON NOT NULL COMMENT '根据题型定义不同的答案结构',
`knowledge_tags` VARCHAR(255) COMMENT '知识点标签,逗号分隔',
`difficulty` DECIMAL(3,1) COMMENT '通过算法动态调整',
PRIMARY KEY (`question_id`),
FULLTEXT KEY `idx_content` (`question_text`) COMMENT '支持内容搜索'
) ENGINE=InnoDB;
改进点:
- 用JSON类型字段替代原来的固定选项字段,支持选项数量动态变化
- 增加全文索引提升搜索效率,实测百万级题库查询速度从2s优化到
