docs: add home icp field follow-up PRD
This commit is contained in:
242
prd-home-icp-link-icp-url-followup.md
Normal file
242
prd-home-icp-link-icp-url-followup.md
Normal 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` 数据**
|
||||||
|
- **避免后台再次保存时无意丢失旧值**
|
||||||
|
|
||||||
|
这是一个典型的小修正,不应扩成大改动。
|
||||||
Reference in New Issue
Block a user