feat(课堂): 布置这节课的题时可以选用什么语言做,学生用别的语言交对不算这份作业做完
class_lesson 加一列 language(0024,可空:以前布置的、按提交推断出来的课都不限语言)。 布置时有题不支持选的语言就整个拒掉并点名是哪几道;看板的格子、学生首页的做完状态、 提交列表「这节课」都只认这个语言的代码提交,流程图照旧算。看板多给 lastLanguage 当默认值。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
e3be3cd62c
commit
a18e129f4c
6 files changed
+4218
-19
No files matched your search
@@ -1,6 +1,7 @@
|
||||
import { z } from "zod"
|
||||
|
||||
import { judgeStatusSchema } from "./judge-status"
|
||||
import { runnableLanguageSchema } from "./language"
|
||||
|
||||
export const classRankItemSchema = z.object({
|
||||
className: z.string(),
|
||||
@@ -76,15 +77,25 @@ export const classActivityProblemSchema = z.object({
|
||||
userCount: z.number().int(),
|
||||
/** 其中那天通过了的人数 */
|
||||
acceptedCount: z.number().int(),
|
||||
/** 我自己在题库里(不含比赛)做这道题的状态,不限那一天 */
|
||||
/**
|
||||
* 我自己在题库里(不含比赛)做这道题的状态,不限那一天。老师布置时选了语言的,
|
||||
* 代码只认用那个语言交的(流程图照旧算)
|
||||
*/
|
||||
myStatus: z.enum(["accepted", "tried", "none"]),
|
||||
})
|
||||
|
||||
/**
|
||||
* 老师布置这节课时选的语言(Python / C / C++)。null = 没选:推断出来的课、加这一项之前
|
||||
* 布置的课。选了之后这份作业「做完」只认这个语言交对的,学生打开这几道题编辑器默认就是它
|
||||
*/
|
||||
const lessonLanguageSchema = runnableLanguageSchema.nullable()
|
||||
|
||||
export const classActivitySchema = z.object({
|
||||
className: z.string().nullable(),
|
||||
day: z.string().nullable(),
|
||||
/** teacher = 老师在课堂看板里布置的;inferred = 从同班提交记录推断的 */
|
||||
source: z.enum(["teacher", "inferred"]).nullable(),
|
||||
language: lessonLanguageSchema,
|
||||
problems: z.array(classActivityProblemSchema),
|
||||
})
|
||||
|
||||
@@ -122,10 +133,14 @@ export const lastVisitSchema = z.object({
|
||||
.nullable(),
|
||||
})
|
||||
|
||||
/** 课堂看板里老师布置这节课的题:按输入顺序给展示题号,最多 20 道,空数组 = 清掉 */
|
||||
/**
|
||||
* 课堂看板里老师布置这节课的题:按输入顺序给展示题号,最多 20 道,空数组 = 清掉。
|
||||
* `language` 是这份作业用什么语言做;不传当 null(上线时还开着的旧看板页面不带它)
|
||||
*/
|
||||
export const classLessonRequestSchema = z.object({
|
||||
className: z.string().trim().min(1),
|
||||
problemDisplayIds: z.array(z.string().trim().min(1)).max(20),
|
||||
language: lessonLanguageSchema.optional(),
|
||||
})
|
||||
|
||||
export const classBoardProblemSchema = z.object({
|
||||
@@ -135,7 +150,10 @@ export const classBoardProblemSchema = z.object({
|
||||
})
|
||||
|
||||
export const classBoardCellSchema = z.object({
|
||||
/** accepted 看的是题库里(不含比赛)有没有通过过,不限今天 —— 以前做过的也算做完 */
|
||||
/**
|
||||
* accepted 看的是题库里(不含比赛)有没有通过过,不限今天 —— 以前做过的也算做完。
|
||||
* 布置时选了语言的,代码的次数和通过都只数那个语言(流程图照旧)
|
||||
*/
|
||||
status: z.enum(["accepted", "tried", "none"]),
|
||||
/** 今天在这道题上交了几次(代码 + 流程图) */
|
||||
attempts: z.number().int(),
|
||||
@@ -175,6 +193,10 @@ export const classBoardSchema = z.object({
|
||||
className: z.string().nullable(),
|
||||
day: z.string(),
|
||||
source: z.enum(["teacher", "inferred"]).nullable(),
|
||||
/** 今天布置的语言(见 lessonLanguageSchema) */
|
||||
language: lessonLanguageSchema,
|
||||
/** 这个班最近一次布置选的语言(含今天),给语言下拉当默认值;从没选过为 null */
|
||||
lastLanguage: lessonLanguageSchema,
|
||||
problems: z.array(classBoardProblemSchema),
|
||||
students: z.array(classBoardStudentSchema),
|
||||
/**
|
||||
@@ -192,6 +214,8 @@ export const classBoardSchema = z.object({
|
||||
export const classLessonSchema = z.object({
|
||||
className: z.string().nullable(),
|
||||
source: z.enum(["teacher", "inferred"]).nullable(),
|
||||
/** 选了语言时,列表那边连语言一起筛 */
|
||||
language: lessonLanguageSchema,
|
||||
problems: z.array(z.object({ problemDisplayId: z.string(), title: z.string() })),
|
||||
})
|
||||
|
||||
|
||||
Reference in new issue
Block a user