|
| 1 | +## ADDED Requirements |
| 2 | + |
| 3 | +### Requirement: HTML Meta 标签配置 |
| 4 | + |
| 5 | +系统 SHALL 为所有页面提供完整的 HTML meta 标签配置,包括标题、描述、关键词等基础 SEO 元素。 |
| 6 | + |
| 7 | +#### Scenario: 基础 meta 标签渲染 |
| 8 | +- **WHEN** 用户访问站点任何页面 |
| 9 | +- **THEN** 页面 head 中包含正确的 charset 标签 |
| 10 | +- **AND** 包含 viewport 标签用于响应式设计 |
| 11 | +- **AND** 包含 X-UA-Compatible 标签确保 IE 兼容性 |
| 12 | + |
| 13 | +#### Scenario: 页面标题和描述 |
| 14 | +- **WHEN** 用户访问站点主页 |
| 15 | +- **THEN** 页面 title 标签显示 "Hagicode Docker Compose Builder" |
| 16 | +- **AND** meta description 标签提供站点功能摘要 |
| 17 | +- **AND** meta keywords 标签包含核心关键词(docker, compose, generator, hagicode) |
| 18 | + |
| 19 | +#### Scenario: Canonical URL |
| 20 | +- **WHEN** 页面加载完成 |
| 21 | +- **THEN** head 中包含 canonical link 标签 |
| 22 | +- **AND** canonical URL 指向当前页面的规范 URL |
| 23 | + |
| 24 | +### Requirement: Open Graph 协议支持 |
| 25 | + |
| 26 | +系统 SHALL 实现 Open Graph 协议标签,确保站点链接在社交媒体平台正确展示。 |
| 27 | + |
| 28 | +#### Scenario: Open Graph 基础标签 |
| 29 | +- **WHEN** 页面加载完成 |
| 30 | +- **THEN** head 中包含 og:title 标签,值为页面标题 |
| 31 | +- **AND** 包含 og:description 标签,值为页面描述 |
| 32 | +- **AND** 包含 og:type 标签,值为 "website" |
| 33 | +- **AND** 包含 og:url 标签,值为当前页面 URL |
| 34 | + |
| 35 | +#### Scenario: Open Graph 图片 |
| 36 | +- **WHEN** 页面加载完成 |
| 37 | +- **THEN** head 中包含 og:image 标签 |
| 38 | +- **AND** og:image 指向站点的默认分享图片 |
| 39 | +- **AND** 包含 og:image:alt 标签提供图片描述 |
| 40 | + |
| 41 | +#### Scenario: 站点名称 |
| 42 | +- **WHEN** 页面加载完成 |
| 43 | +- **THEN** head 中包含 og:site_name 标签 |
| 44 | +- **AND** 值为 "Hagicode Docker Compose Builder" |
| 45 | + |
| 46 | +### Requirement: Twitter Card 支持 |
| 47 | + |
| 48 | +系统 SHALL 配置 Twitter Card 标签,优化在 Twitter 平台的分享体验。 |
| 49 | + |
| 50 | +#### Scenario: Twitter Card 基础标签 |
| 51 | +- **WHEN** 页面加载完成 |
| 52 | +- **THEN** head 中包含 twitter:card 标签,值为 "summary_large_image" |
| 53 | +- **AND** 包含 twitter:site 标签指向站点 Twitter 账号(如有) |
| 54 | +- **AND** 包含 twitter:creator 标签(如有) |
| 55 | + |
| 56 | +#### Scenario: Twitter Card 内容 |
| 57 | +- **WHEN** 页面加载完成 |
| 58 | +- **THEN** head 中包含 twitter:title 标签 |
| 59 | +- **AND** 包含 twitter:description 标签 |
| 60 | +- **AND** 包含 twitter:image 标签 |
| 61 | +- **AND** 所有标签值与 Open Graph 标签保持一致 |
| 62 | + |
| 63 | +### Requirement: 搜索引擎指引 |
| 64 | + |
| 65 | +系统 SHALL 提供 robots.txt 和 sitemap.xml 文件,明确搜索引擎爬虫的访问规则和站点结构。 |
| 66 | + |
| 67 | +#### Scenario: robots.txt 文件 |
| 68 | +- **WHEN** 搜索引擎爬虫访问 /robots.txt |
| 69 | +- **THEN** 返回有效的 robots.txt 文件 |
| 70 | +- **AND** 允许所有爬虫访问站点(User-agent: * Allow: /) |
| 71 | +- **AND** 包含 sitemap.xml 的引用 |
| 72 | + |
| 73 | +#### Scenario: sitemap.xml 文件 |
| 74 | +- **WHEN** 搜索引擎爬虫访问 /sitemap.xml |
| 75 | +- **THEN** 返回有效的 sitemap.xml 文件 |
| 76 | +- **AND** 包含站点主页 URL |
| 77 | +- **AND** 包含每个页面的 lastmod 时间戳 |
| 78 | +- **AND** 包含每个页面的 priority 优先级 |
| 79 | + |
| 80 | +#### Scenario: Sitemap 自动更新 |
| 81 | +- **WHEN** 执行生产构建 |
| 82 | +- **THEN** 系统自动生成或更新 sitemap.xml |
| 83 | +- **AND** sitemap.xml 包含最新的页面列表 |
| 84 | +- **AND** 文件放置在 dist 目录根目录 |
| 85 | + |
| 86 | +### Requirement: Schema.org 结构化数据 |
| 87 | + |
| 88 | +系统 SHALL 通过 JSON-LD 格式提供 Schema.org 结构化数据,帮助搜索引擎理解站点内容。 |
| 89 | + |
| 90 | +#### Scenario: WebApplication 结构化数据 |
| 91 | +- **WHEN** 页面加载完成 |
| 92 | +- **THEN** head 中包含 @type 为 "WebApplication" 的 JSON-LD |
| 93 | +- **AND** 包含应用名称 "Hagicode Docker Compose Builder" |
| 94 | +- **AND** 包含应用描述 |
| 95 | +- **AND** 包含应用 URL |
| 96 | +- **AND** 包含应用类别("UtilitiesApplication", "DeveloperApplication") |
| 97 | + |
| 98 | +#### Scenario: SoftwareApplication 结构化数据 |
| 99 | +- **WHEN** 页面加载完成 |
| 100 | +- **THEN** head 中包含 @type 为 "SoftwareApplication" 的 JSON-LD |
| 101 | +- **AND** 包含应用名称和描述 |
| 102 | +- **AND** 包含操作系统要求("Web Browser") |
| 103 | +- **AND** 包含应用许可("MIT") |
| 104 | +- **AND** 包含应用评分或评价(如有) |
| 105 | + |
| 106 | +#### Scenario: Organization 结构化数据 |
| 107 | +- **WHEN** 页面加载完成 |
| 108 | +- **THEN** head 中包含 @type 为 "Organization" 的 JSON-LD |
| 109 | +- **AND** 包含组织名称 "Hagicode" |
| 110 | +- **AND** 包含组织 URL |
| 111 | +- **AND** 包含 logo URL(如有) |
| 112 | + |
| 113 | +### Requirement: 多语言 SEO 支持 |
| 114 | + |
| 115 | +系统 SHALL 支持多语言环境下的 SEO 配置,包括 hreflang 标签和本地化的 meta 标签内容。 |
| 116 | + |
| 117 | +#### Scenario: hreflang 标签 |
| 118 | +- **WHEN** 页面加载完成 |
| 119 | +- **THEN** head 中包含每个支持语言的 hreflang 标签 |
| 120 | +- **AND** hreflang 标签指向对应语言的 URL |
| 121 | +- **AND** 包含 x-default 标签指向默认语言版本 |
| 122 | + |
| 123 | +#### Scenario: 多语言 meta 内容 |
| 124 | +- **WHEN** 用户切换语言 |
| 125 | +- **THEN** 页面 title 更新为当前语言版本 |
| 126 | +- **AND** meta description 更新为当前语言版本 |
| 127 | +- **AND** og:title 和 og:description 同步更新 |
| 128 | +- **AND** Twitter Card 标签同步更新 |
| 129 | + |
| 130 | +#### Scenario: lang 属性 |
| 131 | +- **WHEN** 用户切换语言 |
| 132 | +- **THEN** html 标签的 lang 属性更新为当前语言代码 |
| 133 | +- **AND** 值为有效的 BCP 47 语言标签(如 "en", "zh-CN") |
| 134 | + |
| 135 | +### Requirement: SEO 配置参数化 |
| 136 | + |
| 137 | +系统 SHALL 提供可配置的 SEO 设置,支持站点级默认配置和页面级覆盖。 |
| 138 | + |
| 139 | +#### Scenario: 站点级默认配置 |
| 140 | +- **WHEN** 应用初始化 |
| 141 | +- **THEN** 从配置文件加载站点级 SEO 默认配置 |
| 142 | +- **AND** 默认配置包括站点名称、描述、关键词、图片等 |
| 143 | +- **AND** 默认配置应用于所有页面 |
| 144 | + |
| 145 | +#### Scenario: 页面级覆盖 |
| 146 | +- **WHEN** 需要为特定页面定制 SEO 标签 |
| 147 | +- **THEN** 支持在页面组件中定义页面级 SEO 配置 |
| 148 | +- **AND** 页面级配置优先级高于站点级默认配置 |
| 149 | +- **AND** 仅覆盖指定的字段,其他字段使用默认值 |
| 150 | + |
| 151 | +#### Scenario: SEO 配置更新 |
| 152 | +- **WHEN** 通过编程方式调用 SEO 工具函数 |
| 153 | +- **THEN** 工具函数动态更新页面的 meta 标签 |
| 154 | +- **AND** 更新包括 title, description, og 标签, twitter 标签等 |
| 155 | +- **AND** 更新立即生效,无需重新加载页面 |
| 156 | + |
| 157 | +### Requirement: SEO 验证工具支持 |
| 158 | + |
| 159 | +系统 SHALL 生成的 SEO 标签和结构化数据应符合主流验证工具的标准。 |
| 160 | + |
| 161 | +#### Scenario: Lighthouse SEO 分数 |
| 162 | +- **WHEN** 使用 Google Lighthouse 测试站点 |
| 163 | +- **THEN** SEO 分数达到 90 分以上 |
| 164 | +- **AND** 所有基础 SEO 检查通过 |
| 165 | +- **AND** 无阻塞 SEO 的问题 |
| 166 | + |
| 167 | +#### Scenario: 社交媒体调试器 |
| 168 | +- **WHEN** 使用 Facebook Sharing Debugger 测试 |
| 169 | +- **THEN** 所有 Open Graph 标签正确解析 |
| 170 | +- **AND** 预览图片正确显示 |
| 171 | +- **WHEN** 使用 Twitter Card Validator 测试 |
| 172 | +- **THEN** 所有 Twitter Card 标签正确解析 |
| 173 | +- **AND** Card 预览正确显示 |
| 174 | + |
| 175 | +#### Scenario: 结构化数据验证 |
| 176 | +- **WHEN** 使用 Google Rich Results Test 测试 |
| 177 | +- **THEN** 所有 JSON-LD 结构化数据有效 |
| 178 | +- **AND** 无语法错误或警告 |
| 179 | +- **AND** 至少检测到一种富媒体结果类型(WebApplication 或 SoftwareApplication) |
0 commit comments