import React, { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { Button, Input, Form, Toast } from 'antd-mobile' import styles from './Login.module.less' interface LoginResponse { success: boolean message: string data?: { token: string user: { username: string avatar: string nickname: string } } } const Login: React.FC = () => { const navigate = useNavigate() const [isLogin, setIsLogin] = useState(true) const [loading, setLoading] = useState(false) // 表单字段 const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [nickname, setNickname] = useState('') // 如果已登录,重定向到首页 useEffect(() => { const token = localStorage.getItem('token') if (token) { navigate('/', { replace: true }) } }, [navigate]) // 处理登录 const handleLogin = async () => { if (!username || !password) { Toast.show({ icon: 'fail', content: '请输入用户名和密码', }) return } setLoading(true) try { const response = await fetch('http://localhost:8080/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username, password }), }) const data: LoginResponse = await response.json() if (data.success && data.data) { // 保存token到localStorage localStorage.setItem('token', data.data.token) localStorage.setItem('user', JSON.stringify(data.data.user)) Toast.show({ icon: 'success', content: '登录成功', }) // 跳转到首页 navigate('/') } else { Toast.show({ icon: 'fail', content: data.message || '登录失败', }) } } catch (err) { Toast.show({ icon: 'fail', content: '网络错误,请稍后重试', }) console.error('登录错误:', err) } finally { setLoading(false) } } // 处理注册 const handleRegister = async () => { if (!username || !password) { Toast.show({ icon: 'fail', content: '请输入用户名和密码', }) return } if (password.length < 6) { Toast.show({ icon: 'fail', content: '密码长度至少6位', }) return } setLoading(true) try { const response = await fetch('http://localhost:8080/api/register', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ username, password, nickname }), }) const data: LoginResponse = await response.json() if (data.success && data.data) { // 保存token到localStorage localStorage.setItem('token', data.data.token) localStorage.setItem('user', JSON.stringify(data.data.user)) Toast.show({ icon: 'success', content: '注册成功', }) // 跳转到首页 navigate('/') } else { Toast.show({ icon: 'fail', content: data.message || '注册失败', }) } } catch (err) { Toast.show({ icon: 'fail', content: '网络错误,请稍后重试', }) console.error('注册错误:', err) } finally { setLoading(false) } } return (
欢迎使用AnKao题库系统
还没有账号?
) : (已有账号?
)}