/** * 权限校验工具 * 用于便捷控制组件或者功能入口的显示隐藏或拦截 */ 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 };