docs: add home icp field follow-up PRD

This commit is contained in:
Ubuntu
2026-05-18 10:33:51 +08:00
parent 1ad8ba6977
commit e86f0113bd

View File

@@ -0,0 +1,242 @@
# Follow-up PRD统一 Home 内容中的 `icp_link` / `icp_url` 字段命名
## 背景
在验收 `home` 页新增 GitHub 按钮功能时,发现 Home 内容示例数据与当前服务 schema 之间仍存在一个遗留字段漂移问题:
- `home/data/home_content.json` 中使用的是:`footer.icp_link`
- 但当前 Home 服务代码和后台表单使用的是:`footer.icp_url`
这不是本次 GitHub 功能的阻塞项,但属于会持续制造误导的命名不一致,应尽快收敛。
---
## 问题定义
当前 Home 内容相关实现中ICP 链接字段存在双命名:
### 示例数据
`home/data/home_content.json`
```json
"footer": {
"copyright": "...",
"icp": "...",
"icp_link": "https://beian.miit.gov.cn/"
}
```
### 当前代码 / 后台使用
- `home/src/services/content.py`
- `home/templates/admin/index.html`
- 后台 `collectFormData()`
这些位置使用的是:
```python
footer["icp_url"]
```
或:
```js
icp_url: document.getElementById('footer_icp_url').value
```
---
## 风险
这个问题当前风险不高,但会带来以下长期问题:
1. **示例数据误导**
- 后续维护者会误以为正式字段名是 `icp_link`
2. **手工编辑数据容易写错**
- 如果有人参考 `home_content.json` 或旧数据手工写入 JSON可能继续写 `icp_link`
- 结果后台和前台读取不到,表现为备案链接丢失
3. **schema 漂移扩大**
- 如果不收敛,后续可能继续出现:
- 模板用一套名
- 示例数据一套名
- 测试再补一套名
4. **增加兼容负担**
- 当前是小问题,越晚统一,越容易变成必须长期兼容两套字段
---
## 目标
统一 Home 内容中 ICP 备案链接字段命名,明确唯一正式字段为:
```json
footer.icp_url
```
并确保:
- 示例数据一致
- 服务层兼容旧字段
- 后台编辑读写一致
- 前台渲染一致
---
## 建议方案
## 一、正式字段名定为 `icp_url`
理由:
- 当前服务层默认 schema 已经使用 `icp_url`
- 后台表单和 `collectFormData()` 也已经使用 `icp_url`
- 继续沿用现代码主线改动最小
因此本次 follow-up 不建议反向改回 `icp_link`
---
## 二、修正示例数据文件
### 必改文件
- `home/data/home_content.json`
### 修改内容
将:
```json
"icp_link": "https://beian.miit.gov.cn/"
```
改为:
```json
"icp_url": "https://beian.miit.gov.cn/"
```
### 目的
让示例数据与实际 schema 对齐,避免继续误导维护者。
---
## 三、服务层补旧字段兼容迁移
### 必改文件
- `home/src/services/content.py`
### 现状
当前 `_normalize_content()` 已补:
- `footer.icp_url`
- `footer.beian_url`
但若旧数据里已有:
```json
"footer": {
"icp_link": "https://..."
}
```
而没有 `icp_url`,那么当前 normalize 若只 `setdefault("icp_url", "")`,会导致:
- 旧值不会自动迁移到 `icp_url`
- 后台打开后看起来像空值
- 再次保存时会把旧字段信息“洗掉”
### 建议兼容逻辑
`_normalize_content()` 中增加迁移规则:
```python
footer = content.setdefault("footer", {})
legacy_icp_link = footer.get("icp_link")
if not footer.get("icp_url") and legacy_icp_link:
footer["icp_url"] = legacy_icp_link
footer.setdefault("icp_url", "")
```
### 是否删除旧字段
本次建议:
- **运行时兼容旧字段即可**
- 不要求在 normalize 时强制删除 `icp_link`
原因:
- 当前目标是安全兼容,不是激进清洗
- 避免无必要扩大改动面
---
## 四、测试补充
### 建议新增测试
在 Home 相关测试中增加一个兼容场景:
#### 用例
当旧内容使用:
```json
"footer": {
"icp": "...",
"icp_link": "https://beian.miit.gov.cn/"
}
```
而没有 `icp_url` 时:
- 服务层应自动补出 `icp_url`
- 后台渲染时 `footer_icp_url` 输入框应能看到该值
- 不应丢失原备案链接
### 目标
避免未来再次改坏这个兼容逻辑。
---
## 修改范围
### 必改
1. `home/data/home_content.json`
- `icp_link``icp_url`
2. `home/src/services/content.py`
- `_normalize_content()` 增加旧字段兼容迁移逻辑
### 建议补充
3. `home/tests/...`
- 新增 `icp_link``icp_url` 兼容测试
---
## 验收标准
### 数据一致性
1. `home/data/home_content.json` 中不再出现 `icp_link`
2. 示例数据统一使用 `icp_url`
### 兼容性
1. 若历史内容只有 `footer.icp_link`,页面仍可正常读取备案链接
2. 后台打开旧内容时ICP 链接输入框能正确回显
3. 保存草稿 / 发布后,不会因为字段名变化丢失备案链接
### 回归安全
1. 现有使用 `icp_url` 的内容不受影响
2. GitHub 按钮相关改动不受影响
---
## 非目标
本次 follow-up 不处理:
- `beian_link` / `beian_url` 是否也存在历史漂移(除非源码已确认存在)
- Footer 区块整体重构
- Home 内容 schema 的全面版本化
---
## 结论
这是一个低优先级但值得尽快收口的 schema 一致性问题。
本次 follow-up 应聚焦:
- **统一命名为 `icp_url`**
- **兼容历史 `icp_link` 数据**
- **避免后台再次保存时无意丢失旧值**
这是一个典型的小修正,不应扩成大改动。