feat: 重构前端为企业 Admin 后台布局,引入 React Router 路由

- 引入 React Router v7 (Declarative mode) 实现 SPA 路由
- 重构 Layout 为 Header + 侧边栏 + 内容区的企业 Admin 布局
- 新增侧边栏菜单组件,支持折叠/展开,状态持久化到 localStorage
- 新增示例页面:仪表盘、用户管理、系统设置、404
- 菜单配置与路由统一为单一数据源 (menu.tsx)
- Vite code splitting 新增 vendor-router 组
- 更新 DEVELOPMENT.md 和 README.md 文档
This commit is contained in:
2026-05-20 19:06:14 +08:00
parent 5aed73523e
commit 4caf502908
32 changed files with 981 additions and 140 deletions

View File

@@ -37,16 +37,31 @@ src/
app.ts 应用全局常量name、title、subtitle、description、version
web/ React 前端(通过 Vite 构建)
index.html HTML 入口
app.tsx 根组件(Layout + Header + Content/health 联调示例展示
main.tsx 入口QueryClient 挂载 + ErrorBoundary + ReactQueryDevtools + TDesign CSS 导入)
app.tsx 根组件(Admin 布局Header + Sidebar + Content
main.tsx 入口(BrowserRouter + QueryClient 挂载 + ErrorBoundary + ReactQueryDevtools + TDesign CSS 导入)
routes.tsx 路由配置(定义所有页面路由)
styles.css 全局样式与自定义 CSS 变量
css.d.ts CSS 模块类型声明
pages/ 页面组件
dashboard/
index.tsx 仪表盘页(欢迎语 + /health 联调示例)
users/
index.tsx 用户管理页(占位)
settings/
index.tsx 系统设置页(占位)
404/
index.tsx 404 页面
components/ UI 组件
ErrorBoundary.tsx React 错误边界,捕获渲染异常并展示降级 UI
Sidebar/
index.tsx 侧边栏菜单组件TDesign Menu + 折叠控制)
hooks/ React hooks
use-theme-preference.ts 主题偏好 hooksystem/light/darklocalStorage 记忆 + matchMedia 监听)
use-sidebar-collapsed.ts 侧边栏折叠状态 hooklocalStorage 记忆)
utils/ 前端工具函数
time.ts 时间处理formatCountdown、formatDurationUnit、formatRelativeTime、isOlderThan、subtractHours
menu.tsx 菜单配置(路由与菜单项统一数据源)
routes.tsx 路由配置(定义所有页面路由)
scripts/
dev.ts 双进程开发服务Bun API server + Vite dev server
build.ts Vite → codegen → Bun compile 三步构建流水线
@@ -211,9 +226,9 @@ server:
| 语言 | TypeScript | 类型安全 |
| UI 库 | TDesign React + tdesign-icons-react | UI 组件与图标 |
| 数据层 | TanStack Query (React Query) + React Query Devtools | 服务端状态管理与自动刷新 |
| 路由 | 无(单页面应用) | 不引入 React Router |
| 路由 | React Router v7 (Declarative mode) | SPA 路由与页面导航 |
**不引入的依赖**React Router单页面场景不需要状态管理库TanStack Query 即服务端状态层,组件内用 `useState` 足够)
**不引入的依赖**状态管理库TanStack Query 即服务端状态层,组件内用 `useState` 足够)
### 2.2 组件树与数据流
@@ -222,11 +237,22 @@ main.tsx
└── StrictMode
└── ErrorBoundaryReact 错误边界)
└── QueryClientProviderTanStack Query 全局挂载)
── App根组件Layout + Header + Content 骨架
├── useThemePreference() ── Header 主题模式 RadioGroup系统/明亮/黑暗localStorage 记忆 + theme-mode 应用
│ ├── useQuery["health"] ── GET /health30s 轮询,前后端联调示例
── Content ── 欢迎页 + /health API 响应 JSON 展示
└── ReactQueryDevtools开发工具仅开发环境
── BrowserRouterReact Router 路由
├── App根组件Admin 布局
│ ├── useThemePreference() ── Header 主题模式 RadioGroup系统/明亮/黑暗
── useSidebarCollapsed() ── 侧边栏折叠状态localStorage 记忆)
│ ├── Layout
│ │ ├── Header折叠按钮 + 品牌名 + 页标题 + 主题切换)
│ │ └── Layout嵌套
│ │ ├── Aside
│ │ │ └── SidebarTDesign Menu菜单项点击导航
│ │ └── Content
│ │ └── AppRoutes路由配置
│ │ ├── / → DashboardPage欢迎语 + /health 联调)
│ │ ├── /users → UsersPage占位
│ │ ├── /settings → SettingsPage占位
│ │ └── * → NotFoundPage404
└── ReactQueryDevtools开发工具仅开发环境
```
**Hook 架构**
@@ -237,6 +263,22 @@ hooks/use-theme-preference.ts浏览器 UI 偏好)
├── EffectiveTheme: light / dark写入 document.documentElement theme-mode
├── localStorage key: theme.preference同一浏览器记忆
└── matchMedia("(prefers-color-scheme: dark)")(系统模式下跟随系统明暗变化)
hooks/use-sidebar-collapsed.ts侧边栏折叠状态
├── collapsed: boolean折叠状态
├── localStorage key: sidebar.collapsed同一浏览器记忆
└── toggleCollapsed()(切换折叠状态)
```
**菜单配置**
```
utils/menu-config.ts路由与菜单统一数据源
├── MENU_ITEMS: MenuItemConfig[](菜单项配置数组)
│ ├── { value: "dashboard", label: "仪表盘", path: "/", icon: <DashboardIcon /> }
│ ├── { value: "users", label: "用户管理", path: "/users", icon: <UserIcon /> }
│ └── { value: "settings", label: "系统设置", path: "/settings", icon: <SettingIcon /> }
└── Sidebar 和 Routes 共同引用,保证菜单项与路由同步
```
### 2.3 TanStack Query 数据层