From beae161078ccdf29b25d14857a17ae84a5f67a0e Mon Sep 17 00:00:00 2001 From: admin Date: Wed, 3 Jun 2026 03:07:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9B=E5=BB=BA=E5=92=8C=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E7=89=88=E6=9C=AC=E6=97=B6=E4=BF=9D=E5=AD=98=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=88=97=E8=A1=A8=E5=88=B0=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 CreateVersionRequest 和 UpdateVersionRequest 中添加 Files 字段 - 创建版本时保存文件列表到 VersionFile 表 - 更新版本时删除旧文件记录并创建新的 - 前端创建和编辑版本时传递文件列表 - 修复检测更新 API 使用正确的字段名 (publish_status=published) Co-Authored-By: Claude Opus 4.8 --- backend/internal/router/admin/versions.go | 102 ++++++++++++++----- frontend/src/pages/admin/versions/[id].vue | 1 + frontend/src/pages/admin/versions/create.vue | 1 + 3 files changed, 79 insertions(+), 25 deletions(-) diff --git a/backend/internal/router/admin/versions.go b/backend/internal/router/admin/versions.go index 92c5801..81f173b 100644 --- a/backend/internal/router/admin/versions.go +++ b/backend/internal/router/admin/versions.go @@ -260,19 +260,29 @@ func handleGetVersionByID(c *gin.Context) { } type CreateVersionRequest struct { - ApplicationID uint `json:"application_id"` - Version string `json:"version"` - FilePath string `json:"file_path"` - FileSize int64 `json:"file_size"` - FileHash string `json:"file_hash"` - EntryFile string `json:"entry_file"` - UpdateStrategy string `json:"update_strategy"` - UpdateType string `json:"update_type"` - UpdateMethod string `json:"update_method"` - CustomDownloadURL string `json:"custom_download_url"` - Description string `json:"description"` - Changelog string `json:"changelog"` - BaseVersionID *uint `json:"base_version_id"` + ApplicationID uint `json:"application_id"` + Version string `json:"version"` + FilePath string `json:"file_path"` + FileSize int64 `json:"file_size"` + FileHash string `json:"file_hash"` + EntryFile string `json:"entry_file"` + UpdateStrategy string `json:"update_strategy"` + UpdateType string `json:"update_type"` + UpdateMethod string `json:"update_method"` + CustomDownloadURL string `json:"custom_download_url"` + Description string `json:"description"` + Changelog string `json:"changelog"` + BaseVersionID *uint `json:"base_version_id"` + Files []VersionFileInput `json:"files"` +} + +type VersionFileInput struct { + FilePath string `json:"file_path"` + FileName string `json:"file_name"` + FileSize int64 `json:"file_size"` + FileHash string `json:"file_hash"` + FileType string `json:"file_type"` + IsRequired bool `json:"is_required"` } func handleCreateVersionGlobal(c *gin.Context) { @@ -409,6 +419,25 @@ func handleCreateVersionGlobal(c *gin.Context) { return } + // 保存文件列表 + if len(req.Files) > 0 { + for i, f := range req.Files { + versionFile := model.VersionFile{ + VersionID: version.ID, + FilePath: f.FilePath, + FileName: f.FileName, + FileSize: f.FileSize, + FileHash: f.FileHash, + FileType: f.FileType, + IsRequired: f.IsRequired, + SortOrder: i, + } + if err := database.DB.Create(&versionFile).Error; err != nil { + log.Printf("[WARN] Failed to create version file record: %v\n", err) + } + } + } + userIDPtr := &userID versionIDPtr := &version.ID service.CreateLog(service.LogParams{ @@ -426,18 +455,19 @@ func handleCreateVersionGlobal(c *gin.Context) { } type UpdateVersionRequest struct { - Version string `json:"version"` - FilePath string `json:"file_path"` - FileSize int64 `json:"file_size"` - FileHash string `json:"file_hash"` - EntryFile string `json:"entry_file"` - UpdateStrategy string `json:"update_strategy"` - UpdateType string `json:"update_type"` - UpdateMethod string `json:"update_method"` - CustomDownloadURL string `json:"custom_download_url"` - Description string `json:"description"` - Changelog string `json:"changelog"` - BaseVersionID *uint `json:"base_version_id"` + Version string `json:"version"` + FilePath string `json:"file_path"` + FileSize int64 `json:"file_size"` + FileHash string `json:"file_hash"` + EntryFile string `json:"entry_file"` + UpdateStrategy string `json:"update_strategy"` + UpdateType string `json:"update_type"` + UpdateMethod string `json:"update_method"` + CustomDownloadURL string `json:"custom_download_url"` + Description string `json:"description"` + Changelog string `json:"changelog"` + BaseVersionID *uint `json:"base_version_id"` + Files []VersionFileInput `json:"files"` } func handleUpdateVersionGlobal(c *gin.Context) { @@ -575,6 +605,28 @@ func handleUpdateVersionGlobal(c *gin.Context) { return } + // 更新文件列表 + if len(req.Files) > 0 { + // 删除旧的文件记录 + database.DB.Where("version_id = ?", version.ID).Delete(&model.VersionFile{}) + // 创建新的文件记录 + for i, f := range req.Files { + versionFile := model.VersionFile{ + VersionID: version.ID, + FilePath: f.FilePath, + FileName: f.FileName, + FileSize: f.FileSize, + FileHash: f.FileHash, + FileType: f.FileType, + IsRequired: f.IsRequired, + SortOrder: i, + } + if err := database.DB.Create(&versionFile).Error; err != nil { + log.Printf("[WARN] Failed to create version file record: %v\n", err) + } + } + } + userIDPtr := &userID versionIDPtr := &version.ID service.CreateLog(service.LogParams{ diff --git a/frontend/src/pages/admin/versions/[id].vue b/frontend/src/pages/admin/versions/[id].vue index 312da2c..ef5c8b1 100644 --- a/frontend/src/pages/admin/versions/[id].vue +++ b/frontend/src/pages/admin/versions/[id].vue @@ -287,6 +287,7 @@ async function handleSubmit() { payload.file_path = uploadedData.value.file_path payload.file_size = uploadedData.value.file_size payload.file_hash = uploadedData.value.file_hash + payload.files = uploadedData.value.files || [] } const response = await api.put(`/dev/versions/${versionId.value}`, payload) diff --git a/frontend/src/pages/admin/versions/create.vue b/frontend/src/pages/admin/versions/create.vue index d0319fe..f70a2c5 100644 --- a/frontend/src/pages/admin/versions/create.vue +++ b/frontend/src/pages/admin/versions/create.vue @@ -263,6 +263,7 @@ async function handleSubmit() { file_path: uploadedData.value.file_path, file_size: uploadedData.value.file_size, file_hash: uploadedData.value.file_hash, + files: uploadedData.value.files || [], } // 如果是补丁版本,添加基础版本ID if (formData.value.update_type === 'patch' && formData.value.base_version_id) {