383 lines
9.5 KiB
Go
383 lines
9.5 KiB
Go
|
|
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)
|
|||
|
|
}
|