user.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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 { doLogout, 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. import { usePermissionStore } from '/@/store/modules/permission';
  15. import { RouteRecordRaw } from 'vue-router';
  16. import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
  17. interface UserState {
  18. userInfo: Nullable<UserInfo>;
  19. token?: string;
  20. roleList: RoleEnum[];
  21. sessionTimeout?: boolean;
  22. lastUpdateTime: number;
  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. // Last fetch time
  36. lastUpdateTime: 0,
  37. }),
  38. getters: {
  39. getUserInfo(): UserInfo {
  40. return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  41. },
  42. getToken(): string {
  43. return this.token || getAuthCache<string>(TOKEN_KEY);
  44. },
  45. getRoleList(): RoleEnum[] {
  46. return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
  47. },
  48. getSessionTimeout(): boolean {
  49. return !!this.sessionTimeout;
  50. },
  51. getLastUpdateTime(): number {
  52. return this.lastUpdateTime;
  53. },
  54. },
  55. actions: {
  56. setToken(info: string | undefined) {
  57. this.token = info;
  58. setAuthCache(TOKEN_KEY, info);
  59. },
  60. setRoleList(roleList: RoleEnum[]) {
  61. this.roleList = roleList;
  62. setAuthCache(ROLES_KEY, roleList);
  63. },
  64. setUserInfo(info: UserInfo) {
  65. this.userInfo = info;
  66. this.lastUpdateTime = new Date().getTime();
  67. setAuthCache(USER_INFO_KEY, info);
  68. },
  69. setSessionTimeout(flag: boolean) {
  70. this.sessionTimeout = flag;
  71. },
  72. resetState() {
  73. this.userInfo = null;
  74. this.token = '';
  75. this.roleList = [];
  76. this.sessionTimeout = false;
  77. },
  78. /**
  79. * @description: login
  80. */
  81. async login(
  82. params: LoginParams & {
  83. goHome?: boolean;
  84. mode?: ErrorMessageMode;
  85. }
  86. ): Promise<GetUserInfoModel | null> {
  87. try {
  88. const { goHome = true, mode, ...loginParams } = params;
  89. const data = await loginApi(loginParams, mode);
  90. const { token } = data;
  91. // save token
  92. this.setToken(token);
  93. // get user info
  94. const userInfo = await this.getUserInfoAction();
  95. const sessionTimeout = this.sessionTimeout;
  96. if (sessionTimeout) {
  97. this.setSessionTimeout(false);
  98. } else if (goHome) {
  99. const permissionStore = usePermissionStore();
  100. if (!permissionStore.isDynamicAddedRoute) {
  101. const routes = await permissionStore.buildRoutesAction();
  102. routes.forEach((route) => {
  103. router.addRoute(route as unknown as RouteRecordRaw);
  104. });
  105. router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
  106. permissionStore.setDynamicAddedRoute(true);
  107. }
  108. await router.replace(userInfo.homePath || PageEnum.BASE_HOME);
  109. }
  110. return userInfo;
  111. } catch (error) {
  112. return Promise.reject(error);
  113. }
  114. },
  115. async getUserInfoAction(): Promise<UserInfo> {
  116. const userInfo = await getUserInfo();
  117. const { roles } = userInfo;
  118. const roleList = roles.map((item) => item.value) as RoleEnum[];
  119. this.setUserInfo(userInfo);
  120. this.setRoleList(roleList);
  121. return userInfo;
  122. },
  123. /**
  124. * @description: logout
  125. */
  126. async logout(goLogin = false) {
  127. try {
  128. await doLogout();
  129. } catch {
  130. console.log('注销Token失败');
  131. }
  132. this.setToken(undefined);
  133. this.setSessionTimeout(false);
  134. goLogin && router.push(PageEnum.BASE_LOGIN);
  135. },
  136. /**
  137. * @description: Confirm before logging out
  138. */
  139. confirmLoginOut() {
  140. const { createConfirm } = useMessage();
  141. const { t } = useI18n();
  142. createConfirm({
  143. iconType: 'warning',
  144. title: t('sys.app.logoutTip'),
  145. content: t('sys.app.logoutMessage'),
  146. onOk: async () => {
  147. await this.logout(true);
  148. },
  149. });
  150. },
  151. },
  152. });
  153. // Need to be used outside the setup
  154. export function useUserStoreWithOut() {
  155. return useUserStore(store);
  156. }