// Banner 模块:首页轮播图接口 package banner import ( "com.sclktx/m/v2/internal/common/model" "com.sclktx/m/v2/internal/common/response" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // BannerHandler Banner 处理器 type BannerHandler struct { db *gorm.DB } // NewBannerHandler 创建 Banner 处理器 func NewBannerHandler(db *gorm.DB) *BannerHandler { return &BannerHandler{db: db} } // BannerVO Banner 视图对象(只返回前端需要的字段) type BannerVO struct { ImageURL string `json:"image_url"` // 图片地址 JumpPath string `json:"jump_path"` // 跳转链接(空字符串表示不可跳转) IsJump bool `json:"is_jump"` // 是否可跳转 } // @Summary 获取首页轮播图列表 // @Description 获取首页轮播图列表(公开接口) // @Tags 公共 // @Accept json // @Produce json // @Success 200 {object} response.Response{data=[]banner.BannerVO} "success" // @Router /api/v1/banners [get] // GetBanners 获取首页轮播图列表(公开接口) func (h *BannerHandler) GetBanners(c *gin.Context) { var banners []model.Banner if err := h.db.Where("is_valid = ?", true). Order("sort ASC, id DESC"). Find(&banners).Error; err != nil { response.InternalError(c, "查询失败") return } result := make([]BannerVO, 0, len(banners)) for _, b := range banners { result = append(result, BannerVO{ ImageURL: b.ImageURL, JumpPath: b.JumpPath, IsJump: b.IsJump, }) } // 如果没有数据,返回空数组而非 null if result == nil { result = []BannerVO{ { ImageURL: "//mmbiz.qpic.cn/mmbiz_jpg/XekA4rfc3lcLOadSAicKvm3ZXFgn9TtZUOh5tSgaJeQrqs6JhWKfszMHBQhXaicPpgVM09U3dnHBfoEriaM9fKPXYCDvsB2fiaib4TAjXMGV2Ql0/0?from=appmsg", JumpPath: "", IsJump: false, }, } } response.Success(c, result) } // NoticeVO 通知视图对象 type NoticeVO struct { ID uint `json:"id"` Title string `json:"title"` Content string `json:"content"` } // @Summary 获取有效通知列表 // @Description 获取有效通知列表(公开接口) // @Tags 公共 // @Accept json // @Produce json // @Success 200 {object} response.Response{data=[]banner.NoticeVO} "success" // @Router /api/v1/notices [get] // GetNotices 获取有效通知列表(公开接口) func (h *BannerHandler) GetNotices(c *gin.Context) { var notices []model.Notice h.db.Where("is_valid = ?", true).Order("sort ASC, id DESC").Find(¬ices) result := make([]NoticeVO, 0, len(notices)) for _, n := range notices { result = append(result, NoticeVO{ ID: n.ID, Title: n.Title, Content: n.Content, }) } if result == nil { result = []NoticeVO{} } response.Success(c, result) } // RegisterRoutes 注册 Banner 路由(公开接口,无需认证) func (h *BannerHandler) RegisterRoutes(r *gin.RouterGroup) { r.GET("/banners", h.GetBanners) r.GET("/notices", h.GetNotices) }