<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>喵洛阁</title>
  
  <subtitle>克喵的书斋</subtitle>
  <link href="https://myboke.kemiaosw.top/atom.xml" rel="self"/>
  
  <link href="https://myboke.kemiaosw.top/"/>
  <updated>2025-09-25T13:51:05.627Z</updated>
  <id>https://myboke.kemiaosw.top/</id>
  
  <author>
    <name>克喵爱吃卤面</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>github-issues-moment</title>
    <link href="https://myboke.kemiaosw.top/posts/a56bd99b.html"/>
    <id>https://myboke.kemiaosw.top/posts/a56bd99b.html</id>
    <published>2025-09-24T14:58:31.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>起源于在不同博客游览间，看到了一篇<a href="https://lawtee.com/article/add-live-talking-page-for-static-blog/">文章</a>，感觉很有搞头，然后到了博主的<a href="https://github.com/h2dcc/moments">GitHub仓库</a>，然后有了些感受。</p></blockquote><h2 id="优点">优点</h2><p>有不少的博客基于github-issues，包括<a href="https://github.com/wallleap/ethereal">etheral</a>、<a href="https://github.com/Meekdai/Gmeek">Gmeek</a>等等，当然，除了当博客，你也可以使用其来搞博客。</p><blockquote><p>很好的一种博客写作方式，理论上GitHub不倒，这个方式可以一直使用。</p></blockquote><blockquote><p>手机上有GitHub的APP，你可以比较简单地在手机上发布动态。</p></blockquote><blockquote><p>这种方式可以被用来在各种博客里使用，包括Hugo、astro等等。</p></blockquote><p>大致的工作流如下:</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="string">//</span> <span class="string">.github/workflows/issue.yml</span></span><br><span class="line"></span><br><span class="line"><span class="attr">name:</span> <span class="string">Trigger</span> <span class="string">Empty</span> <span class="string">Commit</span> <span class="string">on</span> <span class="string">Issue</span> <span class="string">Update</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">issue_comment:</span></span><br><span class="line">    <span class="attr">types:</span> [<span class="string">created</span>, <span class="string">edited</span>]</span><br><span class="line">  <span class="attr">workflow_dispatch:</span>  <span class="comment"># 手动触发入口</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">trigger-empty-commit:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Check</span> <span class="string">trigger</span> <span class="string">type</span> <span class="string">and</span> <span class="string">prepare</span> <span class="string">commit</span> <span class="string">message</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">check-trigger</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          # 处理手动触发</span></span><br><span class="line"><span class="string">          if [[ &quot;$&#123;&#123; github.event_name &#125;&#125;&quot; == &quot;workflow_dispatch&quot; ]]; then</span></span><br><span class="line"><span class="string">            echo &quot;should_trigger=true&quot; &gt;&gt; $GITHUB_OUTPUT</span></span><br><span class="line"><span class="string">            echo &quot;commit_msg=&#x27;[Manual] Trigger update from moments/issues/1&#x27;&quot; &gt;&gt; $GITHUB_OUTPUT</span></span><br><span class="line"><span class="string">          # 处理issue评论事件</span></span><br><span class="line"><span class="string">          elif [ &quot;$&#123;&#123; github.event.issue.number &#125;&#125;&quot; -eq 1 ]; then</span></span><br><span class="line"><span class="string">            echo &quot;should_trigger=true&quot; &gt;&gt; $GITHUB_OUTPUT</span></span><br><span class="line"><span class="string">            echo &quot;commit_msg=&#x27;Trigger update from moments/issues/1&#x27;&quot; &gt;&gt; $GITHUB_OUTPUT</span></span><br><span class="line"><span class="string">          else</span></span><br><span class="line"><span class="string">            echo &quot;should_trigger=false&quot; &gt;&gt; $GITHUB_OUTPUT</span></span><br><span class="line"><span class="string">            echo &quot;commit_msg=&#x27;&#x27;&quot; &gt;&gt; $GITHUB_OUTPUT</span></span><br><span class="line"><span class="string">          fi</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Trigger</span> <span class="string">empty</span> <span class="string">commit</span> <span class="string">in</span> <span class="string">lawtee.github.io</span></span><br><span class="line">        <span class="attr">if:</span> <span class="string">steps.check-trigger.outputs.should_trigger</span> <span class="string">==</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/github-script@v6</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">PAT:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.PAT</span> <span class="string">&#125;&#125;</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line"><span class="string">            const &#123; execSync &#125; = require(&#x27;child_process&#x27;);</span></span><br><span class="line"><span class="string">            const repo = &#x27;h2dcc/lawtee.github.io&#x27;;</span></span><br><span class="line"><span class="string">            const token = process.env.PAT;</span></span><br><span class="line"><span class="string"></span>      </span><br><span class="line">            <span class="string">//</span> <span class="string">从步骤输出获取提交信息</span></span><br><span class="line">            <span class="string">const</span> <span class="string">commitMsg</span> <span class="string">=</span> <span class="string">`$&#123;&#123;</span> <span class="string">steps.check-trigger.outputs.commit_msg</span> <span class="string">&#125;&#125;`;</span></span><br><span class="line"></span><br><span class="line">            <span class="string">try</span> &#123;</span><br><span class="line">              <span class="string">const</span> <span class="string">repoUrl</span> <span class="string">=</span> <span class="string">`https://x-access-token:$</span>&#123;<span class="string">token</span>&#125;<span class="string">@github.com/$</span>&#123;<span class="string">repo</span>&#125;<span class="string">.git`;</span></span><br><span class="line">              <span class="string">execSync(`git</span> <span class="string">clone</span> <span class="string">$</span>&#123;<span class="string">repoUrl</span>&#125;<span class="string">`</span>, &#123; <span class="attr">stdio:</span> <span class="string">&#x27;inherit&#x27;</span> &#125;<span class="string">);</span></span><br><span class="line">              <span class="string">process.chdir(&#x27;lawtee.github.io&#x27;);</span></span><br><span class="line"></span><br><span class="line">              <span class="string">execSync(&#x27;git</span> <span class="string">config</span> <span class="string">user.name</span> <span class="string">&quot;github-actions[bot]&quot;</span><span class="string">&#x27;, &#123; stdio: &#x27;</span><span class="string">inherit&#x27;</span> &#125;<span class="string">);</span></span><br><span class="line">              <span class="string">execSync(&#x27;git</span> <span class="string">config</span> <span class="string">user.email</span> <span class="string">&quot;41898282+github-actions[bot]@users.noreply.github.com&quot;</span><span class="string">&#x27;, &#123; stdio: &#x27;</span><span class="string">inherit&#x27;</span> <span class="string">&#125;);</span></span><br><span class="line"></span><br><span class="line">              <span class="string">//</span> <span class="string">安全执行空提交</span></span><br><span class="line">              <span class="string">execSync(`git</span> <span class="string">commit</span> <span class="string">--allow-empty</span> <span class="string">-m</span> <span class="string">&quot;$&#123;commitMsg.replace(/&quot;</span><span class="string">/g,</span> <span class="string">&#x27;\\&quot;&#x27;</span><span class="string">)&#125;&quot;`,</span> &#123; <span class="attr">stdio:</span> <span class="string">&#x27;inherit&#x27;</span> &#125;<span class="string">);</span></span><br><span class="line">              <span class="string">execSync(`git</span> <span class="string">push</span> <span class="string">$&#123;repoUrl&#125;</span> <span class="string">master`,</span> &#123; <span class="attr">stdio:</span> <span class="string">&#x27;inherit&#x27;</span> &#125;<span class="string">);</span></span><br><span class="line">              <span class="string">console.log(&#x27;✅</span> <span class="string">Empty</span> <span class="string">commit</span> <span class="string">pushed</span> <span class="string">successfully!&#x27;);</span></span><br><span class="line">            <span class="string">&#125;</span> <span class="string">catch</span> <span class="string">(error)</span> &#123;</span><br><span class="line">              <span class="string">console.error(&#x27;❌</span> <span class="string">Error:&#x27;</span>, <span class="string">error.message);</span></span><br><span class="line">              <span class="string">process.exit(1);</span></span><br><span class="line">            &#125;</span><br></pre></td></tr></table></figure><p>你需要的，是搞个公开的仓库(私有仓库不能使用非远程图片)，然后准备上述的工作流，然后<strong>在 Github 账号设置 <code>Personal access tokens</code> 中添加一个 token , 勾选 <code>repo</code> 权限，复制到说说仓库 <code>secrets and variables - action</code> 中，名称为 <code>PAT</code></strong> 。</p><h2 id="发布说说">发布说说</h2><p>这一步需要的是开启一个issue，然后在这个issue里面不断发布评论来当做<strong>动态</strong>，然后就是把这个issue的链接如<a href="https://github.com/h2dcc/moments/issues/1%E2%80%B8">https://github.com/h2dcc/moments/issues/1</a>，改为类似<a href="https://api.github.com/repos/microsoft/vscode/issues/519/comments%E2%80%B8">https://api.github.com/repos/microsoft/vscode/issues/519/comments</a>，如果你要在前端展示，你需要一个密钥，要有<code>repo</code>权限，你才能正常使用，否则会有较大的限制。关于这个，我觉得要在cloudflare里搞个worker然后再worker的环境变量里添加上面的密钥，大致worker代码如下：</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="comment">// CF Worker 入口</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">fetch</span>(<span class="params">req, env</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handle</span>(req, env);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handle</span>(<span class="params">req, env</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(req.<span class="property">url</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 只代理 /api/comments</span></span><br><span class="line">  <span class="keyword">if</span> (url.<span class="property">pathname</span> !== <span class="string">&#x27;/api/comments&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="string">&#x27;Not Found&#x27;</span>, &#123; <span class="attr">status</span>: <span class="number">404</span> &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> upstream = <span class="string">&#x27;https://api.github.com/repos/microsoft/vscode/issues/519/comments&#x27;</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> res = <span class="keyword">await</span> <span class="title function_">fetch</span>(upstream, &#123;</span><br><span class="line">    <span class="attr">headers</span>: &#123;</span><br><span class="line">      <span class="string">&#x27;Authorization&#x27;</span>: <span class="string">&#x27;token &#x27;</span> + env.<span class="property">GH_TOKEN</span>, <span class="comment">// ✅ 正确读取环境变量</span></span><br><span class="line">      <span class="string">&#x27;User-Agent&#x27;</span>: <span class="string">&#x27;CF-Worker-Giscus-Proxy&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> headers = <span class="keyword">new</span> <span class="title class_">Headers</span>(res.<span class="property">headers</span>);</span><br><span class="line">  headers.<span class="title function_">set</span>(<span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span>, <span class="string">&#x27;*&#x27;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(res.<span class="property">body</span>, &#123;</span><br><span class="line">    <span class="attr">status</span>: res.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">statusText</span>: res.<span class="property">statusText</span>,</span><br><span class="line">    headers</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后再搞个自定义域名，然后在后面加后缀<code>/api/comments</code>，你就能比较不受限制的观看动态了，</p><h2 id="前端">前端</h2><p>接下来就是我自己搞的一个html的简单<a href="https://github.com/zsxsw/github-issues-moments">前端</a>，靠着AI完善了一下，可以参考参考:</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;zh-CN&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;icon&quot;</span> <span class="attr">type</span>=<span class="string">&quot;image/png&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">href</span>=<span class="string">&quot;https://img.314926.xyz/images/2025/09/20/zsx-avatar.webp &quot;</span> </span></span><br><span class="line"><span class="tag">    <span class="attr">sizes</span>=<span class="string">&quot;32x32&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>钟神秀的瞬间<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-pseudo">:root</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--bg</span>: <span class="number">#f5f5f5</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--fg</span>: <span class="number">#333333</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--card</span>: <span class="number">#ffffff</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--link</span>: <span class="number">#576b95</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--border</span>: <span class="number">#e1e1e1</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--avatar-border</span>: <span class="number">#f0f0f0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--time-color</span>: <span class="number">#888888</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--like-color</span>: <span class="number">#ff2442</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--comment-bg</span>: <span class="number">#f7f7f7</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--shadow</span>: <span class="number">0</span> <span class="number">1px</span> <span class="number">3px</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.1</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attr">--active-page-bg</span>: <span class="number">#576b95</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--active-page-fg</span>: <span class="number">#ffffff</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--action-btn-color</span>: <span class="number">#7d7d7d</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--divider-color</span>: <span class="number">#f0f0f0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--header-image-height</span>: <span class="number">180px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--content-max-width</span>: <span class="number">600px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--bg</span>: <span class="number">#1a1a1a</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--fg</span>: <span class="number">#e6e6e6</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--card</span>: <span class="number">#242424</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--link</span>: <span class="number">#7d9fd3</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--border</span>: <span class="number">#3a3a3a</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--avatar-border</span>: <span class="number">#3a3a3a</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--time-color</span>: <span class="number">#a0a0a0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--like-color</span>: <span class="number">#ff5c7a</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--comment-bg</span>: <span class="number">#2d2d2d</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--shadow</span>: <span class="number">0</span> <span class="number">1px</span> <span class="number">3px</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.3</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attr">--active-page-bg</span>: <span class="number">#7d9fd3</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--active-page-fg</span>: <span class="number">#ffffff</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--action-btn-color</span>: <span class="number">#a0a0a0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--divider-color</span>: <span class="number">#3a3a3a</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attr">--header-image-height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        * &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">box-sizing</span>: border-box;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">body</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-family</span>: -apple-system, BlinkMacSystemFont, <span class="string">&quot;Segoe UI&quot;</span>, Helvetica, Arial, sans-serif;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--bg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--fg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">line-height</span>: <span class="number">1.6</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">transition</span>: background .<span class="number">3s</span>, color .<span class="number">3s</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding-bottom</span>: <span class="number">40px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">a</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--link);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">text-decoration</span>: none;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">text-decoration</span>: underline;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">nav</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: space-between;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">12px</span> <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--card);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-bottom</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: sticky;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">top</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">z-index</span>: <span class="number">100</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">box-shadow</span>: <span class="built_in">var</span>(--shadow);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.nav-left</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">gap</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-weight</span>: <span class="number">600</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">18px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.icon</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">fill</span>: currentColor;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#theme-toggle</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: pointer;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: transparent;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--fg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">6px</span> <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">gap</span>: <span class="number">6px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.header-image</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">max-width</span>: <span class="built_in">var</span>(--content-max-width);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="built_in">var</span>(--header-image-height);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">linear-gradient</span>(<span class="number">135deg</span>, <span class="number">#6e8efb</span>, <span class="number">#a777e3</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: relative;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">0</span> auto <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.header-image</span><span class="selector-pseudo">::before</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">content</span>: <span class="string">&quot;&quot;</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">top</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">left</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">bottom</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">&#x27;https://img.314926.xyz/images/2025/09/22/20250922193025414.webp &#x27;</span>) center/cover;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">opacity</span>: <span class="number">0.9</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.header-title</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">left</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">bottom</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: white;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-weight</span>: bold;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">text-shadow</span>: <span class="number">0</span> <span class="number">2px</span> <span class="number">4px</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.3</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">z-index</span>: <span class="number">2</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.header-info</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">bottom</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: white;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">z-index</span>: <span class="number">2</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: pointer;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="keyword">@media</span> (<span class="attribute">max-width</span>: <span class="number">640px</span>) &#123;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.header-image</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">border-radius</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">margin-bottom</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-pseudo">:root</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attr">--header-image-height</span>: <span class="number">160px</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">            <span class="selector-attr">[data-theme=<span class="string">&quot;dark&quot;</span>]</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attr">--header-image-height</span>: <span class="number">180px</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.info-modal</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: none;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: fixed;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">top</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">left</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">bottom</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</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></span><br><span class="line"><span class="language-css">            <span class="attribute">z-index</span>: <span class="number">1000</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.info-content</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--card);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">max-width</span>: <span class="number">80%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">20px</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.15</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: relative;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.close-modal</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">top</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: pointer;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">main</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">max-width</span>: <span class="built_in">var</span>(--content-max-width);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">0</span> auto;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-article</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--card);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-bottom</span>: <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">box-shadow</span>: <span class="built_in">var</span>(--shadow);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.article-header</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">12px</span> <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.avatar</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">40px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">40px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-right</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">2px</span> solid <span class="built_in">var</span>(--avatar-border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">object-fit</span>: cover;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.user-info</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">flex</span>: <span class="number">1</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.user-name</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-weight</span>: <span class="number">500</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-bottom</span>: <span class="number">2px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.post-time</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--time-color);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-content</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">15px</span> <span class="number">15px</span> <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-left</span>: <span class="number">52px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-top</span>: -<span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">line-height</span>: <span class="number">1.5</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-content</span> <span class="selector-tag">p</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-bottom</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-content</span> pre &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--bg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">6px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: auto;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-content</span> <span class="selector-tag">blockquote</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-left</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding-left</span>: <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--fg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">opacity</span>: .<span class="number">8</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--comment-bg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">0</span> <span class="number">6px</span> <span class="number">6px</span> <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">8px</span> <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-content</span> <span class="selector-tag">code</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="built_in">var</span>(--bg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">2px</span> <span class="number">4px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">3px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.moment-content</span> <span class="selector-tag">img</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">max-width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">6px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">8px</span> <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.error</span>, <span class="selector-class">.no-content</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">text-align</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-top</span>: <span class="number">40px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--time-color);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.pagination</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">20px</span> <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">gap</span>: <span class="number">8px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.page-btn</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">6px</span> <span class="number">12px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--card);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--fg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">4px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: pointer;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">14px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">transition</span>: all <span class="number">0.2s</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.page-btn</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--bg);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.page-btn</span><span class="selector-class">.active</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--active-page-bg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--active-page-fg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-color</span>: <span class="built_in">var</span>(--active-page-bg);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.page-btn</span><span class="selector-class">.disabled</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">opacity</span>: <span class="number">0.5</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: not-allowed;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.giscus-container</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">max-width</span>: <span class="built_in">var</span>(--content-max-width);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">30px</span> auto <span class="number">0</span> auto;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.loading</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.loading-spinner</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">24px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">3px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-top-color</span>: <span class="built_in">var</span>(--link);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">animation</span>: spin <span class="number">1s</span> linear infinite;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="keyword">@keyframes</span> spin &#123;</span></span><br><span class="line"><span class="language-css">            <span class="selector-tag">to</span> &#123; <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">360deg</span>); &#125;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="comment">/* 右下角编辑按钮 */</span></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.edit-btn</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: fixed;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">bottom</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">48px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">48px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: <span class="built_in">var</span>(--card);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="built_in">var</span>(--fg);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--border);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">box-shadow</span>: <span class="built_in">var</span>(--shadow);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">align-items</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">justify-content</span>: center;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">font-size</span>: <span class="number">20px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">cursor</span>: pointer;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">transition</span>: all .<span class="number">3s</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">z-index</span>: <span class="number">999</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.edit-btn</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">12px</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">15</span>);</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">        <span class="comment">/* 手机端缩小一点 */</span></span></span><br><span class="line"><span class="language-css">        <span class="keyword">@media</span> (<span class="attribute">max-width</span>: <span class="number">640px</span>) &#123;</span></span><br><span class="line"><span class="language-css">            <span class="selector-class">.edit-btn</span> &#123;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">width</span>: <span class="number">44px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">height</span>: <span class="number">44px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">font-size</span>: <span class="number">18px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">right</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">                <span class="attribute">bottom</span>: <span class="number">16px</span>;</span></span><br><span class="line"><span class="language-css">            &#125;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">nav</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;nav-left&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">svg</span> <span class="attr">class</span>=<span class="string">&quot;icon&quot;</span> <span class="attr">viewBox</span>=<span class="string">&quot;0 0 16 16&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">path</span> <span class="attr">d</span>=<span class="string">&quot;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38</span></span></span><br><span class="line"><span class="string"><span class="tag">                         0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01</span></span></span><br><span class="line"><span class="string"><span class="tag">                         1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95</span></span></span><br><span class="line"><span class="string"><span class="tag">                         0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0</span></span></span><br><span class="line"><span class="string"><span class="tag">                         1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0</span></span></span><br><span class="line"><span class="string"><span class="tag">                         3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8z&quot;</span>/&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">svg</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">span</span>&gt;</span>钟神秀的瞬间<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">button</span> <span class="attr">id</span>=<span class="string">&quot;theme-toggle&quot;</span> <span class="attr">aria-label</span>=<span class="string">&quot;切换主题&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">&quot;theme-icon&quot;</span>&gt;</span>🌙<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">span</span>&gt;</span>切换主题<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">nav</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;header-image&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;header-title&quot;</span>&gt;</span>即刻短文<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;header-info&quot;</span> <span class="attr">id</span>=<span class="string">&quot;info-button&quot;</span>&gt;</span>❗<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;info-modal&quot;</span> <span class="attr">id</span>=<span class="string">&quot;info-modal&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;info-content&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;close-modal&quot;</span> <span class="attr">id</span>=<span class="string">&quot;close-modal&quot;</span>&gt;</span>×<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">h3</span>&gt;</span>钟神秀的瞬间记录<span class="tag">&lt;/<span class="name">h3</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">p</span>&gt;</span>这里收录了我的生活随笔、技术思考和灵感闪现。每一段文字都是时光的切片，记录当下的真实感受。<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">main</span> <span class="attr">id</span>=<span class="string">&quot;main-container&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;loading&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;loading-spinner&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">main</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;pagination-container&quot;</span> <span class="attr">style</span>=<span class="string">&quot;display: none;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;giscus-container&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;https://github.com/zsxsw/github-issues-moments/issues/1&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span> <span class="attr">class</span>=<span class="string">&quot;edit-btn&quot;</span> <span class="attr">title</span>=<span class="string">&quot;添加/编辑说说&quot;</span>&gt;</span>✏️<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://cdn.jsdelivr.net/npm/marked/marked.min.js &quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">/* ---------- 主题切换 + Giscus 重载 ---------- */</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> toggle = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;theme-toggle&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> themeIcon = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;theme-icon&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> html = <span class="variable language_">document</span>.<span class="property">documentElement</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">loadGiscus</span>(<span class="params">theme</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> container = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;.giscus-container&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            container.<span class="property">innerHTML</span> = <span class="string">&#x27;&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> script = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;script&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="property">src</span> = <span class="string">&#x27;https://giscus.app/client.js &#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            script.<span class="property">async</span> = <span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;crossorigin&#x27;</span>, <span class="string">&#x27;anonymous&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-repo&#x27;</span>, <span class="string">&#x27;zsxsw/github-issues-moments&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-repo-id&#x27;</span>, <span class="string">&#x27;R_kgDOP0jWOA&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-category&#x27;</span>, <span class="string">&#x27;Announcements&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-category-id&#x27;</span>, <span class="string">&#x27;DIC_kwDOP0jWOM4Cvv6S&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-mapping&#x27;</span>, <span class="string">&#x27;pathname&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-strict&#x27;</span>, <span class="string">&#x27;0&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-reactions-enabled&#x27;</span>, <span class="string">&#x27;1&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-emit-metadata&#x27;</span>, <span class="string">&#x27;0&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-input-position&#x27;</span>, <span class="string">&#x27;top&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-lang&#x27;</span>, <span class="string">&#x27;zh-CN&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            script.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>, theme);</span></span><br><span class="line"><span class="language-javascript">            container.<span class="title function_">appendChild</span>(script);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        (<span class="keyword">function</span> <span class="title function_">initTheme</span>(<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> saved = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="string">&#x27;theme&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> preferDark = <span class="variable language_">window</span>.<span class="title function_">matchMedia</span>(<span class="string">&#x27;(prefers-color-scheme: dark)&#x27;</span>).<span class="property">matches</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> initialTheme = (saved === <span class="string">&#x27;dark&#x27;</span> || (!saved &amp;&amp; preferDark)) ? <span class="string">&#x27;dark&#x27;</span> : <span class="string">&#x27;light&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            html.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>, initialTheme);</span></span><br><span class="line"><span class="language-javascript">            themeIcon.<span class="property">textContent</span> = initialTheme === <span class="string">&#x27;dark&#x27;</span> ? <span class="string">&#x27;☀️&#x27;</span> : <span class="string">&#x27;🌙&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">loadGiscus</span>(initialTheme);</span></span><br><span class="line"><span class="language-javascript">        &#125;)();</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        toggle.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> current = html.<span class="title function_">getAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> next = current === <span class="string">&#x27;dark&#x27;</span> ? <span class="string">&#x27;light&#x27;</span> : <span class="string">&#x27;dark&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            html.<span class="title function_">setAttribute</span>(<span class="string">&#x27;data-theme&#x27;</span>, next);</span></span><br><span class="line"><span class="language-javascript">            <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="string">&#x27;theme&#x27;</span>, next);</span></span><br><span class="line"><span class="language-javascript">            themeIcon.<span class="property">textContent</span> = next === <span class="string">&#x27;dark&#x27;</span> ? <span class="string">&#x27;☀️&#x27;</span> : <span class="string">&#x27;🌙&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">loadGiscus</span>(next);</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">/* ---------- 信息模态框 ---------- */</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> infoButton = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;info-button&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> infoModal = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;info-modal&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> closeModal = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;close-modal&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        infoButton.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="function">() =&gt;</span> infoModal.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;flex&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        closeModal.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="function">() =&gt;</span> infoModal.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        infoModal.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="function"><span class="params">e</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (e.<span class="property">target</span> === infoModal) infoModal.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="comment">/* ---------- 数据加载 &amp; 分页 ---------- */</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> container = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;main-container&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> paginationContainer = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;pagination-container&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> url = <span class="string">&#x27;https://example.com/api/comments &#x27;</span>; <span class="comment">/* 替换为你的 API URL */</span></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> allComments = [];</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">let</span> currentPage = <span class="number">1</span>;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> itemsPerPage = <span class="number">10</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">const</span> headers = <span class="keyword">new</span> <span class="title class_">Headers</span>();</span></span><br><span class="line"><span class="language-javascript">        headers.<span class="title function_">append</span>(<span class="string">&#x27;Accept&#x27;</span>, <span class="string">&#x27;application/vnd.github.v3+json&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">        headers.<span class="title function_">append</span>(<span class="string">&#x27;User-Agent&#x27;</span>, <span class="string">&#x27;Hugo Static Site Generator&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="title function_">fetch</span>(url, &#123; headers &#125;)</span></span><br><span class="line"><span class="language-javascript">            .<span class="title function_">then</span>(<span class="function"><span class="params">r</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">if</span> (!r.<span class="property">ok</span>) <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">&#x27;网络错误 &#x27;</span> + r.<span class="property">status</span>);</span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">return</span> r.<span class="title function_">json</span>();</span></span><br><span class="line"><span class="language-javascript">            &#125;)</span></span><br><span class="line"><span class="language-javascript">            .<span class="title function_">then</span>(<span class="function"><span class="params">list</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">if</span> (!<span class="title class_">Array</span>.<span class="title function_">isArray</span>(list) || list.<span class="property">length</span> === <span class="number">0</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                    container.<span class="property">innerHTML</span> = <span class="string">&#x27;&lt;p class=&quot;no-content&quot;&gt;暂无动态&lt;/p&gt;&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">                    <span class="keyword">return</span>;</span></span><br><span class="line"><span class="language-javascript">                &#125;</span></span><br><span class="line"><span class="language-javascript">                allComments = list.<span class="title function_">reverse</span>();</span></span><br><span class="line"><span class="language-javascript">                <span class="title function_">initPagination</span>(allComments.<span class="property">length</span>);</span></span><br><span class="line"><span class="language-javascript">                <span class="title function_">displayPage</span>(<span class="number">1</span>);</span></span><br><span class="line"><span class="language-javascript">            &#125;)</span></span><br><span class="line"><span class="language-javascript">            .<span class="title function_">catch</span>(<span class="function"><span class="params">err</span> =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">                container.<span class="property">innerHTML</span> = <span class="string">`&lt;p class=&quot;error&quot;&gt;⚠️ 无法获取动态：<span class="subst">$&#123;err.message&#125;</span>&lt;/p&gt;`</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">initPagination</span>(<span class="params">totalItems</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> totalPages = <span class="title class_">Math</span>.<span class="title function_">ceil</span>(totalItems / itemsPerPage);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (totalPages &lt;= <span class="number">1</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">                paginationContainer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">                <span class="keyword">return</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">let</span> html = <span class="string">`</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                &lt;div class=&quot;pagination&quot;&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                    &lt;button class=&quot;page-btn prev-btn&quot; onclick=&quot;changePage(<span class="subst">$&#123;currentPage - <span class="number">1</span>&#125;</span>)&quot; <span class="subst">$&#123;currentPage === <span class="number">1</span> ? <span class="string">&#x27;disabled&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;上一页&lt;/button&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">            `</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> max = <span class="number">5</span>, half = <span class="title class_">Math</span>.<span class="title function_">floor</span>(max / <span class="number">2</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">let</span> start, end;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (totalPages &lt;= max) &#123; start = <span class="number">1</span>; end = totalPages; &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">else</span> <span class="keyword">if</span> (currentPage &lt;= half + <span class="number">1</span>) &#123; start = <span class="number">1</span>; end = max; &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">else</span> <span class="keyword">if</span> (currentPage &gt;= totalPages - half) &#123; start = totalPages - max + <span class="number">1</span>; end = totalPages; &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">else</span> &#123; start = currentPage - half; end = currentPage + half; &#125;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">for</span> (<span class="keyword">let</span> i = start; i &lt;= end; i++) &#123;</span></span><br><span class="line"><span class="language-javascript">                html += <span class="string">`&lt;button class=&quot;page-btn <span class="subst">$&#123;i === currentPage ? <span class="string">&#x27;active&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&quot; onclick=&quot;changePage(<span class="subst">$&#123;i&#125;</span>)&quot;&gt;<span class="subst">$&#123;i&#125;</span>&lt;/button&gt;`</span>;</span></span><br><span class="line"><span class="language-javascript">            &#125;</span></span><br><span class="line"><span class="language-javascript">            html += <span class="string">`&lt;button class=&quot;page-btn next-btn&quot; onclick=&quot;changePage(<span class="subst">$&#123;currentPage + <span class="number">1</span>&#125;</span>)&quot; <span class="subst">$&#123;currentPage === totalPages ? <span class="string">&#x27;disabled&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;下一页&lt;/button&gt;&lt;/div&gt;`</span>;</span></span><br><span class="line"><span class="language-javascript">            paginationContainer.<span class="property">innerHTML</span> = html;</span></span><br><span class="line"><span class="language-javascript">            paginationContainer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;block&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">displayPage</span>(<span class="params">page</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> start = (page - <span class="number">1</span>) * itemsPerPage, end = <span class="title class_">Math</span>.<span class="title function_">min</span>(start + itemsPerPage, allComments.<span class="property">length</span>);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> html = allComments.<span class="title function_">slice</span>(start, end).<span class="title function_">map</span>(<span class="function"><span class="params">c</span> =&gt;</span> <span class="string">`</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                &lt;article class=&quot;moment-article&quot;&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                    &lt;header class=&quot;article-header&quot;&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                        &lt;img class=&quot;avatar&quot; src=&quot;<span class="subst">$&#123;c.user.avatar_url&#125;</span>&quot; alt=&quot;<span class="subst">$&#123;c.user.login&#125;</span>&quot; onerror=&quot;this.src=&#x27;https://avatars.githubusercontent.com/u/0?s=80&amp;v=4 &#x27;&quot;&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                        &lt;div class=&quot;user-info&quot;&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                            &lt;div class=&quot;user-name&quot;&gt;钟神秀@zsxsw&lt;/div&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                            &lt;div class=&quot;post-time&quot;&gt;<span class="subst">$&#123;formatTime(c.created_at)&#125;</span>&lt;/div&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                        &lt;/div&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                    &lt;/header&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                    &lt;section class=&quot;moment-content&quot;&gt;<span class="subst">$&#123;marked.parse(c.body)&#125;</span>&lt;/section&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">                &lt;/article&gt;</span></span></span><br><span class="line"><span class="string"><span class="language-javascript">            `</span>).<span class="title function_">join</span>(<span class="string">&#x27;&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">            container.<span class="property">innerHTML</span> = <span class="string">`&lt;div class=&quot;moments-feed&quot;&gt;<span class="subst">$&#123;html&#125;</span>&lt;/div&gt;`</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="variable language_">window</span>.<span class="title function_">scrollTo</span>(&#123; <span class="attr">top</span>: <span class="number">0</span>, <span class="attr">behavior</span>: <span class="string">&#x27;smooth&#x27;</span> &#125;);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="variable language_">window</span>.<span class="property">changePage</span> = <span class="keyword">function</span> (<span class="params">page</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> total = <span class="title class_">Math</span>.<span class="title function_">ceil</span>(allComments.<span class="property">length</span> / itemsPerPage);</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (page &lt; <span class="number">1</span> || page &gt; total || page === currentPage) <span class="keyword">return</span>;</span></span><br><span class="line"><span class="language-javascript">            currentPage = page;</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">displayPage</span>(page);</span></span><br><span class="line"><span class="language-javascript">            <span class="title function_">initPagination</span>(allComments.<span class="property">length</span>);</span></span><br><span class="line"><span class="language-javascript">        &#125;;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">function</span> <span class="title function_">formatTime</span>(<span class="params">dateStr</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">const</span> date = <span class="keyword">new</span> <span class="title class_">Date</span>(dateStr), now = <span class="keyword">new</span> <span class="title class_">Date</span>(), diff = (now - date) / <span class="number">1000</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (diff &lt; <span class="number">60</span>) <span class="keyword">return</span> <span class="string">&#x27;刚刚&#x27;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (diff &lt; <span class="number">3600</span>) <span class="keyword">return</span> <span class="string">`<span class="subst">$&#123;<span class="built_in">Math</span>.floor(diff / <span class="number">60</span>)&#125;</span>分钟前`</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (diff &lt; <span class="number">86400</span>) <span class="keyword">return</span> <span class="string">`<span class="subst">$&#123;<span class="built_in">Math</span>.floor(diff / <span class="number">3600</span>)&#125;</span>小时前`</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">if</span> (diff &lt; <span class="number">2592000</span>) <span class="keyword">return</span> <span class="string">`<span class="subst">$&#123;<span class="built_in">Math</span>.floor(diff / <span class="number">86400</span>)&#125;</span>天前`</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="keyword">return</span> date.<span class="title function_">toLocaleString</span>(<span class="string">&#x27;zh-CN&#x27;</span>, &#123; <span class="attr">year</span>: <span class="string">&#x27;numeric&#x27;</span>, <span class="attr">month</span>: <span class="string">&#x27;2-digit&#x27;</span>, <span class="attr">day</span>: <span class="string">&#x27;2-digit&#x27;</span>, <span class="attr">hour</span>: <span class="string">&#x27;2-digit&#x27;</span>, <span class="attr">minute</span>: <span class="string">&#x27;2-digit&#x27;</span>, <span class="attr">hour12</span>: <span class="literal">false</span> &#125;);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>大致就是这样了，以上就是我肤浅的理解，希望能帮到你~</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;起源于在不同博客游览间，看到了一篇&lt;a href=&quot;https://lawtee.com/article/add-live-talking-page-for-static-blog/&quot;&gt;文章&lt;/a&gt;，感觉很有搞头，然后到了博主的&lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="说说" scheme="https://myboke.kemiaosw.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
    <category term="GitHub" scheme="https://myboke.kemiaosw.top/tags/GitHub/"/>
    
    <category term="Issues" scheme="https://myboke.kemiaosw.top/tags/Issues/"/>
    
  </entry>
  
  <entry>
    <title>hexo备忘</title>
    <link href="https://myboke.kemiaosw.top/posts/b405d89f.html"/>
    <id>https://myboke.kemiaosw.top/posts/b405d89f.html</id>
    <published>2025-08-20T07:08:02.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<h1>Hexo 备忘</h1><h2 id="我的配置">我的配置</h2><ol><li><strong>Hexo 版本</strong>: hexo-cli: 4.3.2, hexo: 7.3.0(当前最新)</li><li><strong>Node.js 版本</strong>: 22.16.0</li><li><strong>Git 版本</strong>: 2.47.0.sindows.2</li><li><strong>PNPM 版本</strong>: 10.12.4</li><li><strong>Windows 版本</strong>: 11</li></ol><h2 id="安装-Node-js">安装 Node.js</h2><ol><li><p>在 <a href="https://nodejs.org/en/download/">官网</a> 安装 LTS 版本，电脑一般来说内存足够直接在 C 盘即可，当然，换路径也可以，我反正正常下载换路径，没什么问题。</p></li><li><p>安装完成后，检查是否安装成功。在键盘按下 <kbd> win </kbd> + <kbd> R </kbd> 键，输入 <code>CMD</code>，然后回车，打开 CMD 窗口，执行 <code>node -v</code> 命令，看到版本信息，则说明安装成功。</p></li></ol><h2 id="安装-Git">安装 Git</h2><p>在 <a href="https://git-scm.com/download/win">官网</a> 安装最新版本的 <code>64-bit Git for Windows Setup</code> 安装包。</p><p>安装完成后，在命令行输入 <code>git --version</code>，如果显示版本号，则说明安装成功。</p><h3 id="常用命令">常用命令</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git config -l  //查看所有配置</span><br><span class="line">git config --system --list //查看系统配置</span><br><span class="line">git config --global --list //查看用户（全局）配置</span><br></pre></td></tr></table></figure><h3 id="配置-Git-用户名和邮箱">配置 Git 用户名和邮箱</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git config --global user.name <span class="string">&quot;你的用户名&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;你的邮箱&quot;</span></span><br></pre></td></tr></table></figure><h2 id="安装-包管理器">安装 包管理器</h2><p>安装 npm 为一切的基石，一般来说，你安装了 node，也相当于你安装了 npm，通过一下命令来验证：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm -v</span><br><span class="line">node -v</span><br></pre></td></tr></table></figure><p><strong>修改 npm 源</strong>。npm 下载各种模块，默认是从国外服务器下载，速度较慢，建议配置成淘宝镜像。打开 CMD 窗口，运行如下命令:</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> registry https://registry.npm.taobao.org</span><br></pre></td></tr></table></figure><h3 id="安装-pnpm">安装 pnpm</h3><p>pnpm 是一个快速、节省磁盘空间的包管理器，类似于 npm 和 yarn。安装 pnpm 可以通过以下命令：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install -g pnpm</span><br></pre></td></tr></table></figure><p>为什么选择 pnpm？因为它的安装速度快，依赖管理更高效，且相对于 npm，我使用 npm 容易失败且慢，pnpm 给我的体验更好。</p><h2 id="安装-Hexo">安装 Hexo</h2><ol><li>在 Git BASH 输入如下命令安装 Hexo：</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm install -g hexo-cli</span><br></pre></td></tr></table></figure><ol start="2"><li>安装完后输入 <code>hexo -v</code> 验证是否安装成功。</li></ol><hr><h2 id="a-id-github-config-a-Github配置"><a id="github-config"></a>Github配置</h2><blockquote><p>上述操作是前提，接下来是配置 Github。</p></blockquote><p>注册 github 就不说了，很基础的东西，连我个代码小白都懂就不多说了。</p><h3 id="创建仓库">创建仓库</h3><ol><li>登录 GitHub，点击右上角的 <code>+</code> 号，选择 <code>New repository</code>。</li><li>填写仓库名称，建议使用 <code>&lt;username&gt;.github.io</code> 格式（例如：<code>yourusername.github.io</code>），这样可以直接作为个人主页。</li></ol><p>这里我不准备直接使用常规的 <code>hexo deploy</code> 命令来部署到 GitHub Pages，因为当你的文章一多，生成时间就会繁琐，这里的建议是使用 <code>Github Actions</code> 来自动部署。</p><blockquote><p>这一部分的教程是源于 <a href="https://akilar.top/posts/f752c86d/">店长的文章</a>，但是有点老旧了，于是我做了点更改（这里的图片来源于 <a href="https://blog.anheyu.com/posts/asdx.html">安知鱼</a>）：</p></blockquote><ol><li>首先要创建一个放置源码的私有仓库，以下称之为 <code>hexo-source</code>，</li><li>然后要生成一个 Github 密钥：</li></ol><blockquote><p>访问 Github-&gt; 头像（右上角）-&gt; Settings-&gt; Developer Settings-&gt; Personal access tokens-&gt; generate new token, 创建的 Token 名称随意，但必须勾选 repo 项 和 workflows 项。</p></blockquote><p>点击 <a href="https://github.com/settings/tokens">链接</a> 前往生成</p><p><img src="https://img.314926.xyz/images/2025/08/17/jiaoxue1.webp" alt=""><br><img src="https://img.314926.xyz/images/2025/08/17/jiaoxue2.webp" alt=""></p><div class="note info"><i class="solitude fas fa-circle-exclamation"></i><blockquote><p>!!! token 只会显示这一次，之后将无法查看，所以务必保证你已经记录下了 Token。之后如果忘记了就只能重新生成重新配置了。</p></blockquote></div><ol start="3"><li>在 <code>hexo-source</code> 仓库中的设置里点击设置 -&gt; action -&gt; General -&gt; 工作流程权限<ul><li>勾选 <code>Read and write permissions</code>，并且勾选 <code>Allow &lt;span style=&quot;background:#FF0000;&quot;&gt;&lt;/span&gt;all actions and reusable workflows</code>。</li></ul></li><li>在设置里 -&gt; Secrets and variables -&gt; Actions -&gt; New repository secret 添加</li></ol><ul><li><code>GITHUBTOKEN</code>：放置你刚才生成的 Token。</li></ul><hr><h2 id="上述是前置条件，接下来要先部署-hexo，你才好继续下一步。">上述是前置条件，接下来要先部署 hexo，你才好继续下一步。</h2><h2 id="初始化-Hexo">初始化 Hexo</h2><ol><li>在本地新建一个文件夹，例如 <code>hexo-solitude</code>。</li><li>这里我是用的是 vscode 打开该文件夹，然后在终端输入以下命令来初始化 Hexo：</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo init (项目名称)</span><br></pre></td></tr></table></figure><p>我一般都不填，直接在文件下下就可以开始，如果你添加了项目名称，那么下一步就是：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> (项目名称)</span><br></pre></td></tr></table></figure><ol start="3"><li>安装依赖包：</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm install</span><br></pre></td></tr></table></figure><p>然后就是选择你想要的主题，这里我使用的是<a href="https://solitude.js.org/cn/getting-started/installation">Solitude</a>，具体的配置不细讲，我只讲一部分：</p><p>首先就是基本的安装，这里还是选择<code>git clone</code>没有别的原因，主要还是会改点源码，不想改的直接pnpm下载即可：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">// git安装</span><br><span class="line">git clone -b dev https://github.com/everfu/hexo-theme-solitude.git themes/solitude</span><br><span class="line"></span><br><span class="line">// pnpm 安装</span><br><span class="line">pnpm i hexo-theme-solitude</span><br></pre></td></tr></table></figure><p>然后在<code>_config.yml</code>里修改成：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">theme:</span> <span class="string">solitude</span></span><br></pre></td></tr></table></figure><h2 id="配置">配置</h2><p>下列代码是我的备忘：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Hexo Configuration</span></span><br><span class="line"><span class="comment">## Docs: https://hexo.io/docs/configuration.html</span></span><br><span class="line"><span class="comment">## Source: https://github.com/hexojs/hexo/</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Site</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">喵落阁</span></span><br><span class="line"><span class="attr">subtitle:</span> <span class="string">&#x27;克喵的博客&#x27;</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">&#x27;愿你看清一切真相后，依旧热爱你的家人和朋友。&#x27;</span></span><br><span class="line"><span class="attr">keywords:</span> <span class="string">克喵,kemiao,博客</span></span><br><span class="line"><span class="attr">author:</span> <span class="string">克喵爱吃卤面</span></span><br><span class="line"><span class="attr">language:</span> <span class="string">zh-CN</span></span><br><span class="line"><span class="attr">timezone:</span> <span class="string">&#x27;Asia/Shanghai&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># URL</span></span><br><span class="line"><span class="comment">## Set your site url here. For example, if you use GitHub Page, set url as &#x27;https://username.github.io/project&#x27;</span></span><br><span class="line"><span class="attr">url:</span> <span class="comment"># 填网站地址</span></span><br><span class="line"><span class="attr">permalink:</span> <span class="string">posts/:abbrlink.html</span></span><br><span class="line"><span class="attr">permalink_defaults:</span></span><br><span class="line"><span class="attr">pretty_urls:</span></span><br><span class="line">  <span class="attr">trailing_index:</span> <span class="literal">true</span> <span class="comment"># Set to false to remove trailing &#x27;index.html&#x27; from permalinks</span></span><br><span class="line">  <span class="attr">trailing_html:</span> <span class="literal">true</span> <span class="comment"># Set to false to remove trailing &#x27;.html&#x27; from permalinks</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Directory</span></span><br><span class="line"><span class="attr">source_dir:</span> <span class="string">source</span></span><br><span class="line"><span class="attr">public_dir:</span> <span class="string">public</span></span><br><span class="line"><span class="attr">tag_dir:</span> <span class="string">tags</span></span><br><span class="line"><span class="attr">archive_dir:</span> <span class="string">archives</span></span><br><span class="line"><span class="attr">category_dir:</span> <span class="string">categories</span></span><br><span class="line"><span class="attr">code_dir:</span> <span class="string">downloads/code</span></span><br><span class="line"><span class="attr">i18n_dir:</span> <span class="string">:lang</span></span><br><span class="line"><span class="attr">skip_render:</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Writing</span></span><br><span class="line"><span class="attr">new_post_name:</span> <span class="string">:title.md</span> <span class="comment"># File name of new posts</span></span><br><span class="line"><span class="attr">default_layout:</span> <span class="string">post</span></span><br><span class="line"><span class="attr">titlecase:</span> <span class="literal">false</span> <span class="comment"># Transform title into titlecase</span></span><br><span class="line"><span class="attr">external_link:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># Open external links in new tab</span></span><br><span class="line">  <span class="attr">field:</span> <span class="string">site</span> <span class="comment"># Apply to the whole site</span></span><br><span class="line">  <span class="attr">exclude:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line"><span class="attr">filename_case:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">render_drafts:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">post_asset_folder:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">relative_link:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">future:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">syntax_highlighter:</span> <span class="string">highlight.js</span></span><br><span class="line"><span class="attr">highlight:</span></span><br><span class="line">  <span class="attr">line_number:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">auto_detect:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">tab_replace:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">  <span class="attr">wrap:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">hljs:</span> <span class="literal">false</span></span><br><span class="line"><span class="attr">prismjs:</span></span><br><span class="line">  <span class="attr">preprocess:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">line_number:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">tab_replace:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Home page setting</span></span><br><span class="line"><span class="comment"># path: Root path for your blogs index page. (default = &#x27;&#x27;)</span></span><br><span class="line"><span class="comment"># per_page: Posts displayed per page. (0 = disable pagination)</span></span><br><span class="line"><span class="comment"># order_by: Posts order. (Order by date descending by default)</span></span><br><span class="line"><span class="attr">index_generator:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">  <span class="attr">per_page:</span> <span class="number">10</span></span><br><span class="line">  <span class="attr">order_by:</span> <span class="string">-date</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Category &amp; Tag</span></span><br><span class="line"><span class="attr">default_category:</span> <span class="string">uncategorized</span></span><br><span class="line"><span class="attr">category_map:</span></span><br><span class="line"><span class="attr">tag_map:</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Metadata elements</span></span><br><span class="line"><span class="comment">## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta</span></span><br><span class="line"><span class="attr">meta_generator:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Date / Time format</span></span><br><span class="line"><span class="comment">## Hexo uses Moment.js to parse and display date</span></span><br><span class="line"><span class="comment">## You can customize the date format as defined in</span></span><br><span class="line"><span class="comment">## http://momentjs.com/docs/#/displaying/format/</span></span><br><span class="line"><span class="attr">date_format:</span> <span class="string">YYYY-MM-DD</span></span><br><span class="line"><span class="attr">time_format:</span> <span class="string">HH:mm:ss</span></span><br><span class="line"><span class="comment">## updated_option supports &#x27;mtime&#x27;, &#x27;date&#x27;, &#x27;empty&#x27;</span></span><br><span class="line"><span class="attr">updated_option:</span> <span class="string">&#x27;mtime&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Pagination</span></span><br><span class="line"><span class="comment">## Set per_page to 0 to disable pagination</span></span><br><span class="line"><span class="attr">per_page:</span> <span class="number">10</span></span><br><span class="line"><span class="attr">pagination_dir:</span> <span class="string">page</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Include / Exclude file(s)</span></span><br><span class="line"><span class="comment">## include:/exclude: options only apply to the &#x27;source/&#x27; folder</span></span><br><span class="line"><span class="attr">include:</span> []</span><br><span class="line"><span class="attr">exclude:</span> []</span><br><span class="line"><span class="attr">ignore:</span> []</span><br><span class="line"></span><br><span class="line"><span class="comment"># Extensions</span></span><br><span class="line"><span class="comment">## Plugins: https://hexo.io/plugins/</span></span><br><span class="line"><span class="comment">## Themes: https://hexo.io/themes/</span></span><br><span class="line"><span class="attr">theme:</span> <span class="string">solitude</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Deployment</span></span><br><span class="line"><span class="comment">## Docs: https://hexo.io/docs/one-command-deployment</span></span><br><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">git@github.com-xx:kemiaofxjun/kemiaofxjun.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># RSS Feed 配置</span></span><br><span class="line"><span class="attr">feed:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">atom</span>          <span class="comment"># 生成 atom.xml</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">atom.xml</span>      <span class="comment"># 输出文件名</span></span><br><span class="line">  <span class="attr">limit:</span> <span class="number">20</span>           <span class="comment"># 最多显示文章数 (0=全部)</span></span><br><span class="line">  <span class="attr">hub:</span>                <span class="comment"># PubSubHubbub 中心 (可选)</span></span><br><span class="line">  <span class="attr">content:</span> <span class="literal">true</span>       <span class="comment"># 是否包含全文内容 (true=是, false=仅摘要)</span></span><br><span class="line">  <span class="attr">content_limit:</span> <span class="number">140</span>  <span class="comment"># 摘要长度（当 content=false 时生效）</span></span><br><span class="line">  <span class="attr">content_limit_delim:</span> <span class="string">&#x27; &#x27;</span>  <span class="comment"># 截断分隔符</span></span><br><span class="line">  <span class="attr">order_by:</span> <span class="string">-date</span>     <span class="comment"># 按日期倒序排列</span></span><br><span class="line">  <span class="attr">autodiscovery:</span> <span class="literal">true</span> <span class="comment"># 在 HTML 头部添加自动发现标签</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 数学公式渲染配置</span></span><br><span class="line"><span class="attr">markdown:</span></span><br><span class="line">  <span class="attr">preset:</span> <span class="string">&#x27;default&#x27;</span> <span class="comment"># 使用的 MD 语法，默认使用的 GFM</span></span><br><span class="line">  <span class="attr">render:</span></span><br><span class="line">    <span class="attr">html:</span> <span class="literal">true</span> <span class="comment"># 渲染 html</span></span><br><span class="line">    <span class="attr">xhtmlOut:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">langPrefix:</span> <span class="string">&#x27;language-&#x27;</span> <span class="comment"># 在代码块的类名中添加前缀（指定语言时）。</span></span><br><span class="line">    <span class="attr">breaks:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">linkify:</span> <span class="literal">true</span> <span class="comment"># 如果你写了一个链接而不是 [name](link) 方式，会自动识别为链接并渲染。</span></span><br><span class="line">    <span class="attr">typographer:</span> <span class="literal">true</span> <span class="comment"># 将替换常见的印刷元素。</span></span><br><span class="line">    <span class="attr">quotes:</span> <span class="string">&#x27;“”‘’&#x27;</span> <span class="comment"># 替换文章张的 &quot;&quot; &#x27;&#x27; 号</span></span><br><span class="line">  <span class="attr">enable_rules:</span></span><br><span class="line">  <span class="attr">disable_rules:</span></span><br><span class="line">  <span class="attr">plugins:</span> <span class="comment"># 使用插件</span></span><br><span class="line">  <span class="attr">anchors:</span></span><br><span class="line">    <span class="attr">level:</span> <span class="number">2</span> <span class="comment"># 渲染标题的级别（h1,h2,h3）</span></span><br><span class="line">    <span class="attr">collisionSuffix:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="attr">permalink:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">permalinkClass:</span> <span class="string">&#x27;headerlink&#x27;</span></span><br><span class="line">    <span class="attr">permalinkSide:</span> <span class="string">&#x27;left&#x27;</span></span><br><span class="line">    <span class="attr">permalinkSymbol:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="attr">case:</span> <span class="number">0</span></span><br><span class="line">    <span class="attr">separator:</span> <span class="string">&#x27;-&#x27;</span></span><br><span class="line">  <span class="attr">images:</span> <span class="comment"># 图片的一些编译</span></span><br><span class="line">    <span class="attr">lazyload:</span> <span class="literal">true</span> <span class="comment"># 是否需要渲染 lazyload</span></span><br><span class="line">    <span class="attr">prepend_root:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">post_asset:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">inline:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"><span class="attr">swpp:</span></span><br><span class="line">  <span class="comment"># 是否启用插件</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 是否在发布前自动执行脚本</span></span><br><span class="line">  <span class="attr">auto_exec:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">gen_dom:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 文章链接转数字或字母：https://github.com/rozbo/hexo-abbrlink</span></span><br><span class="line"><span class="attr">abbrlink:</span></span><br><span class="line">    <span class="attr">alg:</span> <span class="string">crc16</span>   <span class="comment">#算法： crc16(default) and crc32</span></span><br><span class="line">    <span class="attr">rep:</span> <span class="string">hex</span>     <span class="comment">#进制： dec(default) and hex: dec #输出进制：十进制和十六进制，默认为10进制。丨dec为十进制，hex</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># https://github.com/hexojs/hexo-generator-sitemap</span></span><br><span class="line"><span class="attr">sitemap:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">sitemap.xml</span></span><br><span class="line">  <span class="attr">rel:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">tags:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">categories:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="attr">algolia:</span></span><br><span class="line">  <span class="attr">appId:</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="attr">apiKey:</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="attr">adminApiKey:</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="attr">chunkSize:</span> <span class="number">5000</span></span><br><span class="line">  <span class="attr">indexName:</span> <span class="string">&quot;index-name&quot;</span></span><br><span class="line">  <span class="attr">fields:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">content:strip:truncate,0,500</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">excerpt:strip</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">gallery</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">permalink</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">photos</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">slug</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">tags</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">title</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># hexo-safego安全跳转插件</span></span><br><span class="line"><span class="comment"># see https://blog.liushen.fun/posts/1dfd1f41/</span></span><br><span class="line"><span class="attr">hexo_safego:</span></span><br><span class="line">  <span class="comment"># 基本功能设置</span></span><br><span class="line">  <span class="attr">general:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span>                <span class="comment"># 启用插件</span></span><br><span class="line">    <span class="attr">enable_base64_encode:</span> <span class="literal">true</span>  <span class="comment"># 使用 Base64 编码</span></span><br><span class="line">    <span class="attr">enable_target_blank:</span> <span class="literal">true</span>   <span class="comment"># 从新窗口打开跳转页面</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 安全设置</span></span><br><span class="line">  <span class="attr">security:</span></span><br><span class="line">    <span class="attr">url_param_name:</span> <span class="string">&#x27;u&#x27;</span>         <span class="comment"># URL 参数名</span></span><br><span class="line">    <span class="attr">html_file_name:</span> <span class="string">&#x27;go.html&#x27;</span>   <span class="comment"># 重定向页面的文件名</span></span><br><span class="line">    <span class="attr">ignore_attrs:</span>               <span class="comment"># 忽略处理的 HTML 结构</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;data-fancybox&#x27;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 容器与页面设置</span></span><br><span class="line">  <span class="attr">scope:</span></span><br><span class="line">    <span class="attr">apply_containers:</span>           <span class="comment"># 应用的容器选择器</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;#article-container&#x27;</span></span><br><span class="line">    <span class="attr">apply_pages:</span>                <span class="comment"># 应用的页面路径</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/posts/&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/devices/&quot;</span></span><br><span class="line">    <span class="attr">exclude_pages:</span>              <span class="comment"># 排除的页面路径</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 域名白名单</span></span><br><span class="line">  <span class="attr">whitelist:</span></span><br><span class="line">    <span class="attr">domain_whitelist:</span>           <span class="comment"># 允许的白名单域名，通过字符串匹配实现</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;kemeow.top&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;kemiaosw.top&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;050815.xyz&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;314926.xyz&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;051531.xyz&quot;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 页面外观设置</span></span><br><span class="line">  <span class="attr">appearance:</span></span><br><span class="line">    <span class="attr">avatar:</span> <span class="string">https://img.314926.xyz/images/2025/08/13/no-background-kemiaofxjun.webp</span>   <span class="comment"># 跳转页面头像路径</span></span><br><span class="line">    <span class="attr">title:</span> <span class="string">&quot;喵洛阁&quot;</span>            <span class="comment"># 跳转页面标题</span></span><br><span class="line">    <span class="attr">subtitle:</span> <span class="string">&quot;安全中心&quot;</span>         <span class="comment"># 跳转页面副标题</span></span><br><span class="line">    <span class="attr">darkmode:</span> <span class="string">auto</span>              <span class="comment"># 是否启用深色模式</span></span><br><span class="line">    <span class="attr">countdowntime:</span> <span class="number">4</span>            <span class="comment"># 跳转页面倒计时秒数，如果设置为负数则为不自动跳转</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 调试设置</span></span><br><span class="line">  <span class="attr">debug:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span>               <span class="comment"># 启用调试模式</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 追番插件</span></span><br><span class="line"><span class="comment"># https://github.com/HCLonely/hexo-bilibili-bangumi</span></span><br><span class="line"><span class="attr">bangumi:</span> <span class="comment"># 追番设置</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">source:</span> <span class="string">bili</span></span><br><span class="line">  <span class="attr">path:</span> </span><br><span class="line">  <span class="attr">vmid:</span> <span class="number">3546643173477234</span></span><br><span class="line">  <span class="attr">title:</span> <span class="string">&quot;追番列表&quot;</span></span><br><span class="line">  <span class="attr">quote:</span> <span class="string">&quot;生命不息，追番不止！&quot;</span></span><br><span class="line">  <span class="attr">show:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">lazyload:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">loading:</span></span><br><span class="line">  <span class="attr">showMyComment:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">pagination:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">extra_options:</span></span><br><span class="line">    <span class="attr">top_img:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">lazyload:</span></span><br><span class="line">      <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>博客的其他修改基本就是来自教程和一些博主的网站。</p><hr><h2 id="插件">插件</h2><ol><li><strong>基础依赖</strong> <code>hexo-renderer-pug</code></li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-renderer-pug</span><br></pre></td></tr></table></figure><hr><ol start="2"><li><strong>字数统计</strong> <code>hexo-wordcount</code></li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-wordcount</span><br></pre></td></tr></table></figure><p>配置里修改：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># --------------------------- start ---------------------------</span></span><br><span class="line"><span class="comment"># Word count</span></span><br><span class="line"><span class="comment"># 字数统计</span></span><br><span class="line"><span class="comment"># warning: Please install the hexo-wordcount plugin first.</span></span><br><span class="line"><span class="comment"># 警告: 请先安装 hexo-wordcount 插件。</span></span><br><span class="line"><span class="attr">wordcount:</span> <span class="literal">false</span></span><br><span class="line"><span class="comment"># --------------------------- end ---------------------------</span></span><br></pre></td></tr></table></figure><hr><ol start="3"><li><strong>数学公式</strong> 卸载 <code>hexo-render-marked</code></li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm un hexo-renderer-marked</span><br></pre></td></tr></table></figure><p>安装 <code>hexo-renderer-markdown-it</code> <code>katex</code> <code>@renbaoshuo/markdown-it-katex</code></p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-renderer-markdown-it katex @renbaoshuo/markdown-it-katex</span><br></pre></td></tr></table></figure><p>配置里修改</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># --------------------------- start ---------------------------</span></span><br><span class="line"><span class="comment"># Katex</span></span><br><span class="line"><span class="comment"># Latex formula support</span></span><br><span class="line"><span class="comment"># Latex 公式支持</span></span><br><span class="line"><span class="attr">katex:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">false</span></span><br><span class="line">  <span class="comment"># Whether to load on each page</span></span><br><span class="line">  <span class="comment"># 是否在每个页面加载</span></span><br><span class="line">  <span class="attr">per_page:</span> <span class="literal">false</span></span><br><span class="line">  <span class="comment"># Whether to enable copy formula</span></span><br><span class="line">  <span class="comment"># 是否启用复制公式</span></span><br><span class="line">  <span class="attr">copytex:</span> <span class="literal">false</span></span><br><span class="line"><span class="comment"># --------------------------- end ---------------------------</span></span><br></pre></td></tr></table></figure><p>添加以下内容到 <code>_config.yml</code></p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">markdown:</span></span><br><span class="line">  <span class="attr">preset:</span> <span class="string">&#x27;default&#x27;</span></span><br><span class="line">  <span class="attr">render:</span></span><br><span class="line">    <span class="attr">html:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">xhtmlOut:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">langPrefix:</span> <span class="string">&#x27;language-&#x27;</span></span><br><span class="line">    <span class="attr">breaks:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">linkify:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">typographer:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">quotes:</span> <span class="string">&#x27;“”‘’&#x27;</span></span><br><span class="line">  <span class="attr">enable_rules:</span></span><br><span class="line">  <span class="attr">disable_rules:</span></span><br><span class="line">  <span class="attr">plugins:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&#x27;@renbaoshuo/markdown-it-katex&#x27;</span></span><br><span class="line">  <span class="attr">anchors:</span></span><br><span class="line">    <span class="attr">level:</span> <span class="number">2</span></span><br><span class="line">    <span class="attr">collisionSuffix:</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">    <span class="attr">permalink:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">permalinkClass:</span> <span class="string">&#x27;header-anchor&#x27;</span></span><br><span class="line">    <span class="attr">permalinkSide:</span> <span class="string">&#x27;left&#x27;</span></span><br><span class="line">    <span class="attr">permalinkSymbol:</span> <span class="string">&#x27;¶&#x27;</span></span><br><span class="line">    <span class="attr">case:</span> <span class="number">0</span></span><br><span class="line">    <span class="attr">separator:</span> <span class="string">&#x27;-&#x27;</span></span><br><span class="line">  <span class="attr">images:</span></span><br><span class="line">    <span class="attr">lazyload:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">prepend_root:</span> <span class="literal">false</span></span><br><span class="line">    <span class="attr">post_asset:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">inline:</span> <span class="literal">false</span>  <span class="comment"># https://markdown-it.github.io/markdown-it/#MarkdownIt.renderInline</span></span><br></pre></td></tr></table></figure><p>开启配置项</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># --------------------------- start ---------------------------</span></span><br><span class="line"><span class="comment"># Katex</span></span><br><span class="line"><span class="comment"># Latex formula support</span></span><br><span class="line"><span class="comment"># Latex 公式支持</span></span><br><span class="line"><span class="attr">katex:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># Whether to load on each page</span></span><br><span class="line">  <span class="comment"># 是否在每个页面加载</span></span><br><span class="line">  <span class="attr">per_page:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># Whether to enable copy formula</span></span><br><span class="line">  <span class="comment"># 是否启用复制公式</span></span><br><span class="line">  <span class="attr">copytex:</span> <span class="literal">false</span></span><br><span class="line"><span class="comment"># --------------------------- end ---------------------------</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><ol start="4"><li><strong>PWA</strong> 安装 hexo-swpp 和 swpp-backends 插件</li></ol><p>在博客根目录执行</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-swpp </span><br><span class="line"></span><br><span class="line">pnpm i swpp-backends</span><br></pre></td></tr></table></figure><p>开启配置</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 大约在773行</span></span><br><span class="line"><span class="comment"># --------------------------- start ---------------------------</span></span><br><span class="line"><span class="comment"># PWA</span></span><br><span class="line"><span class="comment"># Progressive Web App</span></span><br><span class="line"><span class="attr">pwa:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">manifest:</span> <span class="string">/manifest.json</span> <span class="comment"># manifest.json</span></span><br><span class="line">  <span class="attr">theme_color:</span> <span class="string">&quot;#006a73&quot;</span> <span class="comment"># Theme color</span></span><br><span class="line">  <span class="attr">mask_icon:</span> <span class="string">/img/pwa/favicon.png</span> <span class="comment"># Mask icon</span></span><br><span class="line">  <span class="attr">apple_touch_icon:</span> <span class="string">/img/pwa/favicon.png</span> <span class="comment"># Apple touch icon</span></span><br><span class="line">  <span class="attr">bookmark_icon:</span> <span class="string">/img/pwa/favicon.png</span> <span class="comment"># Bookmark icon</span></span><br><span class="line">  <span class="attr">favicon_32_32:</span> <span class="string">/img/pwa/favicon_32.png</span> <span class="comment"># 32x32 icon</span></span><br><span class="line">  <span class="attr">favicon_16_16:</span> <span class="string">/img/pwa/favicon_16.png</span> <span class="comment"># 16x16 icon</span></span><br><span class="line"><span class="comment"># --------------------------- end ---------------------------</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在<code>_config.yml</code>里添加swpp配置</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">swpp:</span></span><br><span class="line">  <span class="comment"># 是否启用插件</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 是否在发布前自动执行脚本</span></span><br><span class="line">  <span class="attr">auto_exec:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">gen_dom:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>在 <code>source</code> 目录中创建 <code>manifest.json</code> 文件</p><figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;网站名称&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;short_name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;网站名称缩写&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;theme_color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;#006a73&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;background_color&quot;</span><span class="punctuation">:</span> <span class="string">&quot;#006a73&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;display&quot;</span><span class="punctuation">:</span> <span class="string">&quot;fullscreen&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;scope&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;start_url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;id&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;icons&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;src&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/img/pwa/favicon_16.png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sizes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;16x16&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image/png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;purpose&quot;</span><span class="punctuation">:</span> <span class="string">&quot;any&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;src&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/img/pwa/favicon_16.png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sizes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;16x16&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image/png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;purpose&quot;</span><span class="punctuation">:</span> <span class="string">&quot;maskable&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;src&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/img/pwa/favicon_32.png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sizes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;32x32&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image/png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;purpose&quot;</span><span class="punctuation">:</span> <span class="string">&quot;any&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;src&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/img/pwa/favicon_32.png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sizes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;32x32&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image/png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;purpose&quot;</span><span class="punctuation">:</span> <span class="string">&quot;maskable&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;src&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/img/pwa/favicon.png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sizes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;180x180&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image/png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;purpose&quot;</span><span class="punctuation">:</span> <span class="string">&quot;any&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;src&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/img/pwa/favicon.png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;sizes&quot;</span><span class="punctuation">:</span> <span class="string">&quot;180x180&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;image/png&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;purpose&quot;</span><span class="punctuation">:</span> <span class="string">&quot;maskable&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;splash_pages&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在博客根目录创建一个 <code>sw-rules.js</code> 文件</p><figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span>.<span class="property">config</span> = &#123;</span><br><span class="line">  <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">?ServiceWorkerConfig|boolean</span>&#125; */</span></span><br><span class="line">  <span class="attr">serviceWorker</span>: &#123;</span><br><span class="line">    <span class="attr">escape</span>: <span class="number">1</span>,</span><br><span class="line">    <span class="attr">cacheName</span>: <span class="string">&#x27;SolitudeCache&#x27;</span>,</span><br><span class="line">    <span class="attr">debug</span>: <span class="literal">false</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">register</span>: &#123;</span><br><span class="line">    <span class="attr">onsuccess</span>: <span class="literal">undefined</span>,</span><br><span class="line">    <span class="attr">onerror</span>: <span class="function">() =&gt;</span></span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(</span><br><span class="line">        <span class="string">&#x27;Service Worker 注册失败！可能是由于您的浏览器不支持该功能！&#x27;</span></span><br><span class="line">      ),</span><br><span class="line">    <span class="attr">builder</span>: <span class="function">(<span class="params">root, framework, pluginConfig</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">const</span> &#123; onerror, onsuccess &#125; = pluginConfig.<span class="property">register</span>;</span><br><span class="line">      <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">            &lt;script&gt;</span></span><br><span class="line"><span class="string">                (() =&gt; &#123;</span></span><br><span class="line"><span class="string">                    const sw = navigator.serviceWorker;</span></span><br><span class="line"><span class="string">                    const error = <span class="subst">$&#123;onerror &amp;&amp; onerror.toString()&#125;</span>;</span></span><br><span class="line"><span class="string">                    if (!sw?.register(&#x27;<span class="subst">$&#123;<span class="keyword">new</span> URL(root).pathname&#125;</span>sw.js&#x27;)</span></span><br><span class="line"><span class="string">                        <span class="subst">$&#123;onsuccess ? <span class="string">`?.then(<span class="subst">$&#123;onsuccess.toString()&#125;</span>)`</span> : <span class="string">&quot;&quot;</span>&#125;</span></span></span><br><span class="line"><span class="string">                        ?.catch(error)</span></span><br><span class="line"><span class="string">                    ) error()</span></span><br><span class="line"><span class="string">                &#125;)()</span></span><br><span class="line"><span class="string">            &lt;/script&gt;`</span>;</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">?DomConfig|boolean</span>&#125; */</span></span><br><span class="line">  <span class="attr">dom</span>: &#123;</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">?VoidFunction</span>&#125; */</span></span><br><span class="line">    <span class="attr">onsuccess</span>: <span class="function">() =&gt;</span> &#123;</span><br><span class="line">      caches</span><br><span class="line">        .<span class="title function_">match</span>(<span class="string">&#x27;https://id.v3/&#x27;</span>)</span><br><span class="line">        .<span class="title function_">then</span>(<span class="function">(<span class="params">res</span>) =&gt;</span> &#123;</span><br><span class="line">          <span class="keyword">if</span> (res)</span><br><span class="line">            res.<span class="title function_">json</span>().<span class="title function_">then</span>(<span class="function">(<span class="params">json</span>) =&gt;</span> &#123;</span><br><span class="line">              utils &amp;&amp;</span><br><span class="line">                utils.<span class="title function_">snackbarShow</span>(</span><br><span class="line">                  <span class="string">`已刷新缓存，更新为<span class="subst">$&#123;json.<span class="built_in">escape</span> + <span class="string">&#x27;.&#x27;</span> + json.<span class="variable language_">global</span> + <span class="string">&#x27;.&#x27;</span> + json.local</span></span></span><br><span class="line"><span class="subst"><span class="string">                  &#125;</span>版本最新内容`</span>,</span><br><span class="line">                  <span class="literal">false</span>,</span><br><span class="line">                  <span class="number">2500</span></span><br><span class="line">                );</span><br><span class="line">            &#125;);</span><br><span class="line">          <span class="keyword">else</span> <span class="variable language_">console</span>.<span class="title function_">info</span>(<span class="string">&#x27;未找到缓存&#x27;</span>);</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> <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;缓存匹配出错&#x27;</span>, error));</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">?VersionJsonConfig|boolean</span>&#125; */</span></span><br><span class="line">  <span class="attr">json</span>: &#123;</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">number</span>&#125; */</span></span><br><span class="line">    <span class="attr">maxHtml</span>: <span class="number">15</span>,</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">number</span>&#125; */</span></span><br><span class="line">    <span class="attr">charLimit</span>: <span class="number">1024</span>,</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">string[]</span>&#125; */</span></span><br><span class="line">    <span class="attr">merge</span>: [],</span><br><span class="line">    <span class="attr">exclude</span>: &#123;</span><br><span class="line">      <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">RegExp[]</span>&#125; */</span></span><br><span class="line">      <span class="attr">localhost</span>: [],</span><br><span class="line">      <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">RegExp[]</span>&#125; */</span></span><br><span class="line">      <span class="attr">other</span>: [],</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">?ExternalMonitorConfig|boolean</span>&#125; */</span></span><br><span class="line">  <span class="attr">external</span>: &#123;</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">number</span>&#125; */</span></span><br><span class="line">    <span class="attr">timeout</span>: <span class="number">5000</span>,</span><br><span class="line">    <span class="comment">/** 拉取文件时地并发限制 */</span></span><br><span class="line">    <span class="attr">concurrencyLimit</span>: <span class="number">100</span>,</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">(&#123;head: string, tail: string</span>&#125;|function(string):string[])[]&#125; */</span></span><br><span class="line">    <span class="attr">js</span>: [],</span><br><span class="line">    <span class="comment">/** <span class="doctag">@type</span> &#123;<span class="type">RegExp[]</span>&#125; */</span></span><br><span class="line">    <span class="attr">stable</span>: [</span><br><span class="line">      <span class="regexp">/^https:\/\/npm\.elemecdn\.com\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/</span>,</span><br><span class="line">      <span class="regexp">/^https:\/\/cdn\.cbd\.int\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/</span>,</span><br><span class="line">      <span class="regexp">/^https:\/\/cdn\.jsdelivr\.net\/npm\/[^/@]+\@[^/@]+\/[^/]+\/[^/]+$/</span>,</span><br><span class="line">    ],</span><br><span class="line">    <span class="attr">replacer</span>: <span class="function">(<span class="params">srcUrl</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> (srcUrl.<span class="title function_">startsWith</span>(<span class="string">&#x27;https://cdn.jsdelivr.net/npm/&#x27;</span>)) &#123;</span><br><span class="line">        <span class="keyword">const</span> pathname = <span class="keyword">new</span> <span class="title function_">URL</span>(srcUrl).<span class="property">pathname</span>;</span><br><span class="line">        <span class="keyword">return</span> [</span><br><span class="line">          srcUrl,</span><br><span class="line">          <span class="string">`https://cdn.cbd.int/<span class="subst">$&#123;pathname&#125;</span>`</span>,</span><br><span class="line">          <span class="string">`https://npm.elemecdn.com/<span class="subst">$&#123;pathname&#125;</span>`</span>,</span><br><span class="line">          <span class="string">`https://fastly.jsdelivr.net/npm/<span class="subst">$&#123;pathname&#125;</span>`</span>,</span><br><span class="line">        ];</span><br><span class="line">      &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> srcUrl;</span><br><span class="line">      &#125;</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_">module</span>.<span class="property">exports</span>.<span class="property">cacheRules</span> = &#123;</span><br><span class="line">  <span class="attr">simple</span>: &#123;</span><br><span class="line">    <span class="attr">clean</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">search</span>: <span class="literal">false</span>,</span><br><span class="line">    <span class="attr">match</span>: <span class="function">(<span class="params">url, $eject</span>) =&gt;</span></span><br><span class="line">      url.<span class="property">host</span> === $eject.<span class="property">domain</span> &amp;&amp; [<span class="string">&#x27;/404.html&#x27;</span>].<span class="title function_">includes</span>(url.<span class="property">pathname</span>),</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">cdn</span>: &#123;</span><br><span class="line">    <span class="attr">clean</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">match</span>: <span class="function">(<span class="params">url</span>) =&gt;</span></span><br><span class="line">      [</span><br><span class="line">        <span class="string">&#x27;cdn.cbd.int&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;lf26-cdn-tos.bytecdntp.com&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;lf6-cdn-tos.bytecdntp.com&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;lf3-cdn-tos.bytecdntp.com&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;lf9-cdn-tos.bytecdntp.com&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;cdn.staticfile.org&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;npm.elemecdn.com&#x27;</span>,</span><br><span class="line">      ].<span class="title function_">includes</span>(url.<span class="property">host</span>) &amp;&amp;</span><br><span class="line">      url.<span class="property">pathname</span>.<span class="title function_">match</span>(<span class="regexp">/\.(js|css|woff2|woff|ttf|cur)$/</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="variable language_">module</span>.<span class="property">exports</span>.<span class="property">getSpareUrls</span> = <span class="function">(<span class="params">srcUrl</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (srcUrl.<span class="title function_">startsWith</span>(<span class="string">&#x27;https://npm.elemecdn.com&#x27;</span>)) &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">      <span class="attr">timeout</span>: <span class="number">3000</span>,</span><br><span class="line">      <span class="attr">list</span>: [</span><br><span class="line">        srcUrl,</span><br><span class="line">        <span class="string">`https://fastly.jsdelivr.net/<span class="subst">$&#123;<span class="keyword">new</span> URL(srcUrl).pathname&#125;</span>`</span>,</span><br><span class="line">      ],</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_">module</span>.<span class="property">exports</span>.<span class="property">ejectValues</span> = <span class="function">(<span class="params">hexo, rules</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> &#123;</span><br><span class="line">    <span class="attr">domain</span>: &#123;</span><br><span class="line">      <span class="attr">prefix</span>: <span class="string">&#x27;const&#x27;</span>,</span><br><span class="line">      <span class="attr">value</span>: <span class="keyword">new</span> <span class="title function_">URL</span>(hexo.<span class="property">config</span>.<span class="property">url</span>).<span class="property">host</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><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span>.<span class="property">skipRequest</span> = <span class="function">(<span class="params">request</span>) =&gt;</span> request.<span class="property">url</span>.<span class="title function_">startsWith</span>(<span class="string">&quot;https://i0.hdslb.com&quot;</span>) ||</span><br><span class="line">  request.<span class="property">url</span>.<span class="title function_">startsWith</span>(<span class="string">&#x27;https://meting.qjqq.cn&#x27;</span>) ||</span><br><span class="line">  request.<span class="property">url</span>.<span class="title function_">startsWith</span>(<span class="string">&#x27;https://api.i-meto.com&#x27;</span>);</span><br></pre></td></tr></table></figure><hr><ol start="5"><li><strong><a href="https://github.com/hexojs/hexo-deployer-git">hexo-deploy-git</a></strong> 提交到git的插件</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-deploy-git --save</span><br></pre></td></tr></table></figure><hr><ol start="6"><li><strong><a href="https://github.com/hexojs/hexo-generator-feed">hexo-generator-feed</a></strong> hexo的rss插件</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-generator-feed --save</span><br></pre></td></tr></table></figure><hr><ol start="7"><li><strong><a href="https://github.com/ohroy/hexo-abbrlink">hexo 的短链接</a></strong>: <code>hexo-abbrlink</code></li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-abbrlink --save</span><br></pre></td></tr></table></figure><p>在<code>_config.yml</code>里修改：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">permalink:</span> <span class="string">posts/:abbrlink/</span> </span><br><span class="line"><span class="comment"># or</span></span><br><span class="line"><span class="attr">permalink:</span> <span class="string">posts/:abbrlink.html</span></span><br></pre></td></tr></table></figure><p>添加:</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># abbrlink config</span></span><br><span class="line"><span class="attr">abbrlink:</span></span><br><span class="line">  <span class="attr">alg:</span> <span class="string">crc32</span>      <span class="comment"># Algorithm used to calc abbrlink. Support crc16(default) and crc32</span></span><br><span class="line">  <span class="attr">rep:</span> <span class="string">hex</span>        <span class="comment"># Representation of abbrlink in URLs. Support dec(default) and hex</span></span><br><span class="line">  <span class="attr">drafts:</span> <span class="literal">false</span>   <span class="comment"># Whether to generate abbrlink for drafts. (false in default)</span></span><br><span class="line">  <span class="attr">force:</span> <span class="literal">false</span>    <span class="comment"># Enable force mode. In this mode, the plugin will ignore the cache, and calc the abbrlink for every post even it already had an abbrlink. (false in default)</span></span><br><span class="line">  <span class="attr">writeback:</span> <span class="literal">true</span> <span class="comment"># Whether to write changes to front-matters back to the actual markdown files. (true in default)</span></span><br></pre></td></tr></table></figure><hr><ol start="8"><li><strong><a href="https://github.com/hexojs/hexo-generator-sitemap">博客的sitemap</a></strong> : <code>hexo-generator-sitemap</code></li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-generator-sitemap --save</span><br></pre></td></tr></table></figure><p>在<code>_config.yml</code>里添加配置：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">sitemap:</span></span><br><span class="line">  <span class="attr">path:</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="string">sitemap.xml</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">sitemap.txt</span></span><br><span class="line">  <span class="attr">template:</span> <span class="string">./sitemap_template.xml</span></span><br><span class="line">  <span class="attr">template_txt:</span> <span class="string">./sitemap_template.txt</span></span><br><span class="line">  <span class="attr">rel:</span> <span class="literal">false</span></span><br><span class="line">  <span class="attr">tags:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">categories:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><hr><ol start="9"><li><a href="https://www.mebi.me/hexo-with-algolia"><strong>使用algolia搜索</strong></a> : <code>hexo-algoliasearch</code></li></ol><ul><li>注册algolia：</li></ul><p>注册地址：<a href="https://dashboard.algolia.com/users/sign_up">dashboard.algolia.com/users/sign_up</a></p><ul><li>创建应用：</li></ul><p>注册成功后创建应用：<a href="https://dashboard.algolia.com/account/plan/create?from=dashboard">dashboard.algolia.com/account/plan/create?from=dashboard</a></p><ul><li>search -&gt; configure -&gt; index添加index_name即可</li></ul><p>在博客执行命令：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-algoliasearch --save</span><br></pre></td></tr></table></figure><p><code>_config.yml</code>里添加</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">algolia:</span></span><br><span class="line">  <span class="attr">appId:</span> <span class="string">&quot;Z7A3XW4R2I&quot;</span></span><br><span class="line">  <span class="attr">apiKey:</span> <span class="string">&quot;12db1ad54372045549ef465881c17e743&quot;</span></span><br><span class="line">  <span class="attr">adminApiKey:</span> <span class="string">&quot;40321c7c207e7f73b63a19aa24c4761b&quot;</span></span><br><span class="line">  <span class="attr">chunkSize:</span> <span class="number">5000</span></span><br><span class="line">  <span class="attr">indexName:</span> <span class="string">&quot;my-hexo-blog&quot;</span></span><br><span class="line">  <span class="attr">fields:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">content:strip:truncate,0,500</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">excerpt:strip</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">gallery</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">permalink</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">photos</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">slug</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">tags</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">title</span></span><br></pre></td></tr></table></figure><div class="note info"><i class="solitude fas fa-circle-exclamation"></i><p><strong>!!!配置完成后记得运行 <code>hexo clean</code></strong></p></div><p>在<code>hexo g </code>后实行下列代码：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo algolia</span><br></pre></td></tr></table></figure><hr><ol start="10"><li>**<a href="https://blog.liushen.fun/posts/1dfd1f41/">hexo-safego</a>**安全跳转插件</li></ol><p>使用该插件之前，需要先安装 <code>cheerio</code>，<code>cheerio</code> 是一个轻量级的库，用于在服务器端快速、灵活地实现 jQuery 核心功能。在 <code>hexo-safego</code> 插件中，<code>cheerio</code> 被用来解析和操作生成的静态 HTML 内容，类似于在浏览器中使用 jQuery 处理 DOM 元素。这使得插件能够在生成静态页面时，处理和替换外部链接，增强博客的安全性，而不需要在客户端引入 jQuery。Hexo 一般都有这个插件，可以在 <code>node_modules</code> 查看，如果没有，请先执行：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i cheerio --save</span><br></pre></td></tr></table></figure><p>然后即可安装该插件：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-safego --save</span><br></pre></td></tr></table></figure><p>在<code>hexo</code>根目录的<code>_config.yml</code>文件中添加以下配置：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># hexo-safego安全跳转插件</span></span><br><span class="line"><span class="comment"># see https://blog.liushen.fun/posts/1dfd1f41/</span></span><br><span class="line"><span class="attr">hexo_safego:</span></span><br><span class="line">  <span class="comment"># 基本功能设置</span></span><br><span class="line">  <span class="attr">general:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span>                <span class="comment"># 启用插件</span></span><br><span class="line">    <span class="attr">enable_base64_encode:</span> <span class="literal">true</span>  <span class="comment"># 使用 Base64 编码</span></span><br><span class="line">    <span class="attr">enable_target_blank:</span> <span class="literal">true</span>   <span class="comment"># 打开新窗口</span></span><br><span class="line">  <span class="comment"># 安全设置</span></span><br><span class="line">  <span class="attr">security:</span></span><br><span class="line">    <span class="attr">url_param_name:</span> <span class="string">&#x27;u&#x27;</span>         <span class="comment"># URL 参数名</span></span><br><span class="line">    <span class="attr">html_file_name:</span> <span class="string">&#x27;go.html&#x27;</span>   <span class="comment"># 重定向页面的文件名</span></span><br><span class="line">    <span class="attr">ignore_attrs:</span>               <span class="comment"># 忽略处理的 HTML 属性</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;data-fancybox&#x27;</span></span><br><span class="line">  <span class="comment"># 容器与页面设置</span></span><br><span class="line">  <span class="attr">scope:</span></span><br><span class="line">    <span class="attr">apply_containers:</span>           <span class="comment"># 应用的容器选择器</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;#article-container&#x27;</span></span><br><span class="line">    <span class="attr">apply_pages:</span>                <span class="comment"># 应用的页面路径</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/posts/&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/devices/&quot;</span></span><br><span class="line">    <span class="attr">exclude_pages:</span>              <span class="comment"># 排除的页面路径</span></span><br><span class="line">  <span class="comment"># 域名白名单</span></span><br><span class="line">  <span class="attr">whitelist:</span></span><br><span class="line">    <span class="attr">domain_whitelist:</span>           <span class="comment"># 允许的白名单域名</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;qyliu.top&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;liushen.fun&quot;</span></span><br><span class="line">  <span class="comment"># 页面外观设置</span></span><br><span class="line">  <span class="attr">appearance:</span></span><br><span class="line">    <span class="attr">avatar:</span> <span class="string">/info/avatar.ico</span>    <span class="comment"># 头像路径</span></span><br><span class="line">    <span class="attr">title:</span> <span class="string">&quot;清羽飞扬&quot;</span>            <span class="comment"># 页面标题</span></span><br><span class="line">    <span class="attr">subtitle:</span> <span class="string">&quot;安全中心&quot;</span>         <span class="comment"># 页面副标题</span></span><br><span class="line">    <span class="attr">darkmode:</span> <span class="literal">true</span>              <span class="comment"># 是否启用深色模式</span></span><br><span class="line">    <span class="attr">countdowntime:</span> <span class="number">-1</span>           <span class="comment"># 倒计时秒数</span></span><br><span class="line">  <span class="comment"># 调试设置</span></span><br><span class="line">  <span class="attr">debug:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">false</span>               <span class="comment"># 启用调试模式</span></span><br></pre></td></tr></table></figure><ol start="11"><li><strong>hexo的追番页面</strong>：<a href="https://github.com/HCLonely/hexo-bilibili-bangumi">hexo-bilibili-bangumi</a></li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">pnpm i hexo-bilibili-bangumi --save</span><br></pre></td></tr></table></figure><p>在<code>_config.yml</code>配置：</p><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">bangumi:</span> <span class="comment"># 追番设置</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span>           <span class="comment"># 是否启用</span></span><br><span class="line">  <span class="attr">source:</span> <span class="string">bili</span>          <span class="comment"># 数据源</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">bangumis/index.html</span>  <span class="comment"># 页面路径</span></span><br><span class="line">  <span class="attr">vmid:</span>                 <span class="comment"># 用户ID</span></span><br><span class="line">  <span class="attr">title:</span> <span class="string">&#x27;追番列表&#x27;</span>      <span class="comment"># 页面标题</span></span><br><span class="line">  <span class="attr">quote:</span> <span class="string">&#x27;生命不息，追番不止！&#x27;</span> <span class="comment"># 页面引言</span></span><br><span class="line">  <span class="attr">show:</span> <span class="number">1</span>              <span class="comment"># 初始显示页面: 0=想看, 1=在看, 2=看过</span></span><br><span class="line">  <span class="attr">lazyload:</span> <span class="literal">true</span>       <span class="comment"># 是否启用图片懒加载</span></span><br><span class="line">  <span class="attr">metaColor:</span>           <span class="comment"># meta 信息字体颜色</span></span><br><span class="line">  <span class="attr">color:</span>               <span class="comment"># 简介字体颜色</span></span><br><span class="line">  <span class="attr">webp:</span> <span class="literal">true</span>          <span class="comment"># 是否使用 webp 格式图片</span></span><br><span class="line">  <span class="attr">progress:</span> <span class="literal">true</span>      <span class="comment"># 是否显示进度条</span></span><br><span class="line">  <span class="string">...</span></span><br><span class="line"><span class="attr">cinema:</span> <span class="comment"># 追剧设置</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span>           <span class="comment"># 是否启用</span></span><br><span class="line">  <span class="attr">source:</span> <span class="string">bili</span></span><br><span class="line">  <span class="string">...</span></span><br><span class="line"><span class="attr">game:</span> <span class="comment"># 游戏设置，仅支持source: bgmv0</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span>           <span class="comment"># 是否启用</span></span><br><span class="line">  <span class="attr">source:</span> <span class="string">bgmv0</span></span><br><span class="line">  <span class="string">...</span></span><br></pre></td></tr></table></figure><p>还在更新中。。。</p><hr><h2 id="Github-action配置">Github action配置</h2><p>承接<a href="#github-config">段落</a>的继续吧，未来会在<s>出</s>水一期。</p><p>接下来就是创建一个私有仓库，根据大佬的文章，是为了保护<strong>Token</strong>，见仁见智。</p><p>这个私有仓库的建立是存储Hexo博客代码，如果你要使用<a href="https://github.com/Qexo/Qexo">Qexo</a></p><p>，这也是必不可少的！</p><p><img src="https://img.314926.xyz/images/2025/08/19/hexo-beiwang1.webp" alt=""></p><p>创建完成后，需要把博客的源码 push 到这里。首先获取远程仓库地址，此处虽然 SSH 和 HTTPS 均可。SSH 在绑定过 ssh key 的设备上无需再输入密码，HTTPS 则需要输入密码，但是 SSH 偶尔会遇到端口占用的情况。请自主选择。</p><p><img src="https://img.314926.xyz/images/2025/08/19/hexo-beiwang2.webp" alt=""></p><div class="note danger modern"><i class="solitude fas fa-wand-magic-sparkles"></i><p>这里之所以是私有仓库，是因为在接下来的配置中会用到 <code>Token</code>，如果 <code>Token</code> 被盗用，别人可以肆意操作你的 github 仓库内容，为了避免这一风险，才选择的博客源码闭源。</p></div><h3 id="配置-Github-Action">配置 Github Action</h3><ol><li>在<code>[Blogroot]</code>新建<code>.github</code>文件夹,注意开头是有个<code>.</code>的。然后在<code>.github</code> 内新建 <code>workflows</code> 文件夹，再在 <code>workflows</code> 文件夹内新建 <code>autodeploy.yml</code>,在<code>[Blogroot]/.github/workflows/autodeploy.yml</code> 里面输入</li></ol><figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 当有改动推送到 main 分支时，启动 Action</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">自动部署</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span> <span class="comment"># 自选分支</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">release:</span></span><br><span class="line">    <span class="attr">types:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">published</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">检查分支</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">main</span> <span class="comment"># 自选分支</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Node</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&quot;22.x&quot;</span> <span class="comment"># node版本</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          export TZ=&#x27;Asia/Shanghai&#x27;</span></span><br><span class="line"><span class="string">          npm install hexo-cli -g</span></span><br><span class="line"><span class="string">          npm install yamljs --save</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">缓存</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">cache</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">node_modules</span></span><br><span class="line">          <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-node-$&#123;&#123;</span> <span class="string">hashFiles(&#x27;**/package-lock.json&#x27;)</span> <span class="string">&#125;&#125;</span></span><br><span class="line"></span><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">if:</span> <span class="string">steps.cache.outputs.cache-hit</span> <span class="type">!=</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          npm install --save</span></span><br><span class="line"><span class="string">          npm install hexo-algoliasearch --save</span></span><br><span class="line"><span class="string">          npm install hexo-bilibili-bangumi --save</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">生成静态文件</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          node ./link.js</span></span><br><span class="line"><span class="string">          hexo clean</span></span><br><span class="line"><span class="string">          hexo generate</span></span><br><span class="line"><span class="string">          hexo bangumi -u</span></span><br><span class="line"><span class="string">          hexo algolia</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">部署</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          cd ./public</span></span><br><span class="line"><span class="string">          git init -b main</span></span><br><span class="line"><span class="string">          git config --global user.name &#x27;$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;&#x27;</span></span><br><span class="line"><span class="string">          git config --global user.email &#x27;$&#123;&#123; secrets.GITHUBEMAIL &#125;&#125;&#x27;</span></span><br><span class="line"><span class="string">          git add .</span></span><br><span class="line"><span class="string">          git commit -m &quot;$&#123;&#123; github.event.head_commit.message &#125;&#125; $(date +&quot;%Z %Y-%m-%d %A %H:%M:%S&quot;) Updated by GitHub Actions&quot;</span></span><br><span class="line"><span class="string">          git push --force --quiet &quot;https://$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;:$&#123;&#123; secrets.GITHUBTOKEN &#125;&#125;@github.com/$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;/$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;.github.io.git&quot; main</span></span><br></pre></td></tr></table></figure><p>上述代码是来自<a href="https://akilar.top/posts/f752c86d/">店长</a>的修改自用，为什么不用<a href="https://blog.anheyu.com/posts/asdx.html">安知鱼</a>的？</p><ol><li><p>首先把Token直接放在仓库的文件里还是不太好。</p></li><li><p>像我这种在本地搞的，推不到仓库里，因为这里的token不能直接上传，我尝试过把<code>token: </code>改成<code>token: $&#123;&#123; servets.GH_token &#125;&#125;</code>，但是依旧有各种问题，相反使用了店长的代码后，就大差不差，询问AI后就得到目前的代码，也就可以正式上传了。（无拉踩的意思）</p></li><li><p>之后需要自己到仓库的 Settings-&gt;Secrets-&gt;actions 下添加环境变量，变量名参考脚本中出现的，依次添加。</p></li></ol><p><img src="https://img.314926.xyz/images/2025/08/19/hexo-beiwang3.webp" alt=""></p><h3 id="重新设置远程仓库和分支">重新设置远程仓库和分支</h3><div class="tabs" id="🍼第一次使用git管理博客源码"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#🍼第一次使用git管理博客源码-0">🍼第一次使用git管理博客源码 0</button></li><li class="tab"><button type="button" data-href="#🍼第一次使用git管理博客源码-1">🍼第一次使用git管理博客源码 1</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="🍼第一次使用git管理博客源码-0"><ol><li>删除或者先把<code>[Blogroot]/themes/solitude/.git</code>移动到非博客文件夹目录下,原因是主题文件夹下的<code>.git</code>文件夹的存在会导致其被识别成子项目，从而无法被上传到源码仓库。</li><li>在博客根目录<code>[Blogroot]</code>路径下运行指令:</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git init <span class="comment">#初始化</span></span><br><span class="line">git remote add origin git@github.com:[GithubUsername]/[SourceRepo].git <span class="comment">#[SourceRepo]为存放源码的github私有仓库</span></span><br><span class="line">git checkout -b master <span class="comment"># 切换到master分支，</span></span><br><span class="line"><span class="comment">#2020年10月后github新建仓库默认分支改为main，注意更改</span></span><br><span class="line"><span class="comment"># 如果不是，后面的所有设置的分支记得保持一致</span></span><br></pre></td></tr></table></figure><ol start="3"><li>添加屏蔽项</li></ol><p>因为能够使用指令进行安装的内容不包括在需要提交的源码内，所有我们需要将这些内容添加到屏蔽项，表示不上传到 github 上。这样可以显著减少需要提交的文件量和加快提交速度。打开<code>[Blogroot]/.gitignore</code>,输入以下内容：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">.DS_Store</span><br><span class="line">Thumbs.db</span><br><span class="line">db.json</span><br><span class="line">*.<span class="built_in">log</span></span><br><span class="line">node_modules/</span><br><span class="line">public/</span><br><span class="line">.deploy*/</span><br><span class="line">.deploy_git*/</span><br><span class="line">.idea</span><br><span class="line">themes/solitude/.git</span><br></pre></td></tr></table></figure><p>如果不是<code>solitude</code>主题，记得替换最后一行内容为你自己当前使用的主题。<br>4. 之后再运行 git 提交指令，将博客源码提交到 github 上。</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;github action update&quot;</span></span><br><span class="line">git push origin master</span><br><span class="line"><span class="comment">#2020年10月后github新建仓库默认分支改为main，注意更改</span></span><br></pre></td></tr></table></figure><ol start="5"><li>此时你的主题文件夹若已经被正常上传，并且你也添加了主题文件夹下的.git 文件夹的屏蔽项。那你可以考虑把第二步移走或删除的<code>.git</code>放回来，用作以后升级。（不禁怀疑真的有人会去用这个方式来升级吗）</li></ol></div><div class="tab-item-content" id="🍼第一次使用git管理博客源码-1"><ol><li>添加屏蔽项</li></ol><p>因为能够使用指令进行安装的内容不包括在需要提交的源码内，所有我们需要将这些内容添加到屏蔽项，表示不上传到 github 上。这样可以显著减少需要提交的文件量和加快提交速度。<br>打开<code>[Blogroot]/.gitignore</code>,输入以下内容：</p><figure class="highlight txt"><table><tr><td class="code"><pre><span class="line">.DS_Store</span><br><span class="line">Thumbs.db</span><br><span class="line">db.json</span><br><span class="line">*.log</span><br><span class="line">node_modules/</span><br><span class="line">public/</span><br><span class="line">.deploy*/</span><br><span class="line">.deploy_git*/</span><br><span class="line">.idea</span><br><span class="line">themes/solitude/.git</span><br></pre></td></tr></table></figure><p>如果不是 <code>solitude</code> 主题，记得替换最后一行内容为你自己当前使用的主题。</p><ol start="2"><li>提交源码到私有仓库<code>[SourceRepo]</code><br>在博客根目录<code>[Blogroot]</code>下启动终端，使用 git 指令重设仓库地址。这样在新建仓库，我们仍旧可以保留珍贵的 commit history，便于版本回滚。</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git remote <span class="built_in">rm</span> origin <span class="comment"># 删除原有仓库链接</span></span><br><span class="line">git remote add origin git@github.com:[GithubUsername]/[SourceRepo].git <span class="comment">#[SourceRepo]为新的存放源码的github私有仓库</span></span><br><span class="line">git checkout -b master <span class="comment"># 切换到master分支，</span></span><br><span class="line"><span class="comment">#2020年10月后github新建仓库默认分支改为main，注意更改</span></span><br><span class="line"><span class="comment"># 如果不是，后面的所有设置的分支记得保持一致</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;github action update&quot;</span></span><br><span class="line">git push origin master</span><br><span class="line"><span class="comment">#2020年10月后github新建仓库默认分支改为main，注意更改</span></span><br></pre></td></tr></table></figure><ol start="3"><li>可能遇到的 bug</li></ol><p>因为 solitude 主题文件夹下的.git 文件夹的存在，那么主题文件夹会被识别子项目。从而无法被上传到源码仓库。若是遇到添加屏蔽项，但是还是无法正常上传主题文件夹的情况。请先将本地源码中的 themes 文件夹移动到别的目录下。然后 commit 一次。接着将 themes 文件夹移动回来，再 commit 一次。</p><div class="note danger modern"><i class="solitude fas fa-wand-magic-sparkles"></i><p>要是还不行，那就删了 solitude 主题文件夹下的.git 文件夹，然后再重复上述的 commit 操作。</p></div></div></div></div><h1>挖坑</h1><p>大致写到这，未来或许会有<s>下一章</s>挖坑？但是目前通用的就到这，然后后续会写Qexo的简单使用方法、solitude的一些配置更改和我踩坑经历吧。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1&gt;Hexo 备忘&lt;/h1&gt;
