Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package playletser
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func formatCollectHeat(n int64) string {
|
|
if n <= 0 {
|
|
return "0 收藏"
|
|
}
|
|
if n < 10000 {
|
|
return fmt.Sprintf("%d 收藏", n)
|
|
}
|
|
v := float64(n) / 10000
|
|
if v >= 100 {
|
|
return fmt.Sprintf("%.0f万 收藏", v)
|
|
}
|
|
return fmt.Sprintf("%.1f万 收藏", v)
|
|
}
|
|
|
|
func rankPageURL(sortOrder, pageNum int) string {
|
|
switch sortOrder {
|
|
case rankSortNew, rankSortBinge:
|
|
default:
|
|
sortOrder = rankSortHot
|
|
}
|
|
if pageNum <= 0 {
|
|
pageNum = 1
|
|
}
|
|
path := "/rank"
|
|
if sortOrder != rankSortHot {
|
|
path += "/" + strconv.Itoa(sortOrder)
|
|
}
|
|
if pageNum > 1 {
|
|
path += "/page/" + strconv.Itoa(pageNum)
|
|
}
|
|
return path + "/"
|
|
}
|
|
|
|
// BuildRankTabs 排行榜 Tab。
|
|
func BuildRankTabs(q RankQuery) []FilterChipVM {
|
|
q.Normalize()
|
|
return []FilterChipVM{
|
|
{Label: "热播榜", URL: rankPageURL(rankSortHot, 1), Active: q.SortOrder == rankSortHot},
|
|
{Label: "新剧榜", URL: rankPageURL(rankSortNew, 1), Active: q.SortOrder == rankSortNew},
|
|
{Label: "追剧榜", URL: rankPageURL(rankSortBinge, 1), Active: q.SortOrder == rankSortBinge},
|
|
}
|
|
}
|
|
|
|
// BuildRankPagination 排行榜分页。
|
|
func BuildRankPagination(q RankQuery, totalCount int64) PaginationVM {
|
|
q.Normalize()
|
|
return BuildPagination(func(p int) string {
|
|
return rankPageURL(q.SortOrder, p)
|
|
}, q.PageNum, q.PageSize, totalCount)
|
|
}
|
|
|
|
// RankCanonicalPath 返回排行榜筛选和分页对应的唯一规范路径。
|
|
func RankCanonicalPath(q RankQuery) string {
|
|
q.Normalize()
|
|
return rankPageURL(q.SortOrder, q.PageNum)
|
|
}
|
|
|
|
// RankOffset 当前页起始排名偏移(0-based)。
|
|
func RankOffset(q RankQuery) int {
|
|
q.Normalize()
|
|
return (q.PageNum - 1) * q.PageSize
|
|
}
|
|
|
|
// ParseRankQuery 从 query 解析排行榜参数。
|
|
func ParseRankQuery(pageStr, sortStr string) RankQuery {
|
|
q := RankQuery{PageSize: defaultRankPageSize, SortOrder: rankSortHot}
|
|
if n, err := strconv.Atoi(strings.TrimSpace(pageStr)); err == nil {
|
|
q.PageNum = n
|
|
}
|
|
if n, err := strconv.Atoi(strings.TrimSpace(sortStr)); err == nil {
|
|
q.SortOrder = n
|
|
}
|
|
q.Normalize()
|
|
return q
|
|
}
|
|
|
|
// IsRankBinge 是否追剧榜(热度展示用 countCollect)。
|
|
func IsRankBinge(sortOrder int) bool {
|
|
return sortOrder == rankSortBinge
|
|
}
|