package playletser import ( "strconv" "strings" ) const ( seriesOperateType = 2 seriesPageSize = 25 seriesFilterLatest = 1 seriesFilterHot = 2 seriesFilterOrigin = 3 ) var seriesFilters = []struct { Type int Slug string Label string }{ {Type: seriesFilterLatest, Slug: "latest", Label: "最新更新"}, {Type: seriesFilterHot, Slug: "popular", Label: "当前热播"}, {Type: seriesFilterOrigin, Slug: "original", Label: "独家原创"}, } // ParseSeriesQuery 将语义化筛选路由转换为 Swagger 的 operateType/filterType 参数。 func ParseSeriesQuery(filterSlug, pageStr string) (OperateListQuery, bool) { filterType, ok := seriesFilterType(filterSlug) if !ok { return OperateListQuery{}, false } q := OperateListQuery{ OperateType: seriesOperateType, FilterType: filterType, PageSize: seriesPageSize, } if page, err := strconv.Atoi(strings.TrimSpace(pageStr)); err == nil { q.PageNum = page } q.Normalize() return q, true } func seriesFilterType(slug string) (int, bool) { slug = strings.TrimSpace(slug) if slug == "" || slug == "latest" { return seriesFilterLatest, true } for _, filter := range seriesFilters { if filter.Slug == slug { return filter.Type, true } } return 0, false } func seriesFilterSlug(filterType int) string { for _, filter := range seriesFilters { if filter.Type == filterType { return filter.Slug } } return "latest" } func seriesPageURL(filterType, pageNum int) string { if pageNum <= 0 { pageNum = 1 } path := "/series" if filterType != seriesFilterLatest { path += "/" + seriesFilterSlug(filterType) } if pageNum > 1 { path += "/page/" + strconv.Itoa(pageNum) } return path + "/" } // SeriesCanonicalPath 返回 AI 成人剧集页唯一规范路径。 func SeriesCanonicalPath(q OperateListQuery) string { q.Normalize() return seriesPageURL(q.FilterType, q.PageNum) } // BuildSeriesFilterTabs 构建 Figma 中的三个运营筛选项。 func BuildSeriesFilterTabs(q OperateListQuery) []FilterChipVM { q.Normalize() out := make([]FilterChipVM, 0, len(seriesFilters)) for _, filter := range seriesFilters { out = append(out, FilterChipVM{ Label: filter.Label, URL: seriesPageURL(filter.Type, 1), Active: q.FilterType == filter.Type, }) } return out } func SeriesSectionTitle(filterType int) string { for _, filter := range seriesFilters { if filter.Type == filterType { return filter.Label + "的AI成人剧集" } } return "最新更新的AI成人剧集" } func BuildSeriesPagination(q OperateListQuery, totalCount int64) PaginationVM { q.Normalize() return BuildPagination(func(page int) string { return seriesPageURL(q.FilterType, page) }, q.PageNum, q.PageSize, totalCount) } // SeriesPathFromLegacyList 将原 /list/ai-series 排序地址映射到新页面。 func SeriesPathFromLegacyList(sortOrder, pageNum int) string { filterType := seriesFilterLatest if sortOrder == sortHeat { filterType = seriesFilterHot } return seriesPageURL(filterType, pageNum) }