feat(卡点分析): 后台卡点分析按知识点 → 题 → 一道题重做,年度趋势改名历年概况只留逐学年总表
Deploy / deploy (push) Canceled after 0s

- 选班后只列这个班课上布置过的题,右栏换成「交了几次才对」和交得最多的人
- 历年概况可以导出表格;旧地址 top_ac_trend 跳到新页面

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-12 12:55:49 +08:00
1 parent b2c802174c
commit 0980ea858a
6 files changed
+1126 -51

No files matched your search

+11 -10
View File
@@ -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<StuckProblem[]>("admin/problem-analytics/stuck")
// 卡点分析:start 是时间段的起点(ISO),不给就是全部时间
export function getStuckProblems(params: { className?: string; start?: string }) {
return api.get<StuckProblem[]>("admin/problem-analytics/stuck", { params })
}
export function getStuckProblemDetail(id: number, params: { className?: string; start?: string }) {
return api.get<StuckProblemDetail>(`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<AcTrend[]>("admin/problem-analytics/ac-trend", { params })
export function getYearlyOverview() {
return api.get<YearlyOverview>("admin/problem-analytics/yearly")
}
// AI 学习分析报告