123 lines
3.3 KiB
Go
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})
|
|
} |