refactor: ♻️ 按钮权限指令优化
This commit is contained in:
@@ -1,40 +1,64 @@
|
|||||||
import { hasAuth } from "@/plugins/permission";
|
|
||||||
import type { Directive, DirectiveBinding } from "vue";
|
import type { Directive, DirectiveBinding } from "vue";
|
||||||
|
|
||||||
|
import { useUserStore } from "@/store";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 按钮权限
|
* 按钮权限
|
||||||
*/
|
*/
|
||||||
export const hasPerm: Directive = {
|
export const hasPerm: Directive = {
|
||||||
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
||||||
// DOM绑定需要的按钮权限标识
|
const requiredPerms = binding.value;
|
||||||
const { value: requiredPerms } = binding;
|
|
||||||
if (requiredPerms) {
|
// 校验传入的权限值是否合法
|
||||||
if (!hasAuth(requiredPerms)) {
|
if (!requiredPerms || (typeof requiredPerms !== "string" && !Array.isArray(requiredPerms))) {
|
||||||
if (el.parentNode) {
|
throw new Error(
|
||||||
|
"需要提供权限标识!例如:v-has-perm=\"'sys:user:add'\" 或 v-has-perm=\"['sys:user:add', 'sys:user:edit']\""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const { roles, perms } = useUserStore().userInfo;
|
||||||
|
|
||||||
|
// 超级管理员拥有所有权限
|
||||||
|
if (roles.includes("ROOT")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查权限
|
||||||
|
const hasAuth = Array.isArray(requiredPerms)
|
||||||
|
? requiredPerms.some((perm) => perms.includes(perm))
|
||||||
|
: perms.includes(requiredPerms);
|
||||||
|
|
||||||
|
// 如果没有权限,移除该元素
|
||||||
|
if (!hasAuth && el.parentNode) {
|
||||||
el.parentNode.removeChild(el);
|
el.parentNode.removeChild(el);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error("need perms! Like v-has-perm=\"['sys:user:add','sys:user:edit']\"");
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 角色权限
|
* 角色权限指令
|
||||||
*/
|
*/
|
||||||
export const hasRole: Directive = {
|
export const hasRole: Directive = {
|
||||||
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
||||||
// DOM绑定需要的角色编码
|
const requiredRoles = binding.value;
|
||||||
const { value: requiredRoles } = binding;
|
|
||||||
if (requiredRoles) {
|
// 校验传入的角色值是否合法
|
||||||
if (!hasAuth(requiredRoles, "role")) {
|
if (!requiredRoles || (typeof requiredRoles !== "string" && !Array.isArray(requiredRoles))) {
|
||||||
if (el.parentNode) {
|
throw new Error(
|
||||||
|
"需要提供角色标识!例如:v-has-role=\"'ADMIN'\" 或 v-has-role=\"['ADMIN', 'TEST']\""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const { roles } = useUserStore().userInfo;
|
||||||
|
|
||||||
|
// 检查是否有对应角色权限
|
||||||
|
const hasAuth = Array.isArray(requiredRoles)
|
||||||
|
? requiredRoles.some((role) => roles.includes(role))
|
||||||
|
: roles.includes(requiredRoles);
|
||||||
|
|
||||||
|
// 如果没有权限,移除元素
|
||||||
|
if (!hasAuth && el.parentNode) {
|
||||||
el.parentNode.removeChild(el);
|
el.parentNode.removeChild(el);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error("need roles! Like v-has-role=\"['admin','test']\"");
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -64,25 +64,10 @@ export function setupPermission() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 重定向到登录页 */
|
// 重定向到登录页
|
||||||
function redirectToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) {
|
function redirectToLogin(to: RouteLocationNormalized, next: NavigationGuardNext) {
|
||||||
const params = new URLSearchParams(to.query as Record<string, string>);
|
const params = new URLSearchParams(to.query as Record<string, string>);
|
||||||
const queryString = params.toString();
|
const queryString = params.toString();
|
||||||
const redirect = queryString ? `${to.path}?${queryString}` : to.path;
|
const redirect = queryString ? `${to.path}?${queryString}` : to.path;
|
||||||
next(`/login?redirect=${encodeURIComponent(redirect)}`);
|
next(`/login?redirect=${encodeURIComponent(redirect)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 判断是否有权限 */
|
|
||||||
export function hasAuth(value: string | string[], type: "button" | "role" = "button") {
|
|
||||||
const { roles, perms } = useUserStore().userInfo;
|
|
||||||
|
|
||||||
// 超级管理员 拥有所有权限
|
|
||||||
if (type === "button" && roles.includes("ROOT")) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auths = type === "button" ? perms : roles;
|
|
||||||
return typeof value === "string"
|
|
||||||
? auths.includes(value)
|
|
||||||
: value.some((perm) => auths.includes(perm));
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@
|
|||||||
新增
|
新增
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPerm="['sys:user:delete']"
|
v-hasPerm="'sys:user:delete'"
|
||||||
type="danger"
|
type="danger"
|
||||||
icon="delete"
|
icon="delete"
|
||||||
:disabled="selectIds.length === 0"
|
:disabled="selectIds.length === 0"
|
||||||
@@ -76,20 +76,14 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPerm="['sys:user:import']"
|
v-hasPerm="'sys:user:import'"
|
||||||
type="default"
|
|
||||||
icon="upload"
|
icon="upload"
|
||||||
@click="handleOpenImportDialog"
|
@click="handleOpenImportDialog"
|
||||||
>
|
>
|
||||||
导入
|
导入
|
||||||
</el-button>
|
</el-button>
|
||||||
|
|
||||||
<el-button
|
<el-button v-hasPerm="'sys:user:export'" icon="download" @click="handleExport">
|
||||||
v-hasPerm="['sys:user:export']"
|
|
||||||
type="default"
|
|
||||||
icon="download"
|
|
||||||
@click="handleExport"
|
|
||||||
>
|
|
||||||
导出
|
导出
|
||||||
</el-button>
|
</el-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -118,7 +112,7 @@
|
|||||||
<el-table-column label="操作" fixed="right" width="220">
|
<el-table-column label="操作" fixed="right" width="220">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPerm="['sys:user:password:reset']"
|
v-hasPerm="'sys:user:password:reset'"
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="RefreshLeft"
|
icon="RefreshLeft"
|
||||||
size="small"
|
size="small"
|
||||||
@@ -128,7 +122,7 @@
|
|||||||
重置密码
|
重置密码
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
v-hasPerm="['sys:user:edit']"
|
v-hasPerm="'sys:user:edit'"
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="edit"
|
icon="edit"
|
||||||
link
|
link
|
||||||
|
|||||||
Reference in New Issue
Block a user