Files
bun-app-template/openspec/changes/refactor-frontend-layout/design.md
lanyuanxiaoyao 4caf502908 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 文档
2026-05-20 19:06:14 +08:00

96 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## Context
当前前端为单页面应用,`app.tsx` 直接渲染 Header + Content无路由、无侧边栏。技术栈为 React 19 + TDesign React + TanStack Query + Vite。后端使用 Bun.serve已支持 SPA fallback无扩展名路径返回 index.html
目标:重构为经典企业 Admin 后台布局,引入路由,支持多页面导航。
约束:
- 前端样式开发优先使用 TDesign 组件和 CSS tokens禁止内联 style、硬编码色值
- 新增代码需编写完善测试
- 后端无需改动
## Goals / Non-Goals
**Goals:**
- 引入 React Router v7 (Declarative mode) 实现 SPA 路由
- 实现企业 Admin 后台布局Header + 侧边栏 + 内容区
- 侧边栏支持折叠/展开,状态持久化到 localStorage
- 路由定义与菜单配置统一为单一数据源
- 提供示例页面仪表盘、用户管理、系统设置、404
**Non-Goals:**
- 不实现路由守卫/权限控制(预留接口但不启用)
- 不实现懒加载(页面少,暂不需要)
- 不实现面包屑导航
- 不实现用户认证
## Decisions
### 1. 路由方案React Router v7 Declarative mode
**选择**`react-router` v7使用 Declarative mode`BrowserRouter` + `Routes` + `Route`
**理由**
- v7 统一了 `react-router``react-router-dom`,单包导入
- Declarative mode 满足当前需求,无需 framework mode 的文件系统路由
- 社区成熟,文档完善
**替代方案**
- TanStack Router类型安全强但较新、API 变动风险
- 自实现:零依赖但功能有限,扩展成本高
### 2. Routes 定义位置:独立文件
**选择**:抽离为 `src/web/routes.tsx``app.tsx` 引用
**理由**
- 路由增删时改动范围小,不污染 app.tsx
- 便于后续扩展路由守卫、懒加载
### 3. 侧边栏折叠按钮位置Header 左侧
**选择**:折叠按钮放在 Header 左侧Sidebar 不使用 Menu 的 operations prop
**理由**
- Sidebar 折叠变窄后,底部按钮变小且易被忽略
- Header 上的按钮始终可见且易触达
- 符合 Ant Design Pro 等主流企业后台习惯
### 4. 页面标题来源:复用 menu label
**选择**Header 页面标题直接使用 `menu.tsx` 中的 `label` 字段
**理由**
- 简单直接,侧边栏标签即页面标题
- 如需差异化,后续加 `title` 字段即可
### 5. Layout 嵌套:保留嵌套结构
**选择**`Layout > (Header + Layout > (Aside + Content))`
**理由**
- 为 Footer 预留位置,将来加 Footer 无需重构
- 符合 TDesign 官方组合导航布局示例
### 6. Vite code splittingreact-router 单独分组
**选择**:新增 `vendor-router` 组,包含 `react-router`
**理由**
- 路由库独立于 React 核心,更新节奏不同
- 便于缓存隔离
### 7. 菜单与路由数据源menu.tsx
**选择**`src/web/menu.tsx` 定义菜单项配置Sidebar 和 Routes 共同引用
**理由**
- 单一数据源,保证菜单项和路由同步
- 便于类型安全(`as const`
## Risks / Trade-offs
- **路由与菜单配置一致性**:需人工保证 `menu.tsx``routes.tsx` 中 Route 定义一致 → 测试覆盖路由跳转和菜单点击
- **CSS 类名迁移影响**`.dashboard-*``.app-*` 可能影响测试选择器 → 全局搜索确认影响范围,更新测试
- **React Router v7 新版本风险**v7 较新,可能存在未发现的 bug → 使用成熟 APIBrowserRouter/Routes/Route避免实验性特性