update backend
This commit is contained in:
@ -30,7 +30,7 @@ type ArticleRepository interface {
|
||||
UpdateRunway(ctx context.Context, id uint32, fields map[string]any) error
|
||||
// DeleteRunwayImage 软删单张走秀图片。
|
||||
DeleteRunwayImage(ctx context.Context, imageID uint32) error
|
||||
// GetRunwayImageKey 取单张走秀图片的七牛 key(删除前清理用);不存在返回空串。
|
||||
// GetRunwayImageKey 取单张走秀图片的S4 key(删除前清理用);不存在返回空串。
|
||||
GetRunwayImageKey(ctx context.Context, imageID uint32) (string, error)
|
||||
// SoftDeleteRunwayImages 软删某走秀的全部图片(级联下架用),返回被删图片的 key 列表。
|
||||
SoftDeleteRunwayImages(ctx context.Context, runwayID uint32) ([]string, error)
|
||||
@ -52,25 +52,25 @@ func NewArticleRepository(db *gorm.DB) ArticleRepository {
|
||||
// selectColumns 列表查询的投影列:只取对外需要的字段,不做 SELECT *。
|
||||
// 注意:year / season / season_code / collection_type / created_at 等仅用于排序,不 SELECT 到响应里
|
||||
// (前端按年份/季节筛选是走查询参数,响应无需回带这些元数据)。
|
||||
const articleListColumns = `brand_runway.id, brand_runway.brand_id,
|
||||
brand_runway.title_en, brand_runway.title_cn,
|
||||
brand_runway.cover, brand_runway.image_count,
|
||||
const articleListColumns = `brand_runways.id, brand_runways.brand_id,
|
||||
brand_runways.title_en, brand_runways.title_cn,
|
||||
brand_runways.cover, brand_runways.image_count,
|
||||
b.name_en AS brand_name_en, b.name_cn AS brand_name_cn`
|
||||
|
||||
const articleDetailColumns = `brand_runway.id, brand_runway.title_en, brand_runway.title_cn,
|
||||
brand_runway.description_en, brand_runway.description_cn,
|
||||
brand_runway.cover, b.name_en AS brand_name_en, b.name_cn AS brand_name_cn`
|
||||
const articleDetailColumns = `brand_runways.id, brand_runways.title_en, brand_runways.title_cn,
|
||||
brand_runways.description_en, brand_runways.description_cn,
|
||||
brand_runways.cover, b.name_en AS brand_name_en, b.name_cn AS brand_name_cn`
|
||||
|
||||
// articleAdminColumns 后台管理列表投影列:在列表列基础上补回 season / year /
|
||||
// collection_type / season_code 等管理字段(前端列表不展示这些)。
|
||||
const articleAdminColumns = `brand_runway.id, brand_runway.brand_id,
|
||||
brand_runway.title_en, brand_runway.title_cn,
|
||||
brand_runway.cover, brand_runway.image_count, brand_runway.year,
|
||||
brand_runway.collection_type, brand_runway.season, brand_runway.season_code,
|
||||
const articleAdminColumns = `brand_runways.id, brand_runways.brand_id,
|
||||
brand_runways.title_en, brand_runways.title_cn,
|
||||
brand_runways.cover, brand_runways.image_count, brand_runways.year,
|
||||
brand_runways.collection_type, brand_runways.season, brand_runways.season_code,
|
||||
b.name_en AS brand_name_en, b.name_cn AS brand_name_cn`
|
||||
|
||||
// brandJoin 关联品牌表取品牌名;LEFT JOIN 保证品牌被软删时文章依然可见。
|
||||
const brandJoin = "LEFT JOIN brand b ON b.id = brand_runway.brand_id AND b.is_deleted = 0"
|
||||
const brandJoin = "LEFT JOIN brands b ON b.id = brand_runways.brand_id AND b.is_deleted = 0"
|
||||
|
||||
// filterScope 把查询条件编译为 GORM Scope。
|
||||
//
|
||||
@ -78,18 +78,18 @@ const brandJoin = "LEFT JOIN brand b ON b.id = brand_runway.brand_id AND b.is_de
|
||||
// 会带上残留的 Statement 状态,Scope 每次作用于全新查询,杜绝这类隐患。
|
||||
func filterScope(q dto.ArticleQuery) func(*gorm.DB) *gorm.DB {
|
||||
return func(db *gorm.DB) *gorm.DB {
|
||||
db = db.Where("brand_runway.is_deleted = 0")
|
||||
db = db.Where("brand_runways.is_deleted = 0")
|
||||
|
||||
// 按品牌过滤来自列表接口的 ?brand_id 查询参数(q.BrandIDs 由 handler 解码注入)。
|
||||
db = whereMulti(db, "brand_runway.brand_id", toAnySlice(q.BrandIDs))
|
||||
db = whereMulti(db, "brand_runways.brand_id", toAnySlice(q.BrandIDs))
|
||||
if q.Collection != "" {
|
||||
db = db.Where("brand_runway.collection_type = ?", q.Collection)
|
||||
db = db.Where("brand_runways.collection_type = ?", q.Collection)
|
||||
}
|
||||
if q.Season != "" {
|
||||
db = db.Where("brand_runway.season = ?", q.Season)
|
||||
db = db.Where("brand_runways.season = ?", q.Season)
|
||||
}
|
||||
if q.Year != 0 {
|
||||
db = db.Where("brand_runway.year = ?", q.Year)
|
||||
db = db.Where("brand_runways.year = ?", q.Year)
|
||||
}
|
||||
return db
|
||||
}
|
||||
@ -126,14 +126,14 @@ func toAnySlice[T any](in []T) []any {
|
||||
// newest(默认):按走秀真实新旧排序 —— created_at 仅是导入时间,不能代表走秀新旧,
|
||||
// 故用 year DESC + season_code 优先级(FW>PF>SS>RES)+ id 兜底,与首页「最新走秀」口径一致。
|
||||
func orderBy(sort string) string {
|
||||
seasonPrio := `CASE brand_runway.season_code WHEN 'FW' THEN 4 WHEN 'PF' THEN 3 WHEN 'SS' THEN 2 WHEN 'RES' THEN 1 ELSE 0 END`
|
||||
seasonPrio := `CASE brand_runways.season_code WHEN 'FW' THEN 4 WHEN 'PF' THEN 3 WHEN 'SS' THEN 2 WHEN 'RES' THEN 1 ELSE 0 END`
|
||||
switch sort {
|
||||
case "year_asc":
|
||||
return "brand_runway.year ASC, brand_runway.id ASC"
|
||||
return "brand_runways.year ASC, brand_runways.id ASC"
|
||||
case "year_desc":
|
||||
return "brand_runway.year DESC, brand_runway.id DESC"
|
||||
return "brand_runways.year DESC, brand_runways.id DESC"
|
||||
default: // newest
|
||||
return "brand_runway.year DESC, " + seasonPrio + " DESC, brand_runway.id DESC"
|
||||
return "brand_runways.year DESC, " + seasonPrio + " DESC, brand_runways.id DESC"
|
||||
}
|
||||
}
|
||||
|
||||
@ -202,7 +202,7 @@ func (r *articleRepository) FindByID(ctx context.Context, id string) (*model.Run
|
||||
Model(&model.BrandRunway{}).
|
||||
Select(articleDetailColumns).
|
||||
Joins(brandJoin).
|
||||
Where("brand_runway.id = ? AND brand_runway.is_deleted = 0", id).
|
||||
Where("brand_runways.id = ? AND brand_runways.is_deleted = 0", id).
|
||||
First(&row).Error
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
@ -309,7 +309,7 @@ func (r *articleRepository) GetRunwayImageKey(ctx context.Context, imageID uint3
|
||||
}
|
||||
|
||||
// SoftDeleteRunwayImages 软删某走秀的全部图片(级联下架用)。
|
||||
// 先取非删除图片的 key 列表返回给调用方(用于后续七牛孤儿清理),再统一置 is_deleted=1。
|
||||
// 先取非删除图片的 key 列表返回给调用方(用于后续S4孤儿清理),再统一置 is_deleted=1。
|
||||
func (r *articleRepository) SoftDeleteRunwayImages(ctx context.Context, runwayID uint32) ([]string, error) {
|
||||
var imgs []model.BrandRunwayImage
|
||||
if err := r.db.WithContext(ctx).
|
||||
|
||||
Reference in New Issue
Block a user