119 lines
2.6 KiB
TypeScript
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
|
|
}
|
|
})
|