access.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import type { MenuRecordRaw } from '@vben-core/typings';
  3. import { acceptHMRUpdate, defineStore } from 'pinia';
  4. type AccessToken = null | string;
  5. interface AccessState {
  6. /**
  7. * 权限码
  8. */
  9. accessCodes: string[];
  10. /**
  11. * 可访问的菜单列表
  12. */
  13. accessMenus: MenuRecordRaw[];
  14. /**
  15. * 可访问的路由列表
  16. */
  17. accessRoutes: RouteRecordRaw[];
  18. /**
  19. * 登录 accessToken
  20. */
  21. accessToken: AccessToken;
  22. /**
  23. * 是否已经检查过权限
  24. */
  25. isAccessChecked: boolean;
  26. /**
  27. * 是否锁屏状态
  28. */
  29. isLockScreen: boolean;
  30. /**
  31. * 锁屏密码
  32. */
  33. lockScreenPassword?: string;
  34. /**
  35. * 登录是否过期
  36. */
  37. loginExpired: boolean;
  38. /**
  39. * 登录 accessToken
  40. */
  41. refreshToken: AccessToken;
  42. }
  43. /**
  44. * @zh_CN 访问权限相关
  45. */
  46. export const useAccessStore = defineStore('core-access', {
  47. actions: {
  48. getMenuByPath(path: string) {
  49. function findMenu(
  50. menus: MenuRecordRaw[],
  51. path: string,
  52. ): MenuRecordRaw | undefined {
  53. for (const menu of menus) {
  54. if (menu.path === path) {
  55. return menu;
  56. }
  57. if (menu.children) {
  58. const matched = findMenu(menu.children, path);
  59. if (matched) {
  60. return matched;
  61. }
  62. }
  63. }
  64. }
  65. return findMenu(this.accessMenus, path);
  66. },
  67. lockScreen(password: string) {
  68. this.isLockScreen = true;
  69. this.lockScreenPassword = password;
  70. },
  71. setAccessCodes(codes: string[]) {
  72. this.accessCodes = codes;
  73. },
  74. setAccessMenus(menus: MenuRecordRaw[]) {
  75. this.accessMenus = menus;
  76. },
  77. setAccessRoutes(routes: RouteRecordRaw[]) {
  78. this.accessRoutes = routes;
  79. },
  80. setAccessToken(token: AccessToken) {
  81. this.accessToken = token;
  82. },
  83. setIsAccessChecked(isAccessChecked: boolean) {
  84. this.isAccessChecked = isAccessChecked;
  85. },
  86. setLoginExpired(loginExpired: boolean) {
  87. this.loginExpired = loginExpired;
  88. },
  89. setRefreshToken(token: AccessToken) {
  90. this.refreshToken = token;
  91. },
  92. unlockScreen() {
  93. this.isLockScreen = false;
  94. this.lockScreenPassword = undefined;
  95. },
  96. },
  97. persist: {
  98. // 持久化
  99. pick: [
  100. 'accessToken',
  101. 'refreshToken',
  102. 'accessCodes',
  103. 'isLockScreen',
  104. 'lockScreenPassword',
  105. ],
  106. },
  107. state: (): AccessState => ({
  108. accessCodes: [],
  109. accessMenus: [],
  110. accessRoutes: [],
  111. accessToken: null,
  112. isAccessChecked: false,
  113. isLockScreen: false,
  114. lockScreenPassword: undefined,
  115. loginExpired: false,
  116. refreshToken: null,
  117. }),
  118. });
  119. // 解决热更新问题
  120. const hot = import.meta.hot;
  121. if (hot) {
  122. hot.accept(acceptHMRUpdate(useAccessStore, hot));
  123. }