auth.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  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 { useStorage } from '@vben/utils';
  7. import { ElNotification } from 'element-plus';
  8. import { defineStore } from 'pinia';
  9. import {
  10. getAccessCodesApi,
  11. getLoginCaptchaApi,
  12. getUserInfoApi,
  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. /**
  23. * 异步处理登录操作
  24. * Asynchronously handle the login process
  25. * @param params 登录表单数据
  26. */
  27. async function getLoginCaptcha(data: { uuid: string }) {
  28. const res = await getLoginCaptchaApi(data);
  29. return res as unknown as ArrayBuffer;
  30. }
  31. async function authLogin(
  32. params: Recordable<any>,
  33. onSuccess?: () => Promise<void> | void,
  34. ) {
  35. // 异步处理用户登录操作并获取 accessToken
  36. let userInfo: null | UserInfo = null;
  37. try {
  38. loginLoading.value = true;
  39. const storage = useStorage('captcha-uuid');
  40. const res = await loginApi({
  41. account: params.username,
  42. pwd: params.password,
  43. code: params.captcha,
  44. uuid: storage.getItem() as string,
  45. });
  46. // "bmid": 76,
  47. // "bm": null,
  48. // "token": "a2fd3e10a990c2f7a34de2c7160139a4",
  49. // "gw": "销售装维",
  50. // "workerid": "1",
  51. // "accountid": "1",
  52. // "timeout": 7200,
  53. // "nickname": "超级管理员",
  54. // "account": "admin",
  55. // "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",
  56. // "grouplist": "1"
  57. const { token: accessToken } = res;
  58. // 如果成功获取到 accessToken
  59. if (accessToken) {
  60. // 将 accessToken 存储到 accessStore 中
  61. accessStore.setAccessToken(accessToken);
  62. // 获取用户信息并存储到 accessStore 中
  63. const [fetchUserInfoResult, accessCodes] = await Promise.all([
  64. fetchUserInfo(),
  65. getAccessCodesApi(),
  66. ]);
  67. userInfo = fetchUserInfoResult;
  68. userStore.setUserInfo(userInfo);
  69. accessStore.setAccessCodes(accessCodes);
  70. if (accessStore.loginExpired) {
  71. accessStore.setLoginExpired(false);
  72. } else {
  73. onSuccess
  74. ? await onSuccess?.()
  75. : await router.push(userInfo.homePath || DEFAULT_HOME_PATH);
  76. }
  77. if (userInfo?.realName) {
  78. ElNotification({
  79. message: `${$t('authentication.loginSuccessDesc')}:${userInfo?.realName}`,
  80. title: $t('authentication.loginSuccess'),
  81. type: 'success',
  82. });
  83. }
  84. }
  85. } finally {
  86. loginLoading.value = false;
  87. }
  88. return {
  89. userInfo,
  90. };
  91. }
  92. async function logout(redirect: boolean = true) {
  93. try {
  94. await logoutApi();
  95. } catch {
  96. // 不做任何处理
  97. }
  98. resetAllStores();
  99. accessStore.setLoginExpired(false);
  100. // 回登录页带上当前路由地址
  101. await router.replace({
  102. path: LOGIN_PATH,
  103. query: redirect
  104. ? {
  105. redirect: encodeURIComponent(router.currentRoute.value.fullPath),
  106. }
  107. : {},
  108. });
  109. }
  110. async function fetchUserInfo() {
  111. let userInfo: null | UserInfo = null;
  112. userInfo = await getUserInfoApi();
  113. userStore.setUserInfo(userInfo);
  114. return userInfo;
  115. }
  116. function $reset() {
  117. loginLoading.value = false;
  118. }
  119. return {
  120. $reset,
  121. authLogin,
  122. fetchUserInfo,
  123. loginLoading,
  124. logout,
  125. getLoginCaptcha,
  126. };
  127. });