151 lines
3.8 KiB
TypeScript
Raw Normal View History

2025-07-22 14:39:45 +08:00
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
export interface User {
id: number
username: string
email: string
avatar?: string
role: 'student' | 'teacher' | 'admin'
createdAt: string
}
export const useUserStore = defineStore('user', () => {
// 状态
const user = ref<User | null>(null)
const token = ref<string | null>(localStorage.getItem('token'))
const isLoading = ref(false)
// 计算属性
const isLoggedIn = computed(() => !!user.value && !!token.value)
const isStudent = computed(() => user.value?.role === 'student')
const isTeacher = computed(() => user.value?.role === 'teacher')
const isAdmin = computed(() => user.value?.role === 'admin')
// 方法
const login = async (credentials: { email: string; password: string }) => {
isLoading.value = true
try {
// 模拟API调用
await new Promise(resolve => setTimeout(resolve, 1000))
// 模拟登录成功
const mockUser: User = {
id: 1,
username: '张三',
email: credentials.email,
avatar: 'https://via.placeholder.com/100',
role: 'student',
createdAt: new Date().toISOString()
}
const mockToken = 'mock-jwt-token-' + Date.now()
user.value = mockUser
token.value = mockToken
localStorage.setItem('token', mockToken)
localStorage.setItem('user', JSON.stringify(mockUser))
return { success: true, message: '登录成功' }
} catch (error) {
return { success: false, message: '登录失败' }
} finally {
isLoading.value = false
}
}
const register = async (userData: {
username: string
email: string
password: string
confirmPassword: string
}) => {
isLoading.value = true
try {
// 模拟API调用
await new Promise(resolve => setTimeout(resolve, 1000))
// 模拟注册成功
const mockUser: User = {
id: Date.now(),
username: userData.username,
email: userData.email,
role: 'student',
createdAt: new Date().toISOString()
}
const mockToken = 'mock-jwt-token-' + Date.now()
user.value = mockUser
token.value = mockToken
localStorage.setItem('token', mockToken)
localStorage.setItem('user', JSON.stringify(mockUser))
return { success: true, message: '注册成功' }
} catch (error) {
return { success: false, message: '注册失败' }
} finally {
isLoading.value = false
}
}
const logout = () => {
user.value = null
token.value = null
localStorage.removeItem('token')
localStorage.removeItem('user')
}
const updateProfile = async (profileData: Partial<User>) => {
isLoading.value = true
try {
// 模拟API调用
await new Promise(resolve => setTimeout(resolve, 500))
if (user.value) {
user.value = { ...user.value, ...profileData }
localStorage.setItem('user', JSON.stringify(user.value))
}
return { success: true, message: '更新成功' }
} catch (error) {
return { success: false, message: '更新失败' }
} finally {
isLoading.value = false
}
}
const initializeAuth = () => {
const savedUser = localStorage.getItem('user')
const savedToken = localStorage.getItem('token')
if (savedUser && savedToken) {
try {
user.value = JSON.parse(savedUser)
token.value = savedToken
} catch (error) {
console.error('Failed to parse saved user data:', error)
logout()
}
}
}
return {
// 状态
user,
token,
isLoading,
// 计算属性
isLoggedIn,
isStudent,
isTeacher,
isAdmin,
// 方法
login,
register,
logout,
updateProfile,
initializeAuth
}
})