Initial commit
This commit is contained in:
178
server/internal/repository/banner.go
Normal file
178
server/internal/repository/banner.go
Normal file
@@ -0,0 +1,178 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"dianshang/internal/model"
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// BannerRepository 轮播图仓储
|
||||
type BannerRepository struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewBannerRepository 创建轮播图仓储
|
||||
func NewBannerRepository(db *gorm.DB) *BannerRepository {
|
||||
return &BannerRepository{db: db}
|
||||
}
|
||||
|
||||
// GetActiveBanners 获取有效的轮播图
|
||||
func (r *BannerRepository) GetActiveBanners() ([]model.Banner, error) {
|
||||
var banners []model.Banner
|
||||
err := r.db.Where("status = ?", 1).Order("sort ASC").Find(&banners).Error
|
||||
return banners, err
|
||||
}
|
||||
|
||||
// GetBannerList 获取轮播图列表(分页)
|
||||
func (r *BannerRepository) GetBannerList(page, pageSize int, status *int) ([]model.Banner, int64, error) {
|
||||
var banners []model.Banner
|
||||
var total int64
|
||||
|
||||
query := r.db.Model(&model.Banner{})
|
||||
|
||||
// 状态筛选
|
||||
if status != nil {
|
||||
query = query.Where("status = ?", *status)
|
||||
}
|
||||
|
||||
// 获取总数
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// 分页查询
|
||||
offset := (page - 1) * pageSize
|
||||
err := query.Order("sort ASC, created_at DESC").
|
||||
Offset(offset).
|
||||
Limit(pageSize).
|
||||
Find(&banners).Error
|
||||
|
||||
return banners, total, err
|
||||
}
|
||||
|
||||
// GetBannerByID 根据ID获取轮播图
|
||||
func (r *BannerRepository) GetBannerByID(id uint) (*model.Banner, error) {
|
||||
var banner model.Banner
|
||||
err := r.db.First(&banner, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &banner, nil
|
||||
}
|
||||
|
||||
// CreateBanner 创建轮播图
|
||||
func (r *BannerRepository) CreateBanner(banner *model.Banner) error {
|
||||
return r.db.Create(banner).Error
|
||||
}
|
||||
|
||||
// UpdateBanner 更新轮播图
|
||||
func (r *BannerRepository) UpdateBanner(banner *model.Banner) error {
|
||||
return r.db.Save(banner).Error
|
||||
}
|
||||
|
||||
// DeleteBanner 删除轮播图
|
||||
func (r *BannerRepository) DeleteBanner(id uint) error {
|
||||
return r.db.Delete(&model.Banner{}, id).Error
|
||||
}
|
||||
|
||||
// BatchDeleteBanners 批量删除轮播图
|
||||
func (r *BannerRepository) BatchDeleteBanners(ids []uint) error {
|
||||
return r.db.Delete(&model.Banner{}, ids).Error
|
||||
}
|
||||
|
||||
// UpdateBannerStatus 更新轮播图状态
|
||||
func (r *BannerRepository) UpdateBannerStatus(id uint, status int) error {
|
||||
return r.db.Model(&model.Banner{}).Where("id = ?", id).Update("status", status).Error
|
||||
}
|
||||
|
||||
// BatchUpdateBannerStatus 批量更新轮播图状态
|
||||
func (r *BannerRepository) BatchUpdateBannerStatus(ids []uint, status int) error {
|
||||
return r.db.Model(&model.Banner{}).Where("id IN ?", ids).Update("status", status).Error
|
||||
}
|
||||
|
||||
// UpdateBannerSort 更新轮播图排序
|
||||
func (r *BannerRepository) UpdateBannerSort(id uint, sort int) error {
|
||||
return r.db.Model(&model.Banner{}).Where("id = ?", id).Update("sort", sort).Error
|
||||
}
|
||||
|
||||
// BatchUpdateBannerSort 批量更新轮播图排序
|
||||
func (r *BannerRepository) BatchUpdateBannerSort(sortData []map[string]interface{}) error {
|
||||
return r.db.Transaction(func(tx *gorm.DB) error {
|
||||
for _, data := range sortData {
|
||||
if err := tx.Model(&model.Banner{}).
|
||||
Where("id = ?", data["id"]).
|
||||
Update("sort", data["sort"]).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// GetBannersByDateRange 根据日期范围获取轮播图
|
||||
func (r *BannerRepository) GetBannersByDateRange(startDate, endDate time.Time) ([]model.Banner, error) {
|
||||
var banners []model.Banner
|
||||
err := r.db.Where("created_at BETWEEN ? AND ?", startDate, endDate).
|
||||
Order("sort ASC, created_at DESC").
|
||||
Find(&banners).Error
|
||||
return banners, err
|
||||
}
|
||||
|
||||
// GetBannersByStatus 根据状态获取轮播图
|
||||
func (r *BannerRepository) GetBannersByStatus(status int) ([]model.Banner, error) {
|
||||
var banners []model.Banner
|
||||
err := r.db.Where("status = ?", status).
|
||||
Order("sort ASC, created_at DESC").
|
||||
Find(&banners).Error
|
||||
return banners, err
|
||||
}
|
||||
|
||||
// GetBannerCount 获取轮播图总数
|
||||
func (r *BannerRepository) GetBannerCount() (int64, error) {
|
||||
var count int64
|
||||
err := r.db.Model(&model.Banner{}).Count(&count).Error
|
||||
return count, err
|
||||
}
|
||||
|
||||
// GetBannerCountByStatus 根据状态获取轮播图数量
|
||||
func (r *BannerRepository) GetBannerCountByStatus(status int) (int64, error) {
|
||||
var count int64
|
||||
err := r.db.Model(&model.Banner{}).Where("status = ?", status).Count(&count).Error
|
||||
return count, err
|
||||
}
|
||||
|
||||
// GetMaxSort 获取最大排序值
|
||||
func (r *BannerRepository) GetMaxSort() (int, error) {
|
||||
var maxSort int
|
||||
err := r.db.Model(&model.Banner{}).Select("COALESCE(MAX(sort), 0)").Scan(&maxSort).Error
|
||||
return maxSort, err
|
||||
}
|
||||
|
||||
// CheckBannerExists 检查轮播图是否存在
|
||||
func (r *BannerRepository) CheckBannerExists(id uint) (bool, error) {
|
||||
var count int64
|
||||
err := r.db.Model(&model.Banner{}).Where("id = ?", id).Count(&count).Error
|
||||
return count > 0, err
|
||||
}
|
||||
|
||||
// GetExpiredBanners 获取过期的轮播图
|
||||
func (r *BannerRepository) GetExpiredBanners() ([]model.Banner, error) {
|
||||
var banners []model.Banner
|
||||
now := time.Now()
|
||||
err := r.db.Where("end_time IS NOT NULL AND end_time < ? AND status = 1", now).
|
||||
Find(&banners).Error
|
||||
return banners, err
|
||||
}
|
||||
|
||||
// GetActiveBannersWithTimeRange 获取在时间范围内有效的轮播图
|
||||
func (r *BannerRepository) GetActiveBannersWithTimeRange() ([]model.Banner, error) {
|
||||
var banners []model.Banner
|
||||
now := time.Now()
|
||||
err := r.db.Where("status = 1").
|
||||
Where("(start_time IS NULL OR start_time <= ?)"+
|
||||
" AND (end_time IS NULL OR end_time >= ?)", now, now).
|
||||
Order("sort ASC").
|
||||
Find(&banners).Error
|
||||
return banners, err
|
||||
}
|
||||
Reference in New Issue
Block a user