authDirective.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import type { App } from 'vue';
  2. import { smallInBig } from '/@/utils/arrayOperation';
  3. import router from '../router';
  4. /**
  5. * 用户权限指令
  6. * @directive 单个权限验证(v-auth="xxx")
  7. * @directive 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]")
  8. * @directive 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]")
  9. */
  10. export function authDirective(app: App) {
  11. const allPermissions = "*/*/*"
  12. // 单个权限验证(v-auth="xxx")
  13. app.directive('auth', {
  14. mounted(el, binding) {
  15. if (localStorage.btnNoAuth) return
  16. const buttons = <string[]>router.currentRoute.value.meta.buttons
  17. if (buttons.includes(allPermissions)) return
  18. // 不显示该dom
  19. if (!buttons.includes(binding.value)) el.parentNode?.removeChild(el)
  20. // 设置为disabled
  21. // if (!buttons.includes(binding.value)) el.classList.add('v-disabled')
  22. },
  23. });
  24. app.directive('noauth', {
  25. mounted(el, binding) {
  26. const buttons = <string[]>router.currentRoute.value.meta.buttons
  27. if (buttons.includes(binding.value)) el.parentNode?.removeChild(el)
  28. },
  29. });
  30. // 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]")
  31. app.directive('auths', {
  32. mounted(el, binding) {
  33. if (localStorage.btnNoAuth) return
  34. const buttons = <string[]>router.currentRoute.value.meta.buttons
  35. if (buttons.includes(allPermissions)) return
  36. let flag = false;
  37. buttons.map((val: string) => {
  38. binding.value.map((v: string) => {
  39. if (val === v) flag = true;
  40. });
  41. });
  42. if (!flag) el.parentNode?.removeChild(el);
  43. // if (!flag) el.classList.add('v-disabled')
  44. },
  45. });
  46. // 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]")
  47. app.directive('auth-all', {
  48. mounted(el, binding) {
  49. if (localStorage.btnNoAuth) return
  50. const buttons = <string[]>router.currentRoute.value.meta.buttons
  51. if (buttons.includes(allPermissions)) return
  52. !smallInBig(buttons, binding.value) && el.parentNode?.removeChild(el)
  53. // !smallInBig(buttons, binding.value) && el.classList.add('v-disabled')
  54. },
  55. });
  56. }