user.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import { appStore } from './app';
  2. import type {
  3. LoginParams,
  4. GetUserInfoByUserIdModel,
  5. GetUserInfoByUserIdParams,
  6. } from '/@/api/sys/model/userModel';
  7. import store from '/@/store/index';
  8. import { VuexModule, Module, getModule, Mutation, Action } from 'vuex-module-decorators';
  9. import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
  10. import { PageEnum } from '/@/enums/pageEnum';
  11. import { RoleEnum } from '/@/enums/roleEnum';
  12. import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
  13. import { useMessage } from '/@/hooks/web/useMessage';
  14. import router, { resetRouter } from '/@/router';
  15. import { permissionStore } from './permission';
  16. import { tabStore } from './tab';
  17. import { loginApi, getUserInfoById } from '/@/api/sys/user';
  18. import { setSession, getSession, clearSession, clearLocal } from '/@/utils/helper/persistent';
  19. // import { FULL_PAGE_NOT_FOUND_ROUTE } from '/@/router/constant';
  20. export type UserInfo = Omit<GetUserInfoByUserIdModel, 'roles'>;
  21. const NAME = 'user';
  22. hotModuleUnregisterModule(NAME);
  23. @Module({ namespaced: true, name: NAME, dynamic: true, store })
  24. class User extends VuexModule {
  25. // user info
  26. private userInfoState: UserInfo | null = null;
  27. // token
  28. private tokenState = '';
  29. // roleList
  30. private roleListState: RoleEnum[] = [];
  31. get getUserInfoState(): UserInfo {
  32. return this.userInfoState || (getSession(USER_INFO_KEY) as UserInfo) || {};
  33. }
  34. get getTokenState(): string {
  35. return this.tokenState || (getSession(TOKEN_KEY) as string);
  36. }
  37. get getRoleListState(): RoleEnum[] {
  38. return this.roleListState.length > 0
  39. ? this.roleListState
  40. : (getSession(ROLES_KEY) as RoleEnum[]);
  41. }
  42. @Mutation
  43. resetState(): void {
  44. this.userInfoState = null;
  45. this.tokenState = '';
  46. this.roleListState = [];
  47. }
  48. @Mutation
  49. commitUserInfoState(info: UserInfo): void {
  50. this.userInfoState = info;
  51. if (info) {
  52. setSession(USER_INFO_KEY, info);
  53. }
  54. }
  55. @Mutation
  56. commitRoleListState(roleList: RoleEnum[]): void {
  57. this.roleListState = roleList;
  58. if (roleList) {
  59. setSession(ROLES_KEY, roleList);
  60. }
  61. }
  62. @Mutation
  63. commitTokenState(info: string): void {
  64. this.tokenState = info;
  65. if (info) {
  66. setSession(TOKEN_KEY, info);
  67. }
  68. }
  69. /**
  70. * @description: login
  71. */
  72. @Action
  73. async login(params: LoginParams, goHome = true): Promise<GetUserInfoByUserIdModel | null> {
  74. try {
  75. const data = await loginApi(params);
  76. const { token, userId } = data;
  77. // get user info
  78. const userInfo = await this.getUserInfoAction({ userId });
  79. // save token
  80. this.commitTokenState(token);
  81. // const name = FULL_PAGE_NOT_FOUND_ROUTE.name;
  82. // name && router.removeRoute(name);
  83. goHome &&
  84. (await router.push(PageEnum.BASE_HOME).then(() => {
  85. setTimeout(() => {
  86. appStore.commitPageLoadingState(false);
  87. }, 30);
  88. }));
  89. return userInfo;
  90. } catch (error) {
  91. return null;
  92. }
  93. }
  94. @Action
  95. async getUserInfoAction({ userId }: GetUserInfoByUserIdParams) {
  96. const userInfo = await getUserInfoById({ userId });
  97. const { role } = userInfo;
  98. const roleList = [role.value] as RoleEnum[];
  99. this.commitUserInfoState(userInfo);
  100. this.commitRoleListState(roleList);
  101. return userInfo;
  102. }
  103. /**
  104. * @description: login out
  105. */
  106. @Action
  107. async loginOut(goLogin = false) {
  108. goLogin && router.push(PageEnum.BASE_LOGIN);
  109. }
  110. @Action
  111. async resumeAllState() {
  112. resetRouter();
  113. clearSession();
  114. clearLocal();
  115. permissionStore.commitResetState();
  116. tabStore.commitResetState();
  117. this.resetState();
  118. }
  119. /**
  120. * @description: Confirm before logging out
  121. */
  122. @Action
  123. async confirmLoginOut() {
  124. const { createConfirm } = useMessage();
  125. createConfirm({
  126. iconType: 'warning',
  127. title: '温馨提醒',
  128. content: '是否确认退出系统?',
  129. onOk: async () => {
  130. await this.loginOut(true);
  131. },
  132. });
  133. }
  134. }
  135. export { User };
  136. export const userStore = getModule<User>(User);