From 0d60037e4e40cac74b7a9fd1f4d616a61a94607d Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 3 Jun 2026 03:21:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=20API=20=E6=AD=A3=E7=A1=AE=E5=A4=84=E7=90=86?= =?UTF-8?q?=E8=A1=A5=E4=B8=81=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 当最新版本是补丁类型且客户端版本是基础版本时,返回补丁包地址 - 当最新版本是补丁类型但客户端不是基础版本时,返回完整包地址 - 添加 full_package_url/full_package_size/full_package_hash 字段作为备选 - 移除冗余的补丁查询逻辑 Co-Authored-By: Claude Opus 4.8 --- backend/internal/router/app/info.go | 86 ++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 25 deletions(-) diff --git a/backend/internal/router/app/info.go b/backend/internal/router/app/info.go index 10f5d01..1002f17 100644 --- a/backend/internal/router/app/info.go +++ b/backend/internal/router/app/info.go @@ -216,18 +216,57 @@ func handleAppCheckUpdate(c *gin.Context) { } } - // 确定下载地址:优先使用完整包地址,其次自定义地址 - downloadURL := latestVersion.FilePath - downloadSize := latestVersion.FileSize - downloadHash := latestVersion.FileHash + // 确定下载地址 + var downloadURL string + var downloadSize int64 + var downloadHash string + var fullPackageURL string + var fullPackageSize int64 + var fullPackageHash string + var isPatchUpdate bool - // 使用完整包地址(如果有) - if latestVersion.FullPackagePath != "" { - downloadURL = latestVersion.FullPackagePath - downloadSize = latestVersion.FullPackageSize - downloadHash = latestVersion.FullPackageHash + if latestVersion.UpdateType == "patch" && latestVersion.BaseVersionID != nil { + // 最新版本是补丁类型 + // 检查客户端版本是否是基础版本 + if clientVersionRecord.ID == *latestVersion.BaseVersionID { + // 客户端是基础版本,可以下载补丁包 + downloadURL = latestVersion.FilePath + downloadSize = latestVersion.FileSize + downloadHash = latestVersion.FileHash + isPatchUpdate = true + } else { + // 客户端不是基础版本,需要下载完整包 + if latestVersion.FullPackagePath != "" { + downloadURL = latestVersion.FullPackagePath + downloadSize = latestVersion.FullPackageSize + downloadHash = latestVersion.FullPackageHash + } else { + // 没有完整包,使用补丁包(可能合并失败) + downloadURL = latestVersion.FilePath + downloadSize = latestVersion.FileSize + downloadHash = latestVersion.FileHash + } + } + // 保存完整包地址作为备选 + if latestVersion.FullPackagePath != "" { + fullPackageURL = latestVersion.FullPackagePath + fullPackageSize = latestVersion.FullPackageSize + fullPackageHash = latestVersion.FullPackageHash + } + } else { + // 全量版本,直接使用文件路径 + downloadURL = latestVersion.FilePath + downloadSize = latestVersion.FileSize + downloadHash = latestVersion.FileHash + // 全量版本的完整包就是自己 + if latestVersion.FullPackagePath != "" { + fullPackageURL = latestVersion.FullPackagePath + fullPackageSize = latestVersion.FullPackageSize + fullPackageHash = latestVersion.FullPackageHash + } } - // 自定义地址优先级最高 + + // 自定义地址优先级最高(覆盖下载地址) if latestVersion.CustomDownloadURL != "" { downloadURL = latestVersion.CustomDownloadURL } @@ -249,22 +288,19 @@ func handleAppCheckUpdate(c *gin.Context) { "files": files, } - // 检查是否有适合客户端版本的增量更新 - // 查找以客户端版本为基础版本的 patch 更新 - var patchVersion model.Version - err := database.DB.Where("application_id = ? AND update_type = ? AND base_version_id = ? AND publish_status = ?", - app.ID, "patch", clientVersionRecord.ID, "published"). - Order("id DESC"). - Preload("Files"). - First(&patchVersion).Error - - if err == nil { - // 找到了增量更新 + // 如果是补丁更新,添加补丁信息 + if isPatchUpdate { result["is_patch"] = true - result["base_version"] = clientVersion - result["patch_url"] = patchVersion.FilePath - result["patch_size"] = patchVersion.FileSize - result["patch_hash"] = patchVersion.FileHash + result["patch_url"] = downloadURL + result["patch_size"] = downloadSize + result["patch_hash"] = downloadHash + } + + // 如果有完整包,添加完整包信息作为备选 + if fullPackageURL != "" { + result["full_package_url"] = fullPackageURL + result["full_package_size"] = fullPackageSize + result["full_package_hash"] = fullPackageHash } response.Success(c, result)