user.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import type { UserInfo } from '/#/store';
  2. import type { ErrorMessageMode } from '/@/utils/http/axios/types';
  3. import { defineStore } from 'pinia';
  4. import { store } from '/@/store';
  5. import { RoleEnum } from '/@/enums/roleEnum';
  6. import { PageEnum } from '/@/enums/pageEnum';
  7. import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
  8. import { getAuthCache, setAuthCache } from '/@/utils/auth';
  9. import type {
  10. LoginParams,
  11. GetUserInfoModel,
  12. // GetUserInfoByUserIdParams,
  13. } from '/@/api/sys/model/userModel';
  14. import { getMyInfo, loginApi } from '/@/api/sys/user';
  15. import { useI18n } from '/@/hooks/web/useI18n';
  16. import { useMessage } from '/@/hooks/web/useMessage';
  17. import { router } from '/@/router';
  18. interface UserState {
  19. userInfo: Nullable<UserInfo>;
  20. token?: string;
  21. roleList: RoleEnum[];
  22. sessionTimeout?: boolean;
  23. }
  24. export const useUserStore = defineStore({
  25. id: 'app-user',
  26. state: (): UserState => ({
  27. // user info
  28. userInfo: null,
  29. // token
  30. token: undefined,
  31. // roleList
  32. roleList: [],
  33. // Whether the login expired
  34. sessionTimeout: false,
  35. }),
  36. getters: {
  37. getUserInfo(): UserInfo {
  38. return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  39. },
  40. getToken(): string {
  41. return this.token || getAuthCache<string>(TOKEN_KEY);
  42. },
  43. getRoleList(): RoleEnum[] {
  44. return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
  45. },
  46. getSessionTimeout(): boolean {
  47. return !!this.sessionTimeout;
  48. },
  49. },
  50. actions: {
  51. setToken(info: string | undefined) {
  52. this.token = info;
  53. setAuthCache(TOKEN_KEY, info);
  54. },
  55. setRoleList(roleList: RoleEnum[]) {
  56. this.roleList = roleList;
  57. setAuthCache(ROLES_KEY, roleList);
  58. },
  59. setUserInfo(info: UserInfo) {
  60. this.userInfo = info;
  61. setAuthCache(USER_INFO_KEY, info);
  62. },
  63. setSessionTimeout(flag: boolean) {
  64. this.sessionTimeout = flag;
  65. },
  66. resetState() {
  67. this.userInfo = null;
  68. this.token = '';
  69. this.roleList = [];
  70. this.sessionTimeout = false;
  71. },
  72. /**
  73. * @description: login
  74. */
  75. async login(
  76. params: LoginParams & {
  77. goHome?: boolean;
  78. mode?: ErrorMessageMode;
  79. }
  80. ): Promise<GetUserInfoModel | null> {
  81. try {
  82. const { goHome = true, mode, ...loginParams } = params;
  83. const data = await loginApi(loginParams, mode);
  84. const { token } = data;
  85. // save token
  86. this.setToken(token);
  87. // get user info
  88. const userInfo = await this.getUserInfoAction();
  89. const sessionTimeout = this.sessionTimeout;
  90. sessionTimeout && this.setSessionTimeout(false);
  91. !sessionTimeout && goHome && (await router.replace(PageEnum.BASE_HOME));
  92. return userInfo;
  93. } catch (error) {
  94. return Promise.reject(error);
  95. }
  96. },
  97. async getUserInfoAction() {
  98. const result = await getMyInfo();
  99. const userInfo = result.row;
  100. const roles = userInfo;
  101. roles.value = roles.userName;
  102. const roleList = [{ ...roles }] as RoleEnum[];
  103. console.log(roleList);
  104. console.log(`userInfo`, userInfo);
  105. this.setUserInfo(userInfo);
  106. this.setRoleList(roleList);
  107. return userInfo;
  108. },
  109. /**
  110. * @description: logout
  111. */
  112. logout(goLogin = false) {
  113. goLogin && router.push(PageEnum.BASE_LOGIN);
  114. },
  115. /**
  116. * @description: Confirm before logging out
  117. */
  118. confirmLoginOut() {
  119. const { createConfirm } = useMessage();
  120. const { t } = useI18n();
  121. createConfirm({
  122. iconType: 'warning',
  123. title: t('sys.app.logoutTip'),
  124. content: t('sys.app.logoutMessage'),
  125. onOk: async () => {
  126. await this.logout(true);
  127. },
  128. });
  129. },
  130. },
  131. });
  132. // Need to be used outside the setup
  133. export function useUserStoreWidthOut() {
  134. return useUserStore(store);
  135. }