diff --git a/.gitignore b/.gitignore index ffbda2b..c12c67c 100644 --- a/.gitignore +++ b/.gitignore @@ -36,5 +36,5 @@ dist-ssr *.py *.pyi WORKLOG.md -*openapi*.json +*open*.json response_*.json diff --git a/src/components/PageDispatcher.tsx b/src/components/PageDispatcher.tsx index 42cdc52..48780a7 100644 --- a/src/components/PageDispatcher.tsx +++ b/src/components/PageDispatcher.tsx @@ -21,7 +21,7 @@ import { Drawer, Modal } from 'antd'; import { EVENTS, off, on } from '@/utils/event-bus'; import { FloatingPanel } from '@/components/ui/FloatingPanel'; import { WechatWorkPage } from '@/pages/headers/WechatWorkPage'; -import { Test2 } from '@/pages/headers/Test2'; +import { AccountInfo } from '@/pages/headers/AccountInfo.tsx'; // ---------- 类型 ---------- @@ -73,7 +73,7 @@ const PAGE_MAP: Record = { '/wechat-work': { component: WechatWorkPage, label: '企业微信' }, '/compliance-assets': { label: '合规素材库' }, '/account': { - component: Test2, + component: AccountInfo, label: '账户', width: () => Math.min(window.innerWidth * 0.6, 720), height: () => Math.min(window.innerHeight * 0.6, 680), @@ -198,6 +198,7 @@ export function PageDispatcher() { width={panelWidth ?? defaultDrawerWidth} height={panelHeight} > + {/* eslint-disable-next-line react-hooks/static-components */} )} diff --git a/src/pages/headers/Test2.tsx b/src/pages/headers/AccountInfo.tsx similarity index 99% rename from src/pages/headers/Test2.tsx rename to src/pages/headers/AccountInfo.tsx index 68b9b4c..fc0e58e 100644 --- a/src/pages/headers/Test2.tsx +++ b/src/pages/headers/AccountInfo.tsx @@ -1,5 +1,5 @@ // ============================================================ -// Test2 — 账户信息展示 +// AccountInfo — 账户信息展示 // 数据来源:AuthAPI.getUserInfo() → GET /api/v1/auth/me // ============================================================ @@ -39,7 +39,7 @@ function formatDate(date: Date | string | undefined): string { return d.toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit' }); } -export function Test2() { +export function AccountInfo() { const { token } = antTheme.useToken(); const [userInfo, setUserInfo] = useState(null); const [loading, setLoading] = useState(true); diff --git a/src/pages/login/components/LoginForm.tsx b/src/pages/login/components/LoginForm.tsx index 4097294..c4c4208 100644 --- a/src/pages/login/components/LoginForm.tsx +++ b/src/pages/login/components/LoginForm.tsx @@ -4,7 +4,7 @@ import { useState, useCallback } from 'react'; import { Input, Button, Checkbox, Typography } from 'antd'; -import { UserOutlined, LockOutlined } from '@ant-design/icons'; +import { UserOutlined, LockOutlined, EyeTwoTone, EyeInvisibleOutlined } from '@ant-design/icons'; import { loginFields } from '../config/login-fields'; import { validateForm } from '../config/validators'; @@ -40,7 +40,7 @@ export function LoginForm({ const [password, setPassword] = useState(initialPassword || ''); const [remember, setRemember] = useState(initialRemember); const [autoLogin, setAutoLogin] = useState(initialAutoLogin); - const [agreed, setAgreed] = useState(false); + const [agreed, setAgreed] = useState(true); const [errors, setErrors] = useState>({}); // 协议弹窗 @@ -103,6 +103,8 @@ export function LoginForm({ setPassword(e.target.value); clearError('password'); }} + iconRender={(visible) => (visible ? : )} + onPressEnter={handleSubmit} status={errors.password ? 'error' : undefined} allowClear /> @@ -162,6 +164,11 @@ export function LoginForm({ setAgreed(e.target.checked); clearError('_agreement'); }} + onKeyDown={(event)=>{ + if (event.key === 'Enter' || event.keyCode === 13) { + setAgreed(!agreed); + } + }} className="text-xs" > 已阅读并同意 diff --git a/src/pages/login/components/RegisterForm.tsx b/src/pages/login/components/RegisterForm.tsx index 11d3cb6..50e4253 100644 --- a/src/pages/login/components/RegisterForm.tsx +++ b/src/pages/login/components/RegisterForm.tsx @@ -2,7 +2,7 @@ // RegisterForm — 注册表单(仅个人版) // ============================================================ -import { useState, useCallback, useRef } from 'react'; +import React, { useState, useCallback, useRef } from 'react'; import { Input, Button, Checkbox, Typography } from 'antd'; import { LegalTextModal } from '@/components/ui/LegalTextModal'; @@ -87,17 +87,16 @@ export function RegisterForm({ submitting = false, onSubmit, onSendSms }: Regist onSendSms?.(phone); }, [values.phone, onSendSms]); - // 跨字段校验 - const crossValidators = { - confirmPassword: (val: string) => { - if (!val) return '请再次输入密码'; - if (val !== values.password) return '两次密码不一致'; - return null; - }, - }; - // 提交 const handleSubmit = useCallback(() => { + // 跨字段校验(内联避免每次渲染创建新引用致使用 useCallback 失效) + const crossValidators = { + confirmPassword: (val: string) => { + if (!val) return '请再次输入密码'; + if (val !== values.password) return '两次密码不一致'; + return null; + }, + }; const fieldErrors = validateForm(values, registerFields, crossValidators); if (Object.keys(fieldErrors).length > 0) { setErrors(fieldErrors); @@ -208,6 +207,11 @@ export function RegisterForm({ submitting = false, onSubmit, onSendSms }: Regist return n; }); }} + onKeyDown={(e)=>{ + if(e.key==="Enter" || e.keyCode == 13) { + setAgreed(!agreed); + } + }} className="text-xs" > 已阅读并同意