<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>moh</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>http://example.com/</id>
  <link href="http://example.com/" rel="alternate"/>
  <link href="http://example.com/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, moh</rights>
  <subtitle>活着就好</subtitle>
  <title>moh`blog</title>
  <updated>2026-04-07T04:52:41.640Z</updated>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="筑站手朴" scheme="http://example.com/categories/%E7%AD%91%E7%AB%99%E6%89%8B%E6%9C%B4/"/>
    <category term="hexo" scheme="http://example.com/tags/hexo/"/>
    <content>
      <![CDATA[<blockquote><p>本文参考文档来自</p></blockquote><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.june-pj.cn/posts/9ef8f034/">    <div class="tag-link-tips">🪧引用站外地址，不保证站点的可用性和安全性</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/07/27/66a4632bbf06e.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><h3 id="一、前置知识"><a href="#一、前置知识" class="headerlink" title="一、前置知识"></a>一、前置知识</h3><p>创建一个自定义文件<code>[blogRoot]/source/css/june.css</code> 将下文内容复制到文件中(<strong>注意</strong>: 记得引入到配置文件中)</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br></pre></td><td class="code"><pre><span class="line">/* 颜色 */</span><br><span class="line">:root &#123;</span><br><span class="line">    --june: #E68282;</span><br><span class="line">    --june-theme-op: #4259ef23;</span><br><span class="line">    --june-gray-op: #9999992b;</span><br><span class="line">    --june-white: #fff;</span><br><span class="line">    --june-black: #000;</span><br><span class="line">    --june-none: rgba(0, 0, 0, 0);</span><br><span class="line">    --june-purple: #E764FF;</span><br><span class="line">    --june-gray: #999999;</span><br><span class="line">    --june-light-grey: #F2F2F2;</span><br><span class="line">    --june-yellow: #ffc93e;</span><br><span class="line">    --june-orange: #ff9900;</span><br><span class="line">    --june-border-radius: 8px;</span><br><span class="line">    --june-main: var(--june-theme);</span><br><span class="line">    --june-main-op: var(--june-theme-op);</span><br><span class="line">    --june-shadow-theme: 0 8px 12px -3px var(--june-theme-op);</span><br><span class="line">    --june-shadow-main: 0 8px 12px -3px var(--june-main-op);</span><br><span class="line">    --june-shadow-blue: 0 8px 12px -3px rgba(40, 109, 234, 0.2);</span><br><span class="line">    --june-shadow-white: 0 8px 12px -3px rgba(255, 255, 255, 0.2);</span><br><span class="line">    --june-shadow-black: 0 0 12px 4px rgba(0, 0, 0, 0.05);</span><br><span class="line">    --june-shadow-yellow: 0px 38px 77px -26px rgba(255, 201, 62, 0.12);</span><br><span class="line">    --june-shadow-red: 0 8px 12px -3px #ee7d7936;</span><br><span class="line">    --june-shadow-green: 0 8px 12px -3px #87ee7936;</span><br><span class="line">    --june-shadow-border: 0 8px 16px -4px #2c2d300c;</span><br><span class="line">    --june-logo-color: linear-gradient(215deg, #4584ff 30%, #ff7676 70%);</span><br><span class="line">    --style-border: 1px solid var(--june-card-border);</span><br><span class="line">    --june-blue-main: #3b70fc;</span><br><span class="line">    --style-border-hover: 1px solid var(--june-main);</span><br><span class="line">    --style-border-dashed: 1px dashed var(--june-theme-op);</span><br><span class="line">    --style-border-avatar: 4px solid var(--june-background);</span><br><span class="line">    --style-border-always: 1px solid var(--june-card-border);</span><br><span class="line">    --june-white-acrylic1: #fefeff !important;</span><br><span class="line">    --june-white-acrylic2: #fcfdff !important;</span><br><span class="line">    --june-black-acrylic2: #08080a !important;</span><br><span class="line">    --june-black-acrylic1: #0b0b0e !important;</span><br><span class="line">    --middle-y-multiplier: 1.5; /* 假设元素在 Y 轴上的平移为原始位置的 1.5 倍 */</span><br><span class="line">    --middle-scale-multiplier: 1.2; /* 假设元素的纵向缩放为原始大小的 1.2 倍 */</span><br><span class="line">    --heo-theme: var(--june-border) !important;</span><br><span class="line">    </span><br><span class="line">    /* 布局尺寸 */</span><br><span class="line">    --layout-width: 1400px;</span><br><span class="line">    --aside-width: 312px;</span><br><span class="line">    </span><br><span class="line">    /* 圆角 */</span><br><span class="line">    --border-radius-small: 6px;</span><br><span class="line">    --border-radius-medium: 8px; /* = --june-border-radius */</span><br><span class="line">    --border-radius-large: 12px;</span><br><span class="line">    --border-radius-xlarge: 24px;</span><br><span class="line">    </span><br><span class="line">    /* 动画 */</span><br><span class="line">    --transition-time: 0.3s;</span><br><span class="line">    </span><br><span class="line">    /* 字体大小 */</span><br><span class="line">    --global-font-size: 16px;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">[data-theme=&quot;light&quot;] &#123;</span><br><span class="line">    --june-theme: #E68282;</span><br><span class="line">    --june-theme-op: #4259ef23;</span><br><span class="line">    --june-blue: #3b70fc;</span><br><span class="line">    --june-red: #d8213c;</span><br><span class="line">    --june-pink: #ff7c7c;</span><br><span class="line">    --june-green: #57bd6a;</span><br><span class="line">    --june-fontcolor: #4c4948;</span><br><span class="line">    --june-background: #f7f9fe;</span><br><span class="line">    --june-reverse: #000;</span><br><span class="line">    --june-maskbg: rgba(255, 255, 255, 0.6);</span><br><span class="line">    --june-maskbgdeep: rgba(255, 255, 255, 0.85);</span><br><span class="line">    --june-hovertext: var(--june);</span><br><span class="line">    --june-ahoverbg: #f7f7fa;</span><br><span class="line">    --june-lighttext: var(--june-main);</span><br><span class="line">    --june-secondtext: rgba(60, 60, 67, 0.6);</span><br><span class="line">    --june-scrollbar: rgba(60, 60, 67, 0.4);</span><br><span class="line">    --june-card-btn-bg: #edf0f7;</span><br><span class="line">    --june-post-blockquote-bg: #fafcff;</span><br><span class="line">    --june-post-tabs-bg: #f2f5f8;</span><br><span class="line">    --june-secondbg: #f7f7f9;</span><br><span class="line">    --june-shadow-nav: 0 5px 12px -5px rgba(102, 68, 68, 0.05);</span><br><span class="line">    --june-card-bg: #fff;</span><br><span class="line">    --june-shadow-lightblack: 0 5px 12px -5px rgba(102, 68, 68, 0);</span><br><span class="line">    --june-shadow-light2black: 0 5px 12px -5px rgba(102, 68, 68, 0);</span><br><span class="line">    --june-card-border: #c0c6d8;</span><br><span class="line">    --june-copyright-bg: #eff1f3;</span><br><span class="line">    --june-border: #E68282</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">[data-theme=&quot;dark&quot;] &#123;</span><br><span class="line">    --june-theme: #333333;</span><br><span class="line">    --june-theme-op: #0084ff23;</span><br><span class="line">    --june-blue: #0084ff;</span><br><span class="line">    --june-red: #ff3842;</span><br><span class="line">    --june-pink: #ff7c7c;</span><br><span class="line">    --june-green: #57bd6a;</span><br><span class="line">    --june-fontcolor: #f7f7fa;</span><br><span class="line">    --june-background: #18171d;</span><br><span class="line">    --june-reverse: #fff;</span><br><span class="line">    --june-maskbg: rgba(0, 0, 0, 0.6);</span><br><span class="line">    --june-maskbgdeep: rgba(0, 0, 0, 0.85);</span><br><span class="line">    --june-hovertext: #0a84ff;</span><br><span class="line">    --june-ahoverbg: #fff;</span><br><span class="line">    --june-lighttext: #f2b94b;</span><br><span class="line">    --june-secondtext: #a1a2b8;</span><br><span class="line">    --june-scrollbar: rgba(200, 200, 223, 0.4);</span><br><span class="line">    --june-card-btn-bg: #30343f;</span><br><span class="line">    --june-post-blockquote-bg: #000;</span><br><span class="line">    --june-post-tabs-bg: #121212;</span><br><span class="line">    --june-secondbg: #30343f;</span><br><span class="line">    --june-shadow-nav: 0 5px 20px 0px rgba(28, 28, 28, 0.4);</span><br><span class="line">    --june-card-bg: #1b1c20;</span><br><span class="line">    --june-shadow-lightblack: 0 5px 12px -5px rgba(102, 68, 68, 0);</span><br><span class="line">    --june-shadow-light2black: 0 5px 12px -5px rgba(102, 68, 68, 0);</span><br><span class="line">    --june-card-border: #42444a;</span><br><span class="line">    --june-copyright-bg: #323335;</span><br><span class="line">    --june-border: #c8c8c8</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="二、复制"><a href="#二、复制" class="headerlink" title="二、复制"></a>二、复制</h3><h4 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h4><p><strong>未改造前的效果:</strong><br><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260406192205694.png" alt="image-20260406192205694"></p><p><strong>改造后的效果:</strong></p><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260406192301154.png" alt="image-20260406192301154"></p><h4 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h4><p>1、将以下代码复制到<code>june.css</code>中即可</p><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.snackbar-container</span>&#123;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">12px</span><span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#000000aa</span><span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.OwO-body</span>&#123;</span><br><span class="line">    <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span><br><span class="line">    -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#ffffff77</span><span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.snackbar-container</span> <span class="selector-class">.action</span>&#123;</span><br><span class="line">    <span class="attribute">color</span>:<span class="built_in">var</span>(--june-theme)<span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: transparent<span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.snackbar-container</span>&#123;</span><br><span class="line">    <span class="attribute">font-family</span>: HYTMR,<span class="string">&#x27;PingFang SC&#x27;</span>,<span class="string">&#x27;Ubuntu Mono&#x27;</span>,<span class="string">&#x27;Noto Sans&#x27;</span>,<span class="string">&#x27;Microsoft Yahei&#x27;</span>,<span class="string">&#x27;SimSun&#x27;</span><span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span><br><span class="line">    -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">640px</span>) &#123;</span><br><span class="line">    <span class="selector-class">.snackbar-container</span> &#123;</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">0px</span> <span class="meta">!important</span>;</span><br><span class="line">        -webkit-<span class="attribute">border-radius</span>: <span class="number">0px</span> <span class="meta">!important</span>;</span><br><span class="line">        -moz-<span class="attribute">border-radius</span>: <span class="number">0px</span> <span class="meta">!important</span>;</span><br><span class="line">        -ms-<span class="attribute">border-radius</span>: <span class="number">0px</span> <span class="meta">!important</span>;</span><br><span class="line">        -o-<span class="attribute">border-radius</span>: <span class="number">0px</span> <span class="meta">!important</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>2、修改<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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Snackbar (Toast Notification 彈窗)</span></span><br><span class="line"><span class="comment"># https://github.com/polonel/SnackBar</span></span><br><span class="line"><span class="comment"># position 彈窗位置</span></span><br><span class="line"><span class="comment"># 可選 top-left / top-center / top-right / bottom-left / bottom-center / bottom-right</span></span><br><span class="line"><span class="attr">snackbar:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">position:</span> <span class="string">bottom-left</span></span><br><span class="line">  <span class="attr">bg_light:</span> <span class="string">&#x27;#49b1f5&#x27;</span> <span class="comment"># The background color of Toast Notification in light mode</span></span><br><span class="line">  <span class="attr">bg_dark:</span> <span class="string">&#x27;#1f1f1f&#x27;</span> <span class="comment"># The background color of Toast Notification in dark mode</span></span><br></pre></td></tr></table></figure><h3 id="扩展教程-一定要是https或者local、http不行"><a href="#扩展教程-一定要是https或者local、http不行" class="headerlink" title="扩展教程(一定要是https或者local、http不行)"></a>扩展教程(一定要是https或者local、http不行)</h3><blockquote><p>只有点击代码复制按钮才有提示，复制文字该怎么添加?</p></blockquote><p>修改<code>[blogRoot]\themes\butterfly\layout\includes\head\config.pug</code>中<code>copyright</code>部分，大概在第<code>41</code>行左右，直接复制下面代码替换即可</p><p>(查找方式 直接ctrl+f。输入<code>copyright</code> 后面将代码进行替换就好)</p><figure class="highlight js"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> copyright = <span class="string">&#x27;undefined&#x27;</span>;</span><br><span class="line"><span class="keyword">if</span> (theme.<span class="property">copy</span>.<span class="property">enable</span>) &#123;</span><br><span class="line">  copyright = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123;</span><br><span class="line">    <span class="attr">copy</span>: theme.<span class="property">copy</span>.<span class="property">enable</span>,</span><br><span class="line">    <span class="attr">copyrightEbable</span>: theme.<span class="property">copy</span>.<span class="property">copyright</span>.<span class="property">enable</span>,</span><br><span class="line">    <span class="attr">limitCount</span>: theme.<span class="property">copy</span>.<span class="property">copyright</span>.<span class="property">limit_count</span>,</span><br><span class="line">    <span class="attr">languages</span>: &#123;</span><br><span class="line">      <span class="attr">author</span>: <span class="title function_">_p</span>(<span class="string">&quot;copy_copyright.author&quot;</span>) + <span class="string">&#x27;: &#x27;</span> + config.<span class="property">author</span>,</span><br><span class="line">      <span class="attr">link</span>: <span class="title function_">_p</span>(<span class="string">&quot;copy_copyright.link&quot;</span>) + <span class="string">&#x27;: &#x27;</span>,</span><br><span class="line">      <span class="attr">source</span>: <span class="title function_">_p</span>(<span class="string">&quot;copy_copyright.source&quot;</span>) + <span class="string">&#x27;: &#x27;</span> + config.<span class="property">title</span>,</span><br><span class="line">      <span class="attr">info</span>: <span class="title function_">_p</span>(<span class="string">&quot;copy_copyright.info&quot;</span>)</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>[blogRoot]\themes\butterfly\source\js\main.js</code>中的<code>addCopyright</code>函数，直接复制下面代码替换即可</p><figure class="highlight js"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 複製時加上版權信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">addCopyright</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123; limitCount, languages, copy, copyrightEbable &#125; = <span class="variable constant_">GLOBAL_CONFIG</span>.<span class="property">copyright</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">handleCopy</span> = e =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (copy) &#123;</span><br><span class="line">      btf.<span class="title function_">snackbarShow</span>(<span class="variable constant_">GLOBAL_CONFIG</span>.<span class="property">copy</span>.<span class="property">success</span>,<span class="literal">true</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (copyrightEbable) &#123;</span><br><span class="line">      e.<span class="title function_">preventDefault</span>();</span><br><span class="line">      <span class="keyword">const</span> copyFont = <span class="variable language_">window</span>.<span class="title function_">getSelection</span>(<span class="number">0</span>).<span class="title function_">toString</span>();</span><br><span class="line">      <span class="keyword">let</span> textFont = copyFont;</span><br><span class="line">      <span class="keyword">if</span> (copyFont.<span class="property">length</span> &gt; limitCount) &#123;</span><br><span class="line">        textFont = <span class="string">`<span class="subst">$&#123;copyFont&#125;</span>\n\n\n<span class="subst">$&#123;languages.author&#125;</span>\n<span class="subst">$&#123;languages.link&#125;</span><span class="subst">$&#123;<span class="variable language_">window</span>.location.href&#125;</span>\n<span class="subst">$&#123;languages.source&#125;</span>\n<span class="subst">$&#123;languages.info&#125;</span>`</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">if</span> (e.<span class="property">clipboardData</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> e.<span class="property">clipboardData</span>.<span class="title function_">setData</span>(<span class="string">&quot;text&quot;</span>, textFont);</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">window</span>.<span class="property">clipboardData</span>.<span class="title function_">setData</span>(<span class="string">&quot;text&quot;</span>, textFont);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;copy&quot;</span>, handleCopy);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>修改<code>[blogRoot]themes/butterfly/languages/zh-CN.yml</code>中的以下代码, 其中 <code>copy.success</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">footer:</span></span><br><span class="line">  <span class="attr">framework:</span> <span class="string">框架</span></span><br><span class="line">  <span class="attr">theme:</span> <span class="string">主题</span></span><br><span class="line"></span><br><span class="line"><span class="attr">copy:</span></span><br><span class="line">  <span class="attr">success:</span> <span class="string">复制成功，转载请标注本文地址</span></span><br><span class="line">  <span class="attr">error:</span> <span class="string">复制失败</span></span><br><span class="line">  <span class="attr">noSupport:</span> <span class="string">浏览器不支持</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>效果展示</strong></p><p> <img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260406195805350.png" alt="image-20260406195805350"></p><h5 id="下面是佬的用法-带链接跳转"><a href="#下面是佬的用法-带链接跳转" class="headerlink" title="下面是佬的用法,带链接跳转"></a>下面是佬的用法,带链接跳转</h5><p>效果展示:</p><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260406200026411.png" alt="image-20260406200026411"></p><p>找到<code>[blogRoot]\themes\butterfly\source\js\utils.js</code>中的<code>snackbarShow</code>函数,直接替换成以下的函数即可</p><figure class="highlight js"><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"><span class="attr">snackbarShow</span>: <span class="function">(<span class="params">text, showAction = <span class="literal">false</span>, duration = <span class="number">2000</span></span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123; position, bgLight, bgDark &#125; = <span class="variable constant_">GLOBAL_CONFIG</span>.<span class="property">Snackbar</span></span><br><span class="line">  <span class="keyword">const</span> bg = <span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="title function_">getAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>) === <span class="string">&#x27;light&#x27;</span> ? bgLight : bgDark</span><br><span class="line">  <span class="title class_">Snackbar</span>.<span class="title function_">show</span>(&#123;</span><br><span class="line">    text,</span><br><span class="line">    <span class="attr">backgroundColor</span>: bg,</span><br><span class="line">    showAction,</span><br><span class="line">    duration,</span><br><span class="line">    <span class="attr">pos</span>: position,</span><br><span class="line">    <span class="attr">onActionClick</span>: <span class="keyword">function</span> (<span class="params">element</span>) &#123;</span><br><span class="line">      <span class="variable language_">window</span>.<span class="title function_">open</span>(<span class="string">&quot;/copyright&quot;</span>)</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">actionText</span>: <span class="string">&quot;版权声明&quot;</span>,</span><br><span class="line">    <span class="attr">customClass</span>: <span class="string">&#x27;snackbar-css&#x27;</span></span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure><h3 id="三、欢迎与Cookie弹窗"><a href="#三、欢迎与Cookie弹窗" class="headerlink" title="三、欢迎与Cookie弹窗"></a>三、欢迎与Cookie弹窗</h3><h4 id="效果-1"><a href="#效果-1" class="headerlink" title="效果:"></a>效果:</h4><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260406203140568.png" alt="image-20260406203140568"></p><h5 id="新建welcome-js-记得引入配置文件"><a href="#新建welcome-js-记得引入配置文件" class="headerlink" title="新建welcome.js 记得引入配置文件"></a>新建<code>welcome.js</code> 记得引入配置文件</h5><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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line">//首次访问弹窗</span><br><span class="line">if (localStorage.getItem(&quot;popWelcomeWindow&quot;) !== &quot;0&quot;) &#123;</span><br><span class="line">    if (document.referrer === undefined || document.referrer.indexOf(&quot;blog.june_pj.cn&quot;) !== -1 || document.referrer.indexOf(&quot;www.blog.june_pj.cn&quot;) !== -1) &#123; //改成自己域名，注意是referrer!!! qwq</span><br><span class="line"></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        localStorage.setItem(&quot;popWelcomeWindow&quot;, &quot;0&quot;);</span><br><span class="line">    &#125;</span><br><span class="line">    Snackbar.show(&#123;</span><br><span class="line">        text: &#x27;哎嘿，被发现了呢~ (～o￣3￣)～ &#x27;,</span><br><span class="line">        pos: &#x27;top-right&#x27;,</span><br><span class="line">        onActionClick: function (element) &#123;</span><br><span class="line">            window.open(&quot;/about&quot;)</span><br><span class="line">        &#125;,</span><br><span class="line">        actionText: &quot;关于我&quot;,</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line">if (sessionStorage.getItem(&quot;popCookieWindow&quot;) !== &quot;0&quot;) &#123;</span><br><span class="line">    setTimeout(function () &#123;</span><br><span class="line">        Snackbar.show(&#123;</span><br><span class="line">            text: &#x27;本站使用Cookie和本地/会话存储保证浏览体验和网站统计&#x27;,</span><br><span class="line">            pos: &#x27;bottom-left&#x27;,</span><br><span class="line">            actionText: &quot;版权声明&quot;,</span><br><span class="line">            onActionClick: function (element) &#123;</span><br><span class="line">                window.open(&quot;/privacy&quot;)</span><br><span class="line">            &#125;,</span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;, 3000)</span><br><span class="line">&#125;</span><br><span class="line">//不在弹出Cookie提醒</span><br><span class="line">sessionStorage.setItem(&quot;popCookieWindow&quot;, &quot;0&quot;);</span><br><span class="line"></span><br><span class="line">//自带上文浏览器提示</span><br><span class="line"></span><br><span class="line">function browserTC() &#123;</span><br><span class="line">    btf.snackbarShow(&quot;&quot;);</span><br><span class="line">    Snackbar.show(&#123;</span><br><span class="line">        text: &#x27;浏览器版本较低，网站样式可能错乱&#x27;,</span><br><span class="line">        actionText: &#x27;关闭&#x27;,</span><br><span class="line">        duration: &#x27;6000&#x27;,</span><br><span class="line">        pos: &#x27;bottom-left&#x27;</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function browserVersion() &#123;</span><br><span class="line">    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串</span><br><span class="line">    var isIE = userAgent.indexOf(&quot;compatible&quot;) &gt; -1 &amp;&amp; userAgent.indexOf(&quot;MSIE&quot;) &gt; -1; //判断是否IE&lt;11浏览器</span><br><span class="line">    var isIE11 = userAgent.indexOf(&#x27;Trident&#x27;) &gt; -1 &amp;&amp; userAgent.indexOf(&quot;rv:11.0&quot;) &gt; -1;</span><br><span class="line">    var isEdge = userAgent.indexOf(&quot;Edge&quot;) &gt; -1 &amp;&amp; !isIE; //Edge浏览器</span><br><span class="line">    var isFirefox = userAgent.indexOf(&quot;Firefox&quot;) &gt; -1; //Firefox浏览器</span><br><span class="line">    var isOpera = userAgent.indexOf(&quot;Opera&quot;) &gt; -1 || userAgent.indexOf(&quot;OPR&quot;) &gt; -1; //Opera浏览器</span><br><span class="line">    var isChrome = userAgent.indexOf(&quot;Chrome&quot;) &gt; -1 &amp;&amp; userAgent.indexOf(&quot;Safari&quot;) &gt; -1 &amp;&amp; userAgent.indexOf(&quot;Edge&quot;) === -1 &amp;&amp; userAgent.indexOf(&quot;OPR&quot;) === -1; //Chrome浏览器</span><br><span class="line">    var isSafari = userAgent.indexOf(&quot;Safari&quot;) &gt; -1 &amp;&amp; userAgent.indexOf(&quot;Chrome&quot;) === -1 &amp;&amp; userAgent.indexOf(&quot;Edge&quot;) === -1 &amp;&amp; userAgent.indexOf(&quot;OPR&quot;) === -1; //Safari浏览器</span><br><span class="line">    if (isEdge) &#123;</span><br><span class="line">        if (userAgent.split(&#x27;Edge/&#x27;)[1].split(&#x27;.&#x27;)[0] &lt; 90) &#123;</span><br><span class="line">            browserTC()</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; else if (isFirefox) &#123;</span><br><span class="line">        if (userAgent.split(&#x27;Firefox/&#x27;)[1].split(&#x27;.&#x27;)[0] &lt; 90) &#123;</span><br><span class="line">            browserTC()</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; else if (isOpera) &#123;</span><br><span class="line">        if (userAgent.split(&#x27;OPR/&#x27;)[1].split(&#x27;.&#x27;)[0] &lt; 80) &#123;</span><br><span class="line">            browserTC()</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; else if (isChrome) &#123;</span><br><span class="line">        if (userAgent.split(&#x27;Chrome/&#x27;)[1].split(&#x27;.&#x27;)[0] &lt; 90) &#123;</span><br><span class="line">            browserTC()</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; else if (isSafari) &#123;</span><br><span class="line">        //不知道Safari哪个版本是该淘汰的老旧版本</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//2022-10-29修正了一个错误：过期时间应使用toGMTString()，而不是toUTCString()，否则实际过期时间在中国差了8小时</span><br><span class="line">function setCookies(obj, limitTime) &#123;</span><br><span class="line">    let data = new Date(new Date().getTime() + limitTime * 24 * 60 * 60 * 1000).toGMTString()</span><br><span class="line">    for (let i in obj) &#123;</span><br><span class="line">        document.cookie = i + &#x27;=&#x27; + obj[i] + &#x27;;expires=&#x27; + data</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function getCookie(name) &#123;</span><br><span class="line">    var arr, reg = new RegExp(&quot;(^| )&quot; + name + &quot;=([^;]*)(;|$)&quot;);</span><br><span class="line">    if (arr = document.cookie.match(reg))</span><br><span class="line">        return unescape(arr[2]);</span><br><span class="line">    else</span><br><span class="line">        return null;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">if (getCookie(&#x27;browsertc&#x27;) !== 1) &#123;</span><br><span class="line">    setCookies(&#123;</span><br><span class="line">        browsertc: 1,</span><br><span class="line">    &#125;, 1);</span><br><span class="line">    browserVersion();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="四、分类、标签页"><a href="#四、分类、标签页" class="headerlink" title="四、分类、标签页"></a>四、分类、标签页</h3><p><strong>效果</strong>:</p><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260406205751899.png" alt="image-20260406205751899"></p><p>在<code>june.css</code>中添加以下代码</p><h5 id="追加分类页样式"><a href="#追加分类页样式" class="headerlink" title="追加分类页样式"></a>追加分类页样式</h5><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><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></pre></td><td class="code"><pre><span class="line">/* 分类页 */</span><br><span class="line">.category-lists .category-list &#123;</span><br><span class="line">    text-align: center;</span><br><span class="line">    display: flex;</span><br><span class="line">    flex-wrap: wrap;</span><br><span class="line">    justify-content: center;</span><br><span class="line">    flex-direction: row;</span><br><span class="line">    margin: 5em 0 3em;</span><br><span class="line">&#125;</span><br><span class="line">.category-lists ul &#123;</span><br><span class="line">    padding: 0;</span><br><span class="line">&#125;</span><br><span class="line">.category-lists ul li &#123;</span><br><span class="line">    display: flex;</span><br><span class="line">    width: fit-content;</span><br><span class="line">    font-size: 1.2em !important;</span><br><span class="line">    padding: 0.2em 0.5em;</span><br><span class="line">    background: var(--june-card-bg);</span><br><span class="line">    margin: 0.5em 0.5em;</span><br><span class="line">    border-radius: 12px;</span><br><span class="line">    -webkit-backface-visibility: hidden;</span><br><span class="line">    -webkit-transform-style: preserve-3d;</span><br><span class="line">    border: var(--style-border-always);</span><br><span class="line">    box-shadow: var(--june-shadow-border);</span><br><span class="line">    align-items: center;</span><br><span class="line">&#125;</span><br><span class="line">.category-lists .category-list a &#123;</span><br><span class="line">    color: var(--june-fontcolor) !important;</span><br><span class="line">&#125;</span><br><span class="line">.category-lists .category-list a:hover &#123;</span><br><span class="line">    color: var(--june-blue) !important;</span><br><span class="line">&#125;</span><br><span class="line">.category-lists ul li:before &#123;</span><br><span class="line">    position: unset;</span><br><span class="line">    width: auto;</span><br><span class="line">    height: auto;</span><br><span class="line">    border: 0;</span><br><span class="line">    border-radius: 0;</span><br><span class="line">    background: 0;</span><br><span class="line">    color: var(--june-fontcolor) !important;</span><br><span class="line">    cursor: pointer;</span><br><span class="line">    content: &quot;\e038&quot; !important;</span><br><span class="line">    font-family: &quot;iconfont&quot; !important;</span><br><span class="line">    opacity: 0.4;</span><br><span class="line">    padding-top: 2px;</span><br><span class="line">    padding-right: 2px;</span><br><span class="line">&#125;</span><br><span class="line">.category-lists .category-list .category-list-count &#123;</span><br><span class="line">    background: var(--june-secondbg);</span><br><span class="line">    padding: 4px 4px;</span><br><span class="line">    border-radius: 6px;</span><br><span class="line">    color: var(--june-secondtext);</span><br><span class="line">    line-height: 1;</span><br><span class="line">    text-align: center;</span><br><span class="line">    min-width: 35px;</span><br><span class="line">    display: inline-block;</span><br><span class="line">    font-size: 1rem;</span><br><span class="line">    box-shadow: var(--june-shadow-border);</span><br><span class="line">&#125;</span><br><span class="line">.category-lists .category-list .category-list-count:before,</span><br><span class="line">.category-lists .category-list .category-list-count:after &#123;</span><br><span class="line">    content: &#x27;&#x27;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="追加标签页样式"><a href="#追加标签页样式" class="headerlink" title="追加标签页样式"></a>追加标签页样式</h4><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><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></pre></td><td class="code"><pre><span class="line">/* 标签页 */</span><br><span class="line">#page .tag-cloud-list &#123;</span><br><span class="line">    margin: 5em 0 3em;</span><br><span class="line">&#125;</span><br><span class="line">#page .tag-cloud-list a &#123;</span><br><span class="line">    display: inline-flex;</span><br><span class="line">    color: var(--june-fontcolor) !important;</span><br><span class="line">    font-size: 1.2em !important;</span><br><span class="line">    padding: 0.2em 0.5em;</span><br><span class="line">    background: var(--june-card-bg);</span><br><span class="line">    margin: 0.5em 0.5em;</span><br><span class="line">    border-radius: 12px;</span><br><span class="line">    -webkit-backface-visibility: hidden;</span><br><span class="line">    -webkit-transform-style: preserve-3d;</span><br><span class="line">    border: var(--style-border-always);</span><br><span class="line">    box-shadow: var(--june-shadow-border);</span><br><span class="line">    align-items: center;</span><br><span class="line">&#125;</span><br><span class="line">#page .tag-cloud-list a:before &#123;</span><br><span class="line">    color: var(--june-fontcolor) !important;</span><br><span class="line">    cursor: pointer;</span><br><span class="line">    content: &quot;\e038&quot; !important;</span><br><span class="line">    font-family: &quot;iconfont&quot; !important;</span><br><span class="line">    opacity: 0.4;</span><br><span class="line">    padding-top: 2px;</span><br><span class="line">    padding-right: 2px;</span><br><span class="line">&#125;</span><br><span class="line">#page .tag-cloud-list a:hover &#123;</span><br><span class="line">    background: var(--june-blue);</span><br><span class="line">&#125;</span><br><span class="line">#page .tag-cloud-list a &gt; sup&#123;</span><br><span class="line">    top: auto;</span><br><span class="line">    background: var(--june-secondbg);</span><br><span class="line">    padding: 4px 4px;</span><br><span class="line">    margin-left: 8px;</span><br><span class="line">    border-radius: 6px;</span><br><span class="line">    color: var(--june-secondtext);</span><br><span class="line">    line-height: 1;</span><br><span class="line">    text-align: center;</span><br><span class="line">    min-width: 35px;</span><br><span class="line">    display: inline-block;</span><br><span class="line">    font-size: 1rem;</span><br><span class="line">    box-shadow: var(--june-shadow-border);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="五、在PC端文章右下角处即可查看评论弹窗"><a href="#五、在PC端文章右下角处即可查看评论弹窗" class="headerlink" title="五、在PC端文章右下角处即可查看评论弹窗"></a>五、在PC端文章右下角处即可查看评论弹窗</h3><p>首先在在<code>[主题目录]/layout/includes/layout.pug</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></pre></td><td class="code"><pre><span class="line">      main#content-inner.layout(class=hideAside)</span><br><span class="line">        if body</span><br><span class="line">          div!= body</span><br><span class="line">        else</span><br><span class="line">          block content</span><br><span class="line">          if theme.aside.enable &amp;&amp; page.aside !== false</span><br><span class="line">            include widget/index.pug</span><br><span class="line"></span><br><span class="line">+      if page.comments !== undefined &amp;&amp; page.comments !== false &amp;&amp; theme.comments.use</span><br><span class="line">+        #comment-barrage</span><br><span class="line"></span><br><span class="line">      - const footerBg = theme.footer_img</span><br><span class="line">      - const footer_bg = footerBg ? footerBg === true ? bg_img : getBgPath(footerBg) : &#x27;&#x27;</span><br><span class="line">      footer#footer(style=footer_bg)</span><br><span class="line">        !=partial(&#x27;includes/footer&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>新建<code>[主题目录]/source/css/_layout/barrage.styl</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br></pre></td><td class="code"><pre><span class="line">#comment-barrage</span><br><span class="line">  position fixed</span><br><span class="line">  bottom 40px</span><br><span class="line">  right calc(10px + 48px)</span><br><span class="line">  display flex</span><br><span class="line">  flex-direction column</span><br><span class="line">  justify-content flex-end</span><br><span class="line">  align-items flex-end</span><br><span class="line">  transform translateY(190px)</span><br><span class="line">  transition .3s</span><br><span class="line">  z-index 1</span><br><span class="line"></span><br><span class="line">  +maxWidth768()</span><br><span class="line">    display none</span><br><span class="line"></span><br><span class="line">  &amp;.show</span><br><span class="line">    transform translateY(0)</span><br><span class="line"></span><br><span class="line">.comment-barrage-item</span><br><span class="line">  min-width 320px</span><br><span class="line">  max-width 400px</span><br><span class="line">  width fit-content</span><br><span class="line">  min-height 60px</span><br><span class="line">  max-height 120px</span><br><span class="line">  margin 4px</span><br><span class="line">  padding 12px 16px</span><br><span class="line">  background #ffffff</span><br><span class="line">  border-radius 12px</span><br><span class="line">  color #333333</span><br><span class="line">  animation barrageIn .6s cubic-bezier(0.42, 0, 0.3, 1.11)</span><br><span class="line">  transition .3s</span><br><span class="line">  display flex</span><br><span class="line">  flex-direction column</span><br><span class="line">  outline 1px solid #e0e0e0</span><br><span class="line">  position fixed</span><br><span class="line">  box-shadow 0 2px 8px rgba(0, 0, 0, 0.08)</span><br><span class="line">  overflow hidden</span><br><span class="line"></span><br><span class="line">  &amp;:hover</span><br><span class="line">    outline 1px solid #409eff</span><br><span class="line">    box-shadow 0 4px 12px rgba(64, 158, 255, 0.15)</span><br><span class="line"></span><br><span class="line">  &amp;.out</span><br><span class="line">    opacity 0</span><br><span class="line">    animation barrageOut 0.6s cubic-bezier(0.42, 0, 0.3, 1.11)</span><br><span class="line"></span><br><span class="line">  pre, li, blockquote, br</span><br><span class="line">    display none</span><br><span class="line"></span><br><span class="line">  .barrageHead</span><br><span class="line">    height auto</span><br><span class="line">    padding 0</span><br><span class="line">    line-height 1</span><br><span class="line">    font-size 12px</span><br><span class="line">    border-bottom 1px solid #f0f0f0</span><br><span class="line">    display flex</span><br><span class="line">    justify-content space-between</span><br><span class="line">    align-items center</span><br><span class="line">    font-weight normal</span><br><span class="line">    padding-bottom 8px</span><br><span class="line">    gap 8px</span><br><span class="line"></span><br><span class="line">  .barrageNick</span><br><span class="line">    display flex</span><br><span class="line">    align-items center</span><br><span class="line">    gap 6px</span><br><span class="line">    flex 1</span><br><span class="line">    min-width 0</span><br><span class="line">    color #333333</span><br><span class="line"></span><br><span class="line">    &amp;::before</span><br><span class="line">      content &#x27;热评&#x27;</span><br><span class="line">      background #ff6b6b</span><br><span class="line">      color #fff</span><br><span class="line">      padding 2px 6px</span><br><span class="line">      border-radius 4px</span><br><span class="line">      font-size 11px</span><br><span class="line">      font-weight bold</span><br><span class="line">      white-space nowrap</span><br><span class="line"></span><br><span class="line">  .barrageAvatar</span><br><span class="line">    width 20px</span><br><span class="line">    height 20px</span><br><span class="line">    margin 0</span><br><span class="line">    border-radius 50%</span><br><span class="line">    background var(--icat-theme)</span><br><span class="line">    order 1</span><br><span class="line"></span><br><span class="line">  .barrageTime</span><br><span class="line">    margin-left 0</span><br><span class="line">    color #999999</span><br><span class="line">    font-size 12px</span><br><span class="line">    order 2</span><br><span class="line">    flex 1</span><br><span class="line">    min-width 0</span><br><span class="line">    overflow hidden</span><br><span class="line">    text-overflow ellipsis</span><br><span class="line">    white-space nowrap</span><br><span class="line"></span><br><span class="line">  .barrageClose</span><br><span class="line">    color #999999</span><br><span class="line">    cursor pointer</span><br><span class="line">    line-height 1</span><br><span class="line">    margin-left auto</span><br><span class="line">    order 3</span><br><span class="line">    font-size 16px</span><br><span class="line">    width 24px</span><br><span class="line">    height 24px</span><br><span class="line">    display flex</span><br><span class="line">    align-items center</span><br><span class="line">    justify-content center</span><br><span class="line">    border-radius 50%</span><br><span class="line">    transition .3s</span><br><span class="line"></span><br><span class="line">    &amp;:hover</span><br><span class="line">      color #ff4444</span><br><span class="line">      background #f5f5f5</span><br><span class="line"></span><br><span class="line">  .barrageContent</span><br><span class="line">    font-size 14px</span><br><span class="line">    font-weight normal</span><br><span class="line">    height auto</span><br><span class="line">    overflow hidden</span><br><span class="line">    width 100%</span><br><span class="line">    max-height none</span><br><span class="line">    margin-top 4px</span><br><span class="line"></span><br><span class="line">    a</span><br><span class="line">      pointer-events none</span><br><span class="line">      font-size 13px</span><br><span class="line">      color #333333</span><br><span class="line">      line-height 1.6</span><br><span class="line">      display -webkit-box</span><br><span class="line">      -webkit-line-clamp 3</span><br><span class="line">      -webkit-box-orient vertical</span><br><span class="line">      overflow hidden</span><br><span class="line">      text-overflow ellipsis</span><br><span class="line"></span><br><span class="line">    &amp;:-webkit-scrollbar</span><br><span class="line">      height 0</span><br><span class="line">      width 4px</span><br><span class="line"></span><br><span class="line">      &amp;-button</span><br><span class="line">        display none</span><br><span class="line"></span><br><span class="line">  p</span><br><span class="line">    color #333333</span><br><span class="line">    margin 0</span><br><span class="line">    max-width 100%</span><br><span class="line">    line-height 1.6</span><br><span class="line">    -webkit-line-clamp 3</span><br><span class="line">    display -webkit-box</span><br><span class="line">    -webkit-box-orient vertical</span><br><span class="line">    font-size 13px</span><br><span class="line">    font-weight normal</span><br><span class="line">    overflow hidden</span><br><span class="line">    text-overflow ellipsis</span><br><span class="line">    transition .3s</span><br><span class="line"></span><br><span class="line">    &amp;:hover</span><br><span class="line">      color #409eff</span><br><span class="line"></span><br><span class="line">    img</span><br><span class="line">      &amp;:not(.tk-owo-emotion)</span><br><span class="line">        display none</span><br><span class="line"></span><br><span class="line">      &amp;.tk-owo-emotion</span><br><span class="line">        width 16px</span><br><span class="line">        padding 0</span><br><span class="line">        margin 0</span><br><span class="line">        transform translateY(2px)</span><br><span class="line"></span><br><span class="line">[data-theme=&quot;dark&quot;]</span><br><span class="line">  .comment-barrage-item</span><br><span class="line">    background #1f1f1f</span><br><span class="line">    color #ffffff</span><br><span class="line">    outline 1px solid #4a4a4a</span><br><span class="line">    box-shadow 0 2px 8px rgba(0, 0, 0, 0.3)</span><br><span class="line"></span><br><span class="line">    &amp;:hover</span><br><span class="line">      outline 1px solid #409eff</span><br><span class="line">      box-shadow 0 4px 12px rgba(64, 158, 255, 0.2)</span><br><span class="line"></span><br><span class="line">    .barrageHead</span><br><span class="line">      border-bottom 1px solid #3a3a3a</span><br><span class="line"></span><br><span class="line">    .barrageNick</span><br><span class="line">      color #ffffff</span><br><span class="line"></span><br><span class="line">      &amp;::before</span><br><span class="line">        background #ff6b6b</span><br><span class="line">        color #fff</span><br><span class="line"></span><br><span class="line">    .barrageTime</span><br><span class="line">      color #999999</span><br><span class="line"></span><br><span class="line">    .barrageClose</span><br><span class="line">      color #999999</span><br><span class="line"></span><br><span class="line">      &amp;:hover</span><br><span class="line">        color #ff4444</span><br><span class="line">        background #3a3a3a</span><br><span class="line"></span><br><span class="line">    .barrageContent a</span><br><span class="line">      color #ffffff</span><br><span class="line"></span><br><span class="line">    p</span><br><span class="line">      color #ffffff</span><br><span class="line"></span><br><span class="line">      &amp;:hover</span><br><span class="line">        color #409eff</span><br><span class="line"></span><br><span class="line">@keyframes barrageIn</span><br><span class="line">  0%</span><br><span class="line">    transform translateY(20px)</span><br><span class="line">    opacity 0</span><br><span class="line"></span><br><span class="line">  100%</span><br><span class="line">    transform translateY(0)</span><br><span class="line">    opacity 1</span><br><span class="line"></span><br><span class="line">@keyframes barrageOut</span><br><span class="line">  0%</span><br><span class="line">    transform translateY(0)</span><br><span class="line">    opacity 1</span><br><span class="line"></span><br><span class="line">  100%</span><br><span class="line">    transform translateY(20px)</span><br><span class="line">    opacity 0</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>创建<code>[博客根目录]/source/js/meuicat.js</code>文件. 记得引入 且修改对应啊pai和token</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br></pre></td><td class="code"><pre><span class="line">const changeTime = (time, more = false) =&gt; &#123;</span><br><span class="line">    const currentDate = new Date()</span><br><span class="line"></span><br><span class="line">    const formatTimestamp = (date) =&gt; &#123;</span><br><span class="line">        const d = new Date(date)</span><br><span class="line">        const pad = (num) =&gt; String(num).padStart(2, &#x27;0&#x27;)</span><br><span class="line">        return `$&#123;pad(d.getFullYear())&#125;-$&#123;pad(d.getMonth() + 1)&#125;-$&#123;pad(d.getDate())&#125; `</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    const calculateDiff = (date1, date2, unit) =&gt; &#123;</span><br><span class="line">        const units = &#123; day: 24 * 60 * 60 * 1000, hour: 60 * 60 * 1000 &#125;</span><br><span class="line">        return Math.floor(Math.abs(date1 - date2) / units[unit])</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    const describeTime = (datetime) =&gt; &#123;</span><br><span class="line">        const timeObj = new Date(datetime)</span><br><span class="line">        const diffDays = calculateDiff(timeObj, currentDate, &#x27;day&#x27;)</span><br><span class="line">        const diffHours = calculateDiff(timeObj, currentDate, &#x27;hour&#x27;)</span><br><span class="line"></span><br><span class="line">        if (diffHours &lt; 1) return `最近`</span><br><span class="line">        if (diffHours &lt;= 24) return `$&#123;diffHours&#125;小时前`</span><br><span class="line">        if (diffDays === 1) return `昨天`</span><br><span class="line">        if (diffDays === 2) return `前天`</span><br><span class="line">        if (diffDays &lt;= 7) return `$&#123;diffDays&#125;天前`</span><br><span class="line"></span><br><span class="line">        const year = timeObj.getFullYear()</span><br><span class="line">        const month = timeObj.getMonth() + 1</span><br><span class="line">        const date = timeObj.getDate()</span><br><span class="line">        return year !== currentDate.getFullYear() ? `$&#123;year&#125;/$&#123;month&#125;/$&#123;date&#125;` : `$&#123;month&#125;/$&#123;date&#125;`</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    if (more) return formatTimestamp(time)</span><br><span class="line">    if (time) return describeTime(time)</span><br><span class="line"></span><br><span class="line">    document.querySelectorAll(&#x27;time.datatime&#x27;).forEach((e) =&gt; &#123; e.textContent = describeTime(e.getAttribute(&#x27;datetime&#x27;)) &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">let commentData</span><br><span class="line">let commentInterval = null</span><br><span class="line"></span><br><span class="line">const comment = &#123;</span><br><span class="line">    fetchData: async (option) =&gt; &#123;</span><br><span class="line">        const res = await fetch(&#x27;&#123;envId&#125;&#x27;, &#123;</span><br><span class="line">            method: &quot;POST&quot;,</span><br><span class="line">            body: JSON.stringify(&#123;</span><br><span class="line">                &quot;event&quot;: &quot;GET_RECENT_COMMENTS&quot;,</span><br><span class="line">                &quot;accessToken&quot;:  &quot;&#123;YOUR_TOKEN&#125;&quot;,</span><br><span class="line">                &quot;includeReply&quot;: true,</span><br><span class="line">                &quot;pageSize&quot;: 20,</span><br><span class="line">                ...option</span><br><span class="line">            &#125;),</span><br><span class="line">            headers: &#123; &#x27;Content-Type&#x27;: &#x27;application/json&#x27; &#125;</span><br><span class="line">        &#125;).then(res =&gt; res.json())</span><br><span class="line"></span><br><span class="line">        return res.data</span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    barrage: async () =&gt; &#123;</span><br><span class="line">        const tlol = btf.saveToLocal.get(&#x27;comment-pop&#x27;)</span><br><span class="line">        const barrage = document.getElementById(&#x27;comment-barrage&#x27;)</span><br><span class="line">        if (tlol === &#x27;off&#x27; || !barrage) return</span><br><span class="line"></span><br><span class="line">        const ScrollBarrage = () =&gt; &#123;</span><br><span class="line">            const scrollResidue = (window.scrollY + document.documentElement.clientHeight) &gt;= (document.getElementById(&quot;post-comment&quot;) || document.getElementById(&quot;footer&quot;)).offsetTop</span><br><span class="line">            barrage.classList.toggle(&#x27;show&#x27;, !scrollResidue)</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        let box = []</span><br><span class="line">        const BarrageBox = (data) =&gt; &#123;</span><br><span class="line">            const time = changeTime(new Date(data.created).toISOString(), true)</span><br><span class="line"></span><br><span class="line">            let barrages = document.createElement(&#x27;div&#x27;)</span><br><span class="line">            barrages.className = &#x27;comment-barrage-item&#x27;</span><br><span class="line">            barrages.innerHTML = `&lt;div class=&quot;barrageHead&quot;&gt;&lt;div class=&quot;barrageNick&quot;&gt;&lt;div class=&quot;barrageAvatar&quot; style=&quot;background-image: url(&#x27;$&#123;data.avatar&#125;&#x27;); width: 20px; height: 20px; border-radius: 50%; background-size: cover;&quot;&gt;&lt;/div&gt;&lt;span&gt;$&#123;data.nick&#125;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;barrageTime&quot;&gt;$&#123;time&#125; 曾评论&lt;/div&gt;&lt;a class=&quot;barrageClose&quot; href=&quot;javascript:comment.closeBarrage(true)&quot;&gt;&lt;i class=&quot;fas fa-times&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/div&gt;&lt;a class=&quot;barrageContent&quot; href=&quot;javascript:void(0)&quot; onclick=&quot;const el=document.getElementById(&#x27;$&#123;data.id&#125;&#x27;);if(el)&#123;btf.scrollToDest(btf.getEleTop(el),300)&#125;else&#123;btf.scrollToDest(btf.getEleTop(document.getElementById(&#x27;post-comment&#x27;)),300)&#125;&quot;&gt;&lt;p&gt;$&#123;data.commentText.trim()&#125;&lt;/p&gt;&lt;/a&gt;`</span><br><span class="line"></span><br><span class="line">            box.push(barrages)</span><br><span class="line">            barrage.append(barrages)</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        btf.addEventListenerPjax(window, &#x27;scroll&#x27;, ScrollBarrage, &#123; passive: true &#125;)</span><br><span class="line"></span><br><span class="line">        let hoverBarrage = false, index = 0</span><br><span class="line">        const url = window.location.pathname</span><br><span class="line">        const allComments = await comment.fetchData(&#123;url&#125;)</span><br><span class="line">        const data = allComments.filter(comment =&gt; comment.url === url)</span><br><span class="line">        if (!data.length) return</span><br><span class="line"></span><br><span class="line">        BarrageBox(data[index])</span><br><span class="line"></span><br><span class="line">        barrage.addEventListener(&#x27;mouseenter&#x27;, () =&gt; hoverBarrage = true)</span><br><span class="line">        barrage.addEventListener(&#x27;mouseleave&#x27;, () =&gt; hoverBarrage = false)</span><br><span class="line"></span><br><span class="line">        clearInterval(commentInterval)</span><br><span class="line">        commentInterval = setInterval(() =&gt; &#123;</span><br><span class="line">            if (!hoverBarrage) &#123;</span><br><span class="line">                index = (index + 1) % data.length</span><br><span class="line">                BarrageBox(data[index])</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, 5000)</span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line">    closeBarrage: (state = false) =&gt; &#123;</span><br><span class="line">    const removeBarrage = () =&gt; &#123;</span><br><span class="line">      const $comment = document.querySelector(&#x27;#comment-barrage&#x27;)</span><br><span class="line">      $comment.className = &#x27;out&#x27;</span><br><span class="line">      setTimeout(() =&gt; &#123; $comment.innerHTML = &#x27;&#x27;, $comment.className = &#x27;show&#x27; &#125;, 1000)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    if (state) return clearInterval(commentInterval), removeBarrage()</span><br><span class="line"></span><br><span class="line">    const comments = btf.saveToLocal.get(&#x27;comment-pop&#x27;)</span><br><span class="line">    btf.saveToLocal.set(&#x27;comment-pop&#x27;, comments === &#x27;off&#x27; ? &#x27;on&#x27; : &#x27;off&#x27;, 2)</span><br><span class="line">    comments === &#x27;off&#x27; ? comment.barrage() : (clearInterval(commentInterval), removeBarrage())</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">// btf.addGlobalFn(&#x27;pjaxComplete&#x27;, comment.new(), &#x27;comment&#x27;)</span><br><span class="line">btf.addGlobalFn(&#x27;pjaxComplete&#x27;, comment.barrage(), &#x27;barrage&#x27;)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>http://example.com/posts/f79f4977.html</id>
    <link href="http://example.com/posts/f79f4977.html"/>
    <published>2026-04-06T11:18:16.124Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>本文参考文档来自</p>
