夜雨聆风学习资料网

ARTICLE · 1155651

在线考试系统:题库、组卷、防作弊、自动判分

在线考试系统:题库、组卷、防作弊、自动判分

📝 在线考试系统 — 题库 · 组卷 · 防作弊 · 自动判分

Django 6 + SQLite + Bootstrap 5 全栈开发实战

👤 公众号作者

学校每学期的测验、期中、期末考试都离不开一套可靠的考试系统,商业平台要么收费,要么难以按自己的题库和班级定制。于是我抽空用 Django 开发了这套在线考试系统:题库管理、智能组卷、防作弊答题、自动判分、成绩分析一站式覆盖,内置 146 道初中信息技术题与 13 个学科,开箱即用。

3

角色体系

146

内置试题

13

学科分类

43

自动化测试

📌 系统架构

单体 Django 应用,MVT 架构,前端 Bootstrap 5 走 CDN 免 Node 构建,SQLite 零配置即用:

┌────────────────────────────────────────────────┐ │            在线考试系统 · Django 6.1             │ ├──────────────┬─────────────┬──────────────────┤ │  👤 管理员    │  🍎 教师     │  🎓 学生          │ │  用户/班级    │  题库/组卷    │  答题/查分        │ │  Excel 导入  │  报表/阅卷    │  成绩/错题本      │ ├──────────────┴─────────────┴──────────────────┤ │   exams 应用 + users 应用  ·  35 + 16 条路由    │ ├───────────────────────────────────────────────┤ │   SQLite · Bootstrap 5 · Chart.js · OCR       │ └────────────────────────────────────────────────┘

urls.py 路由入口

