fix: 全面修复项目问题
后端修复: - 验证码存储与校验机制 - 订单创建事务+库存扣减 - GetStats字段名错误 - VerifyEmail改为POST - 供应商更新字段白名单 - 文件删除安全检查 - 抽奖安全随机数 - 用户管理CRUD - 订单取消/确认收货 - 工单回复 - Toggle返回新数据 - 移除死代码 前端修复: - 404兜底路由 - 401软跳转 - API层统一 - 面包屑补充banners - 国际化完善 - 购物车并行删除 - 退出清理购物车 - 供应商Dashboard数据 - 工单详情页 - 订单取消/确认收货
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
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})
|
||||
}
|
||||
Reference in New Issue
Block a user