bbe8fcd776
- 将前端项目目录从 web-flowith 重命名为 web,使目录结构更简洁 - 保持所有前端代码和配置文件不变 - 统一项目目录命名规范
158 lines
3.7 KiB
TypeScript
158 lines
3.7 KiB
TypeScript
import { defineStore } from 'pinia'
|
|
import { ref, computed } from 'vue'
|
|
import { authService, authUtils } from '@/services/auth'
|
|
import type { User } from '@/types'
|
|
import type { UserInfo, LoginRequest } from '@/types/auth'
|
|
|
|
export const useUserStore = defineStore('user', () => {
|
|
// 用户状态
|
|
const user = ref<User | null>(null)
|
|
const userInfo = ref<UserInfo | null>(null)
|
|
const token = ref<string>('')
|
|
const isLoading = ref(false)
|
|
const isLoggedIn = computed(() => !!token.value && (!!user.value || !!userInfo.value))
|
|
|
|
// 方法
|
|
const setUser = (userData: User) => {
|
|
user.value = userData
|
|
}
|
|
|
|
const setToken = (tokenValue: string) => {
|
|
token.value = tokenValue
|
|
// 存储到localStorage
|
|
if (tokenValue) {
|
|
localStorage.setItem('token', tokenValue)
|
|
} else {
|
|
localStorage.removeItem('token')
|
|
}
|
|
}
|
|
|
|
const setUserInfo = (userInfoData: UserInfo | null) => {
|
|
userInfo.value = userInfoData
|
|
// 存储到localStorage
|
|
if (userInfoData) {
|
|
localStorage.setItem('userInfo', JSON.stringify(userInfoData))
|
|
} else {
|
|
localStorage.removeItem('userInfo')
|
|
}
|
|
}
|
|
|
|
// 新的登录方法,支持认证服务
|
|
const loginWithAuth = async (loginData: LoginRequest) => {
|
|
isLoading.value = true
|
|
try {
|
|
const data = await authService.login(loginData)
|
|
setToken(data.accessToken)
|
|
setUserInfo(data.userInfo)
|
|
return data
|
|
} catch (error: any) {
|
|
throw error
|
|
} finally {
|
|
isLoading.value = false
|
|
}
|
|
}
|
|
|
|
const login = async (credentials: { username: string; password: string }) => {
|
|
try {
|
|
// TODO: 调用登录API
|
|
// const response = await authApi.login(credentials)
|
|
// setToken(response.data.token)
|
|
// setUser(response.data.user)
|
|
|
|
// 临时模拟登录
|
|
setToken('mock-token')
|
|
setUser({
|
|
id: '1',
|
|
username: credentials.username,
|
|
email: 'user@example.com',
|
|
nickname: '用户',
|
|
createTime: new Date().toISOString(),
|
|
updateTime: new Date().toISOString()
|
|
})
|
|
|
|
return true
|
|
} catch (error) {
|
|
console.error('Login failed:', error)
|
|
return false
|
|
}
|
|
}
|
|
|
|
const logout = async () => {
|
|
try {
|
|
await authService.logout()
|
|
} catch (error) {
|
|
console.error('Logout error:', error)
|
|
} finally {
|
|
// 清除状态和本地存储
|
|
user.value = null
|
|
userInfo.value = null
|
|
setToken('')
|
|
authUtils.clearAuth()
|
|
}
|
|
}
|
|
|
|
const updateProfile = (profileData: Partial<User>) => {
|
|
if (user.value) {
|
|
user.value = { ...user.value, ...profileData }
|
|
// TODO: 调用更新API
|
|
}
|
|
}
|
|
|
|
// 初始化用户状态
|
|
const initUser = () => {
|
|
const savedToken = authUtils.getToken()
|
|
const savedUserInfo = authUtils.getUserInfo()
|
|
|
|
console.log('初始化用户状态:', { savedToken: !!savedToken, savedUserInfo })
|
|
|
|
if (savedToken) {
|
|
setToken(savedToken)
|
|
}
|
|
|
|
if (savedUserInfo) {
|
|
setUserInfo(savedUserInfo)
|
|
}
|
|
|
|
console.log('用户状态初始化完成:', {
|
|
token: !!token.value,
|
|
userInfo: userInfo.value,
|
|
isLoggedIn: isLoggedIn.value
|
|
})
|
|
}
|
|
|
|
// 刷新用户信息
|
|
const refreshUserInfo = async () => {
|
|
if (!token.value) return
|
|
|
|
try {
|
|
const response = await authService.getUserInfo()
|
|
if (response.success) {
|
|
userInfo.value = response.data
|
|
authUtils.setUserInfo(response.data)
|
|
}
|
|
} catch (error) {
|
|
console.error('Refresh user info error:', error)
|
|
}
|
|
}
|
|
|
|
return {
|
|
// 状态
|
|
user,
|
|
userInfo,
|
|
token,
|
|
isLoading,
|
|
isLoggedIn,
|
|
|
|
// 方法
|
|
setUser,
|
|
setToken,
|
|
setUserInfo,
|
|
login,
|
|
loginWithAuth,
|
|
logout,
|
|
updateProfile,
|
|
initUser,
|
|
refreshUserInfo
|
|
}
|
|
})
|