<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Biko的个人小站</title>
  <icon>https://biko-duckyo.github.io/img/favicon.png</icon>
  <subtitle>瀚海无眠</subtitle>
  <link href="https://biko-duckyo.github.io/atom.xml" rel="self"/>
  
  <link href="https://biko-duckyo.github.io/"/>
  <updated>2026-10-10T16:00:00.000Z</updated>
  <id>https://biko-duckyo.github.io/</id>
  
  <author>
    <name>Biko</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>东南大学 · 境外参加国际会议办理清单</title>
    <link href="https://biko-duckyo.github.io/2026/10/11/%E4%B8%9C%E5%8D%97%E5%A4%A7%E5%AD%A6%E5%A2%83%E5%A4%96%E5%8F%82%E4%BC%9A%E5%8A%9E%E7%90%86%E6%B8%85%E5%8D%95/"/>
    <id>https://biko-duckyo.github.io/2026/10/11/%E4%B8%9C%E5%8D%97%E5%A4%A7%E5%AD%A6%E5%A2%83%E5%A4%96%E5%8F%82%E4%BC%9A%E5%8A%9E%E7%90%86%E6%B8%85%E5%8D%95/</id>
    <published>2026-10-11T04:00:00.000Z</published>
    <updated>2026-10-10T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文复刻整理自 <a href="https://chenqing-zhu.github.io/seu-travel/#before">东南大学 · 境外参会办理清单</a>（原始页面含内嵌 PDF 与时间限制图，建议对照阅读）。<strong>本页为个人整理的办事参考，最终以学校最新通知与办理部门答复为准。</strong></p></blockquote><h2 id="先记住这条顺序"><a href="#先记住这条顺序" class="headerlink" title="先记住这条顺序"></a>先记住这条顺序</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">确认资助 → 拿邀请函、定日期 → 研究生院资助审批 → 国际合作处出国境审批</span><br><span class="line">→ 签证与行前准备 → 参会 → 领两份原件 → 线上总结 → 研究生院签章 → 财务报销</span><br></pre></td></tr></table></figure><p>本页主线适用于<strong>申请研究生院资助</strong>的参会研究生。其他经费来源仍须办理因公出国境审批，资助与报销环节按相应项目要求执行。</p><blockquote><p>⚠️ <strong>务必在会前完成审批</strong>，提交申请后还要主动跟进到审批通过。</p></blockquote><p><strong>两种情况要分清：</strong></p><table><thead><tr><th>情况</th><th>需要办什么</th></tr></thead><tbody><tr><td><strong>正常出境参会</strong></td><td>会前完成研究生院资助资格审批 + 国际合作处审批，确保出境前已获学校批准。按补充办理口径，系统限制会后补办</td></tr><tr><td><strong>最终未出境</strong>（签证被卡&#x2F;被拒&#x2F;行程取消）</td><td>仅申请签证费报销时<strong>无需</strong>办理国际合作处审批，但<strong>研究生院资助资格审批仍须在开会日期之前完成</strong>，否则无法报销</td></tr></tbody></table><hr><h2 id="三个系统，分别申请"><a href="#三个系统，分别申请" class="headerlink" title="三个系统，分别申请"></a>三个系统，分别申请</h2><table><thead><tr><th>系统</th><th>办理事项</th><th>何时完成</th></tr></thead><tbody><tr><td><strong>研究生院</strong></td><td>资助资格审批</td><td>开会日期之前审批通过</td></tr><tr><td><strong>国际合作处</strong></td><td>因公出国（境）审批</td><td>会前完成，且出境前获批</td></tr><tr><td><strong>财务处</strong></td><td>报销申请与财务审批</td><td>报销材料备齐后单独申请</td></tr></tbody></table><blockquote><p>三套系统<strong>独立运行</strong>，学生须分别发起申请；一套系统审批通过不会代替另外两套。未出境仅报签证费的情况，按下方专门流程办理。</p></blockquote><hr><h1 id="PHASE-01-出发前-·-会前完成资助与出访审批"><a href="#PHASE-01-出发前-·-会前完成资助与出访审批" class="headerlink" title="PHASE 01 &#x2F; 出发前 · 会前完成资助与出访审批"></a>PHASE 01 &#x2F; 出发前 · 会前完成资助与出访审批</h1><h2 id="01-收到录用通知后-·-申请研究生院资助者"><a href="#01-收到录用通知后-·-申请研究生院资助者" class="headerlink" title="01 收到录用通知后 · 申请研究生院资助者"></a>01 收到录用通知后 · 申请研究生院资助者</h2><h3 id="确认自己能申请什么资助"><a href="#确认自己能申请什么资助" class="headerlink" title="确认自己能申请什么资助"></a>确认自己能申请什么资助</h3><p><strong>身份要求：</strong> 东大全日制研究生，申请时处于中国境内学习阶段；通知要求政治素质好、成绩优秀、科研能力强。</p><p><strong>论文要求：</strong></p><ul><li>论文已被境外本学科有重要影响的会议录用；</li><li>你是<strong>第一作者</strong>，或你是<strong>第二作者且第一作者为导师</strong>；</li><li>第一署名单位、通讯作者单位<strong>均须为东南大学</strong>。</li></ul><p><strong>会议认定：</strong> 在资助系统查会议是否属于本学科顶会。<strong>顶会的 workshop 按非顶会处理。</strong></p><p><strong>评审流程：</strong> 经导师、院系审核后，由研究生院择优资助。</p><h4 id="资助金额与可报费用"><a href="#资助金额与可报费用" class="headerlink" title="资助金额与可报费用"></a>资助金额与可报费用</h4><p>顶会可资助往返国际机票经济舱、注册费、住宿费；住宿执行学校财务出国标准。<strong>在上限内据实报销，超出部分受上限限制。</strong></p><table><thead><tr><th>会议所在地</th><th>应邀在大会 &#x2F; 分会上宣读</th><th>论文录用（含 poster）</th></tr></thead><tbody><tr><td>欧美、澳洲、非洲</td><td>25,000 元</td><td>15,000 元</td></tr><tr><td>亚洲</td><td>15,000 元</td><td>10,000 元</td></tr><tr><td>港澳台</td><td>8,000 元</td><td>5,000 元</td></tr></tbody></table><ul><li>原研究生院通知列明<strong>非顶会仅资助注册费</strong>；本次补充的签证费报销规则见下述说明。</li><li>顶会与非顶会均<strong>不限参会人数、次数</strong>；顶会目录按各一级学科认定（原则上每学科不超过 5 个）。</li><li>具体资助类别以审核为准。</li></ul><p><strong>签证费：</strong> 按补充办理口径可报销，<strong>含拒签产生的签证费</strong>；提交签证付费凭证及对应网页截图，报销总额不得超过获批资助上限。签证费计入原资助额度。</p><blockquote><p>📎 依据：研究生院通知</p></blockquote><ul><li><input disabled="" type="checkbox"> 已核对作者、单位、会议类别与经费来源</li></ul><h2 id="02-提交任何申请前"><a href="#02-提交任何申请前" class="headerlink" title="02 提交任何申请前"></a>02 提交任何申请前</h2><h3 id="拿到正式邀请函，核对出入境日期"><a href="#拿到正式邀请函，核对出入境日期" class="headerlink" title="拿到正式邀请函，核对出入境日期"></a>拿到正式邀请函，核对出入境日期</h3><ul><li>向会议主办方索取邀请函，必须写明<strong>你的姓名、邀请起止日期</strong>。另备录用通知；<strong>录用邮件不能代替邀请函</strong>。</li><li>通常最多在邀请日期前、后各加 1 天；赴日本按邀请函的滞在日程表填报。</li><li><strong>境外参加一个国际会议不能超过 7 天</strong>（基本要求的配图及细则 PDF 均有标注）。有特殊或组合行程，填报前向国际合作处确认。</li><li>系统填的是<strong>离开中国、进入中国的日期</strong>。核对返程跨时区和航班到达时间。</li></ul><p><strong>例如：</strong> 批件为 10 月 1—7 日，就应 10 月 1 日出中国境、10 月 7 日入中国境，共 7 天。</p><p><strong>其他出访类型的时间标注：</strong> 图中短期学习为 90 天以内（含 90 天），长期学习为 90 天以上；其他类型的上限未在图中写明。本清单按参会流程编排。</p><blockquote><p>📎 依据：基本要求及配图 · 细则 PDF 第 1 页</p></blockquote><ul><li><input disabled="" type="checkbox"> 已取得邀请函并核对中国出入境日期</li></ul><h2 id="03-开会之前完成-·-申请研究生院资助者"><a href="#03-开会之前完成-·-申请研究生院资助者" class="headerlink" title="03 开会之前完成 · 申请研究生院资助者"></a>03 开会之前完成 · 申请研究生院资助者</h2><h3 id="先完成研究生院的资助资格审批"><a href="#先完成研究生院的资助资格审批" class="headerlink" title="先完成研究生院的资助资格审批"></a>先完成研究生院的资助资格审批</h3><p><strong>入口：</strong> 综合服务大厅 → 研究生国际交流 → 境外参加国际会议（顶会 &#x2F; 非顶会）</p><ol><li>按会议类别选入口，准备邀请函等附件；完整附件清单以系统要求为准。</li><li>经费来源选 <strong>「研究生院资助」</strong>，提交并跟进导师、院系及研究生院审核。</li><li><strong>务必在开会日期之前完成申请并审批通过；会后无法补办。</strong></li><li>即使最终因签证被卡、被拒或其他原因未出境，报销签证费也必须满足这个节点。获得资助资格后继续办理下一步出国境批件。</li></ol><blockquote><p>📎 依据：研究生院通知。登录系统内的附件清单未在公开页面完整列出。</p></blockquote><ul><li><input disabled="" type="checkbox"> 资助审批已通过（其他经费来源可标记不适用）</li></ul><h2 id="04-出境前-·-所有因公出国境学生"><a href="#04-出境前-·-所有因公出国境学生" class="headerlink" title="04 出境前 · 所有因公出国境学生"></a>04 出境前 · 所有因公出国境学生</h2><h3 id="再提交国际合作处申请，主动跟进审批"><a href="#再提交国际合作处申请，主动跟进审批" class="headerlink" title="再提交国际合作处申请，主动跟进审批"></a>再提交国际合作处申请，主动跟进审批</h3><p><strong>入口：</strong> 信息服务门户 → 国际合作处 → 学生因公出国（境）；也可从出国境申报系统进入；入口异常时走信息门户。</p><ol><li>填写出访信息，提交邀请函和系统要求的材料，核对日期及经费项目号。</li><li>提交后在个人页面「操作 → 审批进度」查看流程，<strong>提醒导师、学院领导审核</strong>，并继续跟进后续审批。</li><li>研究生院资助审批、国际合作处审批、财务审批为<strong>三套独立系统</strong>，须分别申请。正常出境参会时，前两项都要办理。出发前确认流程状态，避免回国后仍未审批结束。</li></ol><blockquote><p>⚠️ <strong>务必会前完成审批，并确保出境前学校已批准。</strong> 按补充办理口径，系统无法在会后补办。</p><p>2026 年 10 月 1 日以前已完成出访的历史未申报事项，适用<strong>专项补报通知</strong>；请勿将过渡安排用于新的出访。</p></blockquote><blockquote><p>📎 依据：研究生院通知 · 基本要求 · 细则 PDF 第 1—2 页</p></blockquote><ul><li><input disabled="" type="checkbox"> 因公出国境申请已提交，且审批流程已办结</li></ul><h2 id="05-相关审批通过后"><a href="#05-相关审批通过后" class="headerlink" title="05 相关审批通过后"></a>05 相关审批通过后</h2><h3 id="按目的地要求办理因私证照、签证和学校证明材料"><a href="#按目的地要求办理因私证照、签证和学校证明材料" class="headerlink" title="按目的地要求办理因私证照、签证和学校证明材料"></a>按目的地要求办理因私证照、签证和学校证明材料</h3><ul><li>学生持<strong>因私护照 &#x2F; 证照</strong>出行，自行办理签证或签注，提前核对目的地材料要求。</li><li><strong>保存签证付费凭证及对应网页截图。</strong> 签证费可以报销，含拒签；总报销金额须在资助上限内。</li><li>需要<strong>派遣函</strong>时，到派遣函模板页下载：通常用<strong>英文</strong>基础模板，<strong>韩国用专门的中文模板</strong>。通常只改第一段个人信息及日期，按签证要求补充内容，保留底部落款。</li><li>核对派遣函与签证申请的出入境日期一致，用<strong>白色 A4 纸</strong>打印，带到<strong>四牌楼老图书馆 127 室</strong>办理签章。校方可提供专用信纸套印。</li><li>需要<strong>法人证书 &#x2F; 组织机构代码证明及翻译件</strong>时，带领馆材料清单一并申请；只领取签证实际需要的材料。</li><li><strong>领取签证材料的审批节点：</strong> 基本要求写「审批通过后」；PDF 和模板页明确写「学院审批同意后」。如学院已通过、后续仍在流转，先拨 <strong>025-83793215</strong> 确认可否领取。</li></ul><blockquote><p>📎 依据：基本要求 · 细则；操作细节补充自目录中的派遣函模板页</p></blockquote><ul><li><input disabled="" type="checkbox"> 证照与签证材料已处理（未出境者转下方签证费流程）</li></ul><h2 id="06-订票、出发前"><a href="#06-订票、出发前" class="headerlink" title="06 订票、出发前"></a>06 订票、出发前</h2><h3 id="核对行程与费用要求，完成行前准备"><a href="#核对行程与费用要求，完成行前准备" class="headerlink" title="核对行程与费用要求，完成行前准备"></a>核对行程与费用要求，完成行前准备</h3><ul><li>核对机票实际出入中国境日期与审批一致；外航购票要求、签证类别或日期变动，提前问国际合作处。顶会资助机票为<strong>经济舱</strong>，住宿按财务出国标准。</li><li>阅读行前教育材料，也可到国际合作处四牌楼或九龙湖办公点领取提醒小册子。</li><li>赴美者另读目录内的赴美注意事项，按自身签证与行程核对最新官方要求。</li></ul><p><strong>整理建议：</strong> 建一个材料文件夹，收齐邀请函、录用通知、审批记录、行程及票据；提前向财务处核对所需票据，途中持续保存。</p><blockquote><p>📎 依据：研究生院通知 · 申报目录 · 细则 PDF 第 2 页。文件夹为本页整理建议。</p></blockquote><ul><li><input disabled="" type="checkbox"> 行程、费用要求与行前材料已核对</li></ul><hr><h1 id="SPECIAL-CASE-最终未出境-·-只可报销签证费"><a href="#SPECIAL-CASE-最终未出境-·-只可报销签证费" class="headerlink" title="SPECIAL CASE &#x2F; 最终未出境 · 只可报销签证费"></a>SPECIAL CASE &#x2F; 最终未出境 · 只可报销签证费</h1><p><strong>判断条件：人是否实际出境。</strong> 因任何原因最终未出境均适用，包括签证被卡、签证被拒、行程取消及其他原因。</p><table><thead><tr><th>项目</th><th>规则</th></tr></thead><tbody><tr><td><strong>可报销</strong></td><td><strong>仅签证费</strong>（含拒签产生的签证费）</td></tr><tr><td><strong>不可报销</strong></td><td>注册费、机票、住宿等，<strong>不能沿用正常参会报销范围</strong></td></tr><tr><td><strong>前置条件</strong></td><td>须在<strong>开会日期之前</strong>完成研究生院资助资格审批；未完成则无法报销，系统会后不能补办</td></tr><tr><td><strong>材料</strong></td><td>签证付费凭证 + 对应网页截图，核对金额未超过获批资助上限</td></tr><tr><td><strong>国际合作处审批</strong></td><td><strong>此情形无需走国际合作处审批</strong>，也不按正常出境流程申请两份出国境报销原件</td></tr><tr><td><strong>办理方式</strong></td><td>向研究生院按未出境情形办理签证费材料审核，并在财务系统<strong>单独提交</strong>签证费报销申请</td></tr></tbody></table><blockquote><p>具体表单、系统入口及额外附件，请向研究生院和财务处核对。</p><p>⚠️ 下方 07—12 步是<strong>正常出境后</strong>的流程，未出境者按本框办理，<strong>勿直接套用</strong>领批件及参会总结的步骤。</p></blockquote><blockquote><p>📎 来源：整理者补充的办理口径；已核对的公开通知未载明这组签证费与未出境报销细节。</p></blockquote><ul><li><input disabled="" type="checkbox"> 已确认属于未出境情形，并按签证费流程办理</li></ul><hr><h1 id="PHASE-02-出行期间-·-按批件往返"><a href="#PHASE-02-出行期间-·-按批件往返" class="headerlink" title="PHASE 02 &#x2F; 出行期间 · 按批件往返"></a>PHASE 02 &#x2F; 出行期间 · 按批件往返</h1><h2 id="07-从出境到入境"><a href="#07-从出境到入境" class="headerlink" title="07 从出境到入境"></a>07 从出境到入境</h2><h3 id="按批准日期回国，保管证件与材料"><a href="#按批准日期回国，保管证件与材料" class="headerlink" title="按批准日期回国，保管证件与材料"></a>按批准日期回国，保管证件与材料</h3><ul><li><strong>严格执行批件日期：</strong> 批准 6 天，就应第 1 天离开中国、第 6 天进入中国。</li><li>妥善保管证件和贵重物品；护照丢失时及时联系中国驻当地使领馆办理临时证件，可通过「领事直通车」查询联系方式。</li><li>建议保存参会证明、支付记录与票据，并记下全部境外经转、停留城市，方便回国填表。</li></ul><blockquote><p>⚠️ 细则明确写明：<strong>超期者不能报销任何费用。</strong> 遇到航班变动等影响按期入境的情况，及时联系国际合作处确认处理办法，保留相关证明；本页无法保证例外获批。</p></blockquote><blockquote><p>📎 依据：细则 PDF 第 2—3 页。材料归集、遇变动联系为办理建议。</p></blockquote><ul><li><input disabled="" type="checkbox"> 已按期回国，证件、票据与行程记录已整理</li></ul><hr><h1 id="PHASE-03-回国后-·-先备齐，再交纸质材料"><a href="#PHASE-03-回国后-·-先备齐，再交纸质材料" class="headerlink" title="PHASE 03 &#x2F; 回国后 · 先备齐，再交纸质材料"></a>PHASE 03 &#x2F; 回国后 · 先备齐，再交纸质材料</h1><blockquote><p>第 08—10 步可交叉准备；第 11 步提交研究生院前，须完成线上总结并备齐纸质材料。</p></blockquote><h2 id="08-回国后，因公审批流程已结束"><a href="#08-回国后，因公审批流程已结束" class="headerlink" title="08 回国后，因公审批流程已结束"></a>08 回国后，因公审批流程已结束</h2><h3 id="去国际合作处领两份报销原件"><a href="#去国际合作处领两份报销原件" class="headerlink" title="去国际合作处领两份报销原件"></a>去国际合作处领两份报销原件</h3><p><strong>地点：</strong> 四牌楼校区老图书馆 127 室。出门前核对项目号是否变更、是否有境外经转与停留城市。</p><ol><li>领取《东南大学出国、赴港澳任务批件》原件。</li><li>领取《因公临时出国（境）任务和财务核算审批意见表》原件。</li><li>现场填写财务意见表的**「境外经转及停留城市」<strong>栏；无经转停留时用</strong>斜线划掉，不能空着**。</li><li>如项目号等信息变更，领取时告知工作人员，并在变更处<strong>加盖审批印章</strong>。</li></ol><blockquote><p>📎 依据：基本要求 · 细则 PDF 第 3 页</p></blockquote><ul><li><input disabled="" type="checkbox"> 两份原件已领取，城市栏和变更信息已处理</li></ul><h2 id="09-交研究生院纸质材料之前-·-研究生院资助者"><a href="#09-交研究生院纸质材料之前-·-研究生院资助者" class="headerlink" title="09 交研究生院纸质材料之前 · 研究生院资助者"></a>09 交研究生院纸质材料之前 · 研究生院资助者</h2><h3 id="上传签章后的经费计划表，再提交总结"><a href="#上传签章后的经费计划表，再提交总结" class="headerlink" title="上传签章后的经费计划表，再提交总结"></a>上传签章后的经费计划表，再提交总结</h3><ol><li>综合服务大厅 → 研究生国际交流 → 原会议申请记录，下载<strong>经费使用计划表</strong>。</li><li>办好<strong>导师、院系签字盖章</strong>，再上传提交。</li><li>随后按系统要求上传并<strong>提交总结材料</strong>，检查提交状态，<strong>别只留在草稿</strong>。</li><li>研究生院收到纸质报销材料后，会对系统中的总结材料审核。</li></ol><blockquote><p>📎 依据：研究生院通知</p></blockquote><ul><li><input disabled="" type="checkbox"> 签章计划表已上传，总结材料已正式提交</li></ul><h2 id="10-交研究生院纸质材料之前-·-研究生院资助者"><a href="#10-交研究生院纸质材料之前-·-研究生院资助者" class="headerlink" title="10 交研究生院纸质材料之前 · 研究生院资助者"></a>10 交研究生院纸质材料之前 · 研究生院资助者</h2><h3 id="在财务系统填写因公出国报销单"><a href="#在财务系统填写因公出国报销单" class="headerlink" title="在财务系统填写因公出国报销单"></a>在财务系统填写因公出国报销单</h3><p>在财务处入口进入相应财务系统，选择**「因公出国」**板块填写。</p><table><thead><tr><th>项目</th><th>内容</th></tr></thead><tbody><tr><td>报销项目号</td><td>3360632601E（2026 年度通知列示）</td></tr><tr><td>项目名称</td><td>研究生国际交流</td></tr><tr><td>项目负责人</td><td>耿新</td></tr></tbody></table><blockquote><p>项目号可能调整，报销时再核对；通知说明可在报销时修改，不影响此前办理批件。报销单、发票与票据问题向财务处确认。</p></blockquote><blockquote><p>📎 依据：研究生院通知</p></blockquote><ul><li><input disabled="" type="checkbox"> 报销单已填写，项目号已核对</li></ul><h2 id="11-完成第-08—10-步后-·-研究生院资助者"><a href="#11-完成第-08—10-步后-·-研究生院资助者" class="headerlink" title="11 完成第 08—10 步后 · 研究生院资助者"></a>11 完成第 08—10 步后 · 研究生院资助者</h2><h3 id="把纸质材料交研究生院审核、签字盖章"><a href="#把纸质材料交研究生院审核、签字盖章" class="headerlink" title="把纸质材料交研究生院审核、签字盖章"></a>把纸质材料交研究生院审核、签字盖章</h3><p>交给<strong>研究生院培养办王悦老师</strong>：</p><ul><li>财务报销单</li><li>经费使用计划表</li><li>上述两份出国境原件</li></ul><p><strong>收件时间：</strong> 每周一、二、四上午。四牌楼办公地点为<strong>逸夫建筑馆 205</strong>；周四在九龙湖集中处理业务，前往前可电话确认具体地点。</p><p>研究生院审核后统一请负责人签章，<strong>通常无法当场办好</strong>；签章完成后取回。</p><p><strong>九龙湖可用材料快递站：</strong></p><ul><li>地点：<strong>纪忠楼 102 大厅沙发旁</strong>。按桌面说明自助交件，扫码登记并保存查询二维码；自行查询到「办结且可取」后领取。</li><li>转送及取回时间不固定；该站提供收取转送服务，其他老师无法代为审核或答疑。</li><li>材料取回后，由本人继续交财务处。</li></ul><blockquote><p>📎 依据：研究生院通知</p></blockquote><ul><li><input disabled="" type="checkbox"> 研究生院审核签章完成，纸质材料已取回</li></ul><h2 id="12-研究生院签章完成后"><a href="#12-研究生院签章完成后" class="headerlink" title="12 研究生院签章完成后"></a>12 研究生院签章完成后</h2><h3 id="把完整材料交财务处，完成报销"><a href="#把完整材料交财务处，完成报销" class="headerlink" title="把完整材料交财务处，完成报销"></a>把完整材料交财务处，完成报销</h3><p>带上签章后的材料、相关票据及财务处要求的其他材料（<strong>报销签证费须附付费凭证与对应网页截图</strong>），由本人在财务系统单独申请并按要求提交财务处；含签证费的报销总额不得超过资助上限。根据审核反馈补充材料并跟进报销结果。</p><blockquote><p>⚠️ 公开页面没有列全财务票据清单、系统附件要求，也没有给出统一「提前多少天」或回国后报销截止日。请以办理系统、财务处当前要求为准，<strong>提前留出审批和签证时间</strong>。</p></blockquote><blockquote><p>📎 依据：研究生院通知 · 细则 PDF 第 3 页</p></blockquote><ul><li><input disabled="" type="checkbox"> 财务审核与报销已完成</li></ul><hr><h1 id="历史出访补报-·-按专项通知处理"><a href="#历史出访补报-·-按专项通知处理" class="headerlink" title="历史出访补报 · 按专项通知处理"></a>历史出访补报 · 按专项通知处理</h1><p><strong>适用条件：</strong> 2026 年 10 月 1 日以前已完成出访，且<strong>未在新旧系统申报</strong>。</p><p>新通知允许上述历史事项按下列顺序补办。范围限定为<strong>已完成</strong>因公出国（境）、且未通过新旧系统办理申报的学生；已申报但未审批办结的情况，须向国际合作处确认处理方式。</p><ol><li>本人撰写<strong>书面情况说明</strong>，如实说明未及时申报原因，并书面承诺今后遵守外事纪律、依规出访。</li><li>由所在学院<strong>党委副书记签字，并加盖学院公章</strong>。</li><li>交项目主管部门或经费支持导师所在部门签字盖章；<strong>研究生院资助的项目交研究生院办理</strong>。</li><li>交<strong>国际合作处审核签章</strong>，办理报销所需文件。</li><li>携全套说明文件和报销材料，前往<strong>财务处办理报销</strong>。</li></ol><blockquote><p>⚠️ <strong>10 月 1 日的含义须分清：</strong> 通知按出访事项划分过渡范围，原文未规定「10 月 1 日后不得提交历史补报材料」。补充了「10 月 1 日后无法提交」的执行口径，是否另有受理截止日须向国际合作处确认；如需补报，<strong>建议尽快办理</strong>。10 月 1 日当日出访也应事前获批，勿依赖过渡安排。</p><p>通知对 2026 年 10 月 1 日以后出访要求在出访前完成线上申报审批，<strong>未履行事前申报手续的出访费用不予报销</strong>。</p><p>历史补报安排<strong>不豁免</strong>研究生院资助资格须在会前获批的要求。</p></blockquote><blockquote><p>📎 依据：关于进一步加强学生因公出国（境）管理的通知（校国际〔2026〕6 号，2026-09-02 发布）；研究生院会前资助审批限制来自资助通知及补充口径。</p></blockquote><ul><li><input disabled="" type="checkbox"> 已确认适用补报范围并按顺序办理</li></ul><hr><h2 id="找谁办理"><a href="#找谁办理" class="headerlink" title="找谁办理"></a>找谁办理</h2><h3 id="资助-·-总结-·-研究生院签章"><a href="#资助-·-总结-·-研究生院签章" class="headerlink" title="资助 · 总结 · 研究生院签章"></a>资助 · 总结 · 研究生院签章</h3><p><strong>研究生院培养办 · 王悦老师</strong></p><ul><li>电话：025-83795359</li><li>邮箱：<a href="mailto:&#49;&#48;&#49;&#x30;&#x31;&#x30;&#x37;&#x39;&#x39;&#64;&#x73;&#101;&#117;&#x2e;&#101;&#x64;&#117;&#x2e;&#x63;&#110;">101010799@seu.edu.cn</a></li><li>地址：四牌楼逸夫建筑馆 205（周四在九龙湖集中处理业务）</li><li>报销材料收件：周一、二、四上午</li></ul><h3 id="出国境审批-·-签证材料-·-批件"><a href="#出国境审批-·-签证材料-·-批件" class="headerlink" title="出国境审批 · 签证材料 · 批件"></a>出国境审批 · 签证材料 · 批件</h3><p><strong>国际合作处</strong></p><ul><li>电话：025-83793215</li><li>材料办理：四牌楼老图书馆 127 室</li><li>日期不符、外航要求、签证类别、经转城市与项目号变更，咨询此处。</li></ul><h3 id="财务"><a href="#财务" class="headerlink" title="财务"></a>财务</h3><p>报销单、发票、完整票据清单与财务标准：<a href="https://cwc.seu.edu.cn/">东南大学财务处</a></p><hr><h2 id="原文与版本"><a href="#原文与版本" class="headerlink" title="原文与版本"></a>原文与版本</h2><p>本清单依据以下五个公开页面、细则及新增通知的内嵌 PDF，并结合补充办理口径整理。<strong>核对日期：2026 年 9 月 16 日。</strong></p><p>新增内容包括：签证费、未出境限制、三套独立系统及历史出访补报。阅读顺序经过重排，条件和例外保留在对应步骤中。主流程聚焦境外参会；派遣函页作为操作补充，赴美等专项要求保留入口。</p><table><thead><tr><th>来源</th><th>说明</th></tr></thead><tbody><tr><td>研究生院：关于研究生出国（境）参加国际会议申请资助的通知</td><td>落款 2026-01-16</td></tr><tr><td>国际合作处：学生因公申报说明目录</td><td>—</td></tr><tr><td>因公出国（境）基本要求（含时间限制图）</td><td>页面显示 2026-07-10</td></tr><tr><td>学生因公出国（境）要求细则</td><td>页面显示 2026-07-10 · 含内嵌 PDF</td></tr><tr><td>关于进一步加强学生因公出国（境）管理的通知</td><td>发布 2026-09-02，文件落款 2026-08-28，校国际〔2026〕6 号</td></tr></tbody></table><p><strong>补充口径来源：</strong> 整理者提供的签证费（含拒签）报销、付款凭证与网页截图、未出境仅报签证费、未出境无需国际合作处审批、三套系统独立申请及系统会后无法补办等办理要求。公开文件与补充口径不一致的部分已在对应位置列明。</p><blockquote><p>⚠️ <strong>免责声明：</strong> 网址中的年份与页面显示日期不同，版本按页面内容核对。学校更新要求后，<strong>以最新通知和办理部门答复为准</strong>。本页为办事整理，勾选状态不代表校方审批结果。</p></blockquote><hr><h2 id="相关阅读"><a href="#相关阅读" class="headerlink" title="相关阅读"></a>相关阅读</h2><ul><li><a href="/2026/10/11/Hexo%E5%8D%9A%E5%AE%A2%E5%B7%A5%E7%A8%8B%E5%8C%96%E5%AE%9E%E6%88%98/">Hexo 博客工程化实战：从手动部署到自动化内容工厂</a> — 把这种长清单做成可维护的博客页面</li></ul>]]></content>
    
    
    <summary type="html">东南大学研究生出国（境）参加国际会议的完整办理清单：从收到录用通知到财务报销，含资助申请、因公出国境审批、签证材料、回国报销与未出境只报签证费的专门流程。</summary>
    
    
    
    <category term="PhD之路" scheme="https://biko-duckyo.github.io/categories/PhD%E4%B9%8B%E8%B7%AF/"/>
    
    
    <category term="东南大学" scheme="https://biko-duckyo.github.io/tags/%E4%B8%9C%E5%8D%97%E5%A4%A7%E5%AD%A6/"/>
    
    <category term="出国参会" scheme="https://biko-duckyo.github.io/tags/%E5%87%BA%E5%9B%BD%E5%8F%82%E4%BC%9A/"/>
    
    <category term="办事流程" scheme="https://biko-duckyo.github.io/tags/%E5%8A%9E%E4%BA%8B%E6%B5%81%E7%A8%8B/"/>
    
    <category term="PhD" scheme="https://biko-duckyo.github.io/tags/PhD/"/>
    
    <category term="报销" scheme="https://biko-duckyo.github.io/tags/%E6%8A%A5%E9%94%80/"/>
    
  </entry>
  
  <entry>
    <title>VPN &amp; 机场笔记（资料备份）</title>
    <link href="https://biko-duckyo.github.io/2026/10/11/VPN%E4%B8%8E%E6%9C%BA%E5%9C%BA%E7%AC%94%E8%AE%B0/"/>
    <id>https://biko-duckyo.github.io/2026/10/11/VPN%E4%B8%8E%E6%9C%BA%E5%9C%BA%E7%AC%94%E8%AE%B0/</id>
    <published>2026-10-11T03:00:00.000Z</published>
    <updated>2026-10-10T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>⚠️ <strong>说明</strong>：本文为<strong>资料备份与信息收集</strong>性质，整理自公开资料与他人笔记（原始出处：<a href="https://mikeah2011.github.io/post/vpn">mikeah2011 · VPN &amp; 机场笔记</a>）。机场信息时效性极强，<strong>跑路风险高，永远不要年付</strong>——月付或「不限时小包」最安全。</p><p>本文<strong>不含任何推广导流链接</strong>（原文的邀请码已移除），仅保留判断标准与选购方法论。</p></blockquote><h2 id="永远先看这条"><a href="#永远先看这条" class="headerlink" title="永远先看这条"></a>永远先看这条</h2><ul><li><strong>不要年付。</strong> 月付或不限时小包最安全，机场跑路时损失最小。</li><li><strong>不要只买一家。</strong> 组合推荐：一个月付 + 一个不限时套餐 &#x3D; 最稳方案。</li><li><strong>优先选择运营 1 年以上、有工单&#x2F;Telegram 群、支持 24 小时退款的机场。</strong></li></ul><hr><h2 id="一、主流代理协议对比"><a href="#一、主流代理协议对比" class="headerlink" title="一、主流代理协议对比"></a>一、主流代理协议对比</h2><p>选择协议是科学上网的第一步。以下是目前最主流的四种协议在<strong>加密方式、抗封锁能力、性能、跨平台支持</strong>四个维度的对比：</p><table><thead><tr><th>维度</th><th>Shadowsocks (SS)</th><th>V2Ray (VMess&#x2F;VLESS)</th><th>Trojan</th><th>WireGuard</th></tr></thead><tbody><tr><td><strong>加密方式</strong></td><td>AEAD (ChaCha20-Poly1305 &#x2F; AES-256-GCM)</td><td>VMess: AES-128-GCM；VLESS: 无内置加密（依赖 TLS）</td><td>TLS 1.3（伪装为 HTTPS 流量）</td><td>ChaCha20-Poly1305 &#x2F; Curve25519</td></tr><tr><td><strong>流量特征</strong></td><td>特征明显，易被 DPI 识别</td><td>VMess 有特征；VLESS+XTLS 几乎无特征</td><td>与正常 HTTPS 网站流量一致</td><td>有独特握手特征，需搭配隧道</td></tr><tr><td><strong>抗封锁能力</strong></td><td>⭐⭐⭐ 中等（需配合 obfs 插件）</td><td>⭐⭐⭐⭐ 较强（VLESS+Reality 极强）</td><td>⭐⭐⭐⭐⭐ 极强</td><td>⭐⭐⭐ 中等（裸连易被识别）</td></tr><tr><td><strong>性能</strong></td><td>高</td><td>中（VMess 稍高开销）</td><td>中高</td><td>极高（内核态实现）</td></tr><tr><td><strong>跨平台</strong></td><td>全平台</td><td>全平台</td><td>全平台</td><td>全平台</td></tr><tr><td><strong>适用场景</strong></td><td>自建、轻度使用</td><td>自建 &#x2F; 机场主流</td><td>对抗 DPI</td><td>组网、内网穿透</td></tr></tbody></table><h3 id="协议趋势"><a href="#协议趋势" class="headerlink" title="协议趋势"></a>协议趋势</h3><ul><li><strong>VLESS + Reality</strong> 正在取代 VMess，成为新标准（无自签证书、抗探测强）</li><li><strong>AnyTLS</strong> 协议开始出现，部分机场陆续支持</li><li><strong>AI 用途</strong>（ChatGPT &#x2F; Claude）推动了高端专线需求——对 IP 质量要求高</li></ul><h3 id="订阅中的符号说明"><a href="#订阅中的符号说明" class="headerlink" title="订阅中的符号说明"></a>订阅中的符号说明</h3><table><thead><tr><th>符号</th><th>含义</th></tr></thead><tbody><tr><td><code>A</code></td><td>少量 AnyTLS 协议节点</td></tr><tr><td><code>*A</code></td><td>大部分 AnyTLS 协议节点</td></tr><tr><td><code>🔒</code></td><td>只能用官方客户端，不支持 Clash 订阅</td></tr><tr><td><code>🔥</code></td><td>阅后即焚订阅模式</td></tr></tbody></table><hr><h2 id="二、客户端选型"><a href="#二、客户端选型" class="headerlink" title="二、客户端选型"></a>二、客户端选型</h2><table><thead><tr><th>平台</th><th>推荐</th><th>备注</th></tr></thead><tbody><tr><td>macOS</td><td>Clash Verge Rev</td><td>免费开源，TUN 模式完善</td></tr><tr><td>Windows</td><td>Clash Verge Rev &#x2F; V2rayN</td><td>V2rayN 更轻量</td></tr><tr><td>iOS</td><td>Shadowrocket</td><td>付费，需外区 Apple ID</td></tr><tr><td>Android</td><td>NekoBox &#x2F; Clash Meta for Android</td><td>支持协议全</td></tr></tbody></table><hr><h2 id="三、macOS-代理配置"><a href="#三、macOS-代理配置" class="headerlink" title="三、macOS 代理配置"></a>三、macOS 代理配置</h2><h3 id="方案一：Clash-Verge-Rev（推荐）"><a href="#方案一：Clash-Verge-Rev（推荐）" class="headerlink" title="方案一：Clash Verge Rev（推荐）"></a>方案一：Clash Verge Rev（推荐）</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">推荐配置：</span><br><span class="line">  - 端口：7890（HTTP）/ 7891（SOCKS5）/ 7892（Mixed）</span><br><span class="line">  - 模式：Rule（规则分流）</span><br><span class="line">  - TUN 模式：开启（可代理终端、Git 等命令行工具）</span><br><span class="line">  - DNS：fake-ip 模式 + 阿里 DoH</span><br><span class="line">  - 规则集：ACL4SSR（国内直连，国外代理）</span><br></pre></td></tr></table></figure><p><strong>终端代理配置（配合 TUN 模式或手动设置）：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 ~/.zshrc 中添加</span></span><br><span class="line"><span class="built_in">export</span> http_proxy=http://127.0.0.1:7890</span><br><span class="line"><span class="built_in">export</span> https_proxy=http://127.0.0.1:7890</span><br><span class="line"><span class="built_in">export</span> all_proxy=socks5://127.0.0.1:7891</span><br><span class="line"></span><br><span class="line"><span class="comment"># Git 代理配置</span></span><br><span class="line">git config --global http.proxy http://127.0.0.1:7890</span><br><span class="line">git config --global https.proxy http://127.0.0.1:7890</span><br></pre></td></tr></table></figure><p><strong>系统级代理设置：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 命令行设置 HTTP 代理</span></span><br><span class="line">networksetup -setwebproxy <span class="string">&quot;Wi-Fi&quot;</span> 127.0.0.1 7890</span><br><span class="line">networksetup -setsecurewebproxy <span class="string">&quot;Wi-Fi&quot;</span> 127.0.0.1 7890</span><br><span class="line">networksetup -setsocksfirewallproxy <span class="string">&quot;Wi-Fi&quot;</span> 127.0.0.1 7891</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭代理</span></span><br><span class="line">networksetup -setwebproxystate <span class="string">&quot;Wi-Fi&quot;</span> off</span><br><span class="line">networksetup -setsecurewebproxystate <span class="string">&quot;Wi-Fi&quot;</span> off</span><br><span class="line">networksetup -setsocksfirewallproxystate <span class="string">&quot;Wi-Fi&quot;</span> off</span><br></pre></td></tr></table></figure><blockquote><p>💡 如果你使用 Clash Verge Rev 并开了系统代理，以上命令会自动设置，只有排查问题时才需要手动调整。</p></blockquote><h3 id="方案二：Surge（进阶）"><a href="#方案二：Surge（进阶）" class="headerlink" title="方案二：Surge（进阶）"></a>方案二：Surge（进阶）</h3><p>Surge 是 macOS&#x2F;iOS 上功能最强大的网络调试与代理工具，价格较高（$49.99 起），但功能远超 Clash：</p><ul><li>原生支持 HTTP 抓包和请求重写</li><li>支持增强模式（Enhanced Mode）代理所有应用</li><li>低内存占用，稳定性极佳</li><li>支持 iCloud 同步配置</li></ul><h3 id="方案三：Proxifier（仅代理特定应用）"><a href="#方案三：Proxifier（仅代理特定应用）" class="headerlink" title="方案三：Proxifier（仅代理特定应用）"></a>方案三：Proxifier（仅代理特定应用）</h3><p>如果你只想让特定应用走代理（如只让浏览器翻墙、其他直连），Proxifier 是最佳选择，支持按进程名、按 IP 段设置不同规则。</p><h3 id="方案对比"><a href="#方案对比" class="headerlink" title="方案对比"></a>方案对比</h3><table><thead><tr><th>特性</th><th>Clash Verge Rev</th><th>Surge</th><th>Proxifier</th></tr></thead><tbody><tr><td>价格</td><td>免费开源</td><td>$49.99+</td><td>$39.95</td></tr><tr><td>协议支持</td><td>SS&#x2F;VMess&#x2F;VLESS&#x2F;Trojan&#x2F;WG 等</td><td>SS&#x2F;Trojan&#x2F;WG 等</td><td>需配合其他客户端</td></tr><tr><td>抓包能力</td><td>无</td><td>内置</td><td>无</td></tr><tr><td>TUN 模式</td><td>✅</td><td>✅</td><td>✅</td></tr><tr><td>规则灵活性</td><td>⭐⭐⭐⭐</td><td>⭐⭐⭐⭐⭐</td><td>⭐⭐⭐</td></tr><tr><td>上手难度</td><td>简单</td><td>中等</td><td>中等</td></tr><tr><td>推荐人群</td><td>普通用户、开发者</td><td>开发者、网络调试</td><td>特定应用代理需求</td></tr></tbody></table><hr><h2 id="四、机场选购方法论"><a href="#四、机场选购方法论" class="headerlink" title="四、机场选购方法论"></a>四、机场选购方法论</h2><h3 id="4-1-直连-vs-中转-vs-专线"><a href="#4-1-直连-vs-中转-vs-专线" class="headerlink" title="4.1 直连 vs 中转 vs 专线"></a>4.1 直连 vs 中转 vs 专线</h3><table><thead><tr><th>类型</th><th>原理</th><th>速度</th><th>稳定性</th><th>价格</th><th>适合人群</th></tr></thead><tbody><tr><td><strong>直连</strong></td><td>客户端直接连接境外节点</td><td>受国际带宽影响</td><td>一般</td><td>低</td><td>预算有限、轻度使用</td></tr><tr><td><strong>中转</strong></td><td>经过国内中转服务器再出境</td><td>较快（中转优化路由）</td><td>较好</td><td>中</td><td>日常使用、追求体验</td></tr><tr><td><strong>专线 (IEPL&#x2F;IPLC)</strong></td><td>企业级专线通道</td><td>极快且稳定</td><td>极好</td><td>高</td><td>重度用户、开发者、对稳定性要求高</td></tr></tbody></table><h3 id="4-2-机场评分维度"><a href="#4-2-机场评分维度" class="headerlink" title="4.2 机场评分维度"></a>4.2 机场评分维度</h3><p>选择机场时，建议从以下维度综合评估：</p><ol><li><strong>节点覆盖</strong>：支持多少个国家&#x2F;地区？是否有常用节点（日本、新加坡、美国、香港）</li><li><strong>协议支持</strong>：是否支持 Trojan &#x2F; VLESS 等新协议？（老旧 SS 可能被封）</li><li><strong>流媒体解锁</strong>：是否支持 Netflix、Disney+、ChatGPT 等？</li><li><strong>倍率说明</strong>：部分节点倍率 &gt; 1，实际消耗流量更多，需注意</li><li><strong>在线客服</strong>：是否有工单系统或 Telegram 群组？</li><li><strong>退款政策</strong>：是否支持不满意退款？（至少支持 24 小时内退款）</li><li><strong>历史口碑</strong>：查看是否有跑路风险，选择运营 1 年以上的老机场</li></ol><h3 id="4-3-按预算的选购思路"><a href="#4-3-按预算的选购思路" class="headerlink" title="4.3 按预算的选购思路"></a>4.3 按预算的选购思路</h3><p>这里不列具体机场清单（时效性太差），只给判断标准：</p><table><thead><tr><th>使用强度</th><th>推荐类型</th><th>预算参考</th><th>选购要点</th></tr></thead><tbody><tr><td>低频（月 &lt; 100GB）</td><td>直连月付</td><td>¥2 起</td><td>只要便宜、能失联自救</td></tr><tr><td>囤流量</td><td>不限时流量包</td><td>¥20 &#x2F; 1TB 级</td><td>看倍率是否 1:1，注意「阅后即焚」</td></tr><tr><td>追求体验</td><td>中转月付</td><td>¥10 &#x2F; 100GB 级</td><td>看是否有 BGP 中转、晚高峰是否稳</td></tr><tr><td>重度 &#x2F; AI 用途</td><td>专线（IEPL&#x2F;IPLC）</td><td>¥40 起</td><td>IP 质量是关键，看是否原生 IP</td></tr></tbody></table><h3 id="4-4-避坑清单"><a href="#4-4-避坑清单" class="headerlink" title="4.4 避坑清单"></a>4.4 避坑清单</h3><ul><li>❌ <strong>年付</strong>：跑路事件频发，损失最大的就是年付用户</li><li>❌ <strong>只看价格</strong>：¥1 月付往往意味着超售，晚高峰根本跑不动</li><li>❌ <strong>只买一家</strong>：单点故障时你会完全没有备用方案</li><li>❌ <strong>忽略倍率</strong>：倍率标注混乱，实际消耗可能远超套餐名义流量</li><li>✅ <strong>先试用</strong>：优先选提供 1-2GB 试用流量或 1 天试用的机场</li></ul><hr><h2 id="五、故障排查踩坑记录"><a href="#五、故障排查踩坑记录" class="headerlink" title="五、故障排查踩坑记录"></a>五、故障排查踩坑记录</h2><p><strong>案例 1：Clash Verge Rev 与 Surge 同时运行冲突</strong></p><blockquote><p>同时运行两个客户端会导致代理端口冲突（默认都是 7890），表现为浏览器无法上网。解决方法：修改其中一个客户端的端口号，或只保留一个运行。</p></blockquote><p><strong>案例 2：公司 &#x2F; 学校网络封锁代理</strong></p><blockquote><p>部分公司&#x2F;学校网络会通过 DPI 深度包检测封锁代理流量。表现：机场节点全部超时，但手机 4G 正常。解决方法：选择 Trojan 协议节点，或使用 VLESS + Reality 节点（伪装为正常 HTTPS 流量）。</p></blockquote><p><strong>案例 3：路由器代理后局域网设备无法直连</strong></p><blockquote><p>在路由器层面配置代理后，局域网内的 AirDrop、打印机、智能家居设备可能无法被发现。解决方法：在路由器的代理规则中添加局域网 IP 段 <code>192.168.0.0/16</code>、<code>10.0.0.0/8</code> 为直连规则。</p></blockquote><p><strong>案例 4：Git 推送失败但浏览器正常</strong></p><blockquote><p>浏览器走了系统代理，但 Git 默认不读系统代理。解决方法：给 Git 单独配置代理（见上文 macOS 代理配置），或在代理客户端里开启 <strong>TUN 模式</strong>，让所有流量（含终端）都被接管。</p></blockquote><p><strong>案例 5：订阅更新后节点全红</strong></p><blockquote><p>多为订阅链接失效或机场更换域名。解决方法：到机场官网（而非邮件里的旧链接）重新复制订阅地址；若官网也打不开，说明机场可能已跑路。</p></blockquote><hr><h2 id="六、自建订阅转换（可选）"><a href="#六、自建订阅转换（可选）" class="headerlink" title="六、自建订阅转换（可选）"></a>六、自建订阅转换（可选）</h2><p>机场给的订阅格式五花八门，Clash &#x2F; Sing-box &#x2F; Surge 各要各的格式。常见做法是自建一个 <strong>subconverter</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 Docker 部署</span></span><br><span class="line">docker run -d --restart=always \</span><br><span class="line">  -p 25500:25500 \</span><br><span class="line">  --name subconverter \</span><br><span class="line">  tindy2013/subconverter:latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 访问 http://localhost:25500/sub?target=clash&amp;url=&lt;URL_ENCODED_SUB_URL&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>⚠️ 订阅转换服务会经手你的订阅链接，<strong>不要用公共的在线转换站</strong>，尽量自建。</p></blockquote><hr><h2 id="七、备份与归档建议"><a href="#七、备份与归档建议" class="headerlink" title="七、备份与归档建议"></a>七、备份与归档建议</h2><p>作为一份「资料备份」，建议按下面的方式维护：</p><ol><li><strong>订阅链接存本地</strong>：存进密码管理器（如 Bitwarden），不要只存在浏览器书签里</li><li><strong>每季度复核一次</strong>：机场域名、价格、状态都可能变化，过期信息及时标注或删除</li><li><strong>保留方法论，弱化清单</strong>：具体的机场名随时会失效，<strong>判断标准（协议、类型、避坑项）才是长期有价值的部分</strong></li><li><strong>记录自己的踩坑</strong>：把每次翻车的原因写下来，比记十个机场名有用</li></ol><hr><h2 id="相关阅读"><a href="#相关阅读" class="headerlink" title="相关阅读"></a>相关阅读</h2><ul><li><a href="/2026/10/11/Hexo%E5%8D%9A%E5%AE%A2%E5%B7%A5%E7%A8%8B%E5%8C%96%E5%AE%9E%E6%88%98/">Hexo 博客工程化实战：从手动部署到自动化内容工厂</a> — 把这类资料笔记做成自动化流水线</li></ul><hr><blockquote><p>📌 <strong>免责声明</strong>：本文仅供技术学习与资料备份之用，内容整理自公开网络资料。请遵守当地法律法规，自行判断与承担使用风险。文中不含任何推广链接与邀请码，所引用的第三方服务与本站无关。</p></blockquote>]]></content>
    
    
    <summary type="html">一份 VPN 与机场订阅的备份笔记：主流代理协议对比、客户端选型、macOS 代理配置、机场选购维度与故障排查踩坑记录。资料整理性质，信息可能过期，请以实际为准。</summary>
    
    
    
    <category term="资源备份" scheme="https://biko-duckyo.github.io/categories/%E8%B5%84%E6%BA%90%E5%A4%87%E4%BB%BD/"/>
    
    
    <category term="VPN" scheme="https://biko-duckyo.github.io/tags/VPN/"/>
    
    <category term="机场" scheme="https://biko-duckyo.github.io/tags/%E6%9C%BA%E5%9C%BA/"/>
    
    <category term="代理" scheme="https://biko-duckyo.github.io/tags/%E4%BB%A3%E7%90%86/"/>
    
    <category term="科学上网" scheme="https://biko-duckyo.github.io/tags/%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/"/>
    
    <category term="资料备份" scheme="https://biko-duckyo.github.io/tags/%E8%B5%84%E6%96%99%E5%A4%87%E4%BB%BD/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 博客工程化实战：从手动部署到自动化内容工厂</title>
    <link href="https://biko-duckyo.github.io/2026/10/11/Hexo%E5%8D%9A%E5%AE%A2%E5%B7%A5%E7%A8%8B%E5%8C%96%E5%AE%9E%E6%88%98/"/>
    <id>https://biko-duckyo.github.io/2026/10/11/Hexo%E5%8D%9A%E5%AE%A2%E5%B7%A5%E7%A8%8B%E5%8C%96%E5%AE%9E%E6%88%98/</id>
    <published>2026-10-11T02:00:00.000Z</published>
    <updated>2026-10-10T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>本文整理自 <a href="https://mikeah2011.github.io/post/hexo-blog-engineering-from-manual-to-automated-content-factory">Michael’s Blog · Hexo 博客工程化实战</a>，并结合本站（Butterfly 主题 + <code>hexo-deployer-git</code>）的实际情况做了适配与补充。</p></blockquote><h2 id="为什么要把博客「工程化」？"><a href="#为什么要把博客「工程化」？" class="headerlink" title="为什么要把博客「工程化」？"></a>为什么要把博客「工程化」？</h2><p>写博客这件事，技术人通常的路径是：</p><ol><li>本地 <code>hexo new</code> 创建文章</li><li>Markdown 写内容</li><li><code>hexo g &amp;&amp; hexo d</code> 手动部署</li></ol><p>这条路径在只有几十篇文章时完全够用。但当文章数量突破 400+、你希望保持周更甚至日更节奏时，手动流程就会暴露出几个致命问题：</p><ul><li><strong>部署依赖本地环境</strong>：换台电脑就写不了</li><li><strong>选题靠灵感驱动</strong>：没灵感就断更</li><li><strong>SEO 全靠感觉</strong>：标题写得好不好、结构化数据有没有、sitemap 对不对，全凭手感</li><li><strong>写完就忘</strong>：哪篇文章阅读量高、哪些关键词带来流量，完全没有数据反馈</li></ul><p>这篇文章记录的是把 Hexo 博客从「手动写作」改造成「自动化内容工厂」的完整过程，涉及四个核心模块：</p><ol><li><strong>自动部署</strong>：push 即发布</li><li><strong>AI 辅助选题与写作</strong>：选题池 + 多 Worker 并行生产</li><li><strong>SEO 工程化</strong>：结构化数据、自动 sitemap、内链策略</li><li><strong>阅读量分析</strong>：数据采集 → 看板 → 反哺选题</li></ol><p>每个模块都有可直接复用的配置和代码。</p><hr><h2 id="一、从-hexo-deploy-到-push-即发布"><a href="#一、从-hexo-deploy-到-push-即发布" class="headerlink" title="一、从 hexo deploy 到 push 即发布"></a>一、从 <code>hexo deploy</code> 到 push 即发布</h2><h3 id="1-1-两条部署路线"><a href="#1-1-两条部署路线" class="headerlink" title="1.1 两条部署路线"></a>1.1 两条部署路线</h3><p>Hexo 的部署本质上就是把 <code>public/</code> 这个目录「搬」到托管平台。常见两条路线：</p><table><thead><tr><th>路线</th><th>原理</th><th>适合</th></tr></thead><tbody><tr><td><strong>本地 push</strong>（本站当前方案）</td><td>本地构建后，<code>hexo-deployer-git</code> 把 <code>public/</code> 强推到 Pages 仓库</td><td>文章量不大、想完全掌控本地环境</td></tr><tr><td><strong>CI 构建</strong>（GitHub Actions）</td><td>仓库只存 Markdown，CI 里安装依赖、构建、发布</td><td>文章多、多人协作、想换台电脑就能写</td></tr></tbody></table><p>本站用的是第一条：<code>_config.yml</code> 中配置 <code>hexo-deployer-git</code>，一条命令完成生成和部署。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># _config.yml</span></span><br><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">https://github.com/&lt;user&gt;/&lt;user&gt;.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">main</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 构建并部署（--generate 表示先 hexo g 再推送）</span></span><br><span class="line">hexo deploy --generate</span><br></pre></td></tr></table></figure><blockquote><p>注意：<code>hexo-deployer-git</code> 使用 <code>.deploy_git/</code> 作为中转仓库，它会把 <code>public/</code> 里的内容强制推送过去，所以 Pages 仓库里不需要（也不应该）保留源文件。</p></blockquote><h3 id="1-2-GitHub-Actions-自动部署"><a href="#1-2-GitHub-Actions-自动部署" class="headerlink" title="1.2 GitHub Actions 自动部署"></a>1.2 GitHub Actions 自动部署</h3><p>当你希望「写完 Markdown，<code>git push</code> 就完事」时，把构建搬到 CI。在仓库根目录创建 <code>.github/workflows/deploy.yml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">Hexo</span> <span class="string">Blog</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 防止同时触发多次部署，排队执行</span></span><br><span class="line"><span class="attr">concurrency:</span></span><br><span class="line">  <span class="attr">group:</span> <span class="string">deploy-$&#123;&#123;</span> <span class="string">github.ref</span> <span class="string">&#125;&#125;</span></span><br><span class="line">  <span class="attr">cancel-in-progress:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="attr">permissions:</span></span><br><span class="line">  <span class="attr">contents:</span> <span class="string">read</span></span><br><span class="line">  <span class="attr">pages:</span> <span class="string">write</span></span><br><span class="line">  <span class="attr">id-token:</span> <span class="string">write</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build-and-deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">fetch-depth:</span> <span class="number">0</span>  <span class="comment"># 需要完整历史用于 git log 生成文章列表</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&#x27;20&#x27;</span></span><br><span class="line">          <span class="attr">cache:</span> <span class="string">&#x27;npm&#x27;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npx</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">NODE_ENV:</span> <span class="string">production</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">GitHub</span> <span class="string">Pages</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">peaceiris/actions-gh-pages@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">github_token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUB_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">### 1.3 进阶：多环境部署</span></span><br><span class="line"></span><br><span class="line"><span class="string">如果你有多个目标（比如</span> <span class="string">GitHub</span> <span class="string">Pages</span> <span class="string">+</span> <span class="string">自建服务器），可以用</span> <span class="string">`needs`</span> <span class="string">串起来：</span></span><br><span class="line"></span><br><span class="line"><span class="string">```yaml</span></span><br><span class="line">  <span class="attr">deploy-to-server:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">build-and-deploy</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">github.ref</span> <span class="string">==</span> <span class="string">&#x27;refs/heads/main&#x27;</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">built</span> <span class="string">files</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">gh-pages</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">public</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">via</span> <span class="string">rsync</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">burnett01/rsync-deployments@7.0.1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">switches:</span> <span class="string">-avzr</span> <span class="string">--delete</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">public/</span></span><br><span class="line">          <span class="attr">remote_path:</span> <span class="string">/var/www/blog/</span></span><br><span class="line">          <span class="attr">remote_host:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_HOST</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">remote_user:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_USER</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">remote_key:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SSH_PRIVATE_KEY</span> <span class="string">&#125;&#125;</span></span><br></pre></td></tr></table></figure><h3 id="1-4-构建缓存优化"><a href="#1-4-构建缓存优化" class="headerlink" title="1.4 构建缓存优化"></a>1.4 构建缓存优化</h3><p>文章一多，构建时间就成了问题。加入缓存后构建时间可以从 90s 降到 25s：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Cache</span> <span class="string">Hexo</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">|</span></span><br><span class="line"><span class="string">      node_modules</span></span><br><span class="line"><span class="string">      .deploy_git</span></span><br><span class="line"><span class="string"></span>    <span class="attr">key:</span> <span class="string">hexo-$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-$&#123;&#123;</span> <span class="string">hashFiles(&#x27;package-lock.json&#x27;)</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">restore-keys:</span> <span class="string">|</span></span><br><span class="line">      <span class="string">hexo-$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-</span></span><br></pre></td></tr></table></figure><h3 id="1-5-自动化预检"><a href="#1-5-自动化预检" class="headerlink" title="1.5 自动化预检"></a>1.5 自动化预检</h3><p>部署前加一道 lint 和死链检查，防止发布有问题的内容：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Check</span> <span class="string">broken</span> <span class="string">links</span></span><br><span class="line">  <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    npx hexo generate</span></span><br><span class="line"><span class="string">    npx broken-link-checker http://localhost:4000 --recursive --ordered --filter-level 3 || true</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Validate</span> <span class="string">HTML</span></span><br><span class="line">  <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">    <span class="string">npx</span> <span class="string">html-validate</span> <span class="string">public/**/*.html</span> <span class="string">||</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><hr><h2 id="二、AI-辅助选题与写作"><a href="#二、AI-辅助选题与写作" class="headerlink" title="二、AI 辅助选题与写作"></a>二、AI 辅助选题与写作</h2><p>这是整个工程化改造中投入产出比最高的部分。</p><h3 id="2-1-选题池设计"><a href="#2-1-选题池设计" class="headerlink" title="2.1 选题池设计"></a>2.1 选题池设计</h3><p>在仓库根目录维护一个 <code>.writing-backlog.md</code>，格式简单到极致：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># Writing Backlog</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [ ] Laravel 事件溯源实战：Event Sourcing + EventStore 落地踩坑</span><br><span class="line"><span class="bullet">-</span> [ ] Go 并发模式：Channel、Context、errgroup 组合实战</span><br><span class="line"><span class="bullet">-</span> [ ] Redis 7.0 Function 替代 Lua 脚本：迁移指南与性能对比</span><br><span class="line"><span class="bullet">-</span> [ ] Kubernetes HPA 自定义指标：基于 Laravel 队列深度的自动扩缩容</span><br></pre></td></tr></table></figure><p><code>- [ ]</code> 表示待写，<code>- [x]</code> 表示已完成。Worker 领取任务时立刻用 <code>sed</code> 把 <code>[ ]</code> 改成 <code>[x]</code> 锁定选题，防止多个 Worker 重复写作。</p><h3 id="2-2-AI-Worker-流水线"><a href="#2-2-AI-Worker-流水线" class="headerlink" title="2.2 AI Worker 流水线"></a>2.2 AI Worker 流水线</h3><p>用 cron 配置多个定时 Worker，每个 Worker 独立运行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────┐     ┌─────────────┐     ┌─────────────┐</span><br><span class="line">│  Worker 1   │     │  Worker 2   │     │  Worker 3   │</span><br><span class="line">│  每2小时执行 │     │  每3小时执行 │     │  每4小时执行 │</span><br><span class="line">└──────┬──────┘     └──────┬──────┘     └──────┬──────┘</span><br><span class="line">       │                   │                   │</span><br><span class="line">       ▼                   ▼                   ▼</span><br><span class="line">┌──────────────────────────────────────────────────┐</span><br><span class="line">│              .writing-backlog.md                  │</span><br><span class="line">│  grep → 锁定 → 写文章 → 保存 → 更新选题池        │</span><br><span class="line">└──────────────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><p>每个 Worker 的核心逻辑：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 领取选题</span></span><br><span class="line">TOPIC=$(grep -m1 <span class="string">&#x27;^- \[ \]&#x27;</span> .writing-backlog.md)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 立刻锁定（防止其他 Worker 重复领取）</span></span><br><span class="line">FIRST30=$(<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$TOPIC</span>&quot;</span> | <span class="built_in">cut</span> -c1-35)</span><br><span class="line">sed -i <span class="string">&#x27;&#x27;</span> <span class="string">&quot;s/^- \[ \] <span class="variable">$&#123;FIRST30&#125;</span>/- [x] <span class="variable">$&#123;FIRST30&#125;</span>/&quot;</span> .writing-backlog.md</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. AI 生成文章（交给 AI agent 处理）</span></span><br><span class="line"><span class="comment"># 4. 保存到 source/_posts/&lt;分类&gt;/&lt;文件名&gt;.md</span></span><br><span class="line"><span class="comment"># 5. 更新选题池，追加文件路径</span></span><br></pre></td></tr></table></figure><h3 id="2-3-选题质量控制"><a href="#2-3-选题质量控制" class="headerlink" title="2.3 选题质量控制"></a>2.3 选题质量控制</h3><p>不是所有选题都值得写。在选题池里加上质量评估维度：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># Writing Backlog - 格式说明</span></span><br><span class="line"><span class="section"># - [ ] 选题标题 | 预估搜索量(高/中/低) | 竞争度(高/中/低) | 优先级(P0/P1/P2)</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [ ] Laravel 事件溯源实战 | 搜索量:中 | 竞争度:低 | 优先级:P0</span><br><span class="line"><span class="bullet">-</span> [ ] Go 并发模式 | 搜索量:高 | 竞争度:高 | 优先级:P1</span><br></pre></td></tr></table></figure><p><strong>选题原则：</strong></p><ul><li><strong>P0</strong>：搜索量中&#x2F;低 + 竞争度低 &#x3D; 蓝海词，优先写</li><li><strong>P1</strong>：搜索量高 + 竞争度高 &#x3D; 需要有差异化角度</li><li><strong>P2</strong>：搜索量低 + 竞争度高 &#x3D; 不值得写，除非是个人笔记</li></ul><h3 id="2-4-自动-Git-提交"><a href="#2-4-自动-Git-提交" class="headerlink" title="2.4 自动 Git 提交"></a>2.4 自动 Git 提交</h3><p>Worker 写完文章后自动 commit 并 push：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">git add <span class="built_in">source</span>/_posts/</span><br><span class="line">git commit -m <span class="string">&quot;post: <span class="subst">$(date +%Y-%m-%d)</span> 新文章标题&quot;</span></span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="comment">## 三、SEO 工程化</span></span><br><span class="line"></span><br><span class="line">SEO 不是「写完文章再想」的事，而应该内建到写作流程里。</span><br><span class="line"></span><br><span class="line"><span class="comment">### 3.1 Frontmatter 规范</span></span><br><span class="line"></span><br><span class="line">每篇文章的 frontmatter 都是 SEO 的一部分：</span><br><span class="line"></span><br><span class="line">```yaml</span><br><span class="line">---</span><br><span class="line">title: 主关键词在前，长尾描述在后</span><br><span class="line">description: 用于 meta description，直接影响搜索结果摘要</span><br><span class="line">tags: [关键词1, 关键词2, 关键词3]</span><br><span class="line">categories: [唯一分类]</span><br><span class="line"><span class="built_in">date</span>: 2026-01-01 10:00:00</span><br><span class="line">updated: 2026-01-02</span><br><span class="line">---</span><br></pre></td></tr></table></figure><p><strong>要点：</strong></p><ul><li><code>title</code>：主关键词在前，长尾描述在后</li><li><code>description</code>：用于 <code>&lt;meta name=&quot;description&quot;&gt;</code>，直接影响搜索结果摘要</li><li><code>tags</code>：3-5 个，覆盖文章核心概念</li><li><code>categories</code>：唯一，用于面包屑导航和站点结构</li></ul><h3 id="3-2-结构化数据（JSON-LD）"><a href="#3-2-结构化数据（JSON-LD）" class="headerlink" title="3.2 结构化数据（JSON-LD）"></a>3.2 结构化数据（JSON-LD）</h3><p>在生成阶段往 <code>&lt;head&gt;</code> 注入 Article 类型的结构化数据：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// scripts/structured-data.js</span></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;after_render&#x27;</span>, <span class="keyword">function</span>(<span class="params">html, data</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (data.<span class="property">layout</span> !== <span class="string">&#x27;post&#x27;</span>) <span class="keyword">return</span> html;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> jsonLD = &#123;</span><br><span class="line">    <span class="string">&quot;@context&quot;</span>: <span class="string">&quot;https://schema.org&quot;</span>,</span><br><span class="line">    <span class="string">&quot;@type&quot;</span>: <span class="string">&quot;BlogPosting&quot;</span>,</span><br><span class="line">    <span class="string">&quot;headline&quot;</span>: data.<span class="property">title</span>,</span><br><span class="line">    <span class="string">&quot;description&quot;</span>: data.<span class="property">description</span> || data.<span class="property">title</span>,</span><br><span class="line">    <span class="string">&quot;datePublished&quot;</span>: data.<span class="property">date</span>.<span class="title function_">toISOString</span>(),</span><br><span class="line">    <span class="string">&quot;dateModified&quot;</span>: (data.<span class="property">updated</span> || data.<span class="property">date</span>).<span class="title function_">toISOString</span>(),</span><br><span class="line">    <span class="string">&quot;author&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;@type&quot;</span>: <span class="string">&quot;Person&quot;</span>,</span><br><span class="line">      <span class="string">&quot;name&quot;</span>: <span class="string">&quot;Biko&quot;</span>,</span><br><span class="line">      <span class="string">&quot;url&quot;</span>: <span class="string">&quot;https://biko-duckyo.github.io&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="string">&quot;publisher&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;@type&quot;</span>: <span class="string">&quot;Organization&quot;</span>,</span><br><span class="line">      <span class="string">&quot;name&quot;</span>: <span class="string">&quot;Biko的个人小站&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="string">&quot;mainEntityOfPage&quot;</span>: &#123;</span><br><span class="line">      <span class="string">&quot;@type&quot;</span>: <span class="string">&quot;WebPage&quot;</span>,</span><br><span class="line">      <span class="string">&quot;@id&quot;</span>: <span class="string">&quot;https://biko-duckyo.github.io&quot;</span> + data.<span class="property">path</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> script = <span class="string">&#x27;&lt;script type=&quot;application/ld+json&quot;&gt;&#x27;</span> + <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(jsonLD, <span class="literal">null</span>, <span class="number">2</span>) + <span class="string">&#x27;&lt;/script&gt;&#x27;</span>;</span><br><span class="line">  <span class="keyword">return</span> html.<span class="title function_">replace</span>(<span class="string">&#x27;&lt;/head&gt;&#x27;</span>, script + <span class="string">&#x27;\n&lt;/head&gt;&#x27;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><blockquote><p>Hexo 会自动 require <code>scripts/</code> 目录下的所有文件，所以把这段放进 <code>scripts/</code> 即可生效，不需要改主题源码。</p></blockquote><h3 id="3-3-Sitemap-自动生成"><a href="#3-3-Sitemap-自动生成" class="headerlink" title="3.3 Sitemap 自动生成"></a>3.3 Sitemap 自动生成</h3><p><code>hexo-generator-sitemap</code> 已经够用，但需要正确配置：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># _config.yml</span></span><br><span class="line"><span class="attr">sitemap:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">sitemap.xml</span></span><br><span class="line">  <span class="attr">rel:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">tags:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">categories:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>提交到 Google Search Console 后，确认 <code>robots.txt</code> 包含：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Sitemap: https://&lt;your-site&gt;/sitemap.xml</span><br></pre></td></tr></table></figure><h3 id="3-4-内链策略"><a href="#3-4-内链策略" class="headerlink" title="3.4 内链策略"></a>3.4 内链策略</h3><p>文章之间的内链是 SEO 的重要信号。可以在写作流水线里加一步「相关阅读」注入：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># scripts/inject_internal_links.py</span></span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">find_related_posts</span>(<span class="params">current_tags, posts_dir</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;根据 tags 相似度找到相关文章&quot;&quot;&quot;</span></span><br><span class="line">    related = []</span><br><span class="line">    <span class="keyword">for</span> filename <span class="keyword">in</span> os.listdir(posts_dir):</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> filename.endswith(<span class="string">&#x27;.md&#x27;</span>):</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        filepath = os.path.join(posts_dir, filename)</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(filepath, <span class="string">&#x27;r&#x27;</span>, encoding=<span class="string">&#x27;utf-8&#x27;</span>) <span class="keyword">as</span> f:</span><br><span class="line">            content = f.read()</span><br><span class="line">            tags_match = re.search(<span class="string">r&#x27;tags:\s*\n((?:\s+-?\s*.+\n)*)&#x27;</span>, content)</span><br><span class="line">            <span class="keyword">if</span> tags_match:</span><br><span class="line">                post_tags = <span class="built_in">set</span>(re.findall(<span class="string">r&#x27;-\s+(.+)&#x27;</span>, tags_match.group(<span class="number">1</span>)))</span><br><span class="line">                overlap = <span class="built_in">len</span>(current_tags &amp; post_tags)</span><br><span class="line">                <span class="keyword">if</span> overlap &gt;= <span class="number">2</span>:</span><br><span class="line">                    title_match = re.search(<span class="string">r&#x27;title:\s*(.+)&#x27;</span>, content)</span><br><span class="line">                    <span class="keyword">if</span> title_match:</span><br><span class="line">                        related.append((overlap, title_match.group(<span class="number">1</span>).strip(), filename))</span><br><span class="line">    related.sort(reverse=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">return</span> related[:<span class="number">5</span>]</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">inject_links</span>(<span class="params">content, related_posts</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;在文章末尾注入相关阅读&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> related_posts:</span><br><span class="line">        <span class="keyword">return</span> content</span><br><span class="line">    links = <span class="string">&quot;\n&quot;</span>.join([</span><br><span class="line">        <span class="string">&quot;- [&quot;</span> + title + <span class="string">&quot;](/&quot;</span> + filename.replace(<span class="string">&#x27;.md&#x27;</span>, <span class="string">&#x27;&#x27;</span>) + <span class="string">&quot;/)&quot;</span></span><br><span class="line">        <span class="keyword">for</span> _, title, filename <span class="keyword">in</span> related_posts</span><br><span class="line">    ])</span><br><span class="line">    <span class="keyword">return</span> content + <span class="string">&quot;\n\n## 相关阅读\n\n&quot;</span> + links + <span class="string">&quot;\n&quot;</span></span><br></pre></td></tr></table></figure><h3 id="3-5-自动化-SEO-审计"><a href="#3-5-自动化-SEO-审计" class="headerlink" title="3.5 自动化 SEO 审计"></a>3.5 自动化 SEO 审计</h3><p>在 CI 里加一段 frontmatter 完整性检查：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">SEO</span> <span class="string">Audit</span></span><br><span class="line">  <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    for file in source/_posts/**/*.md; do</span></span><br><span class="line"><span class="string">      if ! grep -q &quot;description:&quot; &quot;$file&quot;; then</span></span><br><span class="line"><span class="string">        echo &quot;⚠️ Missing description: $file&quot;</span></span><br><span class="line"><span class="string">      fi</span></span><br><span class="line"><span class="string">      if ! grep -q &quot;categories:&quot; &quot;$file&quot;; then</span></span><br><span class="line"><span class="string">        echo &quot;⚠️ Missing categories: $file&quot;</span></span><br><span class="line"><span class="string">      fi</span></span><br><span class="line"><span class="string">    done</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">    <span class="comment"># 检查是否有重复的 title</span></span><br><span class="line">    <span class="string">grep</span> <span class="string">-r</span> <span class="string">&quot;^title:&quot;</span> <span class="string">source/_posts/</span> <span class="string">|</span> <span class="string">sort</span> <span class="string">|</span> <span class="string">uniq</span> <span class="string">-d</span></span><br></pre></td></tr></table></figure><hr><h2 id="四、阅读量分析"><a href="#四、阅读量分析" class="headerlink" title="四、阅读量分析"></a>四、阅读量分析</h2><p>写完就忘是内容创作最大的浪费。把数据采集回来，才能形成「写作 → 反馈 → 选题」的正循环。</p><h3 id="4-1-数据采集"><a href="#4-1-数据采集" class="headerlink" title="4.1 数据采集"></a>4.1 数据采集</h3><p>方案有三档，按投入从低到高：</p><table><thead><tr><th>方案</th><th>成本</th><th>数据粒度</th><th>隐私</th></tr></thead><tbody><tr><td><strong>不蒜子</strong>（busuanzi）</td><td>免费、一行代码</td><td>站点 PV&#x2F;UV、单篇阅读量</td><td>第三方统计</td></tr><tr><td><strong>Umami &#x2F; Plausible</strong>（自托管）</td><td>一台小服务器</td><td>页面级 PV、来源、停留</td><td>数据自有</td></tr><tr><td><strong>GA4 + 自定义事件</strong></td><td>免费、配置复杂</td><td>全量行为、可做漏斗</td><td>Google</td></tr></tbody></table><p>本站当前用的是不蒜子，配置在 Butterfly 的 <code>busuanzi</code> 开关里，零成本但粒度粗。想要按文章、按来源分析，就得换 Umami 这类自托管方案。</p><h3 id="4-2-看板"><a href="#4-2-看板" class="headerlink" title="4.2 看板"></a>4.2 看板</h3><p>数据落到 SQLite &#x2F; Postgres 后，用 Metabase 或 Grafana 做一个最简单的看板，关注四个指标：</p><ul><li><strong>单篇 PV&#x2F;UV 排行</strong>：哪些文章真的有人看</li><li><strong>流量来源</strong>：搜索 &#x2F; 直链 &#x2F; 社交，各占多少</li><li><strong>搜索关键词</strong>：哪些词带来了流量（Search Console）</li><li><strong>跳出率与停留</strong>：内容是否真的被读完</li></ul><h3 id="4-3-反哺选题"><a href="#4-3-反哺选题" class="headerlink" title="4.3 反哺选题"></a>4.3 反哺选题</h3><p>看板的最终目的是回写进选题池：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># Writing Backlog</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [x] Hexo 博客工程化实战 | 已完成，PV 排名 #3</span><br><span class="line"><span class="bullet">-</span> [ ] Hexo 博客工程化实战（续）：阅读量看板搭建 | 承接高 PV 文章 | 优先级:P0</span><br></pre></td></tr></table></figure><p><strong>经验：</strong> 一篇文章 PV 高，就写它的「续集 &#x2F; 进阶 &#x2F; 姊妹篇」——这是最省力的选题来源，因为需求已经被验证过了。</p><hr><h2 id="五、本站的落地清单"><a href="#五、本站的落地清单" class="headerlink" title="五、本站的落地清单"></a>五、本站的落地清单</h2><p>结合本站（Butterfly + GitHub Pages）现状，按投入产出比排序的改造顺序：</p><ol><li><strong>短期</strong>：在 <code>scripts/</code> 里加 JSON-LD 结构化数据；补全每篇文章的 <code>description</code></li><li><strong>中期</strong>：把部署迁移到 GitHub Actions（换台电脑也能写）；接入自托管 Umami</li><li><strong>长期</strong>：建选题池 + AI Worker 流水线；每周复盘一次看板，把高 PV 主题做成系列</li></ol><blockquote><p>一句话总结：<strong>手动部署解决「能不能发」，工程化解决「能不能持续发」。</strong> 文章数过了 100 篇，后者才是真正的瓶颈。</p></blockquote><p>git push origin main</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">push 触发 CI 自动部署，形成闭环：</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>选题 → AI 写作 → git push → CI 构建 → 部署上线</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">publish_dir: ./public</span><br><span class="line">publish_branch: gh-pages</span><br><span class="line">commit_message: &quot;deploy: $&#123;&#123; github.event.head_commit.message &#125;&#125;&quot;</span><br></pre></td></tr></table></figure><blockquote><p>这里发布到 <code>gh-pages</code> 分支。如果站点仓库本身就是 <code>&lt;user&gt;.github.io</code>（例如本站），对应分支要改成 <code>main</code>。</p></blockquote>]]></content>
    
    
    <summary type="html">把 Hexo 博客从「本地 hexo g &amp;&amp; hexo d」改造为自动化内容工厂：自动部署、构建缓存、AI 辅助选题与写作、SEO 工程化、阅读量分析，附可直接复用的配置与脚本。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="工程化" scheme="https://biko-duckyo.github.io/tags/%E5%B7%A5%E7%A8%8B%E5%8C%96/"/>
    
    <category term="自动化" scheme="https://biko-duckyo.github.io/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
    <category term="GitHub Actions" scheme="https://biko-duckyo.github.io/tags/GitHub-Actions/"/>
    
    <category term="SEO" scheme="https://biko-duckyo.github.io/tags/SEO/"/>
    
  </entry>
  
  <entry>
    <title>Butterfly 电子时钟侧边栏小部件 3.0</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/Butterfly-clock%E6%95%99%E7%A8%8B/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/Butterfly-clock%E6%95%99%E7%A8%8B/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T15:59:45.370Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：基于-Butterfly-主题的模拟电子钟侧边栏小部件-3-0-版"><a href="#教程：基于-Butterfly-主题的模拟电子钟侧边栏小部件-3-0-版" class="headerlink" title="教程：基于 Butterfly 主题的模拟电子钟侧边栏小部件 3.0 版"></a>教程：基于 Butterfly 主题的模拟电子钟侧边栏小部件 3.0 版</h1><blockquote><p>原文链接：<a href="https://zfe.space/post/56348.html">https://zfe.space/post/56348.html</a><br>作者：小冰博客（しゅふがく）</p></blockquote><hr><h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><h3 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h3><h3 id="3-0-模拟时钟小部件主要包含："><a href="#3-0-模拟时钟小部件主要包含：" class="headerlink" title="3.0 模拟时钟小部件主要包含："></a>3.0 模拟时钟小部件主要包含：</h3><ul><li>日期（年、月、日、星期）</li><li>天气（天气图标、温度）</li><li>湿度（百分比）</li><li>空气质量（US AQI）</li><li>时间（当地时间、AM&#x2F;PM）</li><li>地理位置（IP 地址地理位置）</li><li>每日访问上限：约 500 次</li><li>每月访问上限：10000 次</li></ul><h3 id="预览地址：https-zfe-space"><a href="#预览地址：https-zfe-space" class="headerlink" title="预览地址：https://zfe.space"></a>预览地址：<a href="https://zfe.space/">https://zfe.space</a></h3><p>调用过猛可能会导致超出访问限制而不显示。</p><p>相比 1.0 版本，加快了访问速度并优化了加载效果。<br>相比 2.0 版本，通过 Vue 替换 jQuery 的 DOM 操作提升了性能。<br>解决了 date class 会导致相关文章的时间样式出错的 BUG。</p><h3 id="资源包地址"><a href="#资源包地址" class="headerlink" title="资源包地址"></a>资源包地址</h3><ul><li>基础 3.0 版本：<a href="https://github.com/Zfour/Butterfly-clock/releases/tag/3.01">https://github.com/Zfour/Butterfly-clock/releases/tag/3.01</a></li><li>内测 3.1 版本：<a href="https://github.com/Zfour/Butterfly-clock/">https://github.com/Zfour/Butterfly-clock/</a></li></ul><hr><h2 id="内测-3-1-版本"><a href="#内测-3-1-版本" class="headerlink" title="内测 3.1 版本"></a>内测 3.1 版本</h2><h3 id="3-1-内测版主要包含："><a href="#3-1-内测版主要包含：" class="headerlink" title="3.1 内测版主要包含："></a>3.1 内测版主要包含：</h3><ul><li>日期（年、月、日、星期）</li><li>天气（天气图标、温度）</li><li>时间（当地时间、AM&#x2F;PM）</li><li>地理位置（相比 3.0 优化了 IP 信息定位不准确问题）</li><li>IP 信息（替代了空气质量信息）</li><li>每日访问上限：无限次</li><li>相比 3.0 优化了加载动画和信息显示效果</li></ul><hr><h2 id="步骤-1：申请-API-Key"><a href="#步骤-1：申请-API-Key" class="headerlink" title="步骤 1：申请 API Key"></a>步骤 1：申请 API Key</h2><h3 id="基础-3-0-版本"><a href="#基础-3-0-版本" class="headerlink" title="基础 3.0 版本"></a>基础 3.0 版本</h3><p>这里介绍如何申请 AirVisual API Key。</p><ol><li>打开网站注册账号：<a href="https://www.iqair.com/auth/login">https://www.iqair.com/auth/login</a></li><li>登录后访问：<a href="https://www.iqair.com/dashboard/api">https://www.iqair.com/dashboard/api</a></li><li>点击 “+ NEW KEY” 按钮，选择 “Community” 得到对应的 Key</li></ol><h3 id="内测-3-1-版本-1"><a href="#内测-3-1-版本-1" class="headerlink" title="内测 3.1 版本"></a>内测 3.1 版本</h3><ol><li>打开网站注册账号：<a href="https://openweathermap.org,验证邮箱/">https://openweathermap.org，验证邮箱</a></li><li>打开 <a href="https://home.openweathermap.org/api_keys">https://home.openweathermap.org/api_keys</a> 得到对应的 Key</li></ol><hr><h2 id="步骤-2：添加小部件-PUG"><a href="#步骤-2：添加小部件-PUG" class="headerlink" title="步骤 2：添加小部件 PUG"></a>步骤 2：添加小部件 PUG</h2><ol><li>将资源包中 <code>pug</code> 文件夹的 <code>card_clock.pug</code> 文件放入 <code>themes/butterfly/layout/includes/widget</code> 目录下</li><li>将资源包中 <code>pug</code> 文件夹的 <code>index.pug</code> 文件放入同目录替换（适用于 Butterfly 3.3 以上版本）</li></ol><p>若你的版本较低或存在侧边栏魔改，请打开 <code>themes/butterfly/layout/includes/widget/index.pug</code>，将以下代码添加至 <code>card_author</code> 代码块后：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">if theme.aside.card_clock.enable</span><br><span class="line">  !=partial(&#x27;includes/widget/card_clock&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br></pre></td></tr></table></figure><p>添加后的完整示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">#aside_content.aside_content</span><br><span class="line">  if theme.aside.card_author.enable</span><br><span class="line">    !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">  if theme.aside.card_announcement.enable</span><br><span class="line">    !=partial(&#x27;includes/widget/card_announcement&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">  if theme.aside.card_clock.enable</span><br><span class="line">    !=partial(&#x27;includes/widget/card_clock&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">  .sticky_layout</span><br><span class="line">    if is_post()</span><br><span class="line">      if showToc</span><br><span class="line">        include ./card_post_toc.pug</span><br><span class="line">    if theme.aside.card_recent_post.enable</span><br><span class="line">      !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    if theme.ad &amp;&amp; theme.ad.aside</span><br><span class="line">      !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    else</span><br><span class="line">      if theme.aside.card_recent_post.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">      if theme.ad &amp;&amp; theme.ad.aside</span><br><span class="line">        !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    if theme.newest_comments.enable</span><br><span class="line">      !=partial(&#x27;includes/widget/card_newest_comment&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    if theme.aside.card_categories.enable</span><br><span class="line">      !=partial(&#x27;includes/widget/card_categories&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    if theme.aside.card_tags.enable</span><br><span class="line">      !=partial(&#x27;includes/widget/card_tags&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    if theme.aside.card_archives.enable</span><br><span class="line">      !=partial(&#x27;includes/widget/card_archives&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line">    if theme.aside.card_webinfo.enable</span><br><span class="line">      !=partial(&#x27;includes/widget/card_webinfo&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br></pre></td></tr></table></figure><p>打开 <code>themes/butterfly/_config.yml</code>，搜索 <code>aside:</code> 设置处，添加 clock 开关：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="attr">card_clock:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><hr><h2 id="步骤-3：导入-CSS、JS、图片等资源文件"><a href="#步骤-3：导入-CSS、JS、图片等资源文件" class="headerlink" title="步骤 3：导入 CSS、JS、图片等资源文件"></a>步骤 3：导入 CSS、JS、图片等资源文件</h2><p>将下载包中的 <code>clock</code> 文件夹放入博客根目录的 <code>source</code> 文件夹下。</p><blockquote><p><strong>注意</strong>：如果报错，请将文件夹中的 <code>pug</code> 文件夹删除！</p></blockquote><h3 id="基础-3-0-版本-1"><a href="#基础-3-0-版本-1" class="headerlink" title="基础 3.0 版本"></a>基础 3.0 版本</h3><p>打开 <code>clock/clock.js</code>，找到这行：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> clockurl = <span class="string">&quot;https://api.airvisual.com/v2/nearest_city?key=88888888-8888-8888-8888-888888888888&quot;</span>;</span><br></pre></td></tr></table></figure><p>将 <code>key</code> 值改为你在 AirVisual 官网申请的 Key。</p><h3 id="内测-3-1-版本-2"><a href="#内测-3-1-版本-2" class="headerlink" title="内测 3.1 版本"></a>内测 3.1 版本</h3><p>打开 <code>clock/clock.js</code>，找到这行：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> mykey = &#123; <span class="attr">weather</span>: <span class="string">&quot;888888888888888888888&quot;</span> &#125;;</span><br></pre></td></tr></table></figure><p>将 <code>key</code> 值改为你在 openweathermap.org 官网申请的 Key。</p><hr><h2 id="步骤-4：接入-CSS-与-JS"><a href="#步骤-4：接入-CSS-与-JS" class="headerlink" title="步骤 4：接入 CSS 与 JS"></a>步骤 4：接入 CSS 与 JS</h2><p>打开 <code>themes/butterfly/_config.yml</code>，搜索 <code>inject:</code> 设置处，添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/clock/css/clock.css&quot;</span> <span class="string">/&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.11&quot;&gt;&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/clock/js/clock.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><p>Butterfly 3.4 以上版本请引入 jQuery：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/clock/css/clock.css&quot;</span> <span class="string">/&gt;</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://cdn.jsdelivr.net/npm/vue@2.6.11&quot;&gt;&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/clock/js/clock.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>在本地进行开发时，基础版建议关闭 <code>card_clock: enable: true</code> 选项，以免多次调用超出访问上限。<br>3.1 内测版无访问次数限制。</p><hr><h2 id="相关评论常见问题"><a href="#相关评论常见问题" class="headerlink" title="相关评论常见问题"></a>相关评论常见问题</h2><h3 id="Q-开启-Pjax-后控制台报错-Identifier-mykey-has-already-been-declared"><a href="#Q-开启-Pjax-后控制台报错-Identifier-mykey-has-already-been-declared" class="headerlink" title="Q: 开启 Pjax 后控制台报错 Identifier &#39;mykey&#39; has already been declared"></a>Q: 开启 Pjax 后控制台报错 <code>Identifier &#39;mykey&#39; has already been declared</code></h3><p><strong>原因</strong>：<code>const</code> 声明的变量会重复声明。</p><p><strong>解决方法</strong>：</p><ol><li>在另外的 JS 中单独使用 <code>const</code> 声明 <code>mykey</code> 且不添加 <code>data-pjax</code></li><li>将 <code>const</code> 改成 <code>let</code> 或 <code>var</code></li></ol><h3 id="Q-开启-Pjax-不能加载，只有强制刷新才能显示"><a href="#Q-开启-Pjax-不能加载，只有强制刷新才能显示" class="headerlink" title="Q: 开启 Pjax 不能加载，只有强制刷新才能显示"></a>Q: 开启 Pjax 不能加载，只有强制刷新才能显示</h3><p><strong>原因</strong>：Pjax 切换页面后脚本没有重新执行。</p><p><strong>解决方法</strong>：给 script 标签加上 <code>data-pjax</code> 属性。</p>]]></content>
    
    
    <summary type="html">Butterfly 主题侧边栏电子时钟小部件 3.0 的安装与配置：LED 数码管时间、天气图标与温度、湿度、空气质量、IP 地理位置；3.0 版用 Vue 替换 jQuery 的 DOM 操作提升性能，并修复 date class 导致相关文章时间样式错位的 BUG。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>Swiper轮播文章</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-Swiper%E8%BD%AE%E6%92%AD%E6%96%87%E7%AB%A0/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-Swiper%E8%BD%AE%E6%92%AD%E6%96%87%E7%AB%A0/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T15:59:51.464Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：Swiper-Bar-轮播置顶文章卡片"><a href="#教程：Swiper-Bar-轮播置顶文章卡片" class="headerlink" title="教程：Swiper Bar 轮播置顶文章卡片"></a>教程：Swiper Bar 轮播置顶文章卡片</h1><blockquote><p>原文链接：<a href="https://akilar.top/posts/8e1264d1/">https://akilar.top/posts/8e1264d1/</a><br>作者：Akilar</p></blockquote><hr><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>本项目是对冰卡诺老师「基于 Butterfly 主题的轮播手动置顶文章」进行重构：</p><ul><li>精简了部分样式</li><li>适配 Pjax</li><li>依赖项改为 CDN 链接</li><li>去 jQuery</li></ul><hr><h2 id="插件安装（推荐）"><a href="#插件安装（推荐）" class="headerlink" title="插件安装（推荐）"></a>插件安装（推荐）</h2><p>在博客根目录下运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-butterfly-swiper --save</span><br></pre></td></tr></table></figure><hr><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>在站点配置文件 <code>_config.yml</code> 或主题配置文件 <code>_config.butterfly.yml</code> 中添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># hexo-butterfly-swiper</span></span><br><span class="line"><span class="comment"># see https://akilar.top/posts/8e1264d1/</span></span><br><span class="line"><span class="attr">swiper:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">priority:</span> <span class="number">5</span></span><br><span class="line">  <span class="attr">enable_page:</span> <span class="string">all</span></span><br><span class="line">  <span class="attr">timemode:</span> <span class="string">date</span></span><br><span class="line">  <span class="attr">layout:</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">id</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">recent-posts</span></span><br><span class="line">    <span class="attr">index:</span> <span class="number">0</span></span><br><span class="line">  <span class="attr">default_descr:</span> <span class="string">再怎么看我也不知道怎么描述它的啦！</span></span><br><span class="line">  <span class="attr">swiper_css:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.css</span></span><br><span class="line">  <span class="attr">swiper_js:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper.min.js</span></span><br><span class="line">  <span class="attr">custom_css:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiperstyle.css</span></span><br><span class="line">  <span class="attr">custom_js:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-swiper/lib/swiper_init.js</span></span><br></pre></td></tr></table></figure><hr><h2 id="参数说明"><a href="#参数说明" class="headerlink" title="参数说明"></a>参数说明</h2><table><thead><tr><th>参数</th><th>可选值</th><th>说明</th></tr></thead><tbody><tr><td><code>enable</code></td><td>true&#x2F;false</td><td>控制开关</td></tr><tr><td><code>priority</code></td><td>number</td><td>过滤器优先级，数值越小执行越早，默认 10</td></tr><tr><td><code>enable_page</code></td><td>path &#x2F; all</td><td>应用页面，<code>/</code> 为首页，<code>all</code> 为全部页面</td></tr><tr><td><code>timemode</code></td><td>date &#x2F; updated</td><td>时间显示模式</td></tr><tr><td><code>layout.type</code></td><td>id &#x2F; class</td><td>挂载容器类型</td></tr><tr><td><code>layout.name</code></td><td>text</td><td>容器名称</td></tr><tr><td><code>layout.index</code></td><td>number</td><td>第几个容器</td></tr><tr><td><code>default_descr</code></td><td>text</td><td>默认文章描述</td></tr><tr><td><code>swiper_css</code></td><td>url</td><td>Swiper CSS 依赖</td></tr><tr><td><code>swiper_js</code></td><td>url</td><td>Swiper JS 依赖</td></tr><tr><td><code>custom_css</code></td><td>url</td><td>主题适配样式</td></tr><tr><td><code>custom_js</code></td><td>url</td><td>Swiper 初始化方法</td></tr></tbody></table><hr><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>在文章的 Front Matter 中添加 <code>swiper_index</code> 配置项：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 文章标题</span><br><span class="line">date: 创建日期</span><br><span class="line">updated: 更新日期</span><br><span class="line">cover: 文章封面</span><br><span class="line">description: 文章描述</span><br><span class="line"><span class="section">swiper<span class="emphasis">_index: 1  # 置顶轮播图顺序，非负整数，数字越大越靠前</span></span></span><br><span class="line"><span class="emphasis"><span class="section">---</span></span></span><br></pre></td></tr></table></figure><hr><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><ul><li>首页文章列表上方显示轮播卡片</li><li>左侧封面图 + 右侧标题&#x2F;描述&#x2F;日期</li><li>右侧小圆点指示器（当前位置长条高亮）</li><li>每 3 秒自动切换</li><li>鼠标悬停暂停</li></ul>]]></content>
    
    
    <summary type="html">基于 hexo-butterfly-swiper 的首页轮播置顶文章卡片：安装 npm 插件、配置 swiper 项，把指定文章（swiper_index）做成可手动切换的轮播，并说明 Pjax 兼容与 CDN 依赖的处理。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>分类磁贴</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E5%88%86%E7%B1%BB%E7%A3%81%E8%B4%B4/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E5%88%86%E7%B1%BB%E7%A3%81%E8%B4%B4/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T15:59:45.376Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：分类磁贴（Categories-Magnet）"><a href="#教程：分类磁贴（Categories-Magnet）" class="headerlink" title="教程：分类磁贴（Categories Magnet）"></a>教程：分类磁贴（Categories Magnet）</h1><blockquote><p>原文链接：<a href="https://akilar.top/posts/a9131002/">https://akilar.top/posts/a9131002/</a><br>作者：Akilar</p></blockquote><hr><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>本项目是对冰卡诺老师「分类磁贴 2.0 版」进行重构：</p><ul><li>去除所有 JS 依赖，纯 CSS 实现</li><li>完美支持 Pjax</li><li>自动获取分类和文章数</li><li>自定义配置行数（3 列或 4 列）</li><li>磁贴只显示一级分类</li><li>自定义磁贴封面及描述</li></ul><hr><h2 id="插件安装（推荐）"><a href="#插件安装（推荐）" class="headerlink" title="插件安装（推荐）"></a>插件安装（推荐）</h2><p>在博客根目录下运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-butterfly-categories-card --save</span><br></pre></td></tr></table></figure><hr><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>在站点配置文件 <code>_config.yml</code> 或主题配置文件 <code>_config.butterfly.yml</code> 中添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># hexo-butterfly-categories-card</span></span><br><span class="line"><span class="comment"># see https://akilar.top/posts/a9131002/</span></span><br><span class="line"><span class="attr">categoryBar:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">priority:</span> <span class="number">5</span></span><br><span class="line">  <span class="attr">enable_page:</span> <span class="string">/</span></span><br><span class="line">  <span class="attr">layout:</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">id</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">recent-posts</span></span><br><span class="line">    <span class="attr">index:</span> <span class="number">0</span></span><br><span class="line">  <span class="attr">column:</span> <span class="string">odd</span>  <span class="comment"># odd：3列 | even：4列</span></span><br><span class="line">  <span class="attr">row:</span> <span class="number">1</span>  <span class="comment"># 显示行数，超过自动切换为滚动显示</span></span><br><span class="line">  <span class="attr">message:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">descr:</span> <span class="string">Ubuntu指南</span></span><br><span class="line">      <span class="attr">cover:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets/image/cover1.webp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">descr:</span> <span class="string">玩转Win10</span></span><br><span class="line">      <span class="attr">cover:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets/image/cover2.webp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">descr:</span> <span class="string">长篇小说连载</span></span><br><span class="line">      <span class="attr">cover:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets/image/cover3.webp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">descr:</span> <span class="string">个人日记</span></span><br><span class="line">      <span class="attr">cover:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets/image/cover4.webp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">descr:</span> <span class="string">诗词歌赋</span></span><br><span class="line">      <span class="attr">cover:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets/image/cover5.webp</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">descr:</span> <span class="string">杂谈教程</span></span><br><span class="line">      <span class="attr">cover:</span> <span class="string">https://npm.elemecdn.com/akilar-candyassets/image/cover6.webp</span></span><br><span class="line">  <span class="attr">custom_css:</span> <span class="string">https://npm.elemecdn.com/hexo-butterfly-categories-card@1.0.0/lib/categorybar.css</span></span><br></pre></td></tr></table></figure><hr><h2 id="参数说明"><a href="#参数说明" class="headerlink" title="参数说明"></a>参数说明</h2><table><thead><tr><th>参数</th><th>可选值</th><th>说明</th></tr></thead><tbody><tr><td><code>enable</code></td><td>true&#x2F;false</td><td>控制开关</td></tr><tr><td><code>priority</code></td><td>number</td><td>过滤器优先级，默认 10</td></tr><tr><td><code>enable_page</code></td><td>path &#x2F; all</td><td>应用页面，<code>/</code> 为首页</td></tr><tr><td><code>layout.type</code></td><td>id &#x2F; class</td><td>挂载容器类型</td></tr><tr><td><code>layout.name</code></td><td>text</td><td>容器名称</td></tr><tr><td><code>layout.index</code></td><td>number</td><td>第几个容器</td></tr><tr><td><code>column</code></td><td>odd &#x2F; even</td><td>列数：odd&#x3D;3列，even&#x3D;4列</td></tr><tr><td><code>row</code></td><td>number</td><td>显示行数，超过自动滚动</td></tr><tr><td><code>message.descr</code></td><td>text</td><td>分类描述（需与文章分类一一对应）</td></tr><tr><td><code>message.cover</code></td><td>url &#x2F; color</td><td>分类背景图</td></tr><tr><td><code>custom_css</code></td><td>url</td><td>自定义样式</td></tr></tbody></table><hr><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><ul><li>首页显示大圆角分类磁贴卡片</li><li>每个磁贴有封面背景图</li><li>显示分类名 + 文章数量</li><li>hover 时背景放大 + 变暗效果</li><li>超过设定行数自动滚动隐藏</li></ul>]]></content>
    
    
    <summary type="html">基于 hexo-butterfly-categories-card 的分类磁贴：纯 CSS 实现、去除 JS 依赖、完美支持 Pjax，可自定义列数与行数、磁贴封面和描述，仅显示一级分类并自动统计文章数。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>双栏布局</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E5%8F%8C%E6%A0%8F%E5%B8%83%E5%B1%80/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E5%8F%8C%E6%A0%8F%E5%B8%83%E5%B1%80/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T16:01:36.851Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：Butterfly-主题文章双栏布局插件"><a href="#教程：Butterfly-主题文章双栏布局插件" class="headerlink" title="教程：Butterfly 主题文章双栏布局插件"></a>教程：Butterfly 主题文章双栏布局插件</h1><blockquote><p>原文链接：<a href="https://zfe.space/post/hexo-butterfly-article-double-row.html">https://zfe.space/post/hexo-butterfly-article-double-row.html</a><br>作者：小冰博客（しゅふがく）</p></blockquote><hr><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p>首页文章列表从单栏变成双栏卡片布局：</p><ul><li>文章卡片左右两列排列</li><li>卡片圆角 + 阴影</li><li>封面图在左，标题&#x2F;摘要在右</li><li>宽屏屏幕下更紧凑美观</li></ul><hr><h2 id="NPM-插件安装"><a href="#NPM-插件安装" class="headerlink" title="NPM 插件安装"></a>NPM 插件安装</h2><p>在博客根目录下打开终端，运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm i hexo-butterfly-article-double-row --save</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或者</span></span><br><span class="line">cnpm i hexo-butterfly-article-double-row --save</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：一定要加 <code>--save</code>，不然本地预览时可能不会显示！</p></blockquote><hr><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>在博客根目录 <code>_config.yml</code> 中添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">butterfly_article_double_row:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><hr><h2 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h2><p>执行 hexo 三连：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo g &amp;&amp; hexo s</span><br></pre></td></tr></table></figure><p>即可看到首页文章列表变成双栏布局。</p><hr><h2 id="展示效果优化（本站实践）"><a href="#展示效果优化（本站实践）" class="headerlink" title="展示效果优化（本站实践）"></a>展示效果优化（本站实践）</h2><p>原插件注入的 <code>cardlistpost.min.css</code> 存在三处问题，本站新增<br><code>source/css/double_row.css</code> 在其之后加载并覆盖：</p><table><thead><tr><th>问题</th><th>原始写法</th><th>修正</th></tr></thead><tbody><tr><td>封面尺寸规则失效</td><td><code>img.post_bg</code>（下划线）</td><td>主题实际类名是 <code>img.post-bg</code>（连字符），已补上正确选择器</td></tr><tr><td>内容概述被整段隐藏</td><td><code>&gt;.content{display:none}</code></td><td>改为 <code>-webkit-line-clamp:3</code> 显示三行概述，与首页 description 导读一致</td></tr><tr><td>封面被拉变形</td><td>固定 <code>height:200px</code>，无 <code>object-fit</code></td><td>改用 <code>aspect-ratio:16/9</code> + <code>object-fit:cover</code></td></tr></tbody></table><p>另外补充：卡片悬停上浮、封面图片缓慢放大、标题最多两行省略、<br>≤900px 自动回退单列，以及保证 swiper 轮播与分类磁贴不被 flex 双栏挤压。</p><blockquote><p>修改的文件：<code>source/css/double_row.css</code>（新增），<br>并在 <code>_config.butterfly.yml</code> 的 <code>inject.head</code> 中引入该样式。</p></blockquote>]]></content>
    
    
    <summary type="html">Butterfly 主题文章双栏布局的实现：通过 hexo-butterfly-article-double-row 插件把首页文章卡片改为两列瀑布流，含安装、根目录 _config.yml 开关配置与移动端单列回退处理。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>音乐可视化APlayer</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E9%9F%B3%E4%B9%90%E5%8F%AF%E8%A7%86%E5%8C%96APlayer/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E9%9F%B3%E4%B9%90%E5%8F%AF%E8%A7%86%E5%8C%96APlayer/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T15:59:45.379Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：APlayer-×-Meting-×-JustAddMusic-音乐可视化"><a href="#教程：APlayer-×-Meting-×-JustAddMusic-音乐可视化" class="headerlink" title="教程：APlayer × Meting × JustAddMusic 音乐可视化"></a>教程：APlayer × Meting × JustAddMusic 音乐可视化</h1><blockquote><p>原文链接：<a href="https://zfe.space/post/18661.html">https://zfe.space/post/18661.html</a><br>作者：小冰博客（しゅふがく）</p></blockquote><hr><h2 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h2><ul><li>Github Pages Demo：<a href="https://zfour.github.io/APlayer-Meting-JustAddMusic/">https://zfour.github.io/APlayer-Meting-JustAddMusic/</a></li><li>个人主页 Demo：<a href="https://zfe.space/">https://zfe.space</a></li><li>Butterfly 主题 Demo：<a href="https://zfe.space/">https://zfe.space</a></li></ul><h3 id="依赖"><a href="#依赖" class="headerlink" title="依赖"></a>依赖</h3><ul><li><a href="https://github.com/DIYgod/APlayer">APlayer</a></li><li><a href="https://github.com/metowolf/MetingJS">MetingJS</a></li><li><a href="https://github.com/beautifulHelp/JustAddMusic">JustAddMusic</a></li></ul><hr><h2 id="一步安装到-Hexo（Butterfly-主题为例）"><a href="#一步安装到-Hexo（Butterfly-主题为例）" class="headerlink" title="一步安装到 Hexo（Butterfly 主题为例）"></a>一步安装到 Hexo（Butterfly 主题为例）</h2><ol><li><p>从 <a href="https://github.com/Zfour/APlayer-Meting-JustAddMusic">https://github.com/Zfour/APlayer-Meting-JustAddMusic</a> 克隆项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/Zfour/APlayer-Meting-JustAddMusic.git</span><br></pre></td></tr></table></figure></li><li><p>将项目存放于博客根目录的 <code>source</code> 文件夹下</p></li><li><p>将 <code>Hexo page</code> 文件夹里的 <code>music</code> 文件夹复制后，粘贴到 <code>source</code> 文件夹下</p></li></ol><p>大功告成！</p><hr><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ul><li>如果你开启了主题的 APlayer 插件，请关掉或在本页面禁用</li><li>本项目仍处于测试阶段，请使用能够正常播放（非 VIP 歌曲）的 playlist 播放</li><li>歌曲封面旋转、歌词滚动、频谱可视化等效果会自动生效</li></ul><hr><h2 id="页面结构"><a href="#页面结构" class="headerlink" title="页面结构"></a>页面结构</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">source/</span><br><span class="line">├── APlayer-Meting-JustAddMusic/</span><br><span class="line">│   ├── css/</span><br><span class="line">│   │   ├── APlayer.min.css</span><br><span class="line">│   │   ├── font-awesome.min.css</span><br><span class="line">│   │   └── justaddmusic.css</span><br><span class="line">│   ├── js/</span><br><span class="line">│   │   ├── APlayer.min.jam.js</span><br><span class="line">│   │   ├── JustAddMusic.js</span><br><span class="line">│   │   ├── Meting.min.js</span><br><span class="line">│   │   ├── jamsetting.js</span><br><span class="line">│   │   ├── jquary.js</span><br><span class="line">│   │   ├── visualchanger.js</span><br><span class="line">│   │   └── visualupper.js</span><br><span class="line">│   └── fonts/</span><br><span class="line">└── music/</span><br><span class="line">    └── index.md</span><br></pre></td></tr></table></figure><hr><h2 id="自定义配置"><a href="#自定义配置" class="headerlink" title="自定义配置"></a>自定义配置</h2><p>编辑 <code>music/index.md</code>，修改 <code>&#123;% meting %&#125;</code> 标签中的歌单 ID：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% meting &quot;你的歌单ID&quot; &quot;netease&quot; &quot;playlist&quot; &quot;order:random&quot; %&#125;</span><br></pre></td></tr></table></figure><p>参数说明：</p><ul><li>第一个参数：歌单 ID</li><li>第二个参数：音乐源（netease &#x2F; tencent &#x2F; kugou &#x2F; xiami &#x2F; baidu）</li><li>第三个参数：类型（playlist &#x2F; song &#x2F; album &#x2F; search）</li><li>第四个参数：排序方式</li></ul>]]></content>
    
    
    <summary type="html">APlayer × Meting × JustAddMusic 音乐可视化方案：用 APlayer 做播放器、MetingJS 解析网易云歌单、JustAddMusic 提供音频频谱可视化，介绍依赖安装、butterfly 接入与常见播放失败排查。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>历史上的今天</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E5%8E%86%E5%8F%B2%E4%B8%8A%E7%9A%84%E4%BB%8A%E5%A4%A9/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E5%8E%86%E5%8F%B2%E4%B8%8A%E7%9A%84%E4%BB%8A%E5%A4%A9/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T15:59:45.377Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：基于-Butterfly-主题的历史上的今天侧边栏小部件"><a href="#教程：基于-Butterfly-主题的历史上的今天侧边栏小部件" class="headerlink" title="教程：基于 Butterfly 主题的历史上的今天侧边栏小部件"></a>教程：基于 Butterfly 主题的历史上的今天侧边栏小部件</h1><blockquote><p>原文链接：<a href="https://zfe.space/post/42391.html">https://zfe.space/post/42391.html</a><br>作者：小冰博客（しゅふがく）</p></blockquote><hr><h2 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h2><p>做这个小部件的目的是学习 AJAX 跨域访问 API，但实际上很难弄。<br>最终采用本地读取 JSON 的方法，制作了这个小部件。</p><p>相比单独写一个页面，侧边栏小部件更具有观赏性。</p><p>JSON 使用的是原生百度百科 API 下载的 JSON，自带百度百科链接。</p><h3 id="API-地址"><a href="#API-地址" class="headerlink" title="API 地址"></a>API 地址</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://baike.baidu.com/cms/home/eventsOnHistory/09.json</span><br></pre></td></tr></table></figure><p>后面的数字代表月份（01-12）。</p><hr><h2 id="步骤-1：编写小部件-PUG"><a href="#步骤-1：编写小部件-PUG" class="headerlink" title="步骤 1：编写小部件 PUG"></a>步骤 1：编写小部件 PUG</h2><p>在 <code>themes/butterfly/layout/includes/widget</code> 文件夹下复制某个 PUG 文件，重命名为 <code>card_history.pug</code>，删除原有代码，粘贴以下代码（注意 PUG 的空格敏感）：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">if theme.aside.card_history.enable</span><br><span class="line">  !=partial(&#x27;includes/widget/card_history&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br></pre></td></tr></table></figure><hr><h2 id="步骤-2：将小部件植入侧边栏"><a href="#步骤-2：将小部件植入侧边栏" class="headerlink" title="步骤 2：将小部件植入侧边栏"></a>步骤 2：将小部件植入侧边栏</h2><p>打开 <code>themes/butterfly/layout/includes/widget/index.pug</code>，将 <code>card_history</code> 代码添加至 <code>card_author</code> 代码块后：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">#aside_content.aside_content</span><br><span class="line">  if page.aside !== false</span><br><span class="line">    #aside_content.aside_content</span><br><span class="line">      if theme.aside.card_author.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_history.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_history&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_announcement.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_announcement&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_recent_post.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.ad &amp;&amp; theme.ad.aside</span><br><span class="line">        !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_categories.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_categories&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_tags.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_tags&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_archives.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_archives&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br><span class="line"></span><br><span class="line">      if theme.aside.card_webinfo.enable</span><br><span class="line">        !=partial(&#x27;includes/widget/card_webinfo&#x27;, &#123;&#125;, &#123;cache: theme.fragment_cache&#125;)</span><br></pre></td></tr></table></figure><p>打开 <code>themes/butterfly/_config.yml</code>，搜索 <code>aside:</code> 设置处，添加 history 开关：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="attr">card_history:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><hr><h2 id="步骤-3：本地-JSON-配置"><a href="#步骤-3：本地-JSON-配置" class="headerlink" title="步骤 3：本地 JSON 配置"></a>步骤 3：本地 JSON 配置</h2><ol><li>下载 JSON 文件：<a href="https://zfe.space/post/42391.html%EF%BC%88%E9%A1%B5%E9%9D%A2%E5%86%85%E6%9C%89%E4%B8%8B%E8%BD%BD%E9%93%BE%E6%8E%A5%EF%BC%89">https://zfe.space/post/42391.html（页面内有下载链接）</a></li><li>在博客根目录 <code>source</code> 文件夹下新建 <code>history</code> 文件夹</li><li>在 <code>source/history</code> 路径下解压 JSON.zip</li></ol><blockquote><p><strong>注意</strong>：此 JSON 为修改过的版本，删除了一层数组外壳，对日期键值加入了 “S” 使其非数字化。</p></blockquote><hr><h2 id="步骤-4：编写-JS"><a href="#步骤-4：编写-JS" class="headerlink" title="步骤 4：编写 JS"></a>步骤 4：编写 JS</h2><p>在 <code>source</code> 文件夹下新建 <code>js</code> 文件夹，新建 <code>history.js</code>：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> myDate = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"><span class="keyword">var</span> myMonth = myDate.<span class="title function_">getMonth</span>() + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span> (myMonth &lt; <span class="number">10</span>) &#123;</span><br><span class="line">  getMonth = <span class="string">&quot;0&quot;</span> + <span class="title class_">String</span>(myMonth);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  getMonth = <span class="title class_">String</span>(myMonth);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> getDate = <span class="title class_">String</span>(myDate.<span class="title function_">getDate</span>());</span><br><span class="line"><span class="keyword">if</span> (getDate &lt; <span class="number">10</span>) &#123;</span><br><span class="line">  getDate = <span class="string">&quot;0&quot;</span> + <span class="title class_">String</span>(getDate);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">  getDate = <span class="title class_">String</span>(getDate);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> getMonthDate = <span class="string">&quot;S&quot;</span> + getMonth + getDate;</span><br><span class="line"><span class="keyword">var</span> geturl = <span class="string">&quot;/history/json/&quot;</span> + getMonth + <span class="string">&quot;.json&quot;</span>;</span><br><span class="line"></span><br><span class="line">$(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  $.<span class="title function_">ajax</span>(&#123;</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&quot;GET&quot;</span>,</span><br><span class="line">    <span class="attr">url</span>: geturl,</span><br><span class="line">    <span class="attr">dataType</span>: <span class="string">&quot;json&quot;</span>,</span><br><span class="line">    <span class="attr">success</span>: <span class="keyword">function</span> (<span class="params">data</span>) &#123;</span><br><span class="line">      <span class="keyword">var</span> str = <span class="string">&#x27;&lt;ul style=&quot;list-style: none;padding-inline-start: 0px;&quot;&gt;&#x27;</span>;</span><br><span class="line">      $.<span class="title function_">each</span>(data[getMonthDate], <span class="keyword">function</span> (<span class="params">i, n</span>) &#123;</span><br><span class="line">        str += <span class="string">&#x27;&lt;li style=&quot;list-style: none;height:100px;&quot;&gt;&#x27;</span>;</span><br><span class="line">        str +=</span><br><span class="line">          <span class="string">&#x27;&lt;p style=&quot;color: #858585;Font-style:italic;font-weight:lighter;float:left;width:100%;font-size: 14px;margin:0px; padding:0px;display:inline-block&quot;&gt;&#x27;</span>;</span><br><span class="line">        str += <span class="string">&quot;&lt;i&gt;A.D.&lt;/i&gt;&quot;</span> + n.<span class="property">year</span> + <span class="string">&quot;&lt;/p&gt;&quot;</span>;</span><br><span class="line">        str +=</span><br><span class="line">          <span class="string">&#x27;&lt;p style=&quot;width:100%;float:left;margin:0px; padding:0px;display:inline-block&quot; &gt;&#x27;</span>;</span><br><span class="line">        str += n.<span class="property">title</span> + <span class="string">&#x27;&lt;i style=&quot;Font-style:normal;&quot;&gt;。&lt;/i&gt;&#x27;</span>;</span><br><span class="line">        str += <span class="string">&quot;&lt;/p&gt;&quot;</span> + <span class="string">&quot;&lt;/li&gt;&quot;</span>;</span><br><span class="line">      &#125;);</span><br><span class="line">      str += <span class="string">&quot;&lt;/ul&gt;&quot;</span>;</span><br><span class="line">      $(<span class="string">&quot;#history-card&quot;</span>).<span class="title function_">append</span>(str);</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><p>在 <code>source/js</code> 文件夹新建 <code>historyroll.js</code>（自动滚动效果）：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> $this = $(<span class="string">&quot;#history-news&quot;</span>);</span><br><span class="line">  <span class="keyword">var</span> scrollTimer;</span><br><span class="line">  $this</span><br><span class="line">    .<span class="title function_">hover</span>(</span><br><span class="line">      <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        <span class="built_in">clearInterval</span>(scrollTimer);</span><br><span class="line">      &#125;,</span><br><span class="line">      <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        scrollTimer = <span class="built_in">setInterval</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">          <span class="title function_">scrollNews</span>($this);</span><br><span class="line">        &#125;, <span class="number">4000</span>);</span><br><span class="line">      &#125;</span><br><span class="line">    )</span><br><span class="line">    .<span class="title function_">trigger</span>(<span class="string">&quot;mouseleave&quot;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">scrollNews</span>(<span class="params">obj</span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> $self = obj.<span class="title function_">find</span>(<span class="string">&quot;ul&quot;</span>);</span><br><span class="line">    <span class="keyword">var</span> lineHeight = $self.<span class="title function_">find</span>(<span class="string">&quot;li:first&quot;</span>).<span class="title function_">height</span>();</span><br><span class="line">    $self.<span class="title function_">animate</span>(</span><br><span class="line">      &#123; <span class="attr">marginTop</span>: -lineHeight + <span class="string">&quot;px&quot;</span> &#125;,</span><br><span class="line">      <span class="number">200</span>,</span><br><span class="line">      <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">        $self</span><br><span class="line">          .<span class="title function_">css</span>(&#123; <span class="attr">marginTop</span>: <span class="number">10</span> &#125;)</span><br><span class="line">          .<span class="title function_">find</span>(<span class="string">&quot;li:first&quot;</span>)</span><br><span class="line">          .<span class="title function_">appendTo</span>($self);</span><br><span class="line">      &#125;</span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><hr><h2 id="步骤-5：接入-JS"><a href="#步骤-5：接入-JS" class="headerlink" title="步骤 5：接入 JS"></a>步骤 5：接入 JS</h2><p>打开 <code>themes/butterfly/_config.yml</code>，搜索 <code>inject:</code> 设置处，添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">inject:</span></span><br><span class="line">  <span class="attr">bottom:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/js/history.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/js/historyroll.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><hr><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><ul><li>侧边栏显示当天日期对应的历史事件</li><li>每条显示年份 + 事件标题</li><li>每 4 秒自动滚动一条</li><li>鼠标悬停暂停滚动</li></ul>]]></content>
    
    
    <summary type="html">基于 Butterfly 主题的「历史上的今天」侧边栏小部件：从百度百科 API 下载按月分组的 JSON，用原生 fetch 读取当日事件并按年份倒序轮播展示，无需第三方跨域接口，稳定且可离线。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>电子时钟插件</title>
    <link href="https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E7%94%B5%E5%AD%90%E6%97%B6%E9%92%9F%E6%8F%92%E4%BB%B6/"/>
    <id>https://biko-duckyo.github.io/2026/10/09/%E6%95%99%E7%A8%8B-%E7%94%B5%E5%AD%90%E6%97%B6%E9%92%9F%E6%8F%92%E4%BB%B6/</id>
    <published>2026-10-09T02:00:00.000Z</published>
    <updated>2026-10-11T15:59:45.379Z</updated>
    
    <content type="html"><![CDATA[<h1 id="教程：hexo-electric-clock-电子时钟插件"><a href="#教程：hexo-electric-clock-电子时钟插件" class="headerlink" title="教程：hexo-electric-clock 电子时钟插件"></a>教程：hexo-electric-clock 电子时钟插件</h1><blockquote><p>原文链接：<a href="https://zfe.space/post/hexo-electric-clock.html">https://zfe.space/post/hexo-electric-clock.html</a><br>作者：小冰博客（しゅふがく）</p></blockquote><hr><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>基于 npm 插件方式部署的侧边栏电子时钟，自动挂载到侧边栏。</p><h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><ul><li>LED 数码管字体显示时间</li><li>天气图标 + 温度</li><li>湿度</li><li>IP 地址 + 地理位置</li><li>AM&#x2F;PM 标识</li></ul><hr><h2 id="NPM-插件安装"><a href="#NPM-插件安装" class="headerlink" title="NPM 插件安装"></a>NPM 插件安装</h2><p>在博客根目录下打开终端，运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm i hexo-electric-clock --save</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或者</span></span><br><span class="line">cnpm i hexo-electric-clock --save</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：一定要加 <code>--save</code>，不然本地预览时可能不会显示！</p></blockquote><hr><h2 id="配置项"><a href="#配置项" class="headerlink" title="配置项"></a>配置项</h2><p>在博客根目录 <code>_config.yml</code>（不是主题配置文件）中添加：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">electric_clock:</span></span><br><span class="line">  <span class="attr">priority:</span> <span class="number">5</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">enable_page:</span> <span class="string">all</span></span><br><span class="line">  <span class="attr">layout:</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">class</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">sticky_layout</span></span><br><span class="line">    <span class="attr">index:</span> <span class="number">0</span></span><br><span class="line">  <span class="attr">temple_html:</span> <span class="string">&#x27;&lt;div class=&quot;card-widget card-clock&quot;&gt;&lt;div class=&quot;card-glass&quot;&gt;&lt;div class=&quot;card-background&quot;&gt;&lt;div class=&quot;card-content&quot;&gt;&lt;div id=&quot;hexo_electric_clock&quot;&gt;&lt;img id=&quot;card-clock-loading&quot; src=&quot;https://cdn.jsdelivr.net/gh/Zfour/Butterfly-clock/clock/images/weather/loading.gif&quot; style=&quot;height: 120px; width: 100%;&quot; data-ll-status=&quot;loading&quot; class=&quot;entered loading&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#x27;</span></span><br></pre></td></tr></table></figure><hr><h2 id="参数说明"><a href="#参数说明" class="headerlink" title="参数说明"></a>参数说明</h2><table><thead><tr><th>参数</th><th>类型</th><th>说明</th></tr></thead><tbody><tr><td><code>enable</code></td><td>true&#x2F;false</td><td>是否开启插件</td></tr><tr><td><code>enable_page</code></td><td>all &#x2F; path</td><td>路由地址，all 代表全局开启，如 <code>/</code> 代表主页</td></tr><tr><td><code>priority</code></td><td>number</td><td>插件叠放顺序，数字越大越靠前</td></tr><tr><td><code>layout.type</code></td><td>id &#x2F; class</td><td>挂载容器类型</td></tr><tr><td><code>layout.name</code></td><td>text</td><td>容器名称</td></tr><tr><td><code>layout.index</code></td><td>number</td><td>第几个容器（class 类型时使用）</td></tr><tr><td><code>temple_html</code></td><td>html</td><td>挂载容器模板</td></tr></tbody></table><hr><h2 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h2><p>执行 hexo 三连：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo g &amp;&amp; hexo s</span><br></pre></td></tr></table></figure><p>即可看到侧边栏电子时钟效果。</p>]]></content>
    
    
    <summary type="html">基于 hexo-electric-clock 的侧边栏电子时钟插件：LED 数码管字体显示时间、天气图标与温度、湿度、IP 地址与地理位置、AM/PM 标识，以及插件挂载位置等配置项说明。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="教程" scheme="https://biko-duckyo.github.io/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>Butterfly 标签外挂使用手册</title>
    <link href="https://biko-duckyo.github.io/2026/10/06/Butterfly%E6%A0%87%E7%AD%BE%E9%80%9F%E6%9F%A5/"/>
    <id>https://biko-duckyo.github.io/2026/10/06/Butterfly%E6%A0%87%E7%AD%BE%E9%80%9F%E6%9F%A5/</id>
    <published>2026-10-06T06:00:00.000Z</published>
    <updated>2026-10-05T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>标签外挂是 Hexo 独有功能，不是标准 Markdown，只在 Butterfly 主题生效。</p><hr><h2 id="Note-提示块"><a href="#Note-提示块" class="headerlink" title="Note 提示块"></a>Note 提示块</h2><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note [颜色] [图标] [样式] %&#125;</span><br><span class="line">内容</span><br><span class="line">&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><h3 id="三种样式对比"><a href="#三种样式对比" class="headerlink" title="三种样式对比"></a>三种样式对比</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">simple</button><button type="button" class="tab">modern</button><button type="button" class="tab">flat</button></div><div class="tab-contents"><div class="tab-item-content active"><p>经典风格，左侧色块。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note simple %&#125;默认提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note primary simple %&#125;主要提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note success simple %&#125;成功提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note info simple %&#125;信息提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note warning simple %&#125;警告提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note danger simple %&#125;危险提示&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><p>圆角卡片风格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note modern %&#125;默认提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note success modern %&#125;成功提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note warning modern %&#125;警告提示&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><p>扁平背景风格。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note flat %&#125;默认提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note success flat %&#125;成功提示&#123;% endnote %&#125;</span><br><span class="line">&#123;% note warning flat %&#125;警告提示&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="自定义图标"><a href="#自定义图标" class="headerlink" title="自定义图标"></a>自定义图标</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note blue &#x27;fas fa-bullhorn&#x27; %&#125;📢 通知内容&#123;% endnote %&#125;</span><br><span class="line">&#123;% note pink &#x27;fas fa-car-crash&#x27; %&#125;⚠️ 小心安全&#123;% endnote %&#125;</span><br><span class="line">&#123;% note green &#x27;fab fa-github&#x27; %&#125;GitHub 仓库&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p>可选颜色：default &#x2F; blue &#x2F; pink &#x2F; red &#x2F; purple &#x2F; orange &#x2F; green</p><p>图标用 FontAwesome 类名。</p><hr><h2 id="Tabs-标签切换"><a href="#Tabs-标签切换" class="headerlink" title="Tabs 标签切换"></a>Tabs 标签切换</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs 唯一名称, 默认激活序号 %&#125;</span><br><span class="line">&lt;!-- tab 选项1 --&gt;</span><br><span class="line">内容1</span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab 选项2 --&gt;</span><br><span class="line">内容2</span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><blockquote><p>名称不能重复，每篇文章里只能用一次同名 tabs。</p></blockquote><hr><h2 id="Gallery-相册"><a href="#Gallery-相册" class="headerlink" title="Gallery 相册"></a>Gallery 相册</h2><h3 id="相册组"><a href="#相册组" class="headerlink" title="相册组"></a>相册组</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;gallery-group-main&quot;</span>&gt;</span></span><br><span class="line">&#123;% galleryGroup 名称 描述 链接 封面图 %&#125;</span><br><span class="line">&#123;% galleryGroup 名称 描述 链接 封面图 %&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="单相册"><a href="#单相册" class="headerlink" title="单相册"></a>单相册</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&#123;% gallery %&#125;</span><br><span class="line">![图1](/img/1.jpg)</span><br><span class="line">![图2](/img/2.jpg)</span><br><span class="line">&#123;% endgallery %&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="按钮"><a href="#按钮" class="headerlink" title="按钮"></a>按钮</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% btn https://github.com, 访问 GitHub, fab fa-github %&#125;</span><br></pre></td></tr></table></figure><table><thead><tr><th>参数</th><th>说明</th></tr></thead><tbody><tr><td>链接</td><td>跳转地址</td></tr><tr><td>文本</td><td>按钮文字</td></tr><tr><td>图标</td><td>FontAwesome 图标类名</td></tr></tbody></table><hr><h2 id="复选框"><a href="#复选框" class="headerlink" title="复选框"></a>复选框</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% check 完成的任务 %&#125;</span><br><span class="line">&#123;% check 未完成的任务 %&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="文字样式"><a href="#文字样式" class="headerlink" title="文字样式"></a>文字样式</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;% bold 加粗文字 %&#125;</span><br><span class="line">&#123;% underline 下划线文字 %&#125;</span><br><span class="line">&#123;% delete 删除线文字 %&#125;</span><br><span class="line">&#123;% sup 上标 %&#125;</span><br><span class="line">&#123;% sub 下标 %&#125;</span><br><span class="line">&#123;% inlinebug 标签 %&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="行内代码高亮"><a href="#行内代码高亮" class="headerlink" title="行内代码高亮"></a>行内代码高亮</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% kb Ctrl %&#125; + &#123;% kb C %&#125;</span><br></pre></td></tr></table></figure><p>显示为 <code>Ctrl + C</code> 键盘按键样式。</p><hr><h2 id="常用速查表"><a href="#常用速查表" class="headerlink" title="常用速查表"></a>常用速查表</h2><table><thead><tr><th>标签</th><th>用途</th></tr></thead><tbody><tr><td><code>&#123;% note %&#125;</code></td><td>提示块</td></tr><tr><td><code>&#123;% tabs %&#125;</code></td><td>标签切换</td></tr><tr><td><code>&#123;% gallery %&#125;</code></td><td>相册</td></tr><tr><td><code>&#123;% btn %&#125;</code></td><td>按钮</td></tr><tr><td><code>&#123;% check %&#125;</code></td><td>复选框</td></tr><tr><td><code>&#123;% checkbox %&#125;</code></td><td>勾选框</td></tr><tr><td><code>&#123;% timeline %&#125;</code></td><td>时间线</td></tr><tr><td><code>&#123;% button %&#125;</code></td><td>下载按钮</td></tr></tbody></table>]]></content>
    
    
    <summary type="html">Butterfly 标签外挂使用手册：Note 提示块（simple / modern 等多种样式）、Tabs 分栏、Button、Gallery、Timeline、Mermaid、Hide 等外挂标签的语法与效果速查，写文章时随查随用。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="标签外挂" scheme="https://biko-duckyo.github.io/tags/%E6%A0%87%E7%AD%BE%E5%A4%96%E6%8C%82/"/>
    
  </entry>
  
  <entry>
    <title>Butterfly 主题安装与基础配置</title>
    <link href="https://biko-duckyo.github.io/2026/10/06/Butterfly%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/"/>
    <id>https://biko-duckyo.github.io/2026/10/06/Butterfly%E5%AE%89%E8%A3%85%E4%B8%8E%E9%85%8D%E7%BD%AE/</id>
    <published>2026-10-06T03:00:00.000Z</published>
    <updated>2026-10-08T06:27:13.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装主题"><a href="#安装主题" class="headerlink" title="安装主题"></a>安装主题</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">Git 安装（推荐）</button><button type="button" class="tab">NPM 安装</button><button type="button" class="tab">Gitee 镜像</button></div><div class="tab-contents"><div class="tab-item-content active"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly</span><br></pre></td></tr></table></figure><p>升级：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> themes/butterfly</span><br><span class="line">git pull</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i hexo-theme-butterfly</span><br></pre></td></tr></table></figure><p>升级：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm update hexo-theme-butterfly</span><br></pre></td></tr></table></figure><blockquote><p>NPM 安装文件在 node_modules 里，不在 themes 目录。</p></blockquote></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> -b master https://gitee.com/immyw/hexo-theme-butterfly.git themes/butterfly</span><br></pre></td></tr></table></figure><p>适合国内网络慢的情况。</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h2 id="应用主题"><a href="#应用主题" class="headerlink" title="应用主题"></a>应用主题</h2><p>修改根目录 <code>_config.yml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">theme:</span> <span class="string">butterfly</span></span><br></pre></td></tr></table></figure><h2 id="安装渲染器"><a href="#安装渲染器" class="headerlink" title="安装渲染器"></a>安装渲染器</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-renderer-pug hexo-renderer-stylus --save</span><br></pre></td></tr></table></figure><h2 id="配置文件分离（重要）"><a href="#配置文件分离（重要）" class="headerlink" title="配置文件分离（重要）"></a>配置文件分离（重要）</h2><p>在根目录创建 <code>_config.butterfly.yml</code>，把主题目录的 <code>_config.yml</code> 内容复制进去。</p><p><strong>好处</strong>：升级主题时不会覆盖你的配置。</p><hr><h2 id="固定文章链接（abbrlink）"><a href="#固定文章链接（abbrlink）" class="headerlink" title="固定文章链接（abbrlink）"></a>固定文章链接（abbrlink）</h2><p>中文标题会导致 URL 乱码，改标题后链接失效。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-abbrlink --save</span><br></pre></td></tr></table></figure><p>修改 <code>_config.yml</code>：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">permalink:</span> <span class="string">post/:abbrlink.html</span></span><br><span class="line"></span><br><span class="line"><span class="attr">abbrlink:</span></span><br><span class="line">  <span class="attr">alg:</span> <span class="string">crc32</span>   <span class="comment"># 算法：crc16 / crc32</span></span><br><span class="line">  <span class="attr">rep:</span> <span class="string">hex</span>     <span class="comment"># 进制：dec / hex</span></span><br></pre></td></tr></table></figure><p>效果：链接变成 <code>https://xxx/post/abc123.html</code>，简洁稳定。</p><hr><h2 id="代码块配置"><a href="#代码块配置" class="headerlink" title="代码块配置"></a>代码块配置</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab">darker</button><button type="button" class="tab">pale night</button><button type="button" class="tab">light</button><button type="button" class="tab active">ocean</button><button type="button" class="tab">mac</button><button type="button" class="tab">mac light</button></div><div class="tab-contents"><div class="tab-item-content"><p>深色背景，亮色文字，经典深色风。</p></div><div class="tab-item-content"><p>柔和深色，护眼底色。</p></div><div class="tab-item-content"><p>浅色背景，适合亮色主题。</p></div><div class="tab-item-content active"><p>海洋蓝色调。</p></div><div class="tab-item-content"><p>Mac 风格深色（推荐）。</p></div><div class="tab-item-content"><p>Mac 风格浅色。</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">mac</span></span><br><span class="line"><span class="attr">highlight_copy:</span> <span class="literal">true</span>       <span class="comment"># 代码复制按钮</span></span><br><span class="line"><span class="attr">highlight_height_limit:</span> <span class="number">300</span> <span class="comment"># 代码高度限制(px)</span></span><br></pre></td></tr></table></figure><hr><h2 id="顶部图配置"><a href="#顶部图配置" class="headerlink" title="顶部图配置"></a>顶部图配置</h2><table><thead><tr><th>配置项</th><th>说明</th></tr></thead><tbody><tr><td><code>index_img</code></td><td>主页顶部图</td></tr><tr><td><code>default_top_img</code></td><td>默认顶部图</td></tr><tr><td><code>archive_img</code></td><td>归档页顶部图</td></tr><tr><td><code>tag_img</code></td><td>标签页默认顶部图</td></tr><tr><td><code>category_img</code></td><td>分类页默认顶部图</td></tr></tbody></table><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">index_img:</span> <span class="string">/img/banner.jpg</span></span><br><span class="line"><span class="attr">default_top_img:</span> <span class="string">/img/default-bg.jpg</span></span><br></pre></td></tr></table></figure><p>单篇文章单独设置（front-matter）：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">文章标题</span></span><br><span class="line"><span class="attr">top_img:</span> <span class="string">/img/post-special.jpg</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><hr><h2 id="页脚背景"><a href="#页脚背景" class="headerlink" title="页脚背景"></a>页脚背景</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">footer_bg:</span> <span class="literal">true</span>   <span class="comment"># 页脚显示图片背景</span></span><br></pre></td></tr></table></figure><hr><h2 id="打字粒子特效"><a href="#打字粒子特效" class="headerlink" title="打字粒子特效"></a>打字粒子特效</h2><p>鼠标点击时的粒子爆炸效果：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">activate_power_mode:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">colorful:</span> <span class="literal">true</span>    <span class="comment"># 彩色粒子</span></span><br><span class="line">  <span class="attr">shake:</span> <span class="literal">true</span>       <span class="comment"># 抖动效果</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span>     <span class="comment"># 手机端关闭</span></span><br></pre></td></tr></table></figure><hr><h2 id="背景特效"><a href="#背景特效" class="headerlink" title="背景特效"></a>背景特效</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">静止彩带</button><button type="button" class="tab">动态飘动彩带</button><button type="button" class="tab">Nest 粒子连线</button></div><div class="tab-contents"><div class="tab-item-content active"><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">canvas_ribbon:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">size:</span> <span class="number">150</span></span><br><span class="line">  <span class="attr">alpha:</span> <span class="number">0.6</span></span><br><span class="line">  <span class="attr">zIndex:</span> <span class="number">-1</span></span><br><span class="line">  <span class="attr">click_to_change:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>静态几何线条，点击可切换。</p></div><div class="tab-item-content"><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">canvas_fluttering_ribbon:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">mobile:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>彩带随风飘动，更生动。</p></div><div class="tab-item-content"><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">canvas_nest:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">onmobile:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">color:</span> <span class="string">&#x27;0,0,255&#x27;</span></span><br><span class="line">  <span class="attr">opacity:</span> <span class="number">0.7</span></span><br><span class="line">  <span class="attr">zIndex:</span> <span class="number">-1</span></span><br><span class="line">  <span class="attr">count:</span> <span class="number">99</span></span><br></pre></td></tr></table></figure><p>鼠标跟随粒子连线动画。</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><blockquote><p>提示：特效越多加载越慢，手机端建议只开一个或全关。</p></blockquote>]]></content>
    
    
    <summary type="html">Butterfly 主题从零开始的安装与基础配置：Git / NPM / Gitee 镜像三种安装方式、升级方法，以及主题配置文件 _config.butterfly.yml 的常规项说明，适合刚搭好 Hexo 后的第一步动手实践。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="Butterfly" scheme="https://biko-duckyo.github.io/tags/Butterfly/"/>
    
    <category term="主题配置" scheme="https://biko-duckyo.github.io/tags/%E4%B8%BB%E9%A2%98%E9%85%8D%E7%BD%AE/"/>
    
  </entry>
  
  <entry>
    <title>Hexo + GitHub 搭建个人博客完整指南</title>
    <link href="https://biko-duckyo.github.io/2026/10/06/Hexo+GitHub%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/"/>
    <id>https://biko-duckyo.github.io/2026/10/06/Hexo+GitHub%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/</id>
    <published>2026-10-06T02:00:00.000Z</published>
    <updated>2026-10-05T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><h3 id="Node-js"><a href="#Node-js" class="headerlink" title="Node.js"></a>Node.js</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">Windows</button><button type="button" class="tab">Mac</button><button type="button" class="tab">Linux</button></div><div class="tab-contents"><div class="tab-item-content active"><p>推荐使用 nvs（Node Version Switcher）管理版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 nvs</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/jasongin/nvs.git</span><br><span class="line"><span class="built_in">cd</span> nvs</span><br><span class="line">./nvs.sh add lts</span><br><span class="line">nvs use lts</span><br></pre></td></tr></table></figure><p>或直接去 <a href="https://nodejs.org/">nodejs.org</a> 下载 LTS 安装包。</p></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 Homebrew</span></span><br><span class="line">brew install node</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">node -v</span><br><span class="line">npm -v</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Debian</span></span><br><span class="line">curl -fsSL https://deb.nodesource.com/setup_lts.x | <span class="built_in">sudo</span> -E bash -</span><br><span class="line"><span class="built_in">sudo</span> apt install -y nodejs</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install nodejs</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h3><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">Windows</button><button type="button" class="tab">Mac</button><button type="button" class="tab">Linux</button></div><div class="tab-contents"><div class="tab-item-content active"><p>去 <a href="https://git-scm.com/">git-scm.com</a> 下载安装包，一路下一步。<br>安装后右键菜单会出现 “Git Bash Here”。</p></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install git</span><br></pre></td></tr></table></figure></div><div class="tab-item-content"><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Debian</span></span><br><span class="line"><span class="built_in">sudo</span> apt install git</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install git</span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><hr><h2 id="安装-Hexo"><a href="#安装-Hexo" class="headerlink" title="安装 Hexo"></a>安装 Hexo</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 替换 npm 源为国内镜像</span></span><br><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmmirror.com</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局安装 hexo-cli</span></span><br><span class="line">npm install hexo-cli -g</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">hexo -v</span><br></pre></td></tr></table></figure><h2 id="初始化博客"><a href="#初始化博客" class="headerlink" title="初始化博客"></a>初始化博客</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 新建博客文件夹（建议非系统盘）</span></span><br><span class="line"><span class="built_in">mkdir</span> D:/blog/superBrain</span><br><span class="line"><span class="built_in">cd</span> D:/blog/superBrain</span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化</span></span><br><span class="line">hexo init</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">npm install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 本地预览</span></span><br><span class="line">hexo s</span><br></pre></td></tr></table></figure><p>浏览器打开 <code>http://localhost:4000</code> 看到默认主题即成功。</p><hr><h2 id="部署到-GitHub"><a href="#部署到-GitHub" class="headerlink" title="部署到 GitHub"></a>部署到 GitHub</h2><h3 id="1-新建仓库"><a href="#1-新建仓库" class="headerlink" title="1. 新建仓库"></a>1. 新建仓库</h3><p>仓库名必须是 <code>用户名.github.io</code>，例如 <code>QINchao998314.github.io</code>。</p><h3 id="2-配置-SSH-密钥"><a href="#2-配置-SSH-密钥" class="headerlink" title="2. 配置 SSH 密钥"></a>2. 配置 SSH 密钥</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 生成密钥</span></span><br><span class="line">ssh-keygen -t ed25519 -C <span class="string">&quot;你的邮箱&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看公钥</span></span><br><span class="line"><span class="built_in">cat</span> ~/.ssh/id_ed25519.pub</span><br></pre></td></tr></table></figure><p>复制公钥 → GitHub → Settings → SSH and GPG keys → New SSH key。</p><p>测试连接：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><h3 id="3-配置-Git-用户"><a href="#3-配置-Git-用户" class="headerlink" title="3. 配置 Git 用户"></a>3. 配置 Git 用户</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">&quot;你的用户名&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;你的邮箱&quot;</span></span><br></pre></td></tr></table></figure><h3 id="4-安装部署插件"><a href="#4-安装部署插件" class="headerlink" title="4. 安装部署插件"></a>4. 安装部署插件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><h3 id="5-修改-config-yml"><a href="#5-修改-config-yml" class="headerlink" title="5. 修改 _config.yml"></a>5. 修改 <code>_config.yml</code></h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repository:</span> <span class="string">git@github.com:用户名/用户名.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">main</span></span><br></pre></td></tr></table></figure><h3 id="6-部署命令"><a href="#6-部署命令" class="headerlink" title="6. 部署命令"></a>6. 部署命令</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo clean    <span class="comment"># 清理缓存</span></span><br><span class="line">hexo g        <span class="comment"># 生成静态文件</span></span><br><span class="line">hexo d        <span class="comment"># 部署到 GitHub</span></span><br></pre></td></tr></table></figure><p>访问 <code>https://用户名.github.io</code> 即可。</p><hr><h2 id="常用命令速查"><a href="#常用命令速查" class="headerlink" title="常用命令速查"></a>常用命令速查</h2><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>hexo new &quot;文章标题&quot;</code></td><td>新建文章</td></tr><tr><td><code>hexo new page &quot;页面名&quot;</code></td><td>新建独立页面</td></tr><tr><td><code>hexo g</code></td><td>生成静态文件</td></tr><tr><td><code>hexo s</code></td><td>本地预览</td></tr><tr><td><code>hexo d</code></td><td>部署</td></tr><tr><td><code>hexo clean</code></td><td>清理 public 和 cache</td></tr></tbody></table><hr><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><p><strong>Q: 4000 端口被占用？</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s -p 4001</span><br></pre></td></tr></table></figure><p><strong>Q: 部署后样式丢失？</strong><br>检查 <code>_config.yml</code> 的 <code>url</code> 和 <code>root</code> 配置。</p><p><strong>Q: 文章中文标题 URL 乱码？</strong><br>安装 <code>hexo-abbrlink</code> 生成唯一链接，见 Butterfly 配置篇。</p>]]></content>
    
    
    <summary type="html">Hexo + GitHub Pages 搭建个人博客的完整指南：Node.js / Git 环境准备（Windows、macOS、Linux 三平台），Hexo 初始化、主题替换、GitHub 仓库与仓库 Pages 配置、一键部署，以及自定义域名的收尾步骤。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="GitHub" scheme="https://biko-duckyo.github.io/tags/GitHub/"/>
    
    <category term="博客搭建" scheme="https://biko-duckyo.github.io/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 博客优化完整路线</title>
    <link href="https://biko-duckyo.github.io/2026/10/06/Hexo%E4%BC%98%E5%8C%96%E8%B7%AF%E7%BA%BF/"/>
    <id>https://biko-duckyo.github.io/2026/10/06/Hexo%E4%BC%98%E5%8C%96%E8%B7%AF%E7%BA%BF/</id>
    <published>2026-10-06T01:00:00.000Z</published>
    <updated>2026-10-05T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="优化路线总览"><a href="#优化路线总览" class="headerlink" title="优化路线总览"></a>优化路线总览</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">搭建博客 → GitHub Actions → 第三方托管 → 静态资源优化 → CDN 加速</span><br></pre></td></tr></table></figure><hr><h2 id="博客搭建"><a href="#博客搭建" class="headerlink" title="博客搭建"></a>博客搭建</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">Windows</button><button type="button" class="tab">Ubuntu</button><button type="button" class="tab">Android</button></div><div class="tab-contents"><div class="tab-item-content active"><p>最推荐的本地开发环境。</p><ol><li>安装 Node.js LTS</li><li>安装 Git</li><li><code>npm install hexo-cli -g</code></li><li><code>hexo init</code> 初始化</li></ol></div><div class="tab-item-content"><p>适合服务器部署和命令行熟悉者。<br>建议先配置好 zsh + vim 开发环境。</p></div><div class="tab-item-content"><p>用 Termux 终端模拟器，功能有限。<br>适合临时写文章，不适合长期开发。</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><hr><h2 id="GitHub-Actions-自动部署"><a href="#GitHub-Actions-自动部署" class="headerlink" title="GitHub Actions 自动部署"></a>GitHub Actions 自动部署</h2><p>把本地的 <code>hexo g -d</code> 放到线上自动跑。</p><p><strong>好处</strong>：</p><ul><li>本地只写文章，<code>git push</code> 就自动部署</li><li>源码版本管理，出错随时回滚</li><li>增量提交，速度快</li></ul><p>需要在 GitHub 仓库新建 <code>.github/workflows/deploy.yml</code>。</p><hr><h2 id="托管平台对比"><a href="#托管平台对比" class="headerlink" title="托管平台对比"></a>托管平台对比</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">Vercel</button><button type="button" class="tab">Netlify</button><button type="button" class="tab">Cloudflare Pages</button><button type="button" class="tab">Gitee Pages</button></div><div class="tab-contents"><div class="tab-item-content active"><ul><li>优点：免费 CDN，部署简单</li><li>缺点：国内访问慢</li><li>适合：面向海外读者</li></ul></div><div class="tab-item-content"><ul><li>优点：功能丰富，支持表单</li><li>缺点：国内访问慢</li><li>适合：需要额外功能</li></ul></div><div class="tab-item-content"><ul><li>优点：全球 CDN，免费</li><li>缺点：workers.dev 域名被墙，需绑自定义域名</li><li>适合：有自己域名的用户</li></ul></div><div class="tab-item-content"><ul><li>优点：国内访问快</li><li>缺点：需实名认证，容量有限</li><li>适合：纯国内读者</li></ul></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><hr><h2 id="多线部署"><a href="#多线部署" class="headerlink" title="多线部署"></a>多线部署</h2><p>通过 DNS 按线路分流：</p><ul><li>境外访问 → GitHub Pages</li><li>电信用户 → Vercel</li><li>移动用户 → Netlify</li></ul><p>注意：不同平台 SSL 证书不通用，不要强制 HTTPS。</p><hr><h2 id="静态资源优化"><a href="#静态资源优化" class="headerlink" title="静态资源优化"></a>静态资源优化</h2><table><thead><tr><th>优化项</th><th>效果</th><th>难度</th></tr></thead><tbody><tr><td>图片压缩</td><td>减小 50%+ 体积</td><td>简单</td></tr><tr><td>CDN 加速</td><td>静态资源加载快</td><td>简单</td></tr><tr><td>异步加载</td><td>首屏快</td><td>中等</td></tr><tr><td>Gulp 压缩</td><td>自动压缩</td><td>较难</td></tr></tbody></table><blockquote><p>注意：jsdelivr 国内速度已变差，慎用。</p></blockquote><hr><h2 id="PWA-pjax-Gulp"><a href="#PWA-pjax-Gulp" class="headerlink" title="PWA &#x2F; pjax &#x2F; Gulp"></a>PWA &#x2F; pjax &#x2F; Gulp</h2><p>这三个并称”bug 御三家”：</p><ul><li><strong>PWA</strong>：功能非刚需，bug 多，难卸载</li><li><strong>pjax</strong>：页面无刷新，但容易出兼容问题</li><li><strong>Gulp</strong>：配置繁琐，提升有限</li></ul><p>非刚需别硬上。</p><hr><h2 id="全站-CDN"><a href="#全站-CDN" class="headerlink" title="全站 CDN"></a>全站 CDN</h2><p>国内 CDN 必须备案，这是硬性要求。</p><p>备案流程：</p><ol><li>国内注册域名（阿里云&#x2F;腾讯云）</li><li>域名服务商提交备案</li><li>客服初审材料</li><li>管局审核（3天~1个月）</li></ol><p>没有备案号用不了国内 CDN。</p>]]></content>
    
    
    <summary type="html">Hexo 博客优化完整路线：从搭建环境、GitHub Actions 自动部署，到第三方托管、静态资源压缩与 CDN 加速的全链路优化思路，附带每一环的取舍与实测结论，适合作为长期维护的性能总纲。</summary>
    
    
    
    <category term="Hexo 教程" scheme="https://biko-duckyo.github.io/categories/Hexo-%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://biko-duckyo.github.io/tags/Hexo/"/>
    
    <category term="博客优化" scheme="https://biko-duckyo.github.io/tags/%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96/"/>
    
    <category term="性能优化" scheme="https://biko-duckyo.github.io/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://biko-duckyo.github.io/2026/10/03/hello-world/"/>
    <id>https://biko-duckyo.github.io/2026/10/03/hello-world/</id>
    <published>2026-10-03T08:37:44.000Z</published>
    <updated>2026-10-11T15:59:45.375Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
    <summary type="html">Hexo 的默认示例文章，演示最基本的写作与发布流程：hexo new 创建文章、hexo server 本地预览、hexo generate 生成静态文件、hexo deploy 一键部署。新装博客后的第一站。</summary>
    
    
    
    
  </entry>
  
</feed>
