import React, { useState, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '@/contexts/AuthContext'; import { authAPI } from '@/api'; import type { User } from '@/types'; import './LoginPage.css'; const LoginPage: React.FC = () => { const { login } = useAuth(); const navigate = useNavigate(); const [activeTab, setActiveTab] = useState<'login' | 'register'>('login'); const [errorMsg, setErrorMsg] = useState(''); const [loading, setLoading] = useState(false); // Register state const [registerMethod, setRegisterMethod] = useState<'phone' | 'email'>('phone'); const [regPhone, setRegPhone] = useState(''); const [regEmail, setRegEmail] = useState(''); const [regUsername, setRegUsername] = useState(''); const [regPassword, setRegPassword] = useState(''); const [smsCode, setSmsCode] = useState(''); const [smsSent, setSmsSent] = useState(false); const [smsCountdown, setSmsCountdown] = useState(0); const [emailCode, setEmailCode] = useState(''); const [emailSent, setEmailSent] = useState(false); const [emailCountdown, setEmailCountdown] = useState(0); const timerRef = useRef | null>(null); // Login state const [loginAccount, setLoginAccount] = useState(''); const [loginPassword, setLoginPassword] = useState(''); const startCountdown = (setter: (v: number) => void) => { let count = 60; setter(count); if (timerRef.current) clearInterval(timerRef.current); timerRef.current = setInterval(() => { count--; setter(count); if (count <= 0 && timerRef.current) { clearInterval(timerRef.current); timerRef.current = null; } }, 1000); }; const handleSendSms = () => { if (!regPhone.trim() || smsCountdown > 0) return; setSmsSent(true); startCountdown(setSmsCountdown); }; const handleSendEmailCode = () => { if (!regEmail.trim() || emailCountdown > 0) return; setEmailSent(true); startCountdown(setEmailCountdown); }; const handleLogin = async () => { setErrorMsg(''); if (!loginAccount.trim() || !loginPassword.trim()) { setErrorMsg('请输入用户名和密码'); return; } setLoading(true); try { const res = await authAPI.login(loginAccount, loginPassword); const data: any = (res as any).data || res; const token = data.access_token || data.token; const userData = data.user || data; localStorage.setItem('aiflow_token', token); const userObj: User = { id: userData.id, username: userData.username, email: userData.email || '', phone: userData.phone || '', avatar: userData.avatar || '', role: userData.role || 'user', status: 'active', realNameStatus: 'unverified', createdAt: new Date().toISOString(), }; login(userObj); navigate(userObj.role === 'admin' ? '/admin' : '/chat'); } catch (e: any) { const msg = (e as any).detail || (e as any).message || ''; if (msg.includes('Network') || msg.includes('fetch')) { setErrorMsg('网络连接失败,请检查网络'); } else { setErrorMsg(msg || '登录失败,请稍后重试'); } } finally { setLoading(false); } }; const handleRegister = async () => { setErrorMsg(''); if (!regUsername.trim() || !regPassword.trim() || regPassword.length < 6) { setErrorMsg('用户名和密码为必填(密码至少6位)'); return; } setLoading(true); try { const data: any = { username: regUsername, password: regPassword }; if (registerMethod === 'phone') data.phone = regPhone; else data.email = regEmail; const res = await authAPI.register(data); const { access_token, user: userData } = res.data; localStorage.setItem('aiflow_token', access_token); const userObj: User = { id: userData.id, username: userData.username, email: userData.email || '', phone: userData.phone || '', avatar: userData.avatar || '', role: 'user', status: 'active', realNameStatus: 'unverified', createdAt: new Date().toISOString(), }; login(userObj); navigate('/chat'); } catch (e: any) { setErrorMsg(e.message || '注册失败'); } finally { setLoading(false); } }; const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && activeTab === 'login') handleLogin(); }; return (

七虎AI

智能自动化PaaS平台

✓一站式AI自动化SOP
✓多模型自由切换
✓知识库 + 应用市场
✓Token消耗实时掌控
{errorMsg &&
{errorMsg}
} {activeTab === 'login' ? (
setLoginAccount(e.target.value)} />
setLoginPassword(e.target.value)} />
) : (
{registerMethod === 'phone' ? ( <>
setRegPhone(e.target.value)} />
setSmsCode(e.target.value)} />
) : ( <>
setRegEmail(e.target.value)} />
setEmailCode(e.target.value)} />
)}
setRegUsername(e.target.value)} />
setRegPassword(e.target.value)} />
)}
); }; export default LoginPage;