1
0

feat: 完成前端重构,采用 Ant Design 5 和完整测试体系

- 采用 Ant Design 5 作为 UI 组件库,替换自定义组件
- 集成 React Router v7 提供路由导航
- 使用 TanStack Query v5 管理数据获取和缓存
- 建立 Vitest + React Testing Library 测试体系
- 添加 Playwright E2E 测试覆盖
- 使用 MSW mock API 响应
- 配置 TypeScript strict 模式
- 采用 SCSS Modules 组织样式
- 更新 OpenSpec 规格以反映前端架构变更
- 归档 frontend-refactor 变更记录
This commit is contained in:
2026-04-16 11:21:48 +08:00
parent c17903dcbc
commit 9359ca7f62
61 changed files with 4588 additions and 1095 deletions

View File

@@ -1,36 +1,24 @@
import { useState } from 'react';
import { ProvidersPage } from './pages/ProvidersPage';
import { StatsPage } from './pages/StatsPage';
import './App.css';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { BrowserRouter } from 'react-router';
import { AppRoutes } from '@/routes';
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 30_000,
retry: 1,
refetchOnWindowFocus: false,
},
},
});
function App() {
const [currentPage, setCurrentPage] = useState<'providers' | 'stats'>('providers');
return (
<div className="app">
<nav className="navbar">
<h1>AI Gateway</h1>
<div className="nav-links">
<button
className={currentPage === 'providers' ? 'active' : ''}
onClick={() => setCurrentPage('providers')}
>
</button>
<button
className={currentPage === 'stats' ? 'active' : ''}
onClick={() => setCurrentPage('stats')}
>
</button>
</div>
</nav>
<main className="content">
{currentPage === 'providers' && <ProvidersPage />}
{currentPage === 'stats' && <StatsPage />}
</main>
</div>
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<AppRoutes />
</BrowserRouter>
</QueryClientProvider>
);
}