From a03e22e60faa3b3ff4ae156347d48369b60c1add Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Tue, 25 Aug 2026 17:37:58 -0600 Subject: [PATCH] =?UTF-8?q?chore(=E5=89=8D=E7=AB=AF):=20=E5=88=A0=E6=8E=89?= =?UTF-8?q?=E4=B8=89=E4=B8=AA=E4=BB=8E=20ojnext=20=E6=90=AC=E6=9D=A5?= =?UTF-8?q?=E5=B0=B1=E6=B2=A1=E4=BA=BA=E7=94=A8=E7=9A=84=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 阶段 1 是「原样搬入、不改业务代码」,所以 ojnext 里已经死掉的东西也一起 搬了过来。这三个文件全仓零引用: - utils/permissions.ts(usePermissions / checkRoutePermission) - oj/ai/components/StreakStats.vue - shared/components/IconButton.vue 确认方式:在 apps/web 全部 .ts / .vue / .json / .html / .js 里搜这五个名字 (排除文件自身)零命中;两个组件也不在自动生成的 components.d.ts 里, permissions.ts 的两个导出同样不在 auto-imports.d.ts 里 —— 也就是说 它们连自动导入的注册都没拿到,不存在「模板里隐式用到」的可能。 permissions.ts 在 ojnext 里也是死的,不是搬运过程产生的。 vue-tsc 0 error,vite build 通过。 Co-Authored-By: Claude Opus 5 --- apps/web/src/oj/ai/components/StreakStats.vue | 166 ------------------ apps/web/src/shared/components/IconButton.vue | 29 --- apps/web/src/utils/permissions.ts | 108 ------------ 3 files changed, 303 deletions(-) delete mode 100644 apps/web/src/oj/ai/components/StreakStats.vue delete mode 100644 apps/web/src/shared/components/IconButton.vue delete mode 100644 apps/web/src/utils/permissions.ts diff --git a/apps/web/src/oj/ai/components/StreakStats.vue b/apps/web/src/oj/ai/components/StreakStats.vue deleted file mode 100644 index 518f8b6..0000000 --- a/apps/web/src/oj/ai/components/StreakStats.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - diff --git a/apps/web/src/shared/components/IconButton.vue b/apps/web/src/shared/components/IconButton.vue deleted file mode 100644 index 8fbe0b1..0000000 --- a/apps/web/src/shared/components/IconButton.vue +++ /dev/null @@ -1,29 +0,0 @@ - - diff --git a/apps/web/src/utils/permissions.ts b/apps/web/src/utils/permissions.ts deleted file mode 100644 index 34921e6..0000000 --- a/apps/web/src/utils/permissions.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { useUserStore } from "shared/store/user" - -export function usePermissions() { - const userStore = useUserStore() - - return { - isAuthenticated: computed(() => userStore.isAuthed), - isAdminRole: computed(() => userStore.isAdminRole), - isTeacherOrAbove: computed(() => userStore.isTeacherOrAbove), - isSuperAdmin: computed(() => userStore.isSuperAdmin), - hasProblemPermission: computed(() => userStore.hasProblemPermission), - - canManageUsers: computed(() => userStore.isSuperAdmin), - canManageAnnouncements: computed(() => userStore.isSuperAdmin), - canManageTutorials: computed(() => userStore.isSuperAdmin), - canManageSystemConfig: computed(() => userStore.isSuperAdmin), - canSendMessages: computed(() => userStore.isSuperAdmin), - - canManageProblems: computed(() => userStore.hasProblemPermission), - canManageContests: computed(() => userStore.isTeacherOrAbove), - canManageProblemsets: computed(() => userStore.isTeacherOrAbove), - canViewClassroomData: computed(() => userStore.isTeacherOrAbove), - - canManageAllProblems: computed( - () => - userStore.user?.problemPermission === "All" || userStore.isSuperAdmin, - ), - canManageOwnProblems: computed( - () => - userStore.user?.problemPermission === "Own" && !userStore.isSuperAdmin, - ), - - getUserPermissionLevel: computed(() => { - if (userStore.isSuperAdmin) return "超级管理员" - if (userStore.isTeacherAdmin) return "教师管理员" - if (userStore.isStudentAdmin) return "学生管理员" - return "普通用户" - }), - - getProblemPermissionLevel: computed(() => { - if (!userStore.user) return "无权限" - switch (userStore.user.problemPermission) { - case "All": - return "管理所有题目" - case "Own": - return "管理自己的题目" - case "None": - return "无题目权限" - default: - return "无权限" - } - }), - } -} - -export function checkRoutePermission(routeName: string): boolean { - const userStore = useUserStore() - - const superAdminRoutes = [ - "admin home", - "admin config", - "admin user list", - "admin user generate", - "admin announcement list", - "admin announcement create", - "admin announcement edit", - "admin message list", - "admin tutorial list", - "admin tutorial create", - "admin tutorial edit", - ] - - const teacherAdminRoutes = [ - "admin contest list", - "admin contest create", - "admin contest edit", - "admin contest problem list", - "admin contest problem create", - "admin contest problem edit", - "admin contest helper", - "admin problemset list", - "admin problemset create", - "admin problemset edit", - "admin problemset detail", - "admin stuck problems", - "admin top ac trend", - ] - - const problemPermissionRoutes = [ - "admin problem list", - "admin problem create", - "admin problem edit", - ] - - if (superAdminRoutes.includes(routeName)) { - return userStore.isSuperAdmin - } - - if (teacherAdminRoutes.includes(routeName)) { - return userStore.isTeacherOrAbove - } - - if (problemPermissionRoutes.includes(routeName)) { - return userStore.hasProblemPermission - } - - return true -}