后台题单接口下发的是扁平结构(displayId / title / isRequired),前端却按前台 题单页的嵌套结构取值,naive-ui 的 key 也不解析点号路径,于是「题目ID」「题目 标题」两列永远是空的。同一处还连累了另外几个操作: - 编辑题目弹窗读 problem.problem.title,点「编辑」直接抛错; - 添加题目发 problem_id / is_required,api 层取 problemId,出站是 undefined, 被后端按参数错误 400 掉; - 编辑题目发 is_required,「必做」怎么改都不生效; - 新建/编辑奖章发 condition_type,toBadgeBody 读 conditionType,同样 400。 根因是 admin/api.ts 把这批后台接口的返回值标成了 oj 侧的 ProblemSet / ProblemSetBadge / ProblemSetProblem,加上 detail.vue 四个 handler 用 data: any 接弹窗数据,字段拼错编译器一句都不吭。现在返回值全部换成 Admin* 契约类型, handler 换成 AddProblemToSetRequest / UpdateProblemInSetRequest 和一个本地 BadgeFormData(条件类型是「完成所有题目」时不带 conditionValue,后端补 0), 两个奖章弹窗里的 const data: any 也一并拆掉。 验证:dev 栈实跑,列表两列有值、编辑弹窗正常打开、加题 / 改必做 / 建奖章 / 改奖章四条链路走完界面都成功落库;bun run type-check 通过。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011WmMi9tPrnSAwwAy2i4WAa
This commit is contained in:
1 parent
1729b9db4d
commit
b130d805be
11 files changed
+89
-80
No files matched your search
+17
-17
@@ -38,10 +38,10 @@ import type {
|
||||
Tutorial,
|
||||
User,
|
||||
WebsiteConfig,
|
||||
ProblemSet,
|
||||
ProblemSetBadge,
|
||||
ProblemSetList,
|
||||
ProblemSetProblem,
|
||||
AdminProblemSetBadge,
|
||||
AdminProblemSetList,
|
||||
AdminProblemSet,
|
||||
AdminProblemSetProblem,
|
||||
TutorialListItem,
|
||||
} from "utils/types"
|
||||
|
||||
@@ -498,20 +498,20 @@ export function getProblemSetList(
|
||||
difficulty = "",
|
||||
status = "",
|
||||
) {
|
||||
return api.get<ProblemSetList>("admin/problem-sets", {
|
||||
return api.get<AdminProblemSetList>("admin/problem-sets", {
|
||||
params: { offset, limit, keyword, difficulty, status },
|
||||
})
|
||||
}
|
||||
|
||||
export function getProblemSetDetail(id: number) {
|
||||
return api.get<ProblemSet>(`admin/problem-sets/${id}`)
|
||||
return api.get<AdminProblemSet>(`admin/problem-sets/${id}`)
|
||||
}
|
||||
|
||||
interface ProblemSetBody {
|
||||
title?: string
|
||||
description?: string
|
||||
difficulty?: ProblemSet["difficulty"]
|
||||
status?: ProblemSet["status"]
|
||||
difficulty?: AdminProblemSet["difficulty"]
|
||||
status?: AdminProblemSet["status"]
|
||||
// 表单里是 Date,出站要 ISO 串
|
||||
endTime?: Date | null
|
||||
visible?: boolean
|
||||
@@ -529,11 +529,11 @@ function toProblemSetBody(data: ProblemSetBody) {
|
||||
}
|
||||
|
||||
export function createProblemSet(data: ProblemSetBody) {
|
||||
return api.post<ProblemSet>("admin/problem-sets", toProblemSetBody(data))
|
||||
return api.post<AdminProblemSet>("admin/problem-sets", toProblemSetBody(data))
|
||||
}
|
||||
|
||||
export function editProblemSet(data: ProblemSetBody & { id: number }) {
|
||||
return api.put<ProblemSet>(
|
||||
return api.put<AdminProblemSet>(
|
||||
`admin/problem-sets/${data.id}`,
|
||||
toProblemSetBody(data),
|
||||
)
|
||||
@@ -544,16 +544,16 @@ export function deleteProblemSet(id: number) {
|
||||
}
|
||||
|
||||
export function toggleProblemSetVisible(id: number) {
|
||||
return api.put<ProblemSet>(`admin/problem-sets/${id}/visibility`)
|
||||
return api.put<AdminProblemSet>(`admin/problem-sets/${id}/visibility`)
|
||||
}
|
||||
|
||||
export function updateProblemSetStatus(id: number, status: string) {
|
||||
return api.put<ProblemSet>(`admin/problem-sets/${id}/status`, { status })
|
||||
return api.put<AdminProblemSet>(`admin/problem-sets/${id}/status`, { status })
|
||||
}
|
||||
|
||||
// 题单题目管理 API
|
||||
export function getProblemSetProblems(problemSetId: number) {
|
||||
return api.get<ProblemSetProblem[]>(
|
||||
return api.get<AdminProblemSetProblem[]>(
|
||||
`admin/problem-sets/${problemSetId}/problems`,
|
||||
)
|
||||
}
|
||||
@@ -604,7 +604,7 @@ export function removeProblemFromSet(
|
||||
|
||||
// 题单奖章管理 API
|
||||
export function getProblemSetBadges(problemSetId: number) {
|
||||
return api.get<ProblemSetBadge[]>(
|
||||
return api.get<AdminProblemSetBadge[]>(
|
||||
`admin/problem-sets/${problemSetId}/badges`,
|
||||
)
|
||||
}
|
||||
@@ -613,7 +613,7 @@ interface BadgeBody {
|
||||
name?: string
|
||||
description?: string
|
||||
icon?: string
|
||||
conditionType?: ProblemSetBadge["conditionType"]
|
||||
conditionType?: AdminProblemSetBadge["conditionType"]
|
||||
conditionValue?: number
|
||||
}
|
||||
|
||||
@@ -628,7 +628,7 @@ function toBadgeBody(data: BadgeBody) {
|
||||
}
|
||||
|
||||
export function createProblemSetBadge(problemSetId: number, data: BadgeBody) {
|
||||
return api.post<ProblemSetBadge>(
|
||||
return api.post<AdminProblemSetBadge>(
|
||||
`admin/problem-sets/${problemSetId}/badges`,
|
||||
toBadgeBody(data),
|
||||
)
|
||||
@@ -639,7 +639,7 @@ export function editProblemSetBadge(
|
||||
badgeId: number,
|
||||
data: BadgeBody,
|
||||
) {
|
||||
return api.put<ProblemSetBadge>(
|
||||
return api.put<AdminProblemSetBadge>(
|
||||
`admin/problem-sets/${problemSetId}/badges/${badgeId}`,
|
||||
toBadgeBody(data),
|
||||
)
|
||||
|
||||
Reference in new issue
Block a user