user.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import type { UserInfo, UserAgent } from '/#/store';
  2. import type { ErrorMessageMode } from '/#/axios';
  3. import { defineStore } from 'pinia';
  4. import { store } from '/@/store';
  5. import { PageEnum } from '/@/enums/pageEnum';
  6. import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY, AGENT_KEY } from '/@/enums/cacheEnum';
  7. import { getAuthCache, setAuthCache } from '/@/utils/auth';
  8. import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel';
  9. import { doLogout, getUserInfo, loginApi } from '/@/api/sys/user';
  10. import { useI18n } from '/@/hooks/web/useI18n';
  11. import { useMessage } from '/@/hooks/web/useMessage';
  12. import { router } from '/@/router';
  13. import { usePermissionStore } from '/@/store/modules/permission';
  14. import { RouteRecordRaw } from 'vue-router';
  15. import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
  16. import { isArray } from '/@/utils/is';
  17. import { h } from 'vue';
  18. import { RoleEnum } from '/@/enums/roleEnum';
  19. interface UserState {
  20. userInfo: Nullable<UserInfo>;
  21. token?: string;
  22. roleList: RoleEnum[];
  23. sessionTimeout?: boolean;
  24. lastUpdateTime: number;
  25. agent: Nullable<UserAgent>;
  26. isEnv: Boolean;
  27. }
  28. export const useUserStore = defineStore({
  29. id: 'app-user',
  30. state: (): UserState => ({
  31. // user info
  32. userInfo: null,
  33. // token
  34. token: undefined,
  35. // roleList
  36. roleList: [],
  37. // Whether the login expired
  38. sessionTimeout: false,
  39. // Last fetch time
  40. lastUpdateTime: 0,
  41. // 经销商信息
  42. agent: null,
  43. isEnv: window.location.hostname.includes('eur'), //true 国际服
  44. }),
  45. getters: {
  46. getUserInfo(): UserInfo {
  47. return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  48. },
  49. getToken(): string {
  50. return this.token || getAuthCache<string>(TOKEN_KEY);
  51. },
  52. getRoleList(): RoleEnum[] {
  53. return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
  54. },
  55. getAgent(): UserAgent {
  56. return this.agent || getAuthCache<UserAgent>(AGENT_KEY);
  57. },
  58. getSessionTimeout(): boolean {
  59. return !!this.sessionTimeout;
  60. },
  61. getLastUpdateTime(): number {
  62. return this.lastUpdateTime;
  63. },
  64. getSystemEnv(): boolean {
  65. return window.location.hostname.includes('eur');
  66. },
  67. },
  68. actions: {
  69. setToken(info: string | undefined) {
  70. this.token = info ? info : ''; // for null or undefined value
  71. setAuthCache(TOKEN_KEY, info);
  72. },
  73. setRoleList(roleList: RoleEnum[]) {
  74. this.roleList = roleList;
  75. setAuthCache(ROLES_KEY, roleList);
  76. },
  77. setAgent(agent: UserAgent) {
  78. console.log('setAgent', agent);
  79. this.agent = agent;
  80. setAuthCache(AGENT_KEY, agent);
  81. },
  82. setUserInfo(info: UserInfo | null) {
  83. this.userInfo = info;
  84. this.lastUpdateTime = new Date().getTime();
  85. setAuthCache(USER_INFO_KEY, info);
  86. },
  87. setSessionTimeout(flag: boolean) {
  88. this.sessionTimeout = flag;
  89. },
  90. resetState() {
  91. this.userInfo = null;
  92. this.token = '';
  93. this.roleList = [];
  94. this.sessionTimeout = false;
  95. },
  96. /**
  97. * @description: login
  98. */
  99. async login(
  100. params: LoginParams & {
  101. goHome?: boolean;
  102. mode?: ErrorMessageMode;
  103. },
  104. ): Promise<GetUserInfoModel | null> {
  105. try {
  106. const { goHome = true, mode, ...loginParams } = params;
  107. const data = await loginApi(loginParams, mode);
  108. const { token, user, agent } = data;
  109. this.setAgent(agent);
  110. this.setUserInfo({
  111. ...user,
  112. userId: user.id,
  113. realName: user.nickName,
  114. username: user.userName,
  115. avatar: user.head || 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',
  116. roles: agent && agent.parentId ? [RoleEnum.TEST] : [RoleEnum.SUPER, RoleEnum.TEST],
  117. });
  118. // save token
  119. this.setToken(token);
  120. return this.afterLoginAction(goHome);
  121. } catch (error) {
  122. return Promise.reject(error);
  123. }
  124. },
  125. async afterLoginAction(goHome?: boolean): Promise<GetUserInfoModel | null> {
  126. if (!this.getToken) return null;
  127. // get user info
  128. const userInfo = await this.getUserInfoAction();
  129. const sessionTimeout = this.sessionTimeout;
  130. if (sessionTimeout) {
  131. this.setSessionTimeout(false);
  132. } else {
  133. const permissionStore = usePermissionStore();
  134. if (!permissionStore.isDynamicAddedRoute) {
  135. const routes = await permissionStore.buildRoutesAction();
  136. routes.forEach((route) => {
  137. router.addRoute(route as unknown as RouteRecordRaw);
  138. });
  139. router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
  140. permissionStore.setDynamicAddedRoute(true);
  141. }
  142. goHome && (await router.replace(userInfo?.homePath || PageEnum.BASE_HOME));
  143. }
  144. return userInfo;
  145. },
  146. async getUserInfoAction(): Promise<UserInfo | null> {
  147. if (!this.getToken) return null;
  148. const userInfo = await getUserInfo();
  149. const { roleId, agent = null } = userInfo;
  150. this.setAgent(agent);
  151. if (isArray(roleId)) {
  152. const roleList = roleId.map((item) => item.value) as RoleEnum[];
  153. this.setRoleList(roleList);
  154. } else if (roleId) {
  155. userInfo.roles = [roleId];
  156. this.setRoleList([RoleEnum.SUPER, RoleEnum.TEST]);
  157. } else if (agent) {
  158. const myRoles =
  159. agent.agentLevel == 1
  160. ? RoleEnum.LEVEL2
  161. : agent.agentLevel != 0
  162. ? RoleEnum.DISTRIBUTOR
  163. : RoleEnum.TEST;
  164. userInfo.roles = [myRoles];
  165. this.setRoleList([myRoles]);
  166. } else {
  167. userInfo.roles = [RoleEnum.SUPER];
  168. this.setRoleList([RoleEnum.SUPER, RoleEnum.TEST]);
  169. }
  170. this.setUserInfo(userInfo);
  171. return userInfo;
  172. },
  173. /**
  174. * @description: logout
  175. */
  176. async logout(goLogin = false) {
  177. if (this.getToken) {
  178. try {
  179. await doLogout();
  180. } catch {
  181. console.log('注销Token失败');
  182. }
  183. }
  184. this.setToken(undefined);
  185. this.setSessionTimeout(false);
  186. this.setUserInfo(null);
  187. // goLogin && router.push(PageEnum.BASE_LOGIN);
  188. },
  189. /**
  190. * @description: Confirm before logging out
  191. */
  192. confirmLoginOut() {
  193. const { createConfirm } = useMessage();
  194. const { t } = useI18n();
  195. createConfirm({
  196. iconType: 'warning',
  197. title: () => h('span', t('sys.app.logoutTip')),
  198. content: () => h('span', t('sys.app.logoutMessage')),
  199. onOk: async () => {
  200. await this.logout(true);
  201. },
  202. });
  203. },
  204. },
  205. });
  206. // Need to be used outside the setup
  207. export function useUserStoreWithOut() {
  208. return useUserStore(store);
  209. }