151 lines
3.8 KiB
TypeScript
151 lines
3.8 KiB
TypeScript
![]() |
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
|
||
|
}
|
||
|
})
|