package handlers import ( "awesomeProject/internal/common" "awesomeProject/internal/models" "net/http" "strconv" "github.com/gin-gonic/gin" ) // AdminBannerHandler 管理端轮播图处理器 type AdminBannerHandler struct{} // CreateBannerRequest 创建轮播图请求结构体 type CreateBannerRequest struct { Title string `json:"title" binding:"required"` ImageUrl string `json:"image_url" binding:"required"` LinkUrl string `json:"link_url"` Description string `json:"description"` SortOrder int `json:"sort_order"` Status uint8 `json:"status"` } // UpdateBannerRequest 更新轮播图请求结构体 type UpdateBannerRequest struct { Title string `json:"title"` ImageUrl string `json:"image_url"` LinkUrl string `json:"link_url"` Description string `json:"description"` SortOrder int `json:"sort_order"` Status uint8 `json:"status"` } // GetBanners 获取轮播图列表 func (h *AdminBannerHandler) GetBanners(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) // 只有管理员可以查看轮播图管理 if user.SystemRole != 0 { c.JSON(http.StatusOK, common.Error(403, "权限不足")) return } // 分页参数 page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10")) if page < 1 { page = 1 } if pageSize < 1 || pageSize > 100 { pageSize = 10 } db := common.GetDB() var banners []models.Banner var total int64 // 获取总数 db.Model(&models.Banner{}).Count(&total) // 分页查询 offset := (page - 1) * pageSize err := db.Offset(offset).Limit(pageSize).Order("sort_order ASC, created_at DESC").Find(&banners).Error if err != nil { c.JSON(http.StatusOK, common.Error(500, "查询轮播图失败")) return } // 构建返回数据 result := map[string]interface{}{ "list": banners, "total": total, "page": page, "page_size": pageSize, } c.JSON(http.StatusOK, common.Success(result)) } // GetBanner 获取单个轮播图 func (h *AdminBannerHandler) GetBanner(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) // 只有管理员可以查看轮播图详情 if user.SystemRole != 0 { c.JSON(http.StatusOK, common.Error(403, "权限不足")) return } bannerID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "轮播图ID无效")) return } var banner models.Banner if err := common.GetDB().First(&banner, uint(bannerID)).Error; err != nil { c.JSON(http.StatusOK, common.Error(404, "轮播图不存在")) return } c.JSON(http.StatusOK, common.Success(banner)) } // CreateBanner 创建轮播图 func (h *AdminBannerHandler) CreateBanner(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) // 只有管理员可以创建轮播图 if user.SystemRole != 0 { c.JSON(http.StatusOK, common.Error(403, "权限不足")) return } var req CreateBannerRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error())) return } // 创建轮播图对象 newBanner := models.Banner{ Title: req.Title, ImageUrl: req.ImageUrl, LinkUrl: req.LinkUrl, Description: req.Description, SortOrder: req.SortOrder, Status: req.Status, } // 保存轮播图 if err := common.GetDB().Create(&newBanner).Error; err != nil { c.JSON(http.StatusOK, common.Error(500, "创建轮播图失败")) return } c.JSON(http.StatusOK, common.Success(newBanner)) } // UpdateBanner 更新轮播图 func (h *AdminBannerHandler) UpdateBanner(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) // 只有管理员可以更新轮播图 if user.SystemRole != 0 { c.JSON(http.StatusOK, common.Error(403, "权限不足")) return } bannerID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "轮播图ID无效")) return } var req UpdateBannerRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusOK, common.Error(400, "参数错误: "+err.Error())) return } // 检查轮播图是否存在 var existBanner models.Banner if err := common.GetDB().First(&existBanner, uint(bannerID)).Error; err != nil { c.JSON(http.StatusOK, common.Error(404, "轮播图不存在")) return } // 准备更新数据 updateData := models.Banner{ Title: req.Title, ImageUrl: req.ImageUrl, LinkUrl: req.LinkUrl, Description: req.Description, SortOrder: req.SortOrder, Status: req.Status, } // 更新轮播图信息 updateData.ID = uint(bannerID) if err := common.GetDB().Model(&existBanner).Updates(&updateData).Error; err != nil { c.JSON(http.StatusOK, common.Error(500, "更新轮播图失败")) return } // 返回更新后的轮播图信息 var updatedBanner models.Banner common.GetDB().First(&updatedBanner, uint(bannerID)) c.JSON(http.StatusOK, common.Success(updatedBanner)) } // DeleteBanner 删除轮播图 func (h *AdminBannerHandler) DeleteBanner(c *gin.Context) { currentUser, _ := c.Get("current_user") user := currentUser.(models.User) // 只有管理员可以删除轮播图 if user.SystemRole != 0 { c.JSON(http.StatusOK, common.Error(403, "权限不足")) return } bannerID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { c.JSON(http.StatusOK, common.Error(400, "轮播图ID无效")) return } // 检查轮播图是否存在 var banner models.Banner if err := common.GetDB().First(&banner, uint(bannerID)).Error; err != nil { c.JSON(http.StatusOK, common.Error(404, "轮播图不存在")) return } // 删除轮播图 if err := common.GetDB().Delete(&banner).Error; err != nil { c.JSON(http.StatusOK, common.Error(500, "删除轮播图失败")) return } c.JSON(http.StatusOK, common.Success("轮播图删除成功")) }