- 补实现 ProtectedRoute 空壳组件(预留接口,不启用认证逻辑) - 修复页面组件内联 style 为 CSS 类,符合样式规范 - 补充 Sidebar 菜单项激活状态测试、404 按钮可点击测试 - 回写 admin-layout spec Header 页面标题 fallback 行为 - 同步 delta specs 至主规范(admin-layout、frontend-routing、app-constants) - 归档 refactor-frontend-layout change
2.6 KiB
2.6 KiB
Purpose
定义应用全局常量,作为应用元信息(name、title、subtitle、description、version)的唯一真实来源,供前后端及构建脚本统一引用,消除硬编码散落。
Requirements
Requirement: 应用元信息唯一来源
系统 SHALL 在 src/shared/app.ts 中定义应用全局常量 APP,包含以下字段:
name:机器标识(kebab-case 格式)title:人类可读标题subtitle:副标题description:应用描述(用于 SEO meta)version:语义版本号
APP SHALL 使用 as const 声明,保证字面量类型推断。
Scenario: 后端引用应用名称
- WHEN 后端代码需要应用名称(如 CLI 帮助文本、health 响应、启动日志)
- THEN 系统 SHALL 从
src/shared/app.ts导入APP.name
Scenario: 前端引用应用标题
- WHEN 前端代码需要应用标题(如 Header logo、欢迎文本)
- THEN 系统 SHALL 从
src/shared/app.ts导入APP.title
Scenario: 构建脚本引用应用名称
- WHEN 构建脚本需要确定可执行文件名
- THEN 系统 SHALL 从
src/shared/app.ts导入APP.name
Requirement: 前端 HTML 元信息动态设置
系统 SHALL 在 React 应用挂载时动态设置 HTML 元信息:
document.titleSHALL 设置为APP.title<meta name="description">内容 SHALL 设置为APP.description
Scenario: 页面标题显示应用名称
- WHEN 用户访问应用
- THEN 浏览器标签页标题 SHALL 显示
APP.title
Scenario: meta description 设置
- WHEN 搜索引擎爬取页面
- THEN meta description SHALL 包含
APP.description
Requirement: localStorage key 语义化命名
主题偏好存储 key SHALL 为 "theme.preference",不包含应用名前缀。
Scenario: 主题偏好持久化
- WHEN 用户选择主题偏好(system/light/dark)
- THEN 系统 SHALL 将偏好值存储到 localStorage key
"theme.preference"
Scenario: 主题偏好读取
- WHEN 应用初始化时读取用户主题偏好
- THEN 系统 SHALL 从 localStorage key
"theme.preference"读取
Requirement: 侧边栏折叠状态 localStorage key
侧边栏折叠状态存储 key SHALL 为 "sidebar.collapsed",不包含应用名前缀。
Scenario: 折叠状态持久化
- WHEN 用户切换侧边栏折叠状态
- THEN 系统 SHALL 将状态存储到 localStorage key
"sidebar.collapsed"
Scenario: 折叠状态读取
- WHEN 应用初始化时读取侧边栏折叠状态
- THEN 系统 SHALL 从 localStorage key
"sidebar.collapsed"读取