/** * 用户状态管理 */ import { defineStore } from 'pinia' import { ref, computed } from 'vue' export interface UserInfo { id: number | string username: string nickname: string avatar?: string email?: string phone?: string roles: string[] } export const useUserStore = defineStore('user', () => { // 用户信息 const userInfo = ref(null) // 访问令牌 const accessToken = ref('') // 刷新令牌 const refreshToken = ref('') // 计算属性 const isLoggedIn = computed(() => !!accessToken.value && !!userInfo.value) const username = computed(() => userInfo.value?.username || '') const nickname = computed(() => userInfo.value?.nickname || '') const roles = computed(() => userInfo.value?.roles || []) // 设置用户信息 const setUserInfo = (info: UserInfo) => { userInfo.value = info } // 设置访问令牌 const setAccessToken = (token: string) => { accessToken.value = token } // 设置刷新令牌 const setRefreshToken = (token: string) => { refreshToken.value = token } // 登录 const login = async (loginData: { username: string; password: string }) => { try { // 这里调用登录API // const response = await loginApi(loginData) // 模拟登录成功 const mockUserInfo: UserInfo = { id: 1, username: loginData.username, nickname: loginData.username, roles: ['user'] } setUserInfo(mockUserInfo) setAccessToken('mock-access-token') setRefreshToken('mock-refresh-token') return { success: true, data: mockUserInfo } } catch (error) { console.error('登录失败:', error) return { success: false, error: '登录失败' } } } // 登出 const logout = () => { userInfo.value = null accessToken.value = '' refreshToken.value = '' } // 更新用户信息 const updateUserInfo = (updates: Partial) => { if (userInfo.value) { userInfo.value = { ...userInfo.value, ...updates } } } // 检查权限 const hasRole = (role: string) => { return roles.value.includes(role) } // 检查多个权限 const hasAnyRole = (roleList: string[]) => { return roleList.some(role => hasRole(role)) } return { // 状态 userInfo, accessToken, refreshToken, // 计算属性 isLoggedIn, username, nickname, roles, // 方法 setUserInfo, setAccessToken, setRefreshToken, login, logout, updateUserInfo, hasRole, hasAnyRole } })