access.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 accessToken = computed(() => coreStoreAccess.accessToken);
  15. const userRoles = computed(() => coreStoreAccess.userRoles);
  16. const userInfo = computed(() => coreStoreAccess.userInfo);
  17. const accessRoutes = computed(() => coreStoreAccess.accessRoutes);
  18. function setAccessMenus(menus: MenuRecordRaw[]) {
  19. coreStoreAccess.setAccessMenus(menus);
  20. }
  21. function setAccessRoutes(routes: RouteRecordRaw[]) {
  22. coreStoreAccess.setAccessRoutes(routes);
  23. }
  24. /**
  25. * 异步处理登录操作
  26. * Asynchronously handle the login process
  27. * @param params 登录表单数据
  28. */
  29. async function authLogin(
  30. params: LoginAndRegisterParams,
  31. onSuccess?: () => Promise<void>,
  32. ) {
  33. // 异步处理用户登录操作并获取 accessToken
  34. let userInfo: UserInfo | null = null;
  35. try {
  36. loading.value = true;
  37. const { accessToken, refreshToken } = await userLogin(params);
  38. // 如果成功获取到 accessToken
  39. // If accessToken is successfully obtained
  40. if (accessToken) {
  41. // 将 accessToken 存储到 accessStore 中
  42. // Store the accessToken in accessStore
  43. coreStoreAccess.setAccessToken(accessToken);
  44. coreStoreAccess.setRefreshToken(refreshToken);
  45. // 获取用户信息并存储到 accessStore 中
  46. // Get user information and store it in accessStore
  47. const [fetchUserInfoResult, accessCodes] = await Promise.all([
  48. fetchUserInfo(),
  49. getAccessCodes(),
  50. ]);
  51. userInfo = fetchUserInfoResult;
  52. coreStoreAccess.setUserInfo(userInfo);
  53. coreStoreAccess.setAccessCodes(accessCodes);
  54. onSuccess
  55. ? await onSuccess?.()
  56. : await router.push(userInfo.homePath || DEFAULT_HOME_PATH);
  57. }
  58. } finally {
  59. loading.value = false;
  60. }
  61. return {
  62. accessToken,
  63. userInfo,
  64. };
  65. }
  66. async function fetchUserInfo() {
  67. let userInfo: UserInfo | null = null;
  68. userInfo = await getUserInfo();
  69. coreStoreAccess.setUserInfo(userInfo);
  70. return userInfo;
  71. }
  72. function reset() {
  73. coreStoreAccess.$reset();
  74. }
  75. return {
  76. accessRoutes,
  77. accessToken,
  78. authLogin,
  79. fetchUserInfo,
  80. loading,
  81. reset,
  82. setAccessMenus,
  83. setAccessRoutes,
  84. userInfo,
  85. userRoles,
  86. };
  87. });