3a898e8aa0
后端修复: - 验证码存储与校验机制 - 订单创建事务+库存扣减 - GetStats字段名错误 - VerifyEmail改为POST - 供应商更新字段白名单 - 文件删除安全检查 - 抽奖安全随机数 - 用户管理CRUD - 订单取消/确认收货 - 工单回复 - Toggle返回新数据 - 移除死代码 前端修复: - 404兜底路由 - 401软跳转 - API层统一 - 面包屑补充banners - 国际化完善 - 购物车并行删除 - 退出清理购物车 - 供应商Dashboard数据 - 工单详情页 - 订单取消/确认收货
142 lines
3.4 KiB
Go
142 lines
3.4 KiB
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"sale/internal/models"
|
|
"sale/internal/utils"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type BannerHandler struct{}
|
|
|
|
func NewBannerHandler() *BannerHandler {
|
|
return &BannerHandler{}
|
|
}
|
|
|
|
func (h *BannerHandler) List(c *gin.Context) {
|
|
var banners []models.Banner
|
|
utils.DB.Where("is_active = ?", true).
|
|
Order("sort_order ASC, created_at DESC").
|
|
Find(&banners)
|
|
|
|
c.JSON(http.StatusOK, gin.H{"data": banners})
|
|
}
|
|
|
|
func (h *BannerHandler) AdminList(c *gin.Context) {
|
|
var banners []models.Banner
|
|
utils.DB.Order("sort_order ASC, created_at DESC").Find(&banners)
|
|
|
|
c.JSON(http.StatusOK, gin.H{"data": banners})
|
|
}
|
|
|
|
func (h *BannerHandler) Create(c *gin.Context) {
|
|
var req struct {
|
|
Title string `json:"title" binding:"required"`
|
|
Desc string `json:"desc"`
|
|
Image string `json:"image" binding:"required"`
|
|
Link string `json:"link"`
|
|
Button string `json:"button"`
|
|
BgColor string `json:"bg_color"`
|
|
SortOrder int `json:"sort_order"`
|
|
IsActive bool `json:"is_active"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
banner := models.Banner{
|
|
Title: req.Title,
|
|
Desc: req.Desc,
|
|
Image: req.Image,
|
|
Link: req.Link,
|
|
Button: req.Button,
|
|
BgColor: req.BgColor,
|
|
SortOrder: req.SortOrder,
|
|
IsActive: req.IsActive,
|
|
}
|
|
|
|
utils.DB.Create(&banner)
|
|
c.JSON(http.StatusCreated, gin.H{"data": banner})
|
|
}
|
|
|
|
func (h *BannerHandler) Update(c *gin.Context) {
|
|
id, _ := strconv.Atoi(c.Param("id"))
|
|
var banner models.Banner
|
|
if err := utils.DB.First(&banner, id).Error; err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Banner not found"})
|
|
return
|
|
}
|
|
|
|
var req struct {
|
|
Title *string `json:"title"`
|
|
Desc *string `json:"desc"`
|
|
Image *string `json:"image"`
|
|
Link *string `json:"link"`
|
|
Button *string `json:"button"`
|
|
BgColor *string `json:"bg_color"`
|
|
SortOrder *int `json:"sort_order"`
|
|
IsActive *bool `json:"is_active"`
|
|
}
|
|
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
updates := make(map[string]interface{})
|
|
if req.Title != nil {
|
|
updates["title"] = *req.Title
|
|
}
|
|
if req.Desc != nil {
|
|
updates["desc"] = *req.Desc
|
|
}
|
|
if req.Image != nil {
|
|
updates["image"] = *req.Image
|
|
}
|
|
if req.Link != nil {
|
|
updates["link"] = *req.Link
|
|
}
|
|
if req.Button != nil {
|
|
updates["button"] = *req.Button
|
|
}
|
|
if req.BgColor != nil {
|
|
updates["bg_color"] = *req.BgColor
|
|
}
|
|
if req.SortOrder != nil {
|
|
updates["sort_order"] = *req.SortOrder
|
|
}
|
|
if req.IsActive != nil {
|
|
updates["is_active"] = *req.IsActive
|
|
}
|
|
|
|
utils.DB.Model(&banner).Updates(updates)
|
|
c.JSON(http.StatusOK, gin.H{"data": banner})
|
|
}
|
|
|
|
func (h *BannerHandler) Delete(c *gin.Context) {
|
|
id, _ := strconv.Atoi(c.Param("id"))
|
|
if err := utils.DB.Delete(&models.Banner{}, id).Error; err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete banner"})
|
|
return
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"message": "Banner deleted successfully"})
|
|
}
|
|
|
|
func (h *BannerHandler) ToggleActive(c *gin.Context) {
|
|
id, _ := strconv.Atoi(c.Param("id"))
|
|
var banner models.Banner
|
|
if err := utils.DB.First(&banner, id).Error; err != nil {
|
|
c.JSON(http.StatusNotFound, gin.H{"error": "Banner not found"})
|
|
return
|
|
}
|
|
|
|
utils.DB.Model(&banner).Update("is_active", !banner.IsActive)
|
|
utils.DB.First(&banner, id)
|
|
c.JSON(http.StatusOK, gin.H{"data": banner})
|
|
}
|