authStore.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import { create } from 'zustand'
  2. import { adminApi } from '../api/admin'
  3. interface AuthState {
  4. isAuthenticated: boolean
  5. adminInfo: any | null
  6. login: (username: string, password: string) => Promise<void>
  7. logout: () => Promise<void>
  8. checkAuth: () => void
  9. }
  10. export const useAuthStore = create<AuthState>((set) => ({
  11. isAuthenticated: !!localStorage.getItem('admin_token'),
  12. adminInfo: null,
  13. login: async (username: string, password: string) => {
  14. try {
  15. const response = await adminApi.login(username, password)
  16. console.log('Login response:', response)
  17. // 响应拦截器返回的是 {code: 200, msg: "...", data: {token: "...", admin: {...}}}
  18. // 需要访问 response.data 来获取 token 和 admin
  19. const data = response?.data || response
  20. if (data?.token) {
  21. localStorage.setItem('admin_token', data.token)
  22. set({
  23. isAuthenticated: true,
  24. adminInfo: data.admin,
  25. })
  26. } else {
  27. throw new Error('登录失败:未获取到 token')
  28. }
  29. } catch (error) {
  30. console.error('Login error:', error)
  31. throw error
  32. }
  33. },
  34. logout: async () => {
  35. try {
  36. await adminApi.logout()
  37. } catch (error) {
  38. console.error('Logout error:', error)
  39. } finally {
  40. localStorage.removeItem('admin_token')
  41. set({
  42. isAuthenticated: false,
  43. adminInfo: null,
  44. })
  45. }
  46. },
  47. checkAuth: () => {
  48. const token = localStorage.getItem('admin_token')
  49. set({ isAuthenticated: !!token })
  50. },
  51. }))