[Ai] feat: 花魁短剧 Next.js 站点初始提交

- 原生 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>
This commit is contained in:
谢宇宁
2026-10-16 11:33:31 +07:00
co-authored by Claude Opus 5.5
commit d2ddb1c321
423 changed files with 52152 additions and 0 deletions
+286
View File
@@ -0,0 +1,286 @@
[
[
"/",
"Index"
],
[
"/search-mobile/",
"SearchMobile"
],
[
"/search/",
"Search"
],
[
"/search/:q/",
"Search"
],
[
"/search/:q/page/:page/",
"Search"
],
[
"/profile/",
"Profile"
],
[
"/history/",
"History"
],
[
"/history/page/:page/",
"History"
],
[
"/favorites/",
"Favorites"
],
[
"/favorites/page/:page/",
"Favorites"
],
[
"/favorites/:filter/",
"Favorites"
],
[
"/favorites/:filter/page/:page/",
"Favorites"
],
[
"/purchased/",
"PurchasedSeries"
],
[
"/purchased/page/:page/",
"PurchasedSeries"
],
[
"/setting/",
"Setting"
],
[
"/recharge/",
"Recharge"
],
[
"/about/",
"About"
],
[
"/help/",
"Help"
],
[
"/terms/",
"Terms"
],
[
"/privacy/",
"Privacy"
],
[
"/2257/",
"Compliance2257"
],
[
"/dmca/",
"DMCA"
],
[
"/download-app/",
"DownloadApp"
],
[
"/nav/",
"Nav"
],
[
"/dh/",
"Nav"
],
[
"/list/",
"List"
],
[
"/list/:theme/",
"List"
],
[
"/list/:theme/:updateStatus/:sortType/",
"List"
],
[
"/list/:theme/:updateStatus/:sortType/page/:page/",
"List"
],
[
"/more-list/:configId/:timeRange/:theme/page/:page/",
"MoreList"
],
[
"/more-list/:configId/:timeRange/:theme/",
"MoreList"
],
[
"/more-list/:configId/page/:page/",
"MoreList"
],
[
"/more-list/:configId/",
"MoreList"
],
[
"/more-series-list/:configId/:timeRange/:theme/page/:page/",
"MoreSeriesList"
],
[
"/more-series-list/:configId/:timeRange/:theme/",
"MoreSeriesList"
],
[
"/more-series-list/:configId/page/:page/",
"MoreSeriesList"
],
[
"/more-series-list/:configId/",
"MoreSeriesList"
],
[
"/series/",
"Series"
],
[
"/series/:media/:topic/:sortType/",
"Series"
],
[
"/series/:media/:topic/:sortType/page/:page/",
"Series"
],
[
"/topic/",
"Topic"
],
[
"/topic/page/:page/",
"Topic"
],
[
"/topic/sort/:sortType/",
"Topic"
],
[
"/topic/sort/:sortType/page/:page/",
"Topic"
],
[
"/topic-detail/:slug/sort/:sortType/page/:page/",
"TopicDetail"
],
[
"/topic-detail/:slug/sort/:sortType/",
"TopicDetail"
],
[
"/topic-detail/:slug/page/:page/",
"TopicDetail"
],
[
"/topic-detail/:slug/",
"TopicDetail"
],
[
"/rank/",
"Rank"
],
[
"/rank/page/:page/",
"Rank"
],
[
"/rank/:sortOrder/",
"Rank"
],
[
"/rank/:sortOrder/page/:page/",
"Rank"
],
[
"/tags/:slug/sort/:sortType/page/:page/",
"Tags"
],
[
"/tags/:slug/sort/:sortType/",
"Tags"
],
[
"/tags/:slug/page/:page/",
"Tags"
],
[
"/tags/:slug/",
"Tags"
],
[
"/recently-added/",
"RecentlyAdded"
],
[
"/recently-added/page/:page/",
"RecentlyAdded"
],
[
"/popular-recommend/",
"PopularRecommend"
],
[
"/popular-recommend/page/:page/",
"PopularRecommend"
],
[
"/popular-recommend/:rankType/",
"PopularRecommend"
],
[
"/popular-recommend/:rankType/page/:page/",
"PopularRecommend"
],
[
"/play/:slug/",
"Play"
],
[
"/play/:slug/:ep/",
"Play"
],
[
"/play/:slug/recommendations/page/:guessPage/",
"Play"
],
[
"/play/:slug/:ep/recommendations/page/:guessPage/",
"Play"
],
[
"/series-play/:slug/",
"SeriesPlay"
],
[
"/series-play/:slug/recommendations/page/:guessPage/",
"SeriesPlay"
],
[
"/login/",
"LoginPage"
],
[
"/register/",
"RegisterPage"
],
[
"/feedback/",
"Feedback"
]
]
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+1
View File
@@ -0,0 +1 @@
{"metaTitle": "花魁 & \"标题\" <test>", "metaDescription": "短剧'说明 & 安全", "trackerAppId": "app'\"</script>", "pageKey": "tags", "pageName": "标签", "siteName": "花魁", "siteURL": "https://drama.example", "canonicalURL": "https://drama.example/tags/", "ogType": "website", "robots": "index, follow", "appConfig": {"ReportSDKConfig": ""}, "listCount": "共 1 部", "list": [{"id": 1, "slug": "热门 剧", "playName": "花魁 & 第一部", "title": "花魁", "cover": "https://example.com/图片?a=1&b=2", "totalEpisode": 4, "updateStatus": 2, "tagNames": ["都市"], "tagSlugs": ["都市"], "tagIds": [2]}], "tagSlug": "", "tagId": 0, "sortType": 1}
+717
View File
@@ -0,0 +1,717 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>花魁 &amp; &#34;标题&#34; &lt;test&gt;</title>
<meta name="description" content="短剧&#39;说明 &amp; 安全">
<meta name="robots" content="index, follow">
<meta name="googlebot" content="index, follow">
<meta name="google-site-verification" content="VEhl0na6ZwYZgkdcdz8BcCR4LpYGFm97zbp62YqJHX4">
<meta name="yandex-verification" content="56acf08532be3060">
<meta name="yandex-verification" content="acaf652efa6cd920">
<meta name="msvalidate.01" content="57A5999E9B5167EE9039265EBCA2AE3A">
<link rel="canonical" href="https://drama.example/tags/">
<meta property="og:locale" content="zh_CN">
<meta property="og:type" content="website">
<meta property="og:site_name" content="花魁">
<meta property="og:title" content="花魁 &amp; &#34;标题&#34; &lt;test&gt;">
<meta property="og:description" content="短剧&#39;说明 &amp; 安全">
<meta property="og:url" content="https://drama.example/tags/">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="花魁 &amp; &#34;标题&#34; &lt;test&gt;">
<meta name="twitter:description" content="短剧&#39;说明 &amp; 安全">
<link rel="icon" href="/static/favicon.svg?v=huakui-20261010" type="image/svg+xml" sizes="any">
<link rel="icon" href="/static/favicon.png?v=huakui-20261010" type="image/png">
<link rel="apple-touch-icon" href="/static/favicon.png?v=huakui-20261010">
<script src="/static/js/common/channel.js?v=huakui-20261010"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-Z582WY8LN9"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-Z582WY8LN9');
</script>
<script type="text/javascript">
(function(m,e,t,r,i,k,a){
m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)
})(window, document,'script','https://mc.yandex.ru/metrika/tag.js?id=112951899', 'ym');
ym(112951899, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true});
</script>
<script>
window.__TRACKER_BOOT__ = {
appId: "app\u0027\u0022\u003c\/script\u003e",
encryptedConfig: "",
appVersion: "1.0.0",
pageKey: "tags",
pageName: "标签",
userType: "normal"
};
</script>
<script defer src="/static/common/web-sdk-v1.2.0.js?v=huakui-20261010"></script>
<script defer src="/static/js/tracker.js?v=huakui-20261010"></script>
<link rel="stylesheet" href="/static/css/base.css?v=huakui-20261010">
<link rel="stylesheet" href="/static/css/list.css?v=huakui-20261010">
<link rel="stylesheet" href="/static/css/tags.css?v=huakui-20261010">
</head>
<body class="page-list page-tags">
<link rel="stylesheet" href="/static/css/header.css?v=huakui-20261010">
<header class="site-header">
<div class="site-header__left">
<button class="site-header__icon-btn only-h5" type="button" aria-label="菜单" data-drawer-open>
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/menu.svg?v=huakui-20261010" alt="菜单">
</button>
<a class="brand" href="/" data-navigation-key="home" data-navigation-name="首页">
<picture>
<source media="(max-width: 768px)" srcset="/static/brand/mobile.svg?v=huakui-20261010">
<img class="brand__logo" src="/static/brand/header.svg?v=huakui-20261010" width="104" height="36" alt="花魁短剧">
</picture>
</a>
<nav class="nav only-pc" aria-label="主导航">
</nav>
</div>
<div class="site-header__right">
<form class="search only-pc" action="/search/" method="get" role="search" data-path-search data-header-search>
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/search.svg?v=huakui-20261010" alt="搜索">
<input class="search__input" type="search" placeholder="搜索剧名 / 演员 / 标签" autocomplete="off" data-header-search-input aria-autocomplete="list" aria-expanded="false" aria-controls="header-search-dropdown">
<button class="search__clear" type="button" aria-label="清除搜索词" data-header-search-clear hidden>
<img decoding="async" loading="lazy" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/close.svg?v=huakui-20261010" alt="关闭">
</button>
<div class="search-dropdown" id="header-search-dropdown" data-header-search-dropdown hidden>
<div class="search-dropdown__idle" data-header-search-idle>
<section class="search-dropdown__history" aria-label="搜索历史" data-header-search-history hidden>
<div class="search-dropdown__head">
<h2 class="search-dropdown__label">搜索历史</h2>
<button class="search-dropdown__clear" type="button" aria-label="清除搜索历史" data-header-history-clear>
<img decoding="async" loading="lazy" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/close.svg?v=huakui-20261010" alt="清除">
</button>
</div>
<div class="search-dropdown__chips" data-header-history-chips></div>
</section>
</div>
<div class="search-dropdown__suggest" data-header-search-suggest hidden aria-label="搜索联想"></div>
</div>
</form>
<a class="site-header__icon-btn only-h5" href="/search-mobile/" aria-label="搜索" data-navigation-key="header_search" data-navigation-name="搜索">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/search_h5.svg?v=huakui-20261010" alt="搜索">
</a>
<a class="btn btn--ghost site-header__download" data-download-open href="/download-app/" data-navigation-key="header_download" data-navigation-name="下载 APP">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/download.svg?v=huakui-20261010" alt="下载">
<span>下载 App</span>
</a>
<button class="btn btn--primary site-header__login" type="button" data-login-open>登录</button>
</div>
</header>
<div class="drawer" data-drawer>
<div class="drawer__mask" data-drawer-close></div>
<aside class="drawer__panel" id="site-drawer" role="dialog" aria-modal="true" aria-label="侧边导航">
<div class="drawer__head">
<div class="drawer__brand-row">
<a class="brand" href="/" data-navigation-key="drawer_home" data-navigation-name="首页">
<img class="brand__logo" src="/static/brand/mobile.svg?v=huakui-20261010" width="88" height="28" alt="花魁短剧">
</a>
<button class="drawer__close" type="button" aria-label="关闭" data-drawer-close>
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/close.svg?v=huakui-20261010" alt="关闭">
</button>
</div>
<button class="drawer__user drawer__user--login" type="button" data-login-open>
<img decoding="async" loading="lazy" class="drawer__avatar" src="/static/brand/placeholder.svg?v=huakui-20261010" alt="默认用户头像">
<div class="drawer__user-info">
<strong>登录 / 注册</strong>
<span class="drawer__coin">登录后同步收藏与进度</span>
</div>
<img decoding="async" loading="lazy" class="icon icon--sm drawer__user-arrow" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/chevron-right.svg?v=huakui-20261010" alt="前往下一项">
</button>
</div>
<hr class="drawer__rule">
<nav class="drawer__nav" aria-label="页面导航">
</nav>
<hr class="drawer__rule">
<div class="drawer__tags">
<p class="drawer__tags-label">题材</p>
<div class="drawer__tag-list">
</div>
</div>
<div class="drawer__links">
<a class="drawer__link" href="/favorites/" data-navigation-key="drawer_favorites" data-navigation-name="我的收藏">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/menu_sc.svg?v=huakui-20261010" alt="我的收藏">
我的收藏
</a>
<a class="drawer__link" href="/history/" data-navigation-key="drawer_history" data-navigation-name="观看历史">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/menu_gkls.svg?v=huakui-20261010" alt="观看历史">
观看历史
</a>
</div>
<div class="drawer__foot">
<a class="btn btn--ghost drawer__download" data-download-open href="/download-app/" data-navigation-key="drawer_download" data-navigation-name="下载 APP">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/download.svg?v=huakui-20261010" alt="下载">
下载 App
</a>
</div>
</aside>
</div>
<script defer src="/static/js/common/cookie.js?v=huakui-20261010"></script>
<script defer src="/static/js/common/request.js?v=huakui-20261010"></script>
<script defer src="/static/js/common/auth.js?v=huakui-20261010"></script>
<script defer src="/static/common/imgDecypt.js?v=huakui-20261010"></script>
<script defer src="/static/js/header.js?v=huakui-20261010"></script>
<script defer src="/static/js/pages/loginPop.js?v=huakui-20261010"></script>
<script defer src="/static/js/pages/registerPop.js?v=huakui-20261010"></script>
<link rel="stylesheet" href="/static/css/eighteen.css?v=huakui-20261010">
<script>
(function () {
try {
if (localStorage.getItem("hg_age_ok") === "1") {
document.documentElement.classList.add("eighteen-ok");
}
} catch (e) {}
})();
</script>
<div class="eighteen" data-eighteen role="dialog" aria-modal="true" aria-labelledby="eighteen-title">
<div class="eighteen__mask" aria-hidden="true"></div>
<div class="eighteen__dialog">
<div class="eighteen__badge" aria-hidden="true">18+</div>
<h2 class="eighteen__title" id="eighteen-title">年龄确认</h2>
<p class="eighteen__desc">本网站部分内容仅适合成年人观看。点击继续即表示您确认您已年满 18 岁,或在您访问本网站时所在的司法管辖区已是成年人。</p>
<button class="btn btn--primary eighteen__enter" type="button" data-eighteen-enter>
我已年满 18 岁,进入
</button>
<button class="eighteen__exit" type="button" data-eighteen-exit>
我未满 18 岁,退出
</button>
</div>
</div>
<script src="/static/js/eighteen.js?v=huakui-20261010" defer></script>
<link rel="stylesheet" href="/static/css/loginPop.css?v=huakui-20261010">
<div
class="login-pop"
data-login-pop
role="dialog"
aria-modal="true"
aria-labelledby="login-pop-title"
>
<div class="login-pop__mask" data-login-close aria-hidden="true"></div>
<div class="login-pop__panel">
<button class="login-pop__close" type="button" data-login-close aria-label="关闭">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/close.svg?v=huakui-20261010" alt="关闭">
</button>
<div class="login-pop__intro">
<h2 class="login-pop__title" id="login-pop-title" data-login-title>登录花魁短剧</h2>
<p class="login-pop__desc" data-login-desc>登录后可收藏作品、解锁付费剧集并查看观看历史</p>
</div>
<form
class="login-pop__form"
action="/api/auth/login"
method="post"
data-login-form
novalidate
>
<label class="login-pop__field" data-field="account">
<span class="login-pop__label">账号</span>
<span class="login-pop__control">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/user.svg?v=huakui-20261010" alt="用户" aria-hidden="true">
<input
class="login-pop__input"
type="text"
name="account"
autocomplete="username"
placeholder="请输入账号"
maxlength="16"
required
>
</span>
<span class="login-pop__error" data-field-error="account" hidden>
<img decoding="async" loading="lazy" class="login-pop__error-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" aria-hidden="true">
<span data-field-error-text></span>
</span>
</label>
<label class="login-pop__field" data-field="password">
<span class="login-pop__label">密码</span>
<span class="login-pop__control">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/lock-dim.svg?v=huakui-20261010" alt="密码" aria-hidden="true">
<input
class="login-pop__input"
type="password"
name="password"
autocomplete="current-password"
placeholder="请输入登录密码"
maxlength="16"
data-login-password
required
>
<button class="login-pop__toggle" type="button" data-login-toggle aria-label="显示密码">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/eye.svg?v=huakui-20261010" alt="显示或隐藏密码" data-login-toggle-icon>
</button>
</span>
<span class="login-pop__error" data-field-error="password" hidden>
<img decoding="async" loading="lazy" class="login-pop__error-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" aria-hidden="true">
<span data-field-error-text></span>
</span>
</label>
<div class="login-pop__meta">
<label class="login-pop__remember">
<input class="login-pop__checkbox" type="checkbox" name="remember" checked>
<span class="login-pop__check" aria-hidden="true"></span>
<span>记住登录状态</span>
</label>
</div>
<button class="btn btn--primary login-pop__submit" type="submit" data-login-submit>登录</button>
</form>
<p class="login-pop__switch"><span>还没有账号?</span><a href="/register/" data-register-open>立即注册</a></p>
<div class="login-pop__rule" aria-hidden="true"></div>
<p class="login-pop__legal">
登录即表示你已年满 18 岁并同意
<a href="/terms/">《用户条款》</a>
与
<a href="/privacy/">《隐私政策》</a>
</p>
</div>
</div>
<link rel="stylesheet" href="/static/css/registerPop.css?v=huakui-20261010">
<div
class="register-pop"
data-register-pop
role="dialog"
aria-modal="true"
aria-labelledby="register-pop-title"
>
<div class="register-pop__mask" data-register-close aria-hidden="true"></div>
<div class="register-pop__panel">
<button class="register-pop__close" type="button" data-register-close aria-label="关闭">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/close.svg?v=huakui-20261010" alt="关闭">
</button>
<div class="register-pop__intro">
<h2 class="register-pop__title" id="register-pop-title">创建账号</h2>
<p class="register-pop__desc">注册后即可解锁付费剧集并收藏作品</p>
</div>
<form
class="register-pop__form"
action="/api/auth/register"
method="post"
data-register-form
novalidate
>
<label class="register-pop__field" data-field="account">
<span class="register-pop__label">账号</span>
<span class="register-pop__control">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/user.svg?v=huakui-20261010" alt="用户" aria-hidden="true">
<input
class="register-pop__input"
type="text"
name="account"
autocomplete="username"
placeholder="6 到 20 位字母或数字"
minlength="6"
maxlength="20"
pattern="[A-Za-z0-9]{6,20}"
required
>
</span>
<span class="register-pop__error" data-field-error="account" hidden>
<img decoding="async" loading="lazy" class="register-pop__error-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" aria-hidden="true">
<span data-field-error-text></span>
</span>
</label>
<label class="register-pop__field" data-field="password">
<span class="register-pop__label">密码</span>
<span class="register-pop__control">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/lock-dim.svg?v=huakui-20261010" alt="密码" aria-hidden="true">
<input
class="register-pop__input"
type="password"
name="password"
autocomplete="new-password"
placeholder="8 位以上,含字母与数字"
minlength="8"
maxlength="64"
data-register-password
required
>
<button class="register-pop__toggle" type="button" data-register-toggle="password" aria-label="显示密码">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/eye.svg?v=huakui-20261010" alt="显示或隐藏密码" data-register-toggle-icon="password">
</button>
</span>
<span class="register-pop__error" data-field-error="password" hidden>
<img decoding="async" loading="lazy" class="register-pop__error-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" aria-hidden="true">
<span data-field-error-text></span>
</span>
</label>
<label class="register-pop__field" data-field="passwordConfirm">
<span class="register-pop__label">确认密码</span>
<span class="register-pop__control">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/lock-dim.svg?v=huakui-20261010" alt="密码" aria-hidden="true">
<input
class="register-pop__input"
type="password"
name="passwordConfirm"
autocomplete="new-password"
placeholder="再次输入密码"
minlength="8"
maxlength="64"
data-register-password-confirm
required
>
<button class="register-pop__toggle" type="button" data-register-toggle="confirm" aria-label="显示密码">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/eye.svg?v=huakui-20261010" alt="显示或隐藏密码" data-register-toggle-icon="confirm">
</button>
</span>
<span class="register-pop__error" data-field-error="passwordConfirm" hidden>
<img decoding="async" loading="lazy" class="register-pop__error-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" aria-hidden="true">
<span data-field-error-text></span>
</span>
</label>
<label class="register-pop__field" data-field="agentInviteCode">
<span class="register-pop__label">邀请码(选填)</span>
<span class="register-pop__control">
<img class="icon" src="/static/images/auth/award.svg?v=huakui-20261010" alt="" aria-hidden="true" width="18" height="18">
<input class="register-pop__input" type="text" name="agentInviteCode" autocomplete="off" placeholder="如有邀请码,请在此填写">
</span>
<span class="register-pop__error" data-field-error="agentInviteCode" hidden><img class="register-pop__error-icon" src="/static/images/error-tip.svg?v=huakui-20261010" alt="" aria-hidden="true"><span data-field-error-text></span></span>
</label>
<label class="register-pop__agree" data-field="agree">
<input class="register-pop__checkbox" type="checkbox" name="agree" required>
<span class="register-pop__check" aria-hidden="true"></span>
<span>
我已年满 18 岁,并同意
<a href="/terms/">《用户条款》</a>
与
<a href="/privacy/">《隐私政策》</a>
</span>
</label>
<span class="register-pop__error" data-field-error="agree" hidden>
<img decoding="async" loading="lazy" class="register-pop__error-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" aria-hidden="true">
<span data-field-error-text></span>
</span>
<button class="btn btn--primary register-pop__submit" type="submit" data-register-submit>注册</button>
</form>
<p class="register-pop__switch">
<span>已有账号?</span>
<a href="/login/" data-login-open>立即登录</a>
</p>
</div>
</div>
<link rel="stylesheet" href="/static/css/downloadPop.css?v=huakui-20261010">
<div
class="download-pop"
data-download-pop
data-app-addr=""
role="dialog"
aria-modal="true"
aria-labelledby="download-pop-title"
>
<div class="download-pop__mask" data-download-close aria-hidden="true"></div>
<div class="download-pop__panel">
<button class="download-pop__close" type="button" data-download-close aria-label="关闭">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/close.svg?v=huakui-20261010" alt="">
</button>
<div class="download-pop__copy">
<h2 class="download-pop__title" id="download-pop-title">下载花魁短剧 App</h2>
<p class="download-pop__desc">点击后前往下载页,手机打开会自动识别设备并推荐安装方式</p>
</div>
<a class="download-pop__download" href="/download-app/">
<img decoding="async" loading="lazy" class="download-pop__download-icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/download.svg?v=huakui-20261010" alt="">
点击下载
</a>
</div>
</div>
<script defer src="/static/js/pages/downloadPop.js?v=huakui-20261010"></script>
<link rel="stylesheet" href="/static/css/installGuide.css?v=huakui-20261010">
<div class="install-guide" data-install-guide hidden>
<div class="install-guide__mask" data-install-close data-download-close aria-hidden="true"></div>
<section class="install-guide__sheet" role="dialog" aria-modal="true" aria-labelledby="install-guide-title" aria-describedby="install-guide-description" tabindex="-1">
<div class="install-guide__handle" aria-hidden="true"><span></span></div>
<header class="install-guide__head">
<div class="install-guide__heading">
<h2 id="install-guide-title">下载花魁短剧 App</h2>
<p id="install-guide-description" data-install-description
data-ios-description="已识别为 iOS 设备,可前往官方下载页查看安装方式"
data-android-description="已识别为 Android 设备,可前往官方下载页查看安装方式">请选择适合当前设备的安装方式</p>
</div>
<button class="install-guide__close" type="button" data-install-close data-download-close aria-label="关闭安装引导"><img src="/static/images/close.svg?v=huakui-20261010" alt="" width="18" height="18"></button>
</header>
<div class="install-guide__tabs" role="tablist" aria-label="iOS 安装方式" data-install-tabs>
<button id="install-guide-store-tab" type="button" role="tab" aria-selected="true" aria-controls="install-guide-store" tabindex="0" data-install-tab="store">商店版</button>
<button id="install-guide-profile-tab" type="button" role="tab" aria-selected="false" aria-controls="install-guide-profile" tabindex="-1" data-install-tab="profile">轻量版</button>
</div>
<div class="install-guide__content" id="install-guide-store" role="tabpanel" aria-labelledby="install-guide-store-tab" data-install-panel="store">
<div class="install-guide__store-card">
<span class="install-guide__store-icon"><img src="/static/images/brand-apple.svg?v=huakui-20261010" alt="" width="20" height="20"></span>
<div class="install-guide__store-copy">
<div class="install-guide__store-title">花魁短剧 App Store 版</div>
<p>前往官方下载页,查看商店版是否可用及当前设备的安装方式</p>
</div>
</div>
<div class="install-guide__step install-guide__store-tip">
<span class="install-guide__badge install-guide__badge--tip">提示</span>
<div class="install-guide__step-copy"><h3>所在地区未上架时</h3><p>请切换到轻量版,用 Safari 安装描述文件</p></div>
</div>
<p class="install-guide__notice"><img src="/static/images/install/notice.svg?v=huakui-20261010" alt="" width="14" height="14"><span>需登录 App Store 账号;若显示「不可用」,请返回选择轻量版</span></p>
<a class="install-guide__action" data-install-action="store" data-navigation-key="install_ios_store" data-navigation-name="前往下载页" href="/download-app/" target="_blank" rel="sponsored nofollow noopener">
<img src="/static/images/install/external-link.svg?v=huakui-20261010" alt="" width="20" height="20"><span>前往下载页</span>
</a>
</div>
<div class="install-guide__content" id="install-guide-profile" role="tabpanel" aria-labelledby="install-guide-profile-tab" data-install-panel="profile" hidden>
<ol class="install-guide__steps">
<li class="install-guide__step"><span class="install-guide__badge">1</span><div class="install-guide__step-copy"><h3>前往官方下载页</h3><p>用 Safari 打开本页,点击「前往下载页」,查看轻量版是否可用及安装说明</p></div></li>
<li class="install-guide__step"><span class="install-guide__badge">2</span><div class="install-guide__step-copy"><h3>安装描述文件</h3><p>前往 设置 / 已下载描述文件,选择「安装」并输入密码</p></div></li>
<li class="install-guide__step"><span class="install-guide__badge">3</span><div class="install-guide__step-copy"><h3>返回桌面打开</h3><p>桌面出现花魁短剧图标即安装完成,建议保存账号凭证</p></div></li>
</ol>
<p class="install-guide__notice"><img src="/static/images/install/notice.svg?v=huakui-20261010" alt="" width="14" height="14"><span>仅支持 Safari;若在微信 / Telegram 内打开,请先点右上角「在浏览器中打开」</span></p>
<a class="install-guide__action" data-install-action="profile" data-navigation-key="install_ios_profile" data-navigation-name="前往下载页" href="/download-app/" target="_blank" rel="sponsored nofollow noopener"><img src="/static/images/brand-apple.svg?v=huakui-20261010" alt="" width="20" height="20"><span>前往下载页</span></a>
</div>
<div class="install-guide__content" id="install-guide-android" data-install-panel="android" hidden>
<ol class="install-guide__steps">
<li class="install-guide__step"><span class="install-guide__badge">1</span><div class="install-guide__step-copy"><h3>前往官方下载页</h3><p>点击「前往下载页」,查看 Android 安装包及适用于当前设备的安装说明</p></div></li>
<li class="install-guide__step"><span class="install-guide__badge">2</span><div class="install-guide__step-copy"><h3>允许安装未知来源</h3><p>系统提示「禁止安装来源不明的应用」时,点击「设置」开启允许</p></div></li>
<li class="install-guide__step"><span class="install-guide__badge">3</span><div class="install-guide__step-copy"><h3>打开花魁短剧</h3><p>安装完成后点击「打开」,或在桌面找到花魁短剧图标</p></div></li>
</ol>
<p class="install-guide__notice"><img src="/static/images/install/notice.svg?v=huakui-20261010" alt="" width="14" height="14"><span>如系统提示风险,请核实安装包来源后再继续</span></p>
<a class="install-guide__action" data-install-action="android" data-navigation-key="install_android_apk" data-navigation-name="前往下载页" href="/download-app/" target="_blank" rel="sponsored nofollow noopener"><img src="/static/images/brand-android.svg?v=huakui-20261010" alt="" width="20" height="20"><span>前往下载页</span></a>
</div>
</section>
</div>
<script defer src="/static/js/components/install-guide.js?v=huakui-20261010"></script>
<link rel="stylesheet" href="/static/css/toast.css?v=huakui-20261010">
<div
class="site-toast"
id="site-toast"
data-toast
role="status"
aria-live="polite"
aria-atomic="true"
hidden
>
<div class="site-toast__panel" data-toast-panel>
<img decoding="async" loading="lazy" class="site-toast__icon" data-toast-icon-success src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/check-circle.svg?v=huakui-20261010" alt="操作成功" hidden>
<img decoding="async" loading="lazy" class="site-toast__icon" data-toast-icon-error src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/error-tip.svg?v=huakui-20261010" alt="错误提示" hidden>
<p class="site-toast__text" data-toast-text></p>
</div>
</div>
<script defer src="/static/js/common/toast.js?v=huakui-20261010"></script>
<script defer src="/static/js/common/sharePage.js?v=huakui-20261010"></script>
<header class="page-subheader only-h5" aria-label="标签页顶栏">
<a class="page-subheader__btn" href="javascript:history.back()" aria-label="返回">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/chevron-left.svg?v=huakui-20261010" alt="返回">
</a>
<div class="page-subheader__title">标签</div>
<a class="page-subheader__btn" href="/search-mobile/" aria-label="搜索">
<img decoding="async" loading="lazy" class="icon" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/search_h5.svg?v=huakui-20261010" alt="搜索">
</a>
</header>
<div class="page list-page">
<main class="main">
<section class="list-hero list-hero--tags" aria-label="标签频道">
<nav class="breadcrumb only-pc" aria-label="面包屑">
<a class="breadcrumb__item" href="/">首页</a>
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/chevron-right.svg?v=huakui-20261010" alt="前往下一项">
<a class="breadcrumb__item" href="/list/">短剧</a>
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/chevron-right.svg?v=huakui-20261010" alt="前往下一项">
<span class="breadcrumb__item is-current">标签</span>
</nav>
<div class="list-hero__intro">
<p class="eyebrow list-hero__eyebrow">
<span class="eyebrow__bar" aria-hidden="true"></span>
标签
</p>
<h1 class="list-hero__title">标签短剧</h1>
<p class="list-hero__desc"></p>
</div>
</section>
<section class="list-filters" aria-label="筛选">
<div class="filter-row">
<span class="filter-row__label only-pc">排序</span>
<div class="filter-row__options">
<a class="filter-chip is-active" href="/tags/">最新</a>
<a class="filter-chip" href="/tags/sort/2/">最热</a>
<a class="filter-chip" href="/tags/sort/3/">收藏最多</a>
</div>
</div>
</section>
<section class="list-body" aria-label="标签作品">
<h2 class="visually-hidden">标签短剧作品列表</h2>
<p class="list-count">共 1 部</p>
<div class="grid--list">
<article class="card card--list">
<a class="card__cover lazy" href="/play/%E7%83%AD%E9%97%A8%20%E5%89%A7/" style="--cover:url(/static/brand/placeholder.svg)" data-src="https://example.com/%e5%9b%be%e7%89%87?a=1&amp;b=2">
<span class="card__ep">全 4 集</span>
</a>
<h3 class="card__title"><a href="/play/%E7%83%AD%E9%97%A8%20%E5%89%A7/">花魁 &amp; 第一部</a></h3>
<p class="card__meta"><a href="/tags/%E9%83%BD%E5%B8%82/" >都市</a></p>
</article>
</div>
<link rel="stylesheet" href="/static/css/pagination.css?v=huakui-20261010">
</section>
</main>
</div>
<link rel="stylesheet" href="/static/css/footer.css?v=huakui-20261010">
<footer class="site-footer">
<div class="site-footer__inner">
<div class="site-footer__top">
<div class="site-footer__brand">
<div class="brand">
<picture>
<source media="(max-width: 768px)" srcset="/static/brand/header.svg?v=huakui-20261010">
<img class="brand__logo brand__logo--lg" src="/static/brand/footer.svg?v=huakui-20261010" width="124" height="44" alt="花魁短剧">
</picture>
</div>
<p class="block__subtitle">每一帧都值得细看</p>
<div class="social">
</div>
</div>
<div class="site-footer__links">
<nav class="footer-col" aria-label="浏览">
<h3>浏览</h3>
</nav>
<nav class="footer-col" aria-label="帮助">
<h3>帮助</h3>
<a href="/about/" data-navigation-key="footer_about" data-navigation-name="关于我们">关于我们</a>
<a href="/help/" data-navigation-key="footer_help" data-navigation-name="常见问题">常见问题</a>
<a href="/feedback/" data-navigation-key="footer_feedback" data-navigation-name="意见反馈">意见反馈</a>
<a href="" data-navigation-key="footer_contact" data-navigation-name="联系我们">联系我们</a>
</nav>
<nav class="footer-col" aria-label="条款">
<h3>条款</h3>
<a href="/terms/" data-navigation-key="footer_terms" data-navigation-name="用户条款">用户条款</a>
<a href="/privacy/" data-navigation-key="footer_privacy" data-navigation-name="隐私政策">隐私政策</a>
<a href="/2257/" data-navigation-key="footer_2257" data-navigation-name="2257 合规声明">2257 合规声明</a>
<a href="/dmca/" data-navigation-key="footer_dmca" data-navigation-name="DMCA 版权声明">DMCA 版权声明</a>
</nav>
<a class="footer-download-mobile" data-download-open href="/download-app/" data-navigation-key="footer_download_mobile" data-navigation-name="下载 App">下载 App</a>
<div class="footer-download">
<div class="qr-box" aria-label="扫码下载">
<img decoding="async" loading="lazy" src="/static/brand/placeholder.svg?v=huakui-20261010" alt="扫码下载">
</div>
<div class="footer-download__copy">
<strong>扫码下载 App</strong>
<p>iOS / Android 海量短剧每日更新</p>
<a class="btn btn--primary btn--sm" data-download-open href="/download-app/" data-navigation-key="footer_download" data-navigation-name="下载 APP">
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/brand/placeholder.svg?v=huakui-20261010" data-src="/static/images/download.svg?v=huakui-20261010" alt="下载">
下载 App
</a>
</div>
</div>
</div>
</div>
<hr class="site-footer__rule">
<div class="site-footer__legal">
<p>© 2026 花魁短剧 HUAKUI&nbsp; <span class="site-footer__rights">All rights reserved.</span><span class="site-footer__mobile-adult">仅限 18 岁以上成年人</span></p>
<p><span class="site-footer__adult">仅限 18 岁以上成年人&nbsp; </span>本网站所呈现之所有人员,于拍摄当时均已年满 18 岁,符合 18 U.S.C. 第 2257 条规定。</p>
</div>
</div>
</footer>
<noscript><div><img src="https://mc.yandex.ru/watch/112951899" style="position:absolute; left:-9999px;" alt=""></div></noscript>
<script defer src="/static/common/qrcode.min.js?v=huakui-20261010"></script>
<script defer src="/static/js/common/qr.js?v=huakui-20261010"></script>
</body>
</html>