permission.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. import store from '@/store'
  2. import { isArray } from '@/utils/validate'
  3. /**
  4. * 是否可以访问目标权限元素
  5. * @param target 目标(路由|按钮)要求权限
  6. * @returns {boolean} 满足访问条件
  7. */
  8. export function hasPermission(target) {
  9. if (store.getters['acl/admin']) return true
  10. if (isArray(target) && target.length > 0)
  11. return can([...store.getters['acl/role'], ...store.getters['acl/permission']], {
  12. permission: target,
  13. mode: 'oneOf',
  14. })
  15. const { role, permission, mode = 'oneOf' } = target
  16. return can([mode !== 'except'], {
  17. permission: [
  18. role ? can(store.getters['acl/role'], { permission: role, mode }) : false,
  19. permission ? can(store.getters['acl/permission'], { permission, mode }) : false,
  20. ],
  21. mode,
  22. })
  23. }
  24. /**
  25. * 检查是否满足权限
  26. * @param roleOrPermission 当前用户权限
  27. * @param target 目标(路由|按钮)要求权限
  28. * @returns {boolean} 满足访问条件
  29. */
  30. function can(roleOrPermission, target) {
  31. let hasRole = false
  32. const { permission, mode } = target
  33. if (mode === 'allOf') hasRole = permission.every((item) => roleOrPermission.includes(item))
  34. if (mode === 'oneOf') hasRole = permission.some((item) => roleOrPermission.includes(item))
  35. if (mode === 'except') hasRole = !permission.every((item) => roleOrPermission.includes(item))
  36. return hasRole
  37. }