【导读】
想做在线考试小程序,从题库设计到组卷算法、再到防作弊和成绩统计,是一整套流程。本文按"先做题库、再做组卷、再做考试、最后做成绩"的顺序,拆一个可落地的在线考试小程序完整方案:数据模型怎么设计、组卷怎么抽题、防作弊怎么落地、成绩单怎么出。
一、先把题库数据结构设计好
在线考试的地基是题库,数据结构没设计好,后面组卷、统计全要返工。一个题库至少需要这几张核心表:
-- 题目表:支持单选、多选、判断、填空
CREATE TABLE question (
id BIGINT PRIMARY KEY,
type TINYINT, -- 1单选 2多选 3判断 4填空
content TEXT, -- 题干(含富文本/图片)
options JSON, -- 选项:[{"key":"A","text":"..."}]
answer JSON, -- 标准答案
difficulty TINYINT, -- 1-5 难度
category_id BIGINT, -- 所属分类(章节/知识点)
tags VARCHAR(255), -- 标签:如"第一章""高频考点"
created_at DATETIME
);
-- 试卷表:一次考试 = 一张试卷
CREATE TABLE exam (
id BIGINT PRIMARY KEY,
title VARCHAR(255),
category_rule JSON, -- 组卷规则:{"第1章":5,"第2章":8}
duration_minutes INT, -- 考试时长
pass_score INT, -- 及格分
shuffle_question TINYINT, -- 题目乱序
shuffle_option TINYINT -- 选项乱序
);
关键设计:题目和试卷分离——试卷只存组卷规则,不存题目快照;考生答卷时再按规则抽题,才能支持"同一场考试每人题目顺序不同"的防作弊基础。
二、组卷:抽题算法怎么写
组卷的核心是"按规则抽题"。常见两种:
固定试卷(重要考试):预先人工组好一张卷,所有人做同一套(可乱序);
随机组卷(模拟考试/刷题):按分类+难度比例动态抽题。
# 随机组卷:按分类和难度比例抽题
def compose_paper(category_rule, difficulty_ratio, question_count):
picked = []
for cat, count in category_rule.items():
# 每个分类按难度比例抽
by_diff = {
1:0, 2:0, 3:0, 4:0, 5:0}
for q in questions_of(cat):
by_diff[q.difficulty] += 1
# 先按难度比例分配名额,再从每个难度池随机抽
quota = {
d: round(count * ratio) for d, ratio in difficulty_ratio.items()}
for d, n in quota.items():
pool = [q for q in questions_of(cat) if q.difficulty == d]
picked += random.sample(pool, min(n, len(pool)))
return picked
注意点:抽题要去重(同一考生不能抽到重复题)、比例兜底(某个难度池不够时从邻近难度补)。
三、考试流程:进入、答题、交卷三段状态机
考试过程是一个状态机:未开始 → 进行中 → 已交卷 → 已判分。中间最容易出问题的是"交卷":
- 自动保存:每答一题立即保存,防断网丢答案;
- 交卷幂等:交卷接口必须幂等,重复点击/超时重试不能重复提交;
- 弱网重试:交卷请求失败自动重试,带请求ID去重。
# 交卷幂等:用 request_id 防重复提交
def submit_exam(exam_id, user_id, answers, request_id):
if redis.set(f"submit:{exam_id}:{user_id}", request_id, nx=True, ex=60):
save_answers(exam_id, user_id, answers)
score = auto_grade(exam_id, user_id)
return {
"status": "success", "score": score}
return {
"status": "duplicate"}
四、防作弊:环境约束 + 行为风控 + 雷同检测三层
在线考试必须有防作弊,三层落地:
- 环境约束:全屏考试、切屏记录(超过阈值自动收卷)、IP/设备指纹检测(同IP多账号高危)、迟到禁入、开考最短交卷时间;
- 行为风控:答题速度异常(选择题平均3秒/题)、粘贴外部内容、多账号同设备——算风险分,达到阈值标记或收卷;
- 雷同检测:考后比"错误模式相似度"——选项序列相同率、错题重合度、答题时长曲线、交卷时间窗,生成证据包交人工复核。
五、成绩单与数据统计
判分后输出:总分、各分类得分率、用时、排名、证书(可选)。统计维度至少要有:通过率、平均分、各题正确率(找薄弱知识点)、各分类得分分布。给老师的后台要能导出明细,给学员的页面要有错题回顾。
注意事项
- 题库先分级:不按分类/难度组织,组卷就是瞎抽,先建好分类体系。
- 别把答案存前端:标准答案放服务端,前端只存用户作答,防止抓包拿答案。
- 组卷要去重兜底:题目池不够时程序会崩,先算够不够再抽。
- 防作弊要留证据:不追求全防,追求"每次可疑都有据可查",人工复核兜底。
结语
在线考试小程序从0到1,核心是题库建好、组卷规则清晰、考试状态机稳定、防作弊三层兜底、成绩统计闭环。按这个顺序做,一个能支撑千人在线考试的题库+考试系统就能跑起来。中小企业没有研发团队时,用成熟底座(比如乔拓云这类零代码平台)+ 自研关键模块,是最快的落地路径。