user.ts 8.7 KB

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