Files
backend_v2/internal/pkg/response/response.go
toom1996 dbee704c95 update
2026-09-13 00:52:35 +08:00

67 lines
2.8 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 响应结构。
//
// 响应形状严格沿用原项目约定,前端依赖这些字段名:
// - 公开列表(SSG):Page 返回 { data, last_page },last_page 供前端页码导航;
// 运行期不回传 total / current_page / per_page(这些由 SSG 在构建期消费),故此处精简。
// - 「我的资源」列表(history/favorite):经 Data 返回 { items, total, last_page },
// total 供前端显示总数(如「共 N 条」)。
// - 详情:{ data }(可选 preview / image_total 门禁标记,见 DataPreview)
// - 错误:{ error }
//
// 集中在此处定义,避免各 handler 手写 gin.H 时出现字段拼写漂移。
package response
import (
"github.com/gin-gonic/gin"
"fashionapi/internal/pkg/pagination"
)
// 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 },用于 SSG 公开列表(前端仅消费 data 与 last_page)。
//
// 运行期不回传 total / current_page / per_page——这些由 SSG 在构建期消费,调用方无需关心;
// last_page 由后端用 total 与固定 size 计算。
// 注意:history/favorite 这类「我的资源」列表需返回 total,请用 response.Data 自行构造。
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),
})
}
// 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 页)。
// 实现委托给 pagination.LastPage,避免分页数学在多处重复。
func LastPage(total int64, size int) int {
return pagination.LastPage(total, size)
}