import { useState } from 'react' import { useNavigate } from 'react-router' import { ArrowLeft, ArrowRight, Eye, EyeOff, Lock } from 'lucide-react' import { Alert, Button, Card, Input } from 'antd' import { useAuth } from '../lib/auth' import { ApiError } from '../lib/api' import { useDocumentTitle } from '../features/site' export default function Login() { useDocumentTitle('管理员登录') const { login, authenticated } = useAuth() const navigate = useNavigate() const [password, setPassword] = useState('') const [showPw, setShowPw] = useState(false) const [error, setError] = useState(null) const [submitting, setSubmitting] = useState(false) if (authenticated) { navigate('/admin', { replace: true }) } const onSubmit = async (e: React.FormEvent) => { e.preventDefault() setError(null) setSubmitting(true) try { await login(password) navigate('/admin', { replace: true }) } catch (err) { if (err instanceof ApiError) { if (err.status === 429) setError('尝试过于频繁,请稍后再试') else if (err.status === 403) setError('请求被安全策略拦截,请刷新页面后重试') else setError('密码错误,请重试') } else { setError('登录失败,请重试') } } finally { setSubmitting(false) } } return (
ADMIN Pure Note

管理员登录

请输入管理密码以继续

setPassword(e.target.value)} prefix={} suffix={

连续失败将被暂时锁定

) }