user.ts 3.7 KB

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