import { defineStore } from 'pinia' import { getToken, getUserInfoData, setUserInfoData, removeUserInfoData } from '@/utils/storage' import { useTokenStore } from './token' import { getUserData, userLogout } from '@/api' import { ref } from 'vue' import { useUI } from '@/utils/use-ui' import { reLaunch } from '@/utils/router' export const useUserStore = defineStore('user', () => { const { clearToken } = useTokenStore() const { showDialog } = useUI() 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 = async () => { const show = await showDialog('提示', '确定要退出登录吗?') if (show) { await userLogout() userInfo.value = null clearToken() removeUserInfoData() reLaunch('/pages/login/login') } } /** 刷新用户信息(如用户信息被修改) */ 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 } })