Blame view

Yi.Vben5.Vue3/packages/effects/access/src/directive.ts 1.04 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  /**
   * Global authority directive
   * Used for fine-grained control of component permissions
   * @Example v-access:role="[ROLE_NAME]" or v-access:role="ROLE_NAME"
   * @Example v-access:code="[ROLE_CODE]" or v-access:code="ROLE_CODE"
   */
  import type { App, Directive, DirectiveBinding } from 'vue';
  
  import { useAccess } from './use-access';
  
  function isAccessible(
    el: Element,
    binding: DirectiveBinding<string | string[]>,
  ) {
    const { accessMode, hasAccessByCodes, hasAccessByRoles } = useAccess();
  
    const value = binding.value;
  
    if (!value) return;
    const authMethod =
      accessMode.value === 'frontend' && binding.arg === 'role'
        ? hasAccessByRoles
        : hasAccessByCodes;
  
    const values = Array.isArray(value) ? value : [value];
  
    if (!authMethod(values)) {
      el?.remove();
    }
  }
  
  const mounted = (el: Element, binding: DirectiveBinding<string | string[]>) => {
    isAccessible(el, binding);
  };
  
  const authDirective: Directive = {
    mounted,
  };
  
  export function registerAccessDirective(app: App) {
    app.directive('access', authDirective);
  }