vben
2021-08-24 56a966cfbf8db5b29a42185f0f25a0e800c30dbb
提交 | 用户 | 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;
cc4693 23   lastUpdateTime: number;
2f6253 24 }
215d8b 25
V 26 export const useUserStore = defineStore({
27   id: 'app-user',
28   state: (): UserState => ({
29     // user info
30     userInfo: null,
31     // token
32     token: undefined,
33     // roleList
34     roleList: [],
5465f0 35     // Whether the login expired
V 36     sessionTimeout: false,
cc4693 37     // Last fetch time
38     lastUpdateTime: 0,
215d8b 39   }),
V 40   getters: {
cd4b5e 41     getUserInfo(): UserInfo {
215d8b 42       return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
V 43     },
cd4b5e 44     getToken(): string {
215d8b 45       return this.token || getAuthCache<string>(TOKEN_KEY);
V 46     },
cd4b5e 47     getRoleList(): RoleEnum[] {
215d8b 48       return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
V 49     },
5465f0 50     getSessionTimeout(): boolean {
V 51       return !!this.sessionTimeout;
52     },
cc4693 53     getLastUpdateTime(): number {
54       return this.lastUpdateTime;
55     },
215d8b 56   },
V 57   actions: {
5465f0 58     setToken(info: string | undefined) {
215d8b 59       this.token = info;
V 60       setAuthCache(TOKEN_KEY, info);
61     },
62     setRoleList(roleList: RoleEnum[]) {
63       this.roleList = roleList;
64       setAuthCache(ROLES_KEY, roleList);
65     },
66     setUserInfo(info: UserInfo) {
67       this.userInfo = info;
cc4693 68       this.lastUpdateTime = new Date().getTime();
215d8b 69       setAuthCache(USER_INFO_KEY, info);
V 70     },
5465f0 71     setSessionTimeout(flag: boolean) {
V 72       this.sessionTimeout = flag;
73     },
215d8b 74     resetState() {
V 75       this.userInfo = null;
76       this.token = '';
77       this.roleList = [];
5465f0 78       this.sessionTimeout = false;
215d8b 79     },
V 80     /**
81      * @description: login
82      */
83     async login(
84       params: LoginParams & {
85         goHome?: boolean;
86         mode?: ErrorMessageMode;
56a966 87       },
9e5e63 88     ): Promise<GetUserInfoModel | null> {
215d8b 89       try {
V 90         const { goHome = true, mode, ...loginParams } = params;
91         const data = await loginApi(loginParams, mode);
9e5e63 92         const { token } = data;
215d8b 93
V 94         // save token
95         this.setToken(token);
96         // get user info
9e5e63 97         const userInfo = await this.getUserInfoAction();
215d8b 98
5465f0 99         const sessionTimeout = this.sessionTimeout;
237e65 100         if (sessionTimeout) {
101           this.setSessionTimeout(false);
102         } else if (goHome) {
103           const permissionStore = usePermissionStore();
104           if (!permissionStore.isDynamicAddedRoute) {
105             const routes = await permissionStore.buildRoutesAction();
106             routes.forEach((route) => {
107               router.addRoute(route as unknown as RouteRecordRaw);
108             });
87583c 109             router.addRoute(PAGE_NOT_FOUND_ROUTE as unknown as RouteRecordRaw);
237e65 110             permissionStore.setDynamicAddedRoute(true);
111           }
112           await router.replace(userInfo.homePath || PageEnum.BASE_HOME);
113         }
215d8b 114         return userInfo;
V 115       } catch (error) {
b218f1 116         return Promise.reject(error);
215d8b 117       }
V 118     },
0a3683 119     async getUserInfoAction(): Promise<UserInfo> {
9e5e63 120       const userInfo = await getUserInfo();
215d8b 121       const { roles } = userInfo;
V 122       const roleList = roles.map((item) => item.value) as RoleEnum[];
123       this.setUserInfo(userInfo);
124       this.setRoleList(roleList);
125       return userInfo;
126     },
127     /**
128      * @description: logout
129      */
e5f378 130     async logout(goLogin = false) {
3a5d1a 131       if (this.token) {
132         try {
133           await doLogout();
134         } catch {
135           console.log('注销Token失败');
136         }
e5f378 137       }
138       this.setToken(undefined);
139       this.setSessionTimeout(false);
215d8b 140       goLogin && router.push(PageEnum.BASE_LOGIN);
V 141     },
142
143     /**
144      * @description: Confirm before logging out
145      */
146     confirmLoginOut() {
147       const { createConfirm } = useMessage();
148       const { t } = useI18n();
149       createConfirm({
150         iconType: 'warning',
151         title: t('sys.app.logoutTip'),
152         content: t('sys.app.logoutMessage'),
153         onOk: async () => {
154           await this.logout(true);
155         },
156       });
157     },
158   },
159 });
160
161 // Need to be used outside the setup
913c22 162 export function useUserStoreWithOut() {
215d8b 163   return useUserStore(store);
V 164 }