67 lines
2.8 KiB
Go
67 lines
2.8 KiB
Go
// 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)
|
||
}
|