Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | 2x 2x | import { defineStore } from 'pinia'
import request from '@/utils/request'
import { message } from 'ant-design-vue'
interface User {
id: number
username: string
role: string
}
interface AuthState {
token: string | null
user: User | null
loading: boolean
error: string | null
}
export const useAuthStore = defineStore('auth', {
state: (): AuthState => ({
token: localStorage.getItem('token'),
user: JSON.parse(localStorage.getItem('user') || 'null'),
loading: false,
error: null
}),
actions: {
async login(form: Record<string, string>) {
this.loading = true
this.error = null
try {
const formData = new FormData()
formData.append('username', form.username)
formData.append('password', form.password)
const res = await request.post('/auth/login', formData)
this.token = res.data.access_token
localStorage.setItem('token', this.token || '')
const userRes = await request.get('/users/me')
this.user = userRes.data
localStorage.setItem('user', JSON.stringify(this.user))
message.success('登录成功')
// Use dynamic import to avoid circular dependency
const router = (await import('@/router')).default
router.push('/')
} catch (err: unknown) {
if (err && typeof err === 'object' && 'response' in err) {
const error = err as any
this.error = error.response?.data?.detail || '登录失败,请检查用户名或密码'
} else {
this.error = '登录失败,请检查用户名或密码'
}
} finally {
this.loading = false
}
},
async register(form: Record<string, string>) {
this.loading = true
this.error = null
try {
await request.post('/auth/register', {
username: form.username,
password: form.password
})
message.success('注册成功,正在自动登录...')
await this.login(form)
} catch (err: unknown) {
if (err && typeof err === 'object' && 'response' in err) {
const error = err as any
this.error = error.response?.data?.detail || '注册失败,请稍后重试'
} else {
this.error = '注册失败,请稍后重试'
}
} finally {
this.loading = false
}
},
async logout() {
this.token = null
this.user = null
localStorage.removeItem('token')
localStorage.removeItem('user')
const router = (await import('@/router')).default
router.push('/auth/login')
message.success('已退出登录')
}
}
})
|