Files
crawler-plugin/docs/specs/09-public-version-compatibility.md
T
huangzd1997 8803e22f39 feat(version): 桌面端更新面板支持指定版本安装
- 新增公开接口 GET /api/version/list(最近 50 条,字段口径同管理端列表),
  桌面端下拉不再拼 OSS 地址(版本包被删后拼地址会 404)
- 更新面板(登录页 + 首页)加「指定版本更新」选择器:默认选中最新版,
  可选全部已发布版本(含回退),回退/同版给出明确文案与二次确认
- 客户端无需发版:do_update_app(file_url) 本就接受任意版本包直链
2026-09-14 11:05:30 +08:00

90 lines
3.8 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.
# 09 客户端公开版本接口兼容
## 模块职责
把 Flask 版本蓝图中的公开客户端版本查询能力迁移到 Java,确保已发布客户端无需升级即可继续检查更新和下载新版本。
本模块只覆盖公开版本查询,不覆盖后台软件版本管理页面;后台页面见 `07-records-and-version.md`
## 依赖关系
原实现:
- `backend/blueprints/version.py:api_version`
- `backend/blueprints/version.py:api_version_latest`
- `backend/utils/db.py``web_config` 表初始化/访问
目标实现:
- `backend-java/.../softwareversion/controller/PublicVersionController.java:currentVersion`
- `backend-java/.../softwareversion/controller/PublicVersionController.java:latestVersion`
- `backend-java/.../softwareversion/service/SoftwareVersionService.java:latestSoftwareVersion`
- `SoftwareVersionMapper``SoftwareVersionEntity`
## 核心接口:原实现 → 目标实现
### GET `/api/version`
原响应:
- `version`:当前服务版本,默认值与旧服务一致。
- `desc`:当前为空字符串。
- `url`:旧环境配置的更新 URL,当前保持空字符串/配置值语义。
目标:Java 直接提供同路径和同字段,不包装成通用 `ApiResponse`,避免改变客户端解析。
### GET `/api/version/latest`
原逻辑:
-`web_config` 读取 `version``file_url`
-`created_at DESC` 取第一条。
- 无记录返回 `version=null,file_url=null`
目标逻辑:Java `SoftwareVersionService.latestSoftwareVersion` 使用同一张表和同一次序规则。
### GET `/api/version/list`2026-09-14 新增,非旧接口)
桌面端更新面板「指定版本更新」下拉的数据源:该功能允许用户显式安装某个历史版本(含回退),
列表由服务端给全,前端不拼 OSS 地址(拼地址在版本被删除后会 404)。
- 匿名可达(与 `/latest` 同族,未登录也能用;登录页更新面板即匿名态)。
-`created_at DESC, id DESC` 返回最近 `PublicVersionLookup.DEFAULT_LIST_LIMIT`50)条,
上限 `MAX_LIST_LIMIT`200);不作为则沿用旧 `version/file_url` 字段名。
- 响应 `{"items":[{"id","version","file_url","created_at"}]}`,字段口径与管理端
`/api/admin/versions` 一致(同一套前端解析);空表返回 `{"items":[]}`
- 同一版本的重复上传记录由前端按版本号去重(保留最新一条),后端不做折叠。
## 内部结构
```text
PublicVersionController
├── currentVersion()
│ └── 应用版本配置
├── latestVersion()
│ └── SoftwareVersionService.latestSoftwareVersion()
│ └── SoftwareVersionMapper → web_config
└── listVersions()
└── SoftwareVersionService.listPublicSoftwareVersions()
└── SoftwareVersionMapper → web_configLIMIT,字段口径同管理端列表)
```
## 类型映射
| 旧字段 | 目标字段 | 约束 |
|---|---|---|
| `version` | `version` | 字符串,不自动转数字 |
| `desc` | `desc` | 保留字段,即使为空 |
| `url` | `url` | 保留字段,即使为空 |
| `file_url` | `file_url` | 不改名为 `download_url` |
| 空记录 | `null` | 不改成空对象或 `success=false` |
## 迁移/实现注意事项
1. Flask 停止前必须完成 Java 接口真实 HTTP 验证。
2. 不要将公开接口放到 `/api/admin/version`;客户端接口和后台上传接口职责不同。
3. Java 服务启动失败或数据库不可用时,要记录明确错误;不要返回伪造的最新版本。
4. 版本记录写入仍由后台版本管理 API 完成,公开查询只读。
5. 上线验收至少使用一个有版本记录和一个空表/无记录夹具对比旧服务响应。
6. 必须验证旧客户端的请求地址、字段读取和下载 URL 不需要修改。