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)
|
||
} |