&lt;h2 id=&quot;我的配置&quot;&gt;我的配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hexo 版本&lt;/strong&gt;: hexo-cli: 4.3.2, hexo: 7.3.0(当前最新)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="备忘" scheme="https://myboke.kemiaosw.top/tags/%E5%A4%87%E5%BF%98/"/>
    
    <category term="配置" scheme="https://myboke.kemiaosw.top/tags/%E9%85%8D%E7%BD%AE/"/>
    
    <category term="Hexo" scheme="https://myboke.kemiaosw.top/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>Markdown 强调语法</title>
    <link href="https://myboke.kemiaosw.top/posts/db29.html"/>
    <id>https://myboke.kemiaosw.top/posts/db29.html</id>
    <published>2025-07-17T13:40:50.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原文链接: <a href="https://markdown.com.cn/basic-syntax/emphasis.html">https://markdown.com.cn/basic-syntax/emphasis.html</a></p></blockquote><h2 id="Markdown-强调语法">Markdown 强调语法</h2><p>通过将文本设置为粗体或斜体来强调其重要性。</p><h3 id="粗体（Bold）">粗体（Bold）</h3><p>要加粗文本，请在单词或短语的前后各添加两个星号（asterisks）或下划线（underscores）。如需加粗一个单词或短语的中间部分用以表示强调的话，请在要加粗部分的两侧各添加两个星号（asterisks）。</p><table><thead><tr><th style="text-align:center">Markdown语法</th><th style="text-align:center">HTML</th><th style="text-align:center">预览效果</th></tr></thead><tbody><tr><td style="text-align:center"><code>I just love **bold text**.</code></td><td style="text-align:center"><code>I just love &lt;strong&gt;bold text&lt;/strong&gt;.</code></td><td style="text-align:center">I just love <strong>bold text</strong>.</td></tr><tr><td style="text-align:center"><code>I just love __bold text__.</code></td><td style="text-align:center"><code>I just love &lt;strong&gt;bold text&lt;/strong&gt;.</code></td><td style="text-align:center">I just love <strong>bold text</strong>.</td></tr><tr><td style="text-align:center"><code>Love**is**bold</code></td><td style="text-align:center"><code>Love&lt;strong&gt;is&lt;/strong&gt;bold</code></td><td style="text-align:center">Love <strong>is</strong> bold</td></tr></tbody></table><h3 id="粗体（Bold）用法最佳实践">粗体（Bold）用法最佳实践</h3><p>Markdown 应用程序在如何处理单词或短语中间的下划线上并不一致。为兼容考虑，在单词或短语中间部分加粗的话，请使用星号（asterisks）。</p><table><thead><tr><th style="text-align:center">✅  Do this</th><th style="text-align:center">❌  Don’t do this</th></tr></thead><tbody><tr><td style="text-align:center"><code>Love**is**bold</code></td><td style="text-align:center"><code>Love__is__bold</code></td></tr></tbody></table><h3 id="斜体（Italic）">斜体（Italic）</h3><p>要用斜体显示文本，请在单词或短语前后添加一个星号（asterisk）或下划线（underscore）。要斜体突出单词的中间部分，请在字母前后各添加一个星号，中间不要带空格。</p><table><thead><tr><th style="text-align:center">Markdown语法</th><th style="text-align:center">HTML</th><th style="text-align:center">预览效果</th></tr></thead><tbody><tr><td style="text-align:center"><code>This text is ***really important***.</code></td><td style="text-align:center"><code>This text is &lt;strong&gt;&lt;em&gt;really important&lt;/em&gt;&lt;/strong&gt;.</code></td><td style="text-align:center">This text is <em><strong>really important</strong></em>.</td></tr><tr><td style="text-align:center"><code>This text is ___really important___.</code></td><td style="text-align:center"><code>This text is &lt;strong&gt;&lt;em&gt;really important&lt;/em&gt;&lt;/strong&gt;.</code></td><td style="text-align:center">This text is <em><strong>really important</strong></em>.</td></tr><tr><td style="text-align:center"><code>This text is __*really important*__.</code></td><td style="text-align:center"><code>This text is &lt;strong&gt;&lt;em&gt;really important&lt;/em&gt;&lt;/strong&gt;.</code></td><td style="text-align:center">This text is <strong><em>really important</em></strong>.</td></tr><tr><td style="text-align:center"><code>This text is **_really important_**.</code></td><td style="text-align:center"><code>This text is &lt;strong&gt;&lt;em&gt;really important&lt;/em&gt;&lt;/strong&gt;.</code></td><td style="text-align:center">This text is <strong><em>really important</em></strong>.</td></tr><tr><td style="text-align:center"><code>This is really***very***important text.</code></td><td style="text-align:center"><code>This is really&lt;strong&gt;&lt;em&gt;very&lt;/em&gt;&lt;/strong&gt;important text.</code></td><td style="text-align:center">This is really <em><strong>very</strong></em> important text.</td></tr></tbody></table><h3 id="粗体（Bold）和斜体（Italic）用法的最佳实践">粗体（Bold）和斜体（Italic）用法的最佳实践</h3><p>Markdown 应用程序在处理单词或短语中间添加的下划线上并不一致。为了实现兼容性，请使用星号将单词或短语的中间部分加粗并以斜体显示，以示重要。</p><table><thead><tr><th style="text-align:center">✅  Do this</th><th style="text-align:center">❌  Don’t do this</th></tr></thead><tbody><tr><td style="text-align:center"><code>This is really***very***important text.</code></td><td style="text-align:center"><code>This is really___very___important text.</code></td></tr></tbody></table>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="语法" scheme="https://myboke.kemiaosw.top/tags/%E8%AF%AD%E6%B3%95/"/>
    
    <category term="强调语法" scheme="https://myboke.kemiaosw.top/tags/%E5%BC%BA%E8%B0%83%E8%AF%AD%E6%B3%95/"/>
    
    <category term="markdown" scheme="https://myboke.kemiaosw.top/tags/markdown/"/>
    
  </entry>
  
  <entry>
    <title>Markdown 换行语法</title>
    <link href="https://myboke.kemiaosw.top/posts/9c69.html"/>
    <id>https://myboke.kemiaosw.top/posts/9c69.html</id>
    <published>2025-06-28T14:45:25.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原文链接: <a href="https://markdown.com.cn/basic-syntax/line-breaks.html">https://markdown.com.cn/basic-syntax/line-breaks.html</a></p></blockquote><h2 id="Markdown-换行语法">Markdown 换行语法</h2><p>在一行的末尾添加两个或多个空格，然后按回车键,即可创建一个换行(<code>&lt;br&gt;</code>)。</p><table><thead><tr><th style="text-align:center">Markdown语法</th><th style="text-align:center">HTML</th><th style="text-align:center">预览效果</th></tr></thead><tbody><tr><td style="text-align:center"><code>This is the first line.  </code><br>  <code>And this is the second line.</code></td><td style="text-align:center"><code>&lt;p&gt;This is the first line.&lt;br&gt;</code><br><code> And this is the second line.&lt;/p&gt;</code></td><td style="text-align:center"><p>This is the first line.<br> And this is the second line.</p></td></tr></tbody></table><h2 id="换行（Line-Break）用法的最佳实践">换行（Line Break）用法的最佳实践</h2><p>几乎每个 Markdown 应用程序都支持两个或多个空格进行换行，称为 <code>结尾空格（trailing whitespace)</code> 的方式，但这是有争议的，因为很难在编辑器中直接看到空格，并且很多人在每个句子后面都会有意或无意地添加两个空格。由于这个原因，你可能要使用除结尾空格以外的其它方式来换行。幸运的是，几乎每个 Markdown 应用程序都支持另一种换行方式：HTML 的 <code>&lt;br&gt;</code> 标签。<br></p><p>为了兼容性，请在行尾添加“结尾空格”或 HTML 的 <code>&lt;br&gt;</code> 标签来实现换行。<br></p><p>还有两种其他方式我并不推荐使用。CommonMark 和其它几种轻量级标记语言支持在行尾添加反斜杠 (<code>\</code>) 的方式实现换行，但是并非所有 Markdown 应用程序都支持此种方式，因此从兼容性的角度来看，不推荐使用。并且至少有两种轻量级标记语言支持无须在行尾添加任何内容，只须键入回车键（<code>return</code>）即可实现换行。</p><table><thead><tr><th style="text-align:center">✅  Do this</th><th style="text-align:center">❌  Don’t do this</th></tr></thead><tbody><tr><td style="text-align:center"><code>First line with two spaces after.  </code><br> <code>And the next line.</code></td><td style="text-align:center"><code>First line with a backslash after.\</code> <br> <code>And the next line.</code></td></tr><tr><td style="text-align:center"><code>First line with the HTML tag after.&lt;br&gt;</code><br> <code>And the next line.</code></td><td style="text-align:center"><code>First line with nothing after.</code><br> <code>And the next line.</code></td></tr></tbody></table>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原文链接: &lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="换行语法" scheme="https://myboke.kemiaosw.top/tags/%E6%8D%A2%E8%A1%8C%E8%AF%AD%E6%B3%95/"/>
    
    <category term="markdown" scheme="https://myboke.kemiaosw.top/tags/markdown/"/>
    
  </entry>
  
  <entry>
    <title>资源分享：涂鹿Toolooz</title>
    <link href="https://myboke.kemiaosw.top/posts/9dd5.html"/>
    <id>https://myboke.kemiaosw.top/posts/9dd5.html</id>
    <published>2025-05-19T08:48:30.000Z</published>
    <updated>2025-09-25T13:51:05.628Z</updated>
    
    <content type="html"><![CDATA[<h2 id="涂鹿Toolooz：曲线文字绘制设计工具，轻松创建沿任意路径排布的精美文字">涂鹿Toolooz：曲线文字绘制设计工具，轻松创建沿任意路径排布的精美文字</h2><p>涂鹿Toolooz，在线曲线文字绘制工具，可使文字沿任意路径排列，打造独特视觉效果。为您的徽标、标题、艺术作品赋予生命力与创意。</p><p>支持自定义画布尺寸、文本内容、字体、间距、颜色、描边等，还支持多个绘图工具和选择文本是否重复，可导出为 PNG、WebP 和 SVG 格式，免费使用，无需注册。</p><h2 id="网站介绍">网站介绍</h2><h3 id="截图">截图</h3><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505191632987.png" alt=""></p><h3 id="特色">特色</h3><h4 id="自由绘制路径">自由绘制路径</h4><p>使用鼠标或触控笔自由绘制路径，或选择预设形状如圆形、方形、椭圆等，轻松创建文字轨迹。</p><h4 id="文本样式丰富">文本样式丰富</h4><p>自定义字体、大小、颜色、间距等属性，支持文本背景带，打造丰富多样的文字效果。</p><h4 id="交互式编辑">交互式编辑</h4><p>直观的选择、移动、缩放和旋转功能，让您精确控制每个文字路径的位置和外观。</p><h4 id="灵活配置">灵活配置</h4><p>自定义画布尺寸、背景色、缩放级别等，适应各种设计场景和需求。</p><h4 id="多格式导出">多格式导出</h4><p>将设计导出为PNG、SVG或WEBP格式，可自定义分辨率和尺寸，轻松应用于各种场景。</p><h4 id="模板库">模板库</h4><p>内置多种精美模板，一键应用，快速开始您的创意设计项目</p><h2 id="应用场景">应用场景</h2><p>涂鹿曲线文字绘制设计工具适用于多种创意设计</p><p>创建独特的环形或自定义形状品牌徽标，增强品牌视觉识别度。#社交媒体 #创意设计</p><p>为社交媒体平台设计吸引眼球的曲线文字图片，提高内容吸引力。创意海报设计</p><p>创建个性化海报和宣传材料，为活动和产品增添创意元素。</p><h2 id="网站链接">网站链接</h2><p><a href="https://toolooz.com/">https://toolooz.com</a></p><hr><h2 id="原文链接">原文链接</h2><p><a href="https://www.appmiao.com/836/">https://www.appmiao.com/836/</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2</summary>
        
      
    
    
    
    <category term="资源分享" scheme="https://myboke.kemiaosw.top/categories/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="网站" scheme="https://myboke.kemiaosw.top/tags/%E7%BD%91%E7%AB%99/"/>
    
    <category term="设计" scheme="https://myboke.kemiaosw.top/tags/%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="Toolooz" scheme="https://myboke.kemiaosw.top/tags/Toolooz/"/>
    
  </entry>
  
  <entry>
    <title>来将 Telegram 当音乐播放器吧！</title>
    <link href="https://myboke.kemiaosw.top/posts/fedf.html"/>
    <id>https://myboke.kemiaosw.top/posts/fedf.html</id>
    <published>2025-05-15T07:15:25.000Z</published>
    <updated>2025-09-25T13:51:05.628Z</updated>
    
    <content type="html"><![CDATA[<h2 id="来将-Telegram-当音乐播放器吧！（寻找音乐、即时歌词、无损音乐不失真压缩）">来将 Telegram 当音乐播放器吧！（寻找音乐、即时歌词、无损音乐不失真压缩）</h2><h3 id="步骤一：到-music-v1bot-下载歌曲，并找到歌词">步骤一：到 <a href="https://t.me/music_v1bot">@music_v1bot</a> 下载歌曲，并找到歌词</h3><p><em>输入指令： /search （你想要的歌名）</em></p><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151340118.jpg" alt=""></p><h3 id="步骤二：下载-MT-管理器（点我）">步骤二：<a href="https://telegra.ph/Mtmanager-02-10-2">下载 MT 管理器（点我）</a></h3><blockquote><p><strong><em><u>开启：下载好的歌词文件</u></em></strong></p></blockquote><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151343982.jpg" alt=""></p><h3 id="步骤三：最右上角、搜索-勾选正则化，替换（全部替换）">步骤三：最右上角、搜索&gt;勾选正则化，替换（全部替换）</h3><blockquote><p><em>输入：[(\d{2}:\d{2}).\d+]</em></p><p><em>替换：$1</em></p></blockquote><p><code>注意：&quot;$1&quot;后面要加一个空格(英文)。</code></p><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151346330.jpg" alt=""></p><blockquote><p>代码作者：Aric</p></blockquote><p>并将选取好的歌词，粘贴到音乐文件就完成了。</p><h3 id="（我是范例-点我查看）"><a href="https://t.me/TESTLIVEUP">（我是范例-点我查看）</a></h3><div style="text-align:center; font-weight:bold; text-decoration:underline;">须知</div><blockquote><p>使用：“.FLAC“格式的音乐文件，有时候不能正常显示歌词时间轴，是正常的，所以你可能要转换特定的格式，如.mp3，或是.ogg 或.m4a 的歌曲。</p></blockquote><p>→ 如果你对音乐品质有极致追求，也有电脑 🖥️，我个人极度推荐使用 dBpowerAMP 这类型工具，将无损音乐格式转换成 m4a （水果的算法：QAAC 编码的音乐），目前可以<a href="https://telegra.ph/QAAC-%E5%8E%8B%E7%BC%A9%E9%9F%B3%E4%B9%90%E6%8A%80%E6%9C%AF%E8%AF%A6%E8%A7%A3-08-22">算是当今世界上最好的压缩算法，在通讯界享有盛名</a>，且压缩后可以到接近百分之百还原。（甚至连对音乐/声学研究的职业工作者都讚叹不已）笔者强烈推荐，只叹手机没有类似的软件。专门转成 QAAC 编码的。</p><h3 id="🖥️-电脑版-dBpowerAMP-下载-教学请点我"><a href="https://t.me/haoruanfenxianggroup/369211">🖥️ 电脑版 dBpowerAMP 下载/教学请点我</a></h3><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505151358822.jpg" alt="">​</p><hr><h3 id="拓展">拓展</h3><p>以上是原文内容，如果你改了音乐格式失去了原本的封面，歌手等等东西，一般来说是不妨碍什么的，如果你一定要改的话，可以使用<a href="https://t.me/kemiaosw_me/394">音乐标签</a>。具体使用很简单，我不多赘述，给个视频你就大致明白了：​</p><div style="text-align: center;">  <iframe src="https://player.bilibili.com/player.html?isOutside=true&amp;aid=615163818&amp;bvid=BV1Jh4y1g7PV&amp;cid=1175422578&amp;p=1"           scrolling="no"           border="0"           frameborder="no"           framespacing="0"           allowfullscreen="true"          style="width: 100%; max-width: 800px; height: 450px;">  </iframe></div><p>同时，如果你想更换音乐格式，有很多种方法，以下给一个<a href="https://convertio.co/zh/flac-m4a/">网站</a>。</p><hr><h3 id="原文链接">原文链接</h3><p><a href="https://telegra.ph/Telegram-Real-Time-sync-lyrics-05-14">https://telegra.ph/Telegram-Real-Time-sync-lyrics-05-14</a></p><p>‍</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;来将-Telegram-当音乐播放器吧！（寻找音乐、即时歌词、无损音乐不失真压缩）&quot;&gt;来将 Telegram 当音乐播放器吧！（寻找音乐、即时歌词、无损音乐不失真压缩）&lt;/h2&gt;
&lt;h3</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="音乐播放器" scheme="https://myboke.kemiaosw.top/tags/%E9%9F%B3%E4%B9%90%E6%92%AD%E6%94%BE%E5%99%A8/"/>
    
    <category term="Telegram" scheme="https://myboke.kemiaosw.top/tags/Telegram/"/>
    
  </entry>
  
  <entry>
    <title>资源分享：DROP</title>
    <link href="https://myboke.kemiaosw.top/posts/de9e.html"/>
    <id>https://myboke.kemiaosw.top/posts/de9e.html</id>
    <published>2025-05-09T12:48:30.000Z</published>
    <updated>2025-09-25T13:51:05.628Z</updated>
    
    <content type="html"><![CDATA[<h3 id="网站简介">网站简介</h3><p>DROP 是一个便捷的文件分享与托管平台，云存储工具，提供免费10GB的存储空间，支持大文件的快速上传与分享。</p><p>支持上传图片、视频、压缩文件和PDF，选择适合文件的文档后，点击拷贝链接即可直接获得分享链接。采用AI驱动技术，确保文件传输的高效性和安全性，同时提供简洁直观的用户界面，方便用户管理和分享文件。DROP 适用于个人用户和创作者，可轻松展示和分发作品</p><hr><h3 id="截图">截图</h3><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505092144042.png" alt=""></p><hr><h3 id="功能特色">功能特色</h3><ul><li><p><strong>免费10GB存储</strong>：新用户可免费享受10GB的存储空间，满足日常文件分享需求。</p></li><li><p><strong>大文件支持</strong>：支持大文件的快速上传与分享，适合分享高清视频、大型文档等。</p></li><li><p><strong>AI驱动</strong>：采用AI技术优化文件传输和管理，提升用户体验。</p></li><li><p><strong>隐私保护</strong>：提供文件访问控制，保护用户隐私和数据安全。</p></li><li><p><strong>简洁界面</strong>：直观的用户界面，易于上手，方便文件管理。</p></li><li><p><strong>多平台支持</strong>：支持多种设备和操作系统，方便随时随地访问文件。</p></li></ul><hr><h3 id="网站地址">网站地址</h3><p><a href="https://drop.space/">https://drop.space/</a></p><hr><p><strong>原文链接</strong>: <a href="https://www.appmiu.com/31115.html">https://www.appmiu.com/31115.html</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;网站简介&quot;&gt;网站简介&lt;/h3&gt;
&lt;p&gt;DROP</summary>
        
      
    
    
    
    <category term="资源分享" scheme="https://myboke.kemiaosw.top/categories/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="DROP" scheme="https://myboke.kemiaosw.top/tags/DROP/"/>
    
    <category term="托管平台" scheme="https://myboke.kemiaosw.top/tags/%E6%89%98%E7%AE%A1%E5%B9%B3%E5%8F%B0/"/>
    
  </entry>
  
  <entry>
    <title>tgtalk免费部署</title>
    <link href="https://myboke.kemiaosw.top/posts/7eae.html"/>
    <id>https://myboke.kemiaosw.top/posts/7eae.html</id>
    <published>2025-05-04T15:48:30.000Z</published>
    <updated>2025-09-25T13:51:05.628Z</updated>
    
    <content type="html"><![CDATA[<h2 id="部署-API">部署 API</h2><p>访问 <a href="https://gist.github.com/FloatSheep/55db67d9e8148149ebbcb0f9f6b0d901">Gist</a> 并获取其中所有代码</p><blockquote><p>需要注意，本 API Worker 脚本基于 ChenYFan 修改，包含了本项目需要使用的功能，请勿随意更改脚本内容<br>TGTalker-Frontend V2 的 API 不兼容 V1</p></blockquote><p>进入 <a href="https://dash.cloudflare.com">Cloudflare 仪表盘</a></p><p>选择创建应用程序 -&gt; 创建 Worker -&gt; 修改名称（部署）-&gt; 编辑代码</p><p>在其中粘贴你复制的所有代码，并且修改 ChannelName 为你的频道名称，部署并访问 Worker 查看是否能正确返回内容</p><p>接着你可以为你的 Worker 绑定一个域名</p><p><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505042340004.png" alt=""><br><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505042340138.png" alt=""><br><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/202505042340963.png" alt=""></p><p>保存，然后将你绑定的域名填入配置中的 api 项即可</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;部署-API&quot;&gt;部署 API&lt;/h2&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://gist.github.com/FloatSheep/55db67d9e8148149ebbcb0f9f6b0d901&quot;&gt;Gist&lt;/a&gt;</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="网站统计" scheme="https://myboke.kemiaosw.top/tags/%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1/"/>
    
    <category term="Umami" scheme="https://myboke.kemiaosw.top/tags/Umami/"/>
    
  </entry>
  
  <entry>
    <title>Waline评论在Vercel部署</title>
    <link href="https://myboke.kemiaosw.top/posts/838c.html"/>
    <id>https://myboke.kemiaosw.top/posts/838c.html</id>
    <published>2025-04-14T00:08:30.000Z</published>
    <updated>2025-09-25T13:51:05.628Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>使用Waline评论我喜欢使用的部署方法(个人认为最简便)</p></blockquote><h2 id="所需账号">所需账号</h2><ol><li>一个Github账号</li><li>一个Vercel账号</li><li>一个leancloud账号(最好是国际服的，你有了Github难道还用大陆的吗？大陆的要备案，故在这里不阐述，末尾放原文链接)</li></ol><hr><h2 id="在-leancloud-里创建数据库">在 leancloud 里创建数据库</h2><ol><li><p><a href="https://console.leancloud.app/login">登录</a> 或 <a href="https://console.leancloud.app/register">注册</a> <code>LeanCloud 国际版</code> 并进入 <a href="https://console.leancloud.app/apps">控制台</a></p></li><li><p>点击左上角 <a href="https://console.leancloud.app/apps">创建应用</a> 并起一个你喜欢的名字 (请选择免费的开发版):</p><p><img src="https://s2.loli.net/2025/04/14/7FOYbvS8MlQXe52.png" alt="创建应用"></p></li><li><p>进入应用，选择左下角的 <code>设置</code> &gt; <code>应用 Key</code>。你可以看到你的 <code>APP ID</code>,<code>APP Key</code> 和 <code>Master Key</code>。请记录它们，以便后续使用。</p><p><img src="https://s2.loli.net/2025/04/14/c1Vltvsm8GYXSbf.png" alt="ID 和 Key"></p></li></ol><hr><h2 id="在-Vercel-部署">在 Vercel 部署</h2><p><a href="https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwalinejs%2Fwaline%2Ftree%2Fmain%2Fexample"><img src="https://cdn.jsdelivr.net/gh/kmfx/tuchuang@main/img/vercel.svg" alt="Vercel"></a></p><ol><li><p>点击上方按钮，跳转至 Vercel 进行 Server 端部署。</p><p>如果你未登录的话，Vercel 会让你注册或登录，请使用 GitHub 账户进行快捷登录。</p></li><li><p>输入一个你喜欢的 Vercel 项目名称并点击 <code>Create</code> 继续:</p><p><img src="https://s2.loli.net/2025/04/14/XauJLO7hfcWVx2Y.png" alt="创建项目"></p></li><li><p>此时 Vercel 会基于 Waline 模板帮助你新建并初始化仓库，仓库名为你之前输入的项目名。</p><p><img src="https://s2.loli.net/2025/04/14/Q7tExaML3XKlf12.png" alt="deploy"></p><p>一两分钟后，满屏的烟花会庆祝你部署成功。此时点击 <code>Go to Dashboard</code> 可以跳转到应用的控制台。</p><p><img src="https://s2.loli.net/2025/04/14/HqfvwV6GdrFROSZ.png" alt="deploy"></p></li><li><p>点击顶部的 <code>Settings</code> - <code>Environment Variables</code> 进入环境变量配置页，并配置三个环境变量 <code>LEAN_ID</code>, <code>LEAN_KEY</code> 和 <code>LEAN_MASTER_KEY</code> 。它们的值分别对应上一步在 LeanCloud 中获得的 <code>APP ID</code>, <code>APP KEY</code>, <code>Master Key</code>。</p><p><img src="https://s2.loli.net/2025/04/14/9laMFio1umnjB6g.png" alt="设置环境变量"></p></li><li><p>环境变量配置完成之后点击顶部的 <code>Deployments</code> 点击顶部最新的一次部署右侧的 <code>Redeploy</code> 按钮进行重新部署。该步骤是为了让刚才设置的环境变量生效。</p><p><img src="https://s2.loli.net/2025/04/14/WkVxeRub73aIHBX.png" alt="redeploy"></p></li><li><p>此时会跳转到 <code>Overview</code> 界面开始部署，等待片刻后 <code>STATUS</code> 会变成 <code>Ready</code>。此时请点击 <code>Visit</code> ，即可跳转到部署好的网站地址，此地址即为你的服务端地址。</p><p><img src="https://s2.loli.net/2025/04/14/xM8rEezGTqFQNCY.png" alt="redeploy success"></p></li></ol><h2 id="绑定域名-可选">绑定域名 (可选)</h2><ol><li><p>点击顶部的 <code>Settings</code> - <code>Domains</code> 进入域名配置页</p></li><li><p>输入需要绑定的域名并点击 <code>Add</code></p><p><img src="https://s2.loli.net/2025/04/14/9wHyLEWQOtvz1fA.png" alt="Add domain"></p></li><li><p>在域名服务器商处添加新的 <code>CNAME</code> 解析记录</p><table><thead><tr><th>Type</th><th>Name</th><th>Value</th></tr></thead><tbody><tr><td>CNAME</td><td>example</td><td><a href="http://cname.vercel-dns.com">cname.vercel-dns.com</a>(国区的可用 <a href="http://cname-china.vercel-dns.com">cname-china.vercel-dns.com</a>)</td></tr></tbody></table></li><li><p>等待生效，你可以通过自己的域名来访问了。</p><ul><li>评论系统：<a href="http://example.yourdomain.com">example.yourdomain.com</a></li><li>评论管理：<a href="http://example.yourdomain.com/ui">example.yourdomain.com/ui</a></li></ul><p><img src="https://s2.loli.net/2025/04/14/4BOxqfs16erKTMV.png" alt="success"></p></li></ol><h2 id="HTML-引入-客户端">HTML 引入 (客户端)</h2><p>在你的网页中进行如下设置:</p><ol><li><p>导入 Waline 样式 <code>https://unpkg.com/@waline/client@v3/dist/waline.css</code>。</p></li><li><p>创建 <code>&lt;script&gt;</code> 标签使用来自 <code>https://unpkg.com/@waline/client@v3/dist/waline.js</code> 的 <code>init()</code> 函数初始化，并传入必要的 <code>el</code> 与 <code>serverURL</code> 选项。</p><ul><li><code>el</code> 选项是 Waline 渲染使用的元素，你可以设置一个字符串形式的 CSS 选择器或者一个 HTMLElement 对象。</li><li><code>serverURL</code> 是服务端的地址，即上一步获取到的值。</li></ul><figure class="highlight html"><figcaption><span>&#123;3-7,12-18&#125;:line-numbers</span></figcaption><table><tr><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- ... --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">link</span></span></span><br><span class="line"><span class="tag">    <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">href</span>=<span class="string">&quot;https://unpkg.com/@waline/client@v3/dist/waline.css&quot;</span></span></span><br><span class="line"><span class="tag">  /&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- ... --&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">  <span class="comment">&lt;!-- ... --&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;waline&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;module&quot;</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">import</span> &#123; init &#125; <span class="keyword">from</span> <span class="string">&#x27;https://unpkg.com/@waline/client@v3/dist/waline.js&#x27;</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="title function_">init</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">      <span class="attr">el</span>: <span class="string">&#x27;#waline&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">      <span class="attr">serverURL</span>: <span class="string">&#x27;https://your-domain.vercel.app&#x27;</span>,</span></span><br><span class="line"><span class="language-javascript">    &#125;)</span></span><br><span class="line"><span class="language-javascript">  </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>评论服务此时就会在你的网站上成功运行。</p></li></ol><h2 id="评论管理-管理端">评论管理 (管理端)</h2><ol><li>部署完成后，请访问 <code>&lt;serverURL&gt;/ui/register</code> 进行注册。首个注册的人会被设定成管理员。</li><li>管理员登陆后，即可看到评论管理界面。在这里可以修改、标记或删除评论。</li><li>用户也可通过评论框注册账号，登陆后会跳转到自己的档案页。</li></ol><h2 id="视频教程">视频教程</h2><p>以下是热心用户制作的视频教程，以上操作不清楚的也可以参考一二。</p><h3 id="Waline-部署教程（快速上手）">Waline 部署教程（快速上手）</h3><blockquote><p>UP 主：<a href="https://space.bilibili.com/381992209">rickroll 摇</a></p></blockquote><iframe src="//player.bilibili.com/player.html?isOutside=true&aid=603711299&bvid=BV1pB4y1E7fp&cid=851182849&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe><h3 id="使用-Vercel-简单地部署-Waline-评论系统">使用 Vercel 简单地部署 Waline 评论系统</h3><blockquote><p>UP 主：<a href="https://space.bilibili.com/355877984">岚天呀</a></p></blockquote><iframe src="//player.bilibili.com/player.html?isOutside=true&aid=986143204&bvid=BV1Ft4y1A73f&cid=851363812&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe><hr><h2 id="以上为部分修改原文">以上为部分修改原文</h2><p>原文链接: <a href="https://waline.js.org/guide/get-started/">https://waline.js.org/guide/get-started/</a></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;使用Waline评论我喜欢使用的部署方法(个人认为最简便)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="评论" scheme="https://myboke.kemiaosw.top/tags/%E8%AF%84%E8%AE%BA/"/>
    
    <category term="Waline" scheme="https://myboke.kemiaosw.top/tags/Waline/"/>
    
  </entry>
  
  <entry>
    <title>Umami博客访问统计Vercel+Cloudflare Wokers部署</title>
    <link href="https://myboke.kemiaosw.top/posts/6a61.html"/>
    <id>https://myboke.kemiaosw.top/posts/6a61.html</id>
    <published>2025-04-06T15:25:55.000Z</published>
    <updated>2025-09-25T13:51:05.628Z</updated>
    
    <content type="html"><![CDATA[<h2 id="第一部分：Vercel-Umami">第一部分：Vercel+Umami</h2><ol><li><p>第一步<br>1.1 <kbd>Fork</kbd>​<a href="https://github.com/umami-software/umami">umami</a>到自己的Github仓库</p><pre><code>![](https://s2.loli.net/2025/04/06/c4xDVNrsBpTM8YZ.webp)1.2 创建项目</code></pre><p><img src="https://s2.loli.net/2025/04/06/GX9OdivuxF5pJzH.webp" alt=""></p></li><li><p>第二步</p></li></ol><p>2.1 创建<a href="https://vercel.com/login">Verce</a>l账号，这里我就省略了，因为GitHub可以直接进行授权即可。</p><p>2.2 在你授权以后，首先创建<kbd>Postgres</kbd>数据库，直接一路下一步，创建好就行，可以给下面的连接复制出来</p><p><img src="https://s2.loli.net/2025/04/06/K69FpfmjZxcu3Ad.webp" alt=""></p><p><img src="https://s2.loli.net/2025/04/06/7OieEKGht4kgSux.webp" alt=""></p><p>点击<kbd>Copy Snippet</kbd>​,就可以，记住在粘贴的时候是我画线里面的部分，双引号都不需要 ，因为要设置环境变量。</p><p>2.3 在创建好数据库以后，回到主页面的<kbd>Overview</kbd>​，然后右上角有一个<kbd>Add New</kbd>​选择添加<kbd>Project</kbd>​，选择你<kbd>Fork</kbd>​的<kbd>umami</kbd>​，添加即可。<br>2.4 设置环境变量，<code>DATABASE_URL</code>​和<code>HASH_SALT</code>​和<code>TRACKER_SCRIPT_NAME</code>​，其中<code>DATABASE_URL</code>​的值就是上面划线的部分，其他的两个环境变量都是对应的值是String自己可以随意定义。<br>　　 2.5 设置好以后点击<kbd>Deploy</kbd>​，等待大约两分钟左右，自动部署完成，部署完成以后可以通过下图种面板上面给的链接可以直接访问。</p><p><img src="https://s2.loli.net/2025/04/06/ahX2wHLrfYAD7ZW.webp" alt=""></p><p>2.6 打开以后会跳出登录地址，默认的登录密码是<kbd>adminumami</kbd>​，登录进去以后，设置给自己密码修改了，然后就是设置里面添加网站，给你要统计的网站添加进去，到此，别人访问你的网站你可以通过面板看到统计数据了。</p><h2 id="第二部分：Umami-Cloudflare-worker这一部分主要是让你的博客上面能展示的访问数据，效果如下：">第二部分：Umami+Cloudflare worker这一部分主要是让你的博客上面能展示的访问数据，效果如下：</h2><p><img src="https://s2.loli.net/2025/04/06/fR71aFG4oMD29Pz.webp" alt="image"></p><ol><li>注册<kbd>CloudFlare</kbd>​账号，然后进去以后，选择<kbd>Workers</kbd>​和<kbd>Pages</kbd>​，点击<kbd>创建</kbd>​，再点击<kbd>部署</kbd>​</li></ol><p><img src="https://s2.loli.net/2025/04/06/CYojqdGHkiuFepQ.webp" alt=""></p><p><img src="https://s2.loli.net/2025/04/06/6B2rXxk4Uu71GQC.webp" alt=""></p><p>部署以后，进去点击编辑代码，将里面的代码进行替换：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">addEventListener(&#x27;fetch&#x27;, event =&gt; &#123;</span><br><span class="line">  event.respondWith(handleRequest(event));</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">const API_BASE_URL = &#x27;https://umami.yourdomain.com&#x27;;  // 替换你的刚才部署的umami的域名</span><br><span class="line">const TOKEN = &#x27;your_token&#x27;; // 获取的token</span><br><span class="line">const WEBSITE_ID = &#x27;your_website_id&#x27;; // 在umami添加网站的 webstie id</span><br><span class="line">const CACHE_KEY = &#x27;umami_cache&#x27;;</span><br><span class="line">const CACHE_TIME = 600; // Cache time in seconds</span><br><span class="line"></span><br><span class="line">async function fetchUmamiData(startAt, endAt) &#123;</span><br><span class="line">  const url = `$&#123;API_BASE_URL&#125;/api/websites/$&#123;WEBSITE_ID&#125;/stats?startAt=$&#123;startAt&#125;&amp;endAt=$&#123;endAt&#125;`;</span><br><span class="line">  const response = await fetch(url, &#123;</span><br><span class="line">    headers: &#123;</span><br><span class="line">      &#x27;Authorization&#x27;: `Bearer $&#123;TOKEN&#125;`,</span><br><span class="line">      &#x27;Content-Type&#x27;: &#x27;application/json&#x27;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  if (!response.ok) &#123;</span><br><span class="line">    console.error(`Error fetching data: $&#123;response.statusText&#125;`);</span><br><span class="line">    return null;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  return response.json();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">async function handleRequest(event) &#123;</span><br><span class="line">  const cache = await caches.open(CACHE_KEY);</span><br><span class="line">  const cachedResponse = await cache.match(event.request);</span><br><span class="line"></span><br><span class="line">  if (cachedResponse) &#123;</span><br><span class="line">    return cachedResponse;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  const now = Date.now();</span><br><span class="line">  const todayStart = new Date(now).setHours(0, 0, 0, 0);</span><br><span class="line">  const yesterdayStart = new Date(now - 86400000).setHours(0, 0, 0, 0);</span><br><span class="line">  const lastMonthStart = new Date(now).setMonth(new Date(now).getMonth() - 1);</span><br><span class="line">  const lastYearStart = new Date(now).setFullYear(new Date(now).getFullYear() - 1);</span><br><span class="line"></span><br><span class="line">  const [todayData, yesterdayData, lastMonthData, lastYearData] = await Promise.all([</span><br><span class="line">    fetchUmamiData(todayStart, now),</span><br><span class="line">    fetchUmamiData(yesterdayStart, todayStart),</span><br><span class="line">    fetchUmamiData(lastMonthStart, now),</span><br><span class="line">    fetchUmamiData(lastYearStart, now)</span><br><span class="line">  ]);</span><br><span class="line"></span><br><span class="line">  const responseData = &#123;</span><br><span class="line">    today_uv: todayData?.visitors?.value ?? null,</span><br><span class="line">    today_pv: todayData?.pageviews?.value ?? null,</span><br><span class="line">    yesterday_uv: yesterdayData?.visitors?.value ?? null,</span><br><span class="line">    yesterday_pv: yesterdayData?.pageviews?.value ?? null,</span><br><span class="line">    last_month_pv: lastMonthData?.pageviews?.value ?? null,</span><br><span class="line">    last_year_pv: lastYearData?.pageviews?.value ?? null</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  const jsonResponse = new Response(JSON.stringify(responseData), &#123;</span><br><span class="line">    headers: &#123;</span><br><span class="line">      &#x27;Content-Type&#x27;: &#x27;application/json&#x27;,</span><br><span class="line">      &#x27;Access-Control-Allow-Origin&#x27;: &#x27;*&#x27;,</span><br><span class="line">      &#x27;Access-Control-Allow-Methods&#x27;: &#x27;GET, POST, PUT, DELETE, OPTIONS&#x27;,</span><br><span class="line">      &#x27;Access-Control-Allow-Headers&#x27;: &#x27;Content-Type, Authorization&#x27;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line"></span><br><span class="line">  event.waitUntil(cache.put(event.request, jsonResponse.clone()));</span><br><span class="line"></span><br><span class="line">  return jsonResponse;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但是里面有几个比较重要的参数需要修改<code>API_BASE_URL</code>​、<code>TOKEN</code>​、<code>WEBSITE_ID</code>​其中<code>API_BASE_URL</code>​和<code>WEBSITE_ID</code>​已经是有的，<code>WEBSITE_ID</code>​在<kbd>umami</kbd>​中的设置，选择你已经添加好的网站，点击<kbd>编辑</kbd>​，会出现网站的<code>WEBSITE_ID</code>​：</p><p><img src="https://s2.loli.net/2025/04/06/eFHEYB45nQOUAML.webp" alt=""></p><p>2.2 获取<kbd>token</kbd>​，在想<kbd>api</kbd>​测试网站，<a href="https://hoppscotch.io/">hoppscotch</a>，跳转到这个页面以后，如下图所示</p><p><img src="https://s2.loli.net/2025/04/06/vXrQmtpu4HdIasN.webp" alt=""></p><p>2.2.1 请求方式选择<kbd>post</kbd>​，链接填写方式是：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">https://你的umami域名或者是链接/api/auth/login</span><br></pre></td></tr></table></figure><p>2.2.2 请求体选择<kbd>Body</kbd>​参数格式选择<kbd>application/json</kbd>​</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line"> &quot;username&quot;:&quot;用户名&quot;,</span><br><span class="line"> &quot;password&quot;:&quot;密码&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>2.2.3 返回结果中<kbd>token</kbd>​里面的内容就是需要的<kbd>token</kbd>​</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;token&quot;: &quot;你的token&quot;, # 你需要记录下来的内容</span><br><span class="line">  &quot;user&quot;: &#123;</span><br><span class="line">    &quot;id&quot;: &quot;41e2b680-648e-4b09-bcd7-3e2b10c06264&quot;,</span><br><span class="line">    &quot;username&quot;: &quot;admin&quot;,</span><br><span class="line">    &quot;role&quot;: &quot;admin&quot;,</span><br><span class="line">    &quot;createdAt&quot;: &quot;2024-11-12T09:18:12.766Z&quot;,</span><br><span class="line">    &quot;isAdmin&quot;: true</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>到这里，你部署<code>api</code>​所需要的所有参数内容都已经有了，给替换进去即可。</p><p>2.3 测试在你部署好以后，会有一个链接，当然你如果是用<kbd>cloudflare</kbd>​代理你的域名，可以直接进行关联。</p><p><img src="https://s2.loli.net/2025/04/07/IPCS2rhLbiaX3G8.webp" alt=""></p><p>然后点击或则是复制粘贴到浏览器，请求以后会出来下面的结果：</p><p><img src="https://s2.loli.net/2025/04/07/M9wsiYKBoGyLI8T.webp" alt=""></p><p>如果没有结果，建议你先去你部署的umami面板里面看看有没有数据，有数据的情况下，这里请求都会有数据的，清理浏览器缓存开代理在测试。</p><h2 id="第三部分：添加博客统计">第三部分：添加博客统计</h2><p>将数据添加到<kbd>about</kbd>​页面</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tj: # 统计</span><br><span class="line">  provider: custom # custom</span><br><span class="line">  url: 你的数据接口地址</span><br><span class="line">  img: https://7.isyangs.cn/1/65eb2e9109826-1.png # 背景</span><br><span class="line">  desc: # 卡片左下角描述</span><br></pre></td></tr></table></figure><p>配置完成~</p><p>感谢<a href="https://blog.starsharbor.com/">starsharbor</a>大佬博客的指导，<a href="https://blog.starsharbor.com/posts/solitude-about_umami/">原文</a></p><hr><h2 id="作者原文">作者原文</h2><p>作者: Couture<br>链接: <a href="https://www.coutures.top/posts/27233.html">https://www.coutures.top/posts/27233.html</a><br>来源: Couture<br>著作权归作者所有。 商业转载请联系作者获得授权，非商业转载请注明出处。</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;第一部分：Vercel-Umami&quot;&gt;第一部分：Vercel+Umami&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;第一步&lt;br&gt;
1.1 &lt;kbd&gt;Fork&lt;/kbd&gt;​&lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="网站统计" scheme="https://myboke.kemiaosw.top/tags/%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1/"/>
    
    <category term="Umami" scheme="https://myboke.kemiaosw.top/tags/Umami/"/>
    
  </entry>
  
  <entry>
    <title>Git 同步上游仓库的更新</title>
    <link href="https://myboke.kemiaosw.top/posts/5a29.html"/>
    <id>https://myboke.kemiaosw.top/posts/5a29.html</id>
    <published>2025-04-04T12:13:15.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Git-同步上游仓库的更新">Git 同步上游仓库的更新</h2><p>使用一个 Github Template 创建了我自己的仓库，需要同步一下补丁更新，总不能自己手抄一遍吧，搜了一下解决方案。</p><p>记录一下。</p><h3 id="添加上游仓库">添加上游仓库</h3><p>给上游仓库取个名字，如果将命名为 <code>upstream</code>​ ，可以在本地仓库中运行以下命令：</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git remote add upstream https://github.com/$&lt;upstream-repo&gt;.git</span><br></pre></td></tr></table></figure><h3 id="获取上游仓库的更改">获取上游仓库的更改</h3><p>运行以下命令以获取上游仓库中的所有分支和提交：</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git fetch upstream</span><br></pre></td></tr></table></figure><h3 id="合并上游更改">合并上游更改</h3><p>现在，将上游 main 分支的更改合并到您的本地 main 分支：</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git merge upstream/main --allow-unrelated-histories</span><br></pre></td></tr></table></figure><p>如果只需要合并特定的 commit ：</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git cherry-pick &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure><p>也可以使用</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">gcp &lt;commit-hash&gt;</span><br></pre></td></tr></table></figure><p>commit-hash 可以直接从 github 网页上复制。</p><p>这时 commit 的作者是源仓库的作者， Vercel 提示我 Build 失败，需要升级到 Pro，可以再修改一个文件，自己添加一条 commit 。</p><p>当然这很不优雅，可以使用下面的命令获取更改到文件，但是不会提交 commit ，</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git cherry-pick &lt;commit-hash&gt; --no-commit</span><br></pre></td></tr></table></figure><p>然后手动提交一下</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git commit -m <span class="string">&quot;commit information&quot;</span></span><br></pre></td></tr></table></figure><h3 id="解决冲突">解决冲突</h3><p>如何自己已经修改过源代码，在合并过程中可能发生冲突，需要手动解决。<br>Git 也会进行提示，手动编辑冲突文件并保存，然后再提交更改。</p><h3 id="批量提交">批量提交</h3><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git cherry-pick &lt;起始提交&gt;^..&lt;结束提交&gt;</span><br></pre></td></tr></table></figure><p>如果有冲突会按照顺序处理，然后执行， continue 直到结束</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git cherry-pick --<span class="built_in">continue</span></span><br></pre></td></tr></table></figure><ul><li>​<code>&lt;起始提交&gt;</code>​：范围的开始点（不包含此提交，除非用 &lt;起始提交&gt;~ 或 &lt;起始提交&gt;^）。</li><li>​<code>&lt;结束提交&gt;</code>​：范围的结束点（包含此提交）。</li><li>​<code>^</code>​ 是 Git 的语法，用于指定“之前的提交”。</li><li>​<code>..</code>​ 表示范围。</li></ul><h3 id="推送">推送</h3><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git push origin main</span><br></pre></td></tr></table></figure><p>当然默认来说，并不会推送到新加入的 <code>upstream</code>​ ，直接 <code>git push</code>​ 即可</p><p>如果不再需要同步，可以删除上游的仓库</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line">git remote remove upstream</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h2 id=&quot;Git-同步上游仓库的更新&quot;&gt;Git 同步上游仓库的更新&lt;/h2&gt;
&lt;p&gt;使用一个 Github Template 创建了我自己的仓库，需要同步一下补丁更新，总不能自己手抄一遍吧，搜了一下解决方案。&lt;/p&gt;
&lt;p&gt;记录一下。&lt;/p&gt;
&lt;h3</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="同步" scheme="https://myboke.kemiaosw.top/tags/%E5%90%8C%E6%AD%A5/"/>
    
    <category term="git" scheme="https://myboke.kemiaosw.top/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Markdown 段落语法</title>
    <link href="https://myboke.kemiaosw.top/posts/4c9f.html"/>
    <id>https://myboke.kemiaosw.top/posts/4c9f.html</id>
    <published>2025-02-13T06:04:25.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原文位置: <a href="https://markdown.com.cn/basic-syntax/paragraphs.html">https://markdown.com.cn/basic-syntax/paragraphs.html</a></p></blockquote><h2 id="Markdown-段落">Markdown 段落</h2><p>要创建段落，请使用空白行将一行或多行文本进行分隔。</p><table><thead><tr><th>Markdown语法</th><th>HTML</th><th>预览效果</th></tr></thead><tbody><tr><td><code>I really like using Markdown.</code></td><td><code>&lt;p&gt;I really like using Markdown.&lt;/p&gt;</code></td><td><p>I really like using Markdown.</p></td></tr><tr><td><code>I think I'll use it to format all of my documents from now on.</code></td><td><code>&lt;p&gt;I think I'll use it to format all of my documents from now on.&lt;/p&gt;</code></td><td><p>I think I’ll use it to format all of my documents from now on.</p></td></tr></tbody></table><h2 id="段落（Paragraph）用法的最佳实践">段落（Paragraph）用法的最佳实践</h2><p>不要用空格（spaces）或制表符（ tabs）缩进段落。</p><table><thead><tr><th>✅  Do this</th><th>❌  Don’t do this</th></tr></thead><tbody><tr><td><code>Don't put tabs or spaces in front of your paragraphs.</code></td><td><code>    This can result in unexpected formatting problems.</code></td></tr><tr><td><code>Keep lines left-aligned like this.</code></td><td><code>  Don't add tabs or spaces in front of paragraphs.</code></td></tr></tbody></table>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原文位置: &lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="段落语法" scheme="https://myboke.kemiaosw.top/tags/%E6%AE%B5%E8%90%BD%E8%AF%AD%E6%B3%95/"/>
    
    <category term="markdown" scheme="https://myboke.kemiaosw.top/tags/markdown/"/>
    
  </entry>
  
  <entry>
    <title>Markdown-标题语法</title>
    <link href="https://myboke.kemiaosw.top/posts/7eae.html"/>
    <id>https://myboke.kemiaosw.top/posts/7eae.html</id>
    <published>2025-02-12T10:15:25.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原文位置: <a href="https://markdown.com.cn/basic-syntax/headings.html">https://markdown.com.cn/basic-syntax/headings.html</a></p></blockquote><h1>Markdown 标题语法</h1><p>要创建标题，请在单词或短语前面添加井号 (#) 。<code>#</code> 的数量代表了标题的级别。例如，添加三个 <code>#</code> 表示创建一个三级标题 (<code>&lt;h3&gt;</code>) (例如：<code>### My Header</code>)。</p><table><thead><tr><th>Markdown语法</th><th>HTML</th><th>预览效果</th></tr></thead><tbody><tr><td><code># Heading level 1</code></td><td>&lt;h1&gt;Heading level 1&lt;/h1&gt;</td><td><h1>Heading level 1</h1></td></tr><tr><td><code>## Heading level 2</code></td><td>&lt;h2&gt;Heading level 1&lt;/h2&gt;</td><td><h2>Heading level 2</h2></td></tr><tr><td><code>### Heading level 3</code></td><td>&lt;h3&gt;Heading level 1&lt;/h3&gt;</td><td><h3>Heading level 3</h3></td></tr><tr><td><code>#### Heading level 4</code></td><td>&lt;h4&gt;Heading level 1&lt;/h4&gt;</td><td><h4>Heading level 4</h4></td></tr><tr><td><code>##### Heading level 5</code></td><td>&lt;h5&gt;Heading level 1&lt;/h5&gt;</td><td><h5>Heading level 5</h5></td></tr><tr><td><code>###### Heading level 6</code></td><td>&lt;h6&gt;Heading level 1&lt;/h6&gt;</td><td><h6>Heading level 6</h6></td></tr></tbody></table><h2 id="可选语法">可选语法</h2><p>还可以在文本下方添加任意数量的 == 号来标识一级标题，或者 – 号来标识二级标题。</p><table><thead><tr><th>Markdown语法</th><th>HTML</th><th>预览效果</th></tr></thead><tbody><tr><td><code>Heading level 1</code><br> <code>===============</code></td><td>&lt;h1&gt;Heading level 1&lt;/h1&gt;</td><td><h1>Heading level 1</h1></td></tr><tr><td><code>Heading level 2</code><br><code>---------------</code></td><td>&lt;h2&gt;Heading level 2&lt;/h2&gt;</td><td><h2>Heading level 2</h2></td></tr></tbody></table><h2 id="最佳实践">最佳实践</h2><p>不同的 <strong>Markdown</strong> 应用程序处理 <code>#</code> 和标题之间的空格方式并不一致。为了兼容考虑，请用一个空格在 <code>#</code> 和标题之间进行分隔。</p><table><thead><tr><th>✅ Do this</th><th>❌ Don’t do this</th></tr></thead><tbody><tr><td><code># Here's a Heading</code></td><td><code>#Here's a Heading</code></td></tr></tbody></table>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原文位置: &lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="标题语法" scheme="https://myboke.kemiaosw.top/tags/%E6%A0%87%E9%A2%98%E8%AF%AD%E6%B3%95/"/>
    
    <category term="markdown" scheme="https://myboke.kemiaosw.top/tags/markdown/"/>
    
  </entry>
  
  <entry>
    <title>Markdown 速览表</title>
    <link href="https://myboke.kemiaosw.top/posts/d5cb.html"/>
    <id>https://myboke.kemiaosw.top/posts/d5cb.html</id>
    <published>2025-02-11T10:15:25.000Z</published>
    <updated>2025-09-25T13:51:05.627Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>原文位置: <a href="https://markdown.com.cn/cheat-sheet.html#%E6%80%BB%E8%A7%88">https://markdown.com.cn/cheat-sheet.html#总览</a></p></blockquote><h1>总览</h1><p>Markdown 速查表提供了所有 <strong>Markdown</strong><br>语法元素的基本解释。如果你想了解某些语法元素的更多信息，请参阅更详细的<br><strong>基本语法</strong> 和 <strong>扩展语法</strong>.</p><h2 id="基本语法">基本语法</h2><p>这些是 <strong>John Gruber</strong> 的原始设计文档中列出的元素。所有 <strong>Markdown</strong><br>应用程序都支持这些元素。</p><table><thead><tr><th>元素</th><th>Markdown 语法</th></tr></thead><tbody><tr><td>标题（Heading）</td><td># H1 一级标题<br/> ## H2 二级标题<br> ### H3 三级标题</td></tr><tr><td>粗体（Bold）</td><td>**bold text**</td></tr><tr><td>斜体（Italic）</td><td>*italicized text*</td></tr><tr><td>引用块（Blockquote）</td><td>&gt; blockquote</td></tr><tr><td>有序列表（Ordered List）</td><td>1. First item<br> 2. Second item<br> 3. Third item</td></tr><tr><td>无序列表（Unordered List）</td><td>- First item<br> - Second item<br> - Third item</td></tr><tr><td>代码（Code）</td><td>`code`</td></tr><tr><td>分隔线（Horizontal Rule）</td><td><code>---</code></td></tr><tr><td>链接（Link）</td><td>[title](<a href="https://www.example.com">https://www.example.com</a>)</td></tr><tr><td>图片（Image）</td><td>![alt text](image.jpg)</td></tr></tbody></table><h2 id="扩展语法">扩展语法</h2><p>这些元素通过添加额外的功能扩展了基本语法。但是，并非所有 <strong>Markdown</strong><br>应用程序都支持这些元素。</p><table><thead><tr><th style="text-align:left">元素</th><th style="text-align:left">Markdown 语法</th></tr></thead><tbody><tr><td style="text-align:left">表格（Table）</td><td style="text-align:left"><code>| Syntax | Description |</code><br><code>| ----------- | ----------- |</code><br><code>| Header | Title |</code><br><code>| Paragraph | Text |</code></td></tr><tr><td style="text-align:left">代码块（Fenced Code Block）</td><td style="text-align:left"><code>```</code><br><code>&#123;</code><br><code>&quot;firstName&quot;: &quot;John&quot;,</code><br><code>&quot;lastName&quot;: &quot;Smith&quot;,</code><br><code>&quot;age&quot;: 25</code><br><code>&#125;</code><br><code>```</code></td></tr><tr><td style="text-align:left">脚注（Footnote）</td><td style="text-align:left">Here’s a sentence with a footnote<code>[^1]</code><br><code>[^1]</code>: This is the footnote</td></tr><tr><td style="text-align:left">标题编号（Heading ID）</td><td style="text-align:left">### My Great Heading { #custom-id }</td></tr><tr><td style="text-align:left">定义列表（Definition List）</td><td style="text-align:left">term<br>: definition</td></tr><tr><td style="text-align:left">任务列表（Task List）</td><td style="text-align:left"><code>- [x] Write the press release</code><br><code>- [ ] Update the website</code><br><code>- [ ] Contact the media</code></td></tr></tbody></table>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;原文位置: &lt;a</summary>
        
      
    
    
    
    <category term="技术分享" scheme="https://myboke.kemiaosw.top/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="速查表" scheme="https://myboke.kemiaosw.top/tags/%E9%80%9F%E6%9F%A5%E8%A1%A8/"/>
    
    <category term="markdown" scheme="https://myboke.kemiaosw.top/tags/markdown/"/>
    
  </entry>
  
</feed>
