import { encryptPassword } from '../utils/cryptots'; import React, { useState, useEffect } from 'react'; import { useNavigate, Link } from 'react-router-dom'; import { authService, RegisterRequest } from '../services/authService'; import { userApi } from '../services/userApi'; import { Mail, Lock, User, Phone, GraduationCap, AlertCircle, CheckCircle2 } from 'lucide-react'; import { Loader2 } from '../icons/commonIcons'; import PasswordStrengthIndicator from '../components/PasswordStrengthIndicator'; import { BrandingContext } from '../App'; const Register: React.FC = () => { const navigate = useNavigate(); const branding = React.useContext(BrandingContext); const [formData, setFormData] = useState({ username: '', password: '', email: '', phone: '', nickname: '', }); const [smsCode, setSmsCode] = useState(''); const [smsSending, setSmsSending] = useState(false); const [smsCountdown, setSmsCountdown] = useState(0); const [confirmPassword, setConfirmPassword] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const [autoLoginLoading, setAutoLoginLoading] = useState(false); const [passwordMeetsRequirements, setPasswordMeetsRequirements] = useState(false); // 验证码倒计时 useEffect(() => { if (smsCountdown <= 0) return; const timer = setTimeout(() => setSmsCountdown(c => c - 1), 1000); return () => clearTimeout(timer); }, [smsCountdown]); const handleSendSms = async () => { if (!formData.phone || formData.phone.length !== 11) { setError('请先填写正确的手机号'); return; } setSmsSending(true); setError(null); try { await userApi.sendSmsCode(formData.phone, 'register'); setSmsCountdown(60); } catch (e: any) { setError(e.message || '发送失败'); } finally { setSmsSending(false); } }; const handleInputChange = (field: keyof RegisterRequest, value: string) => { setFormData(prev => ({ ...prev, [field]: value })); setError(null); }; const validateForm = (): boolean => { if (!formData.username.trim()) { setError('请输入用户名'); return false; } if (formData.username.length < 3) { setError('用户名至少需要3个字符'); return false; } if (!formData.password) { setError('请输入密码'); return false; } if (formData.password.length < 6) { setError('密码至少需要6个字符'); return false; } if (!passwordMeetsRequirements) { setError('密码强度太弱,无法注册。请添加大写字母、数字或特殊符号'); return false; } if (formData.password !== confirmPassword) { setError('两次输入的密码不一致'); return false; } if (!formData.phone) { setError('请输入手机号'); return false; } if (!smsCode) { setError('请输入手机验证码'); return false; } return true; }; const handleRegister = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!validateForm()) return; setLoading(true); try { const encryptedPassword = encryptPassword(formData.password); const registerData: RegisterRequest = { username: formData.username, password: encryptedPassword, nickname: formData.nickname || formData.username, email: formData.email, phone: formData.phone, sms_code: smsCode || undefined, }; const response = await authService.register(registerData); if (response.code === 200) { setSuccess(true); } else { setError(response.message || '注册失败,请稍后重试'); } } catch (err) { setError(err instanceof Error ? err.message : '注册失败,请稍后重试'); } finally { setLoading(false); } }; // 自动登录 const handleAutoLogin = async () => { setAutoLoginLoading(true); try { const encryptedPassword = encryptPassword(formData.password); const loginResponse = await authService.login(formData.username, encryptedPassword); if (loginResponse.code === 200) { navigate('/'); } else { navigate('/login'); } } catch (err) { navigate('/login'); } finally { setAutoLoginLoading(false); } }; if (success) { return (

注册成功!

您的账号已创建成功

); } return (
{/* Logo/标题 */}
{branding.system_logo ? logo : }

注册{branding.system_name}

创建您的账号

{/* 错误提示 */} {error && (

{error}

)} {/* 注册表单 */}
handleInputChange('username', e.target.value)} placeholder="请输入用户名(至少3个字符)" className="w-full pl-10 pr-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" required />
handleInputChange('email', e.target.value)} placeholder="请输入邮箱(可选)" className="w-full pl-10 pr-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" />
handleInputChange('phone', e.target.value)} placeholder="请输入手机号" maxLength={11} className="w-full pl-10 pr-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" required />
{/* 手机号验证码 */}
setSmsCode(e.target.value)} placeholder="请输入验证码" maxLength={6} className="flex-1 px-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" required />
handleInputChange('nickname', e.target.value)} placeholder="请输入昵称(可选,默认为用户名)" className="w-full pl-10 pr-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" />
handleInputChange('password', e.target.value)} placeholder="请输入密码(至少6个字符)" className="w-full pl-10 pr-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" required />
{formData.password && (
)}
{ setConfirmPassword(e.target.value); setError(null); }} placeholder="请再次输入密码" className="w-full pl-10 pr-4 py-3 bg-gray-50 border border-gray-200 rounded-xl text-sm outline-none focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-all" required />
{/* 已有账号 */}

已有账号?{' '} 立即登录

); }; export default Register;