feat: 订阅列表和免费列表

This commit is contained in:
Blizzard
2026-03-03 17:09:37 +08:00
parent d79beb4663
commit 042c99aa46
21 changed files with 4182 additions and 209 deletions
+33 -7
View File
@@ -16,18 +16,44 @@ const MaxFreeSubscription = 2
// GetUserSubscription 获取用户订阅列表
func (s *SubscriptionService) GetUserSubscription(userId string, info common.PageInfo) ([]radio.RadioSubscription, int64, error) {
db := global.DB.Model(&radio.RadioSubscription{}).Where("user_id = ?", userId)
var list []radio.RadioSubscription
var subscriptions []radio.RadioSubscription
var total int64
err := db.Count(&total).Error
db := global.DB // 替换为你实际的 GORM 变量
// 2. 统计该用户订阅的总数 (Status=1 表示订阅中)
err := db.Model(&radio.RadioSubscription{}).
Where("user_id = ? AND status = 1", userId).
Count(&total).Error
if err != nil {
return nil, 0, err
}
// 3. 执行分页关联查询
err = db.Model(&radio.RadioSubscription{}).
Where("user_id = ? AND status = 1", userId).
Limit(info.PageSize).
Offset((info.Current-1)*info.PageSize).
Order("created_at DESC").
// 级联加载频道及其封面
Preload("Channel").
Preload("Channel.Cover").
// 关键:子查询过滤——只预加载每个频道 ID 最大的那一条节目
Preload("Channel.Programs", func(db *gorm.DB) *gorm.DB {
// 子查询:找到每个频道下 ID 最大的节目(通常 ID 越大代表越新,也可以用 CreatedAt)
subQuery := db.Table("sundynix_radio_program").
Select("id").
Where("status = 1"). // 只找上架的
Where("created_at = (SELECT MAX(created_at) FROM sundynix_radio_program AS rp WHERE rp.channel_id = sundynix_radio_program.channel_id AND rp.status = 1)")
offset := (info.Current - 1) * info.PageSize
err = db.Offset(offset).Limit(info.PageSize).Order("created_at DESC").Find(&list).Error
return list, total, err
// 嵌套预加载:节目里的音频和封面也一并带出来
return db.Where("id IN (?)", subQuery).
Preload("Cover").
Preload("Audio")
}).
Find(&subscriptions).Error
if err != nil {
return nil, total, err
}
return subscriptions, total, err
}
// GetUserSubscriptionHistory 获取用户历史订阅过的频道ID列表