This commit is contained in:
toom1996
2026-09-13 00:52:35 +08:00
parent 10d8a96e8c
commit dbee704c95
44 changed files with 755 additions and 1148 deletions

View File

@ -1,14 +1,21 @@
// Package response 统一 HTTP 响应结构。
//
// 响应形状严格沿用原项目,前端 (src/lib/api.ts、data.ts) 依赖这些字段名:
// - 列表:{ data, last_page } // last_page 供前端真分页(页码导航)使用;total/per_page/current_page 前端无消费点,已移除以精简
// - 详情:{ data }
// 响应形状严格沿用原项目约定,前端依赖这些字段名:
// - 公开列表(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"
import (
"github.com/gin-gonic/gin"
"fashionapi/internal/pkg/pagination"
)
// Data 返回单个对象:{ "data": v }。
func Data(c *gin.Context, status int, v any) {
@ -30,10 +37,11 @@ func DataPreview(c *gin.Context, status int, v any, preview bool, imageTotal int
c.JSON(status, m)
}
// Page 返回分页列表:{ data, last_page }。
// Page 返回分页列表:{ data, last_page },用于 SSG 公开列表(前端仅消费 data 与 last_page)。
//
// 只保留前端真正消费的字段:data(本页数据)与 last_page(总页数,供页码导航)。
// total / current_page / per_page 前端从无读取,移除以精简协议;last_page 仍由后端用 total 与固定 size 计算。
// 运行期不回传 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,
@ -41,21 +49,6 @@ func Page(c *gin.Context, status int, data any, total int64, size int) {
})
}
// 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})
@ -67,16 +60,7 @@ func AbortError(c *gin.Context, status int, msg string) {
}
// LastPage 计算总页数;无数据时返回 1(与原项目一致,避免前端出现 0 页)。
// 实现委托给 pagination.LastPage,避免分页数学在多处重复。
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
return pagination.LastPage(total, size)
}