This commit is contained in:
张成
2025-11-26 12:39:21 +08:00
parent 5d59000960
commit 7858459118
12 changed files with 1785 additions and 2 deletions

View File

@@ -0,0 +1,320 @@
# 服务端升级功能逻辑说明
## 概述
本文档说明服务端需要实现的升级功能逻辑,配合客户端的自动升级功能。
## API 接口要求
### GET /version/check
**功能**:检查是否有新版本可用
**请求参数**Query 参数):
- `current_version`: 当前版本号x.y.z 格式,如 "1.0.0"
- `platform`: 平台类型(如 "win32", "darwin", "linux"
- `arch`: 架构类型(如 "x64", "ia32", "arm64"
- `sn_code`: 设备序列号(可选,用于权限控制)
**响应格式**
```json
{
"code": 0,
"message": "success",
"data": {
"version": "1.1.0",
"download_url": "http://work.light120.com/downloads/app-1.1.0.exe",
"release_notes": "修复了一些bug新增了xxx功能",
"force_update": false,
"file_size": 52428800,
"file_hash": "abc123def456..."
}
}
```
**字段说明**
- `version`: 最新版本号x.y.z 格式)
- `download_url`: 更新包下载地址(完整的 HTTP/HTTPS URL
- `release_notes`: 更新日志(可选,字符串)
- `force_update`: 是否强制更新(可选,布尔值,默认 false
- `file_size`: 文件大小(字节,可选)
- `file_hash`: 文件 SHA256 哈希值(可选,用于校验文件完整性)
**业务逻辑**
1. **版本比较**
- 从数据库查询最新版本信息(根据 platform 和 arch
- 比较请求中的 `current_version` 与数据库中的最新版本
- 如果最新版本 > 当前版本,返回更新信息
- 如果版本相同或更旧,返回 `code: 0, data: null` 或提示"已是最新版本"
2. **版本号格式**
- 格式x.y.z如 1.0.0, 1.1.0, 2.0.0
- 比较规则:主版本号 > 次版本号 > 修订号
- 示例1.1.0 > 1.0.0, 2.0.0 > 1.9.9
3. **平台和架构过滤**
- 只返回匹配 platform 和 arch 的版本信息
- 如果某个平台没有新版本,返回空结果
4. **序列号验证**(可选):
- 可以根据 sn_code 验证设备权限
- 如果启用权限控制,未授权的设备返回错误
5. **错误处理**
- 参数缺失:返回 `code: 400, message: "参数错误"`
- 服务器错误:返回 `code: 500, message: "服务器错误"`
- 无新版本:返回 `code: 0, data: null``has_update: false`
## 数据库设计建议
### 版本信息表version_info
| 字段名 | 类型 | 说明 | 约束 |
|--------|------|------|------|
| id | INT/BIGINT | 主键 | PRIMARY KEY, AUTO_INCREMENT |
| version | VARCHAR(20) | 版本号x.y.z 格式) | NOT NULL, UNIQUE |
| platform | VARCHAR(20) | 平台类型win32/darwin/linux | NOT NULL |
| arch | VARCHAR(20) | 架构类型x64/ia32/arm64 | NOT NULL |
| download_url | VARCHAR(500) | 下载地址 | NOT NULL |
| file_path | VARCHAR(500) | 服务器文件路径 | NOT NULL |
| file_size | BIGINT | 文件大小(字节) | DEFAULT 0 |
| file_hash | VARCHAR(64) | SHA256 哈希值 | |
| release_notes | TEXT | 更新日志 | |
| force_update | TINYINT(1) | 是否强制更新 | DEFAULT 0 |
| status | TINYINT(1) | 状态1:启用 0:禁用) | DEFAULT 1 |
| create_time | DATETIME | 创建时间 | NOT NULL, DEFAULT CURRENT_TIMESTAMP |
| last_modify_time | DATETIME | 最后修改时间 | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
**索引建议**
- PRIMARY KEY (id)
- UNIQUE KEY (version, platform, arch)
- INDEX (platform, arch, status)
### 版本发布历史表version_history可选
用于记录版本发布历史,便于管理:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| id | INT/BIGINT | 主键 |
| version_id | INT | 关联 version_info.id |
| release_type | VARCHAR(20) | 发布类型stable/beta/alpha |
| create_time | DATETIME | 发布时间 |
| last_modify_time | DATETIME | 最后修改时间 |
## 业务逻辑流程
### 1. 版本检查流程
```
客户端请求
接收参数current_version, platform, arch, sn_code
验证参数有效性
查询数据库最新版本(按 platform + arch + status=1
版本号比较
有更新?
├─ 是 → 构建返回数据(包含文件信息)
└─ 否 → 返回空结果或提示"已是最新版本"
返回响应
```
### 2. 版本管理流程
**新增版本**
1. 上传安装包文件到服务器指定目录
2. 计算文件 SHA256 哈希值
3. 获取文件大小
4. 插入数据库记录status=1 表示启用)
**禁用版本**
1. 更新 status=0不删除记录保留历史
**删除版本**
1. 删除数据库记录
2. 删除服务器上的文件
### 3. 文件存储建议
**目录结构**
```
/uploads/
└── versions/
├── win32/
│ ├── x64/
│ │ ├── app-1.0.0.exe
│ │ └── app-1.1.0.exe
│ └── ia32/
└── darwin/
└── x64/
└── app-1.1.0.dmg
```
**文件命名规则**
- 格式:`app-{version}.{ext}`
- 示例:`app-1.1.0.exe`, `app-1.1.0.dmg`
**下载 URL 生成**
- 基础 URL`http://work.light120.com/downloads/`
- 完整 URL`http://work.light120.com/downloads/app-1.1.0.exe`
## 关键逻辑说明
### 1. 版本号比较逻辑
**字符串比较规则**
- 将版本号按 "." 分割成数组:["1", "1", "0"]
- 逐位比较数字大小
- 主版本号优先级最高,依次递减
**示例**
```javascript
// 伪代码
compareVersion("1.1.0", "1.0.0") true // 1.1.0 > 1.0.0
compareVersion("2.0.0", "1.9.9") true // 2.0.0 > 1.9.9
compareVersion("1.0.0", "1.0.0") false // 相等
```
### 2. 文件哈希计算
**计算方法**
- 使用 SHA256 算法
- 读取文件内容,计算哈希值
- 返回小写的十六进制字符串
**用途**
- 客户端下载后校验文件完整性
- 防止文件被篡改
- 确保文件下载完整
### 3. 强制更新逻辑
**force_update 字段**
- `true`: 强制更新,客户端必须更新才能使用
- `false`: 可选更新,客户端可以选择稍后更新
**业务场景**
- 安全漏洞修复 → 强制更新
- 重大功能更新 → 强制更新
- 小版本更新 → 可选更新
### 4. 平台和架构支持
**支持列表**
- Windows: `win32` + `x64` / `ia32`
- macOS: `darwin` + `x64` / `arm64`
- Linux: `linux` + `x64` / `arm64`
**查询逻辑**
- 必须同时匹配 platform 和 arch
- 如果某个组合没有版本,返回空结果
## 安全考虑
### 1. 文件下载安全
- **HTTPS 下载**:优先使用 HTTPS 协议
- **文件校验**:提供 SHA256 哈希值供客户端校验
- **文件大小验证**:返回文件大小,客户端可以验证下载完整性
### 2. 权限控制
- **序列号验证**:可以根据 sn_code 控制哪些设备可以更新
- **版本状态**:使用 status 字段控制版本是否可用
- **IP 限制**:可以限制下载 IP 范围(可选)
### 3. 防止恶意更新
- **文件类型验证**:只允许上传 .exe、.dmg、.AppImage 等安装包
- **文件大小限制**:设置最大文件大小限制
- **版本号验证**:验证版本号格式是否正确
## 返回状态码说明
| code | 说明 | 处理方式 |
|------|------|----------|
| 0 | 成功 | 检查 data 是否为空判断是否有更新 |
| 400 | 参数错误 | 客户端提示参数错误 |
| 401 | 未授权 | 客户端提示未授权 |
| 404 | 未找到版本 | 客户端提示版本不存在 |
| 500 | 服务器错误 | 客户端提示服务器错误,稍后重试 |
## 示例场景
### 场景1有新版本
**请求**
```
GET /version/check?current_version=1.0.0&platform=win32&arch=x64&sn_code=GHJU
```
**响应**
```json
{
"code": 0,
"message": "success",
"data": {
"version": "1.1.0",
"download_url": "http://work.light120.com/downloads/app-1.1.0.exe",
"release_notes": "1. 修复了登录问题\n2. 新增自动升级功能",
"force_update": false,
"file_size": 52428800,
"file_hash": "a1b2c3d4e5f6..."
}
}
```
### 场景2已是最新版本
**请求**
```
GET /version/check?current_version=1.1.0&platform=win32&arch=x64&sn_code=GHJU
```
**响应**
```json
{
"code": 0,
"message": "已是最新版本",
"data": null
}
```
### 场景3参数错误
**请求**
```
GET /version/check?current_version=1.0.0
```
**响应**
```json
{
"code": 400,
"message": "缺少必要参数platform, arch",
"data": null
}
```
## 注意事项
1. **日期字段命名**:统一使用 `create_time``last_modify_time`
2. **版本号格式**:严格按照 x.y.z 格式,便于版本比较
3. **文件存储**:建议使用 CDN 或静态文件服务器,提高下载速度
4. **日志记录**:记录版本检查请求,便于统计和分析
5. **缓存策略**:可以考虑缓存最新版本信息,减少数据库查询
6. **灰度发布**:可以通过 sn_code 控制部分设备先更新(可选)
## 实现优先级
1. **基础功能**:版本检查、版本比较、返回下载信息
2. **文件管理**:文件上传、文件存储、哈希计算
3. **安全功能**:文件校验、权限控制
4. **管理功能**:版本管理后台、历史记录