Files
base-vite/src/stores/modules/user.ts
2025-07-09 20:36:32 +08:00

119 lines
2.6 KiB
TypeScript

/**
* 用户状态管理
*/
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<UserInfo | null>(null)
// 访问令牌
const accessToken = ref<string>('')
// 刷新令牌
const refreshToken = ref<string>('')
// 计算属性
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<UserInfo>) => {
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
}
})