229 lines
5.9 KiB
Go
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("轮播图删除成功"))
|
|
} |