diff --git a/server/biz/controller/app_version.go b/server/biz/controller/app_version.go index 5a9c261..9cb2399 100644 --- a/server/biz/controller/app_version.go +++ b/server/biz/controller/app_version.go @@ -3,6 +3,8 @@ package controller import ( "context" + "github.com/gogf/gf/v2/net/ghttp" + "observer-server/biz/model/dto" "observer-server/biz/service" ) @@ -16,3 +18,16 @@ var AppVersion = &cAppVersion{} func (c *cAppVersion) GetUpdate(ctx context.Context, req *dto.AppUpdateReq) (*dto.AppUpdateRes, error) { return service.AppVersion.GetUpdate(ctx, req) } + +// Cover 数据集封面(直写响应体:service 定位文件,controller 输出二进制; +// 公开接口,App 模型清单缩略图。URL 不随封面更换变化,必须 no-store 防缓存旧图) +func (c *cAppVersion) Cover(ctx context.Context, req *dto.AppCoverReq) (*dto.AppCoverRes, error) { + path, err := service.Dataset.AppCoverFile(ctx, req.NamePrefix) + if err != nil { + return nil, err + } + r := ghttp.RequestFromCtx(ctx) + r.Response.Header().Set("Cache-Control", "no-store") + r.Response.ServeFile(path) + return &dto.AppCoverRes{}, nil +} diff --git a/server/biz/model/dto/app_version.go b/server/biz/model/dto/app_version.go index 59e9a22..58d8508 100644 --- a/server/biz/model/dto/app_version.go +++ b/server/biz/model/dto/app_version.go @@ -20,3 +20,13 @@ type AppUpdateRes struct { Notes string `json:"notes"` Models []*ModelCatalogItem `json:"models,omitempty"` } + +// AppCoverReq 数据集封面(公开接口:App 模型清单缩略图,无需登录态)。 +// namePrefix 为训练文件名前缀(模型发布命名,与 downloadUrl 文件名一致)。 +type AppCoverReq struct { + g.Meta `path:"/app/cover" method:"get" summary:"数据集封面" tags:"版本"` + NamePrefix string `json:"namePrefix" v:"required"` +} + +// AppCoverRes 封面响应(controller 直写响应体,此结构仅占位) +type AppCoverRes struct{} diff --git a/server/biz/service/dataset.go b/server/biz/service/dataset.go index 5cd5ca0..bee5927 100644 --- a/server/biz/service/dataset.go +++ b/server/biz/service/dataset.go @@ -338,6 +338,19 @@ func (s *datasetService) CoverFile(ctx context.Context, datasetId int64, name, f return path, nil } +// AppCoverFile 公开封面定位(App 模型清单缩略图):按训练文件名前缀查数据集, +// 复用 CoverFile 的归属校验(数据集不存在/无封面/文件缺失 → 404 错误码)。 +func (s *datasetService) AppCoverFile(ctx context.Context, namePrefix string) (string, error) { + d, err := dao.Dataset.GetByNamePrefix(ctx, strings.TrimSpace(namePrefix)) + if err != nil { + return "", err + } + if d == nil { + return "", gerror.NewCode(common.CodeDatasetNotFound) + } + return s.CoverFile(ctx, d.Id, "", "") +} + // AdminDeleteCover 删除数据集封面:删文件 + 清 cover 字段(列表卡片恢复占位图) func (s *datasetService) AdminDeleteCover(ctx context.Context, req *dto.AdminDatasetCoverDeleteReq) (*dto.AdminDatasetCoverDeleteRes, error) { dataset, err := dao.Dataset.GetById(ctx, req.DatasetId)