60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import api from '../services/api'
|
|
|
|
export const useAuthStore = defineStore('auth', {
|
|
state: () => ({
|
|
user: null,
|
|
token: localStorage.getItem('access_token') || null,
|
|
isAuthenticated: !!localStorage.getItem('access_token')
|
|
}),
|
|
|
|
actions: {
|
|
async login(credentials) {
|
|
try {
|
|
const response = await api.post('/auth/login', credentials)
|
|
this.token = response.data.access_token
|
|
this.user = response.data.user
|
|
this.isAuthenticated = true
|
|
localStorage.setItem('access_token', this.token)
|
|
return { success: true }
|
|
} catch (error) {
|
|
return { success: false, error: error.message }
|
|
}
|
|
},
|
|
|
|
async register(userData) {
|
|
try {
|
|
const response = await api.post('/auth/register', userData)
|
|
// 注册后自动登录
|
|
return this.login({ username: userData.username, password: userData.password })
|
|
} catch (error) {
|
|
return { success: false, error: error.message }
|
|
}
|
|
},
|
|
|
|
async logout() {
|
|
try {
|
|
await api.post('/auth/logout')
|
|
} catch (error) {
|
|
// 忽略错误
|
|
}
|
|
this.token = null
|
|
this.user = null
|
|
this.isAuthenticated = false
|
|
localStorage.removeItem('access_token')
|
|
},
|
|
|
|
async fetchUser() {
|
|
try {
|
|
const response = await api.get('/auth/me')
|
|
this.user = response.data
|
|
return { success: true }
|
|
} catch (error) {
|
|
this.token = null
|
|
this.isAuthenticated = false
|
|
localStorage.removeItem('access_token')
|
|
return { success: false }
|
|
}
|
|
}
|
|
}
|
|
}) |