Files
ele-HeiXiu/test-server/README.md
YoungestSongMo 95019316b2 feat: 前后端联调 — 任务创建 + 账户信息 + 预估花费 (0.0.18)
- task: device_id 改为必填参数,API 层 Omit 封装 + getDeviceId() 自动注入
- pricing.ts: Python 后端 calculate_cost 完整移植,六种定价模式 + 6 个 Bug 修复
  (浮点冗余/维度匹配不一致/null 守卫/matrix 数据提取/unit_scale 等)
- ModelInputForm: 三层兜底预估消费展示 + React Hooks 顺序修复
- AccountInfo: VIP 等级列表匹配,套餐详情展示(说明/周期/席位/到期)
- 模型列表加密缓存 (safe-storage, stale-while-revalidate)
- VIP API 模块 (激活码/等级/订单/模拟支付)
- device_id 统一使用 UUID v4 持久化 (与 login/register 对齐)
2026-06-10 19:38:26 +08:00

184 lines
5.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.
# HeiXiu 更新服务器 — 后端对接文档
> 本文档供后端程序员阅读和实现。
---
## 快速启动测试服务器
```bash
cd test-server
pip install fastapi uvicorn
python server.py --release-dir ../release --port 8000
```
启动后访问:
- API 文档Swagger`http://localhost:8000/docs`
- 健康检查:`http://localhost:8000/health`
---
## API 端点
所有请求为 `GET`,无鉴权。
### 1. `GET /api/v1/update/check` — 版本检查
客户端启动后调用,决定是否提示用户更新。
**请求参数Query String**
| 参数 | 类型 | 必填 | 示例 | 说明 |
|------------|--------|:--:|------------|-----------------------------------------|
| `platform` | string | 是 | `win32` | `win32` / `darwin` / `linux` |
| `version` | string | 是 | `0.0.3` | 客户端当前版本号(三段式 semver |
| `edition` | string | 否 | `personal` | `personal` / `enterprise`,默认 `personal` |
**响应 — 有更新时:**
```json
{
"code": 0,
"data": {
"hasUpdate": true,
"latestVersion": "0.0.4",
"downloadUrl": "https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases/0.0.4/xxx-Setup.exe",
"fileSize": 113581841,
"sha512": "Base64...",
"blockMapUrl": "https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases/0.0.4/xxx-Setup.exe.blockmap",
"blockMapSize": 120256,
"changelog": "## 0.0.4\n\n- 日志记录\n- 增量更新",
"releaseDate": "2026-06-04",
"forceUpdate": false,
"minimumVersion": "0.0.0"
}
}
```
**响应 — 无更新时:**
```json
{
"code": 0,
"data": {
"hasUpdate": false
}
}
```
**字段说明:**
| 字段 | 类型 | 必填 | 说明 |
|------------------|---------|:--:|----------------------------------|
| `downloadUrl` | string | 是 | 安装包 HTTPS 直链 |
| `fileSize` | number | 是 | 安装包字节数 |
| `sha512` | string | 是 | 安装包 SHA512 Base64 |
| `blockMapUrl` | string | 否 | blockmap 文件 URL缺失时客户端全量下载 |
| `blockMapSize` | number | 否 | blockmap 文件字节数(`> 0` 时客户端启用增量下载) |
| `changelog` | string | 否 | Markdown 格式更新日志 |
| `releaseDate` | string | 否 | 发布日期YYYY-MM-DD |
| `forceUpdate` | boolean | 否 | 是否强制更新(`true` 时用户不可跳过) |
| `minimumVersion` | string | 否 | 最低兼容版本(低于此版本的客户端必须更新) |
> **增量更新说明**`blockMapUrl` + `blockMapSize` 为可选字段。客户端检测到 `blockMapSize > 0` 时自动启用增量下载(仅下载变更区块,节省
> 30%-70% 流量)。不传或为 `null` 时客户端全量下载。
---
### 2. `POST /api/v1/releases` — 发布新版本(需要鉴权)
```http
POST /api/v1/releases
Authorization: Bearer <UPDATE_API_KEY>
Content-Type: application/json
```
**请求体:**
```json
{
"platform": "win32",
"edition": "personal",
"latestVersion": "0.1.0",
"downloadUrl": "https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases/0.1.0/xxx.exe",
"fileSize": 112910987,
"sha512": "Base64...",
"blockMapUrl": "https://heixiu.oss-cn-hangzhou.aliyuncs.com/releases/0.1.0/xxx.exe.blockmap",
"blockMapSize": 152340,
"changelog": "## 0.1.0\n\n- 新功能 A\n- 修复 B",
"releaseDate": "2026-06-04",
"forceUpdate": false,
"minimumVersion": "0.0.0"
}
```
---
## 数据库表结构
```sql
CREATE TABLE releases
(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
platform VARCHAR(10) NOT NULL COMMENT 'win32 / darwin / linux',
edition VARCHAR(10) NOT NULL COMMENT 'personal / enterprise',
version VARCHAR(20) NOT NULL COMMENT '三段式 semver',
file_url VARCHAR(500) NOT NULL COMMENT '安装包 OSS HTTPS 地址',
file_size BIGINT NOT NULL COMMENT '安装包字节数',
sha512 VARCHAR(128) NOT NULL COMMENT '安装包 SHA512 Base64',
blockmap_url VARCHAR(500) COMMENT 'blockmap OSS 地址(可为空)',
blockmap_size BIGINT COMMENT 'blockmap 文件字节数',
changelog TEXT COMMENT 'Markdown 格式更新日志',
force_update TINYINT(1) DEFAULT 0,
min_version VARCHAR(20) DEFAULT '',
release_date DATE NOT NULL,
status VARCHAR(10) DEFAULT 'draft' COMMENT 'draft / published / deprecated',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_platform_edition_version (platform, edition, version),
INDEX idx_platform_edition_status (platform, edition, status)
);
```
---
## 更新检查逻辑(参考实现)
```
GET /api/v1/update/check?platform=win32&version=0.0.3&edition=personal
1. 查询最新 published 版本:
SELECT * FROM releases
WHERE platform = 'win32'
AND edition = 'personal'
AND status = 'published'
ORDER BY version DESC
LIMIT 1
2. 比较版本号:
- 请求 version >= 最新 version → hasUpdate = false
- 请求 version < 最新 version → hasUpdate = true
3. 版本比较建议用 semver 规则major.minor.patch
```
---
## 文件托管OSS
- 安装包和 `.blockmap` 文件托管在阿里云 OSS允许公开读取
- 路径约定:`releases/{version}/{filename}`
- 客户端通过 `downloadUrl` 直接下载,不经过后端 API
---
## 后端实现清单
- [ ] 部署 `GET /api/v1/update/check`
- [ ] 部署 `POST /api/v1/releases`Bearer Token 鉴权)
- [ ] 创建 `releases`
- [ ] 配置 OSS 公开读取 + HTTPS
- [ ] 可选API Key 白名单 + 限流