auth.ts 3.1 KB

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