All files / stores auth.ts

5% Statements 2/40
11.11% Branches 2/18
25% Functions 1/4
5% Lines 2/40

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('已退出登录')
    }
  }
})