Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
83 lines
2.2 KiB
Go
83 lines
2.2 KiB
Go
package web
|
||
|
||
import (
|
||
"net/http"
|
||
"strconv"
|
||
"strings"
|
||
"videoweb/app/service/playletser"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
)
|
||
|
||
// Rank 排行榜页 SSR:GET /api/app/playlet/rank,列表用接口字段渲染。
|
||
func Rank(c *gin.Context) {
|
||
sortOrder := strings.TrimSpace(c.Param("sortOrder"))
|
||
if sortOrder != "" {
|
||
value, err := strconv.Atoi(sortOrder)
|
||
if err != nil || value < 1 || value > 3 {
|
||
NotFound(c, "页面不存在")
|
||
return
|
||
}
|
||
}
|
||
if sortOrder == "" {
|
||
sortOrder = strings.TrimSpace(c.Query("sortOrder"))
|
||
}
|
||
page := strings.TrimSpace(c.Param("page"))
|
||
if page != "" {
|
||
value, err := strconv.Atoi(page)
|
||
if err != nil || value <= 0 {
|
||
NotFound(c, "页面不存在")
|
||
return
|
||
}
|
||
}
|
||
if page == "" {
|
||
page = strings.TrimSpace(c.Query("page"))
|
||
}
|
||
q := playletser.ParseRankQuery(page, sortOrder)
|
||
if c.Query("sortOrder") != "" || c.Query("page") != "" {
|
||
target := "/rank"
|
||
if q.SortOrder != 1 {
|
||
target += "/" + strconv.Itoa(q.SortOrder)
|
||
}
|
||
if q.PageNum > 1 {
|
||
target += "/page/" + strconv.Itoa(q.PageNum)
|
||
}
|
||
target += "/"
|
||
c.Redirect(http.StatusMovedPermanently, target)
|
||
return
|
||
}
|
||
if redirectCanonical(c, playletser.RankCanonicalPath(q)) {
|
||
return
|
||
}
|
||
raw := playletser.FetchRankOrEmpty(c, q)
|
||
if playletser.PageOutOfRange(q.PageNum, q.PageSize, raw.TotalCount) {
|
||
NotFound(c, "页面不存在")
|
||
return
|
||
}
|
||
tabs := playletser.BuildRankTabs(q)
|
||
seoSelections := make([]playletser.SEOSelection, 0, 1)
|
||
for _, tab := range tabs {
|
||
if tab.Active {
|
||
seoSelections = append(seoSelections, playletser.SEOSelection{Dimension: "排行榜类型", Value: tab.Label})
|
||
break
|
||
}
|
||
}
|
||
data := gin.H{
|
||
"title": "排行榜",
|
||
"description": "黄果短剧排行榜实时更新热播短剧,查看热门榜、飙升榜,不错过高口碑必看剧集。",
|
||
"navActive": "rank",
|
||
"seoInfo": raw.SeoInfo,
|
||
"seoSelections": seoSelections,
|
||
"tabs": tabs,
|
||
"list": raw.List,
|
||
"rankOffset": playletser.RankOffset(q),
|
||
"sortOrder": q.SortOrder,
|
||
"isBinge": playletser.IsRankBinge(q.SortOrder),
|
||
"pagination": playletser.BuildRankPagination(q, raw.TotalCount),
|
||
}
|
||
if raw.TotalCount <= 0 || len(raw.List) == 0 {
|
||
setNoIndex(data, true)
|
||
}
|
||
HTMLOK(c, "rank.html", data)
|
||
}
|