Files
nuyue 43009ec3b9
Build and Push Docker Image / build-and-push (push) Successful in 1m3s
Build and Push Docker Image / deploy (push) Successful in 7s
feat: add announcement feature with admin management and home page display
2026-07-16 15:28:37 +08:00

123 lines
3.3 KiB
Go

package handlers
import (
"net/http"
"strconv"
"sale/internal/models"
"sale/internal/utils"
"github.com/gin-gonic/gin"
)
type AnnouncementHandler struct{}
func NewAnnouncementHandler() *AnnouncementHandler {
return &AnnouncementHandler{}
}
// List 用户端接口 - 只返回激活的公告
func (h *AnnouncementHandler) List(c *gin.Context) {
var announcements []models.Announcement
utils.DB.Where("is_active = ?", true).
Order("sort_order ASC, created_at DESC").
Find(&announcements)
c.JSON(http.StatusOK, gin.H{"data": announcements})
}
// AdminList 管理端接口 - 返回所有公告
func (h *AnnouncementHandler) AdminList(c *gin.Context) {
var announcements []models.Announcement
utils.DB.Order("sort_order ASC, created_at DESC").Find(&announcements)
c.JSON(http.StatusOK, gin.H{"data": announcements})
}
// Create 创建公告
func (h *AnnouncementHandler) Create(c *gin.Context) {
var req struct {
Title string `json:"title" binding:"required"`
Content string `json:"content"`
SortOrder int `json:"sort_order"`
IsActive bool `json:"is_active"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "标题不能为空"})
return
}
announcement := models.Announcement{
Title: req.Title,
Content: req.Content,
SortOrder: req.SortOrder,
IsActive: req.IsActive,
}
utils.DB.Create(&announcement)
c.JSON(http.StatusCreated, gin.H{"data": announcement})
}
// Update 更新公告
func (h *AnnouncementHandler) Update(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
return
}
var announcement models.Announcement
if err := utils.DB.First(&announcement, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "公告不存在"})
return
}
var req struct {
Title string `json:"title"`
Content string `json:"content"`
SortOrder int `json:"sort_order"`
IsActive bool `json:"is_active"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
return
}
announcement.Title = req.Title
announcement.Content = req.Content
announcement.SortOrder = req.SortOrder
announcement.IsActive = req.IsActive
utils.DB.Save(&announcement)
c.JSON(http.StatusOK, gin.H{"data": announcement})
}
// Delete 删除公告
func (h *AnnouncementHandler) Delete(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
return
}
if err := utils.DB.Delete(&models.Announcement{}, id).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "删除失败"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
}
// ToggleActive 切换激活状态
func (h *AnnouncementHandler) ToggleActive(c *gin.Context) {
id, err := strconv.Atoi(c.Param("id"))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
return
}
var announcement models.Announcement
if err := utils.DB.First(&announcement, id).Error; err != nil {
c.JSON(http.StatusNotFound, gin.H{"error": "公告不存在"})
return
}
announcement.IsActive = !announcement.IsActive
utils.DB.Save(&announcement)
c.JSON(http.StatusOK, gin.H{"data": announcement})
}