This commit is contained in:
2026-09-15 16:02:45 +08:00
parent 112c5f8e46
commit ade2453083
70 changed files with 1441 additions and 707 deletions
+39 -3
View File
@@ -86,13 +86,48 @@ func (d *CollectDao) CollectCountByTarget(ctx context.Context, collectType int8,
return count, nil
}
// CollectListTargetIDsByUserPage 分页查询用户收藏的目标ID列表(仅 status=1),返回 ids 与总数。
// CollectCountByTargets 批量统计多个目标的收藏数(仅 status=1),返回 targetID -> count;空入参短路。
func (d *CollectDao) CollectCountByTargets(ctx context.Context, collectType int8, targetIDs []int64) (map[int64]int64, error) {
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectCountByTargets")
defer span.End()
counts := make(map[int64]int64, len(targetIDs))
if len(targetIDs) == 0 {
return counts, nil
}
var rows []struct {
TargetID int64 `gorm:"column:target_id"`
Cnt int64 `gorm:"column:cnt"`
}
if err := d.db.WithContext(ctx).Model(&mysqlmodel.Collect{}).
Select("target_id, COUNT(*) AS cnt").
Where("collect_type = ? AND target_id IN ? AND status = ?", collectType, targetIDs, int8(1)).
Group("target_id").
Scan(&rows).Error; err != nil {
span.RecordError(err)
return nil, err
}
for _, r := range rows {
counts[r.TargetID] = r.Cnt
}
return counts, nil
}
// CollectListTargetIDsByUserPage 分页查询用户收藏的目标ID列表(仅 status=1,且目标穿搭对本人可见),返回 ids 与总数。
//
// 可见性口径与 service.isOutfitPublicVisible 保持一致:本人收藏自己的穿搭始终可见;
// 收藏他人穿搭要求「公开(2) + 审核通过(2) + 状态正常(1)」。
// 联表过滤而非服务层过滤,是为了让 total 与实际返回条数口径一致
//(此前只按 collects 计数,穿搭转私/删除后会返回 total 虚高、页内条数偏少的空洞页)。
func (d *CollectDao) CollectListTargetIDsByUserPage(ctx context.Context, collectType int8, userID int64, page, pageSize int) ([]int64, int64, error) {
ctx, span := global.Tracer.Start(ctx, "mysqldao.CollectListTargetIDsByUserPage")
defer span.End()
q := d.db.WithContext(ctx).Model(&mysqlmodel.Collect{}).
Where("collect_type = ? AND user_id = ? AND status = ?", collectType, userID, int8(1))
Joins("JOIN outfits o ON o.id = collects.target_id AND o.deleted_at = 0").
Where("collects.collect_type = ? AND collects.user_id = ? AND collects.status = ?", collectType, userID, int8(1)).
Where("o.user_id = ? OR (o.is_public = ? AND o.audit_status = ? AND o.status = ?)", userID, 2, 2, 1)
var total int64
if err := q.Count(&total).Error; err != nil {
@@ -101,7 +136,8 @@ func (d *CollectDao) CollectListTargetIDsByUserPage(ctx context.Context, collect
}
var ids []int64
if err := q.Order("id DESC").Offset((page-1)*pageSize).Limit(pageSize).Pluck("target_id", &ids).Error; err != nil {
if err := q.Order("collects.id DESC").Offset((page-1)*pageSize).Limit(pageSize).
Pluck("collects.target_id", &ids).Error; err != nil {
span.RecordError(err)
return nil, 0, err
}