user.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. import type { UserInfo, UserUpdateInfo } 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 { JWT_TOKEN_KEY, REFRESH_TOKEN_KEY, ROLES_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
  8. import { getAuthCache, setAuthCache } from '/@/utils/auth';
  9. import {
  10. LoginParams,
  11. LoginResultModel,
  12. RefreshTokenParams,
  13. SmsLoginParams,
  14. } from '/@/api/sys/model/userModel';
  15. import { doRefreshToken, getMyInfo, loginApi, smsCodeLoginApi } from '/@/api/sys/user';
  16. import { useI18n } from '/@/hooks/web/useI18n';
  17. import { useMessage } from '/@/hooks/web/useMessage';
  18. import { router } from '/@/router';
  19. import { usePermissionStore } from '/@/store/modules/permission';
  20. import { RouteRecordRaw } from 'vue-router';
  21. import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
  22. import { createLocalStorage } from '/@/utils/cache/index';
  23. import { getEntitiesId } from '/@/api/dashboard/index';
  24. interface UserState {
  25. platInfo: any;
  26. enterPriseInfo: any;
  27. userInfo: Nullable<UserInfo>;
  28. userUpdateInfo?: Nullable<UserUpdateInfo>;
  29. token?: string;
  30. roleList: RoleEnum[];
  31. sessionTimeout?: boolean;
  32. lastUpdateTime: number;
  33. jwtToken?: string;
  34. refreshToken?: string;
  35. outTarget?: string;
  36. }
  37. const storage = createLocalStorage();
  38. export const useUserStore = defineStore({
  39. id: 'app-user',
  40. state: (): UserState => ({
  41. //平台信息
  42. platInfo: storage.get('platformInfo') || null,
  43. enterPriseInfo: storage.get('enterPriseInfo') || null,
  44. // user info
  45. userInfo: null,
  46. userUpdateInfo: null,
  47. // token
  48. jwtToken: undefined,
  49. //refresh Token
  50. refreshToken: undefined,
  51. // roleList
  52. roleList: [],
  53. // Whether the login expired
  54. sessionTimeout: false,
  55. // Last fetch time
  56. lastUpdateTime: 0,
  57. }),
  58. getters: {
  59. getPlatInfo(): any {
  60. return this.platInfo;
  61. },
  62. getUserInfo(): UserInfo {
  63. return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  64. },
  65. getUserUpdateInfo(): UserUpdateInfo {
  66. return this.userUpdateInfo || {};
  67. },
  68. getJwtToken(): string {
  69. return this.jwtToken || getAuthCache<string>(JWT_TOKEN_KEY);
  70. },
  71. getRefreshToken(): string {
  72. return this.refreshToken || getAuthCache<string>(REFRESH_TOKEN_KEY);
  73. },
  74. getRoleList(): RoleEnum[] {
  75. return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
  76. },
  77. getSessionTimeout(): boolean {
  78. return !!this.sessionTimeout;
  79. },
  80. getLastUpdateTime(): number {
  81. return this.lastUpdateTime;
  82. },
  83. },
  84. actions: {
  85. setPlatInfo(platInfo: any) {
  86. this.platInfo = platInfo;
  87. },
  88. setEnterPriseInfo(enterPriseInfo: any) {
  89. this.enterPriseInfo = enterPriseInfo;
  90. },
  91. storeToken(jwtToken: string, refreshToken: string) {
  92. this.jwtToken = jwtToken;
  93. this.refreshToken = refreshToken;
  94. setAuthCache(JWT_TOKEN_KEY, jwtToken);
  95. setAuthCache(REFRESH_TOKEN_KEY, refreshToken);
  96. },
  97. setToken(info: string | undefined) {
  98. this.jwtToken = info;
  99. setAuthCache(JWT_TOKEN_KEY, info);
  100. },
  101. setRoleList(roleList: RoleEnum[]) {
  102. this.roleList = roleList;
  103. setAuthCache(ROLES_KEY, roleList);
  104. },
  105. setUserInfo(info: UserInfo | null) {
  106. this.userInfo = info;
  107. this.lastUpdateTime = new Date().getTime();
  108. setAuthCache(USER_INFO_KEY, info);
  109. },
  110. setUserUpdateInfo(info: UserUpdateInfo) {
  111. this.userUpdateInfo = info;
  112. },
  113. setSessionTimeout(flag: boolean) {
  114. this.sessionTimeout = flag;
  115. },
  116. resetState() {
  117. this.userInfo = null;
  118. this.token = '';
  119. this.roleList = [];
  120. this.sessionTimeout = false;
  121. },
  122. /**
  123. * @description: login
  124. */
  125. async login(
  126. params: LoginParams & {
  127. goHome?: boolean;
  128. mode?: ErrorMessageMode;
  129. }
  130. ): Promise<UserInfo | null> {
  131. try {
  132. const { goHome = true, mode, ...loginParams } = params;
  133. const data = await loginApi(loginParams, mode);
  134. if (data.token) {
  135. return this.process(data, goHome);
  136. } else {
  137. return Promise.reject();
  138. }
  139. } catch (error) {
  140. return Promise.reject(error);
  141. }
  142. },
  143. async process(data: LoginResultModel, goHome?: boolean): Promise<UserInfo | null> {
  144. const { token, refreshToken } = data;
  145. this.storeToken(token, refreshToken);
  146. // get user info
  147. const userInfo = await this.getMyUserInfoAction();
  148. const sessionTimeout = this.sessionTimeout;
  149. if (sessionTimeout) {
  150. this.setSessionTimeout(false);
  151. } else if (goHome) {
  152. const permissionStore = usePermissionStore();
  153. if (!permissionStore.isDynamicAddedRoute) {
  154. const routes = await permissionStore.buildRoutesAction();
  155. routes.forEach((route) => {
  156. router.addRoute(route as unknown as RouteRecordRaw);
  157. });
  158. router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
  159. permissionStore.setDynamicAddedRoute(true);
  160. }
  161. await router.replace(userInfo.homePath || PageEnum.BASE_HOME);
  162. }
  163. return userInfo;
  164. },
  165. async smsCodelogin(
  166. params: SmsLoginParams & {
  167. goHome?: boolean;
  168. mode?: ErrorMessageMode;
  169. }
  170. ): Promise<UserInfo | null> {
  171. try {
  172. const { goHome = true, mode, ...loginParams } = params;
  173. const data = await smsCodeLoginApi(loginParams, mode);
  174. return this.process(data, goHome);
  175. } catch (error) {
  176. const { createMessage } = useMessage();
  177. createMessage.error(error?.message || '');
  178. // return Promise.reject(error);
  179. }
  180. },
  181. async getMyUserInfoAction(): Promise<UserInfo> {
  182. const userInfo = await getMyInfo();
  183. this.setUserInfo(userInfo);
  184. const { roles } = userInfo;
  185. const roleList = roles.map((item) => item) as RoleEnum[];
  186. this.setRoleList(roleList);
  187. try {
  188. if (roleList[0] !== 'SYS_ADMIN') {
  189. const res = await getEntitiesId();
  190. const entityId = res.data[0]?.entityId;
  191. window.localStorage.setItem('entityId', JSON.stringify(entityId));
  192. window.sessionStorage.setItem('entityId', JSON.stringify(entityId));
  193. }
  194. } catch { }
  195. return userInfo;
  196. },
  197. /**
  198. * @description: logout
  199. */
  200. async logout(goLogin = false) {
  201. // try {
  202. // await doLogout();
  203. // } catch {
  204. // console.log('注销Token失败');
  205. // }
  206. // this.resetState();
  207. // setAuthCache(JWT_TOKEN_KEY, undefined);
  208. // setAuthCache(REFRESH_TOKEN_KEY, undefined);
  209. // this.setSessionTimeout(false);
  210. // // goLogin && router.push(PageEnum.BASE_LOGIN);
  211. this.setToken(undefined);
  212. this.setSessionTimeout(false);
  213. setAuthCache(REFRESH_TOKEN_KEY, undefined);
  214. this.setUserInfo(null);
  215. goLogin && router.push(PageEnum.BASE_LOGIN);
  216. window.localStorage.clear();
  217. window.localStorage.removeItem('updateUserInfo');
  218. // if (goLogin) {
  219. // //插入退出日志记录
  220. // let addRecordParam = {
  221. // systemLog: {
  222. // cjrq: moment().format('YYYY-MM-DD HH:mm:ss'),
  223. // czsm: "登录操作",
  224. // opt: "login",
  225. // sfcg: 1,
  226. // userid: u.EMPLOYEE_MIS.EMPLOYEE_ID,
  227. // username: u.EMPLOYEE.NAME
  228. // }
  229. // }
  230. // defHttp.post({ url: Api.AddLoginRecord, params: addRecordParam })
  231. // }
  232. },
  233. async doRefresh() {
  234. try {
  235. const req = { refreshToken: this.refreshToken } as RefreshTokenParams;
  236. const data = await doRefreshToken(req);
  237. const { token, refreshToken } = data;
  238. this.storeToken(token, refreshToken);
  239. } catch (error) {
  240. this.logout();
  241. }
  242. },
  243. /**
  244. * @description: Confirm before logging out
  245. */
  246. confirmLoginOut() {
  247. const { createConfirm } = useMessage();
  248. const { t } = useI18n();
  249. createConfirm({
  250. iconType: 'warning',
  251. title: t('sys.app.logoutTip'),
  252. content: t('sys.app.logoutMessage'),
  253. onOk: async () => {
  254. await this.logout(true);
  255. },
  256. });
  257. },
  258. },
  259. });
  260. // Need to be used outside the setup
  261. export function useUserStoreWithOut() {
  262. return useUserStore(store);
  263. }