修复: 版本更新与设置面板走查问题

- 更新链路: 检查记录远端SHA256,下载完成事件回传,安装时带哈希校验
- 续传: 服务器忽略Range返回200时截断重下防追加损坏,文件名去query
- 定时器: 自动检查可重入,配置变更免重启生效,关闭即停,下载加互斥
- 前端: 支持跳过此版本并按版本去重,手动检查不受门禁限制,启动未就绪延时重试
- 更新面板: 新增自动检查开关/间隔/地址配置与进度条状态映射
- 版本历史: cache参数强制刷新与加载超时重试兜底
- 配置: 侧边栏分区全链路持久化,保存请求复用api类型防字段丢失
- 侧边栏: 区块定位改显式类名,不再依赖排序位置
- 绑定: 重新生成并与镜像目录同步
This commit is contained in:
lxy
2026-10-03 10:18:27 +08:00
parent 81e245eade
commit c7978a5bfd
25 changed files with 589 additions and 286 deletions
+17 -3
View File
@@ -11,6 +11,7 @@ import (
"net/http"
"os"
"path/filepath"
"strings"
"time"
"u-desk/internal/common"
@@ -41,9 +42,13 @@ func DownloadUpdate(downloadURL string, progressCallback DownloadProgress) (*Dow
return nil, fmt.Errorf("创建下载目录失败: %v", err)
}
// 从 URL 提取文件名
filename := filepath.Base(downloadURL)
if filename == "" || filename == "." {
// 从 URL 提取文件名(去除 query 参数与 # 片段)
cleanURL := downloadURL
if idx := strings.IndexAny(cleanURL, "?#"); idx != -1 {
cleanURL = cleanURL[:idx]
}
filename := filepath.Base(cleanURL)
if filename == "" || filename == "." || filename == "/" {
filename = fmt.Sprintf("update-%d.exe", time.Now().Unix())
}
@@ -127,6 +132,15 @@ func DownloadUpdate(downloadURL string, progressCallback DownloadProgress) (*Dow
return nil, fmt.Errorf("服务器返回错误状态码: %d", resp.StatusCode)
}
// 服务器忽略 Range 返回 200 时,本地已下载部分不能追加,必须截断从头写,否则文件损坏
if resp.StatusCode == http.StatusOK && downloadedSize > 0 {
if err := file.Truncate(0); err != nil {
return nil, fmt.Errorf("重置下载文件失败: %v", err)
}
downloadedSize = 0
log.Printf("[下载] 服务器不支持断点续传(返回 200),从头下载")
}
// 获取文件总大小
contentLength := resp.ContentLength
gotTotalFromRange := false