无木
2021-07-14 87583c8b54d335ddf1c416859ef62bbde189c809
提交 | 用户 | age
215d8b 1 import type { UserInfo } from '/#/store';
b6d5b0 2 import type { ErrorMessageMode } from '/#/axios';
215d8b 3 import { defineStore } from 'pinia';
V 4 import { store } from '/@/store';
2f6253 5 import { RoleEnum } from '/@/enums/roleEnum';
215d8b 6 import { PageEnum } from '/@/enums/pageEnum';
b7ce74 7 import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
215d8b 8 import { getAuthCache, setAuthCache } from '/@/utils/auth';
9e5e63 9 import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel';
e5f378 10 import { doLogout, getUserInfo, loginApi } from '/@/api/sys/user';
190112 11 import { useI18n } from '/@/hooks/web/useI18n';
215d8b 12 import { useMessage } from '/@/hooks/web/useMessage';
cda0f9 13 import { router } from '/@/router';
237e65 14 import { usePermissionStore } from '/@/store/modules/permission';
15 import { RouteRecordRaw } from 'vue-router';
87583c 16 import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
15567e 17
215d8b 18 interface UserState {
V 19   userInfo: Nullable<UserInfo>;
20   token?: string;
21   roleList: RoleEnum[];
5465f0 22   sessionTimeout?: boolean;
2f6253 23 }
215d8b 24
V 25 export const useUserStore = defineStore({
26   id: 'app-user',
27   state: (): UserState => ({
28     // user info
29     userInfo: null,
30     // token
31     token: undefined,
32     // roleList
33     roleList: [],
5465f0 34     // Whether the login expired
V 35     sessionTimeout: false,
215d8b 36   }),
V 37   getters: {
cd4b5e 38     getUserInfo(): UserInfo {
215d8b 39       return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
V 40     },
cd4b5e 41     getToken(): string {
215d8b 42       return this.token || getAuthCache<string>(TOKEN_KEY);
V 43     },
cd4b5e 44     getRoleList(): RoleEnum[] {
215d8b 45       return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
V 46     },
5465f0 47     getSessionTimeout(): boolean {
V 48       return !!this.sessionTimeout;
49     },
215d8b 50   },
V 51   actions: {
5465f0 52     setToken(info: string | undefined) {
215d8b 53       this.token = info;
V 54       setAuthCache(TOKEN_KEY, info);
55     },
56     setRoleList(roleList: RoleEnum[]) {
57       this.roleList = roleList;
58       setAuthCache(ROLES_KEY, roleList);
59     },
60     setUserInfo(info: UserInfo) {
61       this.userInfo = info;
62       setAuthCache(USER_INFO_KEY, info);
63     },
5465f0 64     setSessionTimeout(flag: boolean) {
V 65       this.sessionTimeout = flag;
66     },
215d8b 67     resetState() {
V 68       this.userInfo = null;
69       this.token = '';
70       this.roleList = [];
5465f0 71       this.sessionTimeout = false;
215d8b 72     },
V 73     /**
74      * @description: login
75      */
76     async login(
77       params: LoginParams & {
78         goHome?: boolean;
79         mode?: ErrorMessageMode;
80       }
9e5e63 81     ): Promise<GetUserInfoModel | null> {
215d8b 82       try {
V 83         const { goHome = true, mode, ...loginParams } = params;
84         const data = await loginApi(loginParams, mode);
9e5e63 85         const { token } = data;
215d8b 86
V 87         // save token
88         this.setToken(token);
89         // get user info
9e5e63 90         const userInfo = await this.getUserInfoAction();
215d8b 91
5465f0 92         const sessionTimeout = this.sessionTimeout;
237e65 93         if (sessionTimeout) {
94           this.setSessionTimeout(false);
95         } else if (goHome) {
96           const permissionStore = usePermissionStore();
97           if (!permissionStore.isDynamicAddedRoute) {
98             const routes = await permissionStore.buildRoutesAction();
99             routes.forEach((route) => {
100               router.addRoute(route as unknown as RouteRecordRaw);
101             });
87583c 102             router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
237e65 103             permissionStore.setDynamicAddedRoute(true);
104           }
105           await router.replace(userInfo.homePath || PageEnum.BASE_HOME);
106         }
215d8b 107         return userInfo;
V 108       } catch (error) {
b218f1 109         return Promise.reject(error);
215d8b 110       }
V 111     },
0a3683 112     async getUserInfoAction(): Promise<UserInfo> {
9e5e63 113       const userInfo = await getUserInfo();
215d8b 114       const { roles } = userInfo;
V 115       const roleList = roles.map((item) => item.value) as RoleEnum[];
116       this.setUserInfo(userInfo);
117       this.setRoleList(roleList);
118       return userInfo;
119     },
120     /**
121      * @description: logout
122      */
e5f378 123     async logout(goLogin = false) {
124       try {
125         await doLogout();
126       } catch {
127         console.log('注销Token失败');
128       }
129       this.setToken(undefined);
130       this.setSessionTimeout(false);
215d8b 131       goLogin && router.push(PageEnum.BASE_LOGIN);
V 132     },
133
134     /**
135      * @description: Confirm before logging out
136      */
137     confirmLoginOut() {
138       const { createConfirm } = useMessage();
139       const { t } = useI18n();
140       createConfirm({
141         iconType: 'warning',
142         title: t('sys.app.logoutTip'),
143         content: t('sys.app.logoutMessage'),
144         onOk: async () => {
145           await this.logout(true);
146         },
147       });
148     },
149   },
150 });
151
152 // Need to be used outside the setup
913c22 153 export function useUserStoreWithOut() {
215d8b 154   return useUserStore(store);
V 155 }