auth.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import type { Recordable, UserInfo } from '@vben/types';
  2. import { ref } from 'vue';
  3. import { useRouter } from 'vue-router';
  4. import { DEFAULT_HOME_PATH, LOGIN_PATH } from '@vben/constants';
  5. import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores';
  6. import { notification } from 'ant-design-vue';
  7. import { defineStore } from 'pinia';
  8. import { getAccessCodesApi, getUserInfoApi, loginApi, logoutApi } from '#/api';
  9. import { $t } from '#/locales';
  10. export const useAuthStore = defineStore('auth', () => {
  11. const accessStore = useAccessStore();
  12. const userStore = useUserStore();
  13. const router = useRouter();
  14. const loginLoading = ref(false);
  15. /**
  16. * 异步处理登录操作
  17. * Asynchronously handle the login process
  18. * @param params 登录表单数据
  19. */
  20. async function authLogin(
  21. params: Recordable<any>,
  22. onSuccess?: () => Promise<void> | void,
  23. ) {
  24. // 异步处理用户登录操作并获取 accessToken
  25. let userInfo: null | UserInfo = null;
  26. try {
  27. loginLoading.value = true;
  28. const { accessToken } = await loginApi(params);
  29. // 如果成功获取到 accessToken
  30. if (accessToken) {
  31. accessStore.setAccessToken(accessToken);
  32. // 获取用户信息并存储到 accessStore 中
  33. const [fetchUserInfoResult, accessCodes] = await Promise.all([
  34. fetchUserInfo(),
  35. getAccessCodesApi(),
  36. ]);
  37. userInfo = fetchUserInfoResult;
  38. userStore.setUserInfo(userInfo);
  39. accessStore.setAccessCodes(accessCodes);
  40. if (accessStore.loginExpired) {
  41. accessStore.setLoginExpired(false);
  42. } else {
  43. onSuccess
  44. ? await onSuccess?.()
  45. : await router.push(userInfo.homePath || DEFAULT_HOME_PATH);
  46. }
  47. if (userInfo?.realName) {
  48. notification.success({
  49. description: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
  50. duration: 3,
  51. message: $t('authentication.loginSuccess'),
  52. });
  53. }
  54. }
  55. } finally {
  56. loginLoading.value = false;
  57. }
  58. return {
  59. userInfo,
  60. };
  61. }
  62. async function logout(redirect: boolean = true) {
  63. try {
  64. await logoutApi();
  65. } catch {
  66. // 不做任何处理
  67. }
  68. resetAllStores();
  69. accessStore.setLoginExpired(false);
  70. // 回登录页带上当前路由地址
  71. await router.replace({
  72. path: LOGIN_PATH,
  73. query: redirect
  74. ? {
  75. redirect: encodeURIComponent(router.currentRoute.value.fullPath),
  76. }
  77. : {},
  78. });
  79. }
  80. async function fetchUserInfo() {
  81. let userInfo: null | UserInfo = null;
  82. userInfo = await getUserInfoApi();
  83. userStore.setUserInfo(userInfo);
  84. return userInfo;
  85. }
  86. function $reset() {
  87. loginLoading.value = false;
  88. }
  89. return {
  90. $reset,
  91. authLogin,
  92. fetchUserInfo,
  93. loginLoading,
  94. logout,
  95. };
  96. });