update
Deploy / deploy (push) Canceled after 0s

This commit is contained in:
xuyue committed 2026-09-27 19:36:28 +08:00
1 parent 23844ae301
commit d25b5dbe6d
268 files changed
+3684 -8861

No files matched your search

+34 -99
View File
@@ -63,9 +63,7 @@ export async function getProblemList(
contestID?: string,
tagId?: number,
) {
const endpoint = contestID
? `admin/contests/${contestID}/problems`
: "admin/problems"
const endpoint = contestID ? `admin/contests/${contestID}/problems` : "admin/problems"
const res = await api.get<AdminProblemList>(endpoint, {
params: { offset, limit, keyword, author, tagId },
})
@@ -133,24 +131,14 @@ export function batchTagProblems(
}
// 用户排名(后台版,无 100 名上限;公开榜单是 oj/api.ts 的 getRank)
export function getAdminUserRank(
offset: number,
limit: number,
keyword: string,
) {
export function getAdminUserRank(offset: number, limit: number, keyword: string) {
return api.get<AdminUserRank>("admin/rankings/users", {
params: { offset, limit, keyword },
})
}
// 用户列表
export function getUserList(
offset = 0,
limit = 10,
type = "",
keyword: string,
orderBy = "",
) {
export function getUserList(offset = 0, limit = 10, type = "", keyword: string, orderBy = "") {
return api.get<AdminUserList>("admin/users", {
// "-last_login" 是旧接口传下来的取值(路由 query 里可能还存着),改叫 "-lastLogin";
// "-online" 是新增的,原样透传
@@ -179,9 +167,7 @@ export function editUser(user: AdminUserForm) {
// 重置用户密码,返回新密码
export async function resetPassword(userID: number) {
const res = await api.post<{ password: string }>(
`admin/users/${userID}/reset-password`,
)
const res = await api.post<{ password: string }>(`admin/users/${userID}/reset-password`)
return res.password
}
@@ -242,14 +228,8 @@ export function getSQLTestcaseScripts(problemId: number) {
}
// AI 根据标准答案生成一个 SQL 测试点初始化脚本
export function generateSQLTestcase(data: {
refSql: string
mode: "query" | "modify"
}) {
return api.post<GenerateSqlTestCaseResponse>(
"admin/sql-test-cases/generate",
data,
)
export function generateSQLTestcase(data: { refSql: string; mode: "query" | "modify" }) {
return api.post<GenerateSqlTestCaseResponse>("admin/sql-test-cases/generate", data)
}
/** 出站补默认值。字段名两边已经一致,不再做键名转换 */
@@ -328,15 +308,11 @@ export function getContest(id: string) {
return api.get<AdminContest>(`admin/contests/${id}`)
}
export function addProblemForContest(
contestID: string,
problemID: number,
displayID: string,
) {
return api.post<AdminProblem>(
`admin/contests/${contestID}/problems/from-public`,
{ problemId: problemID, displayId: displayID },
)
export function addProblemForContest(contestID: string, problemID: number, displayID: string) {
return api.post<AdminProblem>(`admin/contests/${contestID}/problems/from-public`, {
problemId: problemID,
displayId: displayID,
})
}
export function getWebsite() {
@@ -364,10 +340,9 @@ export function deleteJudgeServer(hostname: string) {
}
export function getAnnouncementList(offset = 0, limit = 10) {
return api.get<{ results: AdminAnnouncementListItem[]; total: number }>(
"admin/announcements",
{ params: { offset, limit } },
)
return api.get<{ results: AdminAnnouncementListItem[]; total: number }>("admin/announcements", {
params: { offset, limit },
})
}
export function getAnnouncement(id: number) {
@@ -464,9 +439,9 @@ export function makeProblemPublic(id: number, displayId: string) {
export function getACMHelperList(contestId: number) {
// acInfo 在契约里是 Record<string, unknown>(acm_contest_rank 的 JSONB 原文),
// 组件侧按 ContestSubmissionInfo 读,收窄放在这里
return api.get<
Array<Omit<AcmHelperItem, "acInfo"> & { acInfo: ContestSubmissionInfo }>
>(`admin/contests/${contestId}/acm-helper`)
return api.get<Array<Omit<AcmHelperItem, "acInfo"> & { acInfo: ContestSubmissionInfo }>>(
`admin/contests/${contestId}/acm-helper`,
)
}
export function updateACMHelperChecked(
@@ -525,10 +500,7 @@ export function createProblemSet(data: ProblemSetBody) {
}
export function editProblemSet(data: ProblemSetBody & { id: number }) {
return api.put<AdminProblemSet>(
`admin/problem-sets/${data.id}`,
toProblemSetBody(data),
)
return api.put<AdminProblemSet>(`admin/problem-sets/${data.id}`, toProblemSetBody(data))
}
export function deleteProblemSet(id: number) {
@@ -545,9 +517,7 @@ export function updateProblemSetStatus(id: number, status: string) {
// 题单题目管理 API
export function getProblemSetProblems(problemSetId: number) {
return api.get<AdminProblemSetProblem[]>(
`admin/problem-sets/${problemSetId}/problems`,
)
return api.get<AdminProblemSetProblem[]>(`admin/problem-sets/${problemSetId}/problems`)
}
export function addProblemToSet(
@@ -579,26 +549,16 @@ export function editProblemInSet(
hint?: string
},
) {
return api.put(
`admin/problem-sets/${problemSetId}/problems/${problemSetProblemId}`,
data,
)
return api.put(`admin/problem-sets/${problemSetId}/problems/${problemSetProblemId}`, data)
}
export function removeProblemFromSet(
problemSetId: number,
problemSetProblemId: number,
) {
return api.delete(
`admin/problem-sets/${problemSetId}/problems/${problemSetProblemId}`,
)
export function removeProblemFromSet(problemSetId: number, problemSetProblemId: number) {
return api.delete(`admin/problem-sets/${problemSetId}/problems/${problemSetProblemId}`)
}
// 题单奖章管理 API
export function getProblemSetBadges(problemSetId: number) {
return api.get<AdminProblemSetBadge[]>(
`admin/problem-sets/${problemSetId}/badges`,
)
return api.get<AdminProblemSetBadge[]>(`admin/problem-sets/${problemSetId}/badges`)
}
interface BadgeBody {
@@ -626,11 +586,7 @@ export function createProblemSetBadge(problemSetId: number, data: BadgeBody) {
)
}
export function editProblemSetBadge(
problemSetId: number,
badgeId: number,
data: BadgeBody,
) {
export function editProblemSetBadge(problemSetId: number, badgeId: number, data: BadgeBody) {
return api.put<AdminProblemSetBadge>(
`admin/problem-sets/${problemSetId}/badges/${badgeId}`,
toBadgeBody(data),
@@ -644,9 +600,7 @@ export function deleteProblemSetBadge(problemSetId: number, badgeId: number) {
// 题单进度管理 API
// 注意:返回的是裸数组,不是分页信封 —— 和 oj 侧的 /user-progress 不同
export function getProblemSetProgress(problemSetId: number) {
return api.get<AdminProblemSetProgress[]>(
`admin/problem-sets/${problemSetId}/progress`,
)
return api.get<AdminProblemSetProgress[]>(`admin/problem-sets/${problemSetId}/progress`)
}
export function removeUserFromProblemSet(problemSetId: number, userId: number) {
@@ -658,41 +612,28 @@ export function getStuckProblems() {
return api.get<StuckProblem[]>("admin/problem-analytics/stuck")
}
export function getLearnStudents(params: {
type: "python" | "c"
className?: string
}) {
export function getLearnStudents(params: { type: "python" | "c"; className?: string }) {
return api.get<LearnStudentProgressList>("admin/learn-analytics/students", {
params,
})
}
export function getLearnTutorials(params: {
type: "python" | "c"
className?: string
}) {
export function getLearnTutorials(params: { type: "python" | "c"; className?: string }) {
return api.get<LearnTutorialProgressList>("admin/learn-analytics/tutorials", {
params,
})
}
export function getLearnExercises(params: {
type: "python" | "c"
className?: string
}) {
export function getLearnExercises(params: { type: "python" | "c"; className?: string }) {
return api.get<LearnExerciseProgressList>("admin/learn-analytics/exercises", {
params,
})
}
export function getLearnExerciseAttempts(
exerciseId: number,
params: { className?: string },
) {
return api.get<LearnExerciseAttempt[]>(
`admin/learn-analytics/exercises/${exerciseId}/attempts`,
{ params },
)
export function getLearnExerciseAttempts(exerciseId: number, params: { className?: string }) {
return api.get<LearnExerciseAttempt[]>(`admin/learn-analytics/exercises/${exerciseId}/attempts`, {
params,
})
}
export function getTopACTrend(params: {
@@ -757,17 +698,11 @@ export function getMetricOptions() {
}
export function createAchievement(data: Partial<AdminAchievement>) {
return api.post<AdminAchievement>(
"admin/achievements",
toAchievementBody(data),
)
return api.post<AdminAchievement>("admin/achievements", toAchievementBody(data))
}
export function updateAchievement(data: Partial<AdminAchievement>) {
return api.put<AdminAchievement>(
`admin/achievements/${data.id}`,
toAchievementBody(data),
)
return api.put<AdminAchievement>(`admin/achievements/${data.id}`, toAchievementBody(data))
}
export function deleteAchievement(id: number) {