user.ts 3.4 KB

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