- 人机验证抽成 human.js 模块,改成 Cloudflare Turnstile 风格的「点一下验证」, 控件移到「评论一下」发送按钮左侧(不再用图形验证码那一套) - 留言页 / 文章页两段内联脚本(友链弹窗、人机验证)抽成模块随 page-only.js 加载。 原先内联 <script> 写在 #pjax-container 外,PJAX 只换容器内容不重新执行它, 从首页 PJAX 进留言页会出现「申请友链卡片点了没反应」「没有人机验证控件」 - 友链申请弹窗 #flApplyBox 隐藏滚动条(内容仍可滚,避开细滚动条 + 毛玻璃的割裂感) - 内容分割线抽成 partial divider.html,hugo.toml [params.divider] 可切 icon(原生 uk-divider-icon)/ image(本地图片),当前用 icon - 投票契约修复(后端 blog-admin):Artalk 客户端把方向编在 target_name 后缀 (comment_up / comment_down / page_up / page_down)、路径只有两段, 而原先只注册了三段 :choice 路由 → 点赞/踩一路 404、界面点了没反应。 补 POST /votes/:target_name/:target_id,新增 parseVoteTarget() 同时兼容两套契约 (名字里与路径里方向矛盾时判非法,不静默取其一),错误文案改用实体名 - 无身份点赞不再静默失败:artalk.js 加 __atkVoteGuard, 未填昵称/邮箱时拦截并提示「填写昵称和邮箱后才能点赞」, 同时把光标送到昵称框(多个同名输入框逐个试,以 focus 真生效为判据)
186 lines
7.5 KiB
HTML
186 lines
7.5 KiB
HTML
<div class="footer">
|
||
<nav class="nav" style="clear: both;">
|
||
© 2019 - {{ now.Year }}
|
||
<br>
|
||
<a href="https://beian.miit.gov.cn/" target="_blank"><span style="color:#999999;">鄂ICP备2022015735号-1</span></a>
|
||
<br>
|
||
本站由<a href="https://www.upyun.com/?utm_source=lianmeng&utm_medium=referral" target="blank" title="又拍云"
|
||
style="display:inline-block;text-decoration:none;height:20px;line-height:20px;">
|
||
<span style="color: var(--contentColor);font-weight: 700;">又拍云CDN</span>
|
||
</a>提供CDN加速服务
|
||
<br>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="floating-tools">
|
||
<a href="javascript:;" id="search-btn" title="搜索文章">
|
||
<i class="ri-search-line"></i>
|
||
</a>
|
||
<a href="javascript:;" id="theme-toggle" title="切换主题">
|
||
<i class="ri-sun-line"></i>
|
||
</a>
|
||
<a href="#Comments" id="to-comments" title="跳转评论">
|
||
<i class="ri-chat-2-line"></i>
|
||
</a>
|
||
<a href="#" id="back-to-top" title="返回顶部">
|
||
<i class="ri-arrow-up-line"></i>
|
||
</a>
|
||
</div>
|
||
|
||
<!-- Search Modal -->
|
||
<div id="search-modal" class="search-modal">
|
||
<div class="search-modal-content">
|
||
<div class="search-header">
|
||
<h3>搜索文章</h3>
|
||
<span class="close-search">×</span>
|
||
</div>
|
||
<div class="search-body">
|
||
<div class="search-input-wrapper">
|
||
<input type="text" id="search-input" placeholder="输入关键词搜索..." autocomplete="off">
|
||
<button id="search-submit"><i class="ri-search-line"></i></button>
|
||
</div>
|
||
<div id="search-results" class="search-results">
|
||
<!-- Search results will appear here -->
|
||
<p class="search-tip">输入关键词并回车进行搜索</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{{/* ====== 优化后的JS加载策略(方案1:保守优化) ====== */}}
|
||
|
||
{{/* ====== 1. 核心JS Bundle - 始终加载 ====== */}}
|
||
{{ $iconfont := resources.Get "js/libs/iconfont.js" }}
|
||
{{ $uikit := resources.Get "js/libs/uikit.min.js" }}
|
||
{{ $viewimage := resources.Get "js/libs/view-image.min.js" }}
|
||
{{/* Message.js(Qmsg)+ Toast 适配层放在 utils 之前,保证任何 toast 调用点执行时组件已就绪 */}}
|
||
{{ $message := resources.Get "js/libs/message.min.js" }}
|
||
{{ $toast := resources.Get "js/modules/toast.js" }}
|
||
{{ $utils := resources.Get "js/modules/utils.js" }}
|
||
{{ $loader := resources.Get "js/modules/loader.js" }}
|
||
{{ $cache := resources.Get "js/modules/cache.js" }}
|
||
{{ $search := resources.Get "js/modules/search.js" }}
|
||
{{ $floatingTools := resources.Get "js/modules/floating-tools.js" }}
|
||
{{ $nprogress := resources.Get "js/libs/nprogress.js" }}
|
||
{{ $pjaxLib := resources.Get "js/libs/pjax.js" }}
|
||
{{ $mypjax := resources.Get "js/modules/mypjax.js" }}
|
||
{{ $pangu := resources.Get "js/modules/pangu.js" }}
|
||
{{ $linkify := resources.Get "js/modules/linkify.js" }}
|
||
{{ $shortcodesJs := resources.Get "js/shortcodes.js" }}
|
||
{{ $lazyload := resources.Get "js/modules/lazyload.js" }}
|
||
{{ $main := resources.Get "js/main.js" }}
|
||
|
||
{{ $coreScripts := slice $iconfont $uikit $viewimage $message $toast $utils $loader $cache $search $floatingTools $nprogress $pjaxLib $mypjax $pangu $linkify $shortcodesJs $lazyload $main | resources.Concat "js/core.js" | resources.Minify | resources.Fingerprint }}
|
||
|
||
<script defer src="{{ $coreScripts.RelPermalink }}"></script>
|
||
|
||
{{/* ====== 2. 配置变量 ====== */}}
|
||
<script>
|
||
window.enableInfiniteScroll = {{ .Site.Params.infiniteScroll.enable | default false }};
|
||
</script>
|
||
|
||
{{/* ====== 3. 远程数据获取 - 构建时 ====== */}}
|
||
{{/* Fetch friend data at build time — no runtime network requests */}}
|
||
{{ $linkHosts := slice }}
|
||
{{ $linkNames := slice }}
|
||
{{ with resources.GetRemote (printf "%s/api/links?all=1" (site.Params.rssapi.base | default "https://api.200181.xyz")) }}
|
||
{{ with .Err }}
|
||
{{ warnf "Links API fetch failed: %s" . }}
|
||
{{ else }}
|
||
{{ with .Content | transform.Unmarshal }}
|
||
{{ range .links }}
|
||
{{ $host := "" }}
|
||
{{ with .url | urls.Parse }}
|
||
{{ $host = .Host | strings.TrimPrefix "www." }}
|
||
{{ end }}
|
||
{{ $title := .name | default "" }}
|
||
{{ if $host }}
|
||
{{ $linkHosts = $linkHosts | append (dict "host" $host "title" $title) }}
|
||
{{ end }}
|
||
{{ if $title }}
|
||
{{ $linkNames = $linkNames | append (dict "lower" (lower $title) "title" $title) }}
|
||
{{ end }}
|
||
{{ end }}
|
||
{{ end }}
|
||
{{ end }}
|
||
{{ end }}
|
||
<script>
|
||
window.friendLinks = {{ dict "hosts" $linkHosts "names" $linkNames | jsonify | safeJS }};
|
||
</script>
|
||
|
||
{{ $feedHosts := slice }}
|
||
{{ $feedNames := slice }}
|
||
{{ with resources.GetRemote (printf "%s/api/feeds" (site.Params.rssapi.base | default "https://api.200181.xyz")) }}
|
||
{{ with .Err }}
|
||
{{ warnf "Feeds API fetch failed: %s" . }}
|
||
{{ else }}
|
||
{{ with .Content | transform.Unmarshal }}
|
||
{{ range .feeds }}
|
||
{{ $host := "" }}
|
||
{{ with .url | urls.Parse }}
|
||
{{ $host = .Host | strings.TrimPrefix "www." }}
|
||
{{ end }}
|
||
{{ $title := .feedTitle | default "" }}
|
||
{{ if $host }}
|
||
{{ $feedHosts = $feedHosts | append (dict "host" $host "title" $title) }}
|
||
{{ end }}
|
||
{{ if $title }}
|
||
{{ $feedNames = $feedNames | append (dict "lower" (lower $title) "title" $title) }}
|
||
{{ end }}
|
||
{{ end }}
|
||
{{ end }}
|
||
{{ end }}
|
||
{{ end }}
|
||
<script>
|
||
window.friendFeeds = {{ dict "hosts" $feedHosts "names" $feedNames | jsonify | safeJS }};
|
||
</script>
|
||
|
||
{{/* ====== 4. 页面特定JS - 按需加载 ====== */}}
|
||
|
||
{{/* 文章详情页专用JS */}}
|
||
{{ if .IsPage }}
|
||
{{/* 友链申请弹窗放最前:artalk.js 渲染申请卡片时会调 window.flApplyOpenModal */}}
|
||
{{ $friendlink := resources.Get "js/modules/friendlink.js" }}
|
||
{{ $artalkModule := resources.Get "js/modules/artalk.js" }}
|
||
{{/* 人机验证控件(Turnstile 风格),文章页与留言页共用 */}}
|
||
{{ $human := resources.Get "js/modules/human.js" }}
|
||
{{ $paragraphComments := resources.Get "js/modules/paragraph-comments.js" }}
|
||
{{ $reward := resources.Get "js/modules/reward.js" }}
|
||
|
||
{{ $pageScripts := slice $friendlink $artalkModule $human $paragraphComments $reward | resources.Concat "js/page-only.js" | resources.Minify | resources.Fingerprint }}
|
||
|
||
<script defer src="{{ $pageScripts.RelPermalink }}"></script>
|
||
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
|
||
{{ else }}
|
||
{{/* 非文章页面:仍然计算URL,但不加载,用于PJAX动态加载 */}}
|
||
{{ $friendlink := resources.Get "js/modules/friendlink.js" }}
|
||
{{ $artalkModule := resources.Get "js/modules/artalk.js" }}
|
||
{{/* 人机验证控件(Turnstile 风格),文章页与留言页共用 */}}
|
||
{{ $human := resources.Get "js/modules/human.js" }}
|
||
{{ $paragraphComments := resources.Get "js/modules/paragraph-comments.js" }}
|
||
{{ $reward := resources.Get "js/modules/reward.js" }}
|
||
|
||
{{ $pageScripts := slice $friendlink $artalkModule $human $paragraphComments $reward | resources.Concat "js/page-only.js" | resources.Minify | resources.Fingerprint }}
|
||
|
||
<script>window._pageOnlyScriptUrl = '{{ $pageScripts.RelPermalink }}';</script>
|
||
{{ end }}
|
||
|
||
{{/* 首页专用JS */}}
|
||
{{ if .IsHome }}
|
||
{{ if .Site.Params.infiniteScroll.enable }}
|
||
{{ $infiniteScroll := resources.Get "js/modules/infinite-scroll.js" }}
|
||
<script defer src="{{ $infiniteScroll.RelPermalink }}"></script>
|
||
{{ end }}
|
||
{{ end }}
|
||
|
||
{{/* 特定页面专用JS */}}
|
||
{{ if or (eq .Type "links") (eq .Type "circles") }}
|
||
{{ $tiaozhuan := resources.Get "js/modules/tiaozhuan.js" }}
|
||
<script defer src="{{ $tiaozhuan.RelPermalink }}"></script>
|
||
{{ end }}
|
||
|
||
{{/* ====== 5. 第三方脚本 ====== */}}
|
||
<script async src="/js/bsz.js"></script>
|
||
</body>
|
||
|
||
</html> |