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 }