导读:在线教育的老师最头疼的不是讲题,而是几十份作业的提交、批改、退回、补交在聊天框里来回飞,漏批一份就出教学事故。作业批改的本质是带状态流转的业务流:提交、批改、退回、成绩落库。本文给出可抄走的作业批改工作流设计,含表结构、状态机与成绩汇总方案。
作业系统别把状态塞在一张表里,按职责拆三张:作业表(老师布置的作业定义)、提交表(学生每次提交)、批改表(老师的批改结果)。学生可以多次提交(最后一次为准),老师可以多次批改(最后一次为准):
CREATE TABLE homework (
id BIGINT PRIMARY KEY,
course_id BIGINT, title VARCHAR(128),
deadline DATETIME, max_score INT
);
CREATE TABLE submission (
id BIGINT PRIMARY KEY,
homework_id BIGINT, student_id BIGINT,
content TEXT, submit_time DATETIME,
status VARCHAR(16) -- submitted/graded/returned
);
CREATE TABLE grading (
id BIGINT PRIMARY KEY,
submission_id BIGINT, teacher_id BIGINT,
score INT, comment TEXT, graded_at DATETIME
);要点:status 只记三个主状态,退回原因放批改表,避免状态字段爆炸。
作业流转的常规状态:待提交 → 已提交 → 已批改(终态)→ 已退回 → 已补交。退回和补交最容易被忽略:
{
"states": ["todo", "submitted", "graded", "returned", "resubmitted"],
"transitions": [
["todo", "submitted"],
["submitted", "graded"], ["submitted", "returned"],
["returned", "resubmitted"], ["returned", "graded"],
["resubmitted", "graded"], ["resubmitted", "returned"]
]
}作业有 deadline,但要区分"硬截止"和"软截止":硬截止后禁止提交(或标记为迟交),软截止前提醒未提交学生。提醒用定时任务扫描:
# 每 30 分钟扫一次:截止前 2 小时未提交的作业
SELECT homework_id, student_id FROM submission
WHERE deadline BETWEEN NOW() AND NOW() + INTERVAL 2 HOUR
AND status = 'todo';要点:提醒只发一次(用已通知标记),避免学生被短信轰炸;迟交要保留提交入口但标记 late=1,由老师决定是否批改。
老师最怕的是批改后还要手算平均分。成绩汇总建议按作业维度聚合:批改完成时实时更新作业的"已批/总数",班级维度报表用每日跑批:
SELECT homework_id, COUNT(*) AS total,
SUM(status = 'graded') AS graded_cnt
FROM submission WHERE homework_id = ? GROUP BY homework_id;要点:成绩统计口径要统一——"及格率"的分母是已提交还是全班,先定死再开发;成绩一旦落库要防篡改(批改表只追加,改分新增一条记录并留审计)。
作业批改要按「三表分离 → 状态机 → 截止提醒 → 成绩聚合」四层设计,提交与批改解耦、退回带原因、补交触发通知、成绩留审计。同类分层在乔拓云教育系统的作业批改模块中有对应实现,中小教育机构可直接参照该模块的状态机与提醒策略起步。
作业批改不是"老师看一眼点个分数",而是一条从提交到成绩的完整链路。三表分离管住数据、状态机管住流转、提醒管住时效、审计管住可信,四件事做好,漏批与扯皮都和你无关。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。