Files
2026-01-14 14:17:38 +08:00

348 lines
12 KiB
Markdown
Raw Permalink 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.

# 版本更新功能任务规划
> 设计文档请参考:[版本更新设计.md](./版本更新设计.md)
---
## 2. 任务分解与实现检查
### 2.1 版本号管理
#### T2.1.1 版本号定义和解析
- **任务描述**:定义版本号格式和解析逻辑
- **技术要点**
- 版本号格式:`v1.0.0``1.0.0`(语义化版本)
- 版本号比较逻辑(主版本号.次版本号.修订号)
- 当前版本号读取(从 `wails.json` 或编译时注入)
- **依赖**:无
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`internal/service/version.go`
- **检查结果**
- ✅ 版本号解析:`ParseVersion()` 支持 `v1.0.0``1.0.0` 格式
- ✅ 版本比较:`Version.Compare()` 实现语义化版本比较
#### T2.1.2 版本信息存储
- **任务描述**:本地存储版本信息
- **技术要点**
- 当前版本号存储
- 上次检查更新时间记录
- 更新检查配置(自动检查开关)
- **依赖**T2.1.1
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`internal/service/update_config.go`
### 2.2 更新检查功能
#### T2.2.1 远程版本检查服务
- **任务描述**:实现远程版本检查接口
- **技术要点**
- 远程版本信息接口JSON 格式)
- 版本号比较逻辑
- 网络请求和错误处理
- 超时控制
- **依赖**T2.1.1
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`internal/service/update_service.go`
- **检查结果**
- ✅ 远程版本信息接口:`fetchRemoteVersionInfo()` 通过 HTTP GET 获取 JSON
- ✅ 检查频率控制:`UpdateConfig.ShouldCheckUpdate()` 基于时间间隔判断
#### T2.2.2 更新检查触发机制
- **任务描述**:实现更新检查触发方式
- **技术要点**
- **启动时检查**:应用启动时立即检查一次(已实现)
- **自动检查**:根据配置的检查间隔自动检查(已实现)
- **手动检查**:用户手动触发检查更新按钮
- **检查频率控制**:避免频繁请求,支持可配置间隔(已实现)
- **依赖**T2.2.1
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`internal/module/update_module.go`
- **检查结果**
- ✅ 启动检查:`update_module.go``Start()` 方法中触发检查
#### T2.2.3 更新提示界面
- **任务描述**:前端展示更新提示
- **技术要点**
- 发现新版本时弹窗提示
- 显示当前版本和最新版本号
- 更新日志预览
- 立即更新/稍后提醒按钮
- **依赖**T2.2.2
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`web/src/composables/useVersion.ts`
### 2.3 更新下载功能
#### T2.3.1 更新包下载服务
- **任务描述**:实现更新包下载逻辑
- **技术要点**
- 更新包下载 URL 获取
- 文件下载(支持断点续传)
- 下载进度计算和回调
- 下载文件校验MD5/SHA256
- **依赖**T2.2.1
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`internal/service/update_download.go`
- **检查结果**
- ✅ 断点续传:使用 HTTP `Range` 头,支持从断点继续下载
- ✅ 文件完整性验证:`calculateFileHashes()` 计算 MD5 和 SHA256
- ✅ 下载目录管理:使用 `~/.ssq-desk/downloads` 目录
- **代码优化**2026-01-08
- ✅ 提取 `getRemoteFileSize()` 函数,消除重复的 HEAD 请求逻辑
- ✅ 提取 `normalizeProgress()` 函数,统一进度值标准化
- ✅ 精简日志输出,仅保留关键错误日志
- ✅ 代码量减少约 45%
#### T2.3.2 下载进度展示
- **任务描述**:前端展示下载进度
- **技术要点**
- 下载进度条显示
- 下载速度显示
- 下载状态提示(下载中/暂停/完成/失败)
- 进度值安全控制(确保在 0-100% 之间)
- **依赖**T2.3.1
- **优先级**P0
- **实现状态**:✅ 已实现2026-01-08 优化:添加多层进度值保护)
- **实现位置**`web/src/composables/useVersion.ts`
- **检查结果**
- ✅ 进度反馈:`DownloadProgress` 回调函数,每 0.3 秒更新一次
- ✅ 进度值控制:多层防护确保进度值严格在 0-100% 之间
- 后端 `normalizeProgress()` 函数标准化进度值
- API 层最后一道防线检查
- 前端 `clampProgress()` 函数确保显示值合法
- **代码优化**2026-01-08
- ✅ 提取 `clampProgress()` 辅助函数,统一进度值标准化
- ✅ 提取 `resetDownloadState()` 函数,消除重复代码
- ✅ 提取 `installUpdate()` 函数,简化安装逻辑
- ✅ 代码量从 485 行减少到约 300 行(减少约 40%
### 2.4 更新安装功能
#### T2.4.1 更新包安装逻辑
- **任务描述**:实现更新包安装
- **技术要点**
- 更新包解压/安装
- 安装前备份当前版本
- 安装后重启应用
- 安装失败回滚机制
- **依赖**T2.3.1
- **优先级**P0
- **实现状态**:✅ 已实现
- **实现位置**`internal/service/update_install.go`
- **检查结果**
- ✅ 安装前备份:`BackupApplication()` 在安装前创建备份
- ✅ 安装失败回滚:`rollbackFromBackup()` 在安装失败时恢复备份
- ✅ 多格式支持:支持 `.exe``.zip` 两种格式
- ✅ 自动重启:`restartApplication()` 支持 Windows/macOS/Linux
- **潜在问题**
- ⚠️ Windows 下替换正在运行的可执行文件:当前实现使用重命名方式(`.old` 后缀),但可能在某些情况下失败
- **代码优化**2026-01-08
- ✅ 移除所有调试日志
- ✅ 代码量减少约 30%
#### T2.4.2 安装方式选择
- **任务描述**:支持自动和手动安装
- **技术要点**
- 自动安装:下载完成后自动安装
- 手动安装:用户确认后安装
- 安装时机选择(立即安装/退出时安装)
- **依赖**T2.4.1
- **优先级**P1
- **实现状态**:✅ 已实现(自动安装)
### 2.5 更新日志展示
#### T2.5.1 更新日志获取
- **任务描述**:获取和解析更新日志
- **技术要点**
- 更新日志接口Markdown 或 HTML 格式)
- 日志版本关联
- 日志内容解析和格式化
- **依赖**T2.2.1
- **优先级**P1
- **实现状态**:✅ 已实现(从版本信息接口获取)
#### T2.5.2 更新日志界面
- **任务描述**:前端展示更新日志
- **技术要点**
- 更新日志弹窗/页面
- Markdown 渲染(如需要)
- 版本历史列表
- 日志内容展示
- **依赖**T2.5.1
- **优先级**P1
- **实现状态**:✅ 已实现(在更新提示对话框中显示)
### 2.6 更新配置管理
#### T2.6.1 更新配置界面
- **任务描述**:更新相关配置管理
- **技术要点**
- 自动检查更新开关
- 检查频率设置
- 更新通道选择(稳定版/测试版)
- **依赖**T2.1.2
- **优先级**P2
- **实现状态**:✅ 已实现(自动检查开关、检查间隔配置)
---
## 3. 实现检查与改进建议
### 3.1 符合行业最佳实践 ✅
- ✅ 版本检查机制:远程接口、语义化版本、检查频率控制
- ✅ 下载机制:断点续传、进度反馈、文件完整性验证
- ✅ 安装机制:备份回滚、多格式支持、自动重启
- ✅ 安全性文件哈希验证、HTTPS 传输、进度值安全
- ⚠️ 数字签名验证:未实现(建议增强)
### 3.2 优势
1. **完整的备份和回滚机制**:安装前备份,失败时自动回滚
2. **多格式支持**:同时支持 `.exe` 安装程序和 `.zip` 压缩包
3. **详细的进度反馈**:实时显示下载进度、速度、大小
4. **灵活的配置管理**:支持自定义检查间隔和检查地址
5. **代码质量**:遵循 DRY 原则,代码简洁易维护
### 3.3 不足与改进建议
#### 高优先级 🔴
1. **添加数字签名验证**
- Windows: 验证 `.exe` 文件的 Authenticode 签名
- macOS: 验证 `.app` 的代码签名
- 在安装前验证签名,确保更新包来源可信
2. **改进 Windows 文件替换机制**
- 使用 `MoveFileEx` API 的 `MOVEFILE_DELAY_UNTIL_REBOOT` 标志
- 或者使用临时文件名 + 原子替换的方式
#### 中优先级 ⚠️
1. **添加下载 URL 白名单验证**
- 在配置中维护允许的下载域名列表
- 下载前验证 URL 是否在白名单中
2. **优化下载超时机制**
- 根据文件大小动态调整超时时间
- 添加网络状态检测,网络断开时暂停下载
3. **添加增量更新支持**
- 服务器提供增量更新包(仅包含差异部分)
- 客户端支持增量更新包的下载和安装
#### 低优先级 💡
1. **添加更新包压缩**
- 服务器提供压缩的更新包(`.zip``.7z`
- 客户端下载后自动解压
2. **优化进度更新频率**
- 将进度更新频率改为可配置
- 根据下载速度动态调整更新频率
---
## 4. 代码优化记录
### 5.1 优化时间线
- **2026-01-08**:代码重构和精简
- 后端代码量减少 40-50%
- 前端代码量减少约 40%485行 → 300行
- 添加多层进度值保护机制
- 遵循 DRY 原则,提高代码质量
### 5.2 后端优化详情
#### update_download.go减少约 45%
- ✅ 提取 `getRemoteFileSize()` 函数,消除重复的 HEAD 请求逻辑
- ✅ 提取 `normalizeProgress()` 函数,统一进度值标准化
- ✅ 移除大量调试日志,仅保留关键错误日志
- ✅ 优化文件大小获取逻辑,支持多种方式获取
#### update_api.go减少约 50%
- ✅ 移除所有不必要的 `log.Printf` 调试日志
- ✅ 简化错误处理逻辑
- ✅ 优化进度回调函数,减少重复检查
#### update_install.go减少约 30%
- ✅ 移除所有调试日志
- ✅ 保留关键错误返回
### 5.3 前端优化详情
#### useVersion.ts减少约 40%
- ✅ 提取 `clampProgress()` 辅助函数,统一进度值标准化
- ✅ 提取 `resetDownloadState()` 函数,消除重复代码
- ✅ 提取 `installUpdate()` 函数,简化安装逻辑
- ✅ 优化事件处理,减少重复的 `nextTick` 调用
- ✅ 遵循 DRY 原则,提高代码可维护性
### 5.4 关键改进
1. **进度值安全**:多层防护确保进度值严格在 0-100% 之间
- 后端 `normalizeProgress()` 函数
- 后端 API 层检查
- 前端 `clampProgress()` 函数
- 组件内 `Math.max(0, Math.min(100, ...))` 限制
2. **代码质量**
- 遵循 DRY 原则,消除重复代码
- 单一职责原则,每个函数只做一件事
- 减少日志输出,提高性能
- 代码更简洁易读,易于维护
---
## 5. 开发顺序建议
### 第一阶段(核心功能)✅ 已完成
1. T2.1.1 → T2.1.2(版本号管理)
2. T2.2.1 → T2.2.2 → T2.2.3(更新检查)
3. T2.3.1 → T2.3.2(更新下载)
4. T2.4.1(更新安装)
### 第二阶段(增强功能)✅ 部分完成
1. T2.4.2(安装方式选择)- ✅ 自动安装已实现
2. T2.5.1 → T2.5.2(更新日志)- ✅ 已实现
### 第三阶段(配置管理)✅ 已完成
1. T2.6.1(更新配置)- ✅ 已实现
---
## 6. 任务优先级说明
- **P0**:核心功能,必须完成(版本检查、下载、安装)- ✅ 已完成
- **P1**:重要功能(安装方式选择、更新日志)- ✅ 已实现
- **P2**:辅助功能(配置管理)- ✅ 已实现
---
## 7. 总结
### 8.1 整体评价
我们的实现**基本符合**官方和行业最佳实践,主要功能都已实现,包括:
- ✅ 版本检查机制
- ✅ 下载机制(含断点续传)
- ✅ 安装机制(含备份和回滚)
- ✅ 前端 UI 和交互
- ✅ 代码优化和重构2026-01-08
### 8.2 主要不足
1. **安全性**:缺少数字签名验证(高优先级)
2. **Windows 兼容性**:文件替换机制可能需要改进(高优先级)
3. **功能增强**:缺少增量更新支持(中优先级)
### 8.3 建议
1. **立即改进**:添加数字签名验证,提高安全性
2. **短期优化**:改进 Windows 文件替换机制,提高成功率
3. **长期规划**:考虑添加增量更新支持,减少下载量
---
> 文档维护者JueChen
> 创建时间2026-01-07
> 最后更新2026-01-08