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.
crmeb/app/utils/auth/permission.js

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
};