Files
ai_dianshang/server/internal/handler/admin_banner.go

383 lines
9.5 KiB
Go
Raw Normal View History

2025-11-17 14:11:46 +08:00
package handler
import (
"dianshang/internal/model"
"dianshang/internal/service"
"dianshang/pkg/response"
"strconv"
"time"
"github.com/gin-gonic/gin"
)
// AdminBannerHandler 管理员轮播图处理器
type AdminBannerHandler struct {
bannerService *service.BannerService
}
// NewAdminBannerHandler 创建管理员轮播图处理器
func NewAdminBannerHandler(bannerService *service.BannerService) *AdminBannerHandler {
return &AdminBannerHandler{
bannerService: bannerService,
}
}
// GetBannerList 获取轮播图列表
func (h *AdminBannerHandler) GetBannerList(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "10"))
statusStr := c.Query("status")
var status *int
if statusStr != "" {
statusInt, err := strconv.Atoi(statusStr)
if err == nil {
status = &statusInt
}
}
banners, total, err := h.bannerService.GetBannerList(page, pageSize, status)
if err != nil {
response.Error(c, response.ERROR)
return
}
response.Page(c, banners, total, page, pageSize)
}
// GetBannerDetail 获取轮播图详情
func (h *AdminBannerHandler) GetBannerDetail(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, "轮播图ID格式错误")
return
}
banner, err := h.bannerService.GetBannerByID(uint(id))
if err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, banner)
}
// CreateBanner 创建轮播图
func (h *AdminBannerHandler) CreateBanner(c *gin.Context) {
var req struct {
Title string `json:"title" binding:"required"`
Image string `json:"image" binding:"required"`
LinkType int `json:"link_type"`
LinkValue string `json:"link_value"`
Sort int `json:"sort"`
Status int `json:"status"`
StartTime *time.Time `json:"start_time"`
EndTime *time.Time `json:"end_time"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, err.Error())
return
}
banner := &model.Banner{
Title: req.Title,
Image: req.Image,
LinkType: req.LinkType,
LinkValue: req.LinkValue,
Sort: req.Sort,
Status: req.Status,
StartTime: req.StartTime,
EndTime: req.EndTime,
}
if err := h.bannerService.CreateBanner(banner); err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, banner)
}
// UpdateBanner 更新轮播图
func (h *AdminBannerHandler) UpdateBanner(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, "轮播图ID格式错误")
return
}
var req struct {
Title string `json:"title"`
Image string `json:"image"`
LinkType int `json:"link_type"`
LinkValue string `json:"link_value"`
Sort int `json:"sort"`
Status int `json:"status"`
StartTime *time.Time `json:"start_time"`
EndTime *time.Time `json:"end_time"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, err.Error())
return
}
// 获取现有的轮播图
banner, err := h.bannerService.GetBannerByID(uint(id))
if err != nil {
response.Error(c, response.ERROR)
return
}
// 更新字段
if req.Title != "" {
banner.Title = req.Title
}
if req.Image != "" {
banner.Image = req.Image
}
if req.LinkType != 0 {
banner.LinkType = req.LinkType
}
if req.LinkValue != "" {
banner.LinkValue = req.LinkValue
}
if req.Sort != 0 {
banner.Sort = req.Sort
}
banner.Status = req.Status
if req.StartTime != nil {
banner.StartTime = req.StartTime
}
if req.EndTime != nil {
banner.EndTime = req.EndTime
}
if err := h.bannerService.UpdateBanner(uint(id), banner); err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, banner)
}
// DeleteBanner 删除轮播图
func (h *AdminBannerHandler) DeleteBanner(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, "轮播图ID格式错误")
return
}
if err := h.bannerService.DeleteBanner(uint(id)); err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, nil)
}
// UpdateBannerStatus 更新轮播图状态
func (h *AdminBannerHandler) UpdateBannerStatus(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, "轮播图ID格式错误")
return
}
var req struct {
Status int `json:"status" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, err.Error())
return
}
if err := h.bannerService.UpdateBannerStatus(uint(id), req.Status); err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, nil)
}
// BatchUpdateBannerStatus 批量更新轮播图状态
func (h *AdminBannerHandler) BatchUpdateBannerStatus(c *gin.Context) {
var req struct {
IDs []uint `json:"ids" binding:"required"`
Status int `json:"status" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, err.Error())
return
}
if err := h.bannerService.BatchUpdateBannerStatus(req.IDs, req.Status); err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, nil)
}
// BatchDeleteBanners 批量删除轮播图
func (h *AdminBannerHandler) BatchDeleteBanners(c *gin.Context) {
var req struct {
IDs []uint `json:"ids" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, "轮播图ID格式错误")
return
}
if err := h.bannerService.BatchDeleteBanners(req.IDs); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, err.Error())
return
}
response.Success(c, nil)
}
// GetBannerStatistics 获取轮播图统计
func (h *AdminBannerHandler) GetBannerStatistics(c *gin.Context) {
statistics, err := h.bannerService.GetBannerStatistics()
if err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, statistics)
}
// GetBannersByStatus 根据状态获取轮播图
func (h *AdminBannerHandler) GetBannersByStatus(c *gin.Context) {
statusStr := c.Param("status")
status, err := strconv.Atoi(statusStr)
if err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, "状态格式错误")
return
}
banners, err := h.bannerService.GetBannersByStatus(status)
if err != nil {
response.Error(c, response.ERROR)
return
}
response.Success(c, banners)
}
// BatchUpdateBannerSort 批量更新轮播图排序
func (h *AdminBannerHandler) BatchUpdateBannerSort(c *gin.Context) {
var req struct {
Items []struct {
ID uint `json:"id" binding:"required"`
Sort int `json:"sort" binding:"required"`
} `json:"items" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, err.Error())
return
}
for _, item := range req.Items {
if err := h.bannerService.UpdateBannerSort(item.ID, item.Sort); err != nil {
response.ErrorWithMessage(c, response.ERROR, "更新排序失败: "+err.Error())
return
}
}
response.Success(c, nil)
}
// GetBannersByDateRange 根据日期范围获取轮播图
func (h *AdminBannerHandler) GetBannersByDateRange(c *gin.Context) {
startDateStr := c.Query("start_date")
endDateStr := c.Query("end_date")
if startDateStr == "" || endDateStr == "" {
response.BadRequest(c, "开始日期和结束日期不能为空")
return
}
// 解析日期字符串
startDate, err := time.Parse("2006-01-02", startDateStr)
if err != nil {
response.BadRequest(c, "开始日期格式错误应为YYYY-MM-DD")
return
}
endDate, err := time.Parse("2006-01-02", endDateStr)
if err != nil {
response.BadRequest(c, "结束日期格式错误应为YYYY-MM-DD")
return
}
banners, err := h.bannerService.GetBannersByDateRange(startDate, endDate)
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, banners)
}
// CleanExpiredBanners 清理过期轮播图
func (h *AdminBannerHandler) CleanExpiredBanners(c *gin.Context) {
// 先获取过期轮播图统计
stats, err := h.bannerService.GetBannerStatistics()
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
expiredCount := 0
if expired, ok := stats["expired"].(int); ok {
expiredCount = expired
}
// 执行清理
err = h.bannerService.CleanExpiredBanners()
if err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
response.Success(c, map[string]interface{}{
"cleaned_count": expiredCount,
"message": "清理完成",
})
}
// UpdateBannerSort 更新轮播图排序
func (h *AdminBannerHandler) UpdateBannerSort(c *gin.Context) {
var req struct {
Items []struct {
ID uint `json:"id" binding:"required"`
Sort int `json:"sort" binding:"required"`
} `json:"items" binding:"required"`
}
if err := c.ShouldBindJSON(&req); err != nil {
response.ErrorWithMessage(c, response.ERROR_INVALID_PARAMS, err.Error())
return
}
for _, item := range req.Items {
if err := h.bannerService.UpdateBannerSort(item.ID, item.Sort); err != nil {
response.ErrorWithMessage(c, response.ERROR, err.Error())
return
}
}
response.Success(c, nil)
}