- 原生 Next.js App Router + 严格 TypeScript 实现花魁短剧 PC/H5 页面,按 src/features/{catalog,content,playback} 组织,保留完整 SEO(metadata、JSON-LD、canonical、robots、llms、sitemap、IndexNow)。
- 主域名通过 SITE_URL=https://huakuidj.com 强制覆盖后端 foreverUrlAddr(config/*.env、src/server/config.ts、src/server/seo/shared.ts、src/server/services/shared.ts),支持邮箱改为 support@huakuidj.com。
- 移除登录与账户体系:删除 /account 全部页面、登录/注册/充值弹窗、收藏点赞、评论、金币解锁及对应 BFF 接口;旧账户地址 GET/HEAD 统一 301 到首页(src/lib/routes.ts REMOVED_ACCOUNT_PATHS),保留游客会话、反馈、图片上传、观看上报与搜索联想。
- 播放页:评论位改为同类推荐 + 热播榜单,锁定集改为 App 观看遮罩与底部弹层,新增简介标签、分集图例与独立视觉皮肤(src/features/playback、src/styles/pages/playback.css)。
- 卡片:短剧/视频卡状态与时长移至信息行胶囊标签,封面角标移至左上角(src/components/catalog/Cards.tsx、src/styles/foundations/base.css)。
- 同步更新单元测试、浏览器冒烟脚本、路由清单与 README。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
import { Icon } from "@/components/ui/Icon";
|
|
import {
|
|
array,
|
|
externalProps,
|
|
get,
|
|
str,
|
|
type CatalogRecord,
|
|
} from "@/features/catalog/model";
|
|
export function Pagination({
|
|
pagination,
|
|
}: {
|
|
pagination: CatalogRecord | undefined;
|
|
}) {
|
|
if (!pagination || !get(pagination, "Visible")) return null;
|
|
const previous = !!get(pagination, "HasPrev"),
|
|
next = !!get(pagination, "HasNext");
|
|
const arrow = (forward = false) => (
|
|
<>
|
|
<Icon name="chevron-right" />
|
|
<span className="hk-visually-hidden">{forward ? "下一页" : "上一页"}</span>
|
|
</>
|
|
);
|
|
return (
|
|
<nav className="hk-pagination" aria-label="分页">
|
|
{previous ? (
|
|
<a
|
|
className="hk-pagination__btn hk-pagination__btn--prev"
|
|
href={str(pagination, "PrevURL")}
|
|
{...externalProps(get(pagination, "PrevURL"))}
|
|
aria-label="上一页"
|
|
>
|
|
{arrow()}
|
|
</a>
|
|
) : (
|
|
<span
|
|
className="hk-pagination__btn hk-pagination__btn--prev hk-is-disabled"
|
|
aria-disabled="true"
|
|
>
|
|
{arrow()}
|
|
</span>
|
|
)}
|
|
{array(get(pagination, "Items")).map((item, index) =>
|
|
get(item, "Dots") ? (
|
|
<span key={index} className="hk-pagination__ellipsis" aria-hidden="true">
|
|
{str(item, "Label")}
|
|
</span>
|
|
) : (
|
|
<a
|
|
key={index}
|
|
className={`hk-pagination__page${get(item, "Active") ? " hk-is-active" : ""}`}
|
|
href={str(item, "URL")}
|
|
{...externalProps(get(item, "URL"))}
|
|
aria-current={get(item, "Active") ? "page" : undefined}
|
|
>
|
|
{str(item, "Label")}
|
|
</a>
|
|
),
|
|
)}
|
|
{next ? (
|
|
<a
|
|
className="hk-pagination__btn"
|
|
href={str(pagination, "NextURL")}
|
|
{...externalProps(get(pagination, "NextURL"))}
|
|
aria-label="下一页"
|
|
>
|
|
{arrow(true)}
|
|
</a>
|
|
) : (
|
|
<span className="hk-pagination__btn hk-is-disabled" aria-disabled="true">
|
|
{arrow(true)}
|
|
</span>
|
|
)}
|
|
{str(pagination, "TotalText") && (
|
|
<span className="hk-pagination__total">
|
|
{str(pagination, "TotalText")}
|
|
</span>
|
|
)}
|
|
</nav>
|
|
);
|
|
}
|