返回作品

在线考试系统

创建于 2026 年 3 月 22 日

标签
  • Java
  • Spring Boot 3
  • MyBatis
  • MySQL
  • Redis
  • Docker
  • Vue 3
  • Element Plus
  • Vite
  • CodeMirror
  • ECharts

项目介绍

这是一套基于若依(RuoYi-Vue)深度定制的在线考试系统,业务覆盖一条完整的考试链路:出题人维护题库,管理员创建考试并组卷,学生在线作答,系统对客观题自动判分、对编程题用 Docker 判题引擎跑测试用例,主观题由教师人工阅卷,最后沉淀出成绩分段与及格率等统计分析。系统在若依原有的用户、部门、角色、菜单、字典、日志、定时任务等基础能力之上,新增 dszy_exam 业务模块,把”题库—试卷—考试—作答—判题—阅卷—成绩”全部固化下来。

考试对象模型设计得很完整:exam_info 承载考试名称、类型、密码、时长、总分与起止时间,subject_info 承载题目内容、分数、难度、图片与解析,exam_subject_info 在组卷时把题目以快照形式写入考试卷(含 subject_details JSON 存选项与答案),exam_user_answer 记录每位考生的答题册(客观题分、总分、阅卷人与阅卷意见),exam_user_answer_details 记录每道题的作答、得分、判题状态与耗时内存。整个流程有据可查,试卷与题库解耦,考后改题库也不会影响已发布的考试。

项目架构

项目分为两端:online-examination-system-master 为后端,沿用若依多模块结构(ruoyi-admin / ruoyi-framework / ruoyi-common / ruoyi-system / ruoyi-quartz / ruoyi-generator),业务集中在 dszy_exam 单模块中,基于 Java 17、Spring Boot 3、MyBatis、MySQL 8、Redis 与 Druid;online-exam-admin-vue3 为 Vue 3.4 + Vite 5 + Element Plus 2.4 + Pinia + CodeMirror(代码编辑器)的前端管理端。

后端按职责分四层:admin 包暴露管理端接口(考试管理 /api/v1/exam/info、题库管理 /api/v1/subject/info、成绩统计 /api/admin/exam/score、教师/学生管理),app 包暴露学生端接口(考试列表、答题册保存 /api/v1/exam/userAnswer、阅卷 /api/v1/exam/review、练习判题 /api/v1/practice),judge 包是独立的判题引擎——基于 docker-java 3.7.0 连接本机 Docker,按语言镜像创建临时容器编译运行代码,限制单核 CPU、内存上限并禁用网络,执行完毕即销毁容器,同时支持本地模式(直接用本机 javac/node/python3/php 执行);examInfo 包用策略模式实现题型处理器(SubjectTypeHandler 接口 + 工厂),每种题型一个 Handler,单选、多选、判断直接比对答案,填空支持多答案匹配,简答与编程题走人工/自动判题通道。

数据库以 sql/exam_module_all.sql 一键安装,包含考试、题库、判题相关的 19 张业务表(subject_radio / subject_multiple / subject_judge / subject_blanks / subject_brief / subject_code / subject_code_testcase 等)以及 v_exam_score_statv_exam_teacherv_exam_student 三个统计视图;exam_score_segment_rule 定义成绩分段规则,exam_student_assign 支持把学生批量分配到考试。交卷后的判题走异步通道:UserAnswerTask 从 Redis 队列拉取答题册消息,用有界线程池(CallerRunsPolicy 拒绝策略)并发执行客观题判分与编程题判题,避免阻塞主流程。

