import { useState, useEffect } from 'react' import { useNavigate } from 'react-router-dom' import { login } from '@/api/usr' import { BizError } from '@/api/request' import { useAppDispatch, useAppSelector } from '@/store' import { loginSucceeded } from '@/store/auth' import { IconAntler, IconAvatar, IconLock } from '@/components/icons' import type { ErrorPayload } from '@/api/types' export default function Login() { const navigate = useNavigate() const dispatch = useAppDispatch() const existingToken = useAppSelector(s => s.auth.token) const [userName, setUserName] = useState('') const [password, setPassword] = useState('') const [version] = useState<'standard'>('standard') const [submitting, setSubmitting] = useState(false) const [error, setError] = useState('') useEffect(() => { if (existingToken) navigate('/', { replace: true }) }, [existingToken, navigate]) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!userName.trim() || !password) { setError('请输入用户名和密码') return } setError('') setSubmitting(true) try { const res = await login({ sUserName: userName.trim(), sPassword: password, sVersion: version }) dispatch(loginSucceeded({ token: res.accessToken, user: res.user })) navigate('/', { replace: true }) } catch (err) { if (err instanceof BizError) { if (err.code === 40101) setError('用户名或密码错误') else if (err.code === 40301) { const payload = err.payload as ErrorPayload | undefined const sec = payload?.cooldownSeconds setError(`账户已锁定,请 ${sec ? Math.ceil(sec / 60) + ' 分钟' : '稍后'}后重试`) } else if (err.code === 40010) setError(err.message || '请求参数无效') else setError(err.message || '登录失败') } else { setError('网络错误,请检查后端服务') } } finally { setSubmitting(false) } } return (
Antler ERP 欢迎登录EBC平台
Enterprise Business Capability
企业业务能力平台
ERP

用户登录

setUserName(e.target.value)} autoFocus />
setPassword(e.target.value)} />
{error}
🛠 ©Copyright Antler Software | 印刷智慧工厂 | 印刷MES | 印刷ERP | 印刷电商平台 | 文件智能处理 | 印前自动化 | 400-880-6237 沪ICP备14034791号-1
) }