Files
bun-app-template/openspec/specs/admin-layout/spec.md
lanyuanxiaoyao 1e3269380e fix: 审查修补前端布局重构并归档 change
- 补实现 ProtectedRoute 空壳组件(预留接口,不启用认证逻辑)
- 修复页面组件内联 style 为 CSS 类,符合样式规范
- 补充 Sidebar 菜单项激活状态测试、404 按钮可点击测试
- 回写 admin-layout spec Header 页面标题 fallback 行为
- 同步 delta specs 至主规范(admin-layout、frontend-routing、app-constants)
- 归档 refactor-frontend-layout change
2026-05-24 22:28:17 +08:00

140 lines
4.1 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.
## Requirements
### Requirement: 企业 Admin 后台布局
系统 SHALL 实现 Header + 侧边栏 + 内容区的企业 Admin 后台布局,使用 TDesign Layout 组件。
#### Scenario: 布局结构
- **WHEN** 用户访问应用
- **THEN** 系统 SHALL 渲染包含 Header、Aside、Content 的 Layout 结构
#### Scenario: Layout 嵌套结构
- **WHEN** 布局渲染
- **THEN** 系统 SHALL 使用嵌套 Layout 结构:`Layout > (Header + Layout > (Aside + Content))`
### Requirement: Header 布局
Header SHALL 包含折叠按钮、页面标题、主题切换控件。
#### Scenario: Header 左侧折叠按钮
- **WHEN** Header 渲染
- **THEN** 系统 SHALL 在左侧显示侧边栏折叠/展开按钮
#### Scenario: Header 页面标题
- **WHEN** Header 渲染
- **THEN** 系统 SHALL 显示当前路由对应的页面标题(从 menu 获取)
- **AND** 若当前路由无匹配菜单项SHALL 显示 `APP.title` 作为 fallback
#### Scenario: Header 右侧主题切换
- **WHEN** Header 渲染
- **THEN** 系统 SHALL 在右侧显示主题切换 RadioGroup系统/明亮/黑暗)
### Requirement: 侧边栏菜单
系统 SHALL 提供侧边栏菜单组件Sidebar使用 TDesign Menu 组件,支持折叠/展开。
#### Scenario: 侧边栏渲染菜单项
- **WHEN** 侧边栏渲染
- **THEN** 系统 SHALL 根据 `menu.tsx` 渲染所有菜单项
#### Scenario: 菜单项点击导航
- **WHEN** 用户点击菜单项
- **THEN** 系统 SHALL 使用 React Router 的 `navigate` 跳转到对应路径
#### Scenario: 菜单项激活状态
- **WHEN** 当前路由与菜单项路径匹配
- **THEN** 系统 SHALL 高亮显示该菜单项
### Requirement: 侧边栏折叠
侧边栏 SHALL 支持折叠/展开,折叠状态持久化到 localStorage。
#### Scenario: 侧边栏折叠交互
- **WHEN** 用户点击 Header 左侧的折叠按钮
- **THEN** 系统 SHALL 切换侧边栏折叠状态
#### Scenario: 侧边栏折叠宽度
- **WHEN** 侧边栏折叠
- **THEN** Aside 宽度 SHALL 变为 80pxMenu 仅显示图标
#### Scenario: 侧边栏展开宽度
- **WHEN** 侧边栏展开
- **THEN** Aside 宽度 SHALL 变为 232pxMenu 显示图标和文字
#### Scenario: 折叠状态持久化
- **WHEN** 用户切换侧边栏折叠状态
- **THEN** 系统 SHALL 将状态存储到 localStorage key `"sidebar.collapsed"`
#### Scenario: 折叠状态恢复
- **WHEN** 应用初始化
- **THEN** 系统 SHALL 从 localStorage 读取 `"sidebar.collapsed"` 并恢复折叠状态
### Requirement: 侧边栏主题跟随全局
侧边栏 Menu 的主题 SHALL 跟随全局主题设置,不单独设置 `theme` prop。
#### Scenario: 侧边栏跟随全局主题
- **WHEN** 全局主题切换为 dark
- **THEN** 侧边栏 SHALL 自动应用 dark 主题样式
### Requirement: 菜单配置单一数据源
系统 SHALL 在 `src/web/menu.tsx` 定义菜单项配置,包含 `value``label``path``icon` 字段。
#### Scenario: 菜单配置类型安全
- **WHEN** 定义菜单配置
- **THEN** 系统 SHALL 使用 `as const` 保证字面量类型推断
#### Scenario: Sidebar 引用菜单配置
- **WHEN** Sidebar 渲染
- **THEN** 系统 SHALL 遍历 `MENU_ITEMS` 渲染 MenuItem
### Requirement: 示例页面
系统 SHALL 提供示例页面组件Dashboard、Users、Settings、NotFound。
#### Scenario: Dashboard 页面
- **WHEN** 用户访问 `/`
- **THEN** 系统 SHALL 渲染 Dashboard 页面(包含原 app.tsx 的欢迎语和 /health 展示)
#### Scenario: Users 页面占位
- **WHEN** 用户访问 `/users`
- **THEN** 系统 SHALL 渲染用户管理占位页面
#### Scenario: Settings 页面占位
- **WHEN** 用户访问 `/settings`
- **THEN** 系统 SHALL 渲染系统设置占位页面
#### Scenario: NotFound 页面
- **WHEN** 用户访问未定义路径
- **THEN** 系统 SHALL 渲染 404 页面,提供返回首页按钮
### Requirement: CSS 类名迁移
`.dashboard-*` CSS 类名 SHALL 变更为 `.app-*`
#### Scenario: 布局类名
- **WHEN** 样式应用
- **THEN** 系统 SHALL 使用 `.app-layout``.app-header``.app-content``.app-sidebar` 类名