import Vue from 'vue' import store from '@/store' function checkPermission(el: HTMLElement, binding, vnode, oldVnode) { const { value } = binding const myRoles = (store.getters['user/sysRoles'] || []) as Array<{ code: string; name: string }> let hasPermission = false switch (true) { // 如果是数组,满足其中一个条件即可 case Array.isArray(value): hasPermission = myRoles.some((role) => value.includes(role.code)) break case typeof value === 'string': hasPermission = myRoles.findIndex((v) => v.code === value) >= 0 break // 如果是 object 对象,则需要同时满足这几个条件 case Object.prototype.toString.call(value) === '[object Object]': let isBreak = false for (const key in value) { if (value.hasOwnProperty(key)) { const v = value[key] if (myRoles.findIndex((role) => role.code === v) < 0) { isBreak = true break } } } if (!isBreak) { hasPermission = true } break case typeof value === 'boolean': hasPermission = !!value break default: // eslint-disable-next-line no-console console.error(new Error(`need roles! Like v-role="['SuperManager','Manager']"`)) } if (!hasPermission) { const comment = document.createComment('permission deny') vnode.elm = comment vnode.isComment = true el.parentNode?.replaceChild(comment, el) } else { el.setAttribute('data-permission', 'allow') } } const directive = { inserted(el, binding, vnode, oldVnode) { checkPermission(el, binding, vnode, oldVnode) }, update(el, binding, vnode, oldVnode) { checkPermission(el, binding, vnode, oldVnode) }, } /** * v-role 指令 * * 按用户所属的角色进行权限划分 * * NOTE: 不支持用在