From 02b2cfc6531a2d830b646ea6db066939cb6438ff Mon Sep 17 00:00:00 2001 From: cshaptx4869 <994774638@qq.com> Date: Fri, 17 May 2024 10:57:20 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20:recycle:=20=E6=8A=BD=E7=A6=BB?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=88=A4=E6=96=AD=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/directive/permission/index.ts | 35 ++++++++----------------------- src/plugins/permission.ts | 18 ++++++++++++++++ 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/directive/permission/index.ts b/src/directive/permission/index.ts index 2bd2c705..7a080e30 100644 --- a/src/directive/permission/index.ts +++ b/src/directive/permission/index.ts @@ -1,4 +1,4 @@ -import { useUserStoreHook } from "@/store/modules/user"; +import { hasAuth } from "@/plugins/permission"; import { Directive, DirectiveBinding } from "vue"; /** @@ -6,21 +6,10 @@ import { Directive, DirectiveBinding } from "vue"; */ export const hasPerm: Directive = { mounted(el: HTMLElement, binding: DirectiveBinding) { - // 「超级管理员」拥有所有的按钮权限 - const { roles, perms } = useUserStoreHook().user; - if (roles.includes("ROOT")) { - return true; - } - // 「其他角色」按钮权限校验 - const { value } = binding; - if (value) { - const requiredPerms = value; // DOM绑定需要的按钮权限标识 - - const hasPerm = perms?.some((perm) => { - return requiredPerms.includes(perm); - }); - - if (!hasPerm) { + // DOM绑定需要的按钮权限标识 + const { value: requiredPerms } = binding; + if (requiredPerms) { + if (!hasAuth(requiredPerms)) { el.parentNode && el.parentNode.removeChild(el); } } else { @@ -36,16 +25,10 @@ export const hasPerm: Directive = { */ export const hasRole: Directive = { mounted(el: HTMLElement, binding: DirectiveBinding) { - const { value } = binding; - - if (value) { - const requiredRoles = value; // DOM绑定需要的角色编码 - const { roles } = useUserStoreHook().user; - const hasRole = roles.some((perm) => { - return requiredRoles.includes(perm); - }); - - if (!hasRole) { + // DOM绑定需要的角色编码 + const { value: requiredRoles } = binding; + if (requiredRoles) { + if (!hasAuth(requiredRoles, "role")) { el.parentNode && el.parentNode.removeChild(el); } } else { diff --git a/src/plugins/permission.ts b/src/plugins/permission.ts index 661e08d6..a09b6f4b 100644 --- a/src/plugins/permission.ts +++ b/src/plugins/permission.ts @@ -4,6 +4,24 @@ import NProgress from "@/utils/nprogress"; import { RouteRecordRaw } from "vue-router"; import { TOKEN_KEY } from "@/enums/CacheEnum"; +// 是否有权限 +export function hasAuth( + value: string | string[], + type: "button" | "role" = "button" +) { + const { roles, perms } = useUserStore().user; + //「超级管理员」拥有所有的按钮权限 + if (type === "button" && roles.includes("ROOT")) { + return true; + } + const auths = type === "button" ? perms : roles; + return typeof value === "string" + ? auths.includes(value) + : auths.some((perm) => { + return value.includes(perm); + }); +} + export function setupPermission() { // 白名单路由 const whiteList = ["/login"];