access.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import type { LoginAndRegisterParams } from '@vben/common-ui';
  2. import type { MenuRecordRaw, UserInfo } from '@vben/types';
  3. import type { RouteRecordRaw } from 'vue-router';
  4. import { computed, ref } from 'vue';
  5. import { useRouter } from 'vue-router';
  6. import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
  7. import { resetAllStores, useCoreAccessStore } from '@vben/stores';
  8. import { notification } from 'ant-design-vue';
  9. import { defineStore } from 'pinia';
  10. import { getAccessCodes, getUserInfo, login } from '#/apis';
  11. import { $t } from '#/locales';
  12. export const useAccessStore = defineStore('access', () => {
  13. const coreStoreAccess = useCoreAccessStore();
  14. const router = useRouter();
  15. const loading = ref(false);
  16. const openLoginExpiredModal = ref(false);
  17. const accessToken = computed(() => coreStoreAccess.accessToken);
  18. const refreshToken = computed(() => coreStoreAccess.refreshToken);
  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 setAccessToken(token: null | string) {
  26. coreStoreAccess.setAccessToken(token);
  27. }
  28. function setAccessRoutes(routes: RouteRecordRaw[]) {
  29. coreStoreAccess.setAccessRoutes(routes);
  30. }
  31. /**
  32. * 异步处理登录操作
  33. * Asynchronously handle the login process
  34. * @param params 登录表单数据
  35. */
  36. async function authLogin(
  37. params: LoginAndRegisterParams,
  38. onSuccess?: () => Promise<void> | void,
  39. ) {
  40. // 异步处理用户登录操作并获取 accessToken
  41. let userInfo: null | UserInfo = null;
  42. try {
  43. loading.value = true;
  44. const { accessToken, refreshToken } = await login(params);
  45. // 如果成功获取到 accessToken
  46. // If accessToken is successfully obtained
  47. if (accessToken) {
  48. // 将 accessToken 存储到 accessStore 中
  49. // Store the accessToken in accessStore
  50. coreStoreAccess.setAccessToken(accessToken);
  51. coreStoreAccess.setRefreshToken(refreshToken);
  52. // 获取用户信息并存储到 accessStore 中
  53. // Get user information and store it in accessStore
  54. const [fetchUserInfoResult, accessCodes] = await Promise.all([
  55. fetchUserInfo(),
  56. getAccessCodes(),
  57. ]);
  58. userInfo = fetchUserInfoResult;
  59. coreStoreAccess.setUserInfo(userInfo);
  60. coreStoreAccess.setAccessCodes(accessCodes);
  61. if (openLoginExpiredModal.value) {
  62. openLoginExpiredModal.value = false;
  63. } else {
  64. onSuccess
  65. ? await onSuccess?.()
  66. : await router.push(userInfo.homePath || DEFAULT_HOME_PATH);
  67. }
  68. if (userInfo?.realName) {
  69. notification.success({
  70. description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
  71. duration: 3,
  72. message: $t('authentication.loginSuccess'),
  73. });
  74. }
  75. }
  76. } finally {
  77. loading.value = false;
  78. }
  79. return {
  80. accessToken,
  81. userInfo,
  82. };
  83. }
  84. async function logout() {
  85. resetAllStores();
  86. openLoginExpiredModal.value = false;
  87. // 回登陆页带上当前路由地址
  88. await router.replace({
  89. path: LOGIN_PATH,
  90. query: {
  91. redirect: encodeURIComponent(router.currentRoute.value.fullPath),
  92. },
  93. });
  94. }
  95. async function fetchUserInfo() {
  96. let userInfo: null | UserInfo = null;
  97. userInfo = await getUserInfo();
  98. coreStoreAccess.setUserInfo(userInfo);
  99. return userInfo;
  100. }
  101. function $reset() {
  102. loading.value = false;
  103. openLoginExpiredModal.value = false;
  104. }
  105. return {
  106. $reset,
  107. accessRoutes,
  108. accessToken,
  109. authLogin,
  110. fetchUserInfo,
  111. loading,
  112. logout,
  113. openLoginExpiredModal,
  114. refreshToken,
  115. setAccessMenus,
  116. setAccessRoutes,
  117. setAccessToken,
  118. userInfo,
  119. userRoles,
  120. };
  121. });