核心功能

  • 六题型题库管理:支持单选、多选、判断、填空、简答、操作题(编程)六种题型,题目可挂分类树(subject_category + subject_category_relational 多对多关联)、难度、图片与答案解析;题库页支持 Excel 模板导入(/importTemplate/importData),编程题可配置多组测试用例(subject_code_testcase)、时间限制与内存限制,并能开关”用户测试用例判题”。
  • 考试编排与在线作答:创建考试可设置考试类型、入场密码(4-6 位,前端二次校验)、考试时长(分钟)、总分与起止时间;组卷时从题库选题或批量导入,题目以快照写入 exam_subject_info,支持拖拽排序;学生从考试列表进入,需要密码的考试先校验密码,作答页按题型渲染(单选/多选/判断/填空/简答/编程代码编辑器),顶部倒计时实时跳动,已答题目标记进度,支持上一题/下一题切换与提交。
  • 编程题 Docker 判题:判题引擎支持 C、C++、Java、JavaScript、Python、PHP、Go 七种语言,按 code_language 匹配语言镜像(如 openjdknode:alpinepython:alpinephp:8.2-cli-alpine),在临时容器中挂载代码卷、禁用网络、限制内存与单核 CPU,编译/运行超时分别控制(编译 5s,执行按题目配置,默认 1s),逐组测试用例执行并汇总通过数、总用例数、最大耗时与最大内存;判题结果区分执行成功、编译出错、运行出错、执行超时四类,逐题写入 judge_detail_json
  • 自动判题与人工阅卷:客观题(单选/多选/判断)交卷即自动评分,填空支持多答案(逗号分隔)匹配;主观题(简答、编程)进入阅卷列表(区分待批阅/已完成,展示客观题分与待阅题数),阅卷人对每题打分、写阅卷意见,编程题可查看判题详情甚至一键重判(/rerun),编程题未配置自动判题用例时也可按人工复核处理。
  • 成绩统计与分析:学生成绩页按考试查看每位考生得分与明细;成绩分段统计按 exam_score_segment_rule 规则统计各分数段人数;成绩分析页汇总每场考试的提交人数、待批阅数、已完成数、平均分、最低分、最高分与及格率;教师/学生管理页维护角色并批量分配学生到考试,配合若依原生权限体系实现教师、学生、管理员三类账号的访问控制。
  • 学生刷题练习:练习页支持按题型、难度筛选后”随机一题”,单选/多选/判断即时比对答案,填空与简答可对照参考答案,编程题直接在 CodeMirror 编辑器中写代码并调用判题引擎实时执行,适合考前刷题与教学演示。

功能截图

暂无运行截图。

快速上手

数据库部分执行 sql/exam_module_all.sql(表结构 + 字典 + 初始化数据 + 菜单权限一键安装),项目根目录还有 sql/dszy_exam_1028.sqldszy_exam_1106.sql 等历史版本脚本可供对照。后端进入 online-examination-system-master,修改 ruoyi-adminapplication-druid.yml(数据库)与 application.yml(Redis)后启动 RuoYiApplication,默认账号 admin / admin123;若启用编程题判题,按 docs/JUDGE_DOCKER_SETUP.md(Docker 模式)或 docs/JUDGE_LOCAL_SETUP.md(本地模式)准备语言环境,在配置中设置 judge.runtime.modedocker.serverHost

前端进入 online-exam-admin-vue3,按 .env.development 配置后端地址后执行 npm installnpm run dev,登录管理端即可使用题库管理、考试管理、在线考试、阅卷、成绩统计与练习刷题等模块;bin/ 目录提供了 Windows 下的一键构建、打包与运行脚本,npm run build:prod 可产出生产包。

总结

这个项目把教育考试里最重的两件事都做扎实了:一是试卷与题库的建模——六种题型、分类多对多、组卷快照、考试密码与时间窗控制,覆盖了从出题到发布的完整闭环;二是判题——客观题即时评分、主观题人工阅卷,而最有分量的是编程题的 Docker 判题引擎,七种语言、按用例自动判题、时间/内存/单核/禁网的多维约束,加上 Redis 队列 + 线程池的异步判题通道,让它不止是一个”答题系统”,而是一个具备 OJ 能力的考试平台。成绩分段、及格率、教师/学生分配与练习刷题等配套能力,也让学校、培训机构可以开箱即用。

后续可扩展的方向包括:试卷随机抽题与自动组卷策略、防作弊(切屏检测/人脸核验)、编程题用例并行执行与得分细则,以及把成绩报表导出成 Excel/PDF 供归档。