import { useEffect, useState } from 'react'; import { getVerificationCodeImage, loginByPassword } from '../../api'; import { Button, Input } from '../ui'; interface LoginSuccessPayload { userId: string; userName: string; accessToken: string; refreshToken: string; roles: string; username: string; } interface LoginModalProps { onClose: () => void; onLoginSuccess?: (payload: LoginSuccessPayload) => void; } const APP_ID = 'b2b49e91d21446aeb14579930f732985'; export const LoginModal = ({ onClose, onLoginSuccess }: LoginModalProps) => { const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [imgCode, setImgCode] = useState(''); const [imgCodeKey, setImgCodeKey] = useState(''); const [imgCodeUrl, setImgCodeUrl] = useState(null); const [loading, setLoading] = useState(false); const [imgLoading, setImgLoading] = useState(false); const [error, setError] = useState(''); const fetchImageCode = async () => { setImgLoading(true); setError(''); try { const res = await getVerificationCodeImage({ app_id: APP_ID }); if (res.Status === 200 && res.Data) { setImgCodeKey(res.Data.verification_code_key || ''); // 后端返回的可能是 base64,直接作为 src setImgCodeUrl(res.Data.verification_code_image || null); } else { setError(res.Message || '获取图形验证码失败'); } } catch (err) { console.error('获取图形验证码失败', err); setError('获取图形验证码失败,请稍后重试'); } finally { setImgLoading(false); } }; useEffect(() => { fetchImageCode(); }, []); const handleLogin = async () => { if (!username.trim()) { setError('请输入账号'); return; } if (!password) { setError('请输入密码'); return; } if (!imgCode.trim()) { setError('请输入图形验证码'); return; } if (!imgCodeKey) { setError('验证码失效,请刷新'); return; } setError(''); setLoading(true); try { const res = await loginByPassword({ username: username.trim(), password, verification_code: imgCode.trim(), verification_code_key: imgCodeKey, }); if (res.Status === 200 && res.Data?.access_token) { onLoginSuccess?.({ userId: res.Data.user_id, userName: res.Data.user_name, accessToken: res.Data.access_token, refreshToken: res.Data.refresh_token, roles: res.Data.roles, username: username.trim(), }); onClose(); } else { setError(res.Message || '登录失败'); // 登录失败时刷新验证码 fetchImageCode(); } } catch (err) { console.error('登录失败', err); setError('登录失败,请稍后重试'); fetchImageCode(); } finally { setLoading(false); } }; const canLogin = !!(username && password && imgCode && imgCodeKey && !loading); return (
e.stopPropagation()} >
操作员登录
{ setUsername(e.target.value); setError(''); }} className='text-base' />
{ setPassword(e.target.value); setError(''); }} className='text-base' />
{ setImgCode(e.target.value); setError(''); }} className='text-base flex-1' />
{imgLoading ? ( 加载中… ) : imgCodeUrl ? ( 验证码 ) : ( )}
看不清?点击图片刷新
{error && (
{error}
)}
); };