From 5787efe023aa93ba7ac1eabc22f088cf06c42b46 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Fri, 16 Oct 2026 14:53:24 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E5=89=8D=E7=AB=AF):=20=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E5=88=A4=E6=96=AD=E6=94=B9=E7=94=A8=E5=A5=91=E7=BA=A6?= =?UTF-8?q?=E9=87=8C=E7=9A=84=E7=99=BD=E5=90=8D=E5=8D=95=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=9C=A8=20user=20store=20=E9=87=8C=E9=80=90=E4=B8=AA?= =?UTF-8?q?=E5=88=97=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 契约 roles.ts 写明 ADMIN_ROLES / TEACHER_ROLES 是全仓唯一的定义处,前端 user store 却用 === 把角色又列了一遍;将来加角色只改契约就会两边对不上。判断结果不变。 Co-Authored-By: Claude Opus 5.5 --- apps/web/src/shared/store/user.ts | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/apps/web/src/shared/store/user.ts b/apps/web/src/shared/store/user.ts index 8b34b1b..47f8a91 100644 --- a/apps/web/src/shared/store/user.ts +++ b/apps/web/src/shared/store/user.ts @@ -1,3 +1,4 @@ +import { ADMIN_ROLES, TEACHER_ROLES, type AdminType } from "@oj2/contract" import { PROBLEM_PERMISSION, STORAGE_KEY, USER_TYPE } from "utils/constants" import storage from "utils/storage" import type { Profile, SessionUser } from "utils/types" @@ -23,25 +24,18 @@ export const useUserStore = defineStore("user", () => { const demoSwitch = ref(storage.get(STORAGE_KEY.DEMO_MODE) ?? false) const demoMode = computed(() => demoSwitch.value && realIsSuperAdmin.value) - const isAdminRole = computed( - () => - !demoMode.value && - (user.value?.adminType === USER_TYPE.STUDENT_ADMIN || - user.value?.adminType === USER_TYPE.TEACHER_ADMIN || - user.value?.adminType === USER_TYPE.SUPER_ADMIN), - ) + // 分组用契约里的白名单(roles.ts,全仓唯一的定义处),别在这里再列一遍角色 + const hasRole = (roles: readonly AdminType[]) => + !demoMode.value && !!user.value && (roles as readonly string[]).includes(user.value.adminType) + + const isAdminRole = computed(() => hasRole(ADMIN_ROLES)) const isStudentAdmin = computed( () => !demoMode.value && user.value?.adminType === USER_TYPE.STUDENT_ADMIN, ) const isTeacherAdmin = computed( () => !demoMode.value && user.value?.adminType === USER_TYPE.TEACHER_ADMIN, ) - const isTeacherOrAbove = computed( - () => - !demoMode.value && - (user.value?.adminType === USER_TYPE.TEACHER_ADMIN || - user.value?.adminType === USER_TYPE.SUPER_ADMIN), - ) + const isTeacherOrAbove = computed(() => hasRole(TEACHER_ROLES)) const isSuperAdmin = computed(() => !demoMode.value && realIsSuperAdmin.value) const hasProblemPermission = computed( () => !demoMode.value && user.value?.problemPermission !== PROBLEM_PERMISSION.NONE,