From 5fcbd2a7b68eeb4abfa5d31a465bcf6201b82bc8 Mon Sep 17 00:00:00 2001 From: QunLIn Date: Sat, 3 Oct 2026 12:13:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E4=BD=93=E5=88=87=E5=85=A8=E9=87=8F?= =?UTF-8?q?=E3=80=81=E8=AF=84=E8=AE=BA=E5=BE=BD=E7=AB=A0=E4=BC=98=E5=85=88?= =?UTF-8?q?=E7=BA=A7=E3=80=81=E5=8F=8B=E9=93=BE=E8=87=AA=E5=8A=A9=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E5=8D=A1=E7=89=87=E3=80=81=E5=8F=8B=E5=9C=88=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=E5=85=9C=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 字体:zql 从 subset(776K) 切换到全量(1.2MB woff2),subset 覆盖 不足导致大量字回退系统字体,视觉不一致;全量一次加载彻底解决 - 评论徽章统一 comment-rendered 注入,优先级互斥:友链 > 友圈 > 官职(后端 rank 字段),官方系统徽章(博主)独立显示 - 留言页新增友链自助申请入口卡片 + 弹窗表单(名称/链接/订阅/邮箱 必填),提交进 api.200181.xyz 待审队列,审核结果邮件通知申请人 - 友圈头像:favicon 抓取失败时兜底第三方 favicon 服务 --- themes/Ying/assets/css/font-slices.css | 8 +- themes/Ying/assets/js/modules/artalk.js | 128 +++++++++--------------- themes/Ying/layouts/page/comment.html | 86 ++++++++++++++++ themes/Ying/layouts/partials/head.html | 2 +- 4 files changed, 139 insertions(+), 85 deletions(-) diff --git a/themes/Ying/assets/css/font-slices.css b/themes/Ying/assets/css/font-slices.css index 3270e90d..e8c35d04 100644 --- a/themes/Ying/assets/css/font-slices.css +++ b/themes/Ying/assets/css/font-slices.css @@ -1,6 +1,8 @@ @font-face { font-family: 'zql'; - src: url('/font/zql-v2-subset.woff2') format('woff2'), - url('/font/zql-v2-subset.woff') format('woff'); + /* 2026-10-03 从 subset 切换到全量字体(1.2MB woff2):subset 覆盖不足, + 很多字回退系统字体导致视觉不一致。全量仅比子集大 ~460KB,一次加载永久解决。 */ + src: url('/font/zql-v2.woff2') format('woff2'), + url('/font/zql-v2.woff') format('woff'); font-display: swap; -} \ No newline at end of file +} diff --git a/themes/Ying/assets/js/modules/artalk.js b/themes/Ying/assets/js/modules/artalk.js index b8bcec43..f2d0627a 100644 --- a/themes/Ying/assets/js/modules/artalk.js +++ b/themes/Ying/assets/js/modules/artalk.js @@ -550,7 +550,6 @@ window.initArtalk = function() { setTimeout(saveConf, 5000); // ── Badge system: 友链 / 友圈 / 评论等级 ── -var badgesInjected = false; var normalizeHost = function(h) { return (h || '').replace(/^www\./, ''); @@ -621,108 +620,75 @@ var getPageKey = function() { return window.artalkConfig ? (window.artalkConfig.pageKey || window.location.pathname) : window.location.pathname; }; -var processBadges = function() { - if (!linkMap && !feedMap) return; - // 友链 / 友圈徽章:数据来自 window.friendLinks / window.friendFeeds - // (评论等级官职徽章已迁到 comment-rendered 处理,见下方) - document.querySelectorAll('.atk-comment-wrap').forEach(function(wrap) { - var nickEl = wrap.querySelector('.atk-nick'); - var avatarEl = wrap.querySelector('.atk-avatar'); - if (!nickEl) return; - - var nickText = (nickEl.textContent || '').trim(); - var nickLower = nickText.toLowerCase(); - var nickLink = nickEl.querySelector('a[href]'); - var commentHost = null; - if (nickLink) { - try { commentHost = normalizeHost(new URL(nickLink.getAttribute('href')).hostname); } catch(e) {} - } - - // 1. 友链 badge (green gradient) — from /api/links?all=1 - if (linkMap && !nickEl.querySelector('.atk-link-badge')) { - var linkMatch = null; - if (commentHost && linkMap.hosts.has(commentHost)) { - linkMatch = linkMap.hosts.get(commentHost); - } else if (linkMap.names.has(nickLower)) { - linkMatch = linkMap.names.get(nickLower); - } - if (linkMatch) { - var lb = document.createElement('span'); - lb.className = 'atk-link-badge'; - lb.textContent = '友链'; - lb.title = '友链: ' + linkMatch; - nickEl.appendChild(lb); - } - } - - // 2. 友圈 badge (gold gradient) — from /api/feeds - if (feedMap && !nickEl.querySelector('.atk-feed-badge')) { - var feedMatch = null; - if (commentHost && feedMap.hosts.has(commentHost)) { - feedMatch = feedMap.hosts.get(commentHost); - } else if (feedMap.names.has(nickLower)) { - feedMatch = feedMap.names.get(nickLower); - } - if (feedMatch) { - var fb = document.createElement('span'); - fb.className = 'atk-feed-badge'; - fb.textContent = '友圈'; - fb.title = '友圈: ' + feedMatch; - nickEl.appendChild(fb); - } - } - - // 3. 评论等级徽章已由后端下发(badge_name/badge_color 官方槽渲染),不再本地注入 - }); +// ── 评论区徽章统一注入(comment-rendered 每条触发)── +// 优先级:官方系统徽章(博主等,Artalk 自渲染)独立显示; +// 主题徽章互斥取最高一级:友链 > 友圈 > 评论官职。 +// 数据源:window.friendLinks/friendFeeds(友链、友圈)+ 后端 rank_* 字段(官职)。 +var ensureBadgeMaps = function() { + if (!linkMap && window.friendLinks) linkMap = buildMap(window.friendLinks); + if (!feedMap && window.friendFeeds) feedMap = buildMap(window.friendFeeds); + return !!(linkMap || feedMap); }; -var injectAllBadges = function() { - if (badgesInjected) return; - badgesInjected = true; +var matchBadge = function(map, host, nickLower) { + if (!map) return null; + if (host && map.hosts.has(host)) return map.hosts.get(host); + if (map.names.has(nickLower)) return map.names.get(nickLower); + return null; +}; - if (window.friendLinks) linkMap = buildMap(window.friendLinks); - if (window.friendFeeds) feedMap = buildMap(window.friendFeeds); - - if (linkMap || feedMap) { - processBadges(); - } +var injectBadge = function(nickEl, cls, text, title, color, bg) { + if (nickEl.querySelector('.' + cls)) return; + var b = document.createElement('span'); + b.className = cls; + b.textContent = text; + if (title) b.title = title; + if (color) b.style.color = color; + if (bg) b.style.backgroundColor = bg; + nickEl.appendChild(b); }; -// 评论等级官职徽章——后端按全站真实评论数计算,随评论 API 下发 -// rank_name/rank_title/rank_count/rank_color/rank_bg(不占用官方 badge 槽, -// 官方徽章如「博主」保留,官职徽章接在其后面)。配色沿用主题原版。 artalk.on('comment-rendered', function(node) { try { var data = null; if (node && typeof node.getData === 'function') data = node.getData(); else if (node && node.comment && typeof node.comment.getData === 'function') data = node.comment.getData(); else data = node; - if (!data || !data.rank_name) return; + if (!data) return; var el = null; if (node && node.$el) el = node.$el; else if (node && typeof node.getEl === 'function') el = node.getEl(); if (!el || !el.querySelector) return; var nickEl = el.querySelector('.atk-nick'); - if (!nickEl || nickEl.querySelector('.atk-rank-badge')) return; - var rb = document.createElement('span'); - rb.className = 'atk-rank-badge'; - rb.textContent = data.rank_name; - var tip = data.rank_title || data.rank_name; - if (data.rank_count != null) tip += ' (' + data.rank_count + '条评论)'; - rb.title = tip; - rb.style.color = data.rank_color || ''; - rb.style.backgroundColor = data.rank_bg || ''; - nickEl.appendChild(rb); + if (!nickEl) return; + + if (!ensureBadgeMaps()) return; + var nickLower = (data.nick || '').toLowerCase(); + var host = null; + try { if (data.link) host = normalizeHost(new URL(data.link).hostname); } catch (e) {} + + // 优先级:友链 > 友圈 > 官职(互斥,只注入一枚主题徽章) + var linkMatch = matchBadge(linkMap, host, nickLower); + if (linkMatch) { + injectBadge(nickEl, 'atk-link-badge', '友链', '友链: ' + linkMatch); + return; + } + var feedMatch = matchBadge(feedMap, host, nickLower); + if (feedMatch) { + injectBadge(nickEl, 'atk-feed-badge', '友圈', '友圈: ' + feedMatch); + return; + } + if (data.rank_name && !nickEl.querySelector('.atk-rank-badge')) { + var tip = data.rank_title || data.rank_name; + if (data.rank_count != null) tip += ' (' + data.rank_count + '条评论)'; + injectBadge(nickEl, 'atk-rank-badge', data.rank_name, tip, data.rank_color || '', data.rank_bg || ''); + } } catch (e) { /* 徽章注入失败不影响评论 */ } }); artalk.on('list-loaded', function() { - // Badge injection - badgesInjected = false; - setTimeout(injectAllBadges, 300); - // Add staggered animation to the comment list var list = document.querySelector('.atk-list'); if (list) { diff --git a/themes/Ying/layouts/page/comment.html b/themes/Ying/layouts/page/comment.html index 4ef1f1ba..cce99f28 100644 --- a/themes/Ying/layouts/page/comment.html +++ b/themes/Ying/layouts/page/comment.html @@ -11,6 +11,18 @@ - 图标:{{ .Site.Params.message_info.icon | default .Site.Params.author.avatar }} + + + {{ $rssBase := site.Params.rssapi.base | default "https://api.200181.xyz" }} + + + + 友链自助申请 + 想和我交换友链?点这里填写申请,审核结果会邮件通知你 + + +
@@ -19,4 +31,78 @@
+ + + + + {{ end }} diff --git a/themes/Ying/layouts/partials/head.html b/themes/Ying/layouts/partials/head.html index 81eb180c..d830db94 100644 --- a/themes/Ying/layouts/partials/head.html +++ b/themes/Ying/layouts/partials/head.html @@ -76,7 +76,7 @@ })(); - + {{ $echartsHead := resources.Get "js/libs/echarts.min.js" | resources.Fingerprint }}