'use client' import { useState, type FormEvent } from 'react' import { useRouter } from 'next/navigation' import { Lock, User, Loader2, Eye, EyeOff, ShieldCheck } from 'lucide-react' import { api } from '@/lib/api-client' import { login } from '@/lib/auth' import { ApiRequestError } from '@/lib/api-client' export default function LoginPage() { const router = useRouter() const [username, setUsername] = useState('') const [password, setPassword] = useState('') const [totpCode, setTotpCode] = useState('') const [showPassword, setShowPassword] = useState(false) const [needTotp, setNeedTotp] = useState(false) const [remember, setRemember] = useState(false) const [loading, setLoading] = useState(false) const [error, setError] = useState('') async function handleSubmit(e: FormEvent) { e.preventDefault() setError('') if (!username.trim()) { setError('请输入用户名') return } if (!password.trim()) { setError('请输入密码') return } setLoading(true) try { const res = await api.auth.login({ username: username.trim(), password, totp_code: totpCode.trim() || undefined, }) login(res.token, res.account) router.replace('/') } catch (err) { if (err instanceof ApiRequestError) { const msg = err.body.message || '' // 后端返回 "需要 TOTP" 时显示 TOTP 输入框 if (msg.includes('TOTP') || msg.includes('totp') || msg.includes('2FA') || msg.includes('验证码') || err.status === 403) { setNeedTotp(true) setError(msg || '请输入两步验证码') } else { setError(msg || '登录失败,请检查用户名和密码') } } else { setError('网络错误,请稍后重试') } } finally { setLoading(false) } } return (
AI Agent 管理平台
统一管理 AI 服务商、模型配置、API 密钥、用量监控与系统配置
AI Agent 管理平台
输入您的账号信息以继续