urlpatterns = [     path('admin/django/', admin.site.urls),     path('exams/', include('exams.urls')),   # 题库/考试/答题     path('users/', include('users.urls')),   # 登录/用户/班级     path('', RedirectView.as_view(pattern_name='dashboard')), ]

图 1 · 登录页

三种角色统一入口

👥 三角色功能总览

角色
核心能力
管理员
系统概览、用户管理(Excel 批量导入学生,上限 2000 行)、班级管理,并拥有教师全部能力
教师
题库管理
(单选/多选/判断/填空/解答、学科分类、CSV 导入导出、智能导入:PDF·Word·图片OCR)、考试管理(组卷/发布到班级/随机题序/切屏检测/一键复制)、成绩报表(分数段分布·每题正确率·CSV 导出)、解答题人工阅卷
学生
我的考试、在线答题(倒计时/断点续考/防切屏)、成绩查询与答卷回看、错题本(按知识点筛选)

图 2 · 管理员仪表盘

师生/班级/题库/考试总览

图 3 · 教师仪表盘

教学数据一览

图 6 · 智能组卷

选题组卷,逐题设置分值

📥 三种批量导入

入口
格式
说明
题库 → CSV 导入
.csv
表头感知:列顺序不限、选项只写实际数量;末尾「学科」列可选;兼容无表头旧格式
题库 → 智能导入
.pdf .docx .txt.md .jpg .png
自动识别题号/选项/答案/解析/题型标注;容忍全角标点与 OCR 粘连文本;缺答案跳过提示;同题干去重
用户 → Excel 导入
.xlsx
列任意顺序;已存在则更新(密码留空不改);班级不存在自动创建;可下载模板

图 4 · 题库管理

146 道内置题,按学科筛选

图 5 · 智能导入

PDF/Word/图片 OCR 解析成题

智能导入解析示例(text_importer.py 自动结构化)

1.(单选)下列属于输入设备的是( ) A.显示器 B.打印机 C.键盘 D.音箱 答案:C 解析:键盘把信息送入计算机。         ↓  自动解析 q_type='single'  answer='C'  options=['显示器','打印机','键盘','音箱'] knowledge_point='计算机硬件'  analysis='键盘把信息送入…'

🛡️ 防作弊答题机制

答题页是整套系统最核心的部分,五重机制保证考试公平:

  • 🎲 随机题序
     — 首次进入时生成并持久化到 ExamRecord.question_order,刷新页面顺序不变,前后桌拿到的卷面不同
  • 💾 断点续考
     — 作答即存(改动即时保存 + 每 15 秒兜底),断网、误关页面后续考,剩余时间 = 截止时间 − 当前
  • 📱 防切屏
     — 监听 visibilitychange 上报计数,超过上限(默认 5 次)强制交卷并在报表标记
  • ⏱️ 自动交卷
     — 倒计时归零或超过考试结束时间,系统自动提交,绝不漏卷
  • 🔔 5 分钟提醒
     — 非阻塞横幅提示,整场仅出现一次,不打断答题
# 交卷判分核心(exams/services.py · submit_record)for eq in record.exam.exam_questions:     if q.q_type == 'essay':         answer.graded = False# 解答题 → 人工阅卷elif q.q_type == 'fill_blank':         correct = 模糊匹配(q.fuzzy_match)  # 可忽略大小写/标点else:         correct = answer.selected == q.answer  # 精确匹配     answer.got_score = eq.score if correct else0  record.score = round(total, 1)   # 交卷即出分

图 8 · 在线答题

倒计时/随机题序/防切屏

📊 成绩分析

  • 总体指标
     — 平均分、最高分、最低分、及格率一屏掌握
  • 分数段分布
     — 0-59 / 60-69 / 70-79 / 80-89 / 90-100 五段柱状图(Chart.js)
  • 每题正确率
     — 逐题统计答对比例,快速定位薄弱题目
  • CSV 导出
     — 学号、姓名、班级、得分、是否及格、开考/交卷时间、切屏次数
  • 答卷回看
     — 交卷后逐题对照作答与标准答案、解析(可配置是否显示)

图 7 · 成绩报表

分数段分布 + 每题正确率

图 9 · 答卷回看

逐题对照作答与解析

图 10 · 错题本

按知识点筛选薄弱环节

💻 技术栈

│  后端框架:  Django 6.1 (MVT)                    ││  数据库:    SQLite (可平滑迁移 MySQL/PG)          ││  前端:      Bootstrap 5 + Chart.js (CDN 免构建)   ││  权限:      自定义 User 模型 + role_required 装饰器 ││  智能导入:  正则解析引擎 + rapidocr-onnxruntime    ││  Excel:     openpyxl (学生批量导入/成绩导出)       ││  图片:      Pillow (题干/选项图片上传)            ││  测试:      Django TestCase × 43                 │

📂 项目结构

exam_system/ ├── config/                 # Django 配置(settings/urls) ├── users/                  # 用户/班级模块 │   ├── models.py           # User(三角色) / Clazz 班级 │   ├── decorators.py       # role_required 角色权限装饰器 │   ├── forms.py / views.py # 登录、用户CRUD、班级CRUD │   │                       # 学生 Excel 批量导入 │   └── tests.py            # Excel 导入等 6 个测试 ├── exams/ │   ├── models.py           # Subject/Question/Exam/ │   │                       # ExamQuestion/ExamRecord/Answer │   ├── services.py         # 组卷、判分、续考、切屏计数 │   ├── views.py            # 教师端 + 学生端 27 个视图 │   ├── text_importer.py    # 文本解析 + PDF/Word/图片OCR │   ├── templatetags/       # dictkey/letter 模板过滤器 │   └── management/commands/ │       ├── seed.py         # 演示数据命令 │       └── question_bank.py # 146 道信息技术题库 ├── templates/              # Bootstrap 5 模板(23 个页面) ├── static/                 # 自定义样式 ├── media/                  # 题干/选项图片 ├── db.sqlite3 └── requirements.txt

🚀 快速开始

# 1. 安装依赖 pip install -r requirements.txt  # 2. 初始化数据库 python manage.py migrate python manage.py seed        # 生成演示账号/题库/一场考试# 3. 启动 python manage.py runserver   # http://127.0.0.1:8000# 4. 跑测试(43 个) python manage.py test

💡 演示账号:管理员 admin / admin123456,教师 teacher / teacher123456,学生 student01~12 / stu12345678。演示考试「初中信息技术综合测试」已发布至初一/初二/初三三个班级:17 题 / 总分 100。 

📝 使用流程

教师端:CSV/智能导入题库 → 创建考试(选学科、时间、限时)→ 组卷选题设分值 → 发布到班级 → 查看报表/导出 CSV

学生端:登录 → 我的考试 → 进入考试(随机题序)→ 在线答题(自动保存)→ 交卷即出分 → 答卷回看 / 错题本复习

🎯 适用场景

  • 中小学阶段性测验
     — 按学科组织题库,组卷发布到指定班级
  • 机房上机考试
     — 防切屏 + 随机题序,适合信息技术等机考科目
  • 线上练习与周测
     — 断点续考、错题本,课后自主巩固
  • 教培机构考核
     — 多班级多角色,成绩报表一键导出
  • 单位知识测评
     — 智能导入现有试卷,快速电子化

图 11 · 手机端

移动端管理题库与考试

🏷️ 技术标签

#Django#在线考试#防作弊#智能导入#OCR#自动判分#Bootstrap5#SQLite#全栈开发

© 2026 在线考试系统 · 全栈开发实战

相关学习资料