Files
backend_v2/internal/pkg/response/response.go
toom1996 b049104a0b update
2026-09-03 19:45:20 +08:00

83 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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