diff --git a/resources/admin/directives/index.ts b/resources/admin/directives/index.ts new file mode 100644 index 0000000..94a61ec --- /dev/null +++ b/resources/admin/directives/index.ts @@ -0,0 +1,6 @@ +import type { App } from 'vue' + +import action from './permission/action' +export function bootstrapDirectives(app: App): void { + app.directive('action', action) +} diff --git a/resources/admin/directives/permission/action.ts b/resources/admin/directives/permission/action.ts new file mode 100644 index 0000000..5e23a2c --- /dev/null +++ b/resources/admin/directives/permission/action.ts @@ -0,0 +1,33 @@ +import { useUserStore } from '/admin/stores/modules/user' +import { MenuType } from '/admin/enum/app' +function checkAction(el: any, action: any) { + if (action.value && typeof action.value === 'string') { + const userStore = useUserStore() + const permissions = userStore.getPermissions + + action = action.value.replace('@', '.').toLowerCase() + const hasAction = permissions?.some(permission => { + if (permission.type === MenuType.Button_Type) { + const a: string = permission.module + '.' + permission.permission_mark.replace('@', '.') + return action === a.toLowerCase() + } + }) + + if (!hasAction) { + // el.style.display = 'none' + el.parentNode && el.parentNode.removeChild(el) + } + } else { + throw new Error(`need action! Like v-action="module.controller.action" || v-action="module@controller@action" `) + } +} + +export default { + mounted(el: any, binding: any) { + checkAction(el, binding) + }, + + updated(el: any, binding: any) { + checkAction(el, binding) + }, +} diff --git a/resources/admin/support/catchAdmin.ts b/resources/admin/support/catchAdmin.ts index 61ab151..75255b0 100644 --- a/resources/admin/support/catchAdmin.ts +++ b/resources/admin/support/catchAdmin.ts @@ -8,6 +8,7 @@ import { bootstrapStore } from '/admin/stores' import Cache from './cache' import { bootstrapI18n } from '/admin/i18n' import guard from '/admin/router/guard' +import { bootstrapDirectives } from '/admin/directives' /** * catchadmin @@ -31,7 +32,7 @@ export default class CatchAdmin { * admin boot */ bootstrap(): void { - this.useElementPlus().usePinia().useI18n().useRouter().mount() + this.useElementPlus().usePinia().useI18n().installDirectives().useRouter().mount() } /** @@ -86,4 +87,15 @@ export default class CatchAdmin { return this } + + /** + * install directives + * + * @protected + */ + protected installDirectives(): CatchAdmin { + bootstrapDirectives(this.app) + + return this + } }