import { defineStore } from 'pinia' import { getToken, getUserInfoData, setUserInfoData, removeUserInfoData } from '@/utils/storage' import { useTokenStore } from './token' import { getUserData } from '@/api' import { ref } from 'vue' export const useUserStore = defineStore('user', () => { const { clearToken } = useTokenStore() const userInfo = ref( getUserInfoData() ? JSON?.parse(getUserInfoData()) : {} ) /** 用户信息对象 */ /** * 获取用户信息(可从缓存或接口) */ const fetchUserInfo = async () => { // 尝试从本地缓存读取 const cachedToken = getToken() const cachedUserInfo = getUserInfoData() if (cachedToken && cachedUserInfo) { userInfo.value = JSON.parse(cachedUserInfo) return } const res = await getUserData() setUserInfo(res.data) return } /** * 设置用户信息 */ const setUserInfo = data => { userInfo.value = data // 同步到本地存储 setUserInfoData(data) } /** * 清除用户信息(退出登录) */ const clearUserInfo = () => { userInfo.value = null clearToken() removeUserInfoData() } /** 刷新用户信息(如用户信息被修改) */ const refreshUserInfo = async () => { const res = await getUserData() setUserInfo(res.data) } /** * 更新部分用户信息(例如昵称、头像) */ const updateUserInfo = partialData => { if (!userInfo.value) return userInfo.value = { ...userInfo.value, ...partialData } setUserInfoData(userInfo.value) } return { userInfo, refreshUserInfo, fetchUserInfo, setUserInfo, clearUserInfo, updateUserInfo } })