From 25d3296410c44975db5204e89b22865fa2241268 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 9 Oct 2026 18:59:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(SQL=20=E9=A2=98):=20=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E6=94=B9=E9=A2=98=E7=9A=84=E6=9C=9F=E6=9C=9B=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E6=A0=87=E5=87=BA=E6=89=A7=E8=A1=8C=E5=90=8E=E5=8F=98=E4=BA=86?= =?UTF-8?q?=E7=9A=84=E6=A0=BC=E5=AD=90=EF=BC=8C=E5=88=A0=E6=8E=89=E7=9A=84?= =?UTF-8?q?=E8=A1=8C=E5=86=99=E6=B8=85=E6=98=AF=E5=93=AA=E5=87=A0=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 学生原来只能拿两张表逐格对,看不出要改的是哪几行。现在改过的格子、新插的行标黄, 删掉的行在表下面写「删掉了 2 行(id 是 2、3)」。按第一列配对,对不上就不标。 数据表和期望结果抽成一个组件,后台出题页的预览也用它。 题型判断统一走契约的 isSqlProblem()。 Co-Authored-By: Claude Opus 5.5 --- apps/api/src/routes/classroom.ts | 3 +- apps/api/src/routes/contest.ts | 3 +- apps/api/src/routes/problem.ts | 3 +- .../problem/components/SQLTestcaseEditor.vue | 352 ------------------ .../oj/problem/components/ProblemContent.vue | 68 +--- .../src/oj/problem/components/ResultPane.vue | 6 +- .../oj/problem/components/SQLDataTable.vue | 26 +- .../oj/problem/components/SqlProblemData.vue | 121 ++++++ .../problem/components/SubmissionResult.vue | 4 +- .../problem/components/WrongAnswerExplain.vue | 3 +- apps/web/src/oj/problem/utils/sqlChanges.ts | 71 ++++ packages/contract/src/language.ts | 8 + 12 files changed, 247 insertions(+), 421 deletions(-) delete mode 100644 apps/web/src/admin/problem/components/SQLTestcaseEditor.vue create mode 100644 apps/web/src/oj/problem/components/SqlProblemData.vue create mode 100644 apps/web/src/oj/problem/utils/sqlChanges.ts diff --git a/apps/api/src/routes/classroom.ts b/apps/api/src/routes/classroom.ts index a7bceff..ad81606 100644 --- a/apps/api/src/routes/classroom.ts +++ b/apps/api/src/routes/classroom.ts @@ -1,4 +1,5 @@ import { + isSqlProblem, classComparisonRequestSchema, STUDENT_ROLES, classLessonRequestSchema, @@ -929,7 +930,7 @@ classroomRoutes.put("/classroom/lesson", requireTeacher, async (c) => { // SQL 题除外:它只收 SQL,C 的作业里夹一道也不会让人选错语言,计数那边也放行了 SQL if (language) { const unsupported = found - .filter((row) => !row.languages.includes(language) && !row.languages.includes("SQL")) + .filter((row) => !row.languages.includes(language) && !isSqlProblem(row)) .map((row) => row.displayId) if (unsupported.length) { return failure( diff --git a/apps/api/src/routes/contest.ts b/apps/api/src/routes/contest.ts index 4d15a17..300fffc 100644 --- a/apps/api/src/routes/contest.ts +++ b/apps/api/src/routes/contest.ts @@ -1,4 +1,5 @@ import { + isSqlProblem, contestPasswordRequestSchema, STUDENT_ROLES, type Contest, @@ -244,7 +245,7 @@ contestRoutes.get( allowFlowchart: problem.allowFlowchart, showFlowchart: problem.showFlowchart, hasAstRules: problem.astRules !== null, - isSql: problem.languages.includes("SQL"), + isSql: isSqlProblem(problem), myStatus: myStatusOf(statuses, problem.id), // 按人数是公开题库列表的列;比赛题表看的是榜单,不下发 solvedUsers: 0, diff --git a/apps/api/src/routes/problem.ts b/apps/api/src/routes/problem.ts index 696e424..822eedd 100644 --- a/apps/api/src/routes/problem.ts +++ b/apps/api/src/routes/problem.ts @@ -1,4 +1,5 @@ import { + isSqlProblem, normalizeLanguage, problemListSortSchema, problemTypeFilterSchema, @@ -121,7 +122,7 @@ function listItem( allowFlowchart: row.problem.allowFlowchart, showFlowchart: row.problem.showFlowchart, hasAstRules: row.problem.astRules !== null, - isSql: row.problem.languages.includes("SQL"), + isSql: isSqlProblem(row.problem), // 流程图评到 A / S 也打勾:problemStates 已经把它算进 solved myStatus: states?.solved.has(id) ? JudgeStatus.ACCEPTED diff --git a/apps/web/src/admin/problem/components/SQLTestcaseEditor.vue b/apps/web/src/admin/problem/components/SQLTestcaseEditor.vue deleted file mode 100644 index 91e5531..0000000 --- a/apps/web/src/admin/problem/components/SQLTestcaseEditor.vue +++ /dev/null @@ -1,352 +0,0 @@ - - - - - diff --git a/apps/web/src/oj/problem/components/ProblemContent.vue b/apps/web/src/oj/problem/components/ProblemContent.vue index 4ff4666..3c93429 100644 --- a/apps/web/src/oj/problem/components/ProblemContent.vue +++ b/apps/web/src/oj/problem/components/ProblemContent.vue @@ -1,4 +1,5 @@