feat(布置作业): 能按知识点点选题目;一个班一天能布置几节课;数据统计认老师布置的课;后台能管布置过的课
Deploy / deploy (push) Canceled after 0s

- 课堂看板「选题」弹框:左边知识点(加必会题),右边搜题号/题名、点选,按点的先后排;
  只列这次作业的语言能交的题(/problems、/problem-tags 加 ?language=)
- 一天多节课:0040 拿掉 class_lesson (class_name, day) 唯一约束,每次布置一行;
  看板「改」只改当前一节,加「新的一节」;这一节布置超过 100 分钟时先问这节课做哪几道题。
  不带 lessonId/newLesson 的老请求照旧改今天最后一节
- 数据统计「一行一节课」:布置过的课以布置为准(题目和顺序照布置、做完按全班算、标「布置」),
  这些提交不再参与推断切段,也不算零散;详情页「做完」注明是这一天/这节课/这段时间
- 后台「课堂作业」:一节一行,改(班级/日子/时刻/语言/题目)、看统计、删除、补一节;
  看板加「布置过的课」入口。题号校验和「做完」口径抽到 services/lesson.ts,三处共用

⚠️ 机房站点要和服务器一起升级:旧代码布置时 ON CONFLICT (class_name, day) 找不到约束会报错

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-11-02 20:41:25 +08:00
1 parent 0916015405
commit b344bd1dd6
26 files changed
+5685 -99

No files matched your search

+7 -4
View File
@@ -1292,7 +1292,8 @@ export const exerciseAttempt = pgTable(
)
/**
* 老师给某个班「这节课」布置的题(课堂看板里输入的题号),一个班一天一行。
* 老师给某个班布置的一节课的题(课堂看板里布置的),一次布置一行。一个班一天可以有几节
* 内容不同的课,数据统计按它切课(routes/submission-statistics.ts)。
*
* 学生首页的「班里在做」优先读它,没有才退回从提交记录推断(routes/classroom.ts)。
* 推断在上课头几分钟是空的 —— 还没人交 —— 而这正是没听清题号的学生最需要它的时候。
@@ -1323,10 +1324,11 @@ export const classLesson = pgTable(
* 没有它。写入侧在 PUT /classroom/lesson 按 lessonLanguageSchema 校验过
*/
language: text().$type<LessonLanguage>(),
/** 这天第一次布置的老师,别的老师「改」也不换(和 createdAt 一样)。看板上写「HH:mm 谁 布置」 */
/** 这一节第一次布置的老师,别的老师「改」也不换(和 createdAt 一样)。看板上写「HH:mm 谁 布置」 */
createdBy: integer('created_by').notNull(),
/**
* 这天第一次布置的时刻,之后「改」只动 updatedAt。清掉(删行)再布置算重新开始。
* 这一节第一次布置的时刻,之后「改」只动 updatedAt。清掉(删行)再布置算重新开始。
* 同一天有几节时,按它分先后:最后布置的那一节是看板上的「这节课」。
* 加这一列之前布置的用 updated_at 回填(0034)
*/
createdAt: timestamp('created_at', {
@@ -1341,7 +1343,8 @@ export const classLesson = pgTable(
}).notNull(),
},
(table) => [
unique('class_lesson_class_day_unique').on(table.className, table.day),
// 一个班一天可以上几节内容不同的课,每次布置一行(0040 拿掉了原来的一天一行唯一约束)
index('class_lesson_class_day_idx').on(table.className, table.day),
index('class_lesson_created_by_idx').on(table.createdBy),
foreignKey({
columns: [table.createdBy],