import { defineStore } from 'pinia'; import { createStorage } from '@/utils/Storage'; import { store } from '@/store'; import { ACCESS_TOKEN, CURRENT_USER, IS_LOCKSCREEN } from '@/store/mutation-types'; import { ResultEnum } from '@/enums/httpEnum'; const Storage = createStorage({ storage: localStorage }); import { getUserInfo, login } from '@/api/system/user'; import { storage } from '@/utils/Storage'; export interface IUserState { token: string; username: string; welcome: string; avatar: string; roles: any[]; info: any; } export const useUserStore = defineStore({ id: 'app-user', state: (): IUserState => ({ token: Storage.get(ACCESS_TOKEN, ''), username: '', welcome: '', avatar: '', roles: [], info: Storage.get(CURRENT_USER, {}), }), getters: { getToken(): string { return this.token; }, getAvatar(): string { return this.avatar; }, getNickname(): string { return this.username; }, getRoles(): [any][] { return this.roles; }, getUserInfo(): object { return this.info; }, }, actions: { setToken(token: string) { this.token = token; }, setAvatar(avatar: string) { this.avatar = avatar; }, setRoles(roles) { this.roles = roles; }, setUserInfo(info) { this.info = info; }, // 登录 async login(userInfo) { try { const response = await login(userInfo); const { result, code } = response; if (code === ResultEnum.SUCCESS) { const ex = 7 * 24 * 60 * 60 * 1000; storage.set(ACCESS_TOKEN, result.token, ex); storage.set(CURRENT_USER, result, ex); storage.set(IS_LOCKSCREEN, false); this.setToken(result.token); this.setUserInfo(result); } return Promise.resolve(response); } catch (e) { return Promise.reject(e); } }, // 获取用户信息 GetInfo() { const that = this; return new Promise((resolve, reject) => { getUserInfo() .then((res) => { const result = res; if (result.roles && result.roles.length) { const roles = result.roles; that.setRoles(roles); that.setUserInfo(result); } else { reject(new Error('getInfo: roles must be a non-null array !')); } that.setAvatar(result.avatar); resolve(res); }) .catch((error) => { reject(error); }); }); }, // 登出 async logout() { this.setRoles([]); this.setUserInfo(''); storage.remove(ACCESS_TOKEN); storage.remove(CURRENT_USER); return Promise.resolve(''); }, }, }); // Need to be used outside the setup export function useUserStoreWidthOut() { return useUserStore(store); }