diff --git a/frontend/src/pages/login/LoginFooter.tsx b/frontend/src/pages/login/LoginFooter.tsx new file mode 100644 index 0000000..b82f2de --- /dev/null +++ b/frontend/src/pages/login/LoginFooter.tsx @@ -0,0 +1,9 @@ +export default function LoginFooter() { + return ( +
+ 🛠 ©Copyright Antler Software | 印刷智慧工厂 | 印刷MES | 印刷ERP | 印刷电商平台 | + 文件智能处理 | 印前自动化 | 400-880-6237 + 沪ICP备14034791号-1 +
+ ); +} diff --git a/frontend/src/pages/login/LoginForm.tsx b/frontend/src/pages/login/LoginForm.tsx new file mode 100644 index 0000000..b8c2347 --- /dev/null +++ b/frontend/src/pages/login/LoginForm.tsx @@ -0,0 +1,97 @@ +import { useEffect } from 'react'; +import { Form, Input, Select, Button, Alert } from 'antd'; +import type { LoginReq } from '../../api/auth'; +import { COMPANY_OPTIONS } from './loginConstants'; + +export interface LoginFormFieldErrors { + username?: string; + password?: string; + companyCode?: string; +} + +interface Props { + onSubmit: (req: LoginReq) => Promise; + loading: boolean; + errorMessage: string | null; + fieldErrors: LoginFormFieldErrors; +} + +export default function LoginForm({ onSubmit, loading, errorMessage, fieldErrors }: Props) { + const [form] = Form.useForm(); + + useEffect(() => { + // 字段级错误同步到 AntD Form 实例 + const errs: Array<{ name: keyof LoginFormFieldErrors; errors: string[] }> = []; + (['username', 'password', 'companyCode'] as const).forEach((k) => { + if (fieldErrors[k]) errs.push({ name: k, errors: [fieldErrors[k]!] }); + }); + if (errs.length > 0) { + form.setFields(errs as any); + } + }, [fieldErrors, form]); + + const handleFinish = async (values: LoginReq) => { + await onSubmit(values); + }; + + return ( +
+ {errorMessage && ( + + )} + + + + + + + + + + +