// Package response 统一 HTTP 响应结构。 // // 响应形状严格沿用原项目,前端 (src/lib/api.ts、data.ts) 依赖这些字段名: // - 列表:{ data, last_page } // last_page 供前端真分页(页码导航)使用;total/per_page/current_page 前端无消费点,已移除以精简 // - 详情:{ data } // - 错误:{ error } // // 集中在此处定义,避免各 handler 手写 gin.H 时出现字段拼写漂移。 package response import "github.com/gin-gonic/gin" // Data 返回单个对象:{ "data": v }。 func Data(c *gin.Context, status int, v any) { c.JSON(status, gin.H{"data": v}) } // DataPreview 同 Data,但可附加 preview 标记(详情接口对未登录请求截断图片集时 preview=true)。 // // 详情接口对未登录请求只返回预览上限(PreviewLimit)张图片,并打 preview=true, // 前端据此在详情页展示「登录查看全部图片」门禁;已登录(携带有效 Bearer)返回完整图片集,不打标记。 // imageTotal 为图片集的真实总数(截断前),前端用它渲染「剩余 N 张需登录」的占位遮罩, // 避免匿名用户误以为图集只有预览上限那几张。 func DataPreview(c *gin.Context, status int, v any, preview bool, imageTotal int) { m := gin.H{"data": v} if preview { m["preview"] = true } m["image_total"] = imageTotal c.JSON(status, m) } // Page 返回分页列表:{ data, last_page }。 // // 只保留前端真正消费的字段:data(本页数据)与 last_page(总页数,供页码导航)。 // total / current_page / per_page 前端从无读取,移除以精简协议;last_page 仍由后端用 total 与固定 size 计算。 func Page(c *gin.Context, status int, data any, total int64, size int) { c.JSON(status, gin.H{ "data": data, "last_page": LastPage(total, size), }) } // PagePreview 同 Page,但可附加 preview 标记(未登录截断预览时 preview=true)。 // // 列表接口对未登录请求只返回预览上限(PreviewLimit)条数据,并打 preview=true, // 前端据此弹出「登录查看全部」门禁;已登录或总量本就不超上限时不打标记。 func PagePreview(c *gin.Context, status int, data any, total int64, size int, preview bool) { m := gin.H{ "data": data, "last_page": LastPage(total, size), } if preview { m["preview"] = true } c.JSON(status, m) } // Error 返回错误:{ "error": msg }。 func Error(c *gin.Context, status int, msg string) { c.JSON(status, gin.H{"error": msg}) } // AbortError 中断请求并返回错误,供中间件使用。 func AbortError(c *gin.Context, status int, msg string) { c.AbortWithStatusJSON(status, gin.H{"error": msg}) } // LastPage 计算总页数;无数据时返回 1(与原项目一致,避免前端出现 0 页)。 func LastPage(total int64, size int) int { if size <= 0 { return 1 } last := int(total) / size if int(total)%size > 0 { last++ } if last == 0 { last = 1 } return last }