14 changed files with 89 additions and 36 deletions
@ -0,0 +1,38 @@ |
|||||
|
/** |
||||
|
* Global authority directive |
||||
|
* Used for fine-grained control of component permissions |
||||
|
* @Example v-auth="RoleEnum.TEST" |
||||
|
*/ |
||||
|
import type { App, Directive, DirectiveBinding } from 'vue'; |
||||
|
|
||||
|
import { useAccess } from './use-access'; |
||||
|
|
||||
|
function isAccessible(el: Element, binding: any) { |
||||
|
const { accessMode, hasAccessByCodes, hasAccessByRoles } = useAccess(); |
||||
|
|
||||
|
const value = binding.value; |
||||
|
|
||||
|
if (!value) { |
||||
|
return; |
||||
|
} |
||||
|
const authMethod = |
||||
|
accessMode.value === 'frontend' ? hasAccessByRoles : hasAccessByCodes; |
||||
|
|
||||
|
if (!authMethod(value)) { |
||||
|
el?.remove(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
const mounted = (el: Element, binding: DirectiveBinding<string | string[]>) => { |
||||
|
isAccessible(el, binding); |
||||
|
}; |
||||
|
|
||||
|
const authDirective: Directive = { |
||||
|
mounted, |
||||
|
}; |
||||
|
|
||||
|
export function installAccessDirective(app: App) { |
||||
|
app.directive('access', authDirective); |
||||
|
} |
||||
|
|
||||
|
export default authDirective; |
||||
@ -1,3 +1,4 @@ |
|||||
export { default as AccessControl } from './access-control.vue'; |
export { default as AccessControl } from './access-control.vue'; |
||||
|
export * from './directive'; |
||||
export * from './generate-accessible'; |
export * from './generate-accessible'; |
||||
export * from './use-access'; |
export * from './use-access'; |
||||
|
|||||
Loading…
Reference in new issue