Files
mayfly-go/frontend/src/directive/auth.ts

63 lines
1.8 KiB
TypeScript
Raw Normal View History

import type { App } from 'vue';
2023-03-15 11:41:03 +08:00
import { useUserInfo } from '@/store/userInfo';
import { judementSameArr } from '@/common/utils/arrayOperation';
2023-07-02 17:06:00 +08:00
import { hasPerm } from '@/components/auth/auth';
// 用户权限指令
export function authDirective(app: App) {
// 单个权限验证v-auth="xxx"
app.directive('auth', {
mounted(el, binding) {
2023-07-02 17:06:00 +08:00
if (!hasPerm(binding.value)) {
parseNoAuth(el, binding);
}
},
});
// 多个权限验证满足一个则显示v-auths="[xxx,xxx]"
app.directive('auths', {
mounted(el, binding) {
const value = binding.value;
2023-03-15 11:41:03 +08:00
let flag = false;
useUserInfo().userInfo.permissions.map((val: any) => {
value.map((v: any) => {
if (val === v) flag = true;
});
});
if (!flag) {
parseNoAuth(el, binding);
}
},
});
// 多个权限验证全部满足则显示v-auth-all="[xxx,xxx]"
app.directive('auth-all', {
mounted(el, binding) {
2023-03-15 11:41:03 +08:00
if (!judementSameArr(binding.value, useUserInfo().userInfo.permissions)) {
parseNoAuth(el, binding);
}
},
});
}
/**
*
*
* @param el
* @param binding
*/
const parseNoAuth = (el: any, binding: any) => {
const { arg } = binding;
// 如果是禁用模式,则将元素禁用
if (arg == 'disabled') {
el.setAttribute('disabled', true);
el.classList.add('is-disabled');
el.addEventListener('click', disableClickFn, true);
} else {
// 移除该元素
el.parentNode.removeChild(el);
}
};
const disableClickFn = (event: any) => {
event && event.stopImmediatePropagation();
};