auth.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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 { useStorage } from '@vben/utils';
  8. import { ElNotification } from 'element-plus';
  9. import { defineStore } from 'pinia';
  10. import {
  11. // getAccessCodesApi,
  12. getLoginCaptchaApi,
  13. loginApi,
  14. logoutApi,
  15. } from '#/api';
  16. import { $t } from '#/locales';
  17. export const useAuthStore = defineStore('auth', () => {
  18. const accessStore = useAccessStore();
  19. const userStore = useUserStore();
  20. const router = useRouter();
  21. const loginLoading = ref(false);
  22. const userStorage = useStorage('user');
  23. /**
  24. * 异步处理登录操作
  25. * Asynchronously handle the login process
  26. * @param params 登录表单数据
  27. */
  28. async function getLoginCaptcha(data: { uuid: string }) {
  29. const res = await getLoginCaptchaApi(data);
  30. return res as unknown as ArrayBuffer;
  31. }
  32. async function authLogin(
  33. params: Recordable<any>,
  34. onSuccess?: () => Promise<void> | void,
  35. ) {
  36. // 异步处理用户登录操作并获取 accessToken
  37. let userInfo: null | UserInfo = null;
  38. try {
  39. loginLoading.value = true;
  40. const storage = useStorage('captcha-uuid');
  41. const res = await loginApi({
  42. account: params.username,
  43. pwd: params.password,
  44. code: params.captcha,
  45. uuid: storage.getItem() as string,
  46. });
  47. // "bmid": 76,
  48. // "bm": null,
  49. // "token": "a2fd3e10a990c2f7a34de2c7160139a4",
  50. // "gw": "销售装维",
  51. // "workerid": "1",
  52. // "accountid": "1",
  53. // "timeout": 7200,
  54. // "nickname": "超级管理员",
  55. // "account": "admin",
  56. // "popedom": "1401,1413,1412,1411,1410,1409,1406,1404,1402,1392,1399,1398,1397,1396,1395,1394,1393,1390,1389,1383,1376,1405,1403,1391,1387,1386,1385,1384,1381,1380,1379,1378,1377,333,346,331,280,289,330,287,286,285,284,1426,1414,367,366,329,328,311,299,298,282,278,345,335,334,332,313,312,310,309,307,305,304,303,302,301,279,277,276,275,274,273,269,288,283,272,271,270,306,255,234,232,354,353,352,351,350,349,348,297,293,268,267,266,265,264,263,261,260,259,258,257,256,362,361,64,63,62,19,308,300,181,178,167,125,123,101,92,91,87,86,85,84,83,82,81,80,54,23,22,21,20,2,290,296,295,294,292,291,147,146,145,144,143,142,141,60,59,58,57,55,229,228,93,18,7,1400,171,170,169,168,5,14,4,156,132,131,16,15,3,130,129,128,127,17,281,233,230,61,1,6",
  57. // "grouplist": "1"
  58. const { token: accessToken } = res;
  59. userStorage.setItem(res);
  60. // 如果成功获取到 accessToken
  61. if (accessToken) {
  62. // 将 accessToken 存储到 accessStore 中
  63. accessStore.setAccessToken(accessToken);
  64. // 获取用户信息并存储到 accessStore 中
  65. const fetchUserInfoResult = (await fetchUserInfo()) as UserInfo;
  66. const accessCodes = fetchUserInfoResult.popedom.split(',') || [];
  67. // const [fetchUserInfoResult, accessCodes] = await Promise.all([
  68. // fetchUserInfo(),
  69. // getAccessCodesApi(),
  70. // ]);
  71. userInfo = fetchUserInfoResult as UserInfo;
  72. userStore.setUserInfo(userInfo);
  73. accessStore.setAccessCodes(accessCodes);
  74. if (accessStore.loginExpired) {
  75. accessStore.setLoginExpired(false);
  76. } else {
  77. onSuccess
  78. ? await onSuccess?.()
  79. : await router.push(
  80. userInfo.homePath || preferences.app.defaultHomePath,
  81. );
  82. }
  83. if (userInfo?.realName) {
  84. ElNotification({
  85. message: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
  86. title: $t('authentication.loginSuccess'),
  87. type: 'success',
  88. });
  89. }
  90. }
  91. } finally {
  92. loginLoading.value = false;
  93. }
  94. return {
  95. userInfo,
  96. };
  97. }
  98. async function logout(redirect: boolean = true) {
  99. try {
  100. await logoutApi();
  101. } catch {
  102. // 不做任何处理
  103. }
  104. resetAllStores();
  105. accessStore.setLoginExpired(false);
  106. // 回登录页带上当前路由地址
  107. await router.replace({
  108. path: LOGIN_PATH,
  109. query: redirect
  110. ? {
  111. redirect: encodeURIComponent(router.currentRoute.value.fullPath),
  112. }
  113. : {},
  114. });
  115. }
  116. async function fetchUserInfo() {
  117. const userInfoData = userStorage.getItem() as UserInfo;
  118. // let userInfo: null | UserInfo = null;
  119. // userInfo = await getUserInfoApi();
  120. userStore.setUserInfo(userInfoData);
  121. return userInfoData;
  122. }
  123. function $reset() {
  124. loginLoading.value = false;
  125. }
  126. return {
  127. $reset,
  128. authLogin,
  129. fetchUserInfo,
  130. loginLoading,
  131. logout,
  132. getLoginCaptcha,
  133. };
  134. });