This commit is contained in:
toom1996
2026-09-03 19:45:20 +08:00
parent ffe84efc4c
commit b049104a0b
8 changed files with 99 additions and 22 deletions

View File

@ -6,6 +6,7 @@ import (
"strings"
"fashionapi/internal/dto"
"fashionapi/internal/middleware"
"fashionapi/internal/pkg/hashid"
"fashionapi/internal/pkg/response"
"fashionapi/internal/service"
@ -38,7 +39,22 @@ func NewArticleHandler(articles service.ArticleService) *ArticleHandler {
//
// 每篇附带前 ArticleFixedImages=6 张缩略图(服务端固定,不进参数)。
func (h *ArticleHandler) List(c *gin.Context) {
h.respondRunways(c, h.parseListQuery(c))
q := h.parseListQuery(c)
q.Normalize()
list, total, err := h.articles.List(c.Request.Context(), q)
if err != nil {
fail(c, err)
return
}
// 列表首屏对游客完全公开(翻页门槛由 PublicFirstPageAuth 兜底),不做预览截断——
// 「未登录限制」已转移到详情页:每篇图集最多看 PreviewLimit 张图片,列表照常展示全部专辑。
response.Page(c, http.StatusOK, list, total, q.Size)
}
// isAnon 判断请求是否未携带有效登录态(供列表接口做未登录预览截断)。
func isAnon(c *gin.Context) bool {
_, ok := middleware.UserIDFrom(c)
return !ok
}
// parseListQuery 从 query string 解析走秀列表的筛选条件。
@ -62,17 +78,6 @@ func (h *ArticleHandler) parseListQuery(c *gin.Context) dto.ArticleQuery {
return q
}
// respondRunways 统一执行列表查询并回包(分页)。
func (h *ArticleHandler) respondRunways(c *gin.Context, q dto.ArticleQuery) {
q.Normalize()
list, total, err := h.articles.List(c.Request.Context(), q)
if err != nil {
fail(c, err)
return
}
response.Page(c, http.StatusOK, list, total, q.Size)
}
// Detail 走秀详情(含完整图片集)。
//
// GET /api/public/runways/:id
@ -94,5 +99,15 @@ func (h *ArticleHandler) Detail(c *gin.Context) {
fail(c, err)
return
}
response.Data(c, http.StatusOK, detail)
// 未登录:图片集仅返回预览上限(PreviewLimit)张,并打 preview=true,
// 前端据此在详情页展示「登录查看全部图片」门禁;已登录(带有效 Bearer)返回完整图片集。
anon := isAnon(c)
preview := false
imageTotal := len(detail.Images)
if anon && imageTotal > dto.PreviewLimit {
detail.Images = detail.Images[:dto.PreviewLimit]
preview = true
}
response.DataPreview(c, http.StatusOK, detail, preview, imageTotal)
}

View File

@ -44,6 +44,8 @@ func (h *StreetSnapHandler) List(c *gin.Context) {
fail(c, err)
return
}
// 列表首屏对游客完全公开(翻页门槛由 PublicFirstPageAuth 兜底),不做预览截断——
// 「未登录限制」已转移到详情页:每篇图集最多看 PreviewLimit 张图片,列表照常展示全部专辑。
response.Page(c, http.StatusOK, list, total, q.Size)
}
@ -81,5 +83,15 @@ func (h *StreetSnapHandler) Detail(c *gin.Context) {
fail(c, err)
return
}
response.Data(c, http.StatusOK, detail)
// 未登录:图片集仅返回预览上限(PreviewLimit)张,并打 preview=true,
// 前端据此在详情页展示「登录查看全部图片」门禁;已登录(带有效 Bearer)返回完整图片集。
anon := isAnon(c)
preview := false
imageTotal := len(detail.Images)
if anon && imageTotal > dto.PreviewLimit {
detail.Images = detail.Images[:dto.PreviewLimit]
preview = true
}
response.DataPreview(c, http.StatusOK, detail, preview, imageTotal)
}