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 · 登录页
三种角色统一入口
👥 三角色功能总览
| 题库管理 | |

图 2 · 管理员仪表盘
师生/班级/题库/考试总览

图 3 · 教师仪表盘
教学数据一览

图 6 · 智能组卷
选题组卷,逐题设置分值
📥 三种批量导入

图 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 在线考试系统 · 全栈开发实战