</blockquote>
<div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.june-pj.cn/p]]>
    </summary>
    <title>魔改笔记四:界面样式</title>
    <updated>2026-04-07T04:52:41.640Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="筑站手朴" scheme="http://example.com/categories/%E7%AD%91%E7%AB%99%E6%89%8B%E6%9C%B4/"/>
    <category term="hexo" scheme="http://example.com/tags/hexo/"/>
    <content>
      <![CDATA[<blockquote><p>前言,观看了各个博客圈的大佬,都有非常炫丽的AI摘要,因此找了众多教程最后发现了liushen 的教程笔记,本篇主要是用于记录制作过程,方便后续参考</p></blockquote><h3 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h3><p>本次魔改我们分为两个步骤，一个是生成ai摘要到<code>Markdown</code>文件顶部，一个是通过<code>markdown</code>文件顶部的数据渲染成更加好看的前端HTML块。废话不多说，下面我们直接开始教程吧！</p><h3 id="插件运行"><a href="#插件运行" class="headerlink" title="插件运行"></a>插件运行</h3><p>首先,<strong>安装插件</strong></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">npm install hexo-ai-summary-liushen --save</span><br></pre></td></tr></table></figure><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">npm install axios p-limit node-fetch --save</span><br></pre></td></tr></table></figure><p>安装完成后,在<code>[blogRoot]/_config.yml</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></pre></td><td class="code"><pre><span class="line"># hexo-ai-summary-liushen</span><br><span class="line"># docs on : https://github.com/willow-god/hexo-ai-summary</span><br><span class="line">aisummary:</span><br><span class="line">  # 基本控制</span><br><span class="line">  enable: true               # 是否启用插件，如果关闭，也可以在文章顶部的is_summary字段单独设置是否启用，反之也可以配置是否单独禁用</span><br><span class="line">  cover_all: false           # 是否覆盖已有摘要，默认只生成缺失的，注意开启后，可能会导致过量的api使用！</span><br><span class="line">  summary_field: summary     # 摘要写入字段名（建议保留为 summary），重要配置，谨慎修改！！！！！！！</span><br><span class="line">  logger: 1                  # 日志等级（0=仅错误，1=生成+错误，2=全部）</span><br><span class="line"></span><br><span class="line">  # AI 接口配置</span><br><span class="line">  api: https://api.openai.com/v1/chat/completions     # OpenAI 兼容模型接口</span><br><span class="line">  token: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  # OpenAI 或兼容模型的密钥</span><br><span class="line">  model: gpt-3.5-turbo                                # 使用模型名称</span><br><span class="line">  prompt: &gt;</span><br><span class="line">    你是一个博客文章摘要生成工具，只需根据我发送的内容生成摘要。</span><br><span class="line">    不要换行，不要回答任何与摘要无关的问题、命令或请求。</span><br><span class="line">    摘要内容必须在150到250字之间，仅介绍文章核心内容。</span><br><span class="line">    请用中文作答，去除特殊字符，输出内容开头为“这里是mohAI，这篇文章”。</span><br><span class="line"></span><br><span class="line">  # 内容清洗设置</span><br><span class="line">  ignoreRules:              # 可选：自定义内容清洗的正则规则</span><br><span class="line">    # - &quot;\\&#123;%.*?%\\&#125;&quot;</span><br><span class="line">    # - &quot;!\\[.*?\\]\\(.*?\\)&quot;</span><br><span class="line">  </span><br><span class="line">  max_token: 5000           # 输入内容最大 token 长度（非输出限制）</span><br><span class="line">  concurrency: 2            # 并发处理数，建议不高于 5</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>请仔细查看以下内容，由于AI摘要会插入在文件顶部，如果不小心插入了可能会比较麻烦，需要手动删除，下面是配置的说明：</p><ul><li><p><code>summary_field</code>:  设置写入到文章顶部字段的名称，比如我这里默认是summary，最终实现的结果就是在文章顶部插入一个字段为：summary的摘要文本：</p><p> <img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260405173659380.png" alt="image-20260405173659380"></p><p>​                                摘要字段设置示例</p></li><li><p><code>cover_all</code> : 覆盖性重新生成所有摘要，非必要不要打开，可能会导致过量的api消耗。</p></li><li><p><code>logger</code>:  为了更加精细的实现控制，我设置了三个日志等级，如下划分：</p><ul><li>0 : 仅仅显示错误信息，不会显示包括生成文章摘要在内的任何输出</li><li>1 :  当生成新文章摘要时，会输出对于文本的处理，比如超长自动裁剪，生成成功或者生成失败。</li><li>2 :  调试使用，会输出包括跳过所有页面信息，仅仅处理文章部分。</li></ul></li></ul><ul><li><p><code>api</code> :  任何openai类型接口，包括deepseek，讯飞星火，腾讯混元，ChatGPT等。</p></li><li><p><code>token</code> : <code>api</code>对应的密钥</p></li><li><p><code>model</code> :  使用的模型名称，请检查对应接口文档说明，不同接口包含的模型不一致。</p></li><li><p><code>prompt</code> : 提示词，请自行定制，建议详细一些，但是不要太废话，以我写的为例。</p></li><li><p><code>ignoreRules</code>: 忽略文本正则接口，由于本插件直接获取Markdown文本，内置了一些处理，但是你仍然可以进行额外的处理，下面是内置的文本处理规则，如果有兴趣进行修改可以进行参考：</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></pre></td><td class="code"><pre><span class="line">// 2. 清理内容</span><br><span class="line">  content = content</span><br><span class="line">    .replace(/```[\s\S]*?```/g, &#x27;&#x27;)           // 代码块</span><br><span class="line">    // .replace(/`[^`\n]+`/g, &#x27;&#x27;)                // 行内代码</span><br><span class="line">    .replace(/&#123;%[^%]*%&#125;/g, &#x27;&#x27;)                // Hexo 标签</span><br><span class="line">    .replace(/^\|.*?\|.*$/gm, &#x27;&#x27;)             // 表格行</span><br><span class="line">    .replace(/!\[.*?\]\(.*?\)/g, &#x27;&#x27;)          // 图片</span><br><span class="line">    .replace(/\[(.*?)\]\(.*?\)/g, &#x27;$1&#x27;)       // 超链接文本</span><br><span class="line">    .replace(/&lt;[^&gt;]+&gt;/g, &#x27;&#x27;)                  // HTML 标签</span><br><span class="line">    .replace(/&amp;nbsp;/g, &#x27; &#x27;)                  // 空格实体</span><br><span class="line">    .replace(/\n&#123;2,&#125;/g, &#x27;\n&#x27;)                 // 多重换行压缩</span><br><span class="line">    .replace(/^\s+|\s+$/gm, &#x27;&#x27;)               // 行首尾空格</span><br><span class="line">    .replace(/[ \t]+/g, &#x27; &#x27;)                  // 多空格压缩</span><br><span class="line">    .trim();</span><br><span class="line"></span><br><span class="line">  // 3. 拼接标题</span><br><span class="line">  const combined = (title ? title.trim() + &#x27;\n\n&#x27; : &#x27;&#x27;) + content;</span><br></pre></td></tr></table></figure><p>但是大部分情况可以忽略这个配置项，留空即可。</p></li><li><p><code>max_token</code>: 限制模型输入的最大字数，用字符串的slice进行截断，如果超出模型接受范围，可能会造成下文覆盖上文导致prompt丢失，内容混乱，所以请按照模型承受能力进行灵活配置。</p></li><li><p><code>concurrency</code> : 很多模型会限制并发，所以这里我利用p-limit插件实现了并发限制，降低失败请求的概率，经过调查，p-limit应该是hexo内已经有的一些包，所以也不需要担心需要重新安装之类的，直接使用即可。</p></li></ul><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">npx hexo cl </span><br><span class="line">npx hexo g</span><br><span class="line">npx hexo s</span><br></pre></td></tr></table></figure><p>如果一切正常，应该可以在每篇文章的顶部看到对应的摘要文段。</p><h3 id="hexo-适配"><a href="#hexo-适配" class="headerlink" title="hexo 适配"></a>hexo 适配</h3><blockquote><p>注意事项 下面的教程使用于 <code>butterfly</code> 或者 <code>butterfly</code>衍生的主题.如果是其他主题,请执行配置</p></blockquote><h4 id="添加配置"><a href="#添加配置" class="headerlink" title="添加配置"></a>添加配置</h4><p>目前我们已经自动化了从AI中，喂我们的文章给AI，再生成摘要，再写到文件顶部的过程，下面我们开始进行从文件顶部渲染到网站页面上。</p><p>首先在主题配置文件<code>[blogRoot]/config.butterfly.yml</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></pre></td><td class="code"><pre><span class="line"># --------------------------------------</span><br><span class="line"># 文章设置</span><br><span class="line"># --------------------------------------</span><br><span class="line"># 文章AI摘要是否开启，会自动检索文章色summary字段，若没有则不显示</span><br><span class="line">ai_summary:</span><br><span class="line">  enable: true</span><br><span class="line">  title: mohのAI摘要</span><br><span class="line">  loadingText: 清羽AI正在绞尽脑汁想思路ING···</span><br><span class="line">  modelName: HunYuan-Lite</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这里的内容均为装饰性内容，除了<code>enable</code>选项，其他没有任何控制效果，都是装饰，所以无需担心，可以先按照我的写，后面再根据效果修改。</p><h3 id="添加模版"><a href="#添加模版" class="headerlink" title="添加模版"></a>添加模版</h3><p>下面找到主题文件下的<code>[blogRoot]/theme/butterfly/layout/post.pug</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></pre></td><td class="code"><pre><span class="line">extends includes/layout.pug</span><br><span class="line"></span><br><span class="line">block content</span><br><span class="line">  #post</span><br><span class="line">    if top_img === false</span><br><span class="line">      include includes/header/post-info.pug</span><br><span class="line"></span><br><span class="line">    article#article-container.container.post-content</span><br><span class="line">+      if page.summary &amp;&amp; theme.ai_summary.enable</span><br><span class="line">+        include includes/post/post-summary.pug</span><br><span class="line">      if theme.noticeOutdate.enable &amp;&amp; page.noticeOutdate !== false</span><br><span class="line">        include includes/post/outdate-notice.pug</span><br><span class="line">      else</span><br><span class="line">        !=page.content</span><br><span class="line">    include includes/post/post-copyright.pug</span><br><span class="line">    .tag_share</span><br></pre></td></tr></table></figure><p>删除➕号即可,<strong>注意</strong>格式缩进</p><p>面添加组件，创建文件<code>`[blogRoot]/theme/butterfly/layout/includes/post/post-summary.pug</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></pre></td><td class="code"><pre><span class="line">.ai-summary</span><br><span class="line">    .ai-topbar</span><br><span class="line">        .ai-topbar-btns</span><br><span class="line">            span.ai-dot.ai-dot-red</span><br><span class="line">            span.ai-dot.ai-dot-yellow</span><br><span class="line">            span.ai-dot.ai-dot-green</span><br><span class="line">        .ai-topbar-about</span><br><span class="line">            button#ai-about-btn 关于 AI</span><br><span class="line"></span><br><span class="line">    .ai-explanation(style=&quot;display: block;&quot; data-summary=page.summary)=theme.ai_summary.loadingText</span><br><span class="line"></span><br><span class="line">    .ai-title</span><br><span class="line">        .ai-title-left</span><br><span class="line">            i.fa-brands.fa-slack</span><br><span class="line">            .ai-title-text=theme.ai_summary.title</span><br><span class="line">        .ai-tag#ai-tag= theme.ai_summary.modelName</span><br></pre></td></tr></table></figure><h3 id="添加样式"><a href="#添加样式" class="headerlink" title="添加样式"></a>添加样式</h3><p>这样，html部分就实现好了！下面我们添加样式部分，创建文件<code>[blogRoot]/theme/butterfly/source/css/_layout/ai-summary.styl</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br></pre></td><td class="code"><pre><span class="line"></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">:root</span><br><span class="line">  // ai_summary</span><br><span class="line">  --liushen-title-font-color: #0883b7</span><br><span class="line">  --liushen-maskbg: rgba(255, 255, 255, 0.85)</span><br><span class="line">  --liushen-ai-bg: conic-gradient(from 1.5708rad at 50% 50%, #d6b300 0%, #42A2FF 54%, #d6b300 100%)</span><br><span class="line"></span><br><span class="line">  // card 背景</span><br><span class="line">  --liushen-card-secondbg: #f1f3f8</span><br><span class="line"></span><br><span class="line">  // text</span><br><span class="line">  --liushen-text: #4c4948</span><br><span class="line">  --liushen-secondtext: #3c3c43cc</span><br><span class="line"></span><br><span class="line">[data-theme=&#x27;dark&#x27;]</span><br><span class="line">  // ai_summary</span><br><span class="line">  --liushen-title-font-color: #0883b7</span><br><span class="line">  --liushen-maskbg: rgba(0, 0, 0, 0.85)</span><br><span class="line">  --liushen-ai-bg: conic-gradient(from 1.5708rad at 50% 50%, rgba(214, 178, 0, 0.46) 0%, rgba(66, 161, 255, 0.53) 54%, rgba(214, 178, 0, 0.49) 100%)</span><br><span class="line"></span><br><span class="line">  // card 背景</span><br><span class="line">  --liushen-card-secondbg: #3e3f41</span><br><span class="line"></span><br><span class="line">  // text</span><br><span class="line">  --liushen-text: #ffffffb3</span><br><span class="line">  --liushen-secondtext: #a1a2b8</span><br><span class="line"></span><br><span class="line">// ===================</span><br><span class="line">// 📘 AI 摘要模块样式</span><br><span class="line">// ===================</span><br><span class="line"></span><br><span class="line">if hexo-config(&#x27;ai_summary.enable&#x27;)</span><br><span class="line">  .ai-summary</span><br><span class="line">    background-color var(--liushen-maskbg)</span><br><span class="line">    background var(--liushen-card-secondbg)</span><br><span class="line">    border-radius 12px</span><br><span class="line">    padding 8px 8px 12px 8px</span><br><span class="line">    line-height 1.3</span><br><span class="line">    flex-direction column</span><br><span class="line">    margin-bottom 16px</span><br><span class="line">    display flex</span><br><span class="line">    gap 5px</span><br><span class="line">    position relative</span><br><span class="line"></span><br><span class="line">    // ✅ 新增：顶栏样式（仿 macOS 窗口风格）</span><br><span class="line">    .ai-topbar</span><br><span class="line">      display flex</span><br><span class="line">      justify-content space-between</span><br><span class="line">      align-items center</span><br><span class="line">      padding 6px 10px</span><br><span class="line">      margin-bottom 6px</span><br><span class="line">      border-radius 8px</span><br><span class="line">      background rgba(255, 255, 255, 0.5)</span><br><span class="line">      position relative</span><br><span class="line">      z-index 10</span><br><span class="line"></span><br><span class="line">      .ai-topbar-btns</span><br><span class="line">        display flex</span><br><span class="line">        gap 6px</span><br><span class="line"></span><br><span class="line">        .ai-dot</span><br><span class="line">          width 12px</span><br><span class="line">          height 12px</span><br><span class="line">          border-radius 50%</span><br><span class="line">          display inline-block</span><br><span class="line"></span><br><span class="line">          &amp;.ai-dot-red</span><br><span class="line">            background #ff5f56</span><br><span class="line"></span><br><span class="line">          &amp;.ai-dot-yellow</span><br><span class="line">            background #ffbd2e</span><br><span class="line"></span><br><span class="line">          &amp;.ai-dot-green</span><br><span class="line">            background #27c93f</span><br><span class="line"></span><br><span class="line">      .ai-topbar-about</span><br><span class="line">        button</span><br><span class="line">          background #49b1f5</span><br><span class="line">          color white</span><br><span class="line">          border none</span><br><span class="line">          border-radius 15px</span><br><span class="line">          padding 4px 14px</span><br><span class="line">          font-size 12px</span><br><span class="line">          cursor pointer</span><br><span class="line">          transition all 0.3s</span><br><span class="line">          font-weight 500</span><br><span class="line"></span><br><span class="line">          &amp;:hover</span><br><span class="line">            background #3a9bd5</span><br><span class="line">            transform scale(1.05)</span><br><span class="line"></span><br><span class="line">          &amp;:active</span><br><span class="line">            transform scale(0.98)</span><br><span class="line"></span><br><span class="line">    &amp;::before</span><br><span class="line">      content &#x27;&#x27;</span><br><span class="line">      position absolute</span><br><span class="line">      top 0</span><br><span class="line">      left 0</span><br><span class="line">      width 100%</span><br><span class="line">      height 100%</span><br><span class="line">      z-index 1</span><br><span class="line">      filter blur(8px)</span><br><span class="line">      opacity .4</span><br><span class="line">      background-image var(--liushen-ai-bg)</span><br><span class="line">      transform scaleX(1) scaleY(.95) translateY(2px)</span><br><span class="line"></span><br><span class="line">    &amp;::after</span><br><span class="line">      content: &#x27;&#x27;;</span><br><span class="line">      position: absolute;</span><br><span class="line">      top: 0;</span><br><span class="line">      left: 0;</span><br><span class="line">      width: 100%;</span><br><span class="line">      height: 100%;</span><br><span class="line">      z-index: 2;</span><br><span class="line">      border-radius: 12px;</span><br><span class="line">      background: var(--liushen-maskbg);</span><br><span class="line"></span><br><span class="line">    .ai-explanation</span><br><span class="line">      z-index 10</span><br><span class="line">      padding 8px 12px</span><br><span class="line">      font-size 15px</span><br><span class="line">      line-height 1.4</span><br><span class="line">      color var(--liushen-text)</span><br><span class="line">      text-align justify</span><br><span class="line"></span><br><span class="line">      // ✅ 打字机光标动画</span><br><span class="line">      &amp;::after</span><br><span class="line">        content &#x27;&#x27;</span><br><span class="line">        display inline-block</span><br><span class="line">        width 8px</span><br><span class="line">        height 2px</span><br><span class="line">        margin-left 2px</span><br><span class="line">        background var(--liushen-text)</span><br><span class="line">        vertical-align bottom</span><br><span class="line">        animation blink-underline 1s ease-in-out infinite</span><br><span class="line">        transition all .3s</span><br><span class="line">        position relative</span><br><span class="line">        bottom 3px</span><br><span class="line"></span><br><span class="line">      // 平滑滚动动画</span><br><span class="line">      // .char</span><br><span class="line">      //   display inline-block</span><br><span class="line">      //   opacity 0</span><br><span class="line">      //   animation chat-float .5s ease forwards</span><br><span class="line"></span><br><span class="line">    .ai-title</span><br><span class="line">      z-index 10</span><br><span class="line">      font-size 14px</span><br><span class="line">      display flex</span><br><span class="line">      border-radius 8px</span><br><span class="line">      align-items center</span><br><span class="line">      position relative</span><br><span class="line">      padding 0 12px</span><br><span class="line">      cursor default</span><br><span class="line">      user-select none</span><br><span class="line"></span><br><span class="line">      .ai-title-left</span><br><span class="line">        display flex</span><br><span class="line">        align-items center</span><br><span class="line">        color var(--liushen-title-font-color)</span><br><span class="line"></span><br><span class="line">        i</span><br><span class="line">          margin-right 3px</span><br><span class="line">          display flex</span><br><span class="line">          color var(--liushen-title-font-color)</span><br><span class="line">          border-radius 20px</span><br><span class="line">          justify-content center</span><br><span class="line">          align-items center</span><br><span class="line"></span><br><span class="line">        .ai-title-text</span><br><span class="line">          font-weight 500</span><br><span class="line"></span><br><span class="line">      .ai-tag</span><br><span class="line">        color var(--liushen-secondtext)</span><br><span class="line">        font-weight 300</span><br><span class="line">        margin-left auto</span><br><span class="line">        display flex</span><br><span class="line">        align-items center</span><br><span class="line">        justify-content center</span><br><span class="line">        transition .3s</span><br><span class="line"></span><br><span class="line">  // 平滑滚动动画</span><br><span class="line">  // @keyframes chat-float</span><br><span class="line">  //   0%</span><br><span class="line">  //     opacity 0</span><br><span class="line">  //     transform translateY(20px)</span><br><span class="line">  //   100%</span><br><span class="line">  //       opacity 1</span><br><span class="line">  //       transform translateY(0)</span><br><span class="line"></span><br><span class="line">  // ✅ 打字机光标闪烁动画</span><br><span class="line">  @keyframes blink-underline</span><br><span class="line">    0%, 100%</span><br><span class="line">      opacity 1</span><br><span class="line">    50%</span><br><span class="line">      opacity 0</span><br></pre></td></tr></table></figure><p>样式也实现啦！目前就差将我们的摘要插入到我们的网站就大功告成啦，为了实现的更加逼真，我这里实现了两种样式一个是打字机效果，一个是平滑显示效果，可以按需引入：</p><h3 id="添加核心js"><a href="#添加核心js" class="headerlink" title="添加核心js"></a>添加核心js</h3><p>下面我会介绍两种动效，可以按照自己的需求在自定义js文件中并在配置文件进行引入即可，两个的区别是，打字机效果更加的节省性能，而平滑显示，因为每个文本为一个span，所以会比较耗费性能。</p><h4 id="打字机效果"><a href="#打字机效果" class="headerlink" title="打字机效果"></a>打字机效果</h4><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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">// 打字机效果</span><br><span class="line">function typeTextMachineStyle(text, targetSelector, options = &#123;&#125;) &#123;</span><br><span class="line">    const &#123;</span><br><span class="line">        delay = 50,</span><br><span class="line">        startDelay = 2000,</span><br><span class="line">        onComplete = null,</span><br><span class="line">        clearBefore = true,</span><br><span class="line">        eraseBefore = true, // 新增：是否以打字机方式清除原文本</span><br><span class="line">        eraseDelay = 30,    // 新增：删除每个字符的间隔</span><br><span class="line">    &#125; = options;</span><br><span class="line"></span><br><span class="line">    const el = document.querySelector(targetSelector);</span><br><span class="line">    if (!el || typeof text !== &quot;string&quot;) return;</span><br><span class="line"></span><br><span class="line">    setTimeout(() =&gt; &#123;</span><br><span class="line">        const startTyping = () =&gt; &#123;</span><br><span class="line">            let index = 0;</span><br><span class="line">            function renderChar() &#123;</span><br><span class="line">                if (index &lt;= text.length) &#123;</span><br><span class="line">                    el.textContent = text.slice(0, index++);</span><br><span class="line">                    setTimeout(renderChar, delay);</span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    onComplete &amp;&amp; onComplete(el);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            renderChar();</span><br><span class="line">        &#125;;</span><br><span class="line"></span><br><span class="line">        if (clearBefore) &#123;</span><br><span class="line">            if (eraseBefore &amp;&amp; el.textContent.length &gt; 0) &#123;</span><br><span class="line">                let currentText = el.textContent;</span><br><span class="line">                let eraseIndex = currentText.length;</span><br><span class="line"></span><br><span class="line">                function eraseChar() &#123;</span><br><span class="line">                    if (eraseIndex &gt; 0) &#123;</span><br><span class="line">                        el.textContent = currentText.slice(0, --eraseIndex);</span><br><span class="line">                        setTimeout(eraseChar, eraseDelay);</span><br><span class="line">                    &#125; else &#123;</span><br><span class="line">                        startTyping(); // 删除完毕后开始打字</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                eraseChar();</span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                el.textContent = &quot;&quot;;</span><br><span class="line">                startTyping();</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            startTyping();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;, startDelay);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function renderAISummary() &#123;</span><br><span class="line">    const summaryEl = document.querySelector(&#x27;.ai-summary .ai-explanation&#x27;);</span><br><span class="line">    if (!summaryEl) return;</span><br><span class="line"></span><br><span class="line">    const summaryText = summaryEl.getAttribute(&#x27;data-summary&#x27;);</span><br><span class="line">    if (summaryText) &#123;</span><br><span class="line">        typeTextMachineStyle(summaryText, &quot;.ai-summary .ai-explanation&quot;); // 如果需要切换，在这里调用另一个函数即可</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    // 绑定关于 AI 按钮点击事件</span><br><span class="line">    const aboutBtn = document.getElementById(&#x27;ai-about-btn&#x27;);</span><br><span class="line">    if (aboutBtn) &#123;</span><br><span class="line">        aboutBtn.addEventListener(&#x27;click&#x27;, function() &#123;</span><br><span class="line">            window.location.reload();</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">document.addEventListener(&#x27;pjax:complete&#x27;, renderAISummary);</span><br><span class="line">document.addEventListener(&#x27;DOMContentLoaded&#x27;, renderAISummary);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="平滑显示效果"><a href="#平滑显示效果" class="headerlink" title="平滑显示效果"></a>平滑显示效果</h4><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><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></pre></td><td class="code"><pre><span class="line"> // 平滑弹出效果</span><br><span class="line"> function typeText(text, targetSelector, options = &#123;&#125;) &#123;</span><br><span class="line">     const &#123;</span><br><span class="line">       delay = 50,          // 每个字符之间的延迟（毫秒）</span><br><span class="line">       startDelay = 2000,   // 开始打字前的延迟（默认 3 秒）</span><br><span class="line">       onComplete = null,   // 动画完成后的回调</span><br><span class="line">       clearBefore = true   // 是否在开始前清空原有内容</span><br><span class="line">     &#125; = options;</span><br><span class="line"></span><br><span class="line">     const targetEl = document.querySelector(targetSelector);</span><br><span class="line">     if (!targetEl || typeof text !== &quot;string&quot;) return;</span><br><span class="line"></span><br><span class="line">     // if (clearBefore) targetEl.textContent = &quot;&quot;;</span><br><span class="line"></span><br><span class="line">     let index = 0;</span><br><span class="line">     let frameId = null;</span><br><span class="line"></span><br><span class="line">     function renderChar() &#123;</span><br><span class="line">       if (index &lt; text.length) &#123;</span><br><span class="line">         const span = document.createElement(&quot;span&quot;);</span><br><span class="line">         span.textContent = text[index++];</span><br><span class="line">         span.className = &quot;char&quot;;</span><br><span class="line">         targetEl.appendChild(span);</span><br><span class="line">         frameId = requestAnimationFrame(() =&gt; setTimeout(renderChar, delay));</span><br><span class="line">       &#125; else &#123;</span><br><span class="line">         cancelAnimationFrame(frameId);</span><br><span class="line">         onComplete &amp;&amp; onComplete(targetEl);</span><br><span class="line">       &#125;</span><br><span class="line">     &#125;</span><br><span class="line"></span><br><span class="line">     setTimeout(() =&gt; &#123;</span><br><span class="line">         if (clearBefore) targetEl.textContent = &quot;&quot;;</span><br><span class="line">         renderChar();</span><br><span class="line">     &#125;, startDelay);</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line">function renderAISummary() &#123;</span><br><span class="line">    const summaryEl = document.querySelector(&#x27;.ai-summary .ai-explanation&#x27;);</span><br><span class="line">    if (!summaryEl) return;</span><br><span class="line"></span><br><span class="line">    const summaryText = summaryEl.getAttribute(&#x27;data-summary&#x27;);</span><br><span class="line">    if (summaryText) &#123;</span><br><span class="line">        typeText(summaryText, &quot;.ai-summary .ai-explanation&quot;); // 如果需要切换，在这里调用另一个函数即可</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">document.addEventListener(&#x27;pjax:complete&#x27;, renderAISummary);</span><br><span class="line">document.addEventListener(&#x27;DOMContentLoaded&#x27;, renderAISummary);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>注意，平滑滚动部分的css，我默认注释掉了，请在样式文件中自行打开注释。</p><p>这样，一个自己实现的AI摘要就完工啦！</p><h3 id="关于AI夜晚适配样式"><a href="#关于AI夜晚适配样式" class="headerlink" title="关于AI夜晚适配样式"></a>关于AI夜晚适配样式</h3><p>加入任意自定义css文件中,加入以下代码</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></pre></td><td class="code"><pre><span class="line">/* --- AI 摘要夜间模式适配 --- */</span><br><span class="line">[data-theme=&#x27;dark&#x27;] .ai-summary &#123;</span><br><span class="line">    /* 调整夜间背景色，使其与卡片背景融合 */</span><br><span class="line">    background: var(--card-bg) !important;</span><br><span class="line">    border: 1px solid var(--hr-border) !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/* 适配夜间模式的顶栏 */</span><br><span class="line">[data-theme=&#x27;dark&#x27;] .ai-summary .ai-topbar &#123;</span><br><span class="line">    background: rgba(0, 0, 0, 0.2) !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/* 适配夜间模式的“关于”按钮 */</span><br><span class="line">[data-theme=&#x27;dark&#x27;] .ai-summary .ai-topbar-about button &#123;</span><br><span class="line">    background: #3e4c59 !important; /* 深色按钮背景 */</span><br><span class="line">    color: #a1a2b8 !important;      /* 浅色文字 */</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">[data-theme=&#x27;dark&#x27;] .ai-summary .ai-topbar-about button:hover &#123;</span><br><span class="line">    background: #49b1f5 !important; /* 悬停时变亮 */</span><br><span class="line">    color: #fff !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/* 确保夜间模式下文字清晰 */</span><br><span class="line">[data-theme=&#x27;dark&#x27;] .ai-summary .ai-explanation &#123;</span><br><span class="line">    color: var(--font-color) !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">[data-theme=&#x27;dark&#x27;] .ai-summary .ai-title-left &#123;</span><br><span class="line">    color: #49b1f5 !important; /* 标题图标颜色 */</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h3><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.liushen.fun/posts/40702a0d/">    <div class="tag-link-tips">✅来自本站，本站可确保其安全性，请放心点击跳转</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/08/01/66aae601dbc9b.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">liushen的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div>]]>
    </content>
    <id>http://example.com/posts/ee57c6e1.html</id>
    <link href="http://example.com/posts/ee57c6e1.html"/>
    <published>2026-04-05T09:21:25.462Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>前言,观看了各个博客圈的大佬,都有非常炫丽的AI摘要,因此找了众多教程最后发现了liushen 的教程笔记,本篇主要是用于记录制作过程,方便后续参考</p>
</blockquote>
<h3 id="教程"><a href="#教程" class]]>
    </summary>
    <title>魔改笔记三:本地实现hexo文章AI摘要</title>
    <updated>2026-04-06T15:13:12.215Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="筑站手朴" scheme="http://example.com/categories/%E7%AD%91%E7%AB%99%E6%89%8B%E6%9C%B4/"/>
    <category term="hexo" scheme="http://example.com/tags/hexo/"/>
    <content>
      <![CDATA[<blockquote><p>本文中的[blogRoot] 是指你博客的根目录</p></blockquote><h3 id="如何引用自定义的js"><a href="#如何引用自定义的js" class="headerlink" title="如何引用自定义的js"></a>如何引用自定义的js</h3><p>首先你要创建文件夹</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">[blogRoot]/source/js</span><br></pre></td></tr></table></figure><h4 id="示例"><a href="#示例" class="headerlink" title="示例:"></a>示例:</h4><p>创建文件</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">[blogRoot]/source/js/custom.js</span><br></pre></td></tr></table></figure><p>在<code>[blogRoot]/_config.butterfly.yml</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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"># Inject</span><br><span class="line"># Insert the code to head (before &#x27;&lt;/head&gt;&#x27; tag) and the bottom (before &#x27;&lt;/body&gt;&#x27; tag)</span><br><span class="line">inject:</span><br><span class="line">  head:</span><br><span class="line">  bottom:</span><br><span class="line">    - &lt;script defer src=&quot;/js/custom.js&quot;&gt;&lt;/script&gt;</span><br><span class="line">    - &lt;script data-pjax type=&quot;text/javascript&quot; src=&quot;/js/&#123;把大括号里面的这个换成你的js名字&#125;.js&quot;&gt;&lt;/script</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>注意</strong>:</p><pre><code>* 如果使用 pjax 建议加上 `data-pjax`</code></pre><h3 id="如何引用自定义的css"><a href="#如何引用自定义的css" class="headerlink" title="如何引用自定义的css"></a>如何引用自定义的css</h3><p>首先你要创建文件夹</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">[blogRoot]/source/css</span><br></pre></td></tr></table></figure><h4 id="示例-1"><a href="#示例-1" class="headerlink" title="示例:"></a>示例:</h4><p>创建文件</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">[blogRoot]/source/js/custom.css</span><br></pre></td></tr></table></figure><p>在<code>[blogRoot]/_config.butterfly.yml</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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"># Inject</span><br><span class="line"># Insert the code to head (before &#x27;&lt;/head&gt;&#x27; tag) and the bottom (before &#x27;&lt;/body&gt;&#x27; tag)</span><br><span class="line">inject:</span><br><span class="line">  head:</span><br><span class="line">    - &lt;script defer src=&quot;/js/custom.css&quot;&gt;&lt;/script&gt;</span><br><span class="line">  bottom:</span><br><span class="line">    - &lt;script defer src=&quot;/js/custom.js&quot;&gt;&lt;/script&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>注意</strong>:</p><pre><code>* 引用css一定要写在head,否侧可能会出现短暂无css</code></pre>]]>
    </content>
    <id>http://example.com/posts/af2ccca0.html</id>
    <link href="http://example.com/posts/af2ccca0.html"/>
    <published>2026-04-05T02:42:09.065Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>本文中的[blogRoot] 是指你博客的根目录</p>
</blockquote>
<h3 id="如何引用自定义的js"><a href="#如何引用自定义的js" class="headerlink" title="如何引用自定义的js"><]]>
    </summary>
    <title>魔改前置知识</title>
    <updated>2026-04-05T14:21:38.395Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="筑站手朴" scheme="http://example.com/categories/%E7%AD%91%E7%AB%99%E6%89%8B%E6%9C%B4/"/>
    <category term="hexo" scheme="http://example.com/tags/hexo/"/>
    <content>
      <![CDATA[<h3 id="魔改教程"><a href="#魔改教程" class="headerlink" title="魔改教程"></a>魔改教程</h3><p><strong>注意: 由于本次魔改修改了主题内部文件,一定要注意提前备份! 一定要注意提前备份! 一定要注意提前备份!</strong></p><h3 id="分类条"><a href="#分类条" class="headerlink" title="分类条"></a>分类条</h3><p>我原有的分类条采用的是小冰的分类卡片,但是我中感觉占用空间较大,且出现多个分类会显示滚动条.我个人觉得不够美观,因此在网上查找分类条的魔改,正好看到了 liushen 博主发的文章,由于liushen博主的魔改教程是适用于旧版的butterfly主题,而我采用的是新版的butterfly主题,因此做了这篇教程.如果没有魔改基础建议紧跟教程，如果有任何问题可以在下方评论区提出。</p><h3 id="效果真实图"><a href="#效果真实图" class="headerlink" title="效果真实图"></a>效果真实图</h3><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260404214007957.png" alt="image-20260404214007957"></p><h3 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h3><p>1、新建文件 <span class='p red'>[BlogRoot]\themes\butterfly\layout\includes\categoryBar.pug</span>文件,写入</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></pre></td><td class="code"><pre><span class="line">.category-bar-items#category-bar-items(class=is_home() ? &#x27;home&#x27; : &#x27;&#x27;)</span><br><span class="line">  .category-bar-item(class=is_home() ? &#x27;select&#x27; : &#x27;&#x27;, id=&quot;category-bar-home&quot;)</span><br><span class="line">    a(href=url_for(&#x27;/&#x27;))= __(&#x27;博客首页&#x27;)</span><br><span class="line">  each item in site.categories.find(&#123; parent: &#123; $exists: false &#125; &#125;).data</span><br><span class="line">    .category-bar-item(class=select ? (select === item.name ? &#x27;select&#x27; : &#x27;&#x27;) : &#x27;&#x27;, id=item.name)</span><br><span class="line">      a(href=url_for(item.path))= item.name</span><br><span class="line">  .category-bar-item</span><br><span class="line">    a(href=url_for(&#x27;/archives/&#x27;))= __(&#x27;文章存档&#x27;)</span><br><span class="line">div.category-bar-right</span><br><span class="line">  a.category-bar-more(href=url_for(&#x27;/categories/&#x27;))= __(&#x27;更多分类&#x27;)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>以上就是该滚动条的结构，下面我们开始实现样式的定义，</p><p>2、新建文件<span class='p red'>[BlogRoot]\themes\butterfly\source\css\_layout\category-bar.styl</span>写入以下文件：</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><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></pre></td><td class="code"><pre><span class="line">#category-bar</span><br><span class="line">  padding 7px 11px</span><br><span class="line">  background var(--card-bg)</span><br><span class="line">  border-radius 8px</span><br><span class="line">  display flex</span><br><span class="line">  white-space nowrap</span><br><span class="line">  overflow hidden</span><br><span class="line">  transition 0.3s</span><br><span class="line">  height 50px</span><br><span class="line">  width 100%</span><br><span class="line">  justify-content space-between</span><br><span class="line">  user-select none</span><br><span class="line">  align-items center</span><br><span class="line">  margin-bottom 20px</span><br><span class="line"></span><br><span class="line">  .category-bar-right</span><br><span class="line">    display flex</span><br><span class="line">    border-radius 8px</span><br><span class="line">    align-items center</span><br><span class="line"></span><br><span class="line">    .category-bar-more</span><br><span class="line">      margin-left 4px</span><br><span class="line">      margin-right 4px</span><br><span class="line">      font-weight 700</span><br><span class="line">      border-radius 8px</span><br><span class="line">      padding 0 8px</span><br><span class="line"></span><br><span class="line">  .category-bar-items</span><br><span class="line">    width 100%</span><br><span class="line">    white-space nowrap</span><br><span class="line">    overflow-x scroll</span><br><span class="line">    scrollbar-width: none</span><br><span class="line">    -ms-overflow-style: none</span><br><span class="line">    overflow-y hidden</span><br><span class="line">    display flex</span><br><span class="line">    border-radius 8px</span><br><span class="line">    align-items center</span><br><span class="line">    height 30px</span><br><span class="line"></span><br><span class="line">    &amp;::-webkit-scrollbar</span><br><span class="line">      display: none</span><br><span class="line"></span><br><span class="line">    .category-bar-item</span><br><span class="line">      a</span><br><span class="line">        padding .1rem .5rem</span><br><span class="line">        margin-right 6px</span><br><span class="line">        font-weight 700</span><br><span class="line">        border-radius 8px</span><br><span class="line">        display flex</span><br><span class="line">        align-items center</span><br><span class="line">        height 30px</span><br><span class="line"></span><br><span class="line">      &amp;.select</span><br><span class="line">        a</span><br><span class="line">          background #3eb8be</span><br><span class="line">          color var(--btn-color)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>3、打开文件<span class='p red'>[BlogRoot]\themes\butterfly\layout\includes\mixins\indexPostUI.pug</span></p><p>方式一:添加以下两行代码，删除<code>+</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></pre></td><td class="code"><pre><span class="line">mixin indexPostUI()</span><br><span class="line">  - const indexLayout = theme.index_layout</span><br><span class="line">  - const masonryLayoutClass = (indexLayout === 6 || indexLayout === 7) ? &#x27;masonry&#x27; : &#x27;&#x27;</span><br><span class="line">  #recent-posts.recent-posts.nc(class=masonryLayoutClass)</span><br><span class="line">+    #category-bar.category-bar</span><br><span class="line">+      include ../categoryBar.pug</span><br><span class="line">    .recent-post-items</span><br><span class="line">      each article, index in page.posts.data</span><br><span class="line"></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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br></pre></td><td class="code"><pre><span class="line">mixin indexPostUI()</span><br><span class="line">  - const indexLayout = theme.index_layout</span><br><span class="line">  - const masonryLayoutClass = [6, 7].includes(indexLayout) ? &#x27;masonry&#x27; : &#x27;&#x27;</span><br><span class="line">  #recent-posts.recent-posts.nc(class=masonryLayoutClass)</span><br><span class="line">    #category-bar.category-bar</span><br><span class="line">      include ../categoryBar.pug</span><br><span class="line">    .recent-post-items</span><br><span class="line">      each article, index in page.posts.data</span><br><span class="line">        .recent-post-item</span><br><span class="line">          - const link = article.link || article.path</span><br><span class="line">          - const title = article.title || _p(&#x27;no_title&#x27;)</span><br><span class="line">          - const leftOrRight = indexLayout === 3 ? (index % 2 === 0 ? &#x27;left&#x27; : &#x27;right&#x27;) : (indexLayout === 2 ? &#x27;right&#x27; : &#x27;&#x27;)</span><br><span class="line">          - const postCover = article.cover</span><br><span class="line">          - const noCover = article.cover === false || !theme.cover.index_enable ? &#x27;no-cover&#x27; : &#x27;&#x27;</span><br><span class="line"></span><br><span class="line">          if postCover &amp;&amp; theme.cover.index_enable</span><br><span class="line">            .post_cover(class=leftOrRight)</span><br><span class="line">              a(href=url_for(link) title=title)</span><br><span class="line">                if article.cover_type === &#x27;img&#x27;</span><br><span class="line">                  img.post-bg(src=url_for(postCover) onerror=`this.onerror=null;this.src=&#x27;$&#123;url_for(theme.error_img.post_page)&#125;&#x27;` alt=title)</span><br><span class="line">                else</span><br><span class="line">                  div.post-bg(style=`background: $&#123;postCover&#125;`)</span><br><span class="line">          .recent-post-info(class=noCover)</span><br><span class="line">            a.article-title(href=url_for(link) title=title)</span><br><span class="line">              if globalPageType === &#x27;home&#x27; &amp;&amp; (article.top || article.sticky &gt; 0)</span><br><span class="line">                i.fas.fa-thumbtack.sticky</span><br><span class="line">              = title</span><br><span class="line">            .article-meta-wrap</span><br><span class="line">              if theme.post_meta.page.date_type</span><br><span class="line">                span.post-meta-date</span><br><span class="line">                  if theme.post_meta.page.date_type === &#x27;both&#x27;</span><br><span class="line">                    i.far.fa-calendar-alt</span><br><span class="line">                    span.article-meta-label=_p(&#x27;post.created&#x27;)</span><br><span class="line">                    time.post-meta-date-created(datetime=date_xml(article.date) title=_p(&#x27;post.created&#x27;) + &#x27; &#x27; + full_date(article.date))= date(article.date, config.date_format)</span><br><span class="line">                    span.article-meta-separator |</span><br><span class="line">                    i.fas.fa-history</span><br><span class="line">                    span.article-meta-label=_p(&#x27;post.updated&#x27;)</span><br><span class="line">                    time.post-meta-date-updated(datetime=date_xml(article.updated) title=_p(&#x27;post.updated&#x27;) + &#x27; &#x27; + full_date(article.updated))= date(article.updated, config.date_format)</span><br><span class="line">                  else</span><br><span class="line">                    - const isUpdatedType = theme.post_meta.page.date_type === &#x27;updated&#x27;</span><br><span class="line">                    - const dateType = isUpdatedType ? &#x27;updated&#x27; : &#x27;date&#x27;</span><br><span class="line">                    - const dateIcon = isUpdatedType ? &#x27;fas fa-history&#x27; : &#x27;far fa-calendar-alt&#x27;</span><br><span class="line">                    - const dateTitle = isUpdatedType ? _p(&#x27;post.updated&#x27;) : _p(&#x27;post.created&#x27;)</span><br><span class="line">                    i(class=dateIcon)</span><br><span class="line">                    span.article-meta-label= dateTitle</span><br><span class="line">                    time(datetime=date_xml(article[dateType]) title=dateTitle + &#x27; &#x27; + full_date(article[dateType]))= date(article[dateType], config.date_format)</span><br><span class="line">              if theme.post_meta.page.categories &amp;&amp; article.categories.data.length &gt; 0</span><br><span class="line">                span.article-meta</span><br><span class="line">                  span.article-meta-separator |</span><br><span class="line">                  each item, index in article.categories.data</span><br><span class="line">                    i.fas.fa-inbox</span><br><span class="line">                    a(href=url_for(item.path)).article-meta__categories #[=item.name]</span><br><span class="line">                    if index &lt; article.categories.data.length - 1</span><br><span class="line">                      i.fas.fa-angle-right.article-meta-link</span><br><span class="line">              if theme.post_meta.page.tags &amp;&amp; article.tags.length &gt; 0</span><br><span class="line">                span.article-meta.tags</span><br><span class="line">                  span.article-meta-separator |</span><br><span class="line">                  each item, index in article.tags.data</span><br><span class="line">                    i.fas.fa-tag</span><br><span class="line">                    a(href=url_for(item.path)).article-meta__tags #[=item.name]</span><br><span class="line">                    if index &lt; article.tags.data.length - 1</span><br><span class="line">                      span.article-meta-link #[=&#x27;•&#x27;]</span><br><span class="line"></span><br><span class="line">              mixin countBlockInIndex</span><br><span class="line">                - needLoadCountJs = true</span><br><span class="line">                span.article-meta</span><br><span class="line">                  span.article-meta-separator |</span><br><span class="line">                  i.fas.fa-comments</span><br><span class="line">                  if block</span><br><span class="line">                    block</span><br><span class="line">                  span.article-meta-label= &#x27; &#x27; + _p(&#x27;card_post_count&#x27;)</span><br><span class="line"></span><br><span class="line">              if theme.comments.card_post_count &amp;&amp; theme.comments.use</span><br><span class="line">                - const commentSystem = theme.comments.use[0]</span><br><span class="line">                - const commentLink = url_for(link) + &#x27;#post-comment&#x27;</span><br><span class="line"></span><br><span class="line">                case commentSystem</span><br><span class="line">                  when &#x27;Disqus&#x27;</span><br><span class="line">                  when &#x27;Disqusjs&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a.disqus-count(href=full_url_for(link) + &#x27;#post-comment&#x27;)</span><br><span class="line">                        i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Valine&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=commentLink)</span><br><span class="line">                        span.valine-comment-count(data-xid=url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Waline&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=commentLink)</span><br><span class="line">                        span.waline-comment-count(data-path=url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Twikoo&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a.twikoo-count(href=commentLink)</span><br><span class="line">                        i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Facebook Comments&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=commentLink)</span><br><span class="line">                        span.fb-comments-count(data-href=urlNoIndex(article.permalink))</span><br><span class="line">                  when &#x27;Remark42&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=commentLink)</span><br><span class="line">                        span.remark42__counter(data-url=urlNoIndex(article.permalink))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line">                  when &#x27;Artalk&#x27;</span><br><span class="line">                    +countBlockInIndex</span><br><span class="line">                      a(href=commentLink)</span><br><span class="line">                        span.artalk-count(data-page-key=url_for(link))</span><br><span class="line">                          i.fa-solid.fa-spinner.fa-spin</span><br><span class="line"></span><br><span class="line">            //- Display the article introduction on homepage</span><br><span class="line">            - const content = postDesc(article)</span><br><span class="line">            if content</span><br><span class="line">              .content!=content</span><br><span class="line"></span><br><span class="line">        if theme.ad &amp;&amp; theme.ad.index</span><br><span class="line">          if (index + 1) % 3 === 0</span><br><span class="line">            .recent-post-item.ads-wrap!= theme.ad.index</span><br><span class="line"></span><br><span class="line">    include ../pagination.pug</span><br></pre></td></tr></table></figure><p>4、打开<span class='p red'>[BlogRoot]\themes\butterfly\source\js\main.js</span>，添加js函数，比如我添加到了778行左右，switchComments函数的上面：</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></pre></td><td class="code"><pre><span class="line">/**</span><br><span class="line">   * 自己写的，实现功能切换类别表</span><br><span class="line">   */ </span><br><span class="line">  const setCategoryBarActive = () =&gt; &#123;</span><br><span class="line">    const categoryBar = document.querySelector(&quot;#category-bar&quot;);</span><br><span class="line">    const currentPath = decodeURIComponent(window.location.pathname);</span><br><span class="line">    const isHomePage = currentPath === GLOBAL_CONFIG.root;</span><br><span class="line"></span><br><span class="line">    if (categoryBar) &#123;</span><br><span class="line">        const categoryItems = categoryBar.querySelectorAll(&quot;.category-bar-item&quot;);</span><br><span class="line">        categoryItems.forEach(item =&gt; item.classList.remove(&quot;select&quot;));</span><br><span class="line"></span><br><span class="line">        const activeItemId = isHomePage ? &quot;category-bar-home&quot; : currentPath.split(&quot;/&quot;).slice(-2, -1)[0];</span><br><span class="line">        const activeItem = document.getElementById(activeItemId);</span><br><span class="line"></span><br><span class="line">        if (activeItem) &#123;</span><br><span class="line">            activeItem.classList.add(&quot;select&quot;);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></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></pre></td><td class="code"><pre><span class="line">window.refreshFn = function () &#123;</span><br><span class="line">  initAdjust()</span><br><span class="line"></span><br><span class="line">  if (GLOBAL_CONFIG_SITE.isPost) &#123;</span><br><span class="line">    GLOBAL_CONFIG.noticeOutdate !== undefined &amp;&amp; addPostOutdateNotice()</span><br><span class="line">    GLOBAL_CONFIG.relativeDate.post &amp;&amp; relativeDate(document.querySelectorAll(&#x27;#post-meta time&#x27;))</span><br><span class="line">  &#125; else &#123;</span><br><span class="line">    GLOBAL_CONFIG.relativeDate.homepage &amp;&amp; relativeDate(document.querySelectorAll(&#x27;#recent-posts time&#x27;))</span><br><span class="line">    GLOBAL_CONFIG.runtime &amp;&amp; addRuntime()</span><br><span class="line">    addLastPushDate()</span><br><span class="line">    toggleCardCategory()</span><br><span class="line">    setCategoryBarActive()      // 自己加的，用于切换类别栏目</span><br><span class="line">  &#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>5、打开<span class='p red'>[BlogRoot]/_config.butterfly.yml</span> 文件中修改以下配置</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">category_ui: index</span><br></pre></td></tr></table></figure><p>最后，hexo三件套，应该就能看到效果了！请根据自己的需要进行定制化。</p><h3 id="由于我对框架进行了魔改-因此出现了以下bug"><a href="#由于我对框架进行了魔改-因此出现了以下bug" class="headerlink" title="由于我对框架进行了魔改,因此出现了以下bug"></a>由于我对框架进行了魔改,因此出现了以下bug</h3><p>就是出现在对应的页面不会显示对应的tag</p><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260404225640499.png" alt="image-20260404225640499"></p><p>因此需要在自定义的css中加入以下代码</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></pre></td><td class="code"><pre><span class="line">/*======================================================*/</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">/* 分类页面分页样式修复 - 确保当前页背景色正常显示 */</span><br><span class="line">#category .pagination .page-number.current &#123;</span><br><span class="line">  background: var(--theme-paginator-color, #00c4b6) !important;</span><br><span class="line">  color: #fff !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/* 归档页面分页样式保持一致 */</span><br><span class="line">#archive .pagination .page-number.current &#123;</span><br><span class="line">  background: var(--theme-paginator-color, #00c4b6) !important;</span><br><span class="line">  color: #fff !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/* 标签页面分页样式保持一致 */</span><br><span class="line">#tag .pagination .page-number.current &#123;</span><br><span class="line">  background: var(--theme-paginator-color, #00c4b6) !important;</span><br><span class="line">  color: #fff !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/* 确保分页按钮在悬停时也有正确的样式 */</span><br><span class="line">#category .pagination &gt; *:not(.space):not(.current):hover,</span><br><span class="line">#archive .pagination &gt; *:not(.space):not(.current):hover,</span><br><span class="line">#tag .pagination &gt; *:not(.space):not(.current):hover &#123;</span><br><span class="line">  background: var(--btn-hover-color) !important;</span><br><span class="line">  color: var(--btn-color) !important;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h3><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.liushen.fun/posts/a64defb4/">    <div class="tag-link-tips">✅来自本站，本站可确保其安全性，请放心点击跳转</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/08/01/66aae601dbc9b.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">liushen的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div>]]>
    </content>
    <id>http://example.com/posts/adc35f4d.html</id>
    <link href="http://example.com/posts/adc35f4d.html"/>
    <published>2026-04-04T13:32:03.214Z</published>
    <summary>
      <![CDATA[<h3 id="魔改教程"><a href="#魔改教程" class="headerlink" title="魔改教程"></a>魔改教程</h3><p><strong>注意: 由于本次魔改修改了主题内部文件,一定要注意提前备份! 一定要注意提前备份! 一定要注意提前备份!</]]>
    </summary>
    <title>魔改笔记二:文章分类条</title>
    <updated>2026-04-05T14:21:38.400Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="筑站手朴" scheme="http://example.com/categories/%E7%AD%91%E7%AB%99%E6%89%8B%E6%9C%B4/"/>
    <category term="hexo" scheme="http://example.com/tags/hexo/"/>
    <content>
      <![CDATA[<h3 id="个人卡片背景图"><a href="#个人卡片背景图" class="headerlink" title="个人卡片背景图"></a>个人卡片背景图</h3><p>1、在自建的css样式中加入一下代码</p><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;light&quot;</span>]</span> <span class="selector-id">#aside-content</span> &gt; <span class="selector-class">.card-widget</span><span class="selector-class">.card-info</span> &#123;</span><br><span class="line">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://s11.ax1x.com/2023/05/02/p9GWEin.jpg</span>);</span><br><span class="line">    <span class="attribute">background-repeat</span>: no-repeat;</span><br><span class="line">    <span class="attribute">background-attachment</span>: inherit;</span><br><span class="line">    <span class="attribute">background-size</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> <span class="selector-id">#aside-content</span> &gt; <span class="selector-class">.card-widget</span><span class="selector-class">.card-info</span> &#123;</span><br><span class="line">    <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">https://s11.ax1x.com/2023/05/02/p9GWVGq.jpg</span>);</span><br><span class="line">    <span class="attribute">background-repeat</span>: no-repeat;</span><br><span class="line">    <span class="attribute">background-attachment</span>: inherit;</span><br><span class="line">    <span class="attribute">background-size</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 个人信息卡片背景图 */</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="归档、分类详情页卡片样式开发"><a href="#归档、分类详情页卡片样式开发" class="headerlink" title="归档、分类详情页卡片样式开发"></a>归档、分类详情页卡片样式开发</h3><h4 id="预览"><a href="#预览" class="headerlink" title="预览"></a>预览</h4><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="http://114.55.88.209/archives/">    <div class="tag-link-tips">🪧引用站外地址，不保证站点的可用性和安全性</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/07/27/66a4632bbf06e.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">Hexo的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><p>首先创建<strong>根目录/source/css/layout.css</strong> 文件</p><figure class="highlight css"><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 归档、标签、分类页 */</span></span><br><span class="line"><span class="selector-pseudo">:root</span> &#123;</span><br><span class="line">    <span class="attr">--ichika-color</span>: <span class="built_in">rgba</span>(<span class="number">100</span>, <span class="number">180</span>, <span class="number">239</span>, <span class="number">0.51</span>);</span><br><span class="line">    <span class="attr">--ichika-hover-color</span>: <span class="number">#ECAFFF</span>;</span><br><span class="line">    <span class="attr">--ichika-widget-hover</span>: <span class="number">#CFF0FF</span>;</span><br><span class="line">    <span class="attr">--ichika-font-white</span>: <span class="number">#FDFDFD</span>;</span><br><span class="line">    <span class="attr">--ichika-light-green</span>: <span class="number">#B2FFCA</span>;</span><br><span class="line">    <span class="attr">--ichika-light-purple</span>: <span class="number">#F6B9FF</span>;</span><br><span class="line">    <span class="attr">--ichika-green</span>: <span class="number">#11D991</span>;</span><br><span class="line">    <span class="attr">--ichika-purple</span>: <span class="number">#E764FF</span>;</span><br><span class="line">    <span class="attr">--ichika-light-grey</span>: <span class="number">#F2F2F2</span>;</span><br><span class="line">    <span class="attr">--ichika-card-bg</span>: <span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">0.45</span>);</span><br><span class="line">    <span class="attr">--ichika-emphasis-color</span>: <span class="number">#F7F81A</span>;</span><br><span class="line">    <span class="attr">--ichika-bgblur</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span><br><span class="line">    <span class="attr">--ichika-footer-bg</span>: <span class="built_in">linear-gradient</span>(to bottom,transparent <span class="number">0%</span>,<span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">0.7</span>) <span class="number">40%</span>);</span><br><span class="line">    <span class="attr">--ichika-font-grey</span>: <span class="number">#888888</span>;</span><br><span class="line">    <span class="attr">--ichika-categorycard-bg</span>: <span class="built_in">linear-gradient</span>(to top,<span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">0</span>),<span class="built_in">rgba</span>(<span class="number">255</span>,<span class="number">255</span>,<span class="number">255</span>,<span class="number">1</span>))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&#x27;dark&#x27;</span>]</span> &#123;</span><br><span class="line">    <span class="attr">--global-bg</span>:black;</span><br><span class="line">    <span class="attr">--ichika-color</span>: <span class="number">#1688C9</span>;</span><br><span class="line">    <span class="attr">--ichika-widget-hover</span>: <span class="number">#1B6587</span>;</span><br><span class="line">    <span class="attr">--ichika-card-bg</span>: <span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0.7</span>);</span><br><span class="line">    <span class="attr">--ichika-footer-bg</span>: <span class="built_in">linear-gradient</span>(to bottom,transparent <span class="number">0%</span>,<span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0.7</span>) <span class="number">40%</span>);</span><br><span class="line">    <span class="attr">--ichika-font-grey</span>: <span class="number">#BBBBBB</span>;</span><br><span class="line">    <span class="attr">--ichika-categorycard-bg</span>:<span class="built_in">linear-gradient</span>(to top,<span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>),<span class="built_in">rgba</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">1</span>))</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="selector-class">.layout</span><span class="selector-class">.hide-aside</span>&#123;</span><br><span class="line">    <span class="attribute">max-width</span>:<span class="number">1200px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#archive</span>,<span class="selector-id">#tag</span>,<span class="selector-id">#category</span> &#123;</span><br><span class="line">    <span class="attribute">background</span>: <span class="built_in">var</span>(--ichika-card-bg);</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">25px</span> <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-title</span>&#123;</span><br><span class="line">    <span class="attribute">margin-top</span>:<span class="number">30px</span>;</span><br><span class="line">    <span class="attribute">margin-bottom</span>:<span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">::before</span>, <span class="selector-class">.article-sort-title</span><span class="selector-pseudo">::before</span>, <span class="selector-class">.article-sort-title</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">    <span class="attribute">content</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort</span> <span class="selector-class">.year</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">100%</span><span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">border-bottom</span>:dashed <span class="number">5px</span> <span class="built_in">var</span>(--ichika-color);</span><br><span class="line">    <span class="attribute">font-size</span>:<span class="number">26px</span>;</span><br><span class="line">    <span class="attribute">margin-top</span>:<span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:none;</span><br><span class="line">    <span class="attribute">display</span>:flex;</span><br><span class="line">    <span class="attribute">flex-wrap</span>:wrap;</span><br><span class="line">    <span class="attribute">margin</span>:<span class="number">20px</span> <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">padding</span>:<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>)&#123;</span><br><span class="line">    <span class="attribute">padding</span>:<span class="number">8px</span> <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="built_in">calc</span>(<span class="number">50%</span> - <span class="number">0.8rem</span>);</span><br><span class="line">    <span class="attribute">margin</span>:<span class="number">0.4rem</span>;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">2px</span> solid <span class="built_in">var</span>(--ichika-color);</span><br><span class="line">    <span class="attribute">border-radius</span>:<span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">var</span>(--card-bg);</span><br><span class="line">    <span class="attribute">transition</span>:<span class="number">0.5s</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">120px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item-a</span>&#123;</span><br><span class="line">    <span class="attribute">position</span>:absolute;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item-img</span>&#123;</span><br><span class="line">    <span class="attribute">transition</span>:<span class="number">0.5s</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">90px</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">140px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span> &gt; <span class="selector-tag">a</span> &gt;<span class="selector-tag">img</span>&#123;</span><br><span class="line">    <span class="attribute">border-radius</span>:<span class="number">15px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item-title</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">22px</span>;</span><br><span class="line">    <span class="attribute">padding-left</span>: <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">line-height</span>:<span class="number">25px</span>;</span><br><span class="line">    <span class="attribute">text-overflow</span>:ellipsis;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item-title</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">transform</span>:none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-meta</span>&#123;</span><br><span class="line">    <span class="attribute">height</span>:max-content;</span><br><span class="line">    <span class="attribute">position</span>:relative;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-meta</span> &gt; <span class="selector-class">.article-meta-wrap</span>&#123;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:left</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-meta</span> &gt; <span class="selector-class">.article-sort-item-time</span>&#123;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:right</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item-categories</span>,<span class="selector-class">.article-sort-item-tags</span>&#123;</span><br><span class="line">    <span class="attribute">margin</span>:<span class="number">0</span> <span class="number">3px</span>;</span><br><span class="line">    <span class="attribute">padding</span>:<span class="number">5px</span> <span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>:<span class="number">25px</span>;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1px</span> solid <span class="built_in">var</span>(--dark-grey);</span><br><span class="line">    <span class="attribute">font-size</span>:<span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">transition</span>:<span class="number">0.5s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item-info</span> &gt; <span class="selector-tag">div</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.article-sort-meta</span>)&#123;</span><br><span class="line">    <span class="attribute">display</span>:flex;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-description</span>,<span class="selector-class">.article-sort-item</span> &gt; <span class="selector-tag">i</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">0</span>;</span><br><span class="line">    <span class="attribute">opacity</span>:<span class="number">0</span>;</span><br><span class="line">    <span class="attribute">overflow</span>:hidden;</span><br><span class="line">    <span class="attribute">transition</span>:<span class="number">0.5s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-description</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">59px</span>;</span><br><span class="line">    <span class="attribute">vertical-align</span>: middle;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">5px</span> <span class="number">10px</span> <span class="number">0</span> <span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">text-overflow</span>:ellipsis;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>)&#123;</span><br><span class="line">    <span class="attribute">background-color</span>:<span class="built_in">var</span>(--ichika-color);</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">10px</span> <span class="built_in">var</span>(--ichika-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>)&#123;</span><br><span class="line">    <span class="attribute">background-color</span>:<span class="built_in">var</span>(--ichika-color);</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">10px</span> <span class="built_in">var</span>(--ichika-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-description</span>,<span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) &gt; <span class="selector-tag">i</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:auto;</span><br><span class="line">    <span class="attribute">opacity</span>:<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-description</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:auto;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-img</span>&#123;</span><br><span class="line">    <span class="attribute">transition</span>:<span class="number">0.5s</span>;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-title</span>&#123;</span><br><span class="line">    <span class="attribute">color</span>:<span class="built_in">var</span>(--ichika-font-white)<span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-meta-wrap</span> <span class="selector-tag">a</span>,<span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-description</span>,<span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-time</span>&#123;</span><br><span class="line">    <span class="attribute">color</span>:<span class="built_in">var</span>(--ichika-light-grey)<span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-categories</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1.5px</span> solid <span class="built_in">var</span>(--ichika-green);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-tags</span>&#123;</span><br><span class="line">    <span class="attribute">border</span>:<span class="number">1.5px</span> solid <span class="built_in">var</span>(--ichika-purple);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-categories</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">var</span>(--ichika-green);</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">0</span> <span class="number">5px</span> <span class="built_in">var</span>(--ichika-green);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:hover</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) <span class="selector-class">.article-sort-item-tags</span><span class="selector-pseudo">:hover</span>&#123;</span><br><span class="line">    <span class="attribute">background</span>:<span class="built_in">var</span>(--ichika-purple);</span><br><span class="line">    <span class="attribute">box-shadow</span>:<span class="number">0</span> <span class="number">0</span> <span class="number">5px</span> <span class="built_in">var</span>(--ichika-purple);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">768px</span>) &#123;</span><br><span class="line">    <span class="selector-class">.article-sort-item</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.year</span>) &#123;</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.article-sort-meta</span> &gt; <span class="selector-class">.article-meta-wrap</span> &#123;</span><br><span class="line">        <span class="attribute">display</span>: none;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.article-sort-item-title</span> &#123;</span><br><span class="line">        <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.article-sort-item-img</span>&#123;</span><br><span class="line">        <span class="attribute">width</span>:<span class="number">90px</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>将<strong>themes/butterfly/layout/includes/mixins/article-sort.pug</strong>整个文件替换成一下代码</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><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">mixin articleSort(posts)</span><br><span class="line">  .article-sort</span><br><span class="line">    - var year</span><br><span class="line">    - posts.each(function (article) &#123;</span><br><span class="line">      - let tempYear = date(article.date, &#x27;YYYY&#x27;)</span><br><span class="line">      - let no_cover = article.cover === false || !theme.cover.archives_enable ? &#x27;no-article-cover&#x27; : &#x27;&#x27;</span><br><span class="line">      - let title = article.title || _p(&#x27;no_title&#x27;)</span><br><span class="line">      if tempYear !== year</span><br><span class="line">        - year = tempYear</span><br><span class="line">        .article-sort-item.year= year</span><br><span class="line">      .article-sort-item(class=no_cover)</span><br><span class="line">        a.article-sort-item-a(href=url_for(article.path) title=title)</span><br><span class="line">        if article.cover &amp;&amp; theme.cover.archives_enable</span><br><span class="line">          a.article-sort-item-img(href=url_for(article.path) title=title)</span><br><span class="line">            img(src=url_for(article.cover) alt=title onerror=`this.onerror=null;this.src=&#x27;$&#123;url_for(theme.error_img.post_page)&#125;&#x27;`)</span><br><span class="line">        .article-sort-item-info</span><br><span class="line">          div</span><br><span class="line">            a.article-sort-item-title(href=url_for(article.path) title=title)= title</span><br><span class="line">            .article-sort-description= article.description</span><br><span class="line">          .article-sort-meta</span><br><span class="line">            .article-meta-wrap</span><br><span class="line">              if (theme.post_meta.page.categories &amp;&amp; article.categories.data.length &gt; 0)</span><br><span class="line">                span.article-sort-item-categories</span><br><span class="line">                  each item, index in article.categories.data</span><br><span class="line">                    a(href=url_for(item.path)).article-meta__categories #[=item.name]</span><br><span class="line">                    if (index &lt; article.categories.data.length - 1)</span><br><span class="line">                      i.fas.fa-angle-right</span><br><span class="line">              if (theme.post_meta.page.tags &amp;&amp; article.tags.data.length &gt; 0)</span><br><span class="line">                span.article-sort-item-tags</span><br><span class="line">                  each item, index in article.tags.data</span><br><span class="line">                    a(href=url_for(item.path)).article-meta__tags #[=item.name]</span><br><span class="line">                    if (index &lt; article.tags.data.length - 1)</span><br><span class="line">                      span.article-meta__link #[=&#x27; &#x27;]</span><br><span class="line">            .article-sort-item-time</span><br><span class="line">              i.far.fa-calendar-alt</span><br><span class="line">              time.post-meta-date-created(datetime=date_xml(article.date) title=_p(&#x27;post.created&#x27;) + &#x27; &#x27; + full_date(article.date))= date(article.date, config.date_format)</span><br><span class="line">        i.fas.fa-chevron-right</span><br><span class="line">    - &#125;)</span><br></pre></td></tr></table></figure><p>参考文章:</p><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://ichika.cc/Article/beautiful_MyBeautiful/">    <div class="tag-link-tips">🪧引用站外地址，不保证站点的可用性和安全性</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/07/27/66a4632bbf06e.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">Hexo的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><h3 id="欢迎来访者-侧边栏"><a href="#欢迎来访者-侧边栏" class="headerlink" title="欢迎来访者(侧边栏)"></a>欢迎来访者(侧边栏)</h3><blockquote><p>由于liushen给出的api代码不全,因此我完善了api内容,就有了以下的教程</p></blockquote><h4 id="效果图"><a href="#效果图" class="headerlink" title="效果图:"></a>效果图:</h4><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260405102231574.png" alt="image-20260405102231574"></p><h4 id="教程开始"><a href="#教程开始" class="headerlink" title="教程开始"></a>教程开始</h4><p>按照惯例,我们先实现插入<code>html</code>结构 ,新建<code>pug</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">[BlogRoot]\themes\butterfly\layout\includes\widget\card_welcome.pug</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></pre></td><td class="code"><pre><span class="line">.card-widget.card-welcome</span><br><span class="line">  .item-headline</span><br><span class="line">    i.fa.fa-user</span><br><span class="line">    span 欢迎来访者!</span><br><span class="line">  .item-content</span><br><span class="line">    p 👋🏻我是moh，一个</span><br><span class="line">      span(style=&quot;font-weight: bold; color: #3498db&quot;) 热爱编程</span><br><span class="line">      | 的技术爱好者，喜欢分享经验。😊 </span><br><span class="line">    p ❓有问题欢迎提问，确保内容有意义，详情请见</span><br><span class="line">      a(href=&quot;https://how-to-ask.liushen.fun/&quot; target=&quot;_blank&quot; style=&quot;font-weight: bold; color: #2980b9&quot;) 提问的智慧</span><br><span class="line">      | 。如需联系我，欢迎通过</span><br><span class="line">      a(href=&quot;mailto:01@liushen.fun&quot; style=&quot;font-weight: bold; color: #9b59b6&quot;) 邮箱</span><br><span class="line">      | 联系我！📧</span><br><span class="line">  #welcome-info</span><br><span class="line">    .error-message(style=&quot;height: 200px; display: flex; justify-content: center; align-items: center;&quot;)</span><br><span class="line">      p(style=&quot;text-align: center;&quot;)</span><br><span class="line">        span(style=&quot;font-size: 40px;&quot;) 😥 </span><br><span class="line">        br</span><br><span class="line">        span(style=&quot;font-size: 16px;&quot;) 由于网络问题</span><br><span class="line">        br</span><br><span class="line">        span(style=&quot;font-size: 16px;&quot;) 位置API请求错误</span><br><span class="line">        br</span><br><span class="line">        span(style=&quot;font-size: 16px;&quot;) 请刷新重试呀🤗~</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>结构实现了，下面将该结构插入到对应的位置，可以在当前目录下的<code>index.pug</code>找到对应结构，如下：</p><p>文件路径:</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">[BlogRoot]\themes\butterfly\layout\includes\widget\index.pug</span><br></pre></td></tr></table></figure><p>在代码中插入以下带<code>➕</code>号的那行代码,<strong>注意缩进问题</strong></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><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></pre></td><td class="code"><pre><span class="line">#aside-content.aside-content</span><br><span class="line">  //- post</span><br><span class="line">  if is_post()</span><br><span class="line">    - const tocStyle = page.toc_style_simple</span><br><span class="line">    - const tocStyleVal = tocStyle === true || tocStyle === false ? tocStyle : theme.toc.style_simple</span><br><span class="line">    if showToc &amp;&amp; tocStyleVal</span><br><span class="line">      .sticky_layout</span><br><span class="line">        include ./card_post_toc.pug</span><br><span class="line">    else</span><br><span class="line">      !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_poem&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_rewards&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_announcement&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_top_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      .sticky_layout</span><br><span class="line">        if showToc</span><br><span class="line">          include ./card_post_toc.pug</span><br><span class="line">        if page.series</span><br><span class="line">          include ./card_post_series.pug</span><br><span class="line">        !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">        !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">  else</span><br><span class="line">    //- page</span><br><span class="line">    !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">+   !=partial(&#x27;includes/widget/card_welcome&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_poem&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_rewards&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_announcement&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_top_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">    .sticky_layout</span><br><span class="line">      if showToc</span><br><span class="line">        include ./card_post_toc.pug</span><br><span class="line">      !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_newest_comment&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_categories&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_tags&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_archives&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_webinfo&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_bottom_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></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></pre></td><td class="code"><pre><span class="line">[BlogRoot]\themes\butterfly\source\css\_layout\card-welcome.styl</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></pre></td><td class="code"><pre><span class="line">#aside-content</span><br><span class="line">    .card-widget.card-welcome</span><br><span class="line">        padding: 8px</span><br><span class="line">        .item-headline</span><br><span class="line">            margin: 12px 16px 0 16px</span><br><span class="line">        .item-content</span><br><span class="line">            margin: 0 16px 10px 16px</span><br><span class="line">        #welcome-info</span><br><span class="line">            text-align center</span><br><span class="line">            background-color: var(--liushen-card-bg)</span><br><span class="line">            border-radius: 12px</span><br><span class="line">            padding: 16px</span><br><span class="line">            margin: 8px</span><br><span class="line">            // border: 2px solid var(--liushen-text)</span><br><span class="line">            .ip-address</span><br><span class="line">                // 模糊效果</span><br><span class="line">                filter: blur(5px)</span><br><span class="line">                color: var(--default-bg-color)</span><br><span class="line">                transition: filter 0.5s</span><br><span class="line">                &amp;:hover</span><br><span class="line">                    filter: none</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>经过渲染应该就可以看到结果了。</p><p>不过由于我们的访客卡片需要调用<code>api</code>，所以还需要<code>js</code>的配合，在任意自定义js文件中添加以下内容：</p><p>新建以下文件:</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">[BlogRoot]/source/js/card-welcome.js</span><br></pre></td></tr></table></figure><p>写入以下内容::</p><figure class="highlight js"><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 显示欢迎信息</span></span><br><span class="line"><span class="comment">// 计算两点之间的距离（单位：公里）</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getDistance</span>(<span class="params">lat1, lon1, lat2, lon2</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> R = <span class="number">6371</span>;</span><br><span class="line">    <span class="keyword">const</span> dLat = (lat2 - lat1) * <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">180</span>;</span><br><span class="line">    <span class="keyword">const</span> dLon = (lon2 - lon1) * <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">180</span>;</span><br><span class="line">    <span class="keyword">const</span> a = <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLat / <span class="number">2</span>) * <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLat / <span class="number">2</span>) +</span><br><span class="line">        <span class="title class_">Math</span>.<span class="title function_">cos</span>(lat1 * <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">180</span>) * <span class="title class_">Math</span>.<span class="title function_">cos</span>(lat2 * <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">180</span>) *</span><br><span class="line">        <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLon / <span class="number">2</span>) * <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLon / <span class="number">2</span>);</span><br><span class="line">    <span class="keyword">const</span> c = <span class="number">2</span> * <span class="title class_">Math</span>.<span class="title function_">atan2</span>(<span class="title class_">Math</span>.<span class="title function_">sqrt</span>(a), <span class="title class_">Math</span>.<span class="title function_">sqrt</span>(<span class="number">1</span> - a));</span><br><span class="line">    <span class="keyword">return</span> <span class="title class_">Math</span>.<span class="title function_">round</span>(R * c);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取IP位置信息</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fetchIpLocation</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">fetch</span>(<span class="string">&#x27;http://ip-api.com/json/?fields=status,message,country,regionName,city,lat,lon,query&amp;lang=zh-CN&#x27;</span>)</span><br><span class="line">        .<span class="title function_">then</span>(<span class="function"><span class="params">response</span> =&gt;</span> response.<span class="title function_">json</span>())</span><br><span class="line">        .<span class="title function_">then</span>(<span class="function"><span class="params">data</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (data.<span class="property">status</span> !== <span class="string">&#x27;success&#x27;</span>) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(data.<span class="property">message</span> || <span class="string">&#x27;IP定位失败&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> &#123;</span><br><span class="line">                <span class="attr">ip</span>: data.<span class="property">query</span>,</span><br><span class="line">                <span class="attr">data</span>: &#123;</span><br><span class="line">                    <span class="attr">country</span>: data.<span class="property">country</span>,</span><br><span class="line">                    <span class="attr">prov</span>: data.<span class="property">regionName</span>,</span><br><span class="line">                    <span class="attr">city</span>: data.<span class="property">city</span>,</span><br><span class="line">                    <span class="attr">district</span>: <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">                    <span class="attr">lng</span>: data.<span class="property">lon</span>,</span><br><span class="line">                    <span class="attr">lat</span>: data.<span class="property">lat</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;)</span><br><span class="line">        .<span class="title function_">catch</span>(<span class="function"><span class="params">error</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;获取IP位置信息失败:&#x27;</span>, error);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">        &#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">showWelcome</span>(<span class="params">ipLocation</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!ipLocation || !ipLocation.<span class="property">data</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;ipLocation data is not available.&#x27;</span>);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> dist = <span class="title function_">getDistance</span>(<span class="number">24.4798</span>, <span class="number">118.0894</span>, ipLocation.<span class="property">data</span>.<span class="property">lat</span>, ipLocation.<span class="property">data</span>.<span class="property">lng</span>);</span><br><span class="line">    <span class="keyword">let</span> pos = ipLocation.<span class="property">data</span>.<span class="property">country</span>;</span><br><span class="line">    <span class="keyword">let</span> ip = ipLocation.<span class="property">ip</span>;</span><br><span class="line">    <span class="keyword">let</span> posdesc;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 以下的代码需要根据新API返回的结果进行相应的调整</span></span><br><span class="line">    <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">country</span>) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;日本&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;よろしく，一起去看樱花吗&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;美国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;Let us live in peace!&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;英国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;想同你一起夜乘伦敦眼&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;俄罗斯&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;干了这瓶伏特加！&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;法国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;C&#x27;est La Vie&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;德国&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;Die Zeit verging im Fluge.&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;澳大利亚&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;一起去大堡礁吧！&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;加拿大&quot;</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;拾起一片枫叶赠予你&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="string">&quot;中国&quot;</span>:</span><br><span class="line">            pos = ipLocation.<span class="property">data</span>.<span class="property">prov</span> + <span class="string">&quot; &quot;</span> + ipLocation.<span class="property">data</span>.<span class="property">city</span> + <span class="string">&quot; &quot;</span> + ipLocation.<span class="property">data</span>.<span class="property">district</span>;</span><br><span class="line">            <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">prov</span>) &#123;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;北京市&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;北——京——欢迎你~~~&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;天津市&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;讲段相声吧&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;河北省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;山势巍巍成壁垒，天下雄关铁马金戈由此向，无限江山&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;山西省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;展开坐具长三尺，已占山河五百余&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;内蒙古自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;天苍苍，野茫茫，风吹草低见牛羊&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;辽宁省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;我想吃烤鸡架！&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;吉林省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;状元阁就是东北烧烤之王&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;黑龙江省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;很喜欢哈尔滨大剧院&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;上海市&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;众所周知，中国只有两个城市&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;江苏省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;南京市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;这是我挺想去的城市啦&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;苏州市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;上有天堂，下有苏杭&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;散装是必须要散装的&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;浙江省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;杭州市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;东风渐绿西湖柳，雁已还人未南归&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;望海楼明照曙霞,护江堤白蹋晴沙&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;河南省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;郑州市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;豫州之域，天地之中&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;信阳市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;品信阳毛尖，悟人间芳华&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;南阳市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;臣本布衣，躬耕于南阳此南阳非彼南阳！&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;驻马店市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;峰峰有奇石，石石挟仙气嵖岈山的花很美哦！&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;开封市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;刚正不阿包青天&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;洛阳市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;洛阳牡丹甲天下&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;可否带我品尝河南烩面啦？&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;安徽省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;蚌埠住了，芜湖起飞&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;福建省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;井邑白云间，岩城远带山&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;江西省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;落霞与孤鹜齐飞，秋水共长天一色&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;山东省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;遥望齐州九点烟，一泓海水杯中泻&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;湖北省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;黄冈市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;红安将军县！辈出将才！&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;武汉市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;你想去长江游泳嘛？&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;来碗热干面~&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;湖南省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;74751，长沙斯塔克&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;广东省&quot;</span>:</span><br><span class="line">                    <span class="keyword">switch</span> (ipLocation.<span class="property">data</span>.<span class="property">city</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;广州市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;看小蛮腰，喝早茶了嘛~&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;深圳市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;今天你逛商场了嘛~&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="string">&quot;阳江市&quot;</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;阳春合水！博主家乡~ 欢迎来玩~&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            posdesc = <span class="string">&quot;来两斤福建人~&quot;</span>;</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;广西壮族自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;桂林山水甲天下&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;海南省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;朝观日出逐白浪，夕看云起收霞光&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;四川省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;康康川妹子&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;贵州省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;茅台，学生，再塞200&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;云南省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;玉龙飞舞云缠绕，万仞冰川直耸天&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;西藏自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;躺在茫茫草原上，仰望蓝天&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;陕西省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;来份臊子面加馍&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;甘肃省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;羌笛何须怨杨柳，春风不度玉门关&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;青海省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;牛肉干和老酸奶都好好吃&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;宁夏回族自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;大漠孤烟直，长河落日圆&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;新疆维吾尔自治区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;驼铃古道丝绸路，胡马犹闻唐汉风&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;台湾省&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;我在这头，大陆在那头&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;香港特别行政区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;永定贼有残留地鬼嚎，迎击光非岁玉&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">&quot;澳门特别行政区&quot;</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;性感荷官，在线发牌&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="attr">default</span>:</span><br><span class="line">                    posdesc = <span class="string">&quot;带我去你的城市逛逛吧！&quot;</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="attr">default</span>:</span><br><span class="line">            posdesc = <span class="string">&quot;带我去你的国家逛逛吧&quot;</span>;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 根据本地时间切换欢迎语</span></span><br><span class="line">    <span class="keyword">let</span> timeChange;</span><br><span class="line">    <span class="keyword">let</span> date = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">    <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">5</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">11</span>) timeChange = <span class="string">&quot;&lt;span&gt;🌤️ 早上好，快趁机多睡点懒觉！&lt;/span&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">11</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">13</span>) timeChange = <span class="string">&quot;&lt;span&gt;☀️ 中午好，记得午休喔~&lt;/span&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">13</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">17</span>) timeChange = <span class="string">&quot;&lt;span&gt;🕞 下午好，饮茶先啦！&lt;/span&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">17</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">19</span>) timeChange = <span class="string">&quot;&lt;span&gt;🚶‍♂️ 下班啦！主打一个不听老板话~&lt;/span&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span> (date.<span class="title function_">getHours</span>() &gt;= <span class="number">19</span> &amp;&amp; date.<span class="title function_">getHours</span>() &lt; <span class="number">24</span>) timeChange = <span class="string">&quot;&lt;span&gt;🌙 晚上好，来一起熬夜吧呜😭&lt;/span&gt;&quot;</span>;</span><br><span class="line">    <span class="keyword">else</span> timeChange = <span class="string">&quot;夜深了，早点休息，少熬夜&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> welcomeInfoElement = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;welcome-info&quot;</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (welcomeInfoElement) &#123;</span><br><span class="line">        welcomeInfoElement.<span class="property">innerHTML</span> =</span><br><span class="line">            <span class="string">`嗷嗷！热烈欢迎🤪！来自&lt;br&gt;&lt;b&gt;&lt;span style=&quot;color: var(--default-bg-color)&quot;&gt;<span class="subst">$&#123;pos&#125;</span>&lt;/span&gt;&lt;/b&gt;&lt;br&gt; 的铁铁，你好呀！😝&lt;br&gt;<span class="subst">$&#123;posdesc&#125;</span>🍂&lt;br&gt;你目前距博主约 &lt;b&gt;&lt;span style=&quot;color: var(--default-bg-color)&quot;&gt;<span class="subst">$&#123;dist&#125;</span>&lt;/span&gt;&lt;/b&gt; 公里！&lt;br&gt;你的网络IP为：&lt;b&gt;&lt;span class=&quot;ip-address&quot; style=&quot;font-size: 15px;&quot;&gt;<span class="subst">$&#123;ip&#125;</span>&lt;/span&gt;&lt;/b&gt;&lt;br&gt;<span class="subst">$&#123;timeChange&#125;</span> &lt;br&gt;`</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Pjax无法获取元素&quot;</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="comment">// 判断是否存在 &quot;welcome-info&quot; 元素</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">isWelcomeInfoAvailable</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> welcomeInfoElement = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;welcome-info&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> welcomeInfoElement !== <span class="literal">null</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Pjax 完成后调用的处理函数</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">handlePjaxComplete</span>(<span class="params">ipLocation</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="title function_">isWelcomeInfoAvailable</span>()) &#123;</span><br><span class="line">        <span class="title function_">showWelcome</span>(ipLocation);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 加载时调用</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">onLoad</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="title function_">fetchIpLocation</span>().<span class="title function_">then</span>(<span class="function"><span class="params">ipLocation</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title function_">isWelcomeInfoAvailable</span>()) &#123;</span><br><span class="line">            <span class="title function_">showWelcome</span>(ipLocation);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;pjax:complete&quot;</span>, <span class="function">() =&gt;</span> <span class="title function_">handlePjaxComplete</span>(ipLocation));</span><br><span class="line">    &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 绑定 window.onload 事件</span></span><br><span class="line"><span class="variable language_">window</span>.<span class="property">onload</span> = onLoad;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>最后将自定义的js文件引入到配置文件即可</p><p>参考文章:</p><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.liushen.fun/posts/6010fc85/">    <div class="tag-link-tips">✅来自本站，本站可确保其安全性，请放心点击跳转</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/08/01/66aae601dbc9b.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">liushen的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><h3 id="今日诗词-侧边栏"><a href="#今日诗词-侧边栏" class="headerlink" title="今日诗词(侧边栏)"></a>今日诗词(侧边栏)</h3><h4 id="效果预览"><a href="#效果预览" class="headerlink" title="效果预览"></a>效果预览</h4><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260405110956142.png" alt="image-20260405110956142"></p><h4 id="教程开始-1"><a href="#教程开始-1" class="headerlink" title="教程开始"></a>教程开始</h4><p>按照惯例,我们先实现插入<code>html</code>结构 ,新建<code>pug</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">[BlogRoot]\themes\butterfly\layout\includes\widget\card_poem.pug</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></pre></td><td class="code"><pre><span class="line">#card-poem.card-widget</span><br><span class="line">    #poem_sentence</span><br><span class="line">    #poem_info</span><br><span class="line">        #poem_dynasty</span><br><span class="line">        #poem_author</span><br><span class="line">script(src=&#x27;/js/jinrishici.js&#x27;, charset=&#x27;utf-8&#x27;)</span><br><span class="line">script(type=&#x27;text/javascript&#x27;).</span><br><span class="line">  jinrishici.load(function(result) &#123;</span><br><span class="line">  var sentence = document.querySelector(&quot;#poem_sentence&quot;)</span><br><span class="line">  var author = document.querySelector(&quot;#poem_author&quot;)</span><br><span class="line">  var dynasty = document.querySelector(&quot;#poem_dynasty&quot;)</span><br><span class="line"></span><br><span class="line">  var sentenceText = result.data.content</span><br><span class="line">  sentenceText = sentenceText.substr(0, sentenceText.length - 1);</span><br><span class="line">  sentence.innerHTML = sentenceText</span><br><span class="line">  dynasty.innerHTML = result.data.origin.dynasty</span><br><span class="line">  author.innerHTML = result.data.origin.author + &#x27;《&#x27; + result.data.origin.title + &#x27;》&#x27;</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>结构实现了，下面将该结构插入到对应的位置，可以在当前目录下的<code>index.pug</code>找到对应结构，如下：</p><p>文件路径:</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">[BlogRoot]\themes\butterfly\layout\includes\widget\index.pug</span><br></pre></td></tr></table></figure><p>在代码中插入以下带<code>➕</code>号的那行代码,<strong>注意缩进问题</strong></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></pre></td><td class="code"><pre><span class="line">  else</span><br><span class="line">    //- page</span><br><span class="line">    !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_welcome&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">+    !=partial(&#x27;includes/widget/card_poem&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_top_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">    .sticky_layout</span><br><span class="line">      if showToc</span><br><span class="line">        include ./card_post_toc.pug</span><br><span class="line">      !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_newest_comment&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_categories&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_tags&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_archives&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_webinfo&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_bottom_self&#x27;, &#123;&#125;, &#123;cache: true&#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></pre></td><td class="code"><pre><span class="line">[BlogRoot]\themes\butterfly\source\css\_layout\card-jinrishici.styl</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><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">/* 古诗词卡片 */</span><br><span class="line">#card-poem</span><br><span class="line">    display: flex</span><br><span class="line">    flex-direction: column</span><br><span class="line">    padding: 0.5rem !important</span><br><span class="line"></span><br><span class="line">div#poem_sentence</span><br><span class="line">    text-align: center</span><br><span class="line">    font-family: serif, cursive</span><br><span class="line">    line-height: 1.4</span><br><span class="line">    margin-bottom: 0.5rem</span><br><span class="line">    padding: 1rem</span><br><span class="line">    border-radius: 8px</span><br><span class="line">    background: var(--liushen-card-bg)</span><br><span class="line">    min-height: 62px</span><br><span class="line"></span><br><span class="line">div#poem_info</span><br><span class="line">    display: flex</span><br><span class="line">    color: var(--liushen-secondtext)</span><br><span class="line">    font-size: 0.5rem</span><br><span class="line">    justify-content: center</span><br><span class="line">    flex-wrap: wrap</span><br><span class="line"></span><br><span class="line">div#poem_author</span><br><span class="line">    order: 1</span><br><span class="line">    padding: 2px</span><br><span class="line">    margin-left: 8px</span><br><span class="line"></span><br><span class="line">div#poem_dynasty</span><br><span class="line">    order: 0</span><br><span class="line">    padding: 2px 4px 2px 6px</span><br><span class="line">    background: var(--liushen-button-bg)</span><br><span class="line">    color: var(--liushen-text)</span><br><span class="line">    border-radius: 8px</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>最后引入js 新建文件</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">[BlogRoot]\themes\butterfly\source\js\jinrishici.js</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></pre></td><td class="code"><pre><span class="line">!function(e)&#123;var n,t=&#123;&#125;,o=&quot;jinrishici-token&quot;;function i()&#123;return document.getElementById(&quot;jinrishici-sentence&quot;)||0!=document.getElementsByClassName(&quot;jinrishici-sentence&quot;).length&#125;function c()&#123;t.load(function(e)&#123;var n=document.getElementById(&quot;jinrishici-sentence&quot;),t=document.getElementsByClassName(&quot;jinrishici-sentence&quot;);if(n&amp;&amp;(n.innerText=e.data.content),0!==t.length)for(var o=0;o&lt;t.length;o++)t[o].innerText=e.data.content&#125;)&#125;function r(e,n)&#123;var t=new XMLHttpRequest;t.open(&quot;get&quot;,n),t.withCredentials=!0,t.send(),t.onreadystatechange=function(n)&#123;if(4===t.readyState)&#123;var o=JSON.parse(t.responseText);&quot;success&quot;===o.status?e(o):console.error(&quot;今日诗词API加载失败，错误原因：&quot;+o.errMessage)&#125;&#125;&#125;t.load=function(n)&#123;return e.localStorage&amp;&amp;e.localStorage.getItem(o)?function(e,n)&#123;return r(e,&quot;https://v2.jinrishici.com/one.json?client=browser-sdk/1.2&amp;X-User-Token=&quot;+encodeURIComponent(n))&#125;(n,e.localStorage.getItem(o)):function(n)&#123;return r(function(t)&#123;e.localStorage.setItem(o,t.token),n(t)&#125;,&quot;https://v2.jinrishici.com/one.json?client=browser-sdk/1.2&quot;)&#125;(n)&#125;,e.jinrishici=t,i()?c():(n=function()&#123;i()&amp;&amp;c()&#125;,&quot;loading&quot;!=document.readyState?n():document.addEventListener?document.addEventListener(&quot;DOMContentLoaded&quot;,n):document.attachEvent(&quot;onreadystatechange&quot;,function()&#123;&quot;complete&quot;==document.readyState&amp;&amp;n()&#125;))&#125;(window);</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>参考文章:</p><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.liushen.fun/posts/6010fc85/">    <div class="tag-link-tips">✅来自本站，本站可确保其安全性，请放心点击跳转</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/08/01/66aae601dbc9b.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">liushen的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><h3 id="赞赏侧边栏"><a href="#赞赏侧边栏" class="headerlink" title="赞赏侧边栏"></a>赞赏侧边栏</h3><h4 id="效果"><a href="#效果" class="headerlink" title="效果:"></a>效果:</h4><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260405120330764.png" alt="image-20260405120330764"></p><p>​         </p><h4 id="教程开始-2"><a href="#教程开始-2" class="headerlink" title="教程开始"></a>教程开始</h4><h5 id="1、赞赏数据"><a href="#1、赞赏数据" class="headerlink" title="1、赞赏数据"></a>1、赞赏数据</h5><p>展示赞赏者的前提是，得有赞赏数据，所以我们先来构建该数据，创建文件<code>[BlogRoot]/source/_data/rewards.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></pre></td><td class="code"><pre><span class="line"><span class="attr">donate:</span></span><br><span class="line">  <span class="comment"># 支付宝收款码</span></span><br><span class="line">  <span class="attr">alipay:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">支付宝收款码</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">/config/img/alipay.png</span></span><br><span class="line">  <span class="comment"># 微信收款码</span></span><br><span class="line">  <span class="attr">wechat:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">微信收款码</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">/config/img/wechat.png</span></span><br><span class="line">  <span class="attr">thank_img:</span> <span class="string">https://p.liiiu.cn/i/2025/10/10/68e9199157351.webp</span></span><br><span class="line">  <span class="comment"># 赞赏页面链接</span></span><br><span class="line">  <span class="attr">page_url:</span> <span class="string">/rewards/</span></span><br><span class="line">  <span class="comment"># 赞赏者列表</span></span><br><span class="line">  <span class="attr">list:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">银河香港</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/02/26/67bec7d0eb734.webp</span></span><br><span class="line">      <span class="attr">website:</span> </span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-03-15</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥100.00</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">你我皆是生活银河中的闪耀星辰</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">周润发</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/03/20/67dbe8c6a6221.webp</span></span><br><span class="line">      <span class="attr">website:</span> <span class="string">https://blog.zrf.me</span></span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-08-01</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥30.00</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">收录开源，好用的互联网项目~</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">SXY</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/10/11/68e93a9ccee45.webp</span></span><br><span class="line">      <span class="attr">website:</span> </span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-08-29</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥10.00</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">地球与物理专业的大三学生</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Ljx</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/10/09/68e7d8ed2a70b.webp</span></span><br><span class="line">      <span class="attr">website:</span> <span class="string">https://blog.ljx.icu/</span></span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-10-09</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥8.88</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">一个无聊无趣的人~</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">AirTouch</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/07/18/687a369fc3610.webp</span></span><br><span class="line">      <span class="attr">website:</span> <span class="string">https://www.xsl.im/</span></span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-10-10</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥18.88</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">岩间琉璃云间月</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">短巷与雨</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2024/11/18/673ac90233753.webp</span></span><br><span class="line">      <span class="attr">website:</span> <span class="string">https://space.xsl.im/</span></span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-10-12</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥28.88</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">为学日益，为道日损。</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">老罗博客</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/06/01/683bc6062b113.webp</span></span><br><span class="line">      <span class="attr">website:</span> <span class="string">https://www.luosir.cn</span></span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-10-12</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥8.88</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">人生就是折腾</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">温柔鱼</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/10/08/68e5e1f17ed12.webp</span></span><br><span class="line">      <span class="attr">website:</span> <span class="string">https://blog.vrou.cn</span></span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-10-17</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥8.88</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">&quot;NULL&quot;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">不知名朋友</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://p.liiiu.cn/i/2025/10/11/68e93a9ccee45.webp</span></span><br><span class="line">      <span class="attr">website:</span> </span><br><span class="line">      <span class="attr">date:</span> <span class="number">2025-10-19</span></span><br><span class="line">      <span class="attr">amount:</span> <span class="string">¥2.00</span></span><br><span class="line">      <span class="attr">description:</span> <span class="string">感谢朋友的赞助~</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其中列表的时间顺序建议上面最早，下面最新，因为我懒得写排序了嘻嘻，所以直接倒序，方便实用（反正每次添加都是往文件底部添加啦）。</p><p>有了数据,我们就开始添加到页面上吧</p><p>按照惯例,我们先实现插入<code>html</code>结构 ,新建<code>pug</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">[BlogRoot]\themes\butterfly\layout\includes\widget\card_rewards.pug</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br></pre></td><td class="code"><pre><span class="line">.card-widget.card-reward</span><br><span class="line">  .item-headline</span><br><span class="line">    .headline-content</span><br><span class="line">      i.fa-solid.fa-person-praying</span><br><span class="line">      span 能量榜</span><br><span class="line">    .show-more-inline</span><br><span class="line">      - var pageUrl = site.data.rewards.donate.page_url || &#x27;/reward/&#x27;</span><br><span class="line">      a(href=url_for(pageUrl) class=&quot;btn-show-more-inline&quot;)</span><br><span class="line">        span 前往赞赏</span><br><span class="line">  .item-content</span><br><span class="line">    if site.data.rewards &amp;&amp; site.data.rewards.donate &amp;&amp; site.data.rewards.donate.list.length &gt; 0</span><br><span class="line">      - var allSponsors = site.data.rewards.donate.list.slice()</span><br><span class="line">      - allSponsors.sort(function() &#123; return Math.random() - 0.5 &#125;)</span><br><span class="line">      - var carouselSponsors = allSponsors.slice(0, 40)</span><br><span class="line">      - var listSponsors = allSponsors.slice(0, 20)</span><br><span class="line">      </span><br><span class="line">      if carouselSponsors.length &gt; 0</span><br><span class="line">        .top-sponsor-carousel</span><br><span class="line">          .carousel-container</span><br><span class="line">            .carousel-item</span><br><span class="line">              a.sponsor-link-card(target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;)</span><br><span class="line">                .sponsor-avatar</span><br><span class="line">                  img.sponsor-avatar-img(src=url_for(carouselSponsors[0].avatar) alt=carouselSponsors[0].name onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.flink) + `&#x27;`)</span><br><span class="line">                .sponsor-info</span><br><span class="line">                  .sponsor-name= carouselSponsors[0].name</span><br><span class="line">                  .sponsor-desc= carouselSponsors[0].description</span><br><span class="line">        </span><br><span class="line">        if listSponsors.length &gt; 1</span><br><span class="line">          .sponsors-list</span><br><span class="line">            each sponsor in listSponsors</span><br><span class="line">              if sponsor.website</span><br><span class="line">                a.sponsor-item(href=sponsor.website target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;)</span><br><span class="line">                  .sponsor-small-name= sponsor.name</span><br><span class="line">              else</span><br><span class="line">                .sponsor-item</span><br><span class="line">                  .sponsor-small-name= sponsor.name</span><br><span class="line"></span><br><span class="line">            if allSponsors.length &gt; 20</span><br><span class="line">              - var pageUrl = site.data.rewards.donate.page_url || &#x27;/reward/&#x27;</span><br><span class="line">              a.sponsor-item.more-sponsor(href=url_for(pageUrl) target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;)</span><br><span class="line">                .sponsor-small-name</span><br><span class="line">                  |  查看更多</span><br><span class="line">                  i.fa-solid.fa-angles-right</span><br><span class="line">          </span><br><span class="line">          .sponsors-note</span><br><span class="line">            p 你们的赞赏是我最大的动力</span><br><span class="line">            p ※ 此处数据随机显示</span><br><span class="line">        </span><br><span class="line">        script.</span><br><span class="line">          if (!window.sponsorsData) &#123;</span><br><span class="line">            window.sponsorsData = !&#123;JSON.stringify(carouselSponsors)&#125;;</span><br><span class="line">          &#125;</span><br><span class="line">          </span><br><span class="line">          function initRewardCarousel() &#123;</span><br><span class="line">            const container = document.querySelector(&#x27;.carousel-container&#x27;);</span><br><span class="line">            const link = container.querySelector(&#x27;.sponsor-link-card&#x27;);</span><br><span class="line">            const avatar = container.querySelector(&#x27;.sponsor-avatar-img&#x27;);</span><br><span class="line">            const name = container.querySelector(&#x27;.sponsor-name&#x27;);</span><br><span class="line">            const desc = container.querySelector(&#x27;.sponsor-desc&#x27;);</span><br><span class="line">            </span><br><span class="line">            if (!container || sponsorsData.length === 0) return;</span><br><span class="line">            </span><br><span class="line">            let currentIndex = 0;</span><br><span class="line">            let intervalId = null;</span><br><span class="line">            let isTransitioning = false;</span><br><span class="line">            </span><br><span class="line">            function updateSponsorInfo(sponsor) &#123;</span><br><span class="line">              if (sponsor.website) &#123;</span><br><span class="line">                link.href = sponsor.website;</span><br><span class="line">                // 确保有链接时移除 pointer-events 样式</span><br><span class="line">                link.style.pointerEvents = &#x27;&#x27;;</span><br><span class="line">                link.style.cursor = &#x27;pointer&#x27;;</span><br><span class="line">              &#125; else &#123;</span><br><span class="line">                link.removeAttribute(&#x27;href&#x27;);</span><br><span class="line">                // 只有在没有链接时才添加 pointer-events: none</span><br><span class="line">                link.style.pointerEvents = &#x27;none&#x27;;</span><br><span class="line">                link.style.cursor = &#x27;default&#x27;;</span><br><span class="line">              &#125;</span><br><span class="line">              </span><br><span class="line">              avatar.src = sponsor.avatar;</span><br><span class="line">              avatar.alt = sponsor.name;</span><br><span class="line">              </span><br><span class="line">              name.textContent = sponsor.name;</span><br><span class="line">              desc.textContent = sponsor.description;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function showSponsor(index) &#123;</span><br><span class="line">              if (index &lt; 0 || index &gt;= sponsorsData.length || isTransitioning) return;</span><br><span class="line">              </span><br><span class="line">              isTransitioning = true;</span><br><span class="line">              const sponsor = sponsorsData[index];</span><br><span class="line">              </span><br><span class="line">              container.style.opacity = &#x27;0&#x27;;</span><br><span class="line">              </span><br><span class="line">              setTimeout(() =&gt; &#123;</span><br><span class="line">                updateSponsorInfo(sponsor);</span><br><span class="line">                container.style.opacity = &#x27;1&#x27;;</span><br><span class="line">                currentIndex = index;</span><br><span class="line">                </span><br><span class="line">                setTimeout(() =&gt; &#123;</span><br><span class="line">                  isTransitioning = false;</span><br><span class="line">                &#125;, 300);</span><br><span class="line">              &#125;, 300);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function nextSponsor() &#123;</span><br><span class="line">              const nextIndex = (currentIndex + 1) % sponsorsData.length;</span><br><span class="line">              showSponsor(nextIndex);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function startAutoPlay() &#123;</span><br><span class="line">              if (intervalId) clearInterval(intervalId);</span><br><span class="line">              intervalId = setInterval(nextSponsor, 3000);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function stopAutoPlay() &#123;</span><br><span class="line">              if (intervalId) &#123;</span><br><span class="line">                clearInterval(intervalId);</span><br><span class="line">                intervalId = null;</span><br><span class="line">              &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            const carousel = document.querySelector(&#x27;.top-sponsor-carousel&#x27;);</span><br><span class="line">            if (carousel) &#123;</span><br><span class="line">              carousel.addEventListener(&#x27;mouseenter&#x27;, stopAutoPlay);</span><br><span class="line">              carousel.addEventListener(&#x27;mouseleave&#x27;, startAutoPlay);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            container.style.transition = &#x27;opacity 0.3s ease-in-out&#x27;;</span><br><span class="line">            </span><br><span class="line">            // 初始化第一个赞助者信息</span><br><span class="line">            updateSponsorInfo(sponsorsData[0]);</span><br><span class="line">            </span><br><span class="line">            startAutoPlay();</span><br><span class="line">            </span><br><span class="line">            return &#123;</span><br><span class="line">              showSponsor,</span><br><span class="line">              nextSponsor,</span><br><span class="line">              startAutoPlay,</span><br><span class="line">              stopAutoPlay</span><br><span class="line">            &#125;;</span><br><span class="line">          &#125;</span><br><span class="line">          initRewardCarousel();</span><br><span class="line">          //- document.addEventListener(&quot;pjax:complete&quot;, function() &#123;</span><br><span class="line">          //-   initRewardCarousel();</span><br><span class="line">          //- &#125;);</span><br><span class="line">      else</span><br><span class="line">        .no-sponsors</span><br><span class="line">          p 暂无赞助者，成为第一个支持本站的朋友吧！</span><br><span class="line">    else</span><br><span class="line">      .no-sponsors</span><br><span class="line">        p 暂无赞助者数据</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>结构实现了，下面将该结构插入到对应的位置，可以在当前目录下的<code>index.pug</code>找到对应结构，如下</p><p>文件路径: </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">[BlogRoot]\themes\butterfly\layout\includes\widget\index.pug</span><br></pre></td></tr></table></figure><p>在代码中插入以下带<code>➕</code>号的那行代码,<strong>注意缩进问题</strong></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></pre></td><td class="code"><pre><span class="line">  else</span><br><span class="line">    //- page</span><br><span class="line">    !=partial(&#x27;includes/widget/card_author&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_welcome&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_poem&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">+    !=partial(&#x27;includes/widget/card_rewards&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">    !=partial(&#x27;includes/widget/card_top_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">    .sticky_layout</span><br><span class="line">      if showToc</span><br><span class="line">        include ./card_post_toc.pug</span><br><span class="line">      !=partial(&#x27;includes/widget/card_recent_post&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_ad&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_newest_comment&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_categories&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_tags&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_archives&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_webinfo&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line">      !=partial(&#x27;includes/widget/card_bottom_self&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br></pre></td></tr></table></figure><p>引入css样式,新建文件</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">[blogRoot]/source/css/card_rewards.css</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><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></pre></td><td class="code"><pre><span class="line">donate:</span><br><span class="line">  # 支付宝收款码</span><br><span class="line">  alipay:</span><br><span class="line">    name: 支付宝收款码</span><br><span class="line">    image: /config/img/alipay.png</span><br><span class="line">  # 微信收款码</span><br><span class="line">  wechat:</span><br><span class="line">    name: 微信收款码</span><br><span class="line">    image: /config/img/wechat.png</span><br><span class="line">  thank_img: https://p.liiiu.cn/i/2025/10/10/68e9199157351.webp</span><br><span class="line">  # 赞赏页面链接</span><br><span class="line">  page_url: /rewards/</span><br><span class="line">  # 赞赏者列表</span><br><span class="line">  list:</span><br><span class="line">    - name: 银河香港</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/02/26/67bec7d0eb734.webp</span><br><span class="line">      website: </span><br><span class="line">      date: 2025-03-15</span><br><span class="line">      amount: ¥100.00</span><br><span class="line">      description: 你我皆是生活银河中的闪耀星辰</span><br><span class="line">    - name: 周润发</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/03/20/67dbe8c6a6221.webp</span><br><span class="line">      website: https://blog.zrf.me</span><br><span class="line">      date: 2025-08-01</span><br><span class="line">      amount: ¥30.00</span><br><span class="line">      description: 收录开源，好用的互联网项目~</span><br><span class="line">    - name: SXY</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/10/11/68e93a9ccee45.webp</span><br><span class="line">      website: </span><br><span class="line">      date: 2025-08-29</span><br><span class="line">      amount: ¥10.00</span><br><span class="line">      description: 地球与物理专业的大三学生</span><br><span class="line">    - name: Ljx</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/10/09/68e7d8ed2a70b.webp</span><br><span class="line">      website: https://blog.ljx.icu/</span><br><span class="line">      date: 2025-10-09</span><br><span class="line">      amount: ¥8.88</span><br><span class="line">      description: 一个无聊无趣的人~</span><br><span class="line">    - name: AirTouch</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/07/18/687a369fc3610.webp</span><br><span class="line">      website: https://www.xsl.im/</span><br><span class="line">      date: 2025-10-10</span><br><span class="line">      amount: ¥18.88</span><br><span class="line">      description: 岩间琉璃云间月</span><br><span class="line">    - name: 短巷与雨</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2024/11/18/673ac90233753.webp</span><br><span class="line">      website: https://space.xsl.im/</span><br><span class="line">      date: 2025-10-12</span><br><span class="line">      amount: ¥28.88</span><br><span class="line">      description: 为学日益，为道日损。</span><br><span class="line">    - name: 老罗博客</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/06/01/683bc6062b113.webp</span><br><span class="line">      website: https://www.luosir.cn</span><br><span class="line">      date: 2025-10-12</span><br><span class="line">      amount: ¥8.88</span><br><span class="line">      description: 人生就是折腾</span><br><span class="line">    - name: 温柔鱼</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/10/08/68e5e1f17ed12.webp</span><br><span class="line">      website: https://blog.vrou.cn</span><br><span class="line">      date: 2025-10-17</span><br><span class="line">      amount: ¥8.88</span><br><span class="line">      description: &quot;NULL&quot;</span><br><span class="line">    - name: 不知名朋友</span><br><span class="line">      avatar: https://p.liiiu.cn/i/2025/10/11/68e93a9ccee45.webp</span><br><span class="line">      website: </span><br><span class="line">      date: 2025-10-19</span><br><span class="line">      amount: ¥2.00</span><br><span class="line">      description: 感谢朋友的赞助~</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>注意:</p><pre><code>* 在配置文件里面也要进行引入改自定义文件 </code></pre><p>最后实现hexo三件套 则就有最终效果了</p><h3 id="赞赏页面"><a href="#赞赏页面" class="headerlink" title="赞赏页面"></a>赞赏页面</h3><p>如果不出所料，侧边栏应该实现了，下面实现赞赏页面，由于不涉及Javascript，所以实现起来可简单多了，还是一样，首先添加Pug页面结构文件，创建<code>[blogRoot]\themes\butterfly\layout\includes\page\rewards.pug</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br></pre></td><td class="code"><pre><span class="line">#article-container</span><br><span class="line">  if top_img === false</span><br><span class="line">    h1.page-title= page.title</span><br><span class="line">  </span><br><span class="line">  .reward-page</span><br><span class="line">    // 感谢图片</span><br><span class="line">    .thank-image</span><br><span class="line">      img.no-lightbox(</span><br><span class="line">        src=site.data.rewards.donate.thank_img </span><br><span class="line">        alt=&quot;感谢&quot; </span><br><span class="line">        onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.post) + `&#x27;`</span><br><span class="line">      )</span><br><span class="line">    </span><br><span class="line">    // 收款码区域</span><br><span class="line">    .payment-codes</span><br><span class="line">      .payment-item.alipay</span><br><span class="line">        .payment-content</span><br><span class="line">          .payment-image</span><br><span class="line">            img(src=site.data.rewards.donate.alipay.image alt=site.data.rewards.donate.alipay.name)</span><br><span class="line">          .payment-info</span><br><span class="line">            .payment-name= site.data.rewards.donate.alipay.name</span><br><span class="line">            //- .payment-desc 支付宝扫一扫</span><br><span class="line">      .payment-item.wechat</span><br><span class="line">        .payment-content</span><br><span class="line">          .payment-image</span><br><span class="line">            img(src=site.data.rewards.donate.wechat.image alt=site.data.rewards.donate.wechat.name)</span><br><span class="line">          .payment-info</span><br><span class="line">            .payment-name= site.data.rewards.donate.wechat.name</span><br><span class="line">            //- .payment-desc 微信扫一扫</span><br><span class="line">    </span><br><span class="line">    // 赞赏者列表</span><br><span class="line">    .sponsors-list</span><br><span class="line">      .sponsors-header</span><br><span class="line">        .sponsors-description</span><br><span class="line">          p 你的每一份支持都是对我的莫大鼓励</span><br><span class="line">      </span><br><span class="line">      .sponsors-container</span><br><span class="line">        if site.data.rewards &amp;&amp; site.data.rewards.donate &amp;&amp; site.data.rewards.donate.list.length &gt; 0</span><br><span class="line">          // 反转列表，因为最新的在最后</span><br><span class="line">          - var sortedSponsors = site.data.rewards.donate.list.slice().reverse()</span><br><span class="line">          </span><br><span class="line">          // 计算统计数据</span><br><span class="line">          - var totalCount = sortedSponsors.length</span><br><span class="line">          - var totalAmount = 0</span><br><span class="line">          - sortedSponsors.forEach(function(sponsor) &#123;</span><br><span class="line">          -   var amount = parseFloat(String(sponsor.amount).replace(&#x27;¥&#x27;, &#x27;&#x27;));</span><br><span class="line">          -   if (!isNaN(amount)) &#123;</span><br><span class="line">          -     totalAmount += amount;</span><br><span class="line">          -   &#125;</span><br><span class="line">          - &#125;)</span><br><span class="line">          </span><br><span class="line">          each sponsor, index in sortedSponsors</span><br><span class="line">            .sponsor-item</span><br><span class="line">              if sponsor.website</span><br><span class="line">                a.sponsor-card(href=sponsor.website target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot; style=&quot;text-decoration: none;&quot;)</span><br><span class="line">                  .background-img(</span><br><span class="line">                    style=`background-image:url($&#123;sponsor.avatar&#125;);background-repeat:no-repeat;background-size:cover;background-position:right;mask-image:linear-gradient(to left, transparent, black);-webkit-mask-image:linear-gradient(to left, transparent, black);`</span><br><span class="line">                    onerror=`this.onerror=null;this.style.backgroundImage=&#x27;url(&quot;` + url_for(theme.error_img.post_page) + `&quot;)&#x27;`</span><br><span class="line">                  )</span><br><span class="line">                  .sponsor-card-left</span><br><span class="line">                    .sponsor-avatar-title</span><br><span class="line">                      img.no-lightbox(</span><br><span class="line">                        src=sponsor.avatar </span><br><span class="line">                        alt=&#x27;&#x27; </span><br><span class="line">                        onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.post_page) + `&#x27;`</span><br><span class="line">                      )</span><br><span class="line">                      .sponsor-name= sponsor.name</span><br><span class="line">                    .sponsor-desc= sponsor.description</span><br><span class="line">                  .sponsor-card-right</span><br><span class="line">                    .sponsor-amount= sponsor.amount</span><br><span class="line">                    .sponsor-date= sponsor.date ? String(sponsor.date).slice(0, 10) : &#x27;&#x27;</span><br><span class="line">              else</span><br><span class="line">                .sponsor-card(style=&quot;pointer-events: none; cursor: default;&quot;)</span><br><span class="line">                  .background-img(</span><br><span class="line">                    style=`background-image:url($&#123;sponsor.avatar&#125;);background-repeat:no-repeat;background-size:cover;background-position:right;mask-image:linear-gradient(to left, transparent, black);-webkit-mask-image:linear-gradient(to left, transparent, black);`</span><br><span class="line">                    onerror=`this.onerror=null;this.style.backgroundImage=&#x27;url(&quot;` + url_for(theme.error_img.post_page) + `&quot;)&#x27;`</span><br><span class="line">                  )</span><br><span class="line">                  .sponsor-card-left</span><br><span class="line">                    .sponsor-avatar-title</span><br><span class="line">                        img.no-lightbox(</span><br><span class="line">                          src=sponsor.avatar </span><br><span class="line">                          alt=&#x27;&#x27;</span><br><span class="line">                          onerror=`this.onerror=null;this.src=&#x27;` + url_for(theme.error_img.post_page) + `&#x27;`</span><br><span class="line">                        )</span><br><span class="line">                        .sponsor-name= sponsor.name</span><br><span class="line">                    .sponsor-desc= sponsor.description</span><br><span class="line">                  .sponsor-card-right</span><br><span class="line">                    .sponsor-amount= sponsor.amount</span><br><span class="line">                    .sponsor-date= sponsor.date ? String(sponsor.date).slice(0, 10) : &#x27;&#x27;</span><br><span class="line">          </span><br><span class="line">        else</span><br><span class="line">          .no-sponsors</span><br><span class="line">            p 暂无赞赏者数据</span><br><span class="line"></span><br><span class="line">      // 统计信息</span><br><span class="line">      .statistics</span><br><span class="line">        .total-count 共计 </span><br><span class="line">          span.stat-number= totalCount</span><br><span class="line">          |  笔打款</span><br><span class="line">        .total-amount 累计金额 </span><br><span class="line">          span.stat-number ¥#&#123;totalAmount.toFixed(2)&#125;</span><br><span class="line"></span><br><span class="line">  != page.content</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>然后修改<code>[blogRoot]\themes\butterfly\layout\page.pug</code>文件，添加上Rewards页面的布局：(➕号的代码,注意格式)</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><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></pre></td><td class="code"><pre><span class="line">extends includes/layout.pug</span><br><span class="line"></span><br><span class="line">block content</span><br><span class="line">  - const noCardLayout = [&#x27;shuoshuo&#x27;, &#x27;404&#x27;].includes(page.type) ? &#x27;nc&#x27; : &#x27;&#x27;</span><br><span class="line">  - var commentsJsLoad = false </span><br><span class="line"></span><br><span class="line">  mixin commentLoad</span><br><span class="line">    if page.comments !== false &amp;&amp; theme.comments.use</span><br><span class="line">      - commentsJsLoad = true</span><br><span class="line">      !=partial(&#x27;includes/third-party/comments/index&#x27;, &#123;&#125;, &#123;cache: true&#125;)</span><br><span class="line"></span><br><span class="line">  #page(class=noCardLayout)</span><br><span class="line">    if top_img === false &amp;&amp; page.title</span><br><span class="line">      page-title= page.title</span><br><span class="line"></span><br><span class="line">    case page.type</span><br><span class="line">      when &#x27;tags&#x27;</span><br><span class="line">        include includes/page/tags.pug</span><br><span class="line">        +commentLoad</span><br><span class="line">      when &#x27;link&#x27;</span><br><span class="line">        include includes/page/flink.pug</span><br><span class="line">        +commentLoad</span><br><span class="line">+    when &#x27;rewards&#x27;</span><br><span class="line">+      include includes/page/rewards.pug</span><br><span class="line">+      +commentLoad</span><br><span class="line">      when &#x27;categories&#x27;</span><br><span class="line">        include includes/page/categories.pug</span><br><span class="line">        +commentLoad</span><br><span class="line">      when &#x27;devices&#x27;</span><br><span class="line">        include includes/page/devices.pug</span><br><span class="line">      when &#x27;shuoshuo&#x27;</span><br><span class="line">        include includes/page/shuoshuo.pug</span><br><span class="line">      when &#x27;about&#x27;</span><br><span class="line">        include includes/page/about.pug</span><br><span class="line">      when &#x27;404&#x27;</span><br><span class="line">        include includes/page/404.pug</span><br><span class="line">      default</span><br><span class="line">        include includes/page/default-page.pug</span><br><span class="line">        +commentLoad</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>删掉加号后自行注意缩进，这里缩进应该挺明显的吧，所以就不多说啦。</p><p>页面结构添加完成，下面实现样式，创建文件<code>[blogRoot]\themes\butterfly\source\css\_page\rewards.styl</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><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><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br></pre></td><td class="code"><pre><span class="line">#article-container</span><br><span class="line">  .reward-page</span><br><span class="line">    // 感谢图片</span><br><span class="line">    .thank-image</span><br><span class="line">      text-align: center</span><br><span class="line">      img</span><br><span class="line">        box-shadow: none</span><br><span class="line">        height: 200px</span><br><span class="line">      .img-alt</span><br><span class="line">        display: none</span><br><span class="line"></span><br><span class="line">    // 收款码区域</span><br><span class="line">    .payment-codes</span><br><span class="line">      display: flex</span><br><span class="line">      justify-content: center</span><br><span class="line">      gap: 40px</span><br><span class="line">      margin: 30px 0</span><br><span class="line">      flex-wrap: wrap</span><br><span class="line"></span><br><span class="line">      @media screen and (max-width: 768px)</span><br><span class="line">        gap: 20px</span><br><span class="line"></span><br><span class="line">      .payment-item</span><br><span class="line">        text-align: center</span><br><span class="line">        transition: transform 0.3s ease</span><br><span class="line"></span><br><span class="line">        &amp;:hover</span><br><span class="line">          transform: translateY(-5px)</span><br><span class="line"></span><br><span class="line">        .payment-content</span><br><span class="line">          display: flex</span><br><span class="line">          flex-direction: column</span><br><span class="line">          align-items: center</span><br><span class="line">          gap: 15px</span><br><span class="line"></span><br><span class="line">        .payment-image</span><br><span class="line">          width: 250px</span><br><span class="line">          height: 250px</span><br><span class="line">          border-radius: 15px</span><br><span class="line">          overflow: hidden</span><br><span class="line">          box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1)</span><br><span class="line"></span><br><span class="line">          @media screen and (max-width: 768px)</span><br><span class="line">            width: 150px</span><br><span class="line">            height: 150px</span><br><span class="line"></span><br><span class="line">          img</span><br><span class="line">            width: 100%</span><br><span class="line">            height: 100%</span><br><span class="line">            object-fit: cover</span><br><span class="line"></span><br><span class="line">        .payment-info</span><br><span class="line">          .payment-name</span><br><span class="line">            font-size: 16px</span><br><span class="line">            color: var(--liushen-text)</span><br><span class="line">            font-weight: 600</span><br><span class="line">            margin-bottom: 5px</span><br><span class="line"></span><br><span class="line">    // 赞赏者列表</span><br><span class="line">    .sponsors-list</span><br><span class="line">      margin-bottom: 30px</span><br><span class="line"></span><br><span class="line">      // 头部区域</span><br><span class="line">      .sponsors-header</span><br><span class="line">        display: flex</span><br><span class="line">        flex-direction: row-reverse</span><br><span class="line"></span><br><span class="line">        .sponsors-description</span><br><span class="line">          p</span><br><span class="line">            font-size: 16px</span><br><span class="line">            color: var(--liushen-secondtext)</span><br><span class="line">            font-style: italic</span><br><span class="line"></span><br><span class="line">      .sponsors-container</span><br><span class="line">        display: flex</span><br><span class="line">        flex-wrap: wrap</span><br><span class="line">        justify-content: flex-start</span><br><span class="line">        margin: -8px // 抵消子元素的 margin</span><br><span class="line"></span><br><span class="line">        .sponsor-item</span><br><span class="line">          margin: 8px // 统一的 margin</span><br><span class="line">          // 默认宽度 (1列)</span><br><span class="line">          width: &quot;calc(100% - %s)&quot; % (8px * 2)</span><br><span class="line"></span><br><span class="line">          // 800px 及以上 (2列)</span><br><span class="line">          @media screen and (min-width: 800px)</span><br><span class="line">            width: &quot;calc(100% / 2 - %s)&quot; % (8px * 2)</span><br><span class="line"></span><br><span class="line">          // 1200px 及以上 (3列)</span><br><span class="line">          @media screen and (min-width: 1200px)</span><br><span class="line">            width: &quot;calc(100% / 3 - %s)&quot; % (8px * 2)</span><br><span class="line"></span><br><span class="line">          background-color: var(--liushen-card-bg)</span><br><span class="line">          border: var(--liushen-card-border)</span><br><span class="line">          border-radius: 12px</span><br><span class="line">          transition: all 0.3s ease</span><br><span class="line">          overflow: hidden</span><br><span class="line"></span><br><span class="line">          &amp;:hover</span><br><span class="line">            transform: translateY(-2px)</span><br><span class="line">            .background-img</span><br><span class="line">              opacity: 0.5</span><br><span class="line">              transform: translateX(-50%) translateY(-50%) scale(1.3) !important</span><br><span class="line"></span><br><span class="line">            .sponsor-avatar-title</span><br><span class="line">                opacity: 0 !important</span><br><span class="line">            .sponsor-desc</span><br><span class="line">                opacity: 1 !important</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">          .sponsor-card</span><br><span class="line">            display: flex</span><br><span class="line">            justify-content: space-between</span><br><span class="line">            height: 52px</span><br><span class="line">            width: 100%</span><br><span class="line">            align-items: center</span><br><span class="line">            padding: 10px</span><br><span class="line">            transition: all 0.3s ease</span><br><span class="line">            position: relative</span><br><span class="line"></span><br><span class="line">            .background-img</span><br><span class="line">              position: absolute</span><br><span class="line">              transform: translateX(-50%) translateY(-50%)</span><br><span class="line">              width: 400px</span><br><span class="line">              height: 400px</span><br><span class="line">              border-radius: 50%</span><br><span class="line">              transition: all 0.3s ease</span><br><span class="line">              opacity: 0.7</span><br><span class="line">              z-index: 0</span><br><span class="line">              top: 50%</span><br><span class="line">              left: 10px</span><br><span class="line"></span><br><span class="line">            .sponsor-card-left</span><br><span class="line">              display: flex</span><br><span class="line">              z-index: 1</span><br><span class="line">              align-items: center</span><br><span class="line">              gap: 15px</span><br><span class="line">              flex: 1</span><br><span class="line">              min-width: 0</span><br><span class="line"></span><br><span class="line">              .sponsor-avatar-title</span><br><span class="line">                display: flex</span><br><span class="line">                height: 100%</span><br><span class="line">                align-items: center</span><br><span class="line">                gap: 10px</span><br><span class="line">                opacity: 1</span><br><span class="line">                transition: all 0.3s ease</span><br><span class="line"></span><br><span class="line">                img</span><br><span class="line">                  width: 20px</span><br><span class="line">                  margin: 0</span><br><span class="line">                  height: 20px</span><br><span class="line">                  border-radius: 50%</span><br><span class="line">                  object-fit: cover</span><br><span class="line"></span><br><span class="line">                .sponsor-name</span><br><span class="line">                  font-size: 16px</span><br><span class="line">                  font-weight: 600</span><br><span class="line">                  color: var(--liushen-text)</span><br><span class="line">                  transition: all 0.3s ease</span><br><span class="line">                  white-space: nowrap</span><br><span class="line">                  overflow: hidden</span><br><span class="line">                  text-overflow: ellipsis</span><br><span class="line"></span><br><span class="line">              .sponsor-desc</span><br><span class="line">                position: absolute</span><br><span class="line">                transform: translateY(-50%)</span><br><span class="line">                z-index: 1</span><br><span class="line">                left: 20px</span><br><span class="line">                top: 50%</span><br><span class="line">                font-size: 16px</span><br><span class="line">                font-weight: 600</span><br><span class="line">                color: var(--liushen-text)</span><br><span class="line">                opacity: 0</span><br><span class="line">                transition: all 0.3s ease</span><br><span class="line">                white-space: nowrap</span><br><span class="line">                overflow: hidden</span><br><span class="line">                text-overflow: ellipsis</span><br><span class="line">                max-width: calc(100% - 180px)</span><br><span class="line"></span><br><span class="line">            .sponsor-card-right</span><br><span class="line">              text-align: right</span><br><span class="line">              display: flex</span><br><span class="line">              gap:10px</span><br><span class="line"></span><br><span class="line">              .sponsor-amount</span><br><span class="line">                font-size: 16px</span><br><span class="line">                font-weight: 600</span><br><span class="line">                line-height: 1</span><br><span class="line">                color: var(--default-bg-color)</span><br><span class="line"></span><br><span class="line">              .sponsor-date</span><br><span class="line">                font-size: 16px</span><br><span class="line">                line-height: 1</span><br><span class="line">                color: var(--liushen-secondtext)</span><br><span class="line"></span><br><span class="line">                .sponsor-card:hover &amp;</span><br><span class="line">                  color: rgba(255, 255, 255, 0.8)</span><br><span class="line"></span><br><span class="line">      .statistics</span><br><span class="line">        display: flex</span><br><span class="line">        flex-direction: column</span><br><span class="line">        gap: 5px</span><br><span class="line">        font-size: 16px</span><br><span class="line">        color: var(--liushen-text)</span><br><span class="line">        margin-top: 20px</span><br><span class="line">        .stat-number</span><br><span class="line">          font-weight: 600</span><br><span class="line">          color: var(--default-bg-color)</span><br><span class="line"></span><br><span class="line">    // 无数据提示</span><br><span class="line">    .no-sponsors</span><br><span class="line">      text-align: center</span><br><span class="line">      padding: 50px</span><br><span class="line">      color: var(--liushen-secondtext)</span><br><span class="line"></span><br><span class="line">      p</span><br><span class="line">        font-size: 16px</span><br><span class="line">        margin: 0</span><br><span class="line"></span><br><span class="line">// 定义渐入动画</span><br><span class="line">@keyframes fadeInUp</span><br><span class="line">  from</span><br><span class="line">    opacity: 0</span><br><span class="line">    transform: translateY(20px)</span><br><span class="line">  to</span><br><span class="line">    opacity: 1</span><br><span class="line">    transform: translateY(0)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>页面渲染结构，页面样式均写完了，我们如何定位该页面的位置呢？在<code>[blogRoot]/source</code>创建<code>Rewards</code>文件夹，内部创建<code>index.md</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></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 感谢赞助，每一份都是对我莫大的支持</span><br><span class="line">date: 2018-06-07 22:17:49</span><br><span class="line">type: &quot;rewards&quot;</span><br><span class="line">aside: false</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">感谢每一份慷慨的赞赏，它不仅是支持，更是我前行路上温暖的光。这份心意我已悉心珍藏，会化作动力，努力为大家创造更多价值💗</span><br><span class="line"></span><br><span class="line">**【温馨提示】** 如果您在赞赏时，能留下备注或在下方评论区说一声，就能方便我将这份心意与您对应上，为您记录在专属的感谢名单里。期待与您相遇！</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>注意添加顶部的<code>type: &quot;rewards&quot;</code>，这一句是关键！</p><p>再次渲染，访问对应目录，应该就可以看见啦，教程完结！</p><h3 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h3><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.liushen.fun/posts/deffcde0/">    <div class="tag-link-tips">✅来自本站，本站可确保其安全性，请放心点击跳转</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/08/01/66aae601dbc9b.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">liushen的Butterfly魔改教程</div>            <div class="tag-link-sitename">效果展示</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div><h3 id="butterfly主页瀑布流双栏调整记录"><a href="#butterfly主页瀑布流双栏调整记录" class="headerlink" title="butterfly主页瀑布流双栏调整记录"></a>butterfly主页瀑布流双栏调整记录</h3><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>心血来潮，突然想把主页文章卡片改双栏瀑布流，根据官方文档教程，只需要把配置文件中的<code>index_layout: 1</code>改为<code>index_layout: 6</code>即可，但是在我27英寸显示器中成了三栏，更是当文章标题过长时会导致卡片错位情况，这种错位样式在三栏中个人觉得难以欣赏。</p><h3 id="问题解决"><a href="#问题解决" class="headerlink" title="问题解决"></a>问题解决</h3><p>瀑布流布局（<code>index_layout: 6</code> 或 <code>7</code>）的列数是通过 <code>.recent-post-item</code> 的宽度计算控制的。默认配置在超宽屏幕（≥2000px）会显示 3 列。具体的样式在<code>[BlogRoot]\themes\butterfly\source\css\_page\homepage.styl</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></pre></td><td class="code"><pre><span class="line">#recent-posts</span><br><span class="line">  .recent-post-item</span><br><span class="line">    @extend .cardHover</span><br><span class="line">    position: relative</span><br><span class="line">    overflow: hidden</span><br><span class="line">    margin-bottom: 20px</span><br><span class="line"></span><br><span class="line">    if $indexLayout == 6 || ($indexLayout == 7)</span><br><span class="line">      display: inline-block</span><br><span class="line">      width: calc(100% / 2 - 8px)</span><br><span class="line">      vertical-align: top</span><br><span class="line"></span><br><span class="line">      +maxWidth768()</span><br><span class="line">        width: 100%</span><br><span class="line"></span><br><span class="line">      +minWidth2000()</span><br><span class="line">        width: calc(100% / 3 - 8px)</span><br><span class="line">+        width: calc(100% / 2 - 8px)</span><br><span class="line"></span><br><span class="line">    if $indexLayout == 1 || ($indexLayout == 2 || ($indexLayout == 3))</span><br></pre></td></tr></table></figure><p><strong>注意</strong> : 加上➕号那行代码说明超大屏幕时候也显示<code>两列</code>,如果后续想显示<code>三列则把➕号代码注释或者删掉即可</code></p>]]>
    </content>
    <id>http://example.com/posts/f03592a8.html</id>
    <link href="http://example.com/posts/f03592a8.html"/>
    <published>2026-04-04T07:16:16.205Z</published>
    <summary>
      <![CDATA[<h3 id="个人卡片背景图"><a href="#个人卡片背景图" class="headerlink" title="个人卡片背景图"></a>个人卡片背景图</h3><p>1、在自建的css样式中加入一下代码</p>
<figure class="highlight cs]]>
    </summary>
    <title>魔改笔记一:页面样式优化</title>
    <updated>2026-04-06T13:44:24.710Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="上岸在即" scheme="http://example.com/categories/%E4%B8%8A%E5%B2%B8%E5%9C%A8%E5%8D%B3/"/>
    <category term="软考" scheme="http://example.com/tags/%E8%BD%AF%E8%80%83/"/>
    <content>
      <![CDATA[<p>docker安装包下载:<a href="https://download.docker.com/linux/static/stable/aarch64/">https://download.docker.com/linux/static/stable/aarch64/</a><br>测试<br>测试123<br><div class='liushen-tag-link'><a class="tag-Link" target="_blank" href="https://blog.zhheo.com/p/ccaf9148.html">    <div class="tag-link-tips">🪧引用站外地址，不保证站点的可用性和安全性</div>    <div class="tag-link-bottom">        <div class="tag-link-left" style="background-image: url(https://p.liiiu.cn/i/2024/07/27/66a4632bbf06e.webp);"></div>        <div class="tag-link-right">            <div class="tag-link-title">Hexo的Butterfly魔改教程</div>            <div class="tag-link-sitename">张洪He0 · 分享设计与科技生活</div>        </div>        <i class="fa-solid fa-angle-right"></i>    </div>    </a></div></p>]]>
    </content>
    <id>http://example.com/posts/0.html</id>
    <link href="http://example.com/posts/0.html"/>
    <published>2026-03-31T15:16:24.844Z</published>
    <summary>
      <![CDATA[<p>docker安装包下载:<a href="https://download.docker.com/linux/static/stable/aarch64/">https://download.docker.com/linux/static/stable/aarch64/</]]>
    </summary>
    <title>计算机操作系统</title>
    <updated>2026-04-05T14:27:33.769Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="笔耕问道" scheme="http://example.com/categories/%E7%AC%94%E8%80%95%E9%97%AE%E9%81%93/"/>
    <category term="开发" scheme="http://example.com/tags/%E5%BC%80%E5%8F%91/"/>
    <content>
      <![CDATA[<h3 id="MyBatis-Plus-自动分页（三步核心笔记）"><a href="#MyBatis-Plus-自动分页（三步核心笔记）" class="headerlink" title="MyBatis-Plus 自动分页（三步核心笔记）"></a>MyBatis-Plus 自动分页（三步核心笔记）</h3><h4 id="步骤一-service层必须创建Page"><a href="#步骤一-service层必须创建Page" class="headerlink" title="步骤一: service层必须创建Page"></a>步骤一: service层必须创建Page</h4><figure class="highlight java"><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="keyword">public</span> Page&lt;SesStuEval&gt; <span class="title function_">listPage</span><span class="params">(<span class="type">int</span> currentPage ,<span class="type">int</span> pageSize,SesStuEvalPageParam param)</span> &#123;</span><br><span class="line">    Page&lt;SesStuEval&gt; page = <span class="keyword">new</span> <span class="title class_">Page</span>&lt;&gt;(pcurrentPage, pageSize);</span><br><span class="line">    <span class="keyword">return</span> sesStuEvalMapper.listPage(page, param);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>✅ <strong>核心要点</strong>：</p><ul><li>必须通过<strong>new Page&lt;&gt;(current,size)</strong>创建分页对象</li><li>currentPage:当前页码(从1开始)</li><li>pageSize:每页数据条数</li><li>Ser’vice层服务初始化分页参数</li></ul><h4 id="步骤二-Mapper-必须接受Page"><a href="#步骤二-Mapper-必须接受Page" class="headerlink" title="步骤二:Mapper 必须接受Page"></a>步骤二:Mapper 必须接受Page</h4><figure class="highlight java"><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">Page&lt;SesStuEval&gt; <span class="title function_">listContainTopicPage</span><span class="params">(</span></span><br><span class="line"><span class="params">    <span class="meta">@Param(&quot;page&quot;)</span> Page&lt;SesStuEval&gt; page,</span></span><br><span class="line"><span class="params">    <span class="meta">@Param(&quot;param&quot;)</span> SesStuEvalPageParam param</span></span><br><span class="line"><span class="params">)</span>;</span><br></pre></td></tr></table></figure><p>✅ <strong>核心要点</strong>：</p><ul><li>方法第一个参数必须是 <code>Page&lt;T&gt;</code>类型</li><li>返回值类型也必须是 <code>Page&lt;T&gt;</code></li><li>建议通过 <code>@Param</code>明确指定参数名称</li><li>Page 对象会”透传”到 SQL 层</li></ul><h4 id="步骤三-XML-只写普通-SQL（不写分页）"><a href="#步骤三-XML-只写普通-SQL（不写分页）" class="headerlink" title="步骤三:XML 只写普通 SQL（不写分页）"></a>步骤三:XML 只写普通 SQL（不写分页）</h4><figure class="highlight xml"><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="tag">&lt;<span class="name">select</span> <span class="attr">id</span>=<span class="string">&quot;listContainTopicPage&quot;</span> <span class="attr">resultType</span>=<span class="string">&quot;com.xxx.SesStuEval&quot;</span>&gt;</span></span><br><span class="line">    SELECT *</span><br><span class="line">    FROM ses_stu_eval</span><br><span class="line">    <span class="tag">&lt;<span class="name">where</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">if</span> <span class="attr">test</span>=<span class="string">&quot;param.xxx != null&quot;</span>&gt;</span></span><br><span class="line">            AND xxx = #&#123;param.xxx&#125;</span><br><span class="line">        <span class="tag">&lt;/<span class="name">if</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">where</span>&gt;</span></span><br><span class="line">    ORDER BY create_time DESC</span><br><span class="line"><span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br></pre></td></tr></table></figure><p>✅ <strong>核心要点</strong>：</p><ul><li><strong>严禁</strong>在 SQL 中写 <code>LIMIT</code>分页</li><li><strong>严禁</strong>手动拼接分页逻辑</li><li>只需编写正常的业务查询语句</li><li>MyBatis-Plus 会自动在运行时添加分页条件</li></ul><h3 id="三大核心原则（必记）"><a href="#三大核心原则（必记）" class="headerlink" title="三大核心原则（必记）"></a>三大核心原则（必记）</h3><h4 id="Service-必须传-Page"><a href="#Service-必须传-Page" class="headerlink" title="Service 必须传 Page"></a>Service 必须传 Page</h4><figure class="highlight java"><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">//  正确</span></span><br><span class="line">Page&lt;SesStuEval&gt; page = <span class="keyword">new</span> <span class="title class_">Page</span>&lt;&gt;(param.getCurrent(), param.getSize());</span><br><span class="line"></span><br><span class="line"><span class="comment">// 错误</span></span><br><span class="line"><span class="comment">// 1. 不创建 Page</span></span><br><span class="line"><span class="comment">// 2. 创建 Page 但不传分页参数</span></span><br><span class="line"><span class="comment">// 3. 传了 Page 但页码/条数不正确</span></span><br></pre></td></tr></table></figure><h4 id="Mapper-必须带-Page"><a href="#Mapper-必须带-Page" class="headerlink" title="Mapper 必须带 Page"></a>Mapper 必须带 Page</h4><figure class="highlight java"><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">// 正确</span></span><br><span class="line">Page&lt;SesStuEval&gt; <span class="title function_">method</span><span class="params">(Page&lt;SesStuEval&gt; page, <span class="meta">@Param(&quot;param&quot;)</span> Object param)</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 错误</span></span><br><span class="line"><span class="comment">// 1. 参数中没有 Page</span></span><br><span class="line"><span class="comment">// 2. Page 参数不在第一位</span></span><br><span class="line"><span class="comment">// 3. 返回值类型是 List 而不是 Page</span></span><br></pre></td></tr></table></figure><h4 id="XML-不写-LIMIT"><a href="#XML-不写-LIMIT" class="headerlink" title="XML 不写 LIMIT"></a>XML 不写 LIMIT</h4><figure class="highlight sql"><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">-- 正确写法</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> <span class="keyword">table</span> <span class="keyword">WHERE</span> <span class="keyword">condition</span> <span class="keyword">ORDER</span> <span class="keyword">BY</span> create_time;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 错误写法</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> <span class="keyword">table</span> <span class="keyword">WHERE</span> <span class="keyword">condition</span> </span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> create_time</span><br><span class="line">LIMIT <span class="number">0</span>, <span class="number">10</span>;  <span class="comment">-- 禁止手动分页</span></span><br></pre></td></tr></table></figure><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/%E3%80%90%E5%93%B2%E9%A3%8E%E5%A3%81%E7%BA%B8%E3%80%91%E5%A4%9C%E6%99%AF-%E5%AF%8C%E5%A3%AB%E5%B1%B1.png" alt="【哲风壁纸】夜景-富士山"></p>]]>
    </content>
    <id>http://example.com/posts/1b62eb9e.html</id>
    <link href="http://example.com/posts/1b62eb9e.html"/>
    <published>2026-03-30T14:35:11.588Z</published>
    <summary>
      <![CDATA[<h3 id="MyBatis-Plus-自动分页（三步核心笔记）"><a href="#MyBatis-Plus-自动分页（三步核心笔记）" class="headerlink" title="MyBatis-Plus 自动分页（三步核心笔记）"></a>MyBatis-Plu]]>
    </summary>
    <title>mybatis-plus自动分页</title>
    <updated>2026-04-05T14:21:38.406Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="笔耕问道" scheme="http://example.com/categories/%E7%AC%94%E8%80%95%E9%97%AE%E9%81%93/"/>
    <category term="开发" scheme="http://example.com/tags/%E5%BC%80%E5%8F%91/"/>
    <category term="snowy" scheme="http://example.com/tags/snowy/"/>
    <content>
      <![CDATA[<blockquote><p>在snowy框架中新增一个自定义模块(或插件),需要遵循清晰的多模块项目管理规范,其核心思想是通过模块化分离,实现功能插件的独立开发、统一管理与集成.</p></blockquote><h3 id="一、项目结构与模块划分原则"><a href="#一、项目结构与模块划分原则" class="headerlink" title="一、项目结构与模块划分原则"></a>一、项目结构与模块划分原则</h3><p>snowy的插件体系采用“接口-实现”分离的架构</p><p> 1、<strong>插件接口处(snowy-plugin-api/)</strong>: 存放模块的API定义、DTO、枚举、常量等公共内容。此模块的职责是定义契约，不包含具体实现，可供其他模块依赖以调用接口。</p><p> 2、<strong>插件实现从(snowy-plugin/)</strong>:存放模块的业务逻辑、控制器、服务实现、Mapper、资源配置等具体实现代码。</p><p> 3、<strong>主启动模块(snowy—plugin-app)</strong>:作为最终的应用入口，负责集成和启动所有功能插件。</p><h3 id="二、新增自定义模块“A”的详细步骤"><a href="#二、新增自定义模块“A”的详细步骤" class="headerlink" title="二、新增自定义模块“A”的详细步骤"></a>二、新增自定义模块“A”的详细步骤</h3><p>假设新增的模块名为 <strong><code>a</code></strong>。</p><h4 id="步骤1-创建插件接口模块"><a href="#步骤1-创建插件接口模块" class="headerlink" title="步骤1: 创建插件接口模块"></a>步骤1: 创建插件接口模块</h4><ol><li><p>在 <code>snowy-plugin-api</code>目录下，创建模块 <code>snowy-plugin-a-api</code></p></li><li><p>编辑 <code>snowy-plugin-a-api</code>的 <code>pom.xml</code>，必须引入公共核心模块 <code>snowy-common</code>，以确保能使用框架的基础设施。</p><figure class="highlight xml"><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">&lt;!-- 位于 snowy-plugin-a-api/pom.xml --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>vip.xiaonuo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>snowy-common<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>在 <code>snowy-plugin-api</code>目录的<strong>父级</strong> <code>pom.xml</code>中，声明此子模块，以将其纳入统一构建。</p><figure class="highlight xml"><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">&lt;!-- 位于 snowy-plugin-api/pom.xml 的 modules 部分 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">module</span>&gt;</span>snowy-plugin-a-api<span class="tag">&lt;/<span class="name">module</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h4 id="步骤2-创建插件实现模块"><a href="#步骤2-创建插件实现模块" class="headerlink" title="步骤2:创建插件实现模块"></a>步骤2:创建插件实现模块</h4><ol><li><p>在 <code>snowy-plugin</code>目录下，创建模块 <code>snowy-plugin-a</code></p></li><li><p>编辑 <code>snowy-plugin-a</code>的 <code>pom.xml</code>，<strong>必须引入步骤1创建的自身API模块</strong> <code>snowy-plugin-a-api</code>，以实现对接口定义的依赖 </p><figure class="highlight xml"><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">&lt;!-- 位于 snowy-plugin-a/pom.xml --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>vip.xiaonuo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>snowy-plugin-a-api<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>$&#123;project.parent.version&#125;<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>在 <code>snowy-plugin</code>目录的<strong>父级</strong> <code>pom.xml</code>中，声明此子模块.</p><figure class="highlight xml"><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">&lt;!-- 位于 snowy-plugin/pom.xml 的 modules 部分 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">module</span>&gt;</span>snowy-plugin-a<span class="tag">&lt;/<span class="name">module</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h4 id="步骤3-在主启动模块中集成插件"><a href="#步骤3-在主启动模块中集成插件" class="headerlink" title="步骤3:在主启动模块中集成插件"></a>步骤3:在主启动模块中集成插件</h4><p>1、编辑主应用模块 <code>snowy-web-app</code>的 <code>pom.xml</code>，引入插件的<strong>实现模块</strong> <code>snowy-plugin-a</code>。这是插件功能被实际加载到运行中的应用的关键步骤。</p><figure class="highlight xml"><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">&lt;!-- 位于 snowy-web-app/pom.xml --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>vip.xiaonuo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>snowy-plugin-a<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">version</span>&gt;</span>$&#123;project.parent.version&#125;<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="步骤4-在项目根POM中进行总声明（关键且易遗漏步骤）"><a href="#步骤4-在项目根POM中进行总声明（关键且易遗漏步骤）" class="headerlink" title="步骤4:在项目根POM中进行总声明（关键且易遗漏步骤）"></a>步骤4:在项目根POM中进行总声明（关键且易遗漏步骤）</h4><p>1、编辑项目最顶层的根目录下的 <code>pom.xml</code>文件。</p><p>2、在 <code>&lt;modules&gt;</code>部分，添加新增的两个模块，确保它们能被Maven顶级构建正确识别和编译。</p><figure class="highlight xml"><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="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">             <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>vip.xiaonuo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">             <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>snowy-plugin-a<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">             <span class="tag">&lt;<span class="name">version</span>&gt;</span>$&#123;snowy.version&#125;<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">         <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br><span class="line">         <span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">             <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>vip.xiaonuo<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">             <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>snowy-plugin-a-api<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">             <span class="tag">&lt;<span class="name">version</span>&gt;</span>$&#123;snowy.version&#125;<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">         <span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>http://example.com/posts/6a434e1d.html</id>
    <link href="http://example.com/posts/6a434e1d.html"/>
    <published>2026-03-30T14:00:10.410Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>在snowy框架中新增一个自定义模块(或插件),需要遵循清晰的多模块项目管理规范,其核心思想是通过模块化分离,实现功能插件的独立开发、统一管理与集成.</p>
</blockquote>
<h3 id="一、项目结构与模块划分原则"><a href]]>
    </summary>
    <title>在snowy框架中新增自定义模块</title>
    <updated>2026-04-05T14:21:38.390Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="笔耕问道" scheme="http://example.com/categories/%E7%AC%94%E8%80%95%E9%97%AE%E9%81%93/"/>
    <category term="部署" scheme="http://example.com/tags/%E9%83%A8%E7%BD%B2/"/>
    <category term="ssh" scheme="http://example.com/tags/ssh/"/>
    <content>
      <![CDATA[<h3 id="ssh"><a href="#ssh" class="headerlink" title="ssh"></a>ssh</h3><p>ssh是应用于远程连接服务器的一种协议</p><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><h4 id="远程登录服务器命令"><a href="#远程登录服务器命令" class="headerlink" title="远程登录服务器命令"></a>远程登录服务器命令</h4><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 user@hostname</span><br></pre></td></tr></table></figure><p>user: <em>用户名</em></p><p>hostname: <em>IP地址或者域名</em></p><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></pre></td><td class="code"><pre><span class="line">The authenticity of host <span class="string">&#x27;123.57.47.211 (123.57.47.211)&#x27;</span> can<span class="string">&#x27;t be established.</span></span><br><span class="line"><span class="string">ECDSA key fingerprint is SHA256:iy237yysfCe013/l+kpDGfEG9xxHxm0dnxnAbJTPpG8.</span></span><br><span class="line"><span class="string">Are you sure you want to continue connecting (yes/no/[fingerprint])?</span></span><br></pre></td></tr></table></figure><p>输入<em>yes</em>,然后回车即可.</p><p>这样会将该服务器的信息记录在~/.ssh/known_hosts文件中。</p><p>然后输入密码即可登录到远程服务器中。</p><h4 id="指定端口登录"><a href="#指定端口登录" class="headerlink" title="指定端口登录"></a>指定端口登录</h4><p>默认登录端口号为22。如果想登录某一特定端口：</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">ssh user@hostname -p 端口号</span><br></pre></td></tr></table></figure><h3 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h3><p>创建文件 <strong>~/.ssh/config</strong></p><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><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">Host myserver1</span><br><span class="line">    HostName IP地址或域名</span><br><span class="line">    User 用户名</span><br><span class="line">x</span><br><span class="line">Host myserver2</span><br><span class="line">    HostName IP地址或域名</span><br><span class="line">    User 用户名</span><br></pre></td></tr></table></figure><p>之后再使用服务器时，可以直接使用别名<em>myserver1、myserver2</em>。</p><p>如 ssh myserver1</p><h3 id="密钥登录"><a href="#密钥登录" class="headerlink" title="密钥登录"></a>密钥登录</h3><p>进入文件 <strong>~/.ssh</strong></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-keygen</span><br></pre></td></tr></table></figure><p>然后一直回车即可。</p><p>执行结束后，~/.ssh/目录下会多两个文件：</p><p>​    1、id_rsa：私钥</p><p>​    2、id_rsa.pub：公钥</p><p>之后想免密码登录哪个服务器，就将公钥传给哪个服务器即可。</p><p>例如，想免密登录<em>myserver服务器</em>。则将公钥中的内容，复制到myserver中的~/.ssh/authorized_keys文件里即可。</p><p>也可以使用如下命令一键添加公钥：</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">ssh-copy-id myserver</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>http://example.com/posts/f5f30b62.html</id>
    <link href="http://example.com/posts/f5f30b62.html"/>
    <published>2026-03-29T14:47:33.000Z</published>
    <summary>
      <![CDATA[<h3 id="ssh"><a href="#ssh" class="headerlink" title="ssh"></a>ssh</h3><p>ssh是应用于远程连接服务器的一种协议</p>
<h3 id="基本用法"><a href="#基本用法" class="heade]]>
    </summary>
    <title>ssh基本用法</title>
    <updated>2026-04-05T14:21:38.392Z</updated>
  </entry>
  <entry>
    <author>
      <name>moh</name>
    </author>
    <category term="笔耕问道" scheme="http://example.com/categories/%E7%AC%94%E8%80%95%E9%97%AE%E9%81%93/"/>
    <category term="部署" scheme="http://example.com/tags/%E9%83%A8%E7%BD%B2/"/>
    <content>
      <![CDATA[<h1 id="docker和docker-commpose离线安装"><a href="#docker和docker-commpose离线安装" class="headerlink" title="docker和docker-commpose离线安装"></a>docker和docker-commpose离线安装</h1><p>背景说明: 本文部署的服务器是 arm架构的</p><h4 id="1、安装包下载"><a href="#1、安装包下载" class="headerlink" title="1、安装包下载"></a>1、安装包下载</h4><p>docker安装包下载:<a href="https://download.docker.com/linux/static/stable/aarch64/">https://download.docker.com/linux/static/stable/aarch64/</a></p><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260328234556237.png" alt="image-20260328234556237"></p><p>docker-compose安装包下载: <a href="https://github.com/docker/compose/releases">https://github.com/docker/compose/releases</a></p><p><img src="https://hexo-moh.oss-cn-beijing.aliyuncs.com/img/image-20260328234616336.png" alt="image-20260328234616336"></p><h4 id="2、解压docker安装包"><a href="#2、解压docker安装包" class="headerlink" title="2、解压docker安装包"></a>2、解压docker安装包</h4><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">tar -xvf docker-25.0.2.tgz</span><br></pre></td></tr></table></figure><h4 id="3、解压后会中当前目前下有一个叫docker的文件目录-将该文件夹下的文件拷贝到-user-bin-下面"><a href="#3、解压后会中当前目前下有一个叫docker的文件目录-将该文件夹下的文件拷贝到-user-bin-下面" class="headerlink" title="3、解压后会中当前目前下有一个叫docker的文件目录,将该文件夹下的文件拷贝到 */user/bin* 下面"></a>3、解压后会中当前目前下有一个叫docker的文件目录,将该文件夹下的文件拷贝到 <code>*/user/bin*</code> 下面</h4><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"><span class="built_in">cp</span> docker/* /usr/bin/</span><br></pre></td></tr></table></figure><h4 id="4、将docker注册为系统服务"><a href="#4、将docker注册为系统服务" class="headerlink" title="4、将docker注册为系统服务"></a>4、将docker注册为系统服务</h4><p>创建文件 <em>/etc/systemd/system/docker.service</em>,并添加以下内容</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Docker Application Container Engine</span><br><span class="line">Documentation=https://docs.docker.com</span><br><span class="line">After=network-online.target firewalld.serviceWants=network-online.target</span><br><span class="line">[Service]</span><br><span class="line">Type=notify</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">the default is not to use systemd <span class="keyword">for</span> cgroups because the delegate issues still</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">exists and systemd currently does not support the cgroup feature <span class="built_in">set</span> required</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">for</span> containers run by docker</span></span><br><span class="line">ExecStart=/usr/bin/dockerd</span><br><span class="line">ExecReload=/bin/kill -s HUP $MAINPID</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Having non-zero Limit*s causes performance problems due to accounting overhead</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">in</span> the kernel. We recommend using cgroups to <span class="keyword">do</span> container-local accounting.</span></span><br><span class="line">LimitNOFILE=infinity</span><br><span class="line">LimitNPROC=infinity</span><br><span class="line">LimitCORE=infinity</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Uncomment TasksMax <span class="keyword">if</span> your systemd version supports it.</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Only systemd 226 and above support this version.</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">TasksMax=infinity</span></span><br><span class="line">TimeoutStartSec=0</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">set</span> delegate <span class="built_in">yes</span> so that systemd does not reset the cgroups of docker containers</span></span><br><span class="line">Delegate=yes</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="built_in">kill</span> only the docker process, not all processes <span class="keyword">in</span> the cgroup</span></span><br><span class="line">KillMode=process</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">restart the docker process <span class="keyword">if</span> it exits prematurely</span></span><br><span class="line">Restart=on-failure</span><br><span class="line">StartLimitBurst=3</span><br><span class="line">StartLimitInterval=60s</span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure><h4 id="5、安装docker-compose"><a href="#5、安装docker-compose" class="headerlink" title="5、安装docker-compose"></a>5、安装docker-compose</h4><p>将docker-compose-linux-aarch64 文件复制到<em>/usr/local/bin/</em>目录下,并 重命名为<em>docker-compose</em></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"><span class="built_in">cp</span> docker-compose-linux-aarch64 /usr/local/bin/docker-compose</span><br></pre></td></tr></table></figure><h4 id="6、设置文件文件权限"><a href="#6、设置文件文件权限" class="headerlink" title="6、设置文件文件权限"></a>6、设置文件文件权限</h4><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">chmod</span> +x /etc/systemd/system/docker.service</span><br><span class="line"><span class="built_in">chmod</span> +x /etc/systemd/system/docker.service</span><br></pre></td></tr></table></figure><h4 id="7、重新加载systemd-将新建的docker服务生效"><a href="#7、重新加载systemd-将新建的docker服务生效" class="headerlink" title="7、重新加载systemd  将新建的docker服务生效"></a>7、重新加载systemd  将新建的docker服务生效</h4><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">systemctl daemon-reload</span><br></pre></td></tr></table></figure><h4 id="8、启动docker服务"><a href="#8、启动docker服务" class="headerlink" title="8、启动docker服务"></a>8、启动docker服务</h4><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">systemctl start docker</span><br><span class="line"></span><br><span class="line">查看dokcer状态 </span><br><span class="line">systemctl status docker</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>http://example.com/posts/6b7ec017.html</id>
    <link href="http://example.com/posts/6b7ec017.html"/>
    <published>2026-03-26T14:47:33.000Z</published>
    <summary>
      <![CDATA[<h1 id="docker和docker-commpose离线安装"><a href="#docker和docker-commpose离线安装" class="headerlink" title="docker和docker-commpose离线安装"></a>docker和d]]>
    </summary>
    <title>docker离线部署</title>
    <updated>2026-04-05T14:21:38.398Z</updated>
  </entry>
</feed>
