access.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import type { MenuRecordRaw, UserInfo } from '@vben/types';
  2. import type { LoginAndRegisterParams } from '@vben/universal-ui';
  3. import type { RouteRecordRaw } from 'vue-router';
  4. import { computed, ref } from 'vue';
  5. import { useRouter } from 'vue-router';
  6. import { DEFAULT_HOME_PATH } from '@vben/constants';
  7. import { useCoreAccessStore } from '@vben-core/stores';
  8. import { defineStore } from 'pinia';
  9. import { getAccessCodes, getUserInfo, userLogin } from '#/apis';
  10. export const useAccessStore = defineStore('access', () => {
  11. const coreStoreAccess = useCoreAccessStore();
  12. const router = useRouter();
  13. const loading = ref(false);
  14. const showLoginDialog = ref(false);
  15. function setShowLoginDialog(value: boolean) {
  16. showLoginDialog.value = value;
  17. }
  18. const accessToken = computed(() => coreStoreAccess.accessToken);
  19. const userRoles = computed(() => coreStoreAccess.userRoles);
  20. const userInfo = computed(() => coreStoreAccess.userInfo);
  21. const accessRoutes = computed(() => coreStoreAccess.accessRoutes);
  22. function setAccessMenus(menus: MenuRecordRaw[]) {
  23. coreStoreAccess.setAccessMenus(menus);
  24. }
  25. function setAccessRoutes(routes: RouteRecordRaw[]) {
  26. coreStoreAccess.setAccessRoutes(routes);
  27. }
  28. /**
  29. * 异步处理登录操作
  30. * Asynchronously handle the login process
  31. * @param params 登录表单数据
  32. */
  33. async function authLogin(
  34. params: LoginAndRegisterParams,
  35. onSuccess?: () => Promise<void>,
  36. ) {
  37. // 异步处理用户登录操作并获取 accessToken
  38. let userInfo: UserInfo | null = null;
  39. try {
  40. loading.value = true;
  41. const { accessToken, refreshToken } = await userLogin(params);
  42. // 如果成功获取到 accessToken
  43. // If accessToken is successfully obtained
  44. if (accessToken) {
  45. // 将 accessToken 存储到 accessStore 中
  46. // Store the accessToken in accessStore
  47. coreStoreAccess.setAccessToken(accessToken);
  48. coreStoreAccess.setRefreshToken(refreshToken);
  49. // 获取用户信息并存储到 accessStore 中
  50. // Get user information and store it in accessStore
  51. const [fetchUserInfoResult, accessCodes] = await Promise.all([
  52. fetchUserInfo(),
  53. getAccessCodes(),
  54. ]);
  55. userInfo = fetchUserInfoResult;
  56. coreStoreAccess.setUserInfo(userInfo);
  57. coreStoreAccess.setAccessCodes(accessCodes);
  58. showLoginDialog.value = false;
  59. onSuccess
  60. ? await onSuccess?.()
  61. : await router.push(userInfo.homePath || DEFAULT_HOME_PATH);
  62. }
  63. } finally {
  64. loading.value = false;
  65. }
  66. return {
  67. accessToken,
  68. userInfo,
  69. };
  70. }
  71. async function fetchUserInfo() {
  72. let userInfo: UserInfo | null = null;
  73. userInfo = await getUserInfo();
  74. coreStoreAccess.setUserInfo(userInfo);
  75. return userInfo;
  76. }
  77. function reset() {
  78. coreStoreAccess.$reset();
  79. }
  80. return {
  81. accessRoutes,
  82. accessToken,
  83. authLogin,
  84. fetchUserInfo,
  85. loading,
  86. reset,
  87. setAccessMenus,
  88. setAccessRoutes,
  89. setShowLoginDialog,
  90. showLoginDialog,
  91. userInfo,
  92. userRoles,
  93. };
  94. });