import React, { useState, useEffect } from 'react' import { APP_VERSION } from '../config/version' import { api } from '../utils/api' import { ErrorCodes } from '../utils/errorCodes' export default function Login() { const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [captcha, setCaptcha] = useState({ num1: 0, num2: 0, answer: '' }) // 注册相关状态 const [showRegister, setShowRegister] = useState(false) const [registerData, setRegisterData] = useState({ username: '', password: '', confirmPassword: '', email: '' }) const [registerLoading, setRegisterLoading] = useState(false) const [registerError, setRegisterError] = useState('') // 生成验证码 useEffect(() => { generateCaptcha() }, []) const generateCaptcha = () => { const num1 = Math.floor(Math.random() * 10) const num2 = Math.floor(Math.random() * 10) setCaptcha({ num1, num2, answer: '' }) } // 处理注册 const handleRegister = async () => { // 验证输入 if (!registerData.username || !registerData.password) { setRegisterError('用户名和密码为必填项') return } if (registerData.username.length < 3) { setRegisterError('用户名至少 3 个字符') return } if (registerData.password.length < 6) { setRegisterError('密码至少 6 个字符') return } if (registerData.password !== registerData.confirmPassword) { setRegisterError('两次输入的密码不一致') return } setRegisterLoading(true) setRegisterError('') try { const payload = { username: registerData.username, password: registerData.password } if (registerData.email) { payload.email = registerData.email } const res = await fetch('/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }) const data = await res.json() if (!res.ok) { throw new Error(data.error?.message || '注册失败') } alert('注册成功!请登录') setShowRegister(false) setRegisterData({ username: '', password: '', confirmPassword: '', email: '' }) generateCaptcha() } catch (err) { console.error('注册错误:', err) setRegisterError(err.message || '注册失败') } finally { setRegisterLoading(false) } } const handleLogin = async () => { // 验证输入 if (!username || !password) { setError(ErrorCodes.E00020.message) return } if (username.length < 3) { setError(ErrorCodes.E00021.message) return } if (password.length < 6) { setError(ErrorCodes.E00022.message) return } // 验证验证码 const expectedAnswer = captcha.num1 + captcha.num2 if (!captcha.answer || Number(captcha.answer) !== expectedAnswer) { setError(ErrorCodes.E00012.message) return } setLoading(true) setError('') try { console.log('开始登录...') const loginData = await api.auth.login(username, password) console.log('登录响应:', loginData) if (!loginData.access_token) { throw new Error('登录响应中没有 access_token') } localStorage.setItem('token', loginData.access_token) console.log('Token 已保存') const userData = await api.user.me() console.log('用户信息:', userData) localStorage.setItem('user', JSON.stringify(userData)) console.log('用户信息已保存') // 强制刷新页面,确保 React 状态更新 window.location.href = window.location.origin + window.location.pathname + '#/' console.log('跳转首页') } catch (err) { console.error('登录错误:', err) const errorCode = err.code || 'E00000' const errorMsg = err.message || '登录失败' setError(`${errorCode}: ${errorMsg}`) } finally { setLoading(false) } } return (
生肖纪念钞管理系统