vben
2021-06-19 e8d6f8851efd7076946486864936f1797280d3ba
提交 | 用户 | 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';
N 10 import { 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';
15567e 14
215d8b 15 interface UserState {
V 16   userInfo: Nullable<UserInfo>;
17   token?: string;
18   roleList: RoleEnum[];
5465f0 19   sessionTimeout?: boolean;
2f6253 20 }
215d8b 21
V 22 export const useUserStore = defineStore({
23   id: 'app-user',
24   state: (): UserState => ({
25     // user info
26     userInfo: null,
27     // token
28     token: undefined,
29     // roleList
30     roleList: [],
5465f0 31     // Whether the login expired
V 32     sessionTimeout: false,
215d8b 33   }),
V 34   getters: {
cd4b5e 35     getUserInfo(): UserInfo {
215d8b 36       return this.userInfo || getAuthCache<UserInfo>(USER_INFO_KEY) || {};
V 37     },
cd4b5e 38     getToken(): string {
215d8b 39       return this.token || getAuthCache<string>(TOKEN_KEY);
V 40     },
cd4b5e 41     getRoleList(): RoleEnum[] {
215d8b 42       return this.roleList.length > 0 ? this.roleList : getAuthCache<RoleEnum[]>(ROLES_KEY);
V 43     },
5465f0 44     getSessionTimeout(): boolean {
V 45       return !!this.sessionTimeout;
46     },
215d8b 47   },
V 48   actions: {
5465f0 49     setToken(info: string | undefined) {
215d8b 50       this.token = info;
V 51       setAuthCache(TOKEN_KEY, info);
52     },
53     setRoleList(roleList: RoleEnum[]) {
54       this.roleList = roleList;
55       setAuthCache(ROLES_KEY, roleList);
56     },
57     setUserInfo(info: UserInfo) {
58       this.userInfo = info;
59       setAuthCache(USER_INFO_KEY, info);
60     },
5465f0 61     setSessionTimeout(flag: boolean) {
V 62       this.sessionTimeout = flag;
63     },
215d8b 64     resetState() {
V 65       this.userInfo = null;
66       this.token = '';
67       this.roleList = [];
5465f0 68       this.sessionTimeout = false;
215d8b 69     },
V 70     /**
71      * @description: login
72      */
73     async login(
74       params: LoginParams & {
75         goHome?: boolean;
76         mode?: ErrorMessageMode;
77       }
9e5e63 78     ): Promise<GetUserInfoModel | null> {
215d8b 79       try {
V 80         const { goHome = true, mode, ...loginParams } = params;
81         const data = await loginApi(loginParams, mode);
9e5e63 82         const { token } = data;
215d8b 83
V 84         // save token
85         this.setToken(token);
86         // get user info
9e5e63 87         const userInfo = await this.getUserInfoAction();
215d8b 88
5465f0 89         const sessionTimeout = this.sessionTimeout;
V 90         sessionTimeout && this.setSessionTimeout(false);
91         !sessionTimeout && goHome && (await router.replace(PageEnum.BASE_HOME));
215d8b 92         return userInfo;
V 93       } catch (error) {
b218f1 94         return Promise.reject(error);
215d8b 95       }
V 96     },
9e5e63 97     async getUserInfoAction() {
N 98       const userInfo = await getUserInfo();
215d8b 99       const { roles } = userInfo;
V 100       const roleList = roles.map((item) => item.value) as RoleEnum[];
101       this.setUserInfo(userInfo);
102       this.setRoleList(roleList);
103       return userInfo;
104     },
105     /**
106      * @description: logout
107      */
108     logout(goLogin = false) {
109       goLogin && router.push(PageEnum.BASE_LOGIN);
110     },
111
112     /**
113      * @description: Confirm before logging out
114      */
115     confirmLoginOut() {
116       const { createConfirm } = useMessage();
117       const { t } = useI18n();
118       createConfirm({
119         iconType: 'warning',
120         title: t('sys.app.logoutTip'),
121         content: t('sys.app.logoutMessage'),
122         onOk: async () => {
123           await this.logout(true);
124         },
125       });
126     },
127   },
128 });
129
130 // Need to be used outside the setup
131 export function useUserStoreWidthOut() {
132   return useUserStore(store);
133 }