Files
ephron-ren-prd/prd-home-icp-link-icp-url-followup.md
2026-05-18 10:33:51 +08:00

243 lines
5.2 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.
# 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` 数据**
- **避免后台再次保存时无意丢失旧值**
这是一个典型的小修正,不应扩成大改动。