feat: 公告系统 — Phase 2 完成
- Model/Repo/Service/Controller 全栈实现 - CRUD + ListActive(生效时间范围过滤) - 管理后台独立页面 /admin/announcements(列表+弹窗CRUD) - 前台首页 Hero 下方公告栏(info/success/warning/error 四色) - Moderator+ 权限可管理公告
This commit is contained in:
73
internal/repository/announcement_repo.go
Normal file
73
internal/repository/announcement_repo.go
Normal file
@ -0,0 +1,73 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"metazone.cc/mce/internal/model"
|
||||
"metazone.cc/mce/internal/service"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// AnnouncementRepo 公告数据访问
|
||||
type AnnouncementRepo struct {
|
||||
db *gorm.DB
|
||||
}
|
||||
|
||||
// NewAnnouncementRepo 构造函数
|
||||
func NewAnnouncementRepo(db *gorm.DB) *AnnouncementRepo {
|
||||
return &AnnouncementRepo{db: db}
|
||||
}
|
||||
|
||||
// WithTx 基于事务创建新实例
|
||||
func (r *AnnouncementRepo) WithTx(tx *gorm.DB) service.AnnouncementStore {
|
||||
return &AnnouncementRepo{db: tx}
|
||||
}
|
||||
|
||||
// Create 创建公告
|
||||
func (r *AnnouncementRepo) Create(a *model.Announcement) error {
|
||||
return r.db.Create(a).Error
|
||||
}
|
||||
|
||||
// Update 更新公告
|
||||
func (r *AnnouncementRepo) Update(a *model.Announcement) error {
|
||||
return r.db.Save(a).Error
|
||||
}
|
||||
|
||||
// Delete 删除公告
|
||||
func (r *AnnouncementRepo) Delete(id uint) error {
|
||||
return r.db.Delete(&model.Announcement{}, id).Error
|
||||
}
|
||||
|
||||
// FindByID 按 ID 查询
|
||||
func (r *AnnouncementRepo) FindByID(id uint) (*model.Announcement, error) {
|
||||
var a model.Announcement
|
||||
err := r.db.First(&a, id).Error
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &a, nil
|
||||
}
|
||||
|
||||
// List 分页查询全部公告(管理后台用)
|
||||
func (r *AnnouncementRepo) List(offset, limit int) ([]model.Announcement, int64, error) {
|
||||
var total int64
|
||||
if err := r.db.Model(&model.Announcement{}).Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
var list []model.Announcement
|
||||
err := r.db.Order("sort ASC, created_at DESC").Offset(offset).Limit(limit).Find(&list).Error
|
||||
return list, total, err
|
||||
}
|
||||
|
||||
// ListActive 查询当前生效中的公告(前台用,按 sort 排序)
|
||||
func (r *AnnouncementRepo) ListActive() ([]model.Announcement, error) {
|
||||
now := time.Now()
|
||||
var list []model.Announcement
|
||||
err := r.db.Where("is_active = true").
|
||||
Where("start_at IS NULL OR start_at <= ?", now).
|
||||
Where("end_at IS NULL OR end_at >= ?", now).
|
||||
Order("sort ASC, created_at DESC").
|
||||
Find(&list).Error
|
||||
return list, err
|
||||
}
|
||||
Reference in New Issue
Block a user