/** * 用户状态管理 */ import { defineStore } from 'pinia' import { ref, computed } from 'vue' import type { UserInfo, LoginParams, LoginResult, CaptchaResult } from '@/types' import { mockGetCaptcha, mockLogin, mockGetUserInfo } from '@/mock' // 是否使用Mock数据 const USE_MOCK = true export const useUserStore = defineStore('user', () => { // 状态 const token = ref(localStorage.getItem('token') || '') const userInfo = ref(null) // 计算属性 const isLoggedIn = computed(() => !!token.value) const username = computed(() => userInfo.value?.username || '') const nickname = computed(() => userInfo.value?.nickname || userInfo.value?.username || '') const avatar = computed(() => userInfo.value?.avatar || '') // 获取验证码 async function getCaptcha(): Promise { if (USE_MOCK) { return await mockGetCaptcha() } // 真实API调用 const { request } = await import('@/utils/request') const res = await request.get('/auth/captcha') return res.data.data } // 登录 async function login(params: LoginParams): Promise { let data: LoginResult if (USE_MOCK) { data = await mockLogin(params) } else { // 真实API调用 const { request } = await import('@/utils/request') const res = await request.post('/auth/login', params) data = res.data.data } // 保存token token.value = data.token localStorage.setItem('token', data.token) // 保存用户信息 userInfo.value = data.userInfo return data } // 登出 async function logout(): Promise { try { if (!USE_MOCK) { const { request } = await import('@/utils/request') await request.post('/auth/logout') } } catch (error) { console.error('登出请求失败:', error) } finally { // 清除本地状态 token.value = '' userInfo.value = null localStorage.removeItem('token') } } // 获取用户信息 async function getUserInfo(): Promise { if (USE_MOCK) { const info = await mockGetUserInfo() userInfo.value = info return info } const { request } = await import('@/utils/request') const res = await request.get('/user/info') userInfo.value = res.data.data return res.data.data } // 设置用户信息 function setUserInfo(info: UserInfo) { userInfo.value = info } // 重置状态 function resetState() { token.value = '' userInfo.value = null localStorage.removeItem('token') } return { // 状态 token, userInfo, // 计算属性 isLoggedIn, username, nickname, avatar, // 方法 getCaptcha, login, logout, getUserInfo, setUserInfo, resetState } })