Files
solosw 99b11b04e4 1.0
2026-01-05 14:11:34 +08:00

229 lines
5.9 KiB
Go

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("轮播图删除成功"))
}