diff --git a/web/frontend/src/App.tsx b/web/frontend/src/App.tsx index 143c0a2..0ce93fa 100644 --- a/web/frontend/src/App.tsx +++ b/web/frontend/src/App.tsx @@ -1,10 +1,11 @@ import { lazy, Suspense, useState, useCallback, type ReactNode } from 'react'; import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'; -import { ConfigProvider, Spin, theme } from 'antd'; +import { App as AntdApp, ConfigProvider, Spin, theme } from 'antd'; import zhCN from 'antd/locale/zh_CN'; import { getUser } from './store/auth'; import { ThemeProvider } from './store/theme'; import { useTheme } from './store/useTheme'; +import AntdMessageBridge from './utils/AntdMessageBridge'; const LoginPage = lazy(() => import('./pages/LoginPage')); const MainLayout = lazy(() => import('./layouts/MainLayout')); @@ -51,34 +52,37 @@ function AppContent() { }, }} > - - - )} /> - ) - : - } - > - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - )} /> - - } /> - - + + + + + )} /> + ) + : + } + > + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + )} /> + + } /> + + + ); } diff --git a/web/frontend/src/layouts/MainLayout.tsx b/web/frontend/src/layouts/MainLayout.tsx index cb5e9d4..9572f36 100644 --- a/web/frontend/src/layouts/MainLayout.tsx +++ b/web/frontend/src/layouts/MainLayout.tsx @@ -193,7 +193,7 @@ export default function MainLayout({ onLogout }: { onLogout?: () => void }) { )} {collapsed ? ( <> - + ({ key: o.key, label: o.label, icon: o.icon, onClick: () => setMode(o.key) })) }} trigger={['click']} diff --git a/web/frontend/src/pages/AccountCheckPage.tsx b/web/frontend/src/pages/AccountCheckPage.tsx index 918f27e..9b0ce5c 100644 --- a/web/frontend/src/pages/AccountCheckPage.tsx +++ b/web/frontend/src/pages/AccountCheckPage.tsx @@ -1,7 +1,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { - Button, Card, Col, Input, InputNumber, message, Popconfirm, Row, Space, Statistic, Switch, Table, Tag, Typography, + Button, Card, Col, Input, InputNumber, Popconfirm, Row, Space, Statistic, Switch, Table, Tag, Typography, } from 'antd'; +import { message } from '../utils/antdMessage'; import type { TableProps } from 'antd'; import { DownloadOutlined, PlayCircleOutlined, ReloadOutlined, StopOutlined } from '@ant-design/icons'; import { accountCheckApi, type AccountCheckBatch, type AccountCheckItem } from '../api/modules'; @@ -163,7 +164,7 @@ export default function AccountCheckPage() { return () => window.clearInterval(timer); }, [batchId, isRunning, refreshBatch]); - const statusCounts = batch?.status_counts || {}; + const statusCounts = useMemo(() => batch?.status_counts || {}, [batch?.status_counts]); const categoryStats = useMemo(() => [ { title: '已注销', value: statusCounts.account_cancelled || 0 }, { title: '密码错误', value: statusCounts.password_wrong || 0 }, @@ -247,11 +248,11 @@ export default function AccountCheckPage() { ]; return ( - + 账号检测 - +