You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.1 KiB
143 lines
3.1 KiB
|
|
/**
|
|
* 权限校验工具
|
|
* 用于便捷控制组件或者功能入口的显示隐藏或拦截
|
|
*/
|
|
|
|
import store from '@/store';
|
|
|
|
/**
|
|
* 字符权限校验
|
|
* @param {Array|string} value 校验值,可以是数组或单个权限字符串
|
|
* @returns {Boolean}
|
|
*/
|
|
export function checkPermi(value) {
|
|
if (!value) {
|
|
console.error('[Permission] need permissions! Like checkPermi("system:user:add") or checkPermi(["system:user:add", "system:user:edit"])');
|
|
return false;
|
|
}
|
|
|
|
const permissions = store.getters?.permissions || [];
|
|
const all_permission = '*:*:*';
|
|
|
|
// 如果是单个字符串,转换为数组
|
|
const permissionList = Array.isArray(value) ? value : [value];
|
|
|
|
// 检查是否有超管权限或匹配的权限
|
|
const hasPermission = permissions.some(permission => {
|
|
return all_permission === permission || permissionList.includes(permission);
|
|
});
|
|
|
|
return hasPermission;
|
|
}
|
|
|
|
/**
|
|
* 角色权限校验
|
|
* @param {Array|string} value 校验值,可以是数组或单个角色名
|
|
* @returns {Boolean}
|
|
*/
|
|
export function checkRole(value) {
|
|
if (!value) {
|
|
console.error('[Permission] need roles! Like checkRole("admin") or checkRole(["admin", "editor"])');
|
|
return false;
|
|
}
|
|
|
|
const roles = store.getters?.roles || [];
|
|
const super_admin = 'admin';
|
|
|
|
// 如果是单个字符串,转换为数组
|
|
const roleList = Array.isArray(value) ? value : [value];
|
|
|
|
// 检查是否有超管角色或匹配的角色
|
|
const hasRole = roleList.some(role => {
|
|
return super_admin === role || roles.includes(role);
|
|
});
|
|
|
|
return hasRole;
|
|
}
|
|
|
|
/**
|
|
* 判断是否是超级管理员
|
|
* @returns {Boolean}
|
|
*/
|
|
export function isSuperAdmin() {
|
|
const permissions = store.getters?.permissions || [];
|
|
return permissions.includes('*:*:*');
|
|
}
|
|
|
|
/**
|
|
* 获取权限列表
|
|
* @returns {Array}
|
|
*/
|
|
export function getPermissions() {
|
|
return store.getters?.permissions || [];
|
|
}
|
|
|
|
/**
|
|
* 获取角色列表
|
|
* @returns {Array}
|
|
*/
|
|
export function getRoles() {
|
|
return store.getters?.roles || [];
|
|
}
|
|
|
|
/**
|
|
* 获取管理员信息
|
|
* @returns {Object|null}
|
|
*/
|
|
export function getAdminInfo() {
|
|
return store.getters?.adminInfo || null;
|
|
}
|
|
|
|
/**
|
|
* 权限指令配置
|
|
* 用于 v-permission 指令
|
|
* 使用方式: v-permission="['system:user:add']" 或 v-permission="'system:user:add'"
|
|
*/
|
|
export const permissionDirective = {
|
|
inserted(el, binding) {
|
|
const { value } = binding;
|
|
|
|
if (!value) {
|
|
console.warn('[Permission Directive] need permission value, like v-permission="\'system:user:add\'"');
|
|
return;
|
|
}
|
|
|
|
if (!checkPermi(value)) {
|
|
el.parentNode && el.parentNode.removeChild(el);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 角色指令配置
|
|
* 用于 v-role 指令
|
|
* 使用方式: v-role="['admin']" 或 v-role="'admin'"
|
|
*/
|
|
export const roleDirective = {
|
|
inserted(el, binding) {
|
|
const { value } = binding;
|
|
|
|
if (!value) {
|
|
console.warn('[Role Directive] need role value, like v-role="\'admin\'"');
|
|
return;
|
|
}
|
|
|
|
if (!checkRole(value)) {
|
|
el.parentNode && el.parentNode.removeChild(el);
|
|
}
|
|
}
|
|
};
|
|
|
|
// 导出默认对象
|
|
export default {
|
|
checkPermi,
|
|
checkRole,
|
|
isSuperAdmin,
|
|
getPermissions,
|
|
getRoles,
|
|
getAdminInfo,
|
|
permissionDirective,
|
|
roleDirective
|
|
};
|