diff --git a/src/directives/permission.ts b/src/directives/permission.ts index 27e2449..de85412 100644 --- a/src/directives/permission.ts +++ b/src/directives/permission.ts @@ -4,7 +4,7 @@ import { usePermission } from '@/hooks' export function install(app: App) { const { hasPermission } = usePermission() - function updatapermission(el: HTMLElement, permission: Entity.RoleType | Entity.RoleType[]) { + function updatapermission(el: HTMLElement, permission: string | string[]) { if (!permission) throw new Error('v-permissson Directive with no explicit role attached') @@ -12,13 +12,10 @@ export function install(app: App) { el.parentElement?.removeChild(el) } - const permissionDirective: Directive = { + const permissionDirective: Directive = { mounted(el, binding) { updatapermission(el, binding.value) }, - updated(el, binding) { - updatapermission(el, binding.value) - }, } app.directive('permission', permissionDirective) } diff --git a/src/hooks/usePermission.ts b/src/hooks/usePermission.ts index 59c751a..9a1977d 100644 --- a/src/hooks/usePermission.ts +++ b/src/hooks/usePermission.ts @@ -1,32 +1,25 @@ import { useAuthStore } from '@/store' -import { isArray, isString } from 'radash' /** 权限判断 */ export function usePermission() { const authStore = useAuthStore() function hasPermission( - permission?: Entity.RoleType | Entity.RoleType[], + permissions?: string | string[], ) { - if (!permission) + if (!permissions) return true - if (!authStore.userInfo) - return false - const { roles } = authStore.userInfo + // 全部权限 + if (permissions === '*:*:*') + return true - // 角色为super可直接通过 - let has = roles.includes('super') - if (!has) { - if (isArray(permission)) - // 角色为数组, 判断是否有交集 - has = permission.some(i => roles.includes(i)) + const { permissions: userPermissions } = authStore - if (isString(permission)) - // 角色为字符串, 判断是否包含 - has = roles.includes(permission) - } - return has + // 确保 permissions 是数组 + const permissionArray = Array.isArray(permissions) ? permissions : [permissions] + + return permissionArray.some(i => userPermissions.includes(i)) } return { diff --git a/src/store/auth.ts b/src/store/auth.ts index 133b162..0c0f8a3 100644 --- a/src/store/auth.ts +++ b/src/store/auth.ts @@ -6,11 +6,13 @@ import { useTabStore } from './tab' interface AuthStatus { userInfo: Entity.User | Record + permissions: string[] } export const useAuthStore = defineStore('auth-store', { state: (): AuthStatus => { return { userInfo: {}, + permissions: [], } }, getters: {