1
0

auth.ts 3.0 KB

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