access-control.vue 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <!--
  2. Access control component for fine-grained access control.
  3. TODO: 可以扩展更完善的功能:
  4. 1. 支持多个权限码,只要有一个权限码满足即可 或者 多个权限码全部满足
  5. 2. 支持多个角色,只要有一个角色满足即可 或者 多个角色全部满足
  6. 3. 支持自定义权限码和角色的判断逻辑
  7. -->
  8. <script lang="ts" setup>
  9. import { computed } from 'vue';
  10. import { useAccess } from './use-access';
  11. interface Props {
  12. /**
  13. * Specified codes is visible
  14. * @default []
  15. */
  16. codes?: string[];
  17. /**
  18. * 通过什么方式来控制组件,如果是 role,则传入角色,如果是 code,则传入权限码
  19. * @default 'role'
  20. */
  21. type?: 'code' | 'role';
  22. }
  23. defineOptions({
  24. name: 'AccessControl',
  25. });
  26. const props = withDefaults(defineProps<Props>(), {
  27. codes: () => [],
  28. type: 'role',
  29. });
  30. const { hasAccessByCodes, hasAccessByRoles } = useAccess();
  31. const hasAuth = computed(() => {
  32. const { codes, type } = props;
  33. return type === 'role' ? hasAccessByRoles(codes) : hasAccessByCodes(codes);
  34. });
  35. </script>
  36. <template>
  37. <slot v-if="!codes"></slot>
  38. <slot v-else-if="hasAuth"></slot>
  39. </template>