access.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import type { MenuRecordRaw } from '@vben-core/typings';
  2. import type { RouteRecordRaw } from 'vue-router';
  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. loginExpired: boolean;
  30. /**
  31. * 登录 accessToken
  32. */
  33. refreshToken: AccessToken;
  34. }
  35. /**
  36. * @zh_CN 访问权限相关
  37. */
  38. export const useAccessStore = defineStore('core-access', {
  39. actions: {
  40. setAccessCodes(codes: string[]) {
  41. this.accessCodes = codes;
  42. },
  43. setAccessMenus(menus: MenuRecordRaw[]) {
  44. this.accessMenus = menus;
  45. },
  46. setAccessRoutes(routes: RouteRecordRaw[]) {
  47. this.accessRoutes = routes;
  48. },
  49. setAccessToken(token: AccessToken) {
  50. this.accessToken = token;
  51. },
  52. setIsAccessChecked(isAccessChecked: boolean) {
  53. this.isAccessChecked = isAccessChecked;
  54. },
  55. setLoginExpired(loginExpired: boolean) {
  56. this.loginExpired = loginExpired;
  57. },
  58. setRefreshToken(token: AccessToken) {
  59. this.refreshToken = token;
  60. },
  61. },
  62. persist: {
  63. // 持久化
  64. paths: ['accessToken', 'refreshToken', 'accessCodes'],
  65. },
  66. state: (): AccessState => ({
  67. accessCodes: [],
  68. accessMenus: [],
  69. accessRoutes: [],
  70. accessToken: null,
  71. isAccessChecked: false,
  72. loginExpired: false,
  73. refreshToken: null,
  74. }),
  75. });
  76. // 解决热更新问题
  77. const hot = import.meta.hot;
  78. if (hot) {
  79. hot.accept(acceptHMRUpdate(useAccessStore, hot));
  80. }