auth.ts 2.9 KB

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