index.jsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { computed, defineComponent } from 'vue'
  2. import { isInputEmpty } from '@cip/utils/util'
  3. // 收集依赖用于下级的授权[注:export useCollectPrivileges 是为了兼容历史版本]
  4. import { usePrivileges, useCollectPrivileges } from '@cip/hooks/use-privileges'
  5. export {
  6. usePrivileges, useCollectPrivileges
  7. }
  8. export default defineComponent({
  9. name: 'CipJudgePrivilege',
  10. props: {
  11. privilege: [Object, String, Number] // 不支持
  12. },
  13. setup (props, { slots }) {
  14. const ownPrivileges = usePrivileges() // 当前拥有的权限 由provide下发
  15. const judgeType = computed(() => {
  16. if (typeof props.privilege === 'object' && props.privilege.type === 'and') {
  17. return 'and'
  18. }
  19. return 'or'
  20. })
  21. // 返回数组
  22. const privilegeValues = computed(() => {
  23. let codes = []
  24. if (typeof props.privilege === 'object') { // 判断是否为对象
  25. codes = codes.concat(props.privilege.code)
  26. } else {
  27. codes = codes.concat(props.privilege)
  28. }
  29. return codes
  30. })
  31. // 判断是否拥有特权
  32. const hasPrivilege = computed(() => {
  33. if (judgeType.value === 'or') { // 或模式 存在 '' | undefined | null
  34. if (privilegeValues.value.findIndex(v => isInputEmpty(v)) > -1) return true
  35. }
  36. // 过滤掉 '' | undefined | null
  37. const effectiveCodes = privilegeValues.value.filter(code => !isInputEmpty(code))
  38. if (effectiveCodes.length === 0) return true
  39. if (judgeType.value === 'and') {
  40. return !effectiveCodes.some(v => !ownPrivileges.value.includes(v))
  41. } else {
  42. return effectiveCodes.some(v => ownPrivileges.value.includes(v))
  43. }
  44. })
  45. return () => {
  46. if (!hasPrivilege.value) {
  47. // 渲染无权限插槽
  48. return slots.noPrivilege?.()
  49. } else {
  50. // 渲染默认插槽
  51. return slots.default?.()
  52. }
  53. }
  54. }
  55. })