import { defineStore } from 'pinia'; import { login as userLogin, logout as userLogout, getUserInfo, LoginData, getUserPermission, } from '@/api/user'; import { setToken, clearToken } from '@/utils/auth'; import { removeRouteListener } from '@/utils/route-listener'; import { UserState } from './types'; import useAppStore from '../app'; const useUserStore = defineStore('user', { state: (): UserState => ({ name: undefined, avatar: undefined, job: undefined, organization: undefined, location: undefined, email: undefined, introduction: undefined, personalWebsite: undefined, jobName: undefined, organizationName: undefined, locationName: undefined, phone: undefined, registrationDate: undefined, accountId: undefined, certification: undefined, role: '', permission: [], projects: undefined, currentProjectId: undefined, }), // 配置持久化 persist: { key: 'user-store', storage: localStorage, // 只持久化关键的用户信息,排除敏感信息 pick: [ 'name', 'avatar', 'role', 'permission', 'accountId', 'email', 'projects', 'currentProjectId', ], }, getters: { userInfo(state: UserState): UserState { return { ...state }; }, }, actions: { switchRoles() { return new Promise((resolve) => { this.role = this.role === 'user' ? 'admin' : 'user'; resolve(this.role); }); }, // Set user's information setInfo(partial: Partial) { this.$patch(partial); }, // Reset user's information resetInfo() { this.$reset(); }, // Get user's information async info() { const res = await getUserInfo(); this.setInfo(res.data); }, // 登陆 async login(loginForm: LoginData) { try { const res = await userLogin(loginForm); setToken(res.data.token); // 设置基本用户信息 this.setInfo({ name: loginForm.username, role: 'admin', }); // 登录成功后获取完整的用户信息和权限 try { await this.info(); await this.getUserPermissionData(); } catch (infoError) { // 如果获取用户信息失败,不影响登录流程 // eslint-disable-next-line no-console console.warn('获取用户详细信息失败:', infoError); } } catch (err) { clearToken(); throw err; } }, logoutCallBack() { const appStore = useAppStore(); this.resetInfo(); clearToken(); removeRouteListener(); appStore.clearServerMenu(); }, // Logout async logout() { try { await userLogout(); } finally { this.logoutCallBack(); } }, async getUserPermissionData() { try { const res = await getUserPermission(); // 将权限数据存储到store中 if (res.data && res.data.length > 0) { this.setInfo({ permission: res.data[0].permission }); } } catch (err) { // 生产环境下可以使用日志服务记录错误 if (process.env.NODE_ENV === 'development') { // eslint-disable-next-line no-console console.error('获取权限失败:', err); } throw err; } }, }, }); export default useUserStore;