diff --git a/apps/api/src/routes/admin/problem.ts b/apps/api/src/routes/admin/problem.ts index e0d5b9b..a80e64d 100644 --- a/apps/api/src/routes/admin/problem.ts +++ b/apps/api/src/routes/admin/problem.ts @@ -384,7 +384,13 @@ adminProblemRoutes.get("/problems", requireProblemPermission, async (c) => { const offset = queryInteger(c.req.query("offset"), 0, { min: 0 }) const user = c.get("user")! const filters = [isNull(schema.problem.contestId)] - if (!canManageAll(user)) filters.push(eq(schema.problem.createdById, user.id)) + // library=1 是比赛的「从题库中选择」:要列的是 from-public 实际放行的范围 —— 所有可见的 + // 公开题,加上自己能改的。只按 created_by 过滤的话,「仅管理自己创建」的老师一道题都看不到 + const library = c.req.query("library") === "1" + if (!canManageAll(user)) { + const own = eq(schema.problem.createdById, user.id) + filters.push(library ? or(eq(schema.problem.visible, true), own)! : own) + } const author = c.req.query("author")?.trim() const keyword = c.req.query("keyword")?.trim() const tagId = c.req.query("tagId")?.trim() diff --git a/apps/web/src/admin/api.ts b/apps/web/src/admin/api.ts index db0d8ce..31672de 100644 --- a/apps/web/src/admin/api.ts +++ b/apps/web/src/admin/api.ts @@ -74,6 +74,17 @@ export async function getProblemList( } } +// 比赛「从题库中选择」用:列所有可见的公开题,不只是自己创建的 +export async function getLibraryProblemList(offset = 0, limit = 10, keyword: string) { + const res = await api.get("admin/problems", { + params: { offset, limit, keyword, library: 1 }, + }) + return { + results: res.results.map(toAdminProblemRow), + total: res.total, + } +} + export function deleteProblem(id: number) { return api.delete(`admin/problems/${id}`) } diff --git a/apps/web/src/admin/problem/components/AddFromLibraryModal.vue b/apps/web/src/admin/problem/components/AddFromLibraryModal.vue index 4a99d93..79c20b1 100644 --- a/apps/web/src/admin/problem/components/AddFromLibraryModal.vue +++ b/apps/web/src/admin/problem/components/AddFromLibraryModal.vue @@ -1,5 +1,5 @@