From 0980ea858aba05af4a021ee0e8233de7c9cac4ef Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Mon, 12 Oct 2026 12:55:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=8D=A1=E7=82=B9=E5=88=86=E6=9E=90):=20?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E5=8D=A1=E7=82=B9=E5=88=86=E6=9E=90=E6=8C=89?= =?UTF-8?q?=E7=9F=A5=E8=AF=86=E7=82=B9=20=E2=86=92=20=E9=A2=98=20=E2=86=92?= =?UTF-8?q?=20=E4=B8=80=E9=81=93=E9=A2=98=E9=87=8D=E5=81=9A=EF=BC=8C?= =?UTF-8?q?=E5=B9=B4=E5=BA=A6=E8=B6=8B=E5=8A=BF=E6=94=B9=E5=90=8D=E5=8E=86?= =?UTF-8?q?=E5=B9=B4=E6=A6=82=E5=86=B5=E5=8F=AA=E7=95=99=E9=80=90=E5=AD=A6?= =?UTF-8?q?=E5=B9=B4=E6=80=BB=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 选班后只列这个班课上布置过的题,右栏换成「交了几次才对」和交得最多的人 - 历年概况可以导出表格;旧地址 top_ac_trend 跳到新页面 Co-Authored-By: Claude Opus 5.5 --- apps/web/src/admin/api.ts | 21 +- apps/web/src/admin/problem/Stuck.vue | 884 +++++++++++++++++++++++++- apps/web/src/admin/problem/Yearly.vue | 255 ++++++++ apps/web/src/routes.ts | 8 +- apps/web/src/shared/layout/admin.vue | 4 +- apps/web/src/utils/types.ts | 5 +- 6 files changed, 1126 insertions(+), 51 deletions(-) create mode 100644 apps/web/src/admin/problem/Yearly.vue diff --git a/apps/web/src/admin/api.ts b/apps/web/src/admin/api.ts index db949aa..99cd557 100644 --- a/apps/web/src/admin/api.ts +++ b/apps/web/src/admin/api.ts @@ -1,7 +1,6 @@ import api from "utils/api" import { toAdminProblemRow } from "admin/transforms" import type { - AcTrend, BatchProblemTagResponse, GenerateSqlTestCaseResponse, RenameTagResponse, @@ -9,6 +8,8 @@ import type { AdminAiReport, AdminAiReportList, StuckProblem, + StuckProblemDetail, + YearlyOverview, LearnBoard, LearnExerciseProgressList, LearnExerciseAttempt, @@ -598,9 +599,13 @@ export function deleteProblemSetBadge(problemSetId: number, badgeId: number) { return api.delete(`admin/problem-sets/${problemSetId}/badges/${badgeId}`) } -// 学生卡点分析 -export function getStuckProblems() { - return api.get("admin/problem-analytics/stuck") +// 卡点分析:start 是时间段的起点(ISO),不给就是全部时间 +export function getStuckProblems(params: { className?: string; start?: string }) { + return api.get("admin/problem-analytics/stuck", { params }) +} + +export function getStuckProblemDetail(id: number, params: { className?: string; start?: string }) { + return api.get(`admin/problem-analytics/stuck/${id}`, { params }) } export function getLearnBoard(params: { type: "python" | "c"; className?: string }) { @@ -619,12 +624,8 @@ export function getLearnExerciseAttempts(exerciseId: number, params: { className }) } -export function getTopACTrend(params: { - sinceYear: number - untilYear: number - minPerYear: number -}) { - return api.get("admin/problem-analytics/ac-trend", { params }) +export function getYearlyOverview() { + return api.get("admin/problem-analytics/yearly") } // AI 学习分析报告 diff --git a/apps/web/src/admin/problem/Stuck.vue b/apps/web/src/admin/problem/Stuck.vue index f69da70..3818367 100644 --- a/apps/web/src/admin/problem/Stuck.vue +++ b/apps/web/src/admin/problem/Stuck.vue @@ -1,49 +1,863 @@ + + diff --git a/apps/web/src/admin/problem/Yearly.vue b/apps/web/src/admin/problem/Yearly.vue new file mode 100644 index 0000000..9245af0 --- /dev/null +++ b/apps/web/src/admin/problem/Yearly.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/apps/web/src/routes.ts b/apps/web/src/routes.ts index c7d4911..be294f9 100644 --- a/apps/web/src/routes.ts +++ b/apps/web/src/routes.ts @@ -310,11 +310,13 @@ export const admins: RouteRecordRaw = { meta: { requiresTeacherAdmin: true }, }, { - path: "problem/top_ac_trend", - name: "admin top ac trend", - component: () => import("admin/problem/TopACTrend.vue"), + path: "problem/yearly", + name: "admin yearly overview", + component: () => import("admin/problem/Yearly.vue"), meta: { requiresTeacherAdmin: true }, }, + // 「年度趋势」改名「历年概况」之前的地址,收藏夹里可能还有 + { path: "problem/top_ac_trend", redirect: "/admin/problem/yearly" }, // 题单管理路由 { path: "problemset/list", diff --git a/apps/web/src/shared/layout/admin.vue b/apps/web/src/shared/layout/admin.vue index 2323762..84b1ca0 100644 --- a/apps/web/src/shared/layout/admin.vue +++ b/apps/web/src/shared/layout/admin.vue @@ -85,9 +85,9 @@ const NAV: NavGroup[] = [ role: "teacher", }, { - label: "年度趋势", + label: "历年概况", icon: "ph:chart-line-up", - path: "/admin/problem/top_ac_trend", + path: "/admin/problem/yearly", role: "teacher", }, { label: "自学情况", icon: "ph:student", path: "/admin/learn", role: "teacher" }, diff --git a/apps/web/src/utils/types.ts b/apps/web/src/utils/types.ts index 49a40f2..0ac569c 100644 --- a/apps/web/src/utils/types.ts +++ b/apps/web/src/utils/types.ts @@ -328,7 +328,10 @@ export type { AdminAiReportListItem, AdminAiReportList, StuckProblem, - AcTrend, + StuckProblemDetail, + StuckStudent, + YearlyOverview, + YearlySummary, LearnBoard, LearnBoardStudent, LearnExerciseProgress,