user.ts 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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, PERM_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. // doLogout
  11. import { getUserInfo, loginApi } from '/@/api/sys/user';
  12. import { useI18n } from '/@/hooks/web/useI18n';
  13. import { useMessage } from '/@/hooks/web/useMessage';
  14. import { router } from '/@/router';
  15. import { usePermissionStore } from '/@/store/modules/permission';
  16. import { RouteRecordRaw } from 'vue-router';
  17. import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
  18. import { isArray } from '/@/utils/is';
  19. import { intersection } from 'lodash-es';
  20. import { h } from 'vue';
  21. interface UserState {
  22. userInfo: Nullable<UserInfo>;
  23. token?: string;
  24. roleList: RoleEnum[];
  25. permList: number[];
  26. sessionTimeout?: boolean;
  27. lastUpdateTime: number;
  28. }
  29. export const useUserStore = defineStore({
  30. id: 'app-user',
  31. state: (): UserState => ({
  32. // user info
  33. userInfo: null,
  34. // token
  35. token: undefined,
  36. // roleList
  37. roleList: [],
  38. permList: [],
  39. // Whether the login expired
  40. sessionTimeout: false,
  41. // Last fetch time
  42. lastUpdateTime: 0,
  43. }),
  44. getters: {
  45. getUserInfoCache(): UserInfo {
  46. return getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  47. },
  48. getUserInfo(): UserInfo {
  49. return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
  50. },
  51. getToken(): string {
  52. return this.token || getAuthCache<string>(TOKEN_KEY);
  53. },
  54. getRoleList(): RoleEnum[] {
  55. return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
  56. },
  57. getPermList(): number[] {
  58. return this.permList.length > 0 ? this.permList : getAuthCache<number[]>(PERM_KEY);
  59. },
  60. getSessionTimeout(): boolean {
  61. return !!this.sessionTimeout;
  62. },
  63. getLastUpdateTime(): number {
  64. return this.lastUpdateTime;
  65. },
  66. },
  67. actions: {
  68. setToken(info: string | undefined) {
  69. this.token = info ? info : ''; // for null or undefined value
  70. localStorage.setItem('token', this.token);
  71. setAuthCache(TOKEN_KEY, info);
  72. },
  73. setRoleList(roleList: RoleEnum[]) {
  74. this.roleList = roleList;
  75. console.log('setRoleList', roleList);
  76. setAuthCache(ROLES_KEY, roleList);
  77. },
  78. setPermList(permList: number[]) {
  79. this.permList = permList;
  80. console.log('setPermList', permList);
  81. setAuthCache(PERM_KEY, permList);
  82. },
  83. setUserInfo(info: UserInfo | null) {
  84. this.userInfo = info;
  85. this.lastUpdateTime = new Date().getTime();
  86. setAuthCache(USER_INFO_KEY, info);
  87. },
  88. setSessionTimeout(flag: boolean) {
  89. this.sessionTimeout = flag;
  90. },
  91. resetState() {
  92. this.userInfo = null;
  93. this.token = '';
  94. this.roleList = [];
  95. this.sessionTimeout = false;
  96. },
  97. /**
  98. * @description: login
  99. */
  100. async login(
  101. params: LoginParams & {
  102. goHome?: boolean;
  103. mode?: ErrorMessageMode;
  104. },
  105. ): Promise<GetUserInfoModel | null> {
  106. try {
  107. const { goHome = true, mode, ...loginParams } = params;
  108. const data = await loginApi(loginParams, mode);
  109. const { id, token } = data;
  110. console.log('user', data);
  111. const userID = Number(id);
  112. // save token
  113. this.setToken(token);
  114. return this.afterLoginAction(userID, goHome);
  115. } catch (error) {
  116. return Promise.reject(error);
  117. }
  118. },
  119. async afterLoginAction(id: number, goHome?: boolean): Promise<GetUserInfoModel | null> {
  120. if (!this.getToken) return null;
  121. // get user info
  122. const userInfo = await this.getUserInfoAction(id);
  123. const sessionTimeout = this.sessionTimeout;
  124. if (sessionTimeout) {
  125. this.setSessionTimeout(false);
  126. } else {
  127. const permissionStore = usePermissionStore();
  128. if (!permissionStore.isDynamicAddedRoute) {
  129. const routes = await permissionStore.buildRoutesAction();
  130. routes.forEach((route) => {
  131. router.addRoute(route as unknown as RouteRecordRaw);
  132. });
  133. router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
  134. permissionStore.setDynamicAddedRoute(true);
  135. }
  136. goHome && (await router.replace(userInfo?.homePath || PageEnum.BASE_HOME));
  137. }
  138. return userInfo;
  139. },
  140. async getUserInfoAction(id?: number): Promise<UserInfo | null> {
  141. if (!this.getToken) return null;
  142. const userId: number = id || Number(this.getUserInfoCache.id);
  143. // debugger;
  144. const userInfo = await getUserInfo(userId);
  145. const { roleIdList = [], permList = [] } = userInfo;
  146. isArray(roleIdList) && this.setPermList(permList);
  147. if (isArray(roleIdList)) {
  148. const roleList = roleIdList.map((item) => {
  149. switch (item) {
  150. case 1:
  151. return RoleEnum.SUPER;
  152. case 2:
  153. return RoleEnum.TOURIST;
  154. case 5:
  155. return RoleEnum.PLAT_ADMIN;
  156. case 6:
  157. return RoleEnum.COMPANY_ADMIN;
  158. case 7:
  159. return RoleEnum.COMPANY_ADMIN; //公司拍摄管理员
  160. case 8:
  161. return RoleEnum.STAFF;
  162. case 9:
  163. return RoleEnum.HOST;
  164. case 81:
  165. return RoleEnum.COMPANY_VIEWER;
  166. case 82:
  167. return RoleEnum.COMPANY_SHOOTER;
  168. }
  169. }) as RoleEnum[];
  170. console.log('roleIdList', roleList);
  171. this.setRoleList(roleList);
  172. } else {
  173. userInfo.roleIdList = [];
  174. this.setRoleList([]);
  175. }
  176. this.setUserInfo(userInfo);
  177. return userInfo;
  178. },
  179. /**
  180. * @description: logout
  181. */
  182. async logout(goLogin = false) {
  183. // if (this.getToken) {
  184. // try {
  185. // await doLogout();
  186. // } catch {
  187. // console.log('注销Token失败');
  188. // }
  189. // }
  190. this.setToken(undefined);
  191. this.setSessionTimeout(false);
  192. this.setUserInfo(null);
  193. goLogin && router.push(PageEnum.BASE_LOGIN);
  194. },
  195. /**
  196. * @description: Confirm before logging out
  197. */
  198. confirmLoginOut() {
  199. const { createConfirm } = useMessage();
  200. const { t } = useI18n();
  201. createConfirm({
  202. iconType: 'warning',
  203. title: () => h('span', t('sys.app.logoutTip')),
  204. content: () => h('span', t('sys.app.logoutMessage')),
  205. onOk: async () => {
  206. await this.logout(true);
  207. },
  208. });
  209. },
  210. getCheckRole(value): boolean {
  211. const roleList = this.roleList;
  212. if (!value) {
  213. return true;
  214. }
  215. if (!isArray(value)) {
  216. return roleList?.includes(value as RoleEnum);
  217. }
  218. return (intersection(value, roleList) as RoleEnum[]).length > 0;
  219. },
  220. getEquity(value): boolean {
  221. //拍摄1 带看 2
  222. function isContained(a, b) {
  223. if (!(a instanceof Array) || !(b instanceof Array)) return false;
  224. if (a.length < b.length) return false;
  225. const aStr = a.toString();
  226. for (let i = 0, len = b.length; i < len; i++) {
  227. if (aStr.indexOf(b[i]) == -1) return false;
  228. }
  229. return true;
  230. }
  231. if (value.isArray) {
  232. return isContained(this.permList, value);
  233. } else {
  234. return isContained(this.permList, [value]);
  235. }
  236. },
  237. },
  238. });
  239. // Need to be used outside the setup
  240. export function useUserStoreWithOut() {
  241. return useUserStore(store);
  242. }