@@ -0,0 +1,9 @@
|
||||
{{define "accountPagination"}}
|
||||
{{with .paging}}{{if gt .Total 1}}
|
||||
<nav class="account-pagination" aria-label="列表分页">
|
||||
{{if .PrevURL}}<a href="{{.PrevURL}}" {{externalLinkAttrs .PrevURL}}>上一页</a>{{end}}
|
||||
<span>第 {{.Current}} / {{.Total}} 页 · 共 {{.Count}} 部</span>
|
||||
{{if .NextURL}}<a href="{{.NextURL}}" {{externalLinkAttrs .NextURL}}>下一页</a>{{end}}
|
||||
</nav>
|
||||
{{end}}{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,15 @@
|
||||
{{define "ads"}}
|
||||
{{/* 入参为 advitise.detailbannerList 的切片,字段与接口一致:images / link / title
|
||||
类名避免 ads/ad-slot:夸克等浏览器内置广告拦截会隐藏这类选择器 */}}
|
||||
{{if .}}
|
||||
<link rel="stylesheet" href="/static/css/promo.css?v=1">
|
||||
<section class="promo-rail" aria-label="推荐">
|
||||
{{range .}}
|
||||
<a class="promo-card" href="{{if .Link}}{{.Link}}{{else}}#{{end}}" data-track-ad="external"{{if .Link}} data-ad-clickable="1"{{end}} data-ad-id="{{if .AdvertiseCode}}{{.AdvertiseCode}}{{else}}{{.ID}}{{end}}" data-creative-id="" data-ad-location="{{.Location}}" data-ad-slot-key="{{if .AdvertiseLocationCode}}{{.AdvertiseLocationCode}}{{else if .Location}}{{.Location}}{{end}}" data-ad-slot-name="{{if .AdvertiseLocationName}}{{.AdvertiseLocationName}}{{else if .Location}}广告位{{.Location}}{{end}}" data-ad-title="{{if .Title}}{{.Title}}{{else}}推荐{{end}}" data-ad-type="banner"{{if .Link}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="eager" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Images}}" data-lazy-eager="1" alt="{{if .Title}}{{.Title}}{{else}}推荐{{end}}">
|
||||
<span class="tag tag--dark promo-card__tag">广告</span>
|
||||
</a>
|
||||
{{end}}
|
||||
</section>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,64 @@
|
||||
{{define "dialogAd"}}
|
||||
{{if .appConfig.DialogList}}
|
||||
<link rel="stylesheet" href="/static/css/dialogAd.css?v=6" />
|
||||
<div
|
||||
class="dialog-ad-mask"
|
||||
id="dialogAd"
|
||||
data-dialog-ad
|
||||
hidden
|
||||
>
|
||||
{{range $index, $dialog := .appConfig.DialogList}}
|
||||
<div
|
||||
class="dialog-ad-panel"
|
||||
data-dialog-ad-item
|
||||
data-dialog-ad-index="{{$index}}"
|
||||
data-dialog-ad-id="{{if $dialog.AdvertiseCode}}{{$dialog.AdvertiseCode}}{{else}}{{$dialog.ID}}{{end}}"
|
||||
data-track-ad="external-dialog"
|
||||
data-ad-id="{{if $dialog.AdvertiseCode}}{{$dialog.AdvertiseCode}}{{else}}{{$dialog.ID}}{{end}}"
|
||||
data-creative-id=""
|
||||
data-ad-location="{{$dialog.Location}}"
|
||||
data-ad-slot-key="{{if $dialog.AdvertiseLocationCode}}{{$dialog.AdvertiseLocationCode}}{{else if $dialog.Location}}{{$dialog.Location}}{{end}}"
|
||||
data-ad-slot-name="{{if $dialog.AdvertiseLocationName}}{{$dialog.AdvertiseLocationName}}{{else if $dialog.Location}}弹窗广告位{{$dialog.Location}}{{else}}弹窗广告位{{end}}"
|
||||
data-ad-type="interstitial"
|
||||
{{if $dialog.Link}}data-ad-clickable="1"{{end}}
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-label="{{if $dialog.Title}}{{$dialog.Title}}{{else}}广告{{end}}"
|
||||
hidden
|
||||
>
|
||||
<div class="dialog-ad-card">
|
||||
<div class="dialog-ad-cover">
|
||||
{{if $dialog.Link}}
|
||||
<a class="dialog-ad-media" href="{{$dialog.Link}}" target="_blank" rel="sponsored nofollow noopener" aria-label="{{if $dialog.Title}}{{$dialog.Title}}{{else}}查看广告{{end}}" data-dialog-ad-link>
|
||||
<img loading="lazy" class="dialog-ad-image" src="/static/images/placeholder.png?v=2" data-dialog-ad-src="{{$dialog.Images}}" alt="{{$dialog.Title}}" title="{{$dialog.Title}}" decoding="async" />
|
||||
</a>
|
||||
{{else}}
|
||||
<div class="dialog-ad-media">
|
||||
<img loading="lazy" class="dialog-ad-image" src="/static/images/placeholder.png?v=2" data-dialog-ad-src="{{$dialog.Images}}" alt="{{$dialog.Title}}" title="{{$dialog.Title}}" decoding="async" />
|
||||
</div>
|
||||
{{end}}
|
||||
<span class="tag tag--dark dialog-ad-tag">广告</span>
|
||||
<button class="dialog-ad-close" type="button" data-dialog-ad-close data-ad-close aria-label="关闭广告">
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" width="18" height="18" alt="关闭">
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="dialog-ad-foot">
|
||||
<div class="dialog-ad-copy">
|
||||
<p class="dialog-ad-title">{{if $dialog.Title}}{{$dialog.Title}}{{else}}精彩推荐{{end}}</p>
|
||||
<p class="dialog-ad-desc">每日展示一次</p>
|
||||
</div>
|
||||
{{if $dialog.Link}}
|
||||
<a class="dialog-ad-cta" href="{{$dialog.Link}}" target="_blank" rel="sponsored nofollow noopener" data-dialog-ad-link>
|
||||
<img decoding="async" loading="lazy" class="dialog-ad-cta__icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" width="18" height="18" alt="播放">
|
||||
立即前往
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<script defer src="/static/js/pages/dialogAd.js?v=9"></script>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,29 @@
|
||||
{{define "downloadPop"}}
|
||||
{{/* 下载弹窗:链接取值与首页 app-cta 一致 → .config.AppAddr */}}
|
||||
{{$appAddr := .config.AppAddr}}
|
||||
<link rel="stylesheet" href="/static/css/downloadPop.css?v=2">
|
||||
<div
|
||||
class="download-pop"
|
||||
data-download-pop
|
||||
data-app-addr="{{$appAddr}}"
|
||||
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/images/placeholder.png?v=2" data-src="/static/images/close.svg" 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="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="download-pop__download-icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="">
|
||||
点击下载
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<script defer src="/static/js/pages/downloadPop.js?v=3"></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,27 @@
|
||||
{{define "eighteen"}}
|
||||
<link rel="stylesheet" href="/static/css/eighteen.css">
|
||||
<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" defer></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,82 @@
|
||||
{{define "footer"}}
|
||||
<link rel="stylesheet" href="/static/css/footer.css?v=5">
|
||||
<footer class="site-footer">
|
||||
<div class="site-footer__inner">
|
||||
<div class="site-footer__top">
|
||||
<div class="site-footer__brand">
|
||||
<div class="brand">
|
||||
<img decoding="async" loading="lazy" class="brand__logo brand__logo--lg" src="/static/images/placeholder.png?v=2" data-src="/static/logo.png" alt="黄果短剧">
|
||||
</div>
|
||||
<p class="block__subtitle">每一帧都能解你的色</p>
|
||||
<div class="social">
|
||||
{{if .config.TwitterAddr}}
|
||||
<a class="social__item" href="{{.config.TwitterAddr}}" target="_blank" rel="sponsored nofollow noopener" aria-label="X" data-navigation-key="footer_x" data-navigation-name="X">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-x.svg" alt="X">
|
||||
</a>
|
||||
{{end}}
|
||||
{{if .config.TGGroup}}
|
||||
<a class="social__item" href="{{.config.TGGroup}}" target="_blank" rel="sponsored nofollow noopener" aria-label="Telegram" data-navigation-key="footer_telegram" data-navigation-name="Telegram">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-telegram.svg" alt="Telegram">
|
||||
</a>
|
||||
{{else if .config.Telegram}}
|
||||
<a class="social__item" href="{{.config.Telegram}}" target="_blank" rel="sponsored nofollow noopener" aria-label="Telegram" data-navigation-key="footer_telegram" data-navigation-name="Telegram">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-telegram.svg" alt="Telegram">
|
||||
</a>
|
||||
{{else if .config.TelegramAdd}}
|
||||
<a class="social__item" href="{{.config.TelegramAdd}}" target="_blank" rel="sponsored nofollow noopener" aria-label="Telegram" data-navigation-key="footer_telegram" data-navigation-name="Telegram">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-telegram.svg" alt="Telegram">
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="site-footer__links">
|
||||
<nav class="footer-col" aria-label="浏览">
|
||||
<h3>浏览</h3>
|
||||
{{range .categoryList}}
|
||||
{{$isDownload := navIsDownload .URLValue .Name}}
|
||||
<a href="{{if $isDownload}}{{if $.appConfig.AppAddr}}{{$.appConfig.AppAddr}}{{else}}/download-app{{end}}{{else}}{{navHref .URLValue}}{{end}}"{{if and $isDownload $.appConfig.AppAddr}} target="_blank" rel="sponsored nofollow noopener"{{else if not $isDownload}} {{externalLinkAttrs (navHref .URLValue)}}{{end}} data-navigation-key="{{.URLValue}}" data-navigation-name="{{.Name}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</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="{{.config.CustomerServiceHost}}"{{if .config.CustomerServiceHost}} target="_blank" rel="sponsored nofollow noopener"{{end}} 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>
|
||||
<div class="footer-download">
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<div class="qr-box"{{if $appAddr}} data-qr="{{$appAddr}}"{{end}} aria-label="扫码下载">
|
||||
{{if not $appAddr}}
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" alt="扫码下载">
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="footer-download__copy">
|
||||
<strong>扫码下载 App</strong>
|
||||
<p>iOS / Android 海量短剧每日更新</p>
|
||||
<a class="btn btn--primary btn--sm" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}} data-navigation-key="footer_download" data-navigation-name="下载 APP">
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 APP
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr class="site-footer__rule">
|
||||
<div class="site-footer__legal">
|
||||
<p>© 2026 黄果短剧 HUANGGUO <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 岁以上成年人 </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"></script>
|
||||
<script defer src="/static/js/common/qr.js?v=1"></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,294 @@
|
||||
{{define "header"}}
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<link rel="stylesheet" href="/static/css/header.css?v=11">
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/menu.svg" alt="菜单">
|
||||
</button>
|
||||
<a class="brand" href="/" data-navigation-key="home" data-navigation-name="首页">
|
||||
<img decoding="async" loading="lazy" class="brand__logo" src="/static/images/placeholder.png?v=2" data-src="/static/logo.png" alt="黄果短剧">
|
||||
</a>
|
||||
<nav class="nav only-pc" aria-label="主导航">
|
||||
{{range .categoryList}}
|
||||
{{if navHasMegaMenu .URLValue}}
|
||||
<div class="nav__item-wrap">
|
||||
<a class="nav__item{{if navIsActive .URLValue $.requestPath}} is-active{{end}}" href="{{navHref .URLValue}}" {{externalLinkAttrs (navHref .URLValue)}} aria-haspopup="true" data-navigation-key="{{.URLValue}}" data-navigation-name="{{.Name}}">{{.Name}}</a>
|
||||
<div class="nav__mega" role="menu" aria-label="{{.Name}}快捷筛选">
|
||||
<div class="nav__mega-col nav__mega-col--themes">
|
||||
<p class="nav__mega-label">题材</p>
|
||||
<div class="nav__mega-chips">
|
||||
{{$themeSeg := listThemeSegment $.requestPath}}
|
||||
{{range $.themeList}}
|
||||
<a class="nav__mega-chip{{if or (eq $themeSeg .Slug) (eq $themeSeg (printf "%d" .ID))}} is-active{{end}}" href="{{allListURL .Slug .ID 0 1 1}}" role="menuitem" data-navigation-key="mega_theme_{{.ID}}" data-navigation-name="题材:{{.Name}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="nav__mega-col nav__mega-col--status">
|
||||
<p class="nav__mega-label">状态</p>
|
||||
<div class="nav__mega-chips">
|
||||
{{$status := listUpdateStatus $.requestPath}}
|
||||
<a class="nav__mega-chip{{if eq $status 0}} is-active{{end}}" href="{{allListURL "" 0 0 1 1}}" role="menuitem" data-navigation-key="mega_status_all" data-navigation-name="状态:全部">全部</a>
|
||||
<a class="nav__mega-chip{{if eq $status 1}} is-active{{end}}" href="{{allListURL "" 0 1 1 1}}" role="menuitem" data-navigation-key="mega_status_serializing" data-navigation-name="状态:连载中">连载中</a>
|
||||
<a class="nav__mega-chip{{if eq $status 2}} is-active{{end}}" href="{{allListURL "" 0 2 1 1}}" role="menuitem" data-navigation-key="mega_status_completed" data-navigation-name="状态:已完结">已完结</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="nav__mega-col nav__mega-col--links">
|
||||
<p class="nav__mega-label">快捷入口</p>
|
||||
{{range $i, $cfg := $.homeConfigPlaylets}}
|
||||
<a class="nav__mega-link" href="{{moreListURL $cfg.Slug $cfg.ID 0 "" 0 1}}" role="menuitem" data-navigation-key="mega_section_{{$cfg.ID}}" data-navigation-name="快捷入口:{{$cfg.Name}}">
|
||||
{{if eq $cfg.Name "预告片"}}
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/film2.svg" alt="短剧入口">
|
||||
{{else}}
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="{{navMegaIcon $i}}" alt="{{$cfg.Name}}入口">
|
||||
{{end}}
|
||||
{{$cfg.Name}}
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
{{$isDownload := navIsDownload .URLValue .Name}}
|
||||
<a class="nav__item{{if navIsActive .URLValue $.requestPath}} is-active{{end}}" href="{{if $isDownload}}{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}{{else}}{{navHref .URLValue}}{{end}}"{{if and $isDownload $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{else if not $isDownload}} {{externalLinkAttrs (navHref .URLValue)}}{{end}} data-navigation-key="{{.URLValue}}" data-navigation-name="{{.Name}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</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/images/placeholder.png?v=2" data-src="/static/images/search.svg" alt="搜索">
|
||||
<input class="search__input" type="search" placeholder="搜索剧名 / 演员 / 标签" autocomplete="off" data-header-search-input{{if .query}} value="{{.query}}"{{end}} aria-autocomplete="list" aria-expanded="false" aria-controls="header-search-dropdown">
|
||||
<button class="search__clear" type="button" aria-label="清除搜索词" data-header-search-clear{{if not .query}} hidden{{end}}>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" 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/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="清除">
|
||||
</button>
|
||||
</div>
|
||||
<div class="search-dropdown__chips" data-header-history-chips></div>
|
||||
</section>
|
||||
{{if .searchTrends}}
|
||||
<section class="search-dropdown__hot" aria-label="热门搜索">
|
||||
<h2 class="search-dropdown__label">热门搜索</h2>
|
||||
<ol class="search-dropdown__list">
|
||||
{{range .searchTrends}}
|
||||
<li class="search-dropdown__item">
|
||||
<a class="search-dropdown__link" href="{{searchResultsURL .Title}}">
|
||||
<span class="search-dropdown__rank{{if le .Rank 3}} is-top{{end}}">{{.Rank}}</span>
|
||||
<span class="search-dropdown__name">{{.Title}}</span>
|
||||
{{if .Badge}}
|
||||
<span class="search-dropdown__badge{{if eq .Badge "新"}} search-dropdown__badge--new{{else}} search-dropdown__badge--hot{{end}}">{{.Badge}}</span>
|
||||
{{end}}
|
||||
<span class="search-dropdown__heat">{{.Heat}}</span>
|
||||
</a>
|
||||
</li>
|
||||
{{end}}
|
||||
</ol>
|
||||
</section>
|
||||
{{end}}
|
||||
</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/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
<a class="btn btn--ghost site-header__download" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}} data-navigation-key="header_download" data-navigation-name="下载 APP">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
<span>下载 APP</span>
|
||||
</a>
|
||||
{{if not .isLoggedIn}}
|
||||
<button class="btn btn--primary site-header__login" type="button" data-login-open>登录</button>
|
||||
{{else}}
|
||||
<div class="user-menu" data-user-menu>
|
||||
<button class="user-chip" type="button" aria-haspopup="menu" aria-expanded="false" data-user-menu-toggle>
|
||||
{{if .avatar}}
|
||||
<img decoding="async" loading="lazy" class="user-chip__avatar lazy" src="/static/images/placeholder.png?v=2" data-src="{{.avatar}}" data-header-avatar alt="用户头像">
|
||||
{{else}}
|
||||
<img decoding="async" loading="lazy" class="user-chip__avatar" src="/static/images/placeholder.png?v=2" data-header-avatar alt="默认用户头像">
|
||||
{{end}}
|
||||
<span class="user-chip__name only-pc">{{if .userName}}{{.userName}}{{else}}游客{{end}}</span>
|
||||
<span class="user-chip__coin only-pc">
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/coin.png" alt="金币">
|
||||
<span data-header-recharge>{{if .rechargeText}}{{.rechargeText}}{{else}}0{{end}}</span>
|
||||
</span>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-chip__caret only-pc" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
<div class="user-menu__dropdown" role="menu">
|
||||
<div class="user-menu__profile">
|
||||
{{if .avatar}}
|
||||
<img decoding="async" loading="lazy" class="user-menu__avatar lazy" src="/static/images/placeholder.png?v=2" data-src="{{.avatar}}" data-header-avatar alt="用户头像">
|
||||
{{else}}
|
||||
<img decoding="async" loading="lazy" class="user-menu__avatar" src="/static/images/placeholder.png?v=2" data-header-avatar alt="默认用户头像">
|
||||
{{end}}
|
||||
<div class="user-menu__meta">
|
||||
<strong>{{if .userName}}{{.userName}}{{else}}游客{{end}}</strong>
|
||||
<span>{{if .userId}}ID {{.userId}}{{else}}ID —{{end}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="user-menu__list">
|
||||
{{if not .isRegistered}}
|
||||
<button class="user-menu__item" type="button" role="menuitem" data-login-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/user.svg" alt="用户">
|
||||
<span class="user-menu__label">账号登录</span>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-menu__arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
<button class="user-menu__item" type="button" role="menuitem" data-register-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/gift-dim.svg" alt="绑定账号">
|
||||
<span class="user-menu__label">绑定账号</span>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-menu__arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
{{end}}
|
||||
<a class="user-menu__item" href="/profile" role="menuitem" data-navigation-key="user_profile" data-navigation-name="个人中心">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/menu_grzx.svg" alt="个人中心">
|
||||
<span class="user-menu__label">个人中心</span>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-menu__arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
<a class="user-menu__item" href="/favorites" role="menuitem" data-navigation-key="user_favorites" data-navigation-name="我的收藏">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/menu_sc.svg" alt="我的收藏">
|
||||
<span class="user-menu__label">我的收藏</span>
|
||||
{{if .favoriteCount}}<span class="user-menu__extra">{{.favoriteCount}}</span>{{end}}
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-menu__arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
<a class="user-menu__item" href="/history" role="menuitem" data-navigation-key="user_history" data-navigation-name="观看历史">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/menu_gkls.svg" alt="观看历史">
|
||||
<span class="user-menu__label">观看历史</span>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-menu__arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
<a class="user-menu__item" href="/recharge" role="menuitem" data-navigation-key="user_recharge" data-navigation-name="金币充值">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/menu_jbcz.svg" alt="金币充值">
|
||||
<span class="user-menu__label">金币充值</span>
|
||||
<span class="user-menu__extra" data-header-recharge>{{if .rechargeText}}{{.rechargeText}}{{else}}0{{end}}</span>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm user-menu__arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</div>
|
||||
<hr class="user-menu__rule">
|
||||
<button class="user-menu__item user-menu__item--logout" type="button" role="menuitem" data-account-switch>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/logout.svg" alt="切换账号">
|
||||
<span class="user-menu__label">切换账号</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</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 decoding="async" loading="lazy" class="brand__logo" src="/static/images/placeholder.png?v=2" data-src="/static/logo.png" alt="黄果短剧">
|
||||
</a>
|
||||
<button class="drawer__close" type="button" aria-label="关闭" data-drawer-close>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</div>
|
||||
{{if not .isLoggedIn}}
|
||||
<button class="drawer__user drawer__user--login" type="button" data-login-open>
|
||||
<img decoding="async" loading="lazy" class="drawer__avatar" src="/static/images/placeholder.png?v=2" 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/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
{{else}}
|
||||
<a class="drawer__user" href="/profile" data-navigation-key="drawer_profile" data-navigation-name="个人中心">
|
||||
{{if .avatar}}
|
||||
<img decoding="async" loading="lazy" class="drawer__avatar lazy" src="/static/images/placeholder.png?v=2" data-src="{{.avatar}}" data-header-avatar alt="用户头像">
|
||||
{{else}}
|
||||
<img decoding="async" loading="lazy" class="drawer__avatar" src="/static/images/placeholder.png?v=2" data-header-avatar alt="默认用户头像">
|
||||
{{end}}
|
||||
<div class="drawer__user-info">
|
||||
<strong>{{if .userName}}{{.userName}}{{else}}游客{{end}}</strong>
|
||||
<span class="drawer__coin">
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/coin.png" alt="金币">
|
||||
<span data-header-recharge>{{if .rechargeText}}{{.rechargeText}}{{else}}0{{end}}</span> 金币
|
||||
</span>
|
||||
</div>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm drawer__user-arrow" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<hr class="drawer__rule">
|
||||
|
||||
<nav class="drawer__nav" aria-label="页面导航">
|
||||
{{range .categoryList}}
|
||||
{{$isDownload := navIsDownload .URLValue .Name}}
|
||||
<a class="drawer__nav-item{{if navIsActive .URLValue $.requestPath}} is-active{{end}}" href="{{if $isDownload}}{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}{{else}}{{navHref .URLValue}}{{end}}"{{if and $isDownload $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{else if not $isDownload}} {{externalLinkAttrs (navHref .URLValue)}}{{end}} data-navigation-key="{{.URLValue}}" data-navigation-name="{{.Name}}">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="{{navDrawerIcon .URLValue}}" alt="{{.Name}}入口">
|
||||
{{.Name}}
|
||||
</a>
|
||||
{{end}}
|
||||
</nav>
|
||||
|
||||
<hr class="drawer__rule">
|
||||
|
||||
<div class="drawer__tags">
|
||||
<p class="drawer__tags-label">题材</p>
|
||||
<div class="drawer__tag-list">
|
||||
{{range .themeList}}
|
||||
<a class="drawer__tag" href="{{allListURL .Slug .ID 0 1 1}}" data-navigation-key="drawer_theme_{{.ID}}" data-navigation-name="题材:{{.Name}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="drawer__links">
|
||||
{{if and .isLoggedIn (not .isRegistered)}}
|
||||
<button class="drawer__link" type="button" data-login-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/user.svg" alt="用户">
|
||||
账号登录
|
||||
</button>
|
||||
<button class="drawer__link" type="button" data-register-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/gift-dim.svg" alt="绑定账号">
|
||||
绑定账号
|
||||
</button>
|
||||
{{end}}
|
||||
<a class="drawer__link" href="/favorites" data-navigation-key="drawer_favorites" data-navigation-name="我的收藏">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/menu_sc.svg" 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/images/placeholder.png?v=2" data-src="/static/images/menu_gkls.svg" alt="观看历史">
|
||||
观看历史
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="drawer__foot">
|
||||
<a class="btn btn--ghost drawer__download" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}} data-navigation-key="drawer_download" data-navigation-name="下载 APP">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 APP
|
||||
</a>
|
||||
{{if .isLoggedIn}}
|
||||
<button class="drawer__logout" type="button" data-account-switch>
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/logout.svg" alt="切换账号">
|
||||
切换账号
|
||||
</button>
|
||||
{{end}}
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<script defer src="/static/js/common/cookie.js?v=1"></script>
|
||||
<script defer src="/static/js/common/request.js?v=6"></script>
|
||||
<script defer src="/static/js/common/auth.js?v=3"></script>
|
||||
<script defer src="/static/common/imgDecypt.js?v=9"></script>
|
||||
<script defer src="/static/js/header.js?v=13"></script>
|
||||
<script defer src="/static/js/pages/loginPop.js?v=5"></script>
|
||||
<script defer src="/static/js/pages/registerPop.js?v=7"></script>
|
||||
|
||||
{{template "eighteen" .}}
|
||||
{{template "dialogAd" .}}
|
||||
{{template "loginPop" .}}
|
||||
{{template "registerPop" .}}
|
||||
{{template "toast" .}}
|
||||
<script defer src="/static/js/common/sharePage.js?v=1"></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,93 @@
|
||||
{{define "loginPop"}}
|
||||
<link rel="stylesheet" href="/static/css/loginPop.css?v=5">
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/close.svg" 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/images/placeholder.png?v=2" data-src="/static/images/user.svg" 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/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" 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/images/placeholder.png?v=2" data-src="/static/images/lock-dim.svg" 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/images/placeholder.png?v=2" data-src="/static/images/eye.svg" 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/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" 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>
|
||||
|
||||
<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>
|
||||
{{end}}
|
||||
@@ -0,0 +1,41 @@
|
||||
{{define "pagination"}}
|
||||
<link rel="stylesheet" href="/static/css/pagination.css">
|
||||
{{with .pagination}}
|
||||
{{if .Visible}}
|
||||
<nav class="pagination" aria-label="分页">
|
||||
{{if .HasPrev}}
|
||||
<a class="pagination__btn pagination__btn--prev" href="{{.PrevURL}}" {{externalLinkAttrs .PrevURL}} aria-label="上一页">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="">
|
||||
<span class="visually-hidden">上一页</span>
|
||||
</a>
|
||||
{{else}}
|
||||
<span class="pagination__btn pagination__btn--prev is-disabled" aria-disabled="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="">
|
||||
<span class="visually-hidden">上一页</span>
|
||||
</span>
|
||||
{{end}}
|
||||
{{range .Items}}
|
||||
{{if .Dots}}
|
||||
<span class="pagination__ellipsis" aria-hidden="true">{{.Label}}</span>
|
||||
{{else}}
|
||||
<a class="pagination__page{{if .Active}} is-active{{end}}" href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Label}}</a>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{if .HasNext}}
|
||||
<a class="pagination__btn" href="{{.NextURL}}" {{externalLinkAttrs .NextURL}} aria-label="下一页">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="">
|
||||
<span class="visually-hidden">下一页</span>
|
||||
</a>
|
||||
{{else}}
|
||||
<span class="pagination__btn is-disabled" aria-disabled="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="">
|
||||
<span class="visually-hidden">下一页</span>
|
||||
</span>
|
||||
{{end}}
|
||||
{{if .TotalText}}
|
||||
<span class="pagination__total">{{.TotalText}}</span>
|
||||
{{end}}
|
||||
</nav>
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,115 @@
|
||||
{{define "playComments"}}
|
||||
<link rel="stylesheet" href="/static/css/playComments.css">
|
||||
{{/* 播放页评论区:首屏 4 条,超出显示「查看更多评论」客户端翻页 */}}
|
||||
{{$c := .chapter}}
|
||||
{{$pageSize := .commentSize}}
|
||||
{{$total := .commentTotal}}
|
||||
{{$shown := len .comments}}
|
||||
<div
|
||||
class="play-comments"
|
||||
data-play-comments
|
||||
data-comment-page="{{if .commentPage}}{{.commentPage}}{{else}}1{{end}}"
|
||||
data-comment-size="{{if gt $pageSize 0}}{{$pageSize}}{{else}}4{{end}}"
|
||||
data-comment-total="{{$total}}"
|
||||
data-comment-loaded="{{$shown}}"
|
||||
>
|
||||
<div class="play-comments__head">
|
||||
<h2 class="play-comments__title">评论</h2>
|
||||
<span class="play-comments__count" data-comment-total-label>{{if gt $total 0}}{{$total}} 条{{else if and $c (gt $c.CountComment 0)}}{{$c.CountComment}} 条{{else if and .video (gt .video.CountComment 0)}}{{.video.CountComment}} 条{{else}}暂无评论{{end}}</span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="play-composer"
|
||||
data-play-composer
|
||||
data-object-id="{{.commentObjectID}}"
|
||||
data-object-type="{{.commentObjectType}}"
|
||||
data-logged-in="{{if .isLoggedIn}}1{{else}}0{{end}}"
|
||||
>
|
||||
<div class="play-composer__avatar" aria-hidden="true">
|
||||
{{if .avatar}}
|
||||
<img decoding="async" loading="lazy" class="play-composer__avatar-img lazy" src="/static/images/placeholder.png?v=2" data-src="{{.avatar}}" alt="当前用户头像">
|
||||
{{else}}
|
||||
<img decoding="async" loading="lazy" class="play-composer__avatar-img" src="/static/images/placeholder.png?v=2" data-src="/static/images/profile/avatar.png" alt="默认用户头像">
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="play-composer__field">
|
||||
<input
|
||||
class="play-composer__input"
|
||||
type="text"
|
||||
maxlength="200"
|
||||
placeholder="{{if .isLoggedIn}}说点什么…{{else}}登录后发表评论{{end}}"
|
||||
aria-label="发表评论"
|
||||
data-comment-input
|
||||
{{if not .isLoggedIn}}readonly{{end}}
|
||||
>
|
||||
<span class="play-composer__count" data-comment-count>0 / 200</span>
|
||||
</div>
|
||||
{{if .isLoggedIn}}
|
||||
<button class="btn btn--primary play-composer__send" type="button" data-comment-send>发布</button>
|
||||
{{else}}
|
||||
<button class="btn btn--primary play-composer__login" type="button" data-login-open>登录</button>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<ul class="play-comment-list" data-comment-list>
|
||||
{{range .comments}}
|
||||
<li class="play-comment" data-comment-id="{{.ID}}">
|
||||
{{$avatar := commentAvatar .UserAvatar}}
|
||||
{{if .UserAvatar}}
|
||||
<img decoding="async" loading="lazy" class="play-comment__avatar lazy" src="/static/images/placeholder.png?v=2" data-src="{{$avatar}}" alt="评论用户头像">
|
||||
{{else}}
|
||||
<img decoding="async" loading="lazy" class="play-comment__avatar" src="/static/images/placeholder.png?v=2" data-src="{{$avatar}}" alt="评论用户头像">
|
||||
{{end}}
|
||||
<div class="play-comment__body">
|
||||
<div class="play-comment__meta">
|
||||
<span class="play-comment__name">{{if .UserName}}{{.UserName}}{{else}}匿名用户{{end}}</span>
|
||||
<span class="play-comment__time">{{formatCommentTime .CreatedAt}}</span>
|
||||
</div>
|
||||
<p class="play-comment__text">{{.Text}}</p>
|
||||
{{range .Children}}
|
||||
<div class="play-comment__reply">
|
||||
{{if .UserName}}{{.UserName}}{{else}}用户{{end}}{{if .ReplyUserName}} 回复 {{.ReplyUserName}}{{end}}:{{.Text}}
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="play-comment__actions">
|
||||
<button
|
||||
class="play-comment__action{{if eq .IsLike 1}} is-active{{end}}"
|
||||
type="button"
|
||||
aria-label="点赞"
|
||||
data-comment-like="{{.ID}}"
|
||||
data-liked="{{if eq .IsLike 1}}1{{else}}2{{end}}"
|
||||
data-like-raw="{{.CountLike}}"
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/heart.svg" alt="点赞">
|
||||
<span data-like-count>{{.CountLike}}</span>
|
||||
</button>
|
||||
<button
|
||||
class="play-comment__action"
|
||||
type="button"
|
||||
data-comment-reply
|
||||
data-comment-id="{{.ID}}"
|
||||
data-parents-id="{{.ID}}"
|
||||
data-reply-name="{{if .UserName}}{{.UserName}}{{else}}匿名用户{{end}}"
|
||||
>回复</button>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="play-comment play-comment--empty">
|
||||
<p class="play-comment__text">暂无评论</p>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
|
||||
<button
|
||||
class="play-comments__more"
|
||||
type="button"
|
||||
data-comment-more
|
||||
{{if le $total $shown}}hidden{{end}}
|
||||
>
|
||||
查看更多评论
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
</div>
|
||||
<script defer src="/static/js/pages/playComments.js?v=4"></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,43 @@
|
||||
{{define "playLinks"}}
|
||||
{{/* 官方入口:GET /api/app/config/info → config / newAddressInfo(经 appConfig 合并) */}}
|
||||
{{$cfg := .appConfig}}
|
||||
<link rel="stylesheet" href="/static/css/playLinks.css">
|
||||
<section class="play-links" aria-label="官方入口">
|
||||
<div class="play-links__row">
|
||||
<div class="play-links__item">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/link_globe.svg" alt="最新网址">
|
||||
<span class="play-links__label">官方入口</span>
|
||||
<a class="play-links__value" href="{{if $cfg.NewURLAddr}}{{$cfg.NewURLAddr}}{{else}}#{{end}}"{{if $cfg.NewURLAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>{{if $cfg.NewURLAddr}}{{navDisplayURL $cfg.NewURLAddr}}{{else}}-{{end}}</a>
|
||||
</div>
|
||||
<div class="play-links__item">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/link_refresh-cw.svg" alt="备用网址">
|
||||
<span class="play-links__label">最新地址发布页</span>
|
||||
<a class="play-links__value" href="{{if $cfg.NewURLAddr1}}{{$cfg.NewURLAddr1}}{{else}}#{{end}}"{{if $cfg.NewURLAddr1}} target="_blank" rel="sponsored nofollow noopener"{{end}}>{{if $cfg.NewURLAddr1}}{{navDisplayURL $cfg.NewURLAddr1}}{{else}}-{{end}}</a>
|
||||
</div>
|
||||
<div class="play-links__item">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/link_shield.svg" alt="永久地址">
|
||||
<span class="play-links__label">备用访问地址</span>
|
||||
<a class="play-links__value" href="{{if $cfg.NewURLAddr2}}{{$cfg.NewURLAddr2}}{{else}}#{{end}}"{{if $cfg.NewURLAddr2}} target="_blank" rel="sponsored nofollow noopener"{{end}}>{{if $cfg.NewURLAddr2}}{{navDisplayURL $cfg.NewURLAddr2}}{{else}}-{{end}}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="play-links__row">
|
||||
<div class="play-links__item">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/link_award.svg" alt="防失联地址">
|
||||
<span class="play-links__label">海外永久地址</span>
|
||||
<a class="play-links__value" href="{{if $cfg.ForeverURLAddr}}{{$cfg.ForeverURLAddr}}{{else}}#{{end}}"{{if $cfg.ForeverURLAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>{{if $cfg.ForeverURLAddr}}{{navDisplayURL $cfg.ForeverURLAddr}}{{else}}-{{end}}</a>
|
||||
</div>
|
||||
<div class="play-links__item">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/link_smartphone.svg" alt="App 下载地址">
|
||||
<span class="play-links__label">官方 App 下载</span>
|
||||
{{$app := $cfg.OfficialAppAddr}}{{if not $app}}{{$app = $cfg.AppAddr}}{{end}}
|
||||
<a class="play-links__value" href="{{if $app}}{{$app}}{{else}}#{{end}}"{{if $app}} target="_blank" rel="sponsored nofollow noopener"{{end}}>{{if $app}}{{navDisplayURL $app}}{{else}}-{{end}}</a>
|
||||
</div>
|
||||
<div class="play-links__item">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/link_send.svg" alt="Telegram 群组">
|
||||
<span class="play-links__label">官方 Telegram 群</span>
|
||||
{{$tg := $cfg.TGGroup}}{{if not $tg}}{{$tg = $cfg.Telegram}}{{end}}
|
||||
<a class="play-links__value" href="{{if $tg}}{{$tg}}{{else}}#{{end}}"{{if $tg}} target="_blank" rel="sponsored nofollow noopener"{{end}}>{{if $tg}}点击加入{{else}}-{{end}}</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
@@ -0,0 +1,87 @@
|
||||
{{define "rechargeModal"}}
|
||||
{{/* 金币充值弹窗:GET /api/app/recharge/package/list → coinList */}}
|
||||
<div class="recharge-modal" data-recharge-modal hidden
|
||||
data-unlock-cost="{{if .unlockCost}}{{.unlockCost}}{{else}}0{{end}}"
|
||||
data-balance="{{if .balance}}{{.balance}}{{else}}0{{end}}"
|
||||
>
|
||||
<div class="recharge-modal__backdrop" data-recharge-close aria-hidden="true"></div>
|
||||
<section class="recharge-modal__panel" role="dialog" aria-modal="true" aria-labelledby="recharge-modal-title" tabindex="-1">
|
||||
<div class="recharge-modal__handle" aria-hidden="true"></div>
|
||||
<div class="recharge-modal__head">
|
||||
<div class="recharge-modal__heading">
|
||||
<h2 id="recharge-modal-title">金币充值</h2>
|
||||
{{$unlockCost := 0}}{{with .unlockCost}}{{$unlockCost = .}}{{end}}
|
||||
{{if gt $unlockCost 0}}
|
||||
<p class="recharge-modal__subtitle recharge-modal__subtitle--desktop">本集需 {{$unlockCost}} 金币,当前余额 {{if .balanceText}}{{.balanceText}}{{else}}{{.balance}}{{end}} 金币</p>
|
||||
<p class="recharge-modal__subtitle recharge-modal__subtitle--mobile">本集需 {{$unlockCost}} 金币,当前余额 {{if .balanceText}}{{.balanceText}}{{else}}{{.balance}}{{end}} 金币</p>
|
||||
{{else}}
|
||||
<p class="recharge-modal__subtitle recharge-modal__subtitle--desktop">当前余额 {{if .balanceText}}{{.balanceText}}{{else}}{{.balance}}{{end}} 金币</p>
|
||||
<p class="recharge-modal__subtitle recharge-modal__subtitle--mobile">当前余额 {{if .balanceText}}{{.balanceText}}{{else}}{{.balance}}{{end}} 金币</p>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="recharge-modal__balance" aria-label="当前余额 {{if .balanceText}}{{.balanceText}}{{else}}{{.balance}}{{end}} 金币">
|
||||
<span class="recharge-modal__coin recharge-modal__coin--balance" aria-hidden="true"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/coin-star.svg" alt="金币"></span>
|
||||
<strong data-recharge-balance>{{if .balanceText}}{{.balanceText}}{{else}}{{.balance}}{{end}}</strong>
|
||||
</div>
|
||||
<button class="recharge-modal__close" type="button" data-recharge-close aria-label="关闭充值弹窗">
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/close.svg" alt="关闭充值窗口">
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="recharge-modal__packages" role="group" aria-label="选择充值套餐" data-recharge-packages>
|
||||
{{range $i, $pkg := .rechargePackages}}
|
||||
<button
|
||||
class="recharge-modal__package{{if $pkg.Active}} is-selected{{end}}"
|
||||
type="button"
|
||||
data-recharge-package
|
||||
data-package-id="{{$pkg.ID}}"
|
||||
data-price="{{$pkg.PriceText}}"
|
||||
data-coins="{{$pkg.TotalCoinText}}"
|
||||
data-pay-methods="{{$pkg.PayMethodsJSON}}"
|
||||
aria-pressed="{{if $pkg.Active}}true{{else}}false{{end}}"
|
||||
>
|
||||
<span class="recharge-modal__package-top">
|
||||
<span class="recharge-modal__package-name">
|
||||
<span class="recharge-modal__coin" aria-hidden="true"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/coin-star.svg" alt="金币"></span>
|
||||
{{if $pkg.TotalCoinText}}{{$pkg.TotalCoinText}} 金币{{else}}{{$pkg.Name}}{{end}}
|
||||
</span>
|
||||
<img decoding="async" loading="lazy" class="recharge-modal__selected-icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/check-circle.svg" alt="已选择">
|
||||
</span>
|
||||
{{if $pkg.Hint}}<span class="recharge-modal__package-detail">{{$pkg.Hint}}</span>{{end}}
|
||||
<strong class="recharge-modal__package-price">¥{{$pkg.PriceText}}</strong>
|
||||
</button>
|
||||
{{else}}
|
||||
<p class="recharge-modal__empty" data-recharge-packages-empty>暂无可购买的金币套餐</p>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<div class="recharge-modal__methods" role="group" aria-label="选择支付方式" data-recharge-methods>
|
||||
{{range $i, $m := .rechargePayMethods}}
|
||||
<button
|
||||
class="recharge-modal__method{{if $m.Active}} is-selected{{end}}"
|
||||
type="button"
|
||||
data-recharge-method="{{$m.Type}}"
|
||||
aria-pressed="{{if $m.Active}}true{{else}}false{{end}}"
|
||||
>
|
||||
<span class="recharge-modal__method-check" aria-hidden="true"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/check.svg" alt="安全支付"></span>
|
||||
<span class="recharge-modal__method-copy"><span>{{$m.TypeName}}</span><small>即时到账</small></span>
|
||||
</button>
|
||||
{{else}}
|
||||
<p class="recharge-modal__empty" data-recharge-methods-empty>请先选择套餐</p>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
{{$payPrice := "0"}}
|
||||
{{range .rechargePackages}}{{if .Active}}{{$payPrice = .PriceText}}{{end}}{{end}}
|
||||
<button class="recharge-modal__pay" type="button" data-recharge-pay{{if not .rechargePackages}} disabled{{end}}>立即支付 <span data-recharge-amount>¥{{$payPrice}}</span></button>
|
||||
<p class="recharge-modal__status" data-recharge-status role="status" hidden></p>
|
||||
<div class="recharge-modal__foot">
|
||||
<span>支付即表示同意《充值协议》</span>
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/download.svg" alt="下载 App">下载 App 免费看</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
{{if .rechargePackageResponse}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,124 @@
|
||||
{{define "registerPop"}}
|
||||
<link rel="stylesheet" href="/static/css/registerPop.css?v=5">
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/close.svg" 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/images/placeholder.png?v=2" data-src="/static/images/user.svg" 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/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" 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/images/placeholder.png?v=2" data-src="/static/images/lock-dim.svg" 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/images/placeholder.png?v=2" data-src="/static/images/eye.svg" 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/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" 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/images/placeholder.png?v=2" data-src="/static/images/lock-dim.svg" 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/images/placeholder.png?v=2" data-src="/static/images/eye.svg" 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/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" 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/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" 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>
|
||||
{{end}}
|
||||
@@ -0,0 +1,30 @@
|
||||
{{define "seoCommon"}}
|
||||
<meta name="description" content="{{.metaDescription}}">
|
||||
{{if .metaKeywords}}<meta name="keywords" content="{{.metaKeywords}}">{{end}}
|
||||
<meta name="robots" content="{{.robots}}">
|
||||
<meta name="googlebot" content="{{.robots}}">
|
||||
<!-- Search engine site verification -->
|
||||
<meta name="google-site-verification" content="{{if .isNavPage}}HuzjZRHdb1AdA0Y8Ziby5zikHoBn_99t9mpOXnADvL8{{else}}VEhl0na6ZwYZgkdcdz8BcCR4LpYGFm97zbp62YqJHX4{{end}}">
|
||||
<meta name="yandex-verification" content="{{if .isNavPage}}f5f965a1c5d31a69{{else}}56acf08532be3060{{end}}">
|
||||
<meta name="msvalidate.01" content="57A5999E9B5167EE9039265EBCA2AE3A">
|
||||
{{if .canonicalURL}}<link rel="canonical" href="{{.canonicalURL}}">{{end}}
|
||||
{{if .paginationPrevURL}}<link rel="prev" href="{{.paginationPrevURL}}">{{end}}
|
||||
{{if .paginationNextURL}}<link rel="next" href="{{.paginationNextURL}}">{{end}}
|
||||
<meta property="og:locale" content="zh_CN">
|
||||
<meta property="og:type" content="{{.ogType}}">
|
||||
<meta property="og:site_name" content="{{.siteName}}">
|
||||
<meta property="og:title" content="{{.metaTitle}}">
|
||||
<meta property="og:description" content="{{.metaDescription}}">
|
||||
{{if .canonicalURL}}<meta property="og:url" content="{{.canonicalURL}}">{{end}}
|
||||
{{if .ogImage}}<meta property="og:image" content="{{.ogImage}}">{{end}}
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="{{.metaTitle}}">
|
||||
<meta name="twitter:description" content="{{.metaDescription}}">
|
||||
{{if .ogImage}}<meta name="twitter:image" content="{{.ogImage}}">{{end}}
|
||||
<link rel="icon" href="/static/favicon.svg" type="image/svg+xml" sizes="any">
|
||||
<link rel="icon" href="/static/favicon.png" type="image/png">
|
||||
<link rel="apple-touch-icon" href="/static/favicon.png">
|
||||
{{if .jsonLD}}<script type="application/ld+json">{{.jsonLD}}</script>{{end}}
|
||||
<script src="/static/js/common/channel.js?v=1"></script>
|
||||
{{template "trackerInit" .}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,7 @@
|
||||
{{define "subpageHeader"}}
|
||||
<header class="subpage-header">
|
||||
<a class="subpage-header__button" href="{{.backHref}}" {{externalLinkAttrs .backHref}} aria-label="返回"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/back.svg" alt="返回"></a>
|
||||
<strong class="subpage-header__title">{{.pageHeading}}</strong>
|
||||
<a class="subpage-header__button" href="{{.helpHref}}" {{externalLinkAttrs .helpHref}} aria-label="帮助"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/help.svg" alt="充值帮助"></a>
|
||||
</header>
|
||||
{{end}}
|
||||
@@ -0,0 +1,19 @@
|
||||
{{define "toast"}}
|
||||
<link rel="stylesheet" href="/static/css/toast.css?v=4">
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/check-circle.svg" alt="操作成功" hidden>
|
||||
<img decoding="async" loading="lazy" class="site-toast__icon" data-toast-icon-error src="/static/images/placeholder.png?v=2" data-src="/static/images/error-tip.svg" alt="错误提示" hidden>
|
||||
<p class="site-toast__text" data-toast-text></p>
|
||||
</div>
|
||||
</div>
|
||||
<script defer src="/static/js/common/toast.js?v=2"></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,36 @@
|
||||
{{define "trackerInit"}}
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id={{if .isNavPage}}G-L3YLSKHDFJ{{else}}G-Z582WY8LN9{{end}}"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
gtag('config', '{{if .isNavPage}}G-L3YLSKHDFJ{{else}}G-Z582WY8LN9{{end}}');
|
||||
</script>
|
||||
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<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={{if .isNavPage}}112952789{{else}}112951899{{end}}', 'ym');
|
||||
|
||||
ym({{if .isNavPage}}112952789{{else}}112951899{{end}}, 'init', {ssr:true, webvisor:true, clickmap:true, ecommerce:"dataLayer", referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true});
|
||||
</script>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
|
||||
<script>
|
||||
window.__TRACKER_BOOT__ = {
|
||||
appId: "{{.trackerAppId}}",
|
||||
encryptedConfig: {{InJSONScript .appConfig.ReportSDKConfig}},
|
||||
appVersion: "1.0.0",
|
||||
pageKey: "{{.pageKey}}",
|
||||
pageName: "{{.pageName}}",
|
||||
userType: "{{if .isVip}}vip{{else}}normal{{end}}"
|
||||
};
|
||||
</script>
|
||||
<script defer src="/static/common/web-sdk-v1.2.0.js?v=1"></script>
|
||||
<script defer src="/static/js/tracker.js?v=1"></script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,46 @@
|
||||
{{define "userCenterHero"}}
|
||||
<div class="profile-hero">
|
||||
<div class="profile-hero__inner">
|
||||
<div class="profile-identity">
|
||||
<img decoding="async" loading="lazy" class="profile-identity__avatar{{if .avatar}} lazy{{end}}" src="/static/images/placeholder.png?v=2"{{if .avatar}} data-src="{{.avatar}}"{{end}} alt="个人头像">
|
||||
<div class="profile-identity__copy">
|
||||
<div class="profile-identity__name">{{if .userName}}{{.userName}}{{else}}未登录{{end}}</div>
|
||||
<p class="profile-identity__meta">{{if .userID}}ID {{.userID}}{{else}}登录后查看账户资料{{end}}</p>
|
||||
<a class="profile-identity__edit" href="/setting" aria-label="编辑资料">
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><path d="M3 1.5v3m0 3v7M8 1.5v7m0 3v3m5-13v3m0 3v7M1.5 4.5h3m2 4h3m2-4h3" stroke="currentColor" stroke-linecap="round" stroke-width="1.3"/></svg>
|
||||
编辑资料
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="profile-wallet">
|
||||
<div class="profile-wallet__copy">
|
||||
<p class="profile-wallet__label"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/coin.png" alt="金币">金币余额</p>
|
||||
<strong class="profile-wallet__amount">{{if .balance}}{{.balance}}{{else}}—{{end}}</strong>
|
||||
<p class="profile-wallet__hint">按集解锁付费剧集 永久观看</p>
|
||||
</div>
|
||||
<div class="profile-wallet__actions">
|
||||
<a class="profile-wallet__recharge" href="/recharge">去充值</a>
|
||||
<a class="profile-wallet__details" href="/recharge#recharge-history">交易明细</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="profile-stats" aria-label="观看统计">
|
||||
<div class="profile-stat"><strong class="profile-stat__value">{{if .historyCount}}{{.historyCount}}{{else}}—{{end}}</strong><span class="profile-stat__label">观看</span></div>
|
||||
<div class="profile-stat"><strong class="profile-stat__value">{{if .favoriteCount}}{{.favoriteCount}}{{else}}—{{end}}</strong><span class="profile-stat__label">收藏</span></div>
|
||||
<div class="profile-stat"><strong class="profile-stat__value">{{if .chasingCount}}{{.chasingCount}}{{else}}—{{end}}</strong><span class="profile-stat__label">追剧中</span></div>
|
||||
<div class="profile-stat"><strong class="profile-stat__value">{{if .boughtChapterCount}}{{.boughtChapterCount}}{{else}}—{{end}}</strong><span class="profile-stat__label">已购剧集</span></div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
{{define "userCenterTabs"}}
|
||||
<nav class="profile-tabs" aria-label="个人中心导航">
|
||||
<div class="profile-tabs__inner">
|
||||
<a class="profile-tabs__link{{if eq .accountTab "profile"}} is-active{{end}}" href="/profile"{{if eq .accountTab "profile"}} aria-current="page"{{end}} data-navigation-key="account_profile" data-navigation-name="个人中心">个人中心</a>
|
||||
<a class="profile-tabs__link{{if eq .accountTab "history"}} is-active{{end}}" href="/history"{{if eq .accountTab "history"}} aria-current="page"{{end}} data-navigation-key="account_history" data-navigation-name="观看历史">观看历史</a>
|
||||
<a class="profile-tabs__link{{if eq .accountTab "favorites"}} is-active{{end}}" href="/favorites"{{if eq .accountTab "favorites"}} aria-current="page"{{end}} data-navigation-key="account_favorites" data-navigation-name="我的收藏">我的收藏</a>
|
||||
<a class="profile-tabs__link{{if eq .accountTab "purchased"}} is-active{{end}}" href="/purchased"{{if eq .accountTab "purchased"}} aria-current="page"{{end}} data-navigation-key="account_purchased" data-navigation-name="已购剧集">已购剧集</a>
|
||||
<a class="profile-tabs__link{{if eq .accountTab "setting"}} is-active{{end}}" href="/setting"{{if eq .accountTab "setting"}} aria-current="page"{{end}} data-navigation-key="account_settings" data-navigation-name="账号设置">账号设置</a>
|
||||
</div>
|
||||
</nav>
|
||||
{{end}}
|
||||
@@ -0,0 +1,6 @@
|
||||
package template
|
||||
|
||||
import "embed"
|
||||
|
||||
//go:embed all:base all:pages
|
||||
var FS embed.FS
|
||||
@@ -0,0 +1,63 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/legal.css?v=5">
|
||||
</head>
|
||||
<body class="legal-page compliance-page">
|
||||
{{template "header" .}}
|
||||
<header class="page-subheader only-h5" aria-label="2257 合规声明页顶栏">
|
||||
<a class="page-subheader__btn" href="/" aria-label="返回首页"><img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回"></a>
|
||||
<span class="page-subheader__title">2257 合规声明</span>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="legal-main">
|
||||
<div class="legal-hero">
|
||||
<p class="legal-kicker"><span class="legal-kicker__bar" aria-hidden="true"></span>2257 合规声明</p>
|
||||
<h1 class="legal-title">黄果短剧 2257 合规声明</h1>
|
||||
<p class="legal-dates">生效日期 2026 年 9 月 1 日 最近更新 2026 年 9 月 1 日</p>
|
||||
</div>
|
||||
<div class="legal-layout">
|
||||
<nav class="legal-toc" aria-label="2257 合规声明目录">
|
||||
<span class="legal-toc__label">目录</span>
|
||||
<div class="legal-toc__list">
|
||||
<a class="legal-toc__item is-active" href="#compliance-1"><span class="legal-toc__number">01</span><span>年龄限制</span></a>
|
||||
<a class="legal-toc__item" href="#compliance-2"><span class="legal-toc__number">02</span><span>内容合规原则</span></a>
|
||||
<a class="legal-toc__item" href="#compliance-3"><span class="legal-toc__number">03</span><span>反馈与处理</span></a>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="legal-content">
|
||||
<p class="legal-intro">黄果短剧重视成人内容相关页面的年龄限制、合规展示和用户访问责任。本声明用于说明本站对年龄门槛、内容合规、用户责任以及投诉反馈的基本处理原则。</p>
|
||||
<section class="legal-section" id="compliance-1">
|
||||
<h2 class="legal-section__title">1. 年龄限制</h2>
|
||||
<p class="legal-section__paragraph">1.1 访问本站成人相关内容的用户,应确认自己已经达到所在地法律规定的法定年龄。若用户未达到法定年龄,或所在地区禁止访问此类内容,请立即停止访问并关闭相关页面。</p>
|
||||
<p class="legal-section__paragraph">1.2 本站不会主动面向未成年人推广成人内容。用户进入相关页面,即表示已经理解页面属性,并承诺遵守所在地法律法规。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="compliance-2">
|
||||
<h2 class="legal-section__title">2. 内容合规原则</h2>
|
||||
<p class="legal-section__paragraph">2.1 本站会尽量对内容标题、简介、封面、标签和题材类型进行规范整理。</p>
|
||||
<p class="legal-section__paragraph">2.2 涉及成人属性的内容,会尽量放入对应分类,避免与非成人内容混淆。</p>
|
||||
<p class="legal-section__paragraph">2.3 如发现疑似违规、侵权、错误分类或不适合展示的内容,可通过官方入口反馈。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="compliance-3">
|
||||
<h2 class="legal-section__title">3. 反馈与处理</h2>
|
||||
<p class="legal-section__paragraph">3.1 如果您是权利人、授权代理人或相关当事人,认为页面内容存在合规风险,请准备作品名称、页面位置、作品 ID、问题说明和证明材料,再通过以下入口提交。</p>
|
||||
{{$contact := .config.TGGroup}}{{if not $contact}}{{$contact = .config.Telegram}}{{end}}{{if not $contact}}{{$contact = .config.TelegramAdd}}{{end}}{{if not $contact}}{{$contact = "https://t.me/huangguosan"}}{{end}}
|
||||
<p class="legal-section__meta">
|
||||
<span>官方处理入口</span>
|
||||
<a href="{{$contact}}" target="_blank" rel="sponsored nofollow noopener">{{$contact}}</a>
|
||||
</p>
|
||||
<p class="legal-section__paragraph">3.2 收到有效材料后,我们会根据实际情况进行核查,并采取下架、修改、屏蔽或其他合理处理方式。</p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script defer src="/static/js/pages/legal.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,34 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/notFound.css">
|
||||
</head>
|
||||
<body class="page-404">
|
||||
{{template "header" .}}
|
||||
|
||||
<div class="page not-found-page">
|
||||
<main class="main not-found">
|
||||
<p class="not-found__code" aria-hidden="true">404</p>
|
||||
<h1 class="not-found__title">页面走丢了</h1>
|
||||
<p class="not-found__desc">你访问的页面不存在、已下线,或者链接输错了。试试回到首页,或从热门榜单里挑一部。</p>
|
||||
<div class="not-found__actions">
|
||||
<a class="btn btn--primary btn--lg not-found__cta" href="/">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/arrow-right-line.svg" alt="返回首页">
|
||||
返回首页
|
||||
</a>
|
||||
<a class="btn btn--ghost btn--lg not-found__cta" href="/feedback">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/mail.svg" alt="意见反馈">
|
||||
联系我们
|
||||
</a>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,95 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/about.css?v=1">
|
||||
<link rel="stylesheet" href="/static/css/about-mobile.css?v=1">
|
||||
</head>
|
||||
<body class="about-page">
|
||||
{{template "header" .}}
|
||||
<header class="page-subheader only-h5" aria-label="关于我们页顶栏">
|
||||
<a class="page-subheader__btn" href="/" aria-label="返回首页"><img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回"></a>
|
||||
<div class="page-subheader__title">关于我们</div>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
<main class="about-main">
|
||||
<section class="about-intro" aria-labelledby="about-title">
|
||||
<div class="about-intro__heading">
|
||||
<p class="about-kicker"><span class="about-kicker__bar" aria-hidden="true"></span>关于我们</p>
|
||||
<h1 class="about-intro__title" id="about-title">不是所有短剧,都能被称作作品。</h1>
|
||||
<p class="about-intro__subtitle">黄果短剧,因为专业,所以领先。</p>
|
||||
</div>
|
||||
<div class="about-story">
|
||||
<div class="about-story__copy">
|
||||
<p class="about-story__paragraph">别人拼命追赶风口,我们定义创造标准。每一支作品都经过精心制作,分镜反复推敲,为一句台词的语气重新生成十次,字幕与剪辑的表情调整到满意为止。这就是我们的匠人精神,也是黄果品质唯一的定义。</p>
|
||||
<p class="about-story__paragraph about-story__paragraph--desktop">我们用 AI 帮助提升作品的品质,把不可能的画面化为可能。题材多元,都会、悬疑、古装、奇幻同步推进;每日更新,精彩不断。短剧与影集双轨并行,仿真与动画齐发。我们只做一件事:把每一支作品,做到值得被记得。</p>
|
||||
<p class="about-story__paragraph about-story__paragraph--mobile">我们用 AI 帮助提升作品的品质,把不可能的画面化为可能。题材多元,每日更新,短剧与影集双轨并行,仿真与动画齐发。我们只做一件事:把每一支作品,做到值得被记得。</p>
|
||||
<p class="about-story__slogan">黄果一开,全射出来,每一帧都能解你的色。</p>
|
||||
<div class="about-story__tags" aria-label="黄果特色">
|
||||
<span class="about-story__tag">短剧与影集双轨并行</span>
|
||||
<span class="about-story__tag">仿真与动画齐发</span>
|
||||
<span class="about-story__tag">AI 协力制作</span>
|
||||
<span class="about-story__tag">每日更新</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="about-story__visual"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/about/about-hero.png" alt="黄果短剧作品画面拼贴"></div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="about-features" aria-labelledby="about-features-title">
|
||||
<div class="about-features__heading">
|
||||
<h2 class="about-features__title" id="about-features-title">把最好看的留给你</h2>
|
||||
<span class="about-features__subtitle">黄果特色</span>
|
||||
</div>
|
||||
<div class="about-features__grid">
|
||||
<article class="about-feature">
|
||||
<strong class="about-feature__number">01</strong>
|
||||
<div class="about-feature__copy">
|
||||
<h3 class="about-feature__title">多元齐全</h3>
|
||||
<p class="about-feature__description">多元的题材、海量的短剧与影集,我们把最好看的留给你。</p>
|
||||
</div>
|
||||
</article>
|
||||
<article class="about-feature">
|
||||
<strong class="about-feature__number">02</strong>
|
||||
<div class="about-feature__copy">
|
||||
<h3 class="about-feature__title">天天上新</h3>
|
||||
<p class="about-feature__description">持续更新的内容节奏,每天打开都有新惊喜,追剧永不断档。</p>
|
||||
</div>
|
||||
</article>
|
||||
<article class="about-feature">
|
||||
<strong class="about-feature__number">03</strong>
|
||||
<div class="about-feature__copy">
|
||||
<h3 class="about-feature__title">沉浸体验</h3>
|
||||
<p class="about-feature__description">高清画质、震撼音效,每个动作、每个画面,全心投入剧情。</p>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
<section class="about-app" aria-labelledby="about-app-title">
|
||||
<div class="about-app__card">
|
||||
<div class="about-app__copy">
|
||||
<p class="about-app__kicker"><span class="about-kicker__bar" aria-hidden="true"></span>黄果短剧 App</p>
|
||||
<h2 class="about-app__title" id="about-app-title">把黄果装进口袋,随时随地追剧</h2>
|
||||
<p class="about-app__desc-desktop">iOS / Android 双端 竖屏沉浸播放 离线缓存随时看</p>
|
||||
<p class="about-app__desc-mobile">竖屏沉浸播放 离线缓存 弹幕互动</p>
|
||||
<p class="about-app__note-desktop">手机扫码会自动识别设备并推荐安装方式 iOS 商店版 / iOS 轻量版 / Android 版</p>
|
||||
</div>
|
||||
<div class="about-app__qr"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/app-qr.png" alt="下载黄果短剧 App 二维码"></div>
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<div class="about-app__actions">
|
||||
<a class="about-app__button is-primary" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-apple.svg" alt="Apple"><span class="about-app__button-label-desktop">iOS 商店版</span><span class="about-app__button-label-mobile">下载 iOS 商店版</span><span class="about-app__recommendation">推荐</span>
|
||||
</a>
|
||||
<a class="about-app__button" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-apple.svg" alt="Apple">iOS 轻量版</a>
|
||||
<a class="about-app__button about-app__button--android" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/brand-android.svg" alt="Android">Android 版</a>
|
||||
</div>
|
||||
<p class="about-app__note-mobile">已识别为 iOS 设备:推荐商店版前往 App Store,也可选轻量版用 Safari 安装描述文件</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,68 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/legal.css?v=5">
|
||||
</head>
|
||||
<body class="legal-page dmca-page">
|
||||
{{template "header" .}}
|
||||
<header class="page-subheader only-h5" aria-label="DMCA 版权声明页顶栏">
|
||||
<a class="page-subheader__btn" href="/" aria-label="返回首页"><img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回"></a>
|
||||
<span class="page-subheader__title">DMCA 版权声明</span>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="legal-main">
|
||||
<div class="legal-hero">
|
||||
<p class="legal-kicker"><span class="legal-kicker__bar" aria-hidden="true"></span>DMCA 版权声明</p>
|
||||
<h1 class="legal-title">黄果短剧 DMCA 版权声明</h1>
|
||||
<p class="legal-dates">生效日期 2026 年 9 月 1 日 最近更新 2026 年 9 月 1 日</p>
|
||||
</div>
|
||||
<div class="legal-layout">
|
||||
<nav class="legal-toc" aria-label="DMCA 版权声明目录">
|
||||
<span class="legal-toc__label">目录</span>
|
||||
<div class="legal-toc__list">
|
||||
<a class="legal-toc__item is-active" href="#dmca-1"><span class="legal-toc__number">01</span><span>版权投诉适用范围</span></a>
|
||||
<a class="legal-toc__item" href="#dmca-2"><span class="legal-toc__number">02</span><span>投诉材料建议包含</span></a>
|
||||
<a class="legal-toc__item" href="#dmca-3"><span class="legal-toc__number">03</span><span>处理流程</span></a>
|
||||
<a class="legal-toc__item" href="#dmca-4"><span class="legal-toc__number">04</span><span>反通知说明</span></a>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="legal-content">
|
||||
<p class="legal-intro">黄果短剧尊重原创作品、版权方、平台方和相关权利人的合法权益。如果您认为本站展示、整理或索引的某项内容侵犯了您的版权或其他合法权益,可以按照本页面说明提交版权投诉材料。</p>
|
||||
<section class="legal-section" id="dmca-1">
|
||||
<h2 class="legal-section__title">1. 版权投诉适用范围</h2>
|
||||
<p class="legal-section__paragraph">1.1 版权投诉可用于反馈疑似未经授权展示、错误引用、侵权封面、侵权标题、侵权简介、错误资源归属或其他可能侵犯权利人合法权益的内容。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="dmca-2">
|
||||
<h2 class="legal-section__title">2. 投诉材料建议包含</h2>
|
||||
<p class="legal-section__paragraph">2.1 权利人或授权代理人的姓名、联系方式与身份证明。</p>
|
||||
<p class="legal-section__paragraph">2.2 授权代理人提交投诉时,需要提供有效授权文件。</p>
|
||||
<p class="legal-section__paragraph">2.3 被投诉内容的剧名、作品 ID、页面位置、具体集数或截图。</p>
|
||||
<p class="legal-section__paragraph">2.4 能够证明权利归属的材料,例如作品登记信息、授权协议、发布证明或其他有效文件。</p>
|
||||
<p class="legal-section__paragraph">2.5 投诉内容真实、准确、完整的声明,并说明愿意承担不实投诉带来的责任。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="dmca-3">
|
||||
<h2 class="legal-section__title">3. 处理流程</h2>
|
||||
<p class="legal-section__paragraph">3.1 收到有效材料后,黄果短剧会尽快进行初步核查。若材料完整且问题明确,我们会根据情况采取删除、下架、屏蔽、修改信息或限制展示等处理。若材料不完整,我们可能需要投诉方补充信息。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="dmca-4">
|
||||
<h2 class="legal-section__title">4. 反通知说明</h2>
|
||||
<p class="legal-section__paragraph">4.1 如果内容提供方认为相关内容被误删、误下架或误判,可以提交反通知材料,说明权利来源、授权依据和恢复理由。</p>
|
||||
{{$contact := .config.TGGroup}}{{if not $contact}}{{$contact = .config.Telegram}}{{end}}{{if not $contact}}{{$contact = .config.TelegramAdd}}{{end}}{{if not $contact}}{{$contact = "https://t.me/huangguosan"}}{{end}}
|
||||
<p class="legal-section__meta">
|
||||
<span>版权处理入口</span>
|
||||
<a href="{{$contact}}" target="_blank" rel="sponsored nofollow noopener">{{$contact}}</a>
|
||||
</p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script defer src="/static/js/pages/legal.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,69 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/profile.css?v=9">
|
||||
<link rel="stylesheet" href="/static/css/profile-mobile.css?v=5">
|
||||
<link rel="stylesheet" href="/static/css/favorites.css?v=6">
|
||||
<link rel="stylesheet" href="/static/css/favorites-mobile.css?v=7">
|
||||
<link rel="stylesheet" href="/static/css/search.css?v=13">
|
||||
</head>
|
||||
<body class="profile-page favorites-page">
|
||||
{{template "header" .}}
|
||||
{{template "userCenterHero" .}}
|
||||
{{template "userCenterTabs" .}}
|
||||
<main class="favorites-main{{if not .favorites}} is-empty{{end}}" data-favorites>
|
||||
<h1 class="visually-hidden">我的收藏</h1>
|
||||
<div class="favorites-toolbar" data-favorites-toolbar>
|
||||
<div class="favorites-filters" role="group" aria-label="收藏筛选">
|
||||
<a class="favorites-filter{{if eq .filter "all"}} is-active{{end}}" href="/favorites">全部</a>
|
||||
<a class="favorites-filter favorites-filter--type{{if eq .filter "short"}} is-active{{end}}" href="/favorites/short">短剧</a>
|
||||
<a class="favorites-filter favorites-filter--type{{if or (eq .filter "series") (eq .filter "chapter")}} is-active{{end}}" href="/favorites/series">视频</a>
|
||||
<a class="favorites-filter{{if eq .filter "following"}} is-active{{end}}" href="/favorites/following">追剧中</a>
|
||||
<a class="favorites-filter favorites-filter--complete{{if eq .filter "finished"}} is-active{{end}}" href="/favorites/finished">已看完</a>
|
||||
</div>
|
||||
{{if .favorites}}<button class="favorites-manage" type="button" data-favorites-manage aria-pressed="false"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/favorites/sliders.svg" alt="管理收藏"><span>管理</span></button>{{end}}
|
||||
</div>
|
||||
<div class="favorites-grid" data-favorites-grid{{if not .favorites}} hidden{{end}}>
|
||||
{{range .favorites}}
|
||||
<article class="favorites-card profile-card" data-favorites-card>
|
||||
<div class="favorites-card__media">
|
||||
<button class="favorites-card__remove" type="button" data-favorites-remove data-id="{{.ID}}" data-kind="{{.Kind}}"{{if .DramaID}} data-drama-id="{{.DramaID}}" data-drama-title="{{.Title}}" data-episode="{{.Episode}}" data-total-episode="{{.TotalEpisode}}"{{if .VideoID}} data-video-id="{{.VideoID}}"{{end}}{{end}} aria-label="取消收藏{{.Title}}">×</button>
|
||||
{{if .URL}}<a class="profile-card__cover" href="{{.URL}}" {{externalLinkAttrs .URL}} aria-label="播放{{.Title}}">{{else}}<div class="profile-card__cover">{{end}}
|
||||
<img decoding="async" class="profile-card__image lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Image}}" alt="{{.Title}}" loading="lazy">
|
||||
<span class="profile-card__episodes">{{.Episodes}}</span>
|
||||
{{if .Badge}}<span class="profile-card__badge profile-card__badge--hot">{{.Badge}}</span>{{end}}
|
||||
{{if .URL}}</a>{{else}}</div>{{end}}
|
||||
</div>
|
||||
<h2 class="profile-card__title">{{if .URL}}<a href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Title}}</a>{{else}}{{.Title}}{{end}}</h2>
|
||||
<p class="profile-card__meta"><span class="favorites-card__desktop-meta">{{.DesktopMeta}}</span><span class="favorites-card__mobile-meta">{{.Genre}}</span></p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
<section class="favorites-empty" data-favorites-empty{{if .favorites}} hidden{{end}} aria-labelledby="favorites-empty-title">
|
||||
<span class="favorites-empty__icon" aria-hidden="true"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/favorites-empty/bookmark.svg" alt="收藏"></span>
|
||||
<h2 class="favorites-empty__title" id="favorites-empty-title">{{if .favoritesUnavailable}}收藏暂时无法加载{{else if ne .filter "all"}}暂无相关收藏{{else}}还没有收藏的作品{{end}}</h2>
|
||||
<p class="favorites-empty__description"><span class="favorites-empty__description-desktop">在播放页点击「加入收藏」,更新时第一时间提醒你</span><span class="favorites-empty__description-mobile">在播放页点击「收藏」,更新时第一时间提醒你</span></p>
|
||||
<a class="favorites-empty__action" href="/"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/favorites-empty/arrow-right.svg" alt="前往首页">去首页逛逛</a>
|
||||
</section>
|
||||
{{if and (not .favorites) .recommended}}
|
||||
<section class="search-recommendations favorites-recommendations" aria-label="热门推荐">
|
||||
<div class="search-recommendations__heading">
|
||||
<h2>大家都在看</h2>
|
||||
<a href="/list"><span class="search-recommendations__more-label search-recommendations__more-label--pc">查看全部</span><span class="search-recommendations__more-label search-recommendations__more-label--h5">全部</span><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></a>
|
||||
</div>
|
||||
<div class="search-card-grid">
|
||||
{{range .recommended}}{{template "searchCard" .}}{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
{{template "accountPagination" .}}
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script src="/static/js/favorites-manage.js?v=5" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,159 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/feedback.css">
|
||||
</head>
|
||||
<body class="page-feedback">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">意见反馈</div>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<div class="page feedback-page">
|
||||
<main class="main feedback-main">
|
||||
<section class="feedback-hero" aria-label="意见反馈">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
意见反馈
|
||||
</p>
|
||||
<h1 class="feedback-hero__title">告诉我们哪里可以更好</h1>
|
||||
<p class="feedback-hero__desc">播放问题、账号与支付、内容举报或功能建议,我们都会认真处理。</p>
|
||||
</section>
|
||||
|
||||
<section class="feedback-layout" aria-label="反馈表单">
|
||||
<form class="feedback-form" action="#" method="post" data-feedback-form>
|
||||
<div class="feedback-form__field">
|
||||
<span class="feedback-form__label">问题类型</span>
|
||||
<div class="feedback-form__types" role="radiogroup" aria-label="问题类型">
|
||||
<label class="feedback-type is-active">
|
||||
<input type="radio" name="type" value="play" checked>
|
||||
播放问题
|
||||
</label>
|
||||
<label class="feedback-type">
|
||||
<input type="radio" name="type" value="account">
|
||||
账号与支付
|
||||
</label>
|
||||
<label class="feedback-type">
|
||||
<input type="radio" name="type" value="report">
|
||||
内容举报
|
||||
</label>
|
||||
<label class="feedback-type">
|
||||
<input type="radio" name="type" value="suggest">
|
||||
功能建议
|
||||
</label>
|
||||
<label class="feedback-type">
|
||||
<input type="radio" name="type" value="other">
|
||||
其他
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="feedback-form__field">
|
||||
<span class="feedback-form__label">问题描述</span>
|
||||
<span class="feedback-form__textarea-wrap">
|
||||
<textarea
|
||||
class="feedback-form__textarea"
|
||||
name="content"
|
||||
maxlength="500"
|
||||
rows="6"
|
||||
placeholder="请描述遇到的问题、发生的页面与操作步骤,越具体越好"
|
||||
data-feedback-content
|
||||
required
|
||||
></textarea>
|
||||
<span class="feedback-form__count"><span data-feedback-count>0</span> / 500</span>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<div class="feedback-form__field">
|
||||
<span class="feedback-form__label">截图(选填,最多 3 张,支持 jpg / png / gif)</span>
|
||||
<div class="feedback-uploads" data-feedback-uploads>
|
||||
<label class="feedback-upload feedback-upload--add">
|
||||
<input type="file" accept=".jpg,.jpeg,.png,.gif,image/jpeg,image/png,image/gif" multiple hidden data-feedback-file>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/plus-dim.svg" alt="添加图片" aria-hidden="true">
|
||||
<span>上传截图</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="feedback-form__field">
|
||||
<span class="feedback-form__label">联系方式(选填)</span>
|
||||
<span class="feedback-form__control">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/mail-dim.svg" alt="联系邮箱" aria-hidden="true">
|
||||
<input
|
||||
class="feedback-form__input"
|
||||
type="text"
|
||||
name="contact"
|
||||
autocomplete="email"
|
||||
placeholder="邮箱或手机号,方便我们回复你"
|
||||
>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<div class="feedback-form__foot">
|
||||
<button class="btn btn--primary feedback-form__submit" type="submit">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/send.svg" alt="发送">
|
||||
提交反馈
|
||||
</button>
|
||||
<p class="feedback-form__hint">提交后可在 个人中心 / 我的反馈 查看处理进度</p>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<aside class="feedback-aside" aria-label="帮助与联系">
|
||||
<div class="feedback-aside__card only-pc">
|
||||
<h2 class="feedback-aside__title">先看看这些是否有帮助</h2>
|
||||
<a class="feedback-aside__link" href="/help">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/feedback/help-circle.svg" alt="帮助">
|
||||
黄果短剧网页版可以看全集吗?
|
||||
</a>
|
||||
<a class="feedback-aside__link" href="/help">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/feedback/help-circle.svg" alt="帮助">
|
||||
解锁过的剧集还需要再付费吗?
|
||||
</a>
|
||||
<a class="feedback-aside__link" href="/help">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/feedback/help-circle.svg" alt="帮助">
|
||||
如何充值金币?
|
||||
</a>
|
||||
<a class="feedback-aside__link" href="/help">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/feedback/help-circle.svg" alt="帮助">
|
||||
支持哪些支付方式?
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="feedback-aside__card feedback-aside__card--muted">
|
||||
<h2 class="feedback-aside__title">其他联系方式</h2>
|
||||
{{if .config.GmailAddr}}
|
||||
<p class="feedback-aside__row">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/mail-dim.svg" alt="联系邮箱">
|
||||
<a href="mailto:{{.config.GmailAddr}}" rel="sponsored nofollow noopener">{{.config.GmailAddr}}</a>
|
||||
</p>
|
||||
{{end}}
|
||||
{{if .config.TelegramURL}}
|
||||
<p class="feedback-aside__row">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/send.svg" alt="发送">
|
||||
<a href="{{.config.TelegramURL}}" target="_blank" rel="sponsored nofollow noopener">Telegram{{if .config.TelegramHandle}} {{.config.TelegramHandle}}{{end}}</a>
|
||||
</p>
|
||||
{{end}}
|
||||
<p class="feedback-aside__row">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/clock-dim.svg" alt="发生时间">
|
||||
<span>工作日 10:00 至 22:00</span>
|
||||
</p>
|
||||
</div>
|
||||
</aside>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
<script defer src="/static/js/pages/feedback.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,81 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/help.css?v=2">
|
||||
</head>
|
||||
<body class="help-page">
|
||||
{{template "header" .}}
|
||||
<header class="page-subheader only-h5" aria-label="常见问题页顶栏">
|
||||
<a class="page-subheader__btn" href="/" aria-label="返回首页"><img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回"></a>
|
||||
<div class="page-subheader__title">常见问题</div>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="help-main">
|
||||
<div class="help-heading">
|
||||
<p class="help-kicker"><span aria-hidden="true"></span>常见问题</p>
|
||||
<h1>关于黄果,你想知道的</h1>
|
||||
<p class="help-heading__intro">找不到答案?欢迎通过意见反馈或邮箱联系我们。</p>
|
||||
</div>
|
||||
|
||||
<div class="help-content">
|
||||
<section class="help-faq" aria-label="常见问题列表" data-help-faq>
|
||||
<details class="help-faq__item" open>
|
||||
<summary>黄果短剧网页版可以看全集吗?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>可以。免费集直接观看,付费集可用金币按集解锁,解锁后永久有效。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>解锁过的剧集还需要再付费吗?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>不需要。已解锁的剧集可在登录后继续观看,无需重复付费。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>如何充值金币?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>登录后进入个人中心,选择金币充值,即可查看可用的充值方式。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>支持哪些支付方式?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>可用的支付方式会在充值页面列出,请以页面显示为准。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>忘记密码怎么办?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>请通过意见反馈联系我们,提交账号信息后由客服协助处理。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>内容多久更新一次?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>黄果短剧持续更新内容,欢迎关注首页的新剧和最近上新。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>如何联系客服或洽谈合作?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>请发送邮件至 support@huangguo.com,我们会尽快回复。</p>
|
||||
</details>
|
||||
<details class="help-faq__item">
|
||||
<summary>如何注销账号?<span class="help-faq__chevron" aria-hidden="true"></span></summary>
|
||||
<p>请通过意见反馈或客服邮箱提交注销申请。</p>
|
||||
</details>
|
||||
</section>
|
||||
|
||||
<aside class="help-aside">
|
||||
<section class="help-contact" aria-labelledby="help-contact-title">
|
||||
<h2 id="help-contact-title">还有其他问题?</h2>
|
||||
<p>工作日 10:00 至 22:00 在线,通常 1 个工作日内回复。</p>
|
||||
<a class="help-contact__button" href="/feedback"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/send.svg" alt="发送">提交意见反馈</a>
|
||||
<a class="help-contact__email" href="mailto:support@huangguo.com" rel="sponsored nofollow noopener"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/mail-dim.svg" alt="联系邮箱">support@huangguo.com</a>
|
||||
</section>
|
||||
<section class="help-app" aria-labelledby="help-app-title">
|
||||
<h2 id="help-app-title">在 App 上体验更多</h2>
|
||||
<p>离线缓存、弹幕互动、随时随地看</p>
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">下载 APP</a>
|
||||
</section>
|
||||
</aside>
|
||||
</div>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script defer src="/static/js/pages/help.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,79 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/profile.css?v=9">
|
||||
<link rel="stylesheet" href="/static/css/profile-mobile.css?v=5">
|
||||
<link rel="stylesheet" href="/static/css/history.css?v=4">
|
||||
<link rel="stylesheet" href="/static/css/history-mobile.css?v=7">
|
||||
<link rel="stylesheet" href="/static/css/account-empty.css?v=2">
|
||||
</head>
|
||||
<body class="profile-page history-page">
|
||||
{{template "header" .}}
|
||||
{{template "userCenterHero" .}}
|
||||
{{template "userCenterTabs" .}}
|
||||
<main class="history-main{{if not .groups}} is-empty{{end}}" data-history>
|
||||
<h1 class="visually-hidden">观看历史</h1>
|
||||
<div class="history-toolbar">
|
||||
<div class="history-filters" role="group" aria-label="观看历史筛选">
|
||||
<button class="history-filter is-active" type="button" data-history-filter="all" aria-pressed="true">全部</button>
|
||||
<button class="history-filter" type="button" data-history-filter="short" aria-pressed="false">短剧</button>
|
||||
<button class="history-filter" type="button" data-history-filter="series" aria-pressed="false">视频</button>
|
||||
</div>
|
||||
{{if .groups}}
|
||||
<button class="history-clear" type="button" data-history-clear>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
<span class="history-clear__desktop">清空历史</span>
|
||||
<span class="history-clear__mobile">清空</span>
|
||||
</button>
|
||||
{{end}}
|
||||
</div>
|
||||
{{range .groups}}
|
||||
<section class="history-group" data-history-group>
|
||||
<h2 class="history-group__title">{{.Title}}</h2>
|
||||
<div class="history-list">
|
||||
{{range .Entries}}
|
||||
<article class="history-item" data-history-item data-kind="{{.Kind}}"{{if .ID}} data-id="{{.ID}}"{{end}}>
|
||||
{{if .URL}}<a class="history-item__cover" href="{{.URL}}" {{externalLinkAttrs .URL}} aria-label="继续观看{{.Title}}">{{else}}<div class="history-item__cover">{{end}}
|
||||
<img decoding="async" class="history-item__image lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Image}}" alt="{{.Title}}" loading="lazy">
|
||||
{{if .URL}}</a>{{else}}</div>{{end}}
|
||||
<div class="history-item__body">
|
||||
<h3 class="history-item__title">{{if .URL}}<a href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Title}}</a>{{else}}{{.Title}}{{end}}</h3>
|
||||
<div class="history-item__details">
|
||||
<span class="history-item__episodes">{{if .EpisodeText}}{{.EpisodeText}}{{else if .Current}}看至第 {{.Current}} 集{{else}}观看记录{{end}}{{if and (not .EpisodeText) .Total}} / 共 {{.Total}} 集{{end}}</span>
|
||||
{{if .Genre}}<span class="history-item__genre">{{.Genre}}</span>{{end}}
|
||||
<span class="history-item__mobile-time">{{.Time}}</span>
|
||||
</div>
|
||||
{{if .Progress}}<span class="history-item__progress"><span class="history-item__progress-fill" style="width:{{.Progress}}"></span></span>{{end}}
|
||||
</div>
|
||||
<span class="history-item__time">{{.Time}}</span>
|
||||
{{if .URL}}<a class="history-item__resume" href="{{.URL}}" {{externalLinkAttrs .URL}} aria-label="继续观看{{.Title}}">
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
<span class="history-item__resume-desktop">继续观看</span><span class="history-item__resume-mobile">继续</span>
|
||||
</a>{{end}}
|
||||
<button class="history-item__remove" type="button" data-history-remove aria-label="移除{{.Title}}">
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
<section class="account-empty" data-history-empty{{if .groups}} hidden{{end}} aria-labelledby="history-empty-title">
|
||||
<span class="account-empty__icon" aria-hidden="true"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放"></span>
|
||||
<h2 class="account-empty__title" id="history-empty-title">{{if .historyUnavailable}}观看记录暂时无法加载{{else}}暂无观看记录{{end}}</h2>
|
||||
{{if not .historyUnavailable}}
|
||||
<p class="account-empty__description"><span class="account-empty__description-desktop">你观看过的短剧会显示在这里</span><span class="account-empty__description-mobile">观看过的短剧会显示在这里</span></p>
|
||||
<a class="account-empty__action" href="/"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/favorites-empty/arrow-right.svg" alt="前往首页">去首页逛逛</a>
|
||||
{{end}}
|
||||
</section>
|
||||
{{template "accountPagination" .}}
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script src="/static/js/history.js?v=6" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,342 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/index.css?v=14">
|
||||
</head>
|
||||
<body>
|
||||
{{template "header" .}}
|
||||
<h1 class="visually-hidden">黄果短剧</h1>
|
||||
|
||||
<!-- Hero:homeBannerData -->
|
||||
{{if .homeBannerData}}
|
||||
{{$banners := .homeBannerData}}
|
||||
{{$first := index $banners 0}}
|
||||
<section class="hero" aria-label="本周主打" data-hero>
|
||||
<img loading="lazy" class="hero__bg is-active lazy" src="/static/images/placeholder.png?v=2" data-src="{{if $first.Banner}}{{$first.Banner}}{{else}}{{$first.Cover}}{{end}}" decoding="async" alt="{{if $first.PlayName}}{{$first.PlayName}}{{else}}{{$first.Title}}{{end}}横幅" data-hero-bg>
|
||||
<div class="hero__shade hero__shade--side" aria-hidden="true"></div>
|
||||
<div class="hero__shade hero__shade--bottom" aria-hidden="true"></div>
|
||||
<div class="hero__shade hero__shade--top" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero__viewport">
|
||||
{{range $i, $item := $banners}}
|
||||
<article class="hero__slide{{if eq $i 0}} is-active{{end}}" data-hero-slide="{{$i}}"{{if ne $i 0}} hidden{{end}}>
|
||||
<div class="hero__info">
|
||||
<div class="hero__meta">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
{{if $item.IsNew}}本周主打 新剧速递{{else if $item.IsFeatured}}本周主打 独家首发{{else if $item.IsRecommend}}本周主打 热播推荐{{else}}本周主打 口碑佳作{{end}}
|
||||
</p>
|
||||
<span class="tag tag--dark">18+</span>
|
||||
</div>
|
||||
<h2 class="hero__title">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</h2>
|
||||
<p class="hero__attrs">
|
||||
{{range $ti, $t := $item.ThemeNames}}{{if $ti}} {{end}}{{$t}}{{end}}
|
||||
{{if $item.TotalEpisode}} 全 {{$item.TotalEpisode}} 集{{end}}
|
||||
{{if $item.Anchor}} 主演 {{$item.Anchor}}{{end}}
|
||||
</p>
|
||||
<p class="hero__desc">{{$item.Desc}}</p>
|
||||
<div class="hero__actions">
|
||||
<a class="btn btn--primary btn--lg" href="{{playURL $item.Slug $item.ID}}">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
立即播放
|
||||
</a>
|
||||
<a class="btn btn--ghost btn--lg hero__trailer" href="{{playURL $item.Slug $item.ID}}" aria-label="播放">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/film.svg" alt="影视详情">
|
||||
<span class="only-pc">详情</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero__media">
|
||||
<a href="{{playURL $item.Slug $item.ID}}">
|
||||
<img class="hero__poster" src="/static/images/placeholder.png?v=2" data-src="{{if $item.HorizontalCover}}{{$item.HorizontalCover}}{{else if $item.Banner}}{{$item.Banner}}{{else}}{{$item.Cover}}{{end}}" data-hero-poster loading="lazy" decoding="async" data-hero-media="{{if $item.Banner}}{{$item.Banner}}{{else}}{{$item.Cover}}{{end}}" alt="{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}">
|
||||
</a>
|
||||
<a class="hero__play" href="{{playURL $item.Slug $item.ID}}" aria-label="播放">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</a>
|
||||
<span class="badge badge--hot">{{if eq $item.OperateType 2}}漫剧{{else}}短剧{{end}}</span>
|
||||
</div>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<div class="hero__thumbs">
|
||||
<div class="hero__thumb-list" role="tablist" aria-label="本周主打剧集">
|
||||
{{range $i, $item := $banners}}
|
||||
<button class="hero__thumb{{if eq $i 0}} is-active{{end}}" type="button" role="tab" aria-selected="{{if eq $i 0}}true{{else}}false{{end}}" data-hero-index="{{$i}}">
|
||||
<img class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{if $item.Cover}}{{$item.Cover}}{{else}}{{$item.Banner}}{{end}}" loading="lazy" decoding="async" alt="{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}">
|
||||
</button>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="hero__pager">
|
||||
<span class="hero__pager-label">本周主打 {{len $banners}} 部</span>
|
||||
<span class="hero__pager-track" aria-hidden="true">
|
||||
<span class="hero__pager-fill"></span>
|
||||
</span>
|
||||
<span class="hero__pager-index"><span data-hero-current>01</span> / {{printf "%02d" (len $banners)}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<script src="/static/js/hero.js?v=8" defer></script>
|
||||
{{end}}
|
||||
|
||||
<div class="page">
|
||||
|
||||
<main class="main">
|
||||
<!-- 公告:GET /api/app/playlet/home → announcements;无数据不渲染 -->
|
||||
{{if .announcements}}
|
||||
<section class="announce" aria-label="公告">
|
||||
<div class="announce__label">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/bell.svg" alt="更新提醒">
|
||||
公告
|
||||
</div>
|
||||
<div class="announce__track">
|
||||
<div class="announce__marquee">
|
||||
<div class="announce__marquee-group">
|
||||
{{range $i, $a := .announcements}}
|
||||
{{if $i}}<span class="announce__sep" aria-hidden="true"></span>{{end}}
|
||||
<p>{{if $a.Title}}{{$a.Title}}:{{end}}{{$a.Content}}</p>
|
||||
{{end}}
|
||||
<span class="announce__sep" aria-hidden="true"></span>
|
||||
</div>
|
||||
<div class="announce__marquee-group" aria-hidden="true">
|
||||
{{range $i, $a := .announcements}}
|
||||
{{if $i}}<span class="announce__sep" aria-hidden="true"></span>{{end}}
|
||||
<p>{{if $a.Title}}{{$a.Title}}:{{end}}{{$a.Content}}</p>
|
||||
{{end}}
|
||||
<span class="announce__sep" aria-hidden="true"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
<!-- 短剧标签:GET /api/app/playlet/tag/options → /tags/{slug}/ → tags.html -->
|
||||
<nav class="category" aria-label="短剧标签">
|
||||
<a class="category__item is-active" href="/list">全部</a>
|
||||
{{range .tagOptions}}
|
||||
<a class="category__item" href="{{tagPageURL .Slug .ID 1 1}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</nav>
|
||||
|
||||
<!-- 继续观看:GET /api/app/playlet/history/list?pageNum=1&pageSize=6;无数据不渲染 -->
|
||||
{{if .continueWatch}}
|
||||
<section class="block block--continue">
|
||||
<header class="block__head">
|
||||
<div class="block__titles">
|
||||
<h2 class="block__title">继续观看</h2>
|
||||
<p class="block__subtitle">上次看到</p>
|
||||
</div>
|
||||
<a class="block__more" href="/history">
|
||||
观看历史
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</header>
|
||||
<div class="grid grid--6">
|
||||
{{range $item := .continueWatch}}
|
||||
<article class="card">
|
||||
<a class="card__cover lazy" href="{{historyPlayURL $item}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
<span class="card__progress" style="--p:{{historyProgressPct $item}}"></span>
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{historyPlayURL $item}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{historyContinueMeta $item}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
<!--
|
||||
homeConfigData:按接口顺序渲染;type 1短剧 / 2视频 / 3题材;
|
||||
名称为「热播榜」时用热播榜专用 UI;除 type=3 外下方插入 advitise.detailbannerList(每次 2 条)
|
||||
-->
|
||||
{{$adIdx := 0}}
|
||||
{{range $cfg := .homeConfigData}}
|
||||
{{if and (eq $cfg.Type 1) (eq $cfg.Name "热播榜") $.hotRankPlaylets}}
|
||||
<section class="block block--rank" data-id="{{$cfg.ID}}" data-type="{{$cfg.Type}}" aria-label="热播榜">
|
||||
<header class="block__head">
|
||||
<div class="block__titles">
|
||||
<h2 class="block__title">{{$cfg.Name}}</h2>
|
||||
</div>
|
||||
<a class="block__more" href="/rank">
|
||||
完整榜单
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="grid grid--rank">
|
||||
{{range $i, $item := $.hotRankPlaylets}}
|
||||
{{$rank := add $i 1}}
|
||||
<article class="rank-card{{if ge $i 6}} only-pc{{end}}">
|
||||
<div class="rank-card__rank">
|
||||
<span class="rank-card__no{{if le $rank 3}} is-top{{end}}">{{rankNo $rank}}</span>
|
||||
</div>
|
||||
<div class="rank-card__body">
|
||||
<a class="rank-card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if eq $item.UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if $item.TotalEpisode}}
|
||||
<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>
|
||||
{{end}}
|
||||
</a>
|
||||
<h3 class="rank-card__title"><a href="{{playURL $item.Slug $item.ID}}">{{playletDisplayName $item.PlayName $item.Title}}</a></h3>
|
||||
<p class="rank-card__meta">
|
||||
{{$tags := cardTags $item}}
|
||||
{{range $ti, $tag := $tags}}{{if $ti}} {{end}}{{$tag.Name}}{{end}}
|
||||
{{if and $tags $item.TotalEpisode}}<span class="only-pc"> 全 {{$item.TotalEpisode}} 集</span>{{else if $item.TotalEpisode}}<span class="only-pc">全 {{$item.TotalEpisode}} 集</span>{{end}}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdx 2)}}
|
||||
{{$adIdx = add $adIdx 2}}
|
||||
|
||||
{{else if eq $cfg.Type 1}}
|
||||
<section class="block block--featured" data-id="{{$cfg.ID}}" data-type="{{$cfg.Type}}">
|
||||
<header class="block__head">
|
||||
<div class="block__titles">
|
||||
<h2 class="block__title">{{$cfg.Name}}</h2>
|
||||
{{if $cfg.Desc}}<p class="block__subtitle">{{$cfg.Desc}}</p>{{end}}
|
||||
</div>
|
||||
<a class="block__more" href="{{moreListURL $cfg.Slug $cfg.ID 0 "" 0 1}}">
|
||||
查看全部
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</header>
|
||||
{{if $cfg.List}}
|
||||
<div class="grid grid--6">
|
||||
{{range $item := $cfg.List}}
|
||||
<article class="card">
|
||||
<a class="card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if $item.TotalEpisode}}<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>{{end}}
|
||||
{{if $item.IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq $item.Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</section>
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdx 2)}}
|
||||
{{$adIdx = add $adIdx 2}}
|
||||
|
||||
{{else if eq $cfg.Type 2}}
|
||||
<section class="block block--series" data-id="{{$cfg.ID}}" data-type="{{$cfg.Type}}">
|
||||
<header class="block__head">
|
||||
<div class="block__titles">
|
||||
<h2 class="block__title">{{$cfg.Name}}</h2>
|
||||
{{if $cfg.Desc}}<p class="block__subtitle">{{$cfg.Desc}}</p>{{end}}
|
||||
</div>
|
||||
<a class="block__more" href="{{moreSeriesListURL $cfg.Slug $cfg.ID 0 "" 0 1}}">
|
||||
查看全部
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</header>
|
||||
{{if $cfg.VideoList}}
|
||||
<div class="grid grid--series">
|
||||
{{range $item := $cfg.VideoList}}
|
||||
<article class="series-card">
|
||||
<a class="series-card__cover lazy" href="{{videoPlayURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.CoverImg}}">
|
||||
{{if $item.VideoTime}}<span class="card__ep">{{$item.VideoTime}}分钟</span>{{end}}
|
||||
<span class="badge badge--hot">影集</span>
|
||||
<span class="series-card__play" aria-hidden="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</span>
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{videoPlayURL $item.Slug $item.ID}}">{{$item.Title}}</a></h3>
|
||||
<p class="card__meta">{{$item.CreatorName}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{else if $cfg.List}}
|
||||
<div class="grid grid--series">
|
||||
{{range $item := $cfg.List}}
|
||||
<article class="series-card">
|
||||
<a class="series-card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{if $item.HorizontalCover}}{{$item.HorizontalCover}}{{else if $item.Banner}}{{$item.Banner}}{{else}}{{$item.Cover}}{{end}}">
|
||||
{{if $item.TotalEpisode}}<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>{{else}}<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>{{end}}
|
||||
<span class="badge badge--hot">{{if eq $item.OperateType 2}}漫剧{{else}}短剧{{end}}</span>
|
||||
<span class="series-card__play" aria-hidden="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</span>
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</section>
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdx 2)}}
|
||||
{{$adIdx = add $adIdx 2}}
|
||||
|
||||
{{else if eq $cfg.Type 3}}
|
||||
<section class="block block--topic" data-id="{{$cfg.ID}}" data-type="{{$cfg.Type}}">
|
||||
<header class="block__head">
|
||||
<div class="block__titles">
|
||||
<h2 class="block__title">{{$cfg.Name}}</h2>
|
||||
{{if $cfg.Desc}}<p class="block__subtitle">{{$cfg.Desc}}</p>{{end}}
|
||||
</div>
|
||||
<a class="block__more" href="/topic">
|
||||
全部专题
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</header>
|
||||
{{if $cfg.ThemeList}}
|
||||
<div class="topic-grid">
|
||||
{{range $theme := $cfg.ThemeList}}
|
||||
<article class="topic-card">
|
||||
<div class="topic-card__info">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
专题
|
||||
</p>
|
||||
<h3 class="topic-card__title"><a href="{{categoryURL $theme.Slug $theme.ID}}">{{$theme.Name}}</a></h3>
|
||||
{{if $theme.Desc}}<p class="topic-card__desc">{{$theme.Desc}}</p>{{end}}
|
||||
<p class="topic-card__count">{{if $theme.PlayletCount}}{{$theme.PlayletCount}} 部 持续更新{{else}}持续更新{{end}}</p>
|
||||
</div>
|
||||
<a class="topic-card__stack" href="{{categoryURL $theme.Slug $theme.ID}}" aria-hidden="true">
|
||||
{{range $ci, $c := $theme.List}}{{if lt $ci 3}}
|
||||
<img class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{$c.Cover}}" loading="lazy" decoding="async" alt="{{$c.Title}}封面">
|
||||
{{end}}{{end}}
|
||||
</a>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</section>
|
||||
{{end}}
|
||||
{{end}}
|
||||
|
||||
<!-- App 下载 -->
|
||||
<section class="app-cta">
|
||||
<div class="app-cta__copy">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
黄果短剧 App
|
||||
</p>
|
||||
<h2 class="block__title">在 App 上继续追剧,离线缓存随时看</h2>
|
||||
<p class="block__subtitle">竖屏沉浸播放 离线缓存 弹幕互动</p>
|
||||
<p class="app-cta__hint">点击后前往黄果短剧下载页,手机打开会自动识别设备并推荐安装方式</p>
|
||||
</div>
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a class="app-cta__download" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="app-cta__download-icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="">
|
||||
点击下载
|
||||
</a>
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,110 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
</head>
|
||||
<body class="page-list">
|
||||
{{template "header" .}}
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="短剧频道">
|
||||
<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">{{if .pageHeading}}{{.pageHeading}}{{else}}全部短剧{{end}}</h1>
|
||||
<p class="list-hero__desc">海量竖屏原创短剧,每日 18:00 上新</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{{if and (eq .themeSlug "") (eq .themeId 0)}} is-active{{end}}" href="{{allListURL "" 0 .updateStatus .sortType 1}}">全部</a>
|
||||
{{range .themeList}}
|
||||
<a class="filter-chip{{if or (and (ne $.themeSlug "") (eq $.themeSlug .Slug)) (and (gt $.themeId 0) (eq $.themeId .ID))}} is-active{{end}}" href="{{allListURL .Slug .ID $.updateStatus $.sortType 1}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">状态</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if eq .updateStatus 0}} is-active{{end}}" href="{{allListURL .themeSlug .themeId 0 .sortType 1}}">全部</a>
|
||||
<a class="filter-chip{{if eq .updateStatus 1}} is-active{{end}}" href="{{allListURL .themeSlug .themeId 1 .sortType 1}}">连载中</a>
|
||||
<a class="filter-chip{{if eq .updateStatus 2}} is-active{{end}}" href="{{allListURL .themeSlug .themeId 2 .sortType 1}}">已完结</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">排序</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if eq .sortType 1}} is-active{{end}}" href="{{allListURL .themeSlug .themeId .updateStatus 1 1}}">最新</a>
|
||||
<a class="filter-chip{{if eq .sortType 2}} is-active{{end}}" href="{{allListURL .themeSlug .themeId .updateStatus 2 1}}">最热</a>
|
||||
<a class="filter-chip{{if eq .sortType 3}} is-active{{end}}" href="{{allListURL .themeSlug .themeId .updateStatus 3 1}}">收藏最多</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="短剧列表">
|
||||
<h2 class="visually-hidden">短剧列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
{{$adIdxPc := 0}}
|
||||
{{$adIdxH5 := 0}}
|
||||
{{$total := len .list}}
|
||||
<div class="grid--list">
|
||||
{{range $i, $item := .list}}
|
||||
<article class="card card--list">
|
||||
<a class="card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if eq $item.UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if $item.TotalEpisode}}
|
||||
<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if $item.IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq $item.Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{$n := add $i 1}}
|
||||
{{if and $.advitise $.advitise.DetailBannerList (lt $n $total)}}
|
||||
{{if eq (mod $n 12) 0}}
|
||||
<div class="list-mid-promo only-pc">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxPc 2)}}
|
||||
</div>
|
||||
{{$adIdxPc = add $adIdxPc 2}}
|
||||
{{end}}
|
||||
{{if eq (mod $n 6) 0}}
|
||||
<div class="list-mid-promo only-h5">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxH5 2)}}
|
||||
</div>
|
||||
{{$adIdxH5 = add $adIdxH5 2}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="list-count">暂无短剧</p>
|
||||
{{end}}
|
||||
|
||||
{{template "pagination" .}}
|
||||
</section>
|
||||
|
||||
<div class="list-bottom-promo">
|
||||
{{template "ads" (adSlice .advitise.DetailBannerList 2 2)}}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,121 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/login.css?v=3">
|
||||
<script>
|
||||
// PC 登录走弹窗:桌面访问 /login 时回首页并打开登录弹窗
|
||||
(function () {
|
||||
try {
|
||||
if (window.matchMedia && window.matchMedia("(min-width: 769px)").matches) {
|
||||
window.location.replace("/?auth=login");
|
||||
}
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<body class="page-login">
|
||||
<header class="page-subheader" aria-label="登录顶栏">
|
||||
<a class="page-subheader__btn" href="javascript:history.back()" aria-label="返回">
|
||||
<img class="icon" src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<h1 class="page-subheader__title">登录</h1>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="login-page">
|
||||
<div class="login-page__inner">
|
||||
<div class="login-page__brand">
|
||||
<img class="login-page__logo" src="/static/logo_icon.png" alt="黄果短剧">
|
||||
</div>
|
||||
|
||||
<div class="login-page__content">
|
||||
<div class="login-page__intro">
|
||||
<h2 class="login-page__title">登录黄果短剧</h2>
|
||||
<p class="login-page__desc">登录后可收藏作品、解锁付费剧集并查看观看历史</p>
|
||||
</div>
|
||||
|
||||
<form class="login-page__form" action="/api/auth/login" method="post" data-login-page-form novalidate>
|
||||
<label class="login-page__field" data-field="account">
|
||||
<span class="login-page__label">账号</span>
|
||||
<span class="login-page__control">
|
||||
<img class="icon" src="/static/images/user.svg" alt="" aria-hidden="true">
|
||||
<input
|
||||
class="login-page__input"
|
||||
type="text"
|
||||
name="account"
|
||||
autocomplete="username"
|
||||
placeholder="请输入账号"
|
||||
maxlength="16"
|
||||
required
|
||||
>
|
||||
</span>
|
||||
<span class="login-page__error" data-field-error="account" hidden>
|
||||
<img class="login-page__error-icon" src="/static/images/error-tip.svg" alt="" aria-hidden="true">
|
||||
<span data-field-error-text></span>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<label class="login-page__field" data-field="password">
|
||||
<span class="login-page__label">密码</span>
|
||||
<span class="login-page__control">
|
||||
<img class="icon" src="/static/images/lock-dim.svg" alt="" aria-hidden="true">
|
||||
<input
|
||||
class="login-page__input"
|
||||
type="password"
|
||||
name="password"
|
||||
autocomplete="current-password"
|
||||
placeholder="请输入登录密码"
|
||||
maxlength="16"
|
||||
data-login-page-password
|
||||
required
|
||||
>
|
||||
<button class="login-page__toggle" type="button" data-login-page-toggle aria-label="显示密码">
|
||||
<img class="icon" src="/static/images/eye.svg" alt="" data-login-page-toggle-icon>
|
||||
</button>
|
||||
</span>
|
||||
<span class="login-page__error" data-field-error="password" hidden>
|
||||
<img class="login-page__error-icon" src="/static/images/error-tip.svg" alt="" aria-hidden="true">
|
||||
<span data-field-error-text></span>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<div class="login-page__meta">
|
||||
<label class="login-page__remember">
|
||||
<input class="login-page__checkbox" type="checkbox" name="remember" checked>
|
||||
<span class="login-page__check" aria-hidden="true"></span>
|
||||
<span>记住登录状态</span>
|
||||
</label>
|
||||
<a class="login-page__forgot" href="/help">忘记密码?</a>
|
||||
</div>
|
||||
|
||||
<button class="btn btn--primary login-page__submit" type="submit" data-login-page-submit>登录</button>
|
||||
</form>
|
||||
|
||||
<p class="login-page__switch">
|
||||
<span>还没有账号?</span>
|
||||
<a href="/register">立即注册</a>
|
||||
</p>
|
||||
|
||||
<div class="login-page__rule" aria-hidden="true"></div>
|
||||
|
||||
<p class="login-page__legal">
|
||||
登录即表示你已年满 18 岁并同意
|
||||
<a href="/terms">《用户条款》</a>
|
||||
与
|
||||
<a href="/privacy">《隐私政策》</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<script defer src="/static/js/common/cookie.js?v=1"></script>
|
||||
<script defer src="/static/js/common/request.js?v=6"></script>
|
||||
<script defer src="/static/js/common/auth.js?v=3"></script>
|
||||
<script defer src="/static/js/pages/login.js?v=2"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,114 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/moreList.css">
|
||||
</head>
|
||||
<body class="page-list page-more">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{if .configName}}{{.configName}}{{else}}更多短剧{{end}}</div>
|
||||
<a class="page-subheader__btn" href="/search-mobile" aria-label="搜索">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="更多列表">
|
||||
<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">{{if .configName}}{{.configName}}{{else}}更多短剧{{end}}</h1>
|
||||
<p class="list-hero__desc">{{if .configDesc}}{{.configDesc}}{{else}}精选短剧合集,持续更新{{end}}</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">
|
||||
{{range .timeTabs}}
|
||||
<a class="filter-chip{{if .Active}} is-active{{end}}" href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Label}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">题材</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if and (eq .themeSlug "") (eq .themeId 0)}} is-active{{end}}" href="{{moreListURL .configSlug .configId .timeRange "" 0 1}}">全部</a>
|
||||
{{range .themeList}}
|
||||
<a class="filter-chip{{if or (and (ne $.themeSlug "") (eq $.themeSlug .Slug)) (and (gt $.themeId 0) (eq $.themeId .ID))}} is-active{{end}}" href="{{moreListURL $.configSlug $.configId $.timeRange .Slug .ID 1}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="短剧列表">
|
||||
<h2 class="visually-hidden">{{if .configName}}{{.configName}}{{else}}精选短剧{{end}}作品列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
{{$adIdxPc := 0}}
|
||||
{{$adIdxH5 := 0}}
|
||||
{{$total := len .list}}
|
||||
<div class="grid--list">
|
||||
{{range $i, $item := .list}}
|
||||
<article class="card card--list">
|
||||
<a class="card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if eq $item.UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if $item.TotalEpisode}}
|
||||
<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if $item.IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq $item.Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{$n := add $i 1}}
|
||||
{{if and $.advitise $.advitise.DetailBannerList (lt $n $total)}}
|
||||
{{if eq (mod $n 12) 0}}
|
||||
<div class="list-mid-promo only-pc">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxPc 2)}}
|
||||
</div>
|
||||
{{$adIdxPc = add $adIdxPc 2}}
|
||||
{{end}}
|
||||
{{if eq (mod $n 6) 0}}
|
||||
<div class="list-mid-promo only-h5">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxH5 2)}}
|
||||
</div>
|
||||
{{$adIdxH5 = add $adIdxH5 2}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无短剧</p>
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
{{if .advitise}}
|
||||
<div class="list-bottom-promo">
|
||||
{{template "ads" (adSlice .advitise.DetailBannerList 0 2)}}
|
||||
</div>
|
||||
{{end}}
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,113 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/moreList.css">
|
||||
<link rel="stylesheet" href="/static/css/series.css?v=7">
|
||||
</head>
|
||||
<body class="page-list page-series page-more page-more-video">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{if .configName}}{{.configName}}{{else}}更多视频{{end}}</div>
|
||||
<a class="page-subheader__btn" href="/search-mobile" aria-label="搜索">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="更多视频">
|
||||
<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">{{if .configName}}{{.configName}}{{else}}更多视频{{end}}</h1>
|
||||
<p class="list-hero__desc">{{if .configDesc}}{{.configDesc}}{{else}}横版观看的影集作品,持续更新{{end}}</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">
|
||||
{{range .timeTabs}}
|
||||
<a class="filter-chip{{if .Active}} is-active{{end}}" href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Label}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">题材</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if and (eq .themeSlug "") (eq .themeId 0)}} is-active{{end}}" href="{{moreSeriesListURL .configSlug .configId .timeRange "" 0 1}}">全部</a>
|
||||
{{range .themeList}}
|
||||
<a class="filter-chip{{if or (and (ne $.themeSlug "") (eq $.themeSlug .Slug)) (and (gt $.themeId 0) (eq $.themeId .ID))}} is-active{{end}}" href="{{moreSeriesListURL $.configSlug $.configId $.timeRange .Slug .ID 1}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="视频列表">
|
||||
<h2 class="visually-hidden">{{if .configName}}{{.configName}}{{else}}精选视频{{end}}作品列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
{{$adIdxPc := 0}}
|
||||
{{$adIdxH5 := 0}}
|
||||
{{$total := len .list}}
|
||||
<div class="grid--series-list">
|
||||
{{range $i, $item := .list}}
|
||||
<article class="series-list-card">
|
||||
<a class="series-list-card__cover lazy" href="{{videoPlayURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.CoverImg}}">
|
||||
{{if $item.VideoTime}}<span class="card__ep">{{$item.VideoTime}}分钟</span>{{end}}
|
||||
<span class="badge badge--hot">影集</span>
|
||||
<span class="series-list-card__play" aria-hidden="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</span>
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{videoPlayURL $item.Slug $item.ID}}">{{$item.Title}}</a></h3>
|
||||
<p class="card__meta">{{if $item.CreatorName}}{{$item.CreatorName}}{{else}}{{range $ti, $k := $item.Keyworld}}{{if $ti}} {{end}}{{$k}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{$n := add $i 1}}
|
||||
{{if and $.advitise $.advitise.DetailBannerList (lt $n $total)}}
|
||||
{{if eq (mod $n 12) 0}}
|
||||
<div class="series-list-promo only-pc">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxPc 2)}}
|
||||
</div>
|
||||
{{$adIdxPc = add $adIdxPc 2}}
|
||||
{{end}}
|
||||
{{if eq (mod $n 6) 0}}
|
||||
<div class="series-list-promo only-h5">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxH5 2)}}
|
||||
</div>
|
||||
{{$adIdxH5 = add $adIdxH5 2}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无视频</p>
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
{{if and .advitise .advitise.DetailBannerList}}
|
||||
<div class="list-bottom-promo">
|
||||
{{template "ads" (adSlice .advitise.DetailBannerList 2 2)}}
|
||||
</div>
|
||||
{{end}}
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,104 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{if .appConfig.SeoNavInfo.DhTitle}}{{.appConfig.SeoNavInfo.DhTitle}}{{else if .appConfig.SeoNavInfo.DhSiteName}}{{.appConfig.SeoNavInfo.DhSiteName}}{{else if .title}}{{.title}}{{else}}黄果短剧 · 官方导航{{end}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/nav.css?v=7">
|
||||
</head>
|
||||
<body class="nav-page-body">
|
||||
<main class="nav-page">
|
||||
<div class="nav-page__bg" aria-hidden="true">
|
||||
<img class="nav-page__bg-img" src="/static/images/nav_bg.webp" alt="">
|
||||
<div class="nav-page__bg-mask"></div>
|
||||
</div>
|
||||
|
||||
<div class="nav-page__inner">
|
||||
<h1 class="nav-page__sr-title">{{if .appConfig.SeoNavInfo.DhSiteName}}{{.appConfig.SeoNavInfo.DhSiteName}}{{else if .appConfig.SeoNavInfo.DhTitle}}{{.appConfig.SeoNavInfo.DhTitle}}{{else if .title}}{{.title}}{{else}}黄果短剧 · 官方导航{{end}}</h1>
|
||||
|
||||
<section class="nav-brand" aria-label="品牌介绍">
|
||||
<a class="nav-brand__lockup" href="/" aria-label="黄果短剧首页">
|
||||
<img class="nav-brand__logo" src="/static/logo2.png" width="500" height="136" alt="黄果短剧">
|
||||
</a>
|
||||
<p class="nav-brand__tagline">全网最新最火短剧,黄果为你呈现</p>
|
||||
<p class="nav-brand__highlight">永久免费 最新资源 无需下载</p>
|
||||
</section>
|
||||
|
||||
<section class="nav-entries" aria-label="访问入口">
|
||||
{{range .appConfig.NavPageList}}
|
||||
<a class="nav-entry" href="{{.URL}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<span class="nav-entry__glow" aria-hidden="true"></span>
|
||||
<span class="nav-entry__copy">
|
||||
<span class="nav-entry__name">黄果短剧 {{.Label}}</span>
|
||||
<span class="nav-entry__url">{{navDisplayURL .URL}}</span>
|
||||
</span>
|
||||
<span class="nav-entry__cta">
|
||||
立即进入
|
||||
<img class="nav-entry__cta-icon" src="/static/images/arrow-up-right.svg" width="14" height="14" alt="" aria-hidden="true">
|
||||
</span>
|
||||
</a>
|
||||
{{end}}
|
||||
<a class="nav-entry nav-entry--forever" href="{{if .appConfig.ForeverURLAddr}}{{.appConfig.ForeverURLAddr}}{{else}}/{{end}}"{{if .appConfig.ForeverURLAddr}} target="_blank" rel="sponsored nofollow noopener noreferrer"{{end}}>
|
||||
<span class="nav-entry__name">永久域名(VPN 访问)</span>
|
||||
<span class="nav-entry__url">{{if .appConfig.ForeverURLAddr}}{{navDisplayURL .appConfig.ForeverURLAddr}}{{else if .appConfig.SeoNavInfo.DhSiteName}}{{.appConfig.SeoNavInfo.DhSiteName}}{{else}}huangguo.me{{end}}</span>
|
||||
</a>
|
||||
</section>
|
||||
|
||||
{{if .appConfig.AppAddr}}
|
||||
<a class="nav-app" href="{{.appConfig.AppAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<img class="nav-app__icon" src="/static/images/download.svg" width="20" height="20" alt="" aria-hidden="true">
|
||||
<span class="nav-app__text">黄果短剧 APP 下载</span>
|
||||
</a>
|
||||
{{end}}
|
||||
|
||||
{{if .appConfig.TGGroup}}
|
||||
<a class="nav-contact" href="{{.appConfig.TGGroup}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<span>官方联系:</span><span>{{.appConfig.TGGroup}}</span>
|
||||
</a>
|
||||
{{end}}
|
||||
|
||||
<section class="nav-icons" aria-label="官方服务与联系方式">
|
||||
{{if .appConfig.TGGroup}}
|
||||
<a class="nav-icon" href="{{.appConfig.TGGroup}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<span class="nav-icon__badge"><img src="/static/images/brand-telegram.svg" width="20" height="16" alt=""></span>
|
||||
<span class="nav-icon__label">官方 TG 群</span>
|
||||
</a>
|
||||
{{end}}
|
||||
{{if .appConfig.TwitterAddr}}
|
||||
<a class="nav-icon" href="{{.appConfig.TwitterAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<span class="nav-icon__badge"><img src="/static/images/brand-x.svg" width="18" height="18" alt=""></span>
|
||||
<span class="nav-icon__label">官方推特</span>
|
||||
</a>
|
||||
{{end}}
|
||||
{{if .appConfig.PDFAddr}}
|
||||
<a class="nav-icon" href="{{.appConfig.PDFAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<span class="nav-icon__badge"><img src="/static/images/home.svg" width="18" height="18" alt=""></span>
|
||||
<span class="nav-icon__label">回家的路</span>
|
||||
</a>
|
||||
{{end}}
|
||||
{{if .appConfig.AppAddr}}
|
||||
<a class="nav-icon" href="{{.appConfig.AppAddr}}" target="_blank" rel="sponsored nofollow noopener noreferrer">
|
||||
<span class="nav-icon__badge"><img src="/static/images/link_smartphone.svg" width="18" height="18" alt=""></span>
|
||||
<span class="nav-icon__label">APP</span>
|
||||
</a>
|
||||
{{end}}
|
||||
{{if .appConfig.PotaoGroup}}
|
||||
<a class="nav-icon" href="{{.appConfig.PotaoGroup}}"{{if hasPrefix .appConfig.PotaoGroup "http"}} target="_blank" rel="sponsored nofollow noopener noreferrer"{{end}}>
|
||||
<span class="nav-icon__badge"><img src="/static/images/gift.svg" width="18" height="18" alt=""></span>
|
||||
<span class="nav-icon__label">福利应用</span>
|
||||
</a>
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
<footer class="nav-footer">
|
||||
<p class="nav-footer__note">本站仅提供短剧内容与产品服务</p>
|
||||
<p class="nav-footer__note">请遵守当地法律法规,仅限 18 岁以上成年人访问</p>
|
||||
<p class="nav-footer__copy">© 2026 黄果短剧 官方发布页</p>
|
||||
</footer>
|
||||
</div>
|
||||
</main>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/112952789" style="position:absolute; left:-9999px;" alt=""></div></noscript>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,536 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
{{/* 夸克 / QQ(X5):页内播放适配。不要写 x5-fullscreen,否则 QQ 会接管成系统播放器 */}}
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta name="force-rendering" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="x5-orientation" content="portrait">
|
||||
<meta name="x5-page-mode" content="app">
|
||||
<meta name="browsermode" content="application">
|
||||
<meta name="imagemode" content="force">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<script src="/static/js/common/compat.js?v=4"></script>
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/recharge-modal.css?v=2">
|
||||
<link rel="stylesheet" href="/static/common/DPlayer.min.css">
|
||||
<link rel="stylesheet" href="/static/css/play.css?v=25">
|
||||
<script defer src="/static/common/hls.min.js"></script>
|
||||
<script defer src="/static/common/DPlayer.min.js?v=2"></script>
|
||||
</head>
|
||||
<body class="page-play">
|
||||
{{$p := .playlet}}
|
||||
{{$c := .chapter}}
|
||||
{{$name := playletDisplayName $p.PlayName $p.Title}}
|
||||
{{$ep := .episode}}
|
||||
{{$activeID := .chapterID}}
|
||||
{{if le $activeID 0}}
|
||||
{{range $p.PlayletChapterInfo}}
|
||||
{{if and (le $activeID 0) (eq .CurrentEpisode 1)}}{{$activeID = .ID}}{{end}}
|
||||
{{end}}
|
||||
{{if le $activeID 0}}{{with index $p.PlayletChapterInfo 0}}{{$activeID = .ID}}{{end}}{{end}}
|
||||
{{end}}
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{$name}}</div>
|
||||
<button class="page-subheader__btn" type="button" aria-label="分享" data-share-page>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/share.svg" alt="分享">
|
||||
</button>
|
||||
</header>
|
||||
|
||||
<div class="page play-page">
|
||||
<main class="main play-main">
|
||||
<nav class="breadcrumb play-breadcrumb only-pc" aria-label="面包屑">
|
||||
<a class="breadcrumb__item" href="/">首页</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<a class="breadcrumb__item" href="/list">短剧</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<a class="breadcrumb__item" href="{{playURL $p.Slug $p.ID}}">{{$name}}</a>
|
||||
{{if gt $ep 0}}
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<span class="breadcrumb__item is-current">第 {{$ep}} 集</span>
|
||||
{{end}}
|
||||
</nav>
|
||||
|
||||
<section class="play-stage" aria-label="播放器">
|
||||
{{$startPreview := and (not .canWatch) .hasPreview}}
|
||||
<div
|
||||
class="play-player{{if not .canWatch}} play-player--locked{{end}}{{if $startPreview}} play-player--preview{{end}}"
|
||||
data-play-player
|
||||
data-play-mode="{{if $startPreview}}preview{{else}}main{{end}}"
|
||||
data-playlet-id="{{$p.ID}}"
|
||||
data-chapter-id="{{.chapterID}}"
|
||||
data-can-watch="{{if .canWatch}}1{{else}}0{{end}}"
|
||||
data-main-url="{{.mainURL}}"
|
||||
data-preview-url="{{.previewURL}}"
|
||||
data-track-drama
|
||||
data-media-id="{{.trackerDrama.MediaID}}"
|
||||
data-drama-id="{{.trackerDrama.DramaID}}"
|
||||
data-drama-title="{{.trackerDrama.DramaTitle}}"
|
||||
data-episode="{{.trackerDrama.Episode}}"
|
||||
data-total-episode="{{.trackerDrama.TotalEpisode}}"
|
||||
data-video-id="{{.trackerDrama.VideoID}}"
|
||||
data-drama-type-id="{{.trackerDrama.DramaTypeID}}"
|
||||
data-drama-type-name="{{.trackerDrama.DramaTypeName}}"
|
||||
data-recommend-trace-id="{{.trackerDrama.RecommendTraceID}}"
|
||||
data-drama-tag-key="{{.trackerDrama.DramaTagKey}}"
|
||||
data-drama-tag-name="{{.trackerDrama.DramaTagName}}"
|
||||
data-drama-duration="{{.trackerDrama.DramaDuration}}"
|
||||
{{if $c}}data-pay-type="{{$c.PayType}}" data-need-unlock="{{if $c.NeedUnlock}}1{{else}}0{{end}}" data-need-vip="{{if $c.NeedVip}}1{{else}}0{{end}}"{{end}}
|
||||
>
|
||||
{{if or .mainURL .hasPreview}}
|
||||
<div
|
||||
class="dplayer-video"
|
||||
data-url="{{if $startPreview}}{{.previewURL}}{{else}}{{.mainURL}}{{end}}"
|
||||
data-main-url="{{.mainURL}}"
|
||||
data-preview-url="{{.previewURL}}"
|
||||
></div>
|
||||
{{end}}
|
||||
|
||||
<img decoding="async" loading="lazy"
|
||||
class="play-player__cover lazy"
|
||||
src="/static/images/placeholder.png?v=2"
|
||||
data-src="{{coverURL $p.HorizontalCover $p.Banner $p.Cover}}"
|
||||
|
||||
data-play-poster
|
||||
alt="{{$name}}"
|
||||
>
|
||||
<div class="play-player__scrim" aria-hidden="true"></div>
|
||||
<div class="play-player__dim" aria-hidden="true"></div>
|
||||
|
||||
<button
|
||||
class="play-player__center"
|
||||
type="button"
|
||||
aria-label="播放"
|
||||
data-play-poster-play
|
||||
{{if and (not .canWatch) (not $startPreview)}}data-play-coin-open{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</button>
|
||||
|
||||
{{if not .canWatch}}
|
||||
{{$coinShort := lt .balance .unlockCost}}
|
||||
<div class="play-player__unlock{{if $coinShort}} play-player__unlock--short{{end}}" data-play-unlock-overlay>
|
||||
<div class="play-player__unlock-icon" aria-hidden="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/lock.svg" alt="解锁">
|
||||
</div>
|
||||
<p class="play-player__unlock-ep">{{if gt $ep 0}}第 {{$ep}} 集{{end}}{{if and (gt $ep 0) $p.TotalEpisode}} {{end}}{{if $p.TotalEpisode}}共 {{$p.TotalEpisode}} 集{{end}}</p>
|
||||
{{if $coinShort}}
|
||||
<p class="play-player__unlock-title">金币不足</p>
|
||||
<p class="play-player__unlock-desc">本集需 {{.unlockCost}} 金币,当前余额 {{.balance}} 金币</p>
|
||||
<div class="play-player__unlock-actions">
|
||||
<button class="btn btn--primary play-player__unlock-btn" type="button" data-recharge-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/lock.svg" alt="解锁">
|
||||
去充值
|
||||
</button>
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a class="play-player__unlock-app" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 App 免费看
|
||||
</a>
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="play-player__unlock-title">使用金币解锁本集</p>
|
||||
<p class="play-player__unlock-desc">
|
||||
{{if gt .unlockCost 0}}本集需 {{.unlockCost}} 金币,{{end}}解锁后可永久观看。
|
||||
{{if gt .unlockCost 0}}当前余额 {{.balance}} 金币。{{end}}
|
||||
</p>
|
||||
<div class="play-player__unlock-actions">
|
||||
<button
|
||||
class="btn btn--primary play-player__unlock-btn"
|
||||
type="button"
|
||||
data-play-unlock
|
||||
data-playlet-id="{{$p.ID}}"
|
||||
data-chapter-id="{{.chapterID}}"
|
||||
data-unlock-cost="{{.unlockCost}}"
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/lock.svg" alt="解锁">
|
||||
{{if gt .unlockCost 0}}支付 {{.unlockCost}} 金币解锁{{else}}立即解锁{{end}}
|
||||
</button>
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a class="play-player__unlock-app" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 App 免费看
|
||||
</a>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="play-player__badge" data-play-badge>
|
||||
{{if $startPreview}}
|
||||
<span class="only-pc" data-play-badge-pc>预告片 免费</span>
|
||||
<span class="only-h5" data-play-badge-h5>预告片</span>
|
||||
{{else}}
|
||||
<span class="only-pc" data-play-badge-pc>正片{{if gt $ep 0}} 第 {{$ep}} 集{{end}}{{if $p.TotalEpisode}} 共 {{$p.TotalEpisode}} 集{{end}}</span>
|
||||
<span class="only-h5" data-play-badge-h5>{{if gt $ep 0}}第 {{$ep}} 集{{end}}{{if $p.TotalEpisode}} 共 {{$p.TotalEpisode}} 集{{end}}</span>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
{{if not .canWatch}}
|
||||
<div class="play-player__bar" data-play-locked-bar>
|
||||
<div class="play-player__progress" aria-hidden="true">
|
||||
<span class="play-player__progress-fill" style="width:0%"></span>
|
||||
<span class="play-player__progress-thumb" style="left:0%"></span>
|
||||
</div>
|
||||
<div class="play-player__controls">
|
||||
<div class="play-player__left">
|
||||
<button class="play-player__icon" type="button" aria-label="播放" data-play-coin-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</button>
|
||||
{{if .nextChapterID}}
|
||||
<a class="play-player__icon" href="{{chapterPlayURL $p.Slug $p.ID .nextChapterID}}" aria-label="下一集" data-drama-switch data-target-episode="{{add $ep 1}}" data-target-video-id="{{.nextChapterID}}">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
{{else}}
|
||||
<button class="play-player__icon" type="button" aria-label="下一集" disabled>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
{{end}}
|
||||
<span class="play-player__time">00:00{{if $c}} / {{formatMediaTime $c.MediaTime}}{{end}}</span>
|
||||
</div>
|
||||
<div class="play-player__right">
|
||||
<button class="play-player__text" type="button">1.0x</button>
|
||||
<button class="play-player__text" type="button">1080P</button>
|
||||
<button class="play-player__icon" type="button" aria-label="音量">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/bell.svg" alt="更新提醒">
|
||||
</button>
|
||||
<button class="play-player__icon" type="button" aria-label="全屏">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/plus.svg" alt="添加">
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<div class="play-tabs" aria-label="内容类型" data-play-tabs>
|
||||
<button type="button" class="play-tabs__item{{if not $startPreview}} is-active{{end}}" data-play-tab="main">正片</button>
|
||||
{{if .hasPreview}}
|
||||
<button type="button" class="play-tabs__item{{if $startPreview}} is-active{{end}}" data-play-tab="preview">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/film.svg" alt="影视详情">
|
||||
预告片
|
||||
</button>
|
||||
<p class="play-tabs__hint only-pc">预告片免费播放,无需登录与解锁</p>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="play-info" aria-label="剧集信息">
|
||||
<div class="play-meta">
|
||||
<div class="play-meta__title-row">
|
||||
<h1 class="play-meta__title">{{$name}}</h1>
|
||||
{{if $p.IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq $p.Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</div>
|
||||
<div class="play-meta__chips">
|
||||
{{if $p.TotalEpisode}}<span class="play-chip">全 {{$p.TotalEpisode}} 集</span>{{end}}
|
||||
<span class="play-chip">{{updateStatusText $p.UpdateStatus}}</span>
|
||||
{{with playletYearText $p.OnlineAt}}{{if ne . "年份未知"}}<span class="play-chip">{{.}}</span>{{end}}{{end}}
|
||||
<span class="play-chip">1080P</span>
|
||||
</div>
|
||||
<p class="play-meta__stats only-pc">
|
||||
{{with usableAnchor $p.Anchor}}{{if and (ne . "原创") (ne . "已注销")}}<span class="play-meta__stat">主演 {{.}}</span>{{end}}{{end}}
|
||||
{{$themes := namedThemeTags $p.ThemeIDs $p.ThemeNames $p.ThemeSlugs}}
|
||||
{{if $themes}}
|
||||
<span class="play-meta__stat">
|
||||
题材
|
||||
{{range $ti, $tag := $themes}}{{if $ti}} {{end}}{{if $tag.URL}}<a class="play-meta__tag" href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}<span class="play-meta__tag">{{$tag.Name}}</span>{{end}}{{end}}
|
||||
</span>
|
||||
{{end}}
|
||||
<span class="play-meta__stat">热度 {{formatLikeCount $p.HeatValue}}</span>
|
||||
<span class="play-meta__stat">收藏 <span data-playlet-collect-stat>{{formatLikeCount $p.CountCollect}}</span></span>
|
||||
</p>
|
||||
<p class="play-meta__stats only-h5">
|
||||
{{with usableAnchor $p.Anchor}}{{if and (ne . "原创") (ne . "已注销")}}<span class="play-meta__stat">主演 {{.}}</span>{{end}}{{end}}
|
||||
{{$themesH5 := namedThemeTags $p.ThemeIDs $p.ThemeNames $p.ThemeSlugs}}
|
||||
{{if $themesH5}}
|
||||
<span class="play-meta__stat">
|
||||
{{range $ti, $tag := $themesH5}}{{if $ti}} {{end}}{{if $tag.URL}}<a class="play-meta__tag" href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}<span class="play-meta__tag">{{$tag.Name}}</span>{{end}}{{end}}
|
||||
</span>
|
||||
{{end}}
|
||||
<span class="play-meta__stat">热度 {{formatLikeCount $p.HeatValue}}</span>
|
||||
<span class="play-meta__stat">收藏 <span data-playlet-collect-stat>{{formatLikeCount $p.CountCollect}}</span></span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="play-actions">
|
||||
<a
|
||||
class="btn btn--primary play-actions__btn play-actions__btn--play"
|
||||
href="{{if .chapterID}}{{chapterPlayURL $p.Slug $p.ID .chapterID}}{{else}}{{playURL $p.Slug $p.ID}}{{end}}"
|
||||
data-play-main-cta
|
||||
{{if or .canWatch $startPreview}}data-play-poster-play{{else}}data-play-coin-open{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
<span data-play-cta-label>{{if .canWatch}}立即播放{{else if $startPreview}}播放预告片{{else}}解锁播放{{end}}</span>
|
||||
</a>
|
||||
<button
|
||||
class="btn btn--ghost play-actions__btn play-actions__btn--icon{{if eq $p.IsLike 1}} is-active{{end}}"
|
||||
type="button"
|
||||
aria-label="{{if eq $p.IsLike 1}}取消点赞{{else}}点赞{{end}}"
|
||||
data-playlet-like
|
||||
data-playlet-id="{{$p.ID}}"
|
||||
data-liked="{{if eq $p.IsLike 1}}1{{else}}2{{end}}"
|
||||
data-like-raw="{{$p.CountLike}}"
|
||||
{{if le $p.ID 0}}disabled{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/heart.svg" alt="点赞">
|
||||
<span class="only-pc" data-playlet-like-label>{{if eq $p.IsLike 1}}已点赞{{else}}点赞{{end}}</span>
|
||||
</button>
|
||||
<button
|
||||
class="btn btn--ghost play-actions__btn play-actions__btn--icon{{if eq $p.IsCollect 1}} is-active{{end}}"
|
||||
type="button"
|
||||
aria-label="{{if eq $p.IsCollect 1}}取消收藏{{else}}收藏{{end}}"
|
||||
data-playlet-collect
|
||||
data-playlet-id="{{$p.ID}}"
|
||||
data-collected="{{if eq $p.IsCollect 1}}1{{else}}2{{end}}"
|
||||
data-collect-raw="{{$p.CountCollect}}"
|
||||
{{if le $p.ID 0}}disabled{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/bookmark.svg" alt="收藏">
|
||||
<span class="only-pc" data-playlet-collect-label>{{if eq $p.IsCollect 1}}已收藏{{else}}收藏{{end}}</span>
|
||||
</button>
|
||||
<button class="btn btn--ghost play-actions__btn play-actions__btn--icon" type="button" aria-label="分享" data-share-page>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/share.svg" alt="分享">
|
||||
<span class="only-pc" data-share-page-label>分享</span>
|
||||
</button>
|
||||
<a class="btn btn--ghost play-actions__btn play-actions__btn--icon" href="/feedback" aria-label="反馈">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/message-circle.svg" alt="评论">
|
||||
<span class="only-pc">反馈</span>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="play-synopsis" data-play-synopsis>
|
||||
<div class="play-synopsis__head">
|
||||
<h2 class="play-synopsis__title">简介</h2>
|
||||
<button class="play-synopsis__more" type="button" data-play-synopsis-more hidden>
|
||||
<span data-play-synopsis-more-label>展开</span>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
</div>
|
||||
<p class="play-synopsis__text" data-play-synopsis-text>{{if $p.Desc}}{{$p.Desc}}{{else if $p.Description}}{{$p.Description}}{{else}}暂无简介{{end}}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="play-episodes" aria-label="选集">
|
||||
<div class="play-episodes__head">
|
||||
<div class="play-episodes__head-left">
|
||||
<h2 class="play-episodes__title">选集</h2>
|
||||
<span class="play-episodes__count">
|
||||
{{if $p.TotalEpisode}}共 {{$p.TotalEpisode}} 集{{else}}共 {{len $p.PlayletChapterInfo}} 集{{end}}
|
||||
{{if eq $p.UpdateStatus 2}} 已完结{{else}} {{updateStatusText $p.UpdateStatus}}{{end}}
|
||||
</span>
|
||||
<nav class="play-episodes__sort only-pc" aria-label="选集排序" data-play-episodes-sort>
|
||||
<button class="play-episodes__sort-item is-active" type="button" data-play-episodes-sort-item="asc" aria-pressed="true">正序</button>
|
||||
<button class="play-episodes__sort-item" type="button" data-play-episodes-sort-item="desc" aria-pressed="false">倒序</button>
|
||||
</nav>
|
||||
</div>
|
||||
<button class="play-episodes__order only-h5" type="button" data-play-episodes-order aria-pressed="false">
|
||||
<span data-play-episodes-order-label>倒序</span>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="">
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="play-episodes__grid" data-play-episodes-grid>
|
||||
{{range $i, $ch := $p.PlayletChapterInfo}}
|
||||
<a
|
||||
class="play-ep{{if or (eq $ch.ID $activeID) (and (le $activeID 0) (eq $i 0))}} is-active{{end}}{{if $ch.NeedCoinGate}} play-ep--coin{{end}}"
|
||||
href="{{chapterPlayURL $p.Slug $p.ID $ch.ID}}"
|
||||
data-drama-switch
|
||||
data-target-episode="{{if $ch.CurrentEpisode}}{{$ch.CurrentEpisode}}{{else}}{{add $i 1}}{{end}}"
|
||||
data-target-video-id="{{$ch.ID}}"
|
||||
>{{if $ch.CurrentEpisode}}{{$ch.CurrentEpisode}}{{else}}{{add $i 1}}{{end}}</a>
|
||||
{{else}}
|
||||
<span class="play-ep is-active">1</span>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<div class="play-episodes__legend">
|
||||
<span class="play-legend">
|
||||
<i class="play-legend__swatch play-legend__swatch--free" aria-hidden="true"></i>
|
||||
<span class="only-pc">免费集 无需登录直接播放</span>
|
||||
<span class="only-h5">免费集直接播放</span>
|
||||
</span>
|
||||
<span class="play-legend">
|
||||
<img decoding="async" loading="lazy" class="play-legend__swatch play-legend__swatch--coin" src="/static/images/placeholder.png?v=2" data-src="/static/images/coin.png" alt="金币" aria-hidden="true">
|
||||
{{if gt .unlockCost 0}}
|
||||
<span class="only-pc">{{.unlockCost}} 金币 / 集 解锁后永久观看</span>
|
||||
<span class="only-h5">{{.unlockCost}} 金币 / 集 永久观看</span>
|
||||
{{else}}
|
||||
<span class="only-pc">金币解锁后永久观看</span>
|
||||
<span class="only-h5">金币解锁 永久观看</span>
|
||||
{{end}}
|
||||
</span>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{template "playLinks" .}}
|
||||
|
||||
<div class="play-promo">
|
||||
{{if .advitise}}{{template "ads" (adSlice .advitise.DetailBannerList 0 2)}}{{end}}
|
||||
</div>
|
||||
|
||||
{{if .related}}
|
||||
<section class="play-related only-h5" aria-label="看过本剧的人也在看">
|
||||
<div class="play-related__head">
|
||||
<h2 class="play-related__title">看过本剧的人也在看</h2>
|
||||
<a class="play-related__more" href="/popular-recommend">
|
||||
更多
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</div>
|
||||
<div class="play-related__grid">
|
||||
{{range $i, $item := .related}}
|
||||
{{if lt $i 3}}
|
||||
<article class="card card--play-sm">
|
||||
<a class="card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if $item.TotalEpisode}}<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>{{else}}<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{playletDisplayName $item.PlayName $item.Title}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
<section class="play-dual" aria-label="评论与热榜">
|
||||
{{template "playComments" .}}
|
||||
|
||||
<aside class="play-hot" aria-label="热门短剧">
|
||||
<div class="play-hot__head">
|
||||
<h2 class="play-hot__title">热门短剧</h2>
|
||||
<a class="play-hot__more" href="{{if .hotMoreURL}}{{.hotMoreURL}}{{else}}/list/all/0/2{{end}}" {{externalLinkAttrs .hotMoreURL}}>
|
||||
完整榜单
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</div>
|
||||
<ol class="play-hot__list">
|
||||
{{range $i, $item := .hotList}}
|
||||
<li{{if ge $i 5}} class="only-pc"{{end}}>
|
||||
<div class="play-hot__item">
|
||||
<a class="play-hot__no{{if lt $i 3}} is-top{{end}}" href="{{playURL $item.Slug $item.ID}}">{{rankNo (add $i 1)}}</a>
|
||||
<a class="play-hot__cover-link" href="{{playURL $item.Slug $item.ID}}">
|
||||
<img decoding="async" loading="lazy" class="play-hot__cover lazy" src="/static/images/placeholder.png?v=2" data-src="{{$item.Cover}}" alt="{{playletDisplayName $item.PlayName $item.Title}}封面">
|
||||
</a>
|
||||
<span class="play-hot__info">
|
||||
<a class="play-hot__name" href="{{playURL $item.Slug $item.ID}}">{{playletDisplayName $item.PlayName $item.Title}}</a>
|
||||
<span class="play-hot__meta">
|
||||
{{$tags := cardTags $item}}
|
||||
{{range $ti, $tag := $tags}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}
|
||||
{{if and $tags $item.TotalEpisode}} {{end}}{{if $item.TotalEpisode}}全 {{$item.TotalEpisode}} 集{{end}}
|
||||
</span>
|
||||
</span>
|
||||
<a class="play-hot__heat" href="{{playURL $item.Slug $item.ID}}">{{formatLikeCount $item.HeatValue}}</a>
|
||||
</div>
|
||||
</li>
|
||||
{{else}}
|
||||
<li><p class="play-comment__text" style="padding:12px 0;color:var(--muted, #888)">暂无热榜数据</p></li>
|
||||
{{end}}
|
||||
</ol>
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
{{if .guessLike}}
|
||||
<section class="play-like" aria-label="猜你喜欢">
|
||||
<div class="play-like__head">
|
||||
<div class="play-like__titles">
|
||||
<h2 class="play-like__title">猜你喜欢</h2>
|
||||
<span class="play-like__desc only-pc">根据本剧题材推荐</span>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="play-like__refresh"
|
||||
data-guess-refresh
|
||||
data-playlet-id="{{.playlet.ID}}"
|
||||
data-page="{{.guessPage}}"
|
||||
data-page-size="{{if .guessPageSize}}{{.guessPageSize}}{{else}}6{{end}}"
|
||||
data-total="{{.guessTotal}}"
|
||||
>
|
||||
换一批
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
</div>
|
||||
<div class="play-like__grid" id="play-like" data-guess-grid>
|
||||
{{range .guessLike}}
|
||||
<article class="card card--play">
|
||||
<a class="card__cover lazy" href="{{playURL .Slug .ID}}" style="{{cssCoverPlaceholder}}" data-src="{{.Cover}}">
|
||||
{{if .TotalEpisode}}<span class="card__ep">全 {{.TotalEpisode}} 集</span>{{else}}<span class="card__ep">{{updateStatusText .UpdateStatus}}</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL .Slug .ID}}">{{playletDisplayName .PlayName .Title}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags .}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
<div class="play-promo play-promo--bottom">
|
||||
{{if .advitise}}{{template "ads" (adSlice .advitise.DetailBannerList 2 2)}}{{end}}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
|
||||
<div
|
||||
class="play-coin play-coin--short"
|
||||
data-play-coin
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="play-coin-title"
|
||||
>
|
||||
<div class="play-coin__mask" data-play-coin-close aria-hidden="true"></div>
|
||||
<div class="play-coin__panel">
|
||||
<div class="play-coin__handle" aria-hidden="true"></div>
|
||||
<div class="play-coin__head">
|
||||
<div class="play-coin__copy">
|
||||
<h2 class="play-coin__title" id="play-coin-title">金币不足</h2>
|
||||
<p class="play-coin__desc only-pc">本集需 {{.unlockCost}} 金币,当前余额 {{.balance}} 金币,充值后即可播放。</p>
|
||||
<p class="play-coin__desc only-h5">本集需 {{.unlockCost}} 金币,当前余额 {{.balance}} 金币</p>
|
||||
</div>
|
||||
<button class="play-coin__close" type="button" data-play-coin-close aria-label="关闭">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</div>
|
||||
<div class="play-coin__sheet">
|
||||
<div class="play-coin__row">
|
||||
<span class="play-coin__label">当前余额</span>
|
||||
<span class="play-coin__value{{if lt .balance .unlockCost}} is-low{{end}}">{{.balance}} 金币</span>
|
||||
</div>
|
||||
<div class="play-coin__divider" aria-hidden="true"></div>
|
||||
<div class="play-coin__row">
|
||||
<span class="play-coin__label">本次消耗</span>
|
||||
<span class="play-coin__cost">{{.unlockCost}} 金币</span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="play-coin__note">后续付费剧集仍需逐集确认</p>
|
||||
<button class="btn btn--primary play-coin__pay" type="button" data-recharge-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/gift.svg" alt="礼物">
|
||||
去充值 首充加赠 10%
|
||||
</button>
|
||||
<div class="play-coin__foot">
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a class="play-coin__app" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 App 免费看
|
||||
</a>
|
||||
<button class="play-coin__skip" type="button" data-play-coin-close>暂不观看</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{template "rechargeModal" .}}
|
||||
|
||||
<script defer src="/static/js/pages/play.js?v=41"></script>
|
||||
<script defer src="/static/js/recharge-modal.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,99 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/popularRecommend.css">
|
||||
</head>
|
||||
<body class="page-list page-popular">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}</div>
|
||||
<a class="page-subheader__btn" href="/search-mobile" aria-label="搜索">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="热播榜">
|
||||
<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">{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}</h1>
|
||||
<p class="list-hero__desc">{{if .seoInfo.Description}}{{.seoInfo.Description}}{{else}}根据播放、收藏与解锁综合排序{{end}}</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">
|
||||
{{range .rankTabs}}
|
||||
<a class="filter-chip{{if .Active}} is-active{{end}}" href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Label}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}列表">
|
||||
<h2 class="visually-hidden">{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}作品列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
{{$adIdxPc := 0}}
|
||||
{{$adIdxH5 := 0}}
|
||||
{{$total := len .list}}
|
||||
<div class="grid--list">
|
||||
{{range $i, $item := .list}}
|
||||
<article class="card card--list">
|
||||
<a class="card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if eq $item.UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if $item.TotalEpisode}}
|
||||
<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if $item.IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq $item.Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{$n := add $i 1}}
|
||||
{{if and $.appConfig.DetailBannerList (lt $n $total)}}
|
||||
{{if eq (mod $n 12) 0}}
|
||||
<div class="list-mid-promo only-pc">
|
||||
{{template "ads" (adSlice $.appConfig.DetailBannerList $adIdxPc 2)}}
|
||||
</div>
|
||||
{{$adIdxPc = add $adIdxPc 2}}
|
||||
{{end}}
|
||||
{{if eq (mod $n 6) 0}}
|
||||
<div class="list-mid-promo only-h5">
|
||||
{{template "ads" (adSlice $.appConfig.DetailBannerList $adIdxH5 2)}}
|
||||
</div>
|
||||
{{$adIdxH5 = add $adIdxH5 2}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无榜单数据</p>
|
||||
{{end}}
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,90 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/legal.css?v=5">
|
||||
</head>
|
||||
<body class="legal-page privacy-page">
|
||||
{{template "header" .}}
|
||||
<header class="page-subheader only-h5" aria-label="隐私政策页顶栏">
|
||||
<a class="page-subheader__btn" href="/" aria-label="返回首页"><img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回"></a>
|
||||
<div class="page-subheader__title">隐私政策</div>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="legal-main">
|
||||
<div class="legal-hero">
|
||||
<p class="legal-kicker"><span class="legal-kicker__bar" aria-hidden="true"></span>隐私政策</p>
|
||||
<h1 class="legal-title">黄果短剧隐私政策</h1>
|
||||
<p class="legal-dates">生效日期 2026 年 9 月 1 日 最近更新 2026 年 9 月 1 日</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-layout">
|
||||
<nav class="legal-toc" aria-label="隐私政策目录">
|
||||
<span class="legal-toc__label">目录</span>
|
||||
<div class="legal-toc__list">
|
||||
<a class="legal-toc__item is-active" href="#privacy-collect"><span class="legal-toc__number">01</span><span>我们收集的信息</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-use"><span class="legal-toc__number">02</span><span>信息的使用方式</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-cookie"><span class="legal-toc__number">03</span><span>Cookie 与同类技术</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-share"><span class="legal-toc__number">04</span><span>信息共享与披露</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-security"><span class="legal-toc__number">05</span><span>信息存储与安全</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-rights"><span class="legal-toc__number">06</span><span>您的权利</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-children"><span class="legal-toc__number">07</span><span>未成年人信息</span></a>
|
||||
<a class="legal-toc__item" href="#privacy-updates"><span class="legal-toc__number">08</span><span>政策更新与联系方式</span></a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<article class="legal-content">
|
||||
<p class="legal-intro">请您在使用黄果短剧网页版与 App 前仔细阅读本隐私政策。使用即表示您已年满 18 岁并同意本隐私政策的全部内容。以下为示意文本,正式内容以法务提供版本为准。</p>
|
||||
<section class="legal-section" id="privacy-collect">
|
||||
<h2 class="legal-section__title">1. 我们收集的信息</h2>
|
||||
<p class="legal-section__paragraph">1.1 本节说明黄果短剧在「我们收集的信息」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">1.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-use">
|
||||
<h2 class="legal-section__title">2. 信息的使用方式</h2>
|
||||
<p class="legal-section__paragraph">2.1 本节说明黄果短剧在「信息的使用方式」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">2.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-cookie">
|
||||
<h2 class="legal-section__title">3. Cookie 与同类技术</h2>
|
||||
<p class="legal-section__paragraph">3.1 本节说明黄果短剧在「Cookie 与同类技术」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">3.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-share">
|
||||
<h2 class="legal-section__title">4. 信息共享与披露</h2>
|
||||
<p class="legal-section__paragraph">4.1 本节说明黄果短剧在「信息共享与披露」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">4.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-security">
|
||||
<h2 class="legal-section__title">5. 信息存储与安全</h2>
|
||||
<p class="legal-section__paragraph">5.1 本节说明黄果短剧在「信息存储与安全」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">5.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-rights">
|
||||
<h2 class="legal-section__title">6. 您的权利</h2>
|
||||
<p class="legal-section__paragraph">6.1 本节说明黄果短剧在「您的权利」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">6.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-children">
|
||||
<h2 class="legal-section__title">7. 未成年人信息</h2>
|
||||
<p class="legal-section__paragraph">7.1 本节说明黄果短剧在「未成年人信息」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">7.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="privacy-updates">
|
||||
<h2 class="legal-section__title">8. 政策更新与联系方式</h2>
|
||||
<p class="legal-section__paragraph">8.1 本节说明黄果短剧在「政策更新与联系方式」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">8.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
</article>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{{template "footer" .}}
|
||||
<script defer src="/static/js/pages/legal.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,62 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/profile.css?v=9">
|
||||
<link rel="stylesheet" href="/static/css/profile-mobile.css?v=5">
|
||||
</head>
|
||||
<body class="profile-page">
|
||||
{{template "header" .}}
|
||||
{{template "userCenterHero" .}}
|
||||
{{template "userCenterTabs" .}}
|
||||
<main class="profile-main">
|
||||
<h1 class="visually-hidden">个人中心</h1>
|
||||
{{if .history}}
|
||||
<section class="profile-section profile-section--recent" id="recent">
|
||||
<div class="profile-section__head">
|
||||
<div class="profile-section__heading"><h2 class="profile-section__title">最近观看</h2><span class="profile-section__subtitle">上次看到</span></div>
|
||||
<a class="profile-section__more" href="/history">全部历史 <img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></a>
|
||||
</div>
|
||||
<div class="profile-grid">
|
||||
{{range .history}}
|
||||
<article class="profile-card">
|
||||
{{if .URL}}<a class="profile-card__cover" href="{{.URL}}" {{externalLinkAttrs .URL}} aria-label="继续观看{{.Title}}">{{else}}<div class="profile-card__cover">{{end}}
|
||||
<img decoding="async" class="profile-card__image lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Image}}" alt="{{.Title}}" loading="lazy">
|
||||
<span class="profile-card__progress"><span class="profile-card__progress-fill" style="width:{{.Progress}}"></span></span>
|
||||
{{if .URL}}</a>{{else}}</div>{{end}}
|
||||
<h3 class="profile-card__title">{{if .URL}}<a href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Title}}</a>{{else}}{{.Title}}{{end}}</h3>
|
||||
<p class="profile-card__meta">{{.Meta}}{{if .Remaining}}<span class="profile-card__remaining"> {{.Remaining}}</span>{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
<section class="profile-section profile-section--favorites" id="favorites">
|
||||
<div class="profile-section__head">
|
||||
<div class="profile-section__heading"><h2 class="profile-section__title">我的收藏</h2><span class="profile-section__subtitle">{{if .favoriteCount}}{{.favoriteCount}}{{else}}—{{end}} 部</span></div>
|
||||
<a class="profile-section__more" href="/favorites">全部收藏 <img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></a>
|
||||
</div>
|
||||
<div class="profile-grid">
|
||||
{{range .favorites}}
|
||||
<article class="profile-card">
|
||||
{{if .URL}}<a class="profile-card__cover" href="{{.URL}}" {{externalLinkAttrs .URL}} aria-label="播放{{.Title}}">{{else}}<div class="profile-card__cover">{{end}}
|
||||
<img decoding="async" class="profile-card__image lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Image}}" alt="{{.Title}}" loading="lazy">
|
||||
<span class="profile-card__episodes">{{.Episodes}}</span>
|
||||
{{if .Badge}}<span class="profile-card__badge{{if eq .Badge "爆剧"}} profile-card__badge--hot{{end}}">{{.Badge}}</span>{{end}}
|
||||
{{if .URL}}</a>{{else}}</div>{{end}}
|
||||
<h3 class="profile-card__title">{{if .URL}}<a href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Title}}</a>{{else}}{{.Title}}{{end}}</h3>
|
||||
<p class="profile-card__meta">{{.Meta}}</p>
|
||||
</article>
|
||||
{{else}}
|
||||
<p class="profile-section__empty">{{if $.favoritesUnavailable}}收藏暂时无法加载{{else}}暂无收藏{{end}}</p>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,51 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/profile.css?v=9">
|
||||
<link rel="stylesheet" href="/static/css/profile-mobile.css?v=5">
|
||||
<link rel="stylesheet" href="/static/css/purchased.css?v=2">
|
||||
<link rel="stylesheet" href="/static/css/purchased-mobile.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/account-empty.css?v=2">
|
||||
</head>
|
||||
<body class="profile-page purchased-page">
|
||||
{{template "header" .}}
|
||||
{{template "userCenterHero" .}}
|
||||
{{template "userCenterTabs" .}}
|
||||
<main class="purchased-main{{if not .purchased}} is-empty{{end}}" data-purchased>
|
||||
<h1 class="visually-hidden">已购剧集</h1>
|
||||
{{if .purchased}}
|
||||
<p class="purchased-note">金币解锁的剧集永久有效,可随时回看</p>
|
||||
<div class="purchased-list">
|
||||
{{range .purchased}}
|
||||
<article class="purchased-item">
|
||||
<a class="purchased-item__cover" href="{{.URL}}" {{externalLinkAttrs .URL}}><img decoding="async" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Image}}" alt="{{.Title}}" loading="lazy"></a>
|
||||
<div class="purchased-item__body">
|
||||
<h2 class="purchased-item__title">{{.Title}}</h2>
|
||||
<p class="purchased-item__info">{{.Info}}{{if .Date}}<span class="purchased-item__mobile-date"> · {{.Date}}</span>{{end}}</p>
|
||||
<span class="purchased-item__progress"><span style="width:{{.Progress}}"></span></span>
|
||||
</div>
|
||||
<time class="purchased-item__date">{{.Date}}</time>
|
||||
<a class="purchased-item__resume" href="{{.URL}}" {{externalLinkAttrs .URL}}><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放"><span class="purchased-item__resume-desktop">继续观看</span><span class="purchased-item__resume-mobile">继续</span></a>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<section class="account-empty" aria-labelledby="purchased-empty-title">
|
||||
<span class="account-empty__icon" aria-hidden="true"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/purchased-empty/bag-play.svg" alt="已购剧集"></span>
|
||||
<h2 class="account-empty__title" id="purchased-empty-title">{{if .purchasedUnavailable}}已购剧集暂时无法加载{{else}}暂无已购剧集{{end}}</h2>
|
||||
{{if not .purchasedUnavailable}}
|
||||
<p class="account-empty__description"><span class="account-empty__description-desktop">金币解锁的剧集永久有效,可随时回看</span><span class="account-empty__description-mobile">解锁的剧集会显示在这里</span></p>
|
||||
<a class="account-empty__action" href="/"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/favorites-empty/arrow-right.svg" alt="前往首页">去首页逛逛</a>
|
||||
{{end}}
|
||||
</section>
|
||||
{{end}}
|
||||
{{template "accountPagination" .}}
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/rank.css?v=3">
|
||||
</head>
|
||||
<body class="page-list page-rank">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}</div>
|
||||
<a class="page-subheader__btn" href="/search-mobile" aria-label="搜索">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="排行榜频道">
|
||||
<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">{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}</h1>
|
||||
<p class="list-hero__desc only-pc">{{if .seoInfo.Description}}{{.seoInfo.Description}}{{else}}每小时更新一次,数据来自全站播放、收藏与解锁{{end}}</p>
|
||||
<p class="list-hero__desc only-h5">每小时更新一次</p>
|
||||
</div>
|
||||
|
||||
<nav class="rank-tabs" aria-label="榜单类型">
|
||||
{{range .rankTabs}}
|
||||
<a class="rank-tabs__item{{if .Active}} is-active{{end}}" href="{{.URL}}" {{externalLinkAttrs .URL}}>{{.Label}}</a>
|
||||
{{end}}
|
||||
</nav>
|
||||
</section>
|
||||
|
||||
<section class="list-body list-body--rank" aria-label="{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}列表">
|
||||
<h2 class="visually-hidden">{{if .tabTitle}}{{.tabTitle}}{{else}}热播榜{{end}}作品列表</h2>
|
||||
{{if .list}}
|
||||
<div class="grid--rank-list">
|
||||
{{range $i, $item := .list}}
|
||||
{{$rank := add $.rankOffset (add $i 1)}}
|
||||
<article class="rank-card">
|
||||
<div class="rank-card__rank">
|
||||
<span class="rank-card__no{{if le $rank 3}} is-top{{end}}">{{rankNo $rank}}</span>
|
||||
</div>
|
||||
<div class="rank-card__body">
|
||||
<a class="rank-card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if eq $item.UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if $item.TotalEpisode}}
|
||||
<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>
|
||||
{{end}}
|
||||
</a>
|
||||
<div class="rank-card__info">
|
||||
<h3 class="rank-card__title">
|
||||
<a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a>
|
||||
</h3>
|
||||
<p class="rank-card__meta">
|
||||
{{$tags := cardTags $item}}
|
||||
{{range $ti, $tag := $tags}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}
|
||||
{{if $tags}} {{end}}
|
||||
{{if eq $item.UpdateStatus 1}}连载中{{else if $item.TotalEpisode}}全 {{$item.TotalEpisode}} 集{{else}}{{updateStatusText $item.UpdateStatus}}{{end}}
|
||||
</p>
|
||||
<p class="rank-card__heat only-h5">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/trending-up.svg" alt="热门趋势">
|
||||
{{if $.isBinge}}{{formatLikeCount $item.CountCollect}}{{else}}{{formatLikeCount $item.HeatValue}}{{end}}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<a class="rank-card__play only-h5" href="{{playURL $item.Slug $item.ID}}">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
播放
|
||||
</a>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无榜单数据</p>
|
||||
{{end}}
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,88 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/recentlyAdded.css">
|
||||
</head>
|
||||
<body class="page-list page-recently">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" 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/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="最近上新">
|
||||
<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">{{if .seoInfo.Description}}{{.seoInfo.Description}}{{else}}按上线时间排序,每日 18:00 更新{{end}}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="上新列表">
|
||||
<h2 class="visually-hidden">最近上新作品列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
{{$adIdxPc := 0}}
|
||||
{{$adIdxH5 := 0}}
|
||||
{{$total := len .list}}
|
||||
<div class="grid--list">
|
||||
{{range $i, $item := .list}}
|
||||
<article class="card card--list">
|
||||
<a class="card__cover lazy" href="{{playURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.Cover}}">
|
||||
{{if eq $item.UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if $item.TotalEpisode}}
|
||||
<span class="card__ep">全 {{$item.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText $item.UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if $item.IsNew}}<span class="badge badge--new">上新</span>{{else if $item.IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq $item.Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL $item.Slug $item.ID}}">{{if $item.PlayName}}{{$item.PlayName}}{{else}}{{$item.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags $item}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{$n := add $i 1}}
|
||||
{{if and $.appConfig.DetailBannerList (lt $n $total)}}
|
||||
{{if eq (mod $n 12) 0}}
|
||||
<div class="list-mid-promo only-pc">
|
||||
{{template "ads" (adSlice $.appConfig.DetailBannerList $adIdxPc 2)}}
|
||||
</div>
|
||||
{{$adIdxPc = add $adIdxPc 2}}
|
||||
{{end}}
|
||||
{{if eq (mod $n 6) 0}}
|
||||
<div class="list-mid-promo only-h5">
|
||||
{{template "ads" (adSlice $.appConfig.DetailBannerList $adIdxH5 2)}}
|
||||
</div>
|
||||
{{$adIdxH5 = add $adIdxH5 2}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无上新短剧</p>
|
||||
{{end}}
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,103 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/recharge.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/recharge-mobile.css?v=2">
|
||||
</head>
|
||||
<body class="recharge-page">
|
||||
{{template "header" .}}
|
||||
{{template "subpageHeader" .}}
|
||||
<main class="recharge-main" data-recharge>
|
||||
<nav class="recharge-breadcrumb" aria-label="面包屑"><a href="/profile">个人中心</a><span aria-hidden="true">›</span><span>金币充值</span></nav>
|
||||
<div class="recharge-intro">
|
||||
<span class="recharge-intro__eyebrow">钱包</span>
|
||||
<h1>金币充值</h1>
|
||||
<p>金币按集解锁付费剧集,解锁后永久有效</p>
|
||||
</div>
|
||||
|
||||
<section class="recharge-balance" aria-label="金币余额">
|
||||
<div class="recharge-balance__main">
|
||||
<img decoding="async" loading="lazy" class="recharge-balance__coin" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/coin3d.png" alt="金币余额" aria-hidden="true">
|
||||
<div class="recharge-balance__copy">
|
||||
<span class="recharge-balance__label">当前余额</span>
|
||||
<strong><span data-recharge-balance>{{if .balanceText}}{{.balanceText}}{{else if .balance}}{{.balance}}{{else}}0{{end}}</span> <small>金币</small></strong>
|
||||
<p><span class="recharge-balance__note-full">按剧集原定价按集解锁 解锁后永久有效</span><span class="recharge-balance__note-short">按集解锁,解锁后永久有效</span></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="recharge-balance__guide">
|
||||
<h2>金币怎么用</h2>
|
||||
<div class="recharge-balance__tip"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/lock.svg" alt="按集解锁"><div><strong>解锁单集内容</strong><span>按剧集标定价消耗金币</span></div></div>
|
||||
<div class="recharge-balance__tip"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/zap.svg" alt="快速到账"><div><strong>奖励金币优先使用</strong><span>解锁剧集先自动优先扣除任务获得的奖励金币</span></div></div>
|
||||
<div class="recharge-balance__tip"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/award.svg" alt="永久有效"><div><strong>已解锁剧集不再扣费</strong><span>已解锁的剧集可随时回看,不会重复消耗金币</span></div></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="recharge-packages" aria-labelledby="recharge-packages-title">
|
||||
<div class="recharge-section-heading"><h2 id="recharge-packages-title">选择套餐</h2><span>按集解锁,自由使用</span></div>
|
||||
<div class="recharge-packages__grid" role="radiogroup" aria-label="充值套餐">
|
||||
{{range .packages}}
|
||||
<button class="recharge-package{{if .Active}} is-selected{{end}}" type="button" role="radio" aria-checked="{{if .Active}}true{{else}}false{{end}}" data-recharge-package data-package-id="{{.ID}}" data-coins="{{.TotalCoinText}}" data-price="{{.PriceText}}" data-pay-methods="{{.PayMethodsJSON}}">
|
||||
<span class="recharge-package__title"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/coin.png" alt="金币">{{if .TotalCoinText}}{{.TotalCoinText}} 金币{{else}}{{.Name}}{{end}}</span>
|
||||
{{if .Hint}}<span class="recharge-package__hint">{{.Hint}}</span>{{end}}
|
||||
<strong class="recharge-package__price">¥{{.PriceText}}</strong>
|
||||
<img decoding="async" loading="lazy" class="recharge-package__selected" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/check-circle.svg" alt="已选择">
|
||||
</button>
|
||||
{{end}}
|
||||
</div>
|
||||
{{if not .packages}}<p class="recharge-data-empty">{{if .packageUnavailable}}套餐加载失败,请稍后重试{{else}}暂无可购买的金币套餐{{end}}</p>{{end}}
|
||||
<div class="recharge-packages__note"><p>支付方式和到账金币以套餐接口信息为准</p></div>
|
||||
</section>
|
||||
|
||||
<section class="recharge-payment" aria-labelledby="recharge-payment-title">
|
||||
<h2 id="recharge-payment-title">支付方式</h2>
|
||||
<div class="recharge-payment__grid" role="radiogroup" aria-label="支付方式" data-recharge-methods>
|
||||
{{range .paymentMethods}}
|
||||
<button class="recharge-method{{if .Active}} is-selected{{end}}" type="button" role="radio" aria-checked="{{if .Active}}true{{else}}false{{end}}" data-recharge-method="{{.Type}}"><span class="recharge-method__radio"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/check.svg" alt="安全支付"></span><span><strong>{{.TypeName}}</strong><small>支付成功后到账</small></span></button>
|
||||
{{end}}
|
||||
</div>
|
||||
<p class="recharge-data-empty" data-recharge-method-empty{{if .paymentMethods}} hidden{{end}}>当前套餐暂无可用支付方式</p>
|
||||
<div class="recharge-payment__checkout"><button type="button" data-recharge-pay>立即支付 ¥<span data-recharge-price>—</span></button><p>已选 <span data-recharge-coins>—</span> 金币 支付即表示同意《充值协议》</p></div>
|
||||
<p class="recharge-payment__status" data-recharge-status role="status" hidden></p>
|
||||
</section>
|
||||
|
||||
<section class="recharge-history" id="recharge-history" aria-labelledby="recharge-history-title">
|
||||
<div class="recharge-history__head"><h2 id="recharge-history-title">交易明细</h2>
|
||||
<div class="recharge-history__filters" role="group" aria-label="交易明细筛选">
|
||||
<button class="is-active" type="button" data-recharge-filter="0" aria-pressed="true">全部</button>
|
||||
<button type="button" data-recharge-filter="1" aria-pressed="false">充值</button>
|
||||
<button type="button" data-recharge-filter="2" aria-pressed="false">消费</button>
|
||||
<button type="button" data-recharge-filter="3" aria-pressed="false">奖励</button>
|
||||
</div>
|
||||
<button class="recharge-history__export" type="button" data-recharge-export>导出 <img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/recharge/download.svg" alt="下载 App"></button>
|
||||
<button class="recharge-history__more" type="button" data-recharge-more>全部 <img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></button>
|
||||
</div>
|
||||
<div class="recharge-history__table">
|
||||
<div class="recharge-history__columns" aria-hidden="true"><span>类型</span><span>说明</span><span>时间</span><span>金币变动</span></div>
|
||||
<div class="recharge-history__rows" data-recharge-rows>
|
||||
{{range $index, $tx := .transactions}}
|
||||
<div class="recharge-history__row" data-recharge-row data-category="{{$tx.Category}}">
|
||||
<span class="recharge-history__kind">{{$tx.Kind}}</span>
|
||||
<span class="recharge-history__detail-line"><span class="recharge-history__description">{{$tx.Description}}</span><time class="recharge-history__time"><span class="only-desktop">{{$tx.TimeText}}</span><span class="only-mobile">{{$tx.MobileTime}}</span></time></span>
|
||||
<strong class="recharge-history__amount{{if $tx.Credit}} is-credit{{end}}">{{$tx.AmountText}}</strong>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<p class="recharge-history__empty" data-recharge-history-empty{{if .transactions}} hidden{{end}}>{{if .transactionsUnavailable}}交易明细加载失败{{else}}暂无记录{{end}}</p>
|
||||
</div>
|
||||
<nav class="recharge-pagination" aria-label="交易明细分页" data-recharge-pagination data-page="{{.transactionPage.PageNum}}" data-page-size="{{.transactionPage.PageSize}}" data-total="{{.transactionPage.TotalCount}}">
|
||||
<button type="button" data-recharge-prev aria-label="上一页" disabled><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></button>
|
||||
<span data-recharge-pages></span>
|
||||
<button type="button" data-recharge-next aria-label="下一页"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></button>
|
||||
<span class="recharge-pagination__total" data-recharge-total>共 {{.transactionPage.TotalCount}} 条</span>
|
||||
</nav>
|
||||
</section>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script src="/static/js/recharge.js?v=8" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,146 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/register.css?v=3">
|
||||
<script>
|
||||
// PC 注册走弹窗:桌面访问 /register 时回首页并打开注册弹窗
|
||||
(function () {
|
||||
try {
|
||||
if (window.matchMedia && window.matchMedia("(min-width: 769px)").matches) {
|
||||
window.location.replace("/?auth=register");
|
||||
}
|
||||
} catch (e) {}
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
<body class="page-register">
|
||||
<header class="page-subheader" aria-label="注册顶栏">
|
||||
<a class="page-subheader__btn" href="javascript:history.back()" aria-label="返回">
|
||||
<img class="icon" src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<h1 class="page-subheader__title">注册账号</h1>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="register-page">
|
||||
<div class="register-page__inner">
|
||||
<div class="register-page__brand">
|
||||
<img class="register-page__logo" src="/static/logo_icon.png" alt="黄果短剧">
|
||||
</div>
|
||||
|
||||
<div class="register-page__content">
|
||||
<div class="register-page__intro">
|
||||
<h2 class="register-page__title">创建账号</h2>
|
||||
<p class="register-page__desc">注册后即可解锁付费剧集并收藏作品</p>
|
||||
</div>
|
||||
|
||||
<form class="register-page__form" action="/api/auth/register" method="post" data-register-page-form novalidate>
|
||||
<label class="register-page__field" data-field="account">
|
||||
<span class="register-page__label">账号</span>
|
||||
<span class="register-page__control">
|
||||
<img class="icon" src="/static/images/user.svg" alt="" aria-hidden="true">
|
||||
<input
|
||||
class="register-page__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-page__error" data-field-error="account" hidden>
|
||||
<img class="register-page__error-icon" src="/static/images/error-tip.svg" alt="" aria-hidden="true">
|
||||
<span data-field-error-text></span>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<label class="register-page__field" data-field="password">
|
||||
<span class="register-page__label">密码</span>
|
||||
<span class="register-page__control">
|
||||
<img class="icon" src="/static/images/lock-dim.svg" alt="" aria-hidden="true">
|
||||
<input
|
||||
class="register-page__input"
|
||||
type="password"
|
||||
name="password"
|
||||
autocomplete="new-password"
|
||||
placeholder="8 位以上,含字母与数字"
|
||||
minlength="8"
|
||||
maxlength="64"
|
||||
data-register-page-password
|
||||
required
|
||||
>
|
||||
<button class="register-page__toggle" type="button" data-register-page-toggle="password" aria-label="显示密码">
|
||||
<img class="icon" src="/static/images/eye.svg" alt="" data-register-page-toggle-icon="password">
|
||||
</button>
|
||||
</span>
|
||||
<span class="register-page__error" data-field-error="password" hidden>
|
||||
<img class="register-page__error-icon" src="/static/images/error-tip.svg" alt="" aria-hidden="true">
|
||||
<span data-field-error-text></span>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<label class="register-page__field" data-field="passwordConfirm">
|
||||
<span class="register-page__label">确认密码</span>
|
||||
<span class="register-page__control">
|
||||
<img class="icon" src="/static/images/lock-dim.svg" alt="" aria-hidden="true">
|
||||
<input
|
||||
class="register-page__input"
|
||||
type="password"
|
||||
name="passwordConfirm"
|
||||
autocomplete="new-password"
|
||||
placeholder="再次输入密码"
|
||||
minlength="8"
|
||||
maxlength="64"
|
||||
data-register-page-password-confirm
|
||||
required
|
||||
>
|
||||
<button class="register-page__toggle" type="button" data-register-page-toggle="confirm" aria-label="显示密码">
|
||||
<img class="icon" src="/static/images/eye.svg" alt="" data-register-page-toggle-icon="confirm">
|
||||
</button>
|
||||
</span>
|
||||
<span class="register-page__error" data-field-error="passwordConfirm" hidden>
|
||||
<img class="register-page__error-icon" src="/static/images/error-tip.svg" alt="" aria-hidden="true">
|
||||
<span data-field-error-text></span>
|
||||
</span>
|
||||
</label>
|
||||
|
||||
<label class="register-page__agree" data-field="agree">
|
||||
<input class="register-page__checkbox" type="checkbox" name="agree" required>
|
||||
<span class="register-page__check" aria-hidden="true"></span>
|
||||
<span>
|
||||
我已年满 18 岁,并同意
|
||||
<a href="/terms">《用户条款》</a>
|
||||
与
|
||||
<a href="/privacy">《隐私政策》</a>
|
||||
</span>
|
||||
</label>
|
||||
<span class="register-page__error" data-field-error="agree" hidden>
|
||||
<img class="register-page__error-icon" src="/static/images/error-tip.svg" alt="" aria-hidden="true">
|
||||
<span data-field-error-text></span>
|
||||
</span>
|
||||
|
||||
<button class="btn btn--primary register-page__submit" type="submit" data-register-page-submit>注册</button>
|
||||
</form>
|
||||
|
||||
<p class="register-page__switch">
|
||||
<span>已有账号?</span>
|
||||
<a href="/login">立即登录</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<script defer src="/static/js/common/cookie.js?v=1"></script>
|
||||
<script defer src="/static/js/common/request.js?v=6"></script>
|
||||
<script defer src="/static/js/common/auth.js?v=3"></script>
|
||||
<script defer src="/static/js/pages/register.js?v=4"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,14 @@
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# 非 HTML 接口与播放器工具无需被搜索引擎抓取。
|
||||
Disallow: /api/
|
||||
Disallow: /h5/
|
||||
Disallow: /ui/
|
||||
Disallow: /healthz
|
||||
Disallow: /enkey
|
||||
Disallow: /newenkey
|
||||
Disallow: /cdn-cgi/
|
||||
|
||||
# 搜索、登录和账户 HTML 保持可抓取,以便爬虫读取页面内 noindex。
|
||||
Sitemap: /sitemap.xml
|
||||
@@ -0,0 +1,111 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/search.css?v=12">
|
||||
</head>
|
||||
<body class="search-page">
|
||||
{{template "header" .}}
|
||||
<header class="search-h5-header" aria-label="搜索顶栏">
|
||||
<a class="search-h5-header__back" href="javascript:history.back()" aria-label="返回">
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<form class="search-h5-header__form" action="/search" method="get" role="search" data-path-search>
|
||||
<img decoding="async" loading="lazy" class="search-h5-header__search-icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search.svg" alt="搜索">
|
||||
<input class="search-h5-header__input" type="search" value="{{.query}}" placeholder="搜索剧名 / 演员 / 标签" aria-label="搜索剧名、演员或标签" autocomplete="off" data-search-h5-input>
|
||||
<button class="search-h5-header__clear" type="button" aria-label="清除搜索词" data-search-h5-clear{{if not .query}} hidden{{end}}>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</form>
|
||||
<a class="search-h5-header__cancel" href="/">取消</a>
|
||||
</header>
|
||||
<h1 class="visually-hidden">搜索“{{.query}}”</h1>
|
||||
<main class="search-main" data-search-results data-search-keyword="{{.query}}" data-search-result-count="{{.resultCount}}" data-search-page="{{.pageNum}}" data-search-page-size="{{.pageSize}}">
|
||||
{{if .hasResults}}
|
||||
<section class="search-heading">
|
||||
<div class="search-heading__intro">
|
||||
<p class="search-heading__kicker"><span></span>搜索</p>
|
||||
<h2>“{{.query}}”</h2>
|
||||
<p class="search-heading__description">找到 <span data-result-count>{{.resultCount}}</span> 部相关作品</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="search-results" aria-label="搜索结果">
|
||||
<p class="search-results__mobile-count">找到 <span data-result-count>{{.resultCount}}</span> 部相关作品</p>
|
||||
<div class="search-card-grid" data-search-grid>
|
||||
{{range .works}}{{template "searchCard" .}}{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
</section>
|
||||
{{else}}
|
||||
<section class="search-heading search-heading--empty">
|
||||
<div class="search-heading__intro">
|
||||
<p class="search-heading__kicker"><span></span>搜索</p>
|
||||
<h2>“{{.query}}”</h2>
|
||||
<p class="search-heading__description">没有找到相关作品,试试更短的关键词或从热门推荐里挑一部</p>
|
||||
</div>
|
||||
</section>
|
||||
<section class="search-empty" aria-label="没有搜索结果">
|
||||
<div class="search-empty__icon"><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/search.svg" alt="搜索"></div>
|
||||
<h2>没有找到相关作品</h2>
|
||||
<p>换个关键词试试,或按题材浏览全部短剧</p>
|
||||
<a class="btn btn--primary" href="/list">浏览全部短剧</a>
|
||||
</section>
|
||||
{{if .recommended}}
|
||||
<section class="search-recommendations" aria-label="热门推荐">
|
||||
<div class="search-recommendations__heading">
|
||||
<h2>大家都在看</h2>
|
||||
<a href="/list"><span class="search-recommendations__more-label search-recommendations__more-label--pc">查看全部</span><span class="search-recommendations__more-label search-recommendations__more-label--h5">全部</span><img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项"></a>
|
||||
</div>
|
||||
<div class="search-card-grid">
|
||||
{{range .recommended}}{{template "searchCard" .}}{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
{{end}}
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script>
|
||||
(function () {
|
||||
var input = document.querySelector("[data-search-h5-input]");
|
||||
var clear = document.querySelector("[data-search-h5-clear]");
|
||||
if (!input || !clear) return;
|
||||
function sync() {
|
||||
clear.hidden = !String(input.value || "").trim();
|
||||
}
|
||||
input.addEventListener("input", sync);
|
||||
clear.addEventListener("click", function () {
|
||||
input.value = "";
|
||||
sync();
|
||||
input.focus();
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
{{define "searchCard"}}
|
||||
<article class="search-card" data-search-item-id="{{.ID}}">
|
||||
<a class="search-card__cover" href="{{playURL .Slug .ID}}" aria-label="{{playletDisplayName .PlayName .Title}}" data-search-result-click>
|
||||
<img decoding="async" loading="lazy" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Cover}}" alt="{{playletDisplayName .PlayName .Title}}">
|
||||
<span class="search-card__scrim"></span>
|
||||
{{if eq .UpdateStatus 1}}
|
||||
<span class="search-card__episodes">连载中</span>
|
||||
{{else if .TotalEpisode}}
|
||||
<span class="search-card__episodes">全 {{.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="search-card__episodes">{{updateStatusText .UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if .IsFeatured}}
|
||||
<span class="search-card__badge">爆剧</span>
|
||||
{{else if eq .Anchor "原创"}}
|
||||
<span class="search-card__badge search-card__badge--original">原创</span>
|
||||
{{end}}
|
||||
</a>
|
||||
<h3 class="search-card__title"><a href="{{playURL .Slug .ID}}" data-search-result-click>{{playletDisplayName .PlayName .Title}}</a></h3>
|
||||
<p class="search-card__meta">{{range $ti, $tag := cardTags .}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
@@ -0,0 +1,91 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/mobile-search.css?v=4">
|
||||
</head>
|
||||
<body class="mobile-search">
|
||||
<header class="mobile-search__header">
|
||||
<a class="mobile-search__back" href="/" aria-label="返回" data-search-close>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<form class="mobile-search__form" action="/search" method="get" role="search" data-path-search>
|
||||
<img decoding="async" loading="lazy" class="mobile-search__search-icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search.svg" alt="搜索">
|
||||
<input class="mobile-search__input" type="search" value="{{.query}}" placeholder="搜索剧名 / 演员 / 标签" aria-label="搜索剧名、演员或标签" autocomplete="off" data-mobile-search-input>
|
||||
<button class="mobile-search__clear" type="button" aria-label="清除搜索词" data-mobile-search-clear{{if not .query}} hidden{{end}}>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</form>
|
||||
<a class="mobile-search__cancel" href="/" data-search-close>取消</a>
|
||||
</header>
|
||||
|
||||
<main class="mobile-search__main">
|
||||
<h1 class="visually-hidden">搜索短剧</h1>
|
||||
<div class="mobile-search__default" data-search-default{{if .query}} hidden{{end}}>
|
||||
<section class="mobile-search__history" aria-label="搜索历史" data-search-history hidden>
|
||||
<div class="mobile-search__section-head">
|
||||
<h2 class="mobile-search__section-label">搜索历史</h2>
|
||||
<button class="mobile-search__history-clear" type="button" aria-label="清除搜索历史" data-history-clear>
|
||||
<img decoding="async" loading="lazy" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</div>
|
||||
<div class="mobile-search__chips" data-history-chips></div>
|
||||
</section>
|
||||
|
||||
{{if .trends}}
|
||||
<section class="mobile-search__trending" aria-label="热门搜索">
|
||||
<h2 class="mobile-search__section-label">热门搜索</h2>
|
||||
<ol class="mobile-search__trend-list">
|
||||
{{range .trends}}
|
||||
<li class="mobile-search__trend">
|
||||
<a href="{{searchResultsURL .Title}}">
|
||||
<span class="mobile-search__trend-rank">{{.Rank}}</span>
|
||||
<span class="mobile-search__trend-name">{{.Title}}</span>
|
||||
{{if .Badge}}<span class="mobile-search__trend-badge{{if eq .Badge "新"}} mobile-search__trend-badge--new{{end}}">{{.Badge}}</span>{{end}}
|
||||
<span class="mobile-search__trend-heat">{{.Heat}}</span>
|
||||
</a>
|
||||
</li>
|
||||
{{end}}
|
||||
</ol>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
{{if .recommended}}
|
||||
<section class="mobile-search__recommendations" aria-label="猜你想搜">
|
||||
<h2 class="mobile-search__recommend-title">猜你想搜</h2>
|
||||
<div class="mobile-search__recommend-grid">
|
||||
{{range .recommended}}
|
||||
{{$name := playletDisplayName .PlayName .Title}}
|
||||
<article class="mobile-search__card">
|
||||
<a class="mobile-search__cover" href="{{playURL .Slug .ID}}" aria-label="{{$name}}">
|
||||
<img decoding="async" loading="lazy" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.Cover}}" alt="{{$name}}">
|
||||
<span class="mobile-search__cover-shade"></span>
|
||||
{{if eq .UpdateStatus 1}}
|
||||
<span class="mobile-search__episodes">连载中</span>
|
||||
{{else if .TotalEpisode}}
|
||||
<span class="mobile-search__episodes">全 {{.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="mobile-search__episodes">{{updateStatusText .UpdateStatus}}</span>
|
||||
{{end}}
|
||||
</a>
|
||||
<h3 class="mobile-search__title"><a href="{{playURL .Slug .ID}}">{{$name}}</a></h3>
|
||||
<p class="mobile-search__meta">{{range $ti, $tag := cardTags .}}{{if $ti}} {{end}}{{$tag.Name}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<section class="mobile-search__suggestions" aria-label="搜索联想" data-search-suggestions{{if not .query}} hidden{{end}}>
|
||||
<div class="mobile-search__suggestion-list" data-search-suggest-list></div>
|
||||
</section>
|
||||
</main>
|
||||
<script defer src="/static/common/imgDecypt.js?v=9"></script>
|
||||
<script src="/static/js/mobile-search.js?v=5" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,112 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/series.css?v=7">
|
||||
</head>
|
||||
<body class="page-list page-series">
|
||||
{{template "header" .}}
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="剧集频道">
|
||||
<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">{{if .pageHeading}}{{.pageHeading}}{{else}}剧集与动画{{end}}</h1>
|
||||
<p class="list-hero__desc">{{if .seoInfo.Description}}{{.seoInfo.Description}}{{else}}横版观看的影集与动画作品{{end}}</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{{if eq .mediaType 0}} is-active{{end}}" href="{{seriesListURL 0 .topicId .sortType 1}}">全部</a>
|
||||
<a class="filter-chip{{if eq .mediaType 1}} is-active{{end}}" href="{{seriesListURL 1 .topicId .sortType 1}}">影集</a>
|
||||
<a class="filter-chip{{if eq .mediaType 2}} is-active{{end}}" href="{{seriesListURL 2 .topicId .sortType 1}}">动画</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">题材</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if eq .topicId 0}} is-active{{end}}" href="{{seriesListURL .mediaType 0 .sortType 1}}">全部</a>
|
||||
{{range .topicList}}
|
||||
<a class="filter-chip{{if eq $.topicId .ID}} is-active{{end}}" href="{{seriesListURL $.mediaType .ID $.sortType 1}}">{{.DisplayName}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="filter-row only-pc">
|
||||
<span class="filter-row__label">排序</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if eq .sortType 1}} is-active{{end}}" href="{{seriesListURL .mediaType .topicId 1 1}}">最新</a>
|
||||
<a class="filter-chip{{if eq .sortType 2}} is-active{{end}}" href="{{seriesListURL .mediaType .topicId 2 1}}">最热</a>
|
||||
<a class="filter-chip{{if eq .sortType 3}} is-active{{end}}" href="{{seriesListURL .mediaType .topicId 3 1}}">收藏最多</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="剧集列表">
|
||||
<h2 class="visually-hidden">剧集与动画作品列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
{{$adIdxPc := 0}}
|
||||
{{$adIdxH5 := 0}}
|
||||
{{$total := len .list}}
|
||||
<div class="grid--series-list">
|
||||
{{range $i, $item := .list}}
|
||||
<article class="series-list-card">
|
||||
<a class="series-list-card__cover lazy" href="{{videoPlayURL $item.Slug $item.ID}}" style="{{cssCoverPlaceholder}}" data-src="{{$item.CoverImg}}">
|
||||
{{with episodeLabel $item}}
|
||||
<span class="card__ep">{{.}}</span>
|
||||
{{end}}
|
||||
<span class="badge badge--hot">{{mediaTypeLabel $item.MediaType}}</span>
|
||||
<span class="series-list-card__play" aria-hidden="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</span>
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{videoPlayURL $item.Slug $item.ID}}">{{$item.Title}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $t := $item.TopicNames}}{{if $ti}} {{end}}{{$t}}{{else}}{{$item.CreatorName}}{{end}}</p>
|
||||
</article>
|
||||
{{$n := add $i 1}}
|
||||
{{if and $.advitise $.advitise.DetailBannerList (lt $n $total)}}
|
||||
{{if eq (mod $n 8) 0}}
|
||||
<div class="series-list-promo only-pc">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxPc 2)}}
|
||||
</div>
|
||||
{{$adIdxPc = add $adIdxPc 2}}
|
||||
{{end}}
|
||||
{{if eq (mod $n 4) 0}}
|
||||
<div class="series-list-promo only-h5">
|
||||
{{template "ads" (adSlice $.advitise.DetailBannerList $adIdxH5 2)}}
|
||||
</div>
|
||||
{{$adIdxH5 = add $adIdxH5 2}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无剧集</p>
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
{{if and .advitise .advitise.DetailBannerList}}
|
||||
<div class="list-bottom-promo">
|
||||
{{template "ads" (adSlice .advitise.DetailBannerList 2 2)}}
|
||||
</div>
|
||||
{{end}}
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,342 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
{{/* 夸克 / QQ(X5):页内播放适配。不要写 x5-fullscreen,否则 QQ 会接管成系统播放器 */}}
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta name="force-rendering" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="x5-orientation" content="portrait">
|
||||
<meta name="x5-page-mode" content="app">
|
||||
<meta name="browsermode" content="application">
|
||||
<meta name="imagemode" content="force">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<script src="/static/js/common/compat.js?v=4"></script>
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/recharge-modal.css?v=2">
|
||||
<link rel="stylesheet" href="/static/common/DPlayer.min.css">
|
||||
<link rel="stylesheet" href="/static/css/play.css?v=25">
|
||||
<script defer src="/static/common/hls.min.js"></script>
|
||||
<script defer src="/static/common/DPlayer.min.js?v=2"></script>
|
||||
</head>
|
||||
<body class="page-play page-series-play">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{if .video.Title}}{{.video.Title}}{{else}}视频播放{{end}}</div>
|
||||
<button class="page-subheader__btn" type="button" aria-label="分享" data-share-page>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/share.svg" alt="分享">
|
||||
</button>
|
||||
</header>
|
||||
|
||||
<div class="page play-page">
|
||||
<main class="main play-main">
|
||||
<nav class="breadcrumb play-breadcrumb only-pc" aria-label="面包屑">
|
||||
<a class="breadcrumb__item" href="/">首页</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<a class="breadcrumb__item" href="/series">视频</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<span class="breadcrumb__item is-current">{{if .video.Title}}{{.video.Title}}{{else}}播放{{end}}</span>
|
||||
</nav>
|
||||
|
||||
<section class="play-stage" aria-label="播放器">
|
||||
<div
|
||||
class="play-player{{if not .canWatch}} play-player--locked{{end}}"
|
||||
data-play-player
|
||||
data-video-id="{{.videoID}}"
|
||||
data-can-watch="{{if .canWatch}}1{{else}}0{{end}}"
|
||||
>
|
||||
{{if and .canWatch .videoURL}}
|
||||
<div class="dplayer-video" data-url="{{.videoURL}}"></div>
|
||||
{{end}}
|
||||
|
||||
<img decoding="async" loading="lazy"
|
||||
class="play-player__cover lazy"
|
||||
src="/static/images/placeholder.png?v=2"
|
||||
data-src="{{if .cover}}{{.cover}}{{else}}{{.video.Video.Cover}}{{end}}"
|
||||
|
||||
data-play-poster
|
||||
alt="{{if .video.Title}}{{.video.Title}}{{else}}视频{{end}}"
|
||||
>
|
||||
<div class="play-player__scrim" aria-hidden="true"></div>
|
||||
<div class="play-player__dim" aria-hidden="true"></div>
|
||||
|
||||
<button
|
||||
class="play-player__center"
|
||||
type="button"
|
||||
aria-label="播放"
|
||||
{{if .canWatch}}data-play-poster-play{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</button>
|
||||
|
||||
{{if not .canWatch}}
|
||||
<div class="play-player__unlock">
|
||||
<div class="play-player__unlock-icon" aria-hidden="true">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/lock.svg" alt="解锁">
|
||||
</div>
|
||||
<p class="play-player__unlock-ep">{{if .video.Title}}{{.video.Title}}{{else}}视频{{end}}</p>
|
||||
<p class="play-player__unlock-title">暂无法播放</p>
|
||||
<p class="play-player__unlock-desc">当前视频地址不可用,请稍后再试。</p>
|
||||
<div class="play-player__unlock-actions">
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a class="play-player__unlock-app" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 App 免费看
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="play-player__badge">
|
||||
<span class="only-pc">正片{{if .video.Video.VideoTime}} {{formatMediaTime .video.Video.VideoTime}}{{end}}</span>
|
||||
<span class="only-h5">{{if .video.Video.VideoTime}}{{formatMediaTime .video.Video.VideoTime}}{{else}}正片{{end}}</span>
|
||||
</div>
|
||||
|
||||
{{if not .canWatch}}
|
||||
<div class="play-player__bar">
|
||||
<div class="play-player__progress" aria-hidden="true">
|
||||
<span class="play-player__progress-fill" style="width:0%"></span>
|
||||
<span class="play-player__progress-thumb" style="left:0%"></span>
|
||||
</div>
|
||||
<div class="play-player__controls">
|
||||
<div class="play-player__left">
|
||||
<button class="play-player__icon" type="button" aria-label="播放" disabled>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play.svg" alt="播放">
|
||||
</button>
|
||||
<span class="play-player__time">00:00{{if .video.Video.VideoTime}} / {{formatMediaTime .video.Video.VideoTime}}{{end}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<div class="play-tabs" aria-label="内容类型">
|
||||
<a class="play-tabs__item is-active" href="#">正片</a>
|
||||
<!-- <p class="play-tabs__hint only-pc">有播放地址时可直接观看</p> -->
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="play-info" aria-label="剧集信息">
|
||||
<div class="play-meta">
|
||||
<div class="play-meta__title-row">
|
||||
<h1 class="play-meta__title">{{if .video.Title}}{{.video.Title}}{{else}}视频{{end}}</h1>
|
||||
<span class="badge badge--hot">影集</span>
|
||||
</div>
|
||||
<div class="play-meta__chips">
|
||||
{{if .video.Video.VideoTime}}<span class="play-chip">{{.video.Video.VideoTime}} 分钟</span>{{end}}
|
||||
{{if and .video.Video.Width .video.Video.Height}}<span class="play-chip">{{.video.Video.Width}}×{{.video.Video.Height}}</span>{{end}}
|
||||
<span class="play-chip">18+</span>
|
||||
</div>
|
||||
<p class="play-meta__stats only-pc">
|
||||
{{if .video.TagsName}}标签 {{range $i, $t := .video.TagsName}}{{if $i}} {{end}}{{$t}}{{end}} {{end}}
|
||||
{{if .video.WatchTimes}}热度 {{formatLikeCount .video.WatchTimes}}{{end}}
|
||||
</p>
|
||||
<p class="play-meta__stats only-h5">
|
||||
{{range $i, $t := .video.TagsName}}{{if $i}} {{end}}{{$t}}{{end}}
|
||||
{{if .video.WatchTimes}} 热度 {{formatLikeCount .video.WatchTimes}}{{end}}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="play-actions">
|
||||
<button
|
||||
class="btn btn--primary play-actions__btn play-actions__btn--play"
|
||||
type="button"
|
||||
{{if .canWatch}}data-play-poster-play{{end}}
|
||||
{{if not .canWatch}}disabled{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
<span>立即播放</span>
|
||||
</button>
|
||||
<button
|
||||
class="btn btn--ghost play-actions__btn play-actions__btn--icon{{if eq .video.IsLike 1}} is-active{{end}}"
|
||||
type="button"
|
||||
aria-label="{{if eq .video.IsLike 1}}取消点赞{{else}}点赞{{end}}"
|
||||
data-video-like
|
||||
data-video-id="{{.videoID}}"
|
||||
data-liked="{{if eq .video.IsLike 1}}1{{else}}2{{end}}"
|
||||
data-like-raw="{{.video.CountLike}}"
|
||||
{{if le .videoID 0}}disabled{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/heart.svg" alt="点赞">
|
||||
<span class="only-pc" data-video-like-label>{{if eq .video.IsLike 1}}已点赞{{else}}点赞{{end}}</span>
|
||||
</button>
|
||||
<button
|
||||
class="btn btn--ghost play-actions__btn play-actions__btn--icon{{if eq .video.IsCollect 1}} is-active{{end}}"
|
||||
type="button"
|
||||
aria-label="{{if eq .video.IsCollect 1}}取消收藏{{else}}收藏{{end}}"
|
||||
data-video-collect
|
||||
data-video-id="{{.videoID}}"
|
||||
data-collected="{{if eq .video.IsCollect 1}}1{{else}}2{{end}}"
|
||||
data-collect-raw="{{.video.CountCollect}}"
|
||||
{{if le .videoID 0}}disabled{{end}}
|
||||
>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/bookmark.svg" alt="收藏">
|
||||
<span class="only-pc" data-video-collect-label>{{if eq .video.IsCollect 1}}已收藏{{else}}收藏{{end}}</span>
|
||||
</button>
|
||||
<button class="btn btn--ghost play-actions__btn play-actions__btn--icon" type="button" aria-label="分享" data-share-page>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/share.svg" alt="分享">
|
||||
<span class="only-pc" data-share-page-label>分享</span>
|
||||
</button>
|
||||
<button class="btn btn--ghost play-actions__btn play-actions__btn--icon" type="button" aria-label="反馈">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/message-circle.svg" alt="评论">
|
||||
<span class="only-pc">反馈</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="play-synopsis">
|
||||
<div class="play-synopsis__head">
|
||||
<h2 class="play-synopsis__title">简介</h2>
|
||||
<button class="play-synopsis__more" type="button">
|
||||
展开
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
</div>
|
||||
<p class="play-synopsis__text">{{if .seoInfo.Description}}{{.seoInfo.Description}}{{else if .video.Title}}{{.video.Title}}{{else}}暂无简介{{end}}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{template "playLinks" .}}
|
||||
|
||||
<div class="play-promo">
|
||||
{{if .advitise}}{{template "ads" (adSlice .advitise.DetailBannerList 0 2)}}{{end}}
|
||||
</div>
|
||||
|
||||
<section class="play-dual" aria-label="评论与热榜">
|
||||
{{template "playComments" .}}
|
||||
|
||||
<aside class="play-hot" aria-label="热门短剧">
|
||||
<div class="play-hot__head">
|
||||
<h2 class="play-hot__title">热门短剧</h2>
|
||||
<a class="play-hot__more" href="{{if .hotMoreURL}}{{.hotMoreURL}}{{else}}/list/all/0/2{{end}}" {{externalLinkAttrs .hotMoreURL}}>
|
||||
完整榜单
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</div>
|
||||
<ol class="play-hot__list">
|
||||
{{range $i, $item := .hotList}}
|
||||
<li{{if ge $i 5}} class="only-pc"{{end}}>
|
||||
<div class="play-hot__item">
|
||||
<a class="play-hot__no{{if lt $i 3}} is-top{{end}}" href="{{playURL $item.Slug $item.ID}}">{{rankNo (add $i 1)}}</a>
|
||||
<a class="play-hot__cover-link" href="{{playURL $item.Slug $item.ID}}">
|
||||
<img decoding="async" loading="lazy" class="play-hot__cover lazy" src="/static/images/placeholder.png?v=2" data-src="{{$item.Cover}}" alt="{{playletDisplayName $item.PlayName $item.Title}}封面">
|
||||
</a>
|
||||
<span class="play-hot__info">
|
||||
<a class="play-hot__name" href="{{playURL $item.Slug $item.ID}}">{{playletDisplayName $item.PlayName $item.Title}}</a>
|
||||
<span class="play-hot__meta">
|
||||
{{$tags := cardTags $item}}
|
||||
{{range $ti, $tag := $tags}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}
|
||||
{{if and $tags $item.TotalEpisode}} {{end}}{{if $item.TotalEpisode}}全 {{$item.TotalEpisode}} 集{{end}}
|
||||
</span>
|
||||
</span>
|
||||
<a class="play-hot__heat" href="{{playURL $item.Slug $item.ID}}">{{formatLikeCount $item.HeatValue}}</a>
|
||||
</div>
|
||||
</li>
|
||||
{{else}}
|
||||
<li><p class="play-comment__text" style="padding:12px 0;color:var(--muted, #888)">暂无热榜数据</p></li>
|
||||
{{end}}
|
||||
</ol>
|
||||
</aside>
|
||||
</section>
|
||||
|
||||
{{if .guessLike}}
|
||||
<section class="play-like" aria-label="猜你喜欢">
|
||||
<div class="play-like__head">
|
||||
<div class="play-like__titles">
|
||||
<h2 class="play-like__title">猜你喜欢</h2>
|
||||
<span class="play-like__desc only-pc">根据本剧题材推荐</span>
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
class="play-like__refresh"
|
||||
data-guess-refresh
|
||||
data-playlet-id="{{.guessPlayletID}}"
|
||||
data-page="{{.guessPage}}"
|
||||
data-page-size="{{if .guessPageSize}}{{.guessPageSize}}{{else}}6{{end}}"
|
||||
data-total="{{.guessTotal}}"
|
||||
>
|
||||
换一批
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</button>
|
||||
</div>
|
||||
<div class="play-like__grid" id="play-like" data-guess-grid>
|
||||
{{range .guessLike}}
|
||||
<article class="card card--play">
|
||||
<a class="card__cover lazy" href="{{playURL .Slug .ID}}" style="{{cssCoverPlaceholder}}" data-src="{{.Cover}}">
|
||||
{{if .TotalEpisode}}<span class="card__ep">全 {{.TotalEpisode}} 集</span>{{else}}<span class="card__ep">{{updateStatusText .UpdateStatus}}</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL .Slug .ID}}">{{playletDisplayName .PlayName .Title}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags .}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
<div class="play-promo play-promo--bottom">
|
||||
{{if .advitise}}{{template "ads" (adSlice .advitise.DetailBannerList 2 2)}}{{end}}
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
|
||||
<div
|
||||
class="play-coin play-coin--short"
|
||||
data-play-coin
|
||||
role="dialog"
|
||||
aria-modal="true"
|
||||
aria-labelledby="play-coin-title"
|
||||
>
|
||||
<div class="play-coin__mask" data-play-coin-close aria-hidden="true"></div>
|
||||
<div class="play-coin__panel">
|
||||
<div class="play-coin__handle" aria-hidden="true"></div>
|
||||
<div class="play-coin__head">
|
||||
<div class="play-coin__copy">
|
||||
<h2 class="play-coin__title" id="play-coin-title">金币不足</h2>
|
||||
<p class="play-coin__desc only-pc">本集需 38 金币,当前余额 12 金币,充值后即可播放。</p>
|
||||
<p class="play-coin__desc only-h5">本集需 38 金币,当前余额 12 金币</p>
|
||||
</div>
|
||||
<button class="play-coin__close" type="button" data-play-coin-close aria-label="关闭">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
</div>
|
||||
<div class="play-coin__sheet">
|
||||
<div class="play-coin__row">
|
||||
<span class="play-coin__label">当前余额</span>
|
||||
<span class="play-coin__value is-low">12 金币</span>
|
||||
</div>
|
||||
<div class="play-coin__divider" aria-hidden="true"></div>
|
||||
<div class="play-coin__row">
|
||||
<span class="play-coin__label">本次消耗</span>
|
||||
<span class="play-coin__cost">38 金币</span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="play-coin__note">后续付费剧集仍需逐集确认</p>
|
||||
<button class="btn btn--primary play-coin__pay" type="button" data-recharge-open>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/gift.svg" alt="礼物">
|
||||
去充值 首充加赠 10%
|
||||
</button>
|
||||
<div class="play-coin__foot">
|
||||
{{$appAddr := .appConfig.AppAddr}}
|
||||
<a class="play-coin__app" href="{{if $appAddr}}{{$appAddr}}{{else}}/download-app{{end}}"{{if $appAddr}} target="_blank" rel="sponsored nofollow noopener"{{end}}>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/download.svg" alt="下载">
|
||||
下载 App 免费看
|
||||
</a>
|
||||
<button class="play-coin__skip" type="button" data-play-coin-close>暂不观看</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{template "rechargeModal" .}}
|
||||
|
||||
<script defer src="/static/js/pages/play.js?v=41"></script>
|
||||
<script defer src="/static/js/recharge-modal.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/profile.css?v=9">
|
||||
<link rel="stylesheet" href="/static/css/profile-mobile.css?v=5">
|
||||
<link rel="stylesheet" href="/static/css/setting.css?v=4">
|
||||
</head>
|
||||
<body class="profile-page setting-page">
|
||||
{{template "header" .}}
|
||||
{{template "userCenterHero" .}}
|
||||
{{template "userCenterTabs" .}}
|
||||
<main class="setting-main">
|
||||
<h1 class="visually-hidden">账号设置</h1>
|
||||
{{with .setting}}
|
||||
<div class="setting-layout">
|
||||
<form class="setting-card" data-setting-form novalidate>
|
||||
<section id="basic" class="setting-section">
|
||||
<h2 class="setting-section__title">基本资料</h2>
|
||||
<div class="setting-fields">
|
||||
<label class="setting-field"><span>昵称</span><input name="nickName" type="text" maxlength="40" value="{{.NickName}}" autocomplete="nickname" placeholder="请输入昵称"></label>
|
||||
<div class="setting-field">
|
||||
<span>账号</span>
|
||||
{{if .HasAccount}}
|
||||
<input type="text" value="{{.AccountNo}}" readonly aria-label="已绑定账号">
|
||||
<small>账号绑定后不可修改</small>
|
||||
{{else}}
|
||||
<button class="setting-field__action" type="button" data-register-open>绑定</button>
|
||||
{{end}}
|
||||
</div>
|
||||
<div class="setting-field">
|
||||
<span>登录密码</span>
|
||||
{{if .HasPassword}}
|
||||
<div class="setting-field__value-action">
|
||||
<input type="text" value="********" readonly aria-label="已设置登录密码">
|
||||
<button class="setting-field__inline-action" type="button" data-setting-password-open>修改</button>
|
||||
</div>
|
||||
{{else}}
|
||||
<button class="setting-field__action" type="button" data-register-open>绑定</button>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<label class="setting-field setting-field--intro"><span>个人简介</span><textarea name="introduction" rows="3" maxlength="300" placeholder="介绍一下自己">{{.Introduction}}</textarea></label>
|
||||
</section>
|
||||
<div class="setting-actions">
|
||||
<button class="setting-actions__save" type="submit" data-setting-save>保存修改</button>
|
||||
<button class="setting-actions__logout" type="button" data-account-switch>切换账号</button>
|
||||
<span class="setting-actions__unavailable" title="账号注销接口暂未开放">注销账号暂未开放</span>
|
||||
</div>
|
||||
<p class="setting-status" role="status" aria-live="polite" data-setting-status></p>
|
||||
</form>
|
||||
|
||||
{{if .HasPassword}}
|
||||
<div class="setting-password-pop" data-setting-password-pop hidden role="dialog" aria-modal="true" aria-labelledby="setting-password-title">
|
||||
<button class="setting-password-pop__mask" type="button" data-setting-password-close aria-label="关闭修改密码弹窗"></button>
|
||||
<section class="setting-password-pop__panel">
|
||||
<button class="setting-password-pop__close" type="button" data-setting-password-close aria-label="关闭">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/close.svg" alt="关闭">
|
||||
</button>
|
||||
<header class="setting-password-pop__intro">
|
||||
<h2 id="setting-password-title">修改密码</h2>
|
||||
<p>验证当前密码后设置新的登录密码</p>
|
||||
</header>
|
||||
<form class="setting-password-pop__form" data-setting-password-form novalidate>
|
||||
<label class="setting-field"><span>当前密码</span><input name="oldPassword" type="password" minlength="4" maxlength="16" autocomplete="current-password" placeholder="请输入当前密码" required></label>
|
||||
<label class="setting-field"><span>新密码</span><input name="newPassword" type="password" minlength="4" maxlength="16" autocomplete="new-password" placeholder="请输入 4–16 位新密码" required></label>
|
||||
<label class="setting-field"><span>确认新密码</span><input name="confirmPassword" type="password" minlength="4" maxlength="16" autocomplete="new-password" placeholder="请再次输入新密码" required></label>
|
||||
<p class="setting-password-pop__status" role="status" aria-live="polite" data-setting-password-status></p>
|
||||
<button class="setting-actions__save setting-password-pop__submit" type="submit" data-setting-password-submit>确认修改</button>
|
||||
</form>
|
||||
</section>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="setting-login-state"><h2>账号资料暂时无法加载</h2><p>请登录后重试。</p><a href="/login">去登录</a></div>
|
||||
{{end}}
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script src="/static/js/setting.js?v=5" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,99 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/tags.css">
|
||||
</head>
|
||||
<body class="page-list page-tags">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">{{if .tagName}}{{.tagName}}{{else}}标签{{end}}</div>
|
||||
<a class="page-subheader__btn" href="/search-mobile" aria-label="搜索">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" 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/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<a class="breadcrumb__item" href="/list">短剧</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<span class="breadcrumb__item is-current">{{if .tagName}}{{.tagName}}{{else}}标签{{end}}</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">{{if .tagName}}{{.tagName}}{{else}}标签短剧{{end}}</h1>
|
||||
<p class="list-hero__desc">{{if .heroDesc}}{{.heroDesc}}{{else if .seoInfo.Description}}{{.seoInfo.Description}}{{end}}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-filters" aria-label="筛选">
|
||||
{{if .relatedTags}}
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">相关</span>
|
||||
<div class="filter-row__options">
|
||||
{{range .relatedTags}}
|
||||
<a class="filter-chip" href="{{tagPageURL .Slug .ID 1 1}}">{{.Name}}</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label only-pc">排序</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if eq .sortType 1}} is-active{{end}}" href="{{tagPageURL .tagSlug .tagId 1 1}}">最新</a>
|
||||
<a class="filter-chip{{if eq .sortType 2}} is-active{{end}}" href="{{tagPageURL .tagSlug .tagId 2 1}}">最热</a>
|
||||
<a class="filter-chip{{if eq .sortType 3}} is-active{{end}}" href="{{tagPageURL .tagSlug .tagId 3 1}}">收藏最多</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="标签作品">
|
||||
<h2 class="visually-hidden">{{if .tagName}}{{.tagName}}{{else}}标签短剧{{end}}作品列表</h2>
|
||||
<p class="list-count">{{.listCount}}</p>
|
||||
{{if .list}}
|
||||
<div class="grid--list">
|
||||
{{range .list}}
|
||||
<article class="card card--list">
|
||||
<a class="card__cover lazy" href="{{playURL .Slug .ID}}" style="{{cssCoverPlaceholder}}" data-src="{{.Cover}}">
|
||||
{{if eq .UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if .TotalEpisode}}
|
||||
<span class="card__ep">全 {{.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText .UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if .IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq .Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL .Slug .ID}}">{{if .PlayName}}{{.PlayName}}{{else}}{{.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags .}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无作品</p>
|
||||
{{end}}
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/legal.css?v=5">
|
||||
</head>
|
||||
<body class="legal-page terms-page">
|
||||
{{template "header" .}}
|
||||
<header class="page-subheader only-h5" aria-label="用户条款页顶栏">
|
||||
<a class="page-subheader__btn" href="/" aria-label="返回首页"><img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回"></a>
|
||||
<span class="page-subheader__title">用户条款</span>
|
||||
<span class="page-subheader__btn" aria-hidden="true"></span>
|
||||
</header>
|
||||
|
||||
<main class="legal-main">
|
||||
<div class="legal-hero">
|
||||
<p class="legal-kicker"><span class="legal-kicker__bar" aria-hidden="true"></span>用户条款</p>
|
||||
<h1 class="legal-title">黄果短剧用户服务条款</h1>
|
||||
<p class="legal-dates">生效日期 2026 年 9 月 1 日 最近更新 2026 年 9 月 1 日</p>
|
||||
</div>
|
||||
<div class="legal-layout">
|
||||
<nav class="legal-toc" aria-label="用户条款目录">
|
||||
<span class="legal-toc__label">目录</span>
|
||||
<div class="legal-toc__list">
|
||||
<a class="legal-toc__item is-active" href="#terms-1"><span class="legal-toc__number">01</span><span>服务说明</span></a>
|
||||
<a class="legal-toc__item" href="#terms-2"><span class="legal-toc__number">02</span><span>账号注册与安全</span></a>
|
||||
<a class="legal-toc__item" href="#terms-3"><span class="legal-toc__number">03</span><span>内容与知识产权</span></a>
|
||||
<a class="legal-toc__item" href="#terms-4"><span class="legal-toc__number">04</span><span>金币与支付</span></a>
|
||||
<a class="legal-toc__item" href="#terms-5"><span class="legal-toc__number">05</span><span>用户行为规范</span></a>
|
||||
<a class="legal-toc__item" href="#terms-6"><span class="legal-toc__number">06</span><span>未成年人保护</span></a>
|
||||
<a class="legal-toc__item" href="#terms-7"><span class="legal-toc__number">07</span><span>免责声明</span></a>
|
||||
<a class="legal-toc__item" href="#terms-8"><span class="legal-toc__number">08</span><span>条款变更与联系方式</span></a>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="legal-content">
|
||||
<p class="legal-intro">请您在使用黄果短剧网页版与 App 前仔细阅读本用户条款。使用即表示您已年满 18 岁并同意本用户条款的全部内容。以下为示意文本,正式内容以法务提供版本为准。</p>
|
||||
<section class="legal-section" id="terms-1">
|
||||
<h2 class="legal-section__title">1. 服务说明</h2>
|
||||
<p class="legal-section__paragraph">1.1 本节说明黄果短剧在「服务说明」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">1.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-2">
|
||||
<h2 class="legal-section__title">2. 账号注册与安全</h2>
|
||||
<p class="legal-section__paragraph">2.1 本节说明黄果短剧在「账号注册与安全」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">2.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-3">
|
||||
<h2 class="legal-section__title">3. 内容与知识产权</h2>
|
||||
<p class="legal-section__paragraph">3.1 本节说明黄果短剧在「内容与知识产权」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">3.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-4">
|
||||
<h2 class="legal-section__title">4. 金币与支付</h2>
|
||||
<p class="legal-section__paragraph">4.1 本节说明黄果短剧在「金币与支付」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">4.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-5">
|
||||
<h2 class="legal-section__title">5. 用户行为规范</h2>
|
||||
<p class="legal-section__paragraph">5.1 本节说明黄果短剧在「用户行为规范」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">5.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-6">
|
||||
<h2 class="legal-section__title">6. 未成年人保护</h2>
|
||||
<p class="legal-section__paragraph">6.1 本节说明黄果短剧在「未成年人保护」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">6.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-7">
|
||||
<h2 class="legal-section__title">7. 免责声明</h2>
|
||||
<p class="legal-section__paragraph">7.1 本节说明黄果短剧在「免责声明」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">7.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
<section class="legal-section" id="terms-8">
|
||||
<h2 class="legal-section__title">8. 条款变更与联系方式</h2>
|
||||
<p class="legal-section__paragraph">8.1 本节说明黄果短剧在「条款变更与联系方式」方面的规则与您的权利义务。我们会以清晰、可理解的方式向您说明相关内容,并在发生变更时通过站内公告或邮件通知您。</p>
|
||||
<p class="legal-section__paragraph">8.2 若您对本节内容有任何疑问,可通过页尾「联系我们」或 support@huangguo.com 与我们取得联系。</p>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
{{template "footer" .}}
|
||||
<script defer src="/static/js/pages/legal.js?v=5"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,82 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/topic.css?v=2">
|
||||
</head>
|
||||
<body class="page-list page-topic">
|
||||
{{template "header" .}}
|
||||
|
||||
<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/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" 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/images/placeholder.png?v=2" data-src="/static/images/search_h5.svg" alt="搜索">
|
||||
</a>
|
||||
</header>
|
||||
|
||||
<div class="page list-page">
|
||||
<main class="main">
|
||||
<section class="list-hero" aria-label="专题频道">
|
||||
<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">{{if .seoInfo.Description}}{{.seoInfo.Description}}{{else}}按口味打包的剧单,编辑每周更新{{end}}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-filters only-pc" aria-label="筛选">
|
||||
<div class="filter-row">
|
||||
<span class="filter-row__label">排序</span>
|
||||
<div class="filter-row__options">
|
||||
<a class="filter-chip{{if eq .sortType 1}} is-active{{end}}" href="{{topicListURL 1 1}}">最新</a>
|
||||
<a class="filter-chip{{if eq .sortType 2}} is-active{{end}}" href="{{topicListURL 2 1}}">最热</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="list-body" aria-label="专题列表">
|
||||
<h2 class="visually-hidden">专题列表</h2>
|
||||
{{if .list}}
|
||||
<div class="topic-grid--list">
|
||||
{{range .list}}
|
||||
<a class="topic-card" href="{{categoryURL .Slug .ID}}">
|
||||
<div class="topic-card__info">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
专题
|
||||
</p>
|
||||
<h3 class="topic-card__title">{{.Name}}</h3>
|
||||
{{if .Desc}}<p class="topic-card__desc">{{.Desc}}</p>{{end}}
|
||||
<p class="topic-card__count">{{if .PlayletCount}}{{.PlayletCount}} 部 持续更新{{else}}持续更新{{end}}</p>
|
||||
</div>
|
||||
<div class="topic-card__stack" aria-hidden="true">
|
||||
{{range topicCoverURLs .}}
|
||||
<img decoding="async" loading="lazy" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.}}" alt="专题封面">
|
||||
{{end}}
|
||||
</div>
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<p class="list-count">暂无专题</p>
|
||||
{{end}}
|
||||
|
||||
{{template "pagination" .}}
|
||||
</section>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,204 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{.metaTitle}}</title>
|
||||
{{template "seoCommon" .}}
|
||||
<link rel="stylesheet" href="/static/css/base.css">
|
||||
<link rel="stylesheet" href="/static/css/list.css?v=3">
|
||||
<link rel="stylesheet" href="/static/css/topic.css?v=2">
|
||||
<link rel="stylesheet" href="/static/css/topicDetail.css?v=2">
|
||||
</head>
|
||||
<body class="page-topic-detail">
|
||||
{{template "header" .}}
|
||||
|
||||
<section class="topic-detail-hero" aria-label="专题头图">
|
||||
<img decoding="async" loading="lazy" class="topic-detail-hero__bg lazy" src="/static/images/placeholder.png?v=2"{{if .heroCover}} data-src="{{.heroCover}}"{{end}} alt="{{if .name}}{{.name}}{{else}}专题{{end}}背景">
|
||||
<div class="topic-detail-hero__mask" aria-hidden="true"></div>
|
||||
|
||||
<header class="page-subheader page-subheader--overlay only-h5" aria-label="专题详情顶栏">
|
||||
<a class="page-subheader__btn" href="javascript:history.back()" aria-label="返回">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-left.svg" alt="返回">
|
||||
</a>
|
||||
<div class="page-subheader__title">专题</div>
|
||||
<button class="page-subheader__btn" type="button" aria-label="分享" data-share-page>
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/share.svg" alt="分享">
|
||||
</button>
|
||||
</header>
|
||||
|
||||
<div class="page topic-detail-hero__inner">
|
||||
<div class="topic-detail-hero__content">
|
||||
<nav class="breadcrumb only-pc" aria-label="面包屑">
|
||||
<a class="breadcrumb__item" href="/">首页</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<a class="breadcrumb__item" href="{{topicListURL 1 1}}">专题</a>
|
||||
<img decoding="async" loading="lazy" class="breadcrumb__sep" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
<span class="breadcrumb__item is-current">{{if .name}}{{.name}}{{else}}专题{{end}}</span>
|
||||
</nav>
|
||||
<p class="eyebrow only-h5">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
专题
|
||||
</p>
|
||||
<h1 class="topic-detail-hero__title">{{if .name}}{{.name}}{{else}}专题剧单{{end}}</h1>
|
||||
{{if or .desc .seoInfo.Description}}
|
||||
<p class="topic-detail-hero__desc">{{if .desc}}{{.desc}}{{else}}{{.seoInfo.Description}}{{end}}</p>
|
||||
{{end}}
|
||||
<p class="topic-detail-hero__meta only-pc">{{if .playletCount}}{{.playletCount}} 部作品{{else if .totalCount}}{{.totalCount}} 部作品{{else}}专题作品{{end}} 持续更新</p>
|
||||
<p class="topic-detail-hero__meta only-h5">{{if .playletCount}}{{.playletCount}} 部{{else if .totalCount}}{{.totalCount}} 部{{else}}0 部{{end}} 持续更新</p>
|
||||
<div class="topic-detail-hero__actions">
|
||||
{{if .list}}
|
||||
{{$first := index .list 0}}
|
||||
<a class="btn btn--primary btn--lg topic-detail-hero__play" href="{{playURL $first.Slug $first.ID}}">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
从第 1 部开始看
|
||||
</a>
|
||||
{{else}}
|
||||
<a class="btn btn--primary btn--lg topic-detail-hero__play" href="{{topicListURL 1 1}}">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/play_hollow.svg" alt="播放">
|
||||
浏览专题
|
||||
</a>
|
||||
{{end}}
|
||||
<!--<button class="btn btn--ghost btn--lg topic-detail-hero__collect only-pc" type="button">
|
||||
<img decoding="async" loading="lazy" class="icon" src="/static/images/placeholder.png?v=2" data-src="/static/images/bookmark.svg" alt="收藏">
|
||||
收藏专题
|
||||
</button>-->
|
||||
</div>
|
||||
</div>
|
||||
{{if .covers}}
|
||||
<div class="topic-detail-hero__stack" aria-hidden="true">
|
||||
{{range .covers}}
|
||||
<img decoding="async" loading="lazy" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.}}" alt="{{if $.name}}{{$.name}}{{else}}专题{{end}}封面">
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="page">
|
||||
<main class="main">
|
||||
<section class="topic-detail-section" aria-label="专题作品">
|
||||
<div class="topic-detail-section__head">
|
||||
<div class="topic-detail-section__left">
|
||||
<h2 class="topic-detail-section__title">专题作品</h2>
|
||||
<span class="topic-detail-section__count">{{if .playletCount}}{{.playletCount}} 部{{else if .totalCount}}{{.totalCount}} 部{{else}}0 部{{end}}</span>
|
||||
<nav class="topic-detail-sort only-pc" aria-label="排序">
|
||||
<a class="topic-detail-sort__item{{if eq .sortType 1}} is-active{{end}}" href="{{topicDetailURL .slug .topicId 1 1}}">编辑排序</a>
|
||||
<a class="topic-detail-sort__item{{if eq .sortType 2}} is-active{{end}}" href="{{topicDetailURL .slug .topicId 2 1}}">最新</a>
|
||||
<a class="topic-detail-sort__item{{if eq .sortType 3}} is-active{{end}}" href="{{topicDetailURL .slug .topicId 3 1}}">最热</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="topic-detail-sort-dropdown only-h5" data-sort-dropdown>
|
||||
<button class="topic-detail-sort-link" type="button" aria-expanded="false" aria-haspopup="listbox" data-sort-dropdown-toggle>
|
||||
{{if .sortLabel}}{{.sortLabel}}{{else}}编辑排序{{end}}
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm topic-detail-sort-link__caret" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="">
|
||||
</button>
|
||||
<div class="topic-detail-sort-menu" role="listbox" hidden data-sort-dropdown-menu>
|
||||
<a class="topic-detail-sort-menu__item{{if eq .sortType 1}} is-active{{end}}" href="{{topicDetailURL .slug .topicId 1 1}}" role="option"{{if eq .sortType 1}} aria-selected="true"{{end}}>编辑排序</a>
|
||||
<a class="topic-detail-sort-menu__item{{if eq .sortType 2}} is-active{{end}}" href="{{topicDetailURL .slug .topicId 2 1}}" role="option"{{if eq .sortType 2}} aria-selected="true"{{end}}>最新</a>
|
||||
<a class="topic-detail-sort-menu__item{{if eq .sortType 3}} is-active{{end}}" href="{{topicDetailURL .slug .topicId 3 1}}" role="option"{{if eq .sortType 3}} aria-selected="true"{{end}}>最热</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{{if .list}}
|
||||
<div class="grid--list">
|
||||
{{range .list}}
|
||||
<article class="card card--list">
|
||||
<a class="card__cover lazy" href="{{playURL .Slug .ID}}" style="{{cssCoverPlaceholder}}" data-src="{{.Cover}}">
|
||||
{{if eq .UpdateStatus 1}}
|
||||
<span class="card__ep">连载中</span>
|
||||
{{else if .TotalEpisode}}
|
||||
<span class="card__ep">全 {{.TotalEpisode}} 集</span>
|
||||
{{else}}
|
||||
<span class="card__ep">{{updateStatusText .UpdateStatus}}</span>
|
||||
{{end}}
|
||||
{{if .IsFeatured}}<span class="badge badge--hot">爆剧</span>{{else if eq .Anchor "原创"}}<span class="badge badge--original">原创</span>{{end}}
|
||||
</a>
|
||||
<h3 class="card__title"><a href="{{playURL .Slug .ID}}">{{if .PlayName}}{{.PlayName}}{{else}}{{.Title}}{{end}}</a></h3>
|
||||
<p class="card__meta">{{range $ti, $tag := cardTags .}}{{if $ti}} {{end}}{{if $tag.URL}}<a href="{{$tag.URL}}" {{externalLinkAttrs $tag.URL}}>{{$tag.Name}}</a>{{else}}{{$tag.Name}}{{end}}{{end}}</p>
|
||||
</article>
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "pagination" .}}
|
||||
{{else}}
|
||||
<p class="list-count">暂无作品</p>
|
||||
{{end}}
|
||||
</section>
|
||||
|
||||
{{if .moreTopics}}
|
||||
<section class="topic-detail-section topic-detail-section--more" aria-label="更多专题">
|
||||
<div class="topic-detail-section__head topic-detail-section__head--padded">
|
||||
<div class="topic-detail-section__left">
|
||||
<h2 class="topic-detail-section__title">更多专题</h2>
|
||||
</div>
|
||||
<a class="block__more" href="{{topicListURL 1 1}}">
|
||||
全部专题
|
||||
<img decoding="async" loading="lazy" class="icon icon--sm" src="/static/images/placeholder.png?v=2" data-src="/static/images/chevron-right.svg" alt="前往下一项">
|
||||
</a>
|
||||
</div>
|
||||
<div class="topic-grid--list topic-grid--more">
|
||||
{{range .moreTopics}}
|
||||
<a class="topic-card" href="{{categoryURL .Slug .ID}}">
|
||||
<div class="topic-card__info">
|
||||
<p class="eyebrow">
|
||||
<span class="eyebrow__bar" aria-hidden="true"></span>
|
||||
专题
|
||||
</p>
|
||||
<h3 class="topic-card__title">{{.Name}}</h3>
|
||||
{{if .Desc}}<p class="topic-card__desc">{{.Desc}}</p>{{end}}
|
||||
<p class="topic-card__count">{{if .PlayletCount}}{{.PlayletCount}} 部 持续更新{{else}}持续更新{{end}}</p>
|
||||
</div>
|
||||
<div class="topic-card__stack" aria-hidden="true">
|
||||
{{range topicCoverURLs .}}
|
||||
<img decoding="async" loading="lazy" class="lazy" src="/static/images/placeholder.png?v=2" data-src="{{.}}" alt="专题封面">
|
||||
{{end}}
|
||||
</div>
|
||||
</a>
|
||||
{{end}}
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
</main>
|
||||
</div>
|
||||
|
||||
{{template "footer" .}}
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
var bar = document.querySelector(".page-topic-detail .page-subheader--overlay");
|
||||
if (bar) {
|
||||
var onScroll = function () {
|
||||
bar.classList.toggle("is-scrolled", window.scrollY > 8);
|
||||
};
|
||||
onScroll();
|
||||
window.addEventListener("scroll", onScroll, { passive: true });
|
||||
}
|
||||
|
||||
var dropdown = document.querySelector("[data-sort-dropdown]");
|
||||
if (!dropdown) return;
|
||||
var toggle = dropdown.querySelector("[data-sort-dropdown-toggle]");
|
||||
var menu = dropdown.querySelector("[data-sort-dropdown-menu]");
|
||||
if (!toggle || !menu) return;
|
||||
|
||||
function setOpen(open) {
|
||||
dropdown.classList.toggle("is-open", open);
|
||||
menu.hidden = !open;
|
||||
toggle.setAttribute("aria-expanded", open ? "true" : "false");
|
||||
}
|
||||
|
||||
toggle.addEventListener("click", function (event) {
|
||||
event.stopPropagation();
|
||||
setOpen(menu.hidden);
|
||||
});
|
||||
|
||||
document.addEventListener("click", function (event) {
|
||||
if (!dropdown.contains(event.target)) setOpen(false);
|
||||
});
|
||||
|
||||
document.addEventListener("keydown", function (event) {
|
||||
if (event.key === "Escape") setOpen(false);
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user