<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>叶泯希·杂七杂八的🐕窝</title>
  
  <subtitle>在不知所措的年龄，什么都不尽人意。</subtitle>
  <link href="https://one.blog.418121.xyz/feed.xml" rel="self"/>
  
  <link href="https://one.blog.418121.xyz/"/>
  <updated>2026-03-25T12:54:39.000Z</updated>
  <id>https://one.blog.418121.xyz/</id>
  
  <author>
    <name>叶泯希</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>放学打球</title>
    <link href="https://one.blog.418121.xyz/posts/5aef4efe.html"/>
    <id>https://one.blog.418121.xyz/posts/5aef4efe.html</id>
    <published>2026-03-25T12:54:39.000Z</published>
    <updated>2026-03-25T12:54:39.000Z</updated>
    
    <content type="html"><![CDATA[<p>以前职高的时候，放学老是去打球，现在都没打过了，那时候作业少，疫情也早放学，也不回家就跟兄弟们一起去球场打，每天都玩到天黑才回家，周五甚至是玩完回去吃完饭接着来完，那时候精力根本花不完，现在不及之前的百分之一。把兄弟的鞋子放在蓝框上，也用来投篮。单挑谁输了抬他去磨灯柱。有时候聚在一起八卦学校里的事情，某个谁谁跟谁谈恋爱，某个老师家里干嘛的开的什么车，还有初中或者小学的趣事。美好总是短暂的，天下没有不散场的宴席，但各自都在向美好的生活奋进。时间好快啊，一眨眼就是四年后，想打球了，但凑不到人了。<br>人无法同时拥有青春和青春的感受。</p><p><img src="https://images.418121.xyz/file/blog/camera/2026/03/25/01.webp" alt="光圈:1.8, 快门:1&#x2F;250秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2026/03/25/02.webp" alt="光圈:1.8, 快门:1&#x2F;1429秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2026/03/25/03.webp" alt="光圈:1.8, 快门:1&#x2F;588秒, ISO56"></p><p style="text-align: center;">🌏摄于：广东 2022-03-01</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">回忆职高时期放学后。</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="校园" scheme="https://one.blog.418121.xyz/tags/%E6%A0%A1%E5%9B%AD/"/>
    
    <category term="学生时代" scheme="https://one.blog.418121.xyz/tags/%E5%AD%A6%E7%94%9F%E6%97%B6%E4%BB%A3/"/>
    
    <category term="光与影" scheme="https://one.blog.418121.xyz/tags/%E5%85%89%E4%B8%8E%E5%BD%B1/"/>
    
    <category term="原来梦回高中是这样的" scheme="https://one.blog.418121.xyz/tags/%E5%8E%9F%E6%9D%A5%E6%A2%A6%E5%9B%9E%E9%AB%98%E4%B8%AD%E6%98%AF%E8%BF%99%E6%A0%B7%E7%9A%84/"/>
    
  </entry>
  
  <entry>
    <title>因 LeanCloud 停止对外服务，对数据迁移至 Vercel 。</title>
    <link href="https://one.blog.418121.xyz/posts/88731518.html"/>
    <id>https://one.blog.418121.xyz/posts/88731518.html</id>
    <published>2026-03-25T12:53:35.000Z</published>
    <updated>2026-03-25T12:53:35.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><a href="%E5%81%9C%E6%AD%A2%E5%AF%B9%E5%A4%96%E6%8F%90%E4%BE%9B%E6%9C%8D%E5%8A%A1%E7%9A%84%E9%80%9A%E7%9F%A5,https://docs.leancloud.app/sdk/announcements/sunset-announcement/" title="" target="">LeanCloud 团队,关于 LeanCloud</a><p>相信大家都知道了，<code>LeanCloud</code> 将于 2027 年 1 月 12 日停止对外提供服务，本站有俩个服务依赖着 <code>LeanCloud</code> 服务，今天有空把它们都迁移一下。</p><h2 id="一-Do-you-like-me-小组将"><a href="#一-Do-you-like-me-小组将" class="headerlink" title="一. Do you like me 小组将"></a>一. Do you like me 小组将</h2><h3 id="1-部署"><a href="#1-部署" class="headerlink" title="1. 部署"></a>1. 部署</h3><ol><li><p><a href="https://vercel.com/new/clone?repository-url=https://github.com/5ime/likeMe">单击此处 一键部署 Deploy with Vercel</a>。<br> <a href="https://github.com/5ime/likeMe">项目地址https://github.com/5ime/likeMe</a><br> <img src="https://images.418121.xyz/file/blog/play/04/01.webp" alt="一直下一步就行了"></p></li><li><p>成功后去仪表盘，切换至 <code>Storage</code> 创建数据库并连接。<br> <img src="https://images.418121.xyz/file/blog/play/04/02.webp" alt="选择Storage"><br> <img src="https://images.418121.xyz/file/blog/play/04/03.webp" alt="创建数据库"><br> <img src="https://images.418121.xyz/file/blog/play/04/04.webp" alt="起名字"></p></li><li><p>连接成功去检查环境变量，选择项目的  <code>Project Settings</code> 找到 <code>Environment Variables</code> 检查环境变量是否存在 <code>POSTGRES_URL</code> 。<br> <img src="https://images.418121.xyz/file/blog/play/04/05.webp" alt="为项目绑定刚刚创建的数据库"><br> <img src="https://images.418121.xyz/file/blog/play/04/06.webp" alt="检查环境变量"></p></li><li><p>重新部署。<br> <img src="https://images.418121.xyz/file/blog/play/04/07.webp" alt="右上角三个点"></p></li><li><p>检验是否数据库连接成功。</p> <figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">最简单的方式：访问一次接口触发建表，然后再看是否能正常返回。</span><br><span class="line"></span><br><span class="line">GET /healthz：服务是否存活（返回 ok）</span><br><span class="line">GET /info：会读取数据库并返回当前点赞数</span><br><span class="line">如果数据库连不上，你通常会在 Vercel 的 Logs 里看到与连接/鉴权相关的报错（例如环境变量缺失、连接串无效等）。</span><br><span class="line"></span><br><span class="line">本项目会在首次请求时自动建表（like_count / like_user），无需手动建表。</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li><p>至此部署部分就应该结束了，以下是我的示例 Demo 。<br> <img src="https://images.418121.xyz/file/blog/play/04/08.webp" alt="Demo"></p> <a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,Demo,https://like.api.418121.xyz/demo/" title="" target=""></a></li><li><p>用法请参考之前的文章。</p> <a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E4%BE%A7%E8%BE%B9%E6%A0%8F%E2%80%94%E2%80%94Solitude%E4%B8%BB%E9%A2%98,https://blog.418121.xyz/posts/dca7dbdb.html" title="" target=""></a> <a href="%E5%B0%8F%E7%BB%84%E4%BB%B6,https://blog.418121.xyz/posts/c88f8d39.html" title="" target="">叶泯希,给自己的网站加上Do you like me</a></li><li><p>题外话，这里为了适配主题的 <code>pjax</code> 我对 <code>likeme.js</code> 进行修改，以便切换页面时失效。</p> <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> likeMe=(<span class="function">()=&gt;</span>&#123;<span class="keyword">let</span> instance;<span class="keyword">let</span> initialCallOptions=<span class="literal">null</span>;<span class="keyword">let</span> retryCount=<span class="number">0</span>;<span class="keyword">const</span> <span class="variable constant_">MAX_RETRIES</span>=<span class="number">20</span>;<span class="keyword">const</span> <span class="variable constant_">RETRY_INTERVAL</span>=<span class="number">50</span>;<span class="keyword">function</span> <span class="title function_">tryInitializeInstance</span>(<span class="params">options</span>)&#123;<span class="keyword">const</span> targetElement=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(options.<span class="property">el</span>);<span class="keyword">if</span>(targetElement)&#123;instance=<span class="keyword">new</span> <span class="title class_">LikeMeSingleton</span>(options);instance.<span class="title function_">reinitialize</span>(options.<span class="property">el</span>);initialCallOptions=<span class="literal">null</span>;retryCount=<span class="number">0</span>&#125;<span class="keyword">else</span> <span class="keyword">if</span>(retryCount&lt;<span class="variable constant_">MAX_RETRIES</span>)&#123;<span class="variable language_">console</span>.<span class="title function_">warn</span>(<span class="string">`LikeMe: Target element <span class="subst">$&#123;options.el&#125;</span> not found yet. Retrying in <span class="subst">$&#123;RETRY_INTERVAL&#125;</span>ms (attempt <span class="subst">$&#123;retryCount+<span class="number">1</span>&#125;</span>/<span class="subst">$&#123;MAX_RETRIES&#125;</span>).`</span>);retryCount++;<span class="built_in">setTimeout</span>(<span class="function">()=&gt;</span><span class="title function_">tryInitializeInstance</span>(options),<span class="variable constant_">RETRY_INTERVAL</span>)&#125;<span class="keyword">else</span>&#123;<span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`LikeMe: Target element <span class="subst">$&#123;options.el&#125;</span> not found after <span class="subst">$&#123;MAX_RETRIES&#125;</span> retries. Initialization failed.`</span>);initialCallOptions=<span class="literal">null</span>;retryCount=<span class="number">0</span>&#125;&#125;<span class="keyword">return</span> <span class="function"><span class="params">options</span>=&gt;</span>&#123;<span class="keyword">if</span>(!instance)&#123;<span class="keyword">if</span>(!initialCallOptions)&#123;initialCallOptions=options&#125;;<span class="title function_">tryInitializeInstance</span>(initialCallOptions)&#125;<span class="keyword">else</span>&#123;instance.<span class="property">url</span>=options.<span class="property">serverURL</span>||instance.<span class="property">url</span>;instance.<span class="property">color</span>=options.<span class="property">color</span>||instance.<span class="property">color</span>;instance.<span class="title function_">reinitialize</span>(options.<span class="property">el</span>)&#125;<span class="keyword">return</span> instance&#125;&#125;)();<span class="keyword">class</span> <span class="title class_">LikeMeSingleton</span>&#123;<span class="title function_">constructor</span>(<span class="params">&#123;el,serverURL,color=<span class="string">&#x27;#ff9797&#x27;</span>&#125;</span>)&#123;<span class="title class_">Object</span>.<span class="title function_">assign</span>(<span class="variable language_">this</span>,&#123;el,<span class="attr">url</span>:serverURL,color&#125;);<span class="variable language_">this</span>.<span class="property">isLiking</span>=<span class="literal">false</span>&#125;<span class="keyword">async</span> <span class="title function_">reinitialize</span>(<span class="params">newEl=<span class="variable language_">this</span>.el</span>)&#123;<span class="variable language_">this</span>.<span class="property">el</span>=newEl;<span class="keyword">const</span> currentElement=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="variable language_">this</span>.<span class="property">el</span>);<span class="keyword">if</span>(currentElement)&#123;currentElement.<span class="property">innerHTML</span>=<span class="string">&#x27;&#x27;</span>&#125;<span class="keyword">else</span>&#123;<span class="variable language_">console</span>.<span class="title function_">warn</span>(<span class="string">`LikeMe target element <span class="subst">$&#123;<span class="variable language_">this</span>.el&#125;</span> not found during reinitialization. Skipping render.`</span>);<span class="keyword">return</span>&#125;<span class="keyword">try</span>&#123;<span class="keyword">await</span> <span class="variable language_">this</span>.<span class="title function_">renderUI</span>();<span class="variable language_">this</span>.<span class="title function_">attachEvents</span>();<span class="variable language_">this</span>.<span class="title function_">updateCount</span>()&#125;<span class="keyword">catch</span>(error)&#123;<span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;LikeMe reinitialize error:&#x27;</span>,error)&#125;&#125;<span class="keyword">async</span> <span class="title function_">init</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> <span class="variable language_">this</span>.<span class="title function_">reinitialize</span>(<span class="variable language_">this</span>.<span class="property">el</span>)&#125;<span class="keyword">async</span> <span class="title function_">renderUI</span>(<span class="params"></span>)&#123;<span class="keyword">try</span>&#123;<span class="keyword">const</span> response=<span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="variable language_">this</span>.<span class="property">url</span>);<span class="keyword">const</span> html=<span class="keyword">await</span> response.<span class="title function_">text</span>();<span class="keyword">const</span> element=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="variable language_">this</span>.<span class="property">el</span>);<span class="keyword">if</span>(element)&#123;<span class="keyword">const</span> parser=<span class="keyword">new</span> <span class="title class_">DOMParser</span>();<span class="keyword">const</span> doc=parser.<span class="title function_">parseFromString</span>(html,<span class="string">&#x27;text/html&#x27;</span>);element.<span class="property">innerHTML</span>=doc.<span class="property">body</span>.<span class="property">innerHTML</span>;<span class="keyword">const</span> card=element.<span class="title function_">querySelector</span>(<span class="string">&#x27;.likeCard&#x27;</span>);<span class="keyword">if</span>(card)&#123;card.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;background-color&#x27;</span>,<span class="variable language_">this</span>.<span class="property">color</span>)&#125;&#125;&#125;<span class="keyword">catch</span>(error)&#123;<span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;Render UI error:&#x27;</span>,error)&#125;&#125;<span class="title function_">attachEvents</span>(<span class="params"></span>)&#123;<span class="keyword">const</span> card=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.el&#125;</span> .likeCard`</span>);<span class="keyword">if</span>(card)&#123;card.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>,<span class="function">()=&gt;</span><span class="variable language_">this</span>.<span class="title function_">handleLike</span>())&#125;&#125;<span class="keyword">async</span> <span class="title function_">updateCount</span>(<span class="params"></span>)&#123;<span class="keyword">try</span>&#123;<span class="keyword">const</span> response=<span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.url&#125;</span>/info`</span>);<span class="keyword">const</span> data=<span class="keyword">await</span> response.<span class="title function_">json</span>().<span class="title function_">catch</span>(<span class="function">()=&gt;</span><span class="literal">null</span>);<span class="keyword">if</span>(response.<span class="property">ok</span>&amp;&amp;data)&#123;<span class="keyword">const</span> count=data.<span class="property">data</span>?.<span class="property">count</span>||<span class="number">0</span>;<span class="keyword">const</span> textElement=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.el&#125;</span> .likeCard-text`</span>);<span class="keyword">if</span>(textElement)&#123;textElement.<span class="property">textContent</span>=<span class="string">`❤ <span class="subst">$&#123;count&#125;</span>`</span>&#125;&#125;&#125;<span class="keyword">catch</span>(error)&#123;<span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;Update count error:&#x27;</span>,error)&#125;&#125;<span class="title function_">setUIState</span>(<span class="params">isLoading,text,isSuccess=<span class="literal">false</span></span>)&#123;<span class="keyword">const</span> card=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.el&#125;</span> .likeCard`</span>);<span class="keyword">const</span> textElement=<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.el&#125;</span> .likeCard-text`</span>);<span class="keyword">if</span>(card&amp;&amp;textElement)&#123;card.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;loading&#x27;</span>,<span class="string">&#x27;success&#x27;</span>);<span class="keyword">if</span>(isLoading)&#123;card.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;loading&#x27;</span>)&#125;<span class="keyword">else</span> <span class="keyword">if</span>(isSuccess)&#123;card.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;success&#x27;</span>)&#125;textElement.<span class="property">textContent</span>=text&#125;&#125;<span class="keyword">async</span> <span class="title function_">handleLike</span>(<span class="params"></span>)&#123;<span class="keyword">if</span>(<span class="variable language_">this</span>.<span class="property">isLiking</span>)<span class="keyword">return</span>;<span class="variable language_">this</span>.<span class="property">isLiking</span>=<span class="literal">true</span>;<span class="variable language_">this</span>.<span class="title function_">setUIState</span>(<span class="literal">true</span>,<span class="string">&#x27;❤ 爱意传递中...&#x27;</span>);<span class="keyword">try</span>&#123;<span class="keyword">const</span> response=<span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">`<span class="subst">$&#123;<span class="variable language_">this</span>.url&#125;</span>/like`</span>);<span class="keyword">const</span> payload=<span class="keyword">await</span> response.<span class="title function_">json</span>().<span class="title function_">catch</span>(<span class="function">()=&gt;</span><span class="literal">null</span>);<span class="keyword">if</span>(!payload)&#123;<span class="variable language_">this</span>.<span class="title function_">setUIState</span>(<span class="literal">false</span>,<span class="string">&#x27;❤ 网络错误&#x27;</span>);<span class="built_in">setTimeout</span>(<span class="function">()=&gt;</span>&#123;<span class="variable language_">this</span>.<span class="title function_">updateCount</span>()&#125;,<span class="number">1500</span>);<span class="keyword">return</span>&#125;<span class="keyword">const</span>&#123;code,data=&#123;&#125;,msg&#125;=payload;<span class="keyword">const</span> count=data.<span class="property">count</span>||<span class="number">0</span>;<span class="keyword">if</span>(response.<span class="property">ok</span>&amp;&amp;code===<span class="string">&#x27;200&#x27;</span>)&#123;<span class="variable language_">this</span>.<span class="title function_">setUIState</span>(<span class="literal">false</span>,<span class="string">&#x27;❤ 传递成功~&#x27;</span>,<span class="literal">true</span>);<span class="built_in">setTimeout</span>(<span class="function">()=&gt;</span>&#123;<span class="variable language_">this</span>.<span class="title function_">setUIState</span>(<span class="literal">false</span>,<span class="string">`❤ <span class="subst">$&#123;count&#125;</span>`</span>)&#125;,<span class="number">500</span>);<span class="keyword">return</span>&#125;<span class="variable language_">this</span>.<span class="title function_">setUIState</span>(<span class="literal">false</span>,msg||<span class="string">&#x27;❤ 传递失败~&#x27;</span>);<span class="built_in">setTimeout</span>(<span class="function">()=&gt;</span>&#123;<span class="variable language_">this</span>.<span class="title function_">updateCount</span>()&#125;,<span class="number">1500</span>)&#125;<span class="keyword">catch</span>(error)&#123;<span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;Handle like error:&#x27;</span>,error);<span class="variable language_">this</span>.<span class="title function_">setUIState</span>(<span class="literal">false</span>,<span class="string">&#x27;❤ 网络错误&#x27;</span>);<span class="built_in">setTimeout</span>(<span class="function">()=&gt;</span>&#123;<span class="variable language_">this</span>.<span class="title function_">updateCount</span>()&#125;,<span class="number">1500</span>)&#125;<span class="keyword">finally</span>&#123;<span class="variable language_">this</span>.<span class="property">isLiking</span>=<span class="literal">false</span>&#125;&#125;&#125;</span><br></pre></td></tr></table></figure></li></ol><h3 id="2-数据迁移"><a href="#2-数据迁移" class="headerlink" title="2. 数据迁移"></a>2. 数据迁移</h3><ol><li><p>导出数据。<br> <img src="https://images.418121.xyz/file/blog/play/04/09.webp" alt="去LeanCloud导出所有数据并下载"></p></li><li><p>连接数据库（我这里以 <code>Navicat</code> 为例），你也可以用Neon自带的进行操作。<br> <img src="https://images.418121.xyz/file/blog/play/04/10.webp" alt="输入主机等连接数据库"></p></li><li><p>打开 <code>likeCount</code> 这个表来修改数据，这个数据从刚刚导出的文件中 <code>likeCount.0.jsonl</code> 查看，修改成一样的数值。<br> <img src="https://images.418121.xyz/file/blog/play/04/11.webp" alt="迁移数量成功"></p></li><li><p>进阶，把之前的ip地址和时间也直接导入。</p><ul><li>首先，先了解一下数据的结构。</li></ul> <figure class="highlight json"><figcaption><span>LeanCloud</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span><span class="attr">&quot;ACL&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span><span class="attr">&quot;*&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span><span class="attr">&quot;read&quot;</span><span class="punctuation">:</span><span class="literal"><span class="keyword">true</span></span><span class="punctuation">&#125;</span><span class="punctuation">&#125;</span><span class="punctuation">,</span><span class="attr">&quot;ip&quot;</span><span class="punctuation">:</span><span class="string">&quot;0.0.0.0&quot;</span><span class="punctuation">,</span><span class="attr">&quot;createdAt&quot;</span><span class="punctuation">:</span><span class="string">&quot;2024-11-06T05:24:53.869Z&quot;</span><span class="punctuation">,</span><span class="attr">&quot;updatedAt&quot;</span><span class="punctuation">:</span><span class="string">&quot;2024-11-06T05:24:53.869Z&quot;</span><span class="punctuation">,</span><span class="attr">&quot;objectId&quot;</span><span class="punctuation">:</span><span class="string">&quot;672afda5ff1aa61512697fa9&quot;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><ul><li>这是用ai生产的一个转换成sql语句的脚本。</li></ul> <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> readline = <span class="built_in">require</span>(<span class="string">&#x27;readline&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义输入和输出文件</span></span><br><span class="line"><span class="keyword">const</span> inputFilePath = <span class="string">&#x27;likeUser.0.jsonl&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> outputFilePath = <span class="string">&#x27;insert_like_user.sql&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建可读流和可写流</span></span><br><span class="line"><span class="keyword">const</span> readStream = fs.<span class="title function_">createReadStream</span>(inputFilePath);</span><br><span class="line"><span class="keyword">const</span> writeStream = fs.<span class="title function_">createWriteStream</span>(outputFilePath);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> rl = readline.<span class="title function_">createInterface</span>(&#123;</span><br><span class="line">    <span class="attr">input</span>: readStream,</span><br><span class="line">    <span class="attr">crlfDelay</span>: <span class="title class_">Infinity</span> <span class="comment">// 检测所有CRLF行尾</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> lineNumber = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">rl.<span class="title function_">on</span>(<span class="string">&#x27;line&#x27;</span>, <span class="function">(<span class="params">line</span>) =&gt;</span> &#123;</span><br><span class="line">    lineNumber++;</span><br><span class="line">    <span class="comment">// 跳过文件头注释行和空行</span></span><br><span class="line">    <span class="keyword">if</span> (line.<span class="title function_">startsWith</span>(<span class="string">&#x27;#&#x27;</span>) || line.<span class="title function_">trim</span>() === <span class="string">&#x27;&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> data = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(line);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> ip = data.<span class="property">ip</span>;</span><br><span class="line">        <span class="keyword">const</span> createdAt = data.<span class="property">createdAt</span>; <span class="comment">// e.g., &quot;2024-11-06T05:24:53.869Z&quot;</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// 从 createdAt 中提取日期部分作为 &#x27;day&#x27;</span></span><br><span class="line">        <span class="keyword">const</span> dateObj = <span class="keyword">new</span> <span class="title class_">Date</span>(createdAt);</span><br><span class="line">        <span class="keyword">const</span> day = dateObj.<span class="title function_">toISOString</span>().<span class="title function_">split</span>(<span class="string">&#x27;T&#x27;</span>)[<span class="number">0</span>]; <span class="comment">// YYYY-MM-DD</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// 构建 SQL INSERT 语句，使用 ON CONFLICT DO NOTHING</span></span><br><span class="line">        <span class="keyword">const</span> sql = <span class="string">`INSERT INTO &quot;public&quot;.&quot;like_user&quot; (&quot;ip&quot;, &quot;day&quot;, &quot;created_at&quot;) VALUES (&#x27;<span class="subst">$&#123;ip&#125;</span>&#x27;, &#x27;<span class="subst">$&#123;day&#125;</span>&#x27;, &#x27;<span class="subst">$&#123;createdAt&#125;</span>&#x27;) ON CONFLICT (&quot;ip&quot;, &quot;day&quot;) DO NOTHING;\n`</span>;</span><br><span class="line">        writeStream.<span class="title function_">write</span>(sql);</span><br><span class="line"></span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`Error parsing JSON on line <span class="subst">$&#123;lineNumber&#125;</span>: <span class="subst">$&#123;line&#125;</span>`</span>);</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(error);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">rl.<span class="title function_">on</span>(<span class="string">&#x27;close&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`Conversion complete. SQL INSERT statements (ignoring duplicates) written to <span class="subst">$&#123;outputFilePath&#125;</span>`</span>);</span><br><span class="line">    writeStream.<span class="title function_">end</span>(); <span class="comment">// 关闭输出文件流</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">readStream.<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="function">(<span class="params">err</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`Error reading input file: <span class="subst">$&#123;err.message&#125;</span>`</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">writeStream.<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="function">(<span class="params">err</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`Error writing output file: <span class="subst">$&#123;err.message&#125;</span>`</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul><li><p>将脚本的生产出来的文件打开，复制所有到新建查询里并运行，你也可以用Neon自带的进行操作。<br>  <img src="https://images.418121.xyz/file/blog/play/04/12.webp" alt="285条ip应总数数量285"><br>  <img src="https://images.418121.xyz/file/blog/play/04/13.webp" alt="可以用Neon自带的进行操作"></p></li><li><p>至此，完成所有数据迁移</p></li></ul></li></ol><h2 id="二-Waline-评论"><a href="#二-Waline-评论" class="headerlink" title="二. Waline 评论"></a>二. Waline 评论</h2><ol><li>去Waline的管理后台将所有数据导出。 <a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,Waline%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0,https://wl.api.418121.xyz/ui" title="" target=""></a> <img src="https://images.418121.xyz/file/blog/play/04/14.webp" alt="导出数据"></li><li>按照官方文档进行重新部署。 <a href="%E9%83%A8%E7%BD%B2,https://waline.js.org/guide/deploy/vercel.html" title="" target="">Waline,Vercel</a></li><li>导入刚刚导出来的数据。<br> <img src="https://images.418121.xyz/file/blog/play/04/15.webp" alt="导入数据"></li><li>最后，记得将之前的项目中的环境变量全部移至新项目中，可以使用命令更快。</li></ol><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%E5%B0%8F%E7%BB%84%E4%BB%B6,https://5ime.cn/doyoulikeme.html" title="" target="">I Am I,为你的网站添加 Do you like me</a><a href="yuang01,%E4%BE%A7%E8%BE%B9%E6%A0%8F,https://hexo-theme-bamboo.netlify.app/post/hexo-theme-bamboo/sidebar/" title="" target=""></a>]]></content>
    
    
    <summary type="html">由于LeanCloud即将停止服务，详细记录了如何将博客中依赖的&quot;Do you like me&quot;点赞组件和Waline评论服务及其数据，迁移并部署到Vercel平台的完整过程。</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="Vercel" scheme="https://one.blog.418121.xyz/tags/Vercel/"/>
    
    <category term="博客折腾" scheme="https://one.blog.418121.xyz/tags/%E5%8D%9A%E5%AE%A2%E6%8A%98%E8%85%BE/"/>
    
    <category term="Waline" scheme="https://one.blog.418121.xyz/tags/Waline/"/>
    
  </entry>
  
  <entry>
    <title>2025:得与失</title>
    <link href="https://one.blog.418121.xyz/posts/5f2147aa.html"/>
    <id>https://one.blog.418121.xyz/posts/5f2147aa.html</id>
    <published>2026-01-28T19:00:00.000Z</published>
    <updated>2026-01-28T20:56:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="摘句"><a href="#摘句" class="headerlink" title="摘句"></a>摘句</h1><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">悟已往之不谏，知来者之可追；实迷途其未远，觉今是而昨非。</span><br></pre></td></tr></table></figure><h1 id="始言"><a href="#始言" class="headerlink" title="始言"></a>始言</h1><p>新建文件的时候还下意识的以2025开头，没发现如今已经2026了，这一年发生了很多，失去了很多，得到了很多，幸运的是，自己身体健康，家人无大病，虽然没什么钱，日子还算过的去，胸无大志，总为一日三餐而奔波。家里一直催着找工作，去工作，结婚生子，我也知道老人家盼着抱曾孙，可很多事情不能按部就班的，不是没有计划，只是时候未到，一步一个脚印，脚踏实地。</p><h1 id="回顾2025年"><a href="#回顾2025年" class="headerlink" title="回顾2025年"></a>回顾2025年</h1><div class="timeline">    <div class="timenode"><div class="meta"><p><p>1月</p></p></div><div class="body"><ul><li>这个时候应该在跟她在武汉跨年吧，很开心！好不舍啊。</li><li>相聚的时光总是短暂的，还得把单子完成，我不要工作&#x2F;(ㄒoㄒ)&#x2F;~~</li><li>过年前大扫除，发现了小学的书套、画册、光盘、闹钟、玩具，初中的试卷、作文、奖旗。</li><li>小时候真好没有烦恼o(<em>￣▽￣</em>)ブ</li><li>哈哈，13年的说说：我要飞的更高~……。好可惜没有做到，飞机都没坐上。说多了都是泪。</li><li>除夕夜的兄弟聚会，在一起聊了很多，小时候琐事，未来展望开饭店。未来可期啊。</li><li>过年了，放烟花，又完成小时候未曾圆的梦，可惜啊不在对的年纪啊！</li><li>很不幸的是，年初又感冒了，似曾相识，上一年好像也是，o不我不想生病(≧﹏ ≦)</li><li>在家呆着好有愧疚感，有手有脚的，还养活不了自己。加油！</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>2月</p></p></div><div class="body"><ul><li>继续为单子而努力，过年还得工作。好想去玩啊！</li><li>帮他弟买手机，分期到现在都还没还完&#x2F;(ㄒoㄒ)&#x2F;~~她弟比我大该怎么叫到时候(●ˇ∀ˇ●)</li><li>这个月好像无事发生，天天被家里说，在家的难处。不敢吱声……</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>3月</p></p></div><div class="body"><ul><li>家里没人了，自力更生，研究黑暗料理。还跑进来一只哈基咪~o( &#x3D;∩ω∩&#x3D; )m</li><li>每天就是睡觉打游戏吃饭。就是下一顿犯愁(；′⌒&#96;)</li><li>折腾博客，数据备份整理。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>4月</p></p></div><div class="body"><ul><li>最近的天空好美啊！每天嘎嘎嘎拍(●ˇ∀ˇ●)</li><li>接到单子了，下一顿有着落了。o(<em>￣▽￣</em>)ブ</li><li>她生日，犯愁不知道送什么。最后送了马面裙w(ﾟДﾟ)w</li><li>好兄弟请我吃坤，好兄弟在心中，有事电话打不通。在学校我俩老一起吃坤🐔</li><li>bushi《王者荣耀》这游戏到底谁在赢啊！？</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>5月</p></p></div><div class="body"><ul><li>端午安康。</li><li>天空依旧绽放它的魅力，拍！</li><li>天气变热了，还得弄单子。加油！</li><li>王者荣耀我** 你**</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>6月</p></p></div><div class="body"><ul><li>六一快乐，长不大的小孩子(#&#96;O′)</li><li>宿舍一起去KTV自助。今年第一聚！</li><li>天空怎么看都看不厌啊。可惜我的脚趾头发脓了≧ ﹏ ≦</li><li>小强误入，瓶子里干活。</li><li>她找到工作了，海底捞服务员。真好！</li><li>光遇6周年。小陈你就送这点东西？</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>7月</p></p></div><div class="body"><ul><li>夏天来了，天空异象好多。外星人申请童话(#&#96;O′)</li><li>我的脚趾头怎么还没好！别是甲沟炎啊&#x2F;(ㄒoㄒ)&#x2F;~~</li><li>兄弟们聚餐，讨论去哪找工作。呃，我吃吃(╹ڡ╹ )</li><li>去阿姨里聚餐，吃小龙虾。好高级我不会吃(；′⌒&#96;)</li><li>台风跟随着<strong>基孔肯雅热</strong>而来~Σ(っ °Д °;)っ</li><li>我喜欢外卖大战！！！(╹ڡ╹ )</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>8月</p></p></div><div class="body"><ul><li>酷暑肯定得和烧烤搭配~</li><li>奶奶生日宴，82了厉害吧。</li><li>家里换冰箱了，之前的好像也四五年了。</li><li>种的火龙果开花了，但枯萎了。就好像我一样。</li><li>好大的雨，快上船！落汤鸡被淋成。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>9月</p></p></div><div class="body"><ul><li>看阅兵！吃月饼。</li><li>天空依旧美丽，就是台风太猛了，停工停课了。</li><li>她给我买了面包和零食。貌似也有点似曾相识。</li><li>外卖大战别停啊，奶茶全看你们了(╹ڡ╹ )</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>10月</p></p></div><div class="body"><ul><li>雨过天晴，还拍到心形的云了。好幸运。</li><li>开单了，开单了！</li><li>中秋快乐！团团圆圆。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>11月</p></p></div><div class="body"><ul><li>火龙果终究还是死了。天空都不美丽了(T_T)</li><li>买了手机看小说o(<em>￣▽￣</em>)ブ</li><li>就是被坑了，一定要验明正身啊！</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>12月</p></p></div><div class="body"><ul><li>好兄弟生日，吃宵夜。碳水爆炸，就是好冷啊。</li><li>跟好兄弟们去参加婚礼。吃席，啥时候才轮到我。</li><li>跟好兄弟们跨年，甚至忘了她了，完了完了(；′⌒&#96;).</li></ul></div></div></div><h1 id="总结2025年"><a href="#总结2025年" class="headerlink" title="总结2025年"></a>总结2025年</h1><p>得到了时间，能做好多没做过的事，还是总感觉时间不够用。<br>失去了很多，说不上来失去了什么，2026能不能对我好一点。<br>好好生活，好好生活就是好好吃饭，好好吃饭，就是好好生活。<br>我们不是不幸福，而是缺少一点点感知幸福的能力，幸福不在别处，当下就是全部。</p><h1 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h1><p>新的一年祝大家<strong>平安喜乐</strong>!</p>]]></content>
    
    
    <summary type="html">总结我的2025年。</summary>
    
    
    
    <category term="年总" scheme="https://one.blog.418121.xyz/categories/%E5%B9%B4%E6%80%BB/"/>
    
    
    <category term="2025年总" scheme="https://one.blog.418121.xyz/tags/2025%E5%B9%B4%E6%80%BB/"/>
    
  </entry>
  
  <entry>
    <title>世事无常，珍惜眼前</title>
    <link href="https://one.blog.418121.xyz/posts/7fdae838.html"/>
    <id>https://one.blog.418121.xyz/posts/7fdae838.html</id>
    <published>2025-12-16T09:15:54.000Z</published>
    <updated>2025-12-16T09:15:54.000Z</updated>
    
    <content type="html"><![CDATA[<p>我不知道意外和明天哪个先来，我只知道当下就是最好的，所以我开始频繁的记录，试图想留下些什么。</p><p><img src="https://images.418121.xyz/file/blog/camera/2025/12/16/01.webp" alt="光圈:1.8, 快门:1&#x2F;165秒, ISO61"><br><img src="https://images.418121.xyz/file/blog/camera/2025/12/16/02.webp" alt="光圈:1.8, 快门:1&#x2F;304秒, ISO56"><br><img src="https://images.418121.xyz/file/blog/camera/2025/12/16/03.webp" alt="光圈:1.8, 快门:1&#x2F;1000秒, ISO184"></p><p style="text-align: center;">🌏摄于：广东 2022-06-06</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">“世事无常，珍惜眼前”</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="学校" scheme="https://one.blog.418121.xyz/tags/%E5%AD%A6%E6%A0%A1/"/>
    
    <category term="暴风雨前的宁静" scheme="https://one.blog.418121.xyz/tags/%E6%9A%B4%E9%A3%8E%E9%9B%A8%E5%89%8D%E7%9A%84%E5%AE%81%E9%9D%99/"/>
    
    <category term="追光的日子" scheme="https://one.blog.418121.xyz/tags/%E8%BF%BD%E5%85%89%E7%9A%84%E6%97%A5%E5%AD%90/"/>
    
    <category term="梦是会开花的云朵" scheme="https://one.blog.418121.xyz/tags/%E6%A2%A6%E6%98%AF%E4%BC%9A%E5%BC%80%E8%8A%B1%E7%9A%84%E4%BA%91%E6%9C%B5/"/>
    
    <category term="云的心事只有风知道" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91%E7%9A%84%E5%BF%83%E4%BA%8B%E5%8F%AA%E6%9C%89%E9%A3%8E%E7%9F%A5%E9%81%93/"/>
    
  </entry>
  
  <entry>
    <title>“花怎么会落呢”</title>
    <link href="https://one.blog.418121.xyz/posts/d97d11da.html"/>
    <id>https://one.blog.418121.xyz/posts/d97d11da.html</id>
    <published>2025-11-15T07:20:27.000Z</published>
    <updated>2025-11-15T07:20:27.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li>续侄溥赏酴醾劝酒二首·其一<br>宋代：陈著<br>花有重开日，人无再少年。<br>相逢拌酩酊，何必备芳鲜。</li></ul><p>花谢了还有再开放的一天，人老了之后再无少年之时。<br>朋友相见尽管推杯换盏，喝个酩酊大醉，只要有酒无需备办美食。</p><p><img src="https://images.418121.xyz/file/blog/camera/2025/11/15/01.webp" alt="光圈:1.8, 快门:1&#x2F;9816秒, ISO56"><br><img src="https://images.418121.xyz/file/blog/camera/2025/11/15/02.webp" alt="光圈:2.2, 快门:1&#x2F;14416秒, ISO56"><br><img src="https://images.418121.xyz/file/blog/camera/2025/11/15/03.webp" alt="光圈:1.8, 快门:1&#x2F;2455秒, ISO56"></p><p style="text-align: center;">🌏摄于：广东 2022-06-23</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">“花有重开日，人无再少年”</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="学校" scheme="https://one.blog.418121.xyz/tags/%E5%AD%A6%E6%A0%A1/"/>
    
    <category term="青春" scheme="https://one.blog.418121.xyz/tags/%E9%9D%92%E6%98%A5/"/>
    
  </entry>
  
  <entry>
    <title>“世界充满分歧，所以要学会尊重别人”</title>
    <link href="https://one.blog.418121.xyz/posts/ace7a01a.html"/>
    <id>https://one.blog.418121.xyz/posts/ace7a01a.html</id>
    <published>2025-10-16T07:20:27.000Z</published>
    <updated>2025-10-16T07:20:27.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li>尊重是必要的，你不尊重别人，别人也不会尊重你。<br>有些事情你理解不了的话，那就尊重，也不要恶言相加。<br>古人云：恶言不出于口，忿言不反于身。《礼记·祭义》<br>不说伤人的话，别人就不会用忿怒的话回击。<br>此句提醒人们避免恶言伤人，人际交往中，友好、理智和尊重是维系良好关系的基础。</li></ul><p><img src="https://images.418121.xyz/file/blog/camera/2025/10/16/01.webp" alt="光圈:1.8, 快门:1&#x2F;18851秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/10/16/02.webp" alt="光圈:2.2, 快门:1&#x2F;2264秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/10/16/03.webp" alt="光圈:1.8, 快门:1&#x2F;5887秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/10/16/04.webp" alt="光圈:2.2, 快门:1&#x2F;1395秒, ISO50"></p><p style="text-align: center;">🌏摄于：广东 2022-07-01</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">“世界充满分歧，所以要学会尊重别人”</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="蓝天白云定会如期而至" scheme="https://one.blog.418121.xyz/tags/%E8%93%9D%E5%A4%A9%E7%99%BD%E4%BA%91%E5%AE%9A%E4%BC%9A%E5%A6%82%E6%9C%9F%E8%80%8C%E8%87%B3/"/>
    
    <category term="阳光正好微风不燥该来的都在路上" scheme="https://one.blog.418121.xyz/tags/%E9%98%B3%E5%85%89%E6%AD%A3%E5%A5%BD%E5%BE%AE%E9%A3%8E%E4%B8%8D%E7%87%A5%E8%AF%A5%E6%9D%A5%E7%9A%84%E9%83%BD%E5%9C%A8%E8%B7%AF%E4%B8%8A/"/>
    
  </entry>
  
  <entry>
    <title>“死亡不是永别，遗忘才是”</title>
    <link href="https://one.blog.418121.xyz/posts/b9bac3ff.html"/>
    <id>https://one.blog.418121.xyz/posts/b9bac3ff.html</id>
    <published>2025-09-20T13:20:27.000Z</published>
    <updated>2025-09-20T13:20:27.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li>死亡是来的猝不及防的，根本没有任何时间让自己反应过来，这怕是人的过激保护机制吧。<br>反应过来之后才发现原来死亡离我那么近，上一秒还有说有笑，下一秒就阴阳永隔。<br>但死亡真的是永别吗？《小王子》里说：只要你还记得我，我就会一直留在你身边。<br>所以我觉得死亡就不是永别，遗忘才是。<br>前段时间我老豆带我回老家扫墓，带我见了好多先祖，听说他们的往事。<br>知道他们在哪，还有人记得他们。<br>以后我也会带着我的儿女来认认他们，让他们知道我们从哪里来，从哪里去，这也是一种传承。</li></ul><p><img src="https://images.418121.xyz/file/blog/camera/2025/09/20/01.webp" alt="光圈:1.8, 快门:1&#x2F;50秒, ISO150"><br><img src="https://images.418121.xyz/file/blog/camera/2025/09/20/02.webp" alt="光圈:1.8, 快门:1&#x2F;100秒, ISO116"><br><img src="https://images.418121.xyz/file/blog/camera/2025/09/20/03.webp" alt="光圈:1.8, 快门:1&#x2F;100秒, ISO143"></p><p style="text-align: center;">🌏摄于：广东 2022-07-17</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">“死亡不是永别，遗忘才是”</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="晚霞的治愈力有多强" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E%E7%9A%84%E6%B2%BB%E6%84%88%E5%8A%9B%E6%9C%89%E5%A4%9A%E5%BC%BA/"/>
    
    <category term="日余晖映晚霞一抹夕阳落美如画" scheme="https://one.blog.418121.xyz/tags/%E6%97%A5%E4%BD%99%E6%99%96%E6%98%A0%E6%99%9A%E9%9C%9E%E4%B8%80%E6%8A%B9%E5%A4%95%E9%98%B3%E8%90%BD%E7%BE%8E%E5%A6%82%E7%94%BB/"/>
    
  </entry>
  
  <entry>
    <title>“爱就像蓝天白云晴空万里突然暴风雨”</title>
    <link href="https://one.blog.418121.xyz/posts/1ad5be0d.html"/>
    <id>https://one.blog.418121.xyz/posts/1ad5be0d.html</id>
    <published>2025-08-23T07:53:27.000Z</published>
    <updated>2025-08-23T07:53:27.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2025/08/23/01.webp" alt="光圈:1.8, 快门:1&#x2F;3601秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/08/23/02.webp" alt="光圈:1.8, 快门:1&#x2F;4300秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/08/23/03.webp" alt="光圈:1.8, 快门:1&#x2F;199秒, ISO50"></p><p style="text-align: center;">🌏摄于：广东 2022-07-21</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">“爱就像蓝天白云晴空万里突然暴风雨”</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="蓝天白云定会如期而至" scheme="https://one.blog.418121.xyz/tags/%E8%93%9D%E5%A4%A9%E7%99%BD%E4%BA%91%E5%AE%9A%E4%BC%9A%E5%A6%82%E6%9C%9F%E8%80%8C%E8%87%B3/"/>
    
    <category term="港口码头" scheme="https://one.blog.418121.xyz/tags/%E6%B8%AF%E5%8F%A3%E7%A0%81%E5%A4%B4/"/>
    
    <category term="江边吹吹风" scheme="https://one.blog.418121.xyz/tags/%E6%B1%9F%E8%BE%B9%E5%90%B9%E5%90%B9%E9%A3%8E/"/>
    
  </entry>
  
  <entry>
    <title>“小雨天气”</title>
    <link href="https://one.blog.418121.xyz/posts/f8295ad5.html"/>
    <id>https://one.blog.418121.xyz/posts/f8295ad5.html</id>
    <published>2025-07-13T09:30:00.000Z</published>
    <updated>2025-07-13T09:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2025/07/13/01.webp" alt="光圈:1.8, 快门:1&#x2F;514秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/07/13/02.webp" alt="光圈:1.8, 快门:1&#x2F;891秒, ISO56"><br><img src="https://images.418121.xyz/file/blog/camera/2025/07/13/03.webp" alt="光圈:1.8, 快门:1&#x2F;610秒, ISO56"></p><p style="text-align: center;">🌏摄于：广东 2022-07-06</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">“小雨天气”</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="雨天" scheme="https://one.blog.418121.xyz/tags/%E9%9B%A8%E5%A4%A9/"/>
    
    <category term="城市风景一角" scheme="https://one.blog.418121.xyz/tags/%E5%9F%8E%E5%B8%82%E9%A3%8E%E6%99%AF%E4%B8%80%E8%A7%92/"/>
    
    <category term="我的城市下雨了" scheme="https://one.blog.418121.xyz/tags/%E6%88%91%E7%9A%84%E5%9F%8E%E5%B8%82%E4%B8%8B%E9%9B%A8%E4%BA%86/"/>
    
  </entry>
  
  <entry>
    <title>快下雨，别打雷了，赶紧的，热！</title>
    <link href="https://one.blog.418121.xyz/posts/d677fe5d.html"/>
    <id>https://one.blog.418121.xyz/posts/d677fe5d.html</id>
    <published>2025-06-14T09:30:00.000Z</published>
    <updated>2025-06-14T09:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2025/06/14/01.webp" alt="光圈:1.8, 快门:1&#x2F;514秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/06/14/02.webp" alt="光圈:1.8, 快门:1&#x2F;907秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/06/14/03.webp" alt="光圈:1.8, 快门:1&#x2F;3152秒, ISO56"></p><p style="text-align: center;">🌏摄于：广东 2022-08-16</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">快下雨，别打雷了，赶紧的，热！</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="暴风雨前的宁静" scheme="https://one.blog.418121.xyz/tags/%E6%9A%B4%E9%A3%8E%E9%9B%A8%E5%89%8D%E7%9A%84%E5%AE%81%E9%9D%99/"/>
    
    <category term="台风格美" scheme="https://one.blog.418121.xyz/tags/%E5%8F%B0%E9%A3%8E%E6%A0%BC%E7%BE%8E/"/>
    
  </entry>
  
  <entry>
    <title>寄博客一周年</title>
    <link href="https://one.blog.418121.xyz/posts/78c426fd.html"/>
    <id>https://one.blog.418121.xyz/posts/78c426fd.html</id>
    <published>2025-05-11T16:00:00.000Z</published>
    <updated>2025-05-11T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="不知不觉中，就已经一年了，仿佛一切还在昨天。已经迭代三个主题了。"><a href="#不知不觉中，就已经一年了，仿佛一切还在昨天。已经迭代三个主题了。" class="headerlink" title="不知不觉中，就已经一年了，仿佛一切还在昨天。已经迭代三个主题了。"></a>不知不觉中，就已经一年了，仿佛一切还在昨天。已经迭代三个主题了。</h2><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%BB%BA%E7%AB%99%E5%8E%86%E5%8F%B2,https://blog.418121.xyz/history/" title="" target=""></a><table><thead><tr><th>主题示例</th><th>主题作者</th></tr></thead><tbody><tr><td><a href="https://one.blog.418121.xyz/">一代主题</a></td><td><a href="https://github.com/Candinya/Kratos-Rebirth">Candinya</a></td></tr><tr><td><a href="https://yeminxi.github.io/">二代主题</a></td><td><a href="https://github.com/yuang01/hexo-theme-bamboo">yuang01</a></td></tr><tr><td><a href="https://blog.418121.xyz/">三代主题</a></td><td><a href="https://github.com/everfu/hexo-theme-solitude">everfu</a></td></tr></tbody></table><br><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>你问我怎么接触到Hexo的？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>我也不知道欸，就是做完毕设之后闲得发慌，也不想去面试、找工作。然后就莫名其妙接触上了，可能是缘分吧～ (｡･∀･)ﾉﾞ✨</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>你最开始建站的原因是为了什么？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>我说想为女朋友建个站，记录一下生活，你信吗？(⁄ ⁄•⁄ω⁄•⁄ ⁄)💖</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>接触到Hexo你得到了什么？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>我得到了很多，学了一堆前端知识、Git命令、网站部署啥的，还加入了好多组织，认识了很多<a href="/links/">大佬们</a>！(ง •̀_•́)ง✨</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>为什么会重一代换到二代的？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>别说了，我刚接触就开始改主题，发现自己改得太麻烦了，结果阴差阳错找到了二代。二代的功能正好是我想要的，大概也折腾了半年吧～ (￣▽￣)ノ</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>二代那么好，为什么会换到三代呢？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>嗯……可能是因为三代一直有更新吧。而且一代作者也重新更新了。再加上有点跟风的原因，最主要的还是对二代审美疲劳了吧～ (´･ω･&#96;)💭</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>就算处于互联网边缘，还会继续坚持吗？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>我只能说，大善人CloudFlare、Vercel不倒，我也不倒！(●ˇ∀ˇ●)✊</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>你为什么在水文？</span></div>    <div class="collapse-box-content"><div class="inner">        <p>呃，其实我也不知道写什么好啦～ (￣▽￣;)💦</p>     </div></div>    </div><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>你接下来有什么规划吗？</span></div>    <div class="collapse-box-content"><div class="inner">        <ol><li>重拾一代主题，并保持更新吧，一代命非常短，得续一下命～ (ง •̀_•́)ง💪  </li><li>想改一下即刻短文成懒加载模式，点击加载才会加载～ 🌀  </li><li>把我断更很久的毕业设计续上并完结！✍️🎓</li></ol>     </div></div>    </div><h2 id="今天就这样。相信你过得也很好吧？期待下次与你再会😊。"><a href="#今天就这样。相信你过得也很好吧？期待下次与你再会😊。" class="headerlink" title="今天就这样。相信你过得也很好吧？期待下次与你再会😊。"></a>今天就这样。相信你过得也很好吧？期待下次与你再会😊。</h2>]]></content>
    
    
    <summary type="html">一周年的水文</summary>
    
    
    
    <category term="年总" scheme="https://one.blog.418121.xyz/categories/%E5%B9%B4%E6%80%BB/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="一周年" scheme="https://one.blog.418121.xyz/tags/%E4%B8%80%E5%91%A8%E5%B9%B4/"/>
    
  </entry>
  
  <entry>
    <title>出门不要摔跤容易烫伤</title>
    <link href="https://one.blog.418121.xyz/posts/6a3a2f7.html"/>
    <id>https://one.blog.418121.xyz/posts/6a3a2f7.html</id>
    <published>2025-05-04T15:30:00.000Z</published>
    <updated>2025-05-04T15:30:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2025/05/04/01.webp" alt="光圈:1.8, 快门:1&#x2F;115秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/05/04/02.webp" alt="光圈:1.8, 快门:1&#x2F;381秒, ISO50"><br><img src="https://images.418121.xyz/file/blog/camera/2025/05/04/03.webp" alt="光圈:1.8, 快门:1&#x2F;347秒, ISO400"></p><p style="text-align: center;">🌏摄于：广东 2022-08-24</p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E5%B7%B2%E5%90%8C%E6%AD%A5%E8%87%B3%E7%9B%B8%E5%86%8C%E9%9B%86,https://blog.418121.xyz/gallery/tuchong/" title="" target=""></a>]]></content>
    
    
    <summary type="html">出门不要摔跤容易烫伤</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="晚霞是天空给的惊喜" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E%E6%98%AF%E5%A4%A9%E7%A9%BA%E7%BB%99%E7%9A%84%E6%83%8A%E5%96%9C/"/>
    
    <category term="落日余晖映晚霞一抹夕阳美如画" scheme="https://one.blog.418121.xyz/tags/%E8%90%BD%E6%97%A5%E4%BD%99%E6%99%96%E6%98%A0%E6%99%9A%E9%9C%9E%E4%B8%80%E6%8A%B9%E5%A4%95%E9%98%B3%E7%BE%8E%E5%A6%82%E7%94%BB/"/>
    
    <category term="晚霞的治愈力有多强" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E%E7%9A%84%E6%B2%BB%E6%84%88%E5%8A%9B%E6%9C%89%E5%A4%9A%E5%BC%BA/"/>
    
    <category term="喜欢夏日生活的每一个瞬间" scheme="https://one.blog.418121.xyz/tags/%E5%96%9C%E6%AC%A2%E5%A4%8F%E6%97%A5%E7%94%9F%E6%B4%BB%E7%9A%84%E6%AF%8F%E4%B8%80%E4%B8%AA%E7%9E%AC%E9%97%B4/"/>
    
  </entry>
  
  <entry>
    <title>Windows 安装 Docker 部署 Immich</title>
    <link href="https://one.blog.418121.xyz/posts/e96fa9ec.html"/>
    <id>https://one.blog.418121.xyz/posts/e96fa9ec.html</id>
    <published>2025-04-08T07:20:08.000Z</published>
    <updated>2025-04-08T07:20:08.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>我有挺多图片的，想搭建个图片管理工具奈何没有服务器，也没有 Nas ，干脆就笔记本电脑上。<br>打算用 Windows 装个 Docker 再在里面装个 Immich 。<br>给位佬友们有什么好推荐的吗，最好就能放在托管平台上面的，但是我 <span class="blur">不想花钱</span> 。<br>别问为什么没有图片，懒得截。</p><h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><ul><li>Windows 11</li></ul><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol><li>开启电脑的功能 <strong>Hyper-V</strong> 和 <strong>适用于 Linux 的 Windows 子系统和虚拟机平台</strong><ol><li>打开控制面板 -&gt; 程序 -&gt; 程序和功能 -&gt; 启用或关闭 Windows 功能</li><li>Hyper-V 和 适用于 Linux 的 Windows 子系统和虚拟机平台 （勾选）</li></ol></li><li><a href="https://www.docker.com/">去官网下载 Docker</a>并安装 （速度有点慢自行想办法）<ol><li>无脑点 <strong>OK</strong> 然后等</li><li>安装完成点 <strong>Close</strong></li><li>在桌面找到蓝色小鲸鱼打开它</li><li><strong>Accept（同意）</strong> 一些协议 </li><li>提示需要登陆，感觉没必要可以点右上角 <strong>Skip（跳过）</strong></li><li>调查问卷 <strong>Skip（跳过）</strong> 就行</li><li>更改 <strong>Docker</strong> 语言<ol><li><a href="https://github.com/asxez/DockerDesktop-CN">点击这里去下载汉化包</a></li><li>关闭Docker Desktop</li><li>在Docker安装目录找到app.asar文件并将其备份，防止出现意外。<ul><li>Windows下默认为C:\Program Files\Docker\Docker\frontend\resources</li><li>Macos下默认为&#x2F;Applications&#x2F;Docker.app&#x2F;Contents&#x2F;MacOS&#x2F;Docker Desktop.app&#x2F;Contents&#x2F;Resources</li><li>Ubuntu&#x2F;Debian下默认为&#x2F;opt&#x2F;docker-desktop&#x2F;resources</li></ul></li><li>将下载的asar文件改名为app.asar后替换原文件</li></ol></li><li>打开终端CMD输入 <strong>docker –version</strong> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">PS C:\Users\59974&gt; docker --version</span><br><span class="line">Docker version 28.0.4, build b8034c0</span><br></pre></td></tr></table></figure></li><li>安装成功</li></ol></li></ol><h2 id="安装-Immich"><a href="#安装-Immich" class="headerlink" title="安装 Immich"></a>安装 Immich</h2><ol><li>新建 <strong>F:&#x2F;web&#x2F;immich</strong> 文件夹（全英文路径）</li><li>下载最新的配置文件，我写了个脚本双击运行即可 <strong>toc: true<br>updatedownload.bat</strong><br> <figure class="highlight bat"><figcaption><span>F:/web/immich/toc: true</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line">updatedownload.bat</span><br><span class="line">        @<span class="built_in">echo</span> off</span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">        REM 设置基地址</span></span><br><span class="line">        <span class="built_in">set</span> BASE_URL=https://github.com/immich-app/immich/releases/latest/download/</span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">        REM 下载 docker-compose.yml 文件</span></span><br><span class="line">        <span class="built_in">echo</span> 正在下载 docker-compose.yml ...</span><br><span class="line">        powershell -Command &quot;Invoke-WebRequest -Uri &#x27;<span class="variable">%BASE_URL%</span>docker-compose.yml&#x27; -OutFile &#x27;docker-compose.yml&#x27;&quot;</span><br><span class="line">        <span class="keyword">if</span> <span class="variable">%ERRORLEVEL%</span> <span class="keyword">neq</span> <span class="number">0</span> (</span><br><span class="line">            <span class="built_in">echo</span> 下载 docker-compose.yml 失败！</span><br><span class="line">            <span class="built_in">pause</span></span><br><span class="line">            <span class="keyword">exit</span> /b <span class="variable">%ERRORLEVEL%</span></span><br><span class="line">        )</span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">        REM 下载 .env 文件</span></span><br><span class="line">        <span class="built_in">echo</span> 正在下载 .env 文件 ...</span><br><span class="line">        powershell -Command &quot;Invoke-WebRequest -Uri &#x27;<span class="variable">%BASE_URL%</span>example.env&#x27; -OutFile &#x27;.env&#x27;&quot;</span><br><span class="line">        <span class="keyword">if</span> <span class="variable">%ERRORLEVEL%</span> <span class="keyword">neq</span> <span class="number">0</span> (</span><br><span class="line">            <span class="built_in">echo</span> 下载 .env 失败！</span><br><span class="line">            <span class="built_in">pause</span></span><br><span class="line">            <span class="keyword">exit</span> /b <span class="variable">%ERRORLEVEL%</span></span><br><span class="line">        )</span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">        REM 下载 hwaccel.ml.yml 文件</span></span><br><span class="line">        <span class="built_in">echo</span> 正在下载 hwaccel.ml.yml ...</span><br><span class="line">        powershell -Command &quot;Invoke-WebRequest -Uri &#x27;<span class="variable">%BASE_URL%</span>hwaccel.ml.yml&#x27; -OutFile &#x27;hwaccel.ml.yml&#x27;&quot;</span><br><span class="line">        <span class="keyword">if</span> <span class="variable">%ERRORLEVEL%</span> <span class="keyword">neq</span> <span class="number">0</span> (</span><br><span class="line">            <span class="built_in">echo</span> 下载 hwaccel.ml.yml 失败！</span><br><span class="line">            <span class="built_in">pause</span></span><br><span class="line">            <span class="keyword">exit</span> /b <span class="variable">%ERRORLEVEL%</span></span><br><span class="line">        )</span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">        REM 下载 hwaccel.transcoding.yml 文件</span></span><br><span class="line">        <span class="built_in">echo</span> 正在下载 hwaccel.transcoding.yml ...</span><br><span class="line">        powershell -Command &quot;Invoke-WebRequest -Uri &#x27;<span class="variable">%BASE_URL%</span>hwaccel.transcoding.yml&#x27; -OutFile &#x27;hwaccel.transcoding.yml&#x27;&quot;</span><br><span class="line">        <span class="keyword">if</span> <span class="variable">%ERRORLEVEL%</span> <span class="keyword">neq</span> <span class="number">0</span> (</span><br><span class="line">            <span class="built_in">echo</span> 下载 hwaccel.transcoding.yml 失败！</span><br><span class="line">            <span class="built_in">pause</span></span><br><span class="line">            <span class="keyword">exit</span> /b <span class="variable">%ERRORLEVEL%</span></span><br><span class="line">        )</span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">        REM 下载 prometheus.yml 文件</span></span><br><span class="line">        <span class="built_in">echo</span> 正在下载 prometheus.yml ...</span><br><span class="line">        powershell -Command &quot;Invoke-WebRequest -Uri &#x27;<span class="variable">%BASE_URL%</span>prometheus.yml&#x27; -OutFile &#x27;prometheus.yml&#x27;&quot;</span><br><span class="line">        <span class="keyword">if</span> <span class="variable">%ERRORLEVEL%</span> <span class="keyword">neq</span> <span class="number">0</span> (</span><br><span class="line">            <span class="built_in">echo</span> 下载 prometheus.yml 失败！</span><br><span class="line">            <span class="built_in">pause</span></span><br><span class="line">            <span class="keyword">exit</span> /b <span class="variable">%ERRORLEVEL%</span></span><br><span class="line">        )</span><br><span class="line"></span><br><span class="line">        <span class="built_in">echo</span> 所有文件下载完成！</span><br><span class="line">        <span class="built_in">pause</span></span><br></pre></td></tr></table></figure></li><li>修改 <strong>F:&#x2F;web&#x2F;immich&#x2F;.env</strong> 文件（你不想改数据库密码可跳过）<br> <figure class="highlight diff"><figcaption><span>F:/web/immich/.env</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">  # To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List</span><br><span class="line"><span class="deletion">- # TZ=Etc/UTC</span></span><br><span class="line"><span class="addition">+ TZ=Asia/Shanghai</span></span><br><span class="line">  # Connection secret for postgres. You should change it to a random password</span><br><span class="line">  # Please use only the characters `A-Za-z0-9`, without special characters or spaces</span><br><span class="line"><span class="deletion">- DB_PASSWORD=postgres</span></span><br><span class="line"><span class="addition">+ DB_PASSWORD=密码</span></span><br></pre></td></tr></table></figure></li><li>运行安装代码<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker compose up -d</span><br></pre></td></tr></table></figure></li><li>打开 <strong><a href="http://127.0.0.1:2283/">http://127.0.0.1:2283</a></strong>（本机IP地址），显示 <strong>欢迎使用 Immich</strong> 界面即部署成功。</li></ol><h2 id="进阶操作"><a href="#进阶操作" class="headerlink" title="进阶操作"></a>进阶操作</h2><h3 id="1-更改模型，及文件路径"><a href="#1-更改模型，及文件路径" class="headerlink" title="1. 更改模型，及文件路径"></a>1. 更改模型，及文件路径</h3><ol><li>映射外部相册文件夹，更改模型<br> <figure class="highlight diff"><figcaption><span>F:/web/immich/docker-compose.yml</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">services:</span><br><span class="line">    immich-server:</span><br><span class="line">    container_name: immich_server</span><br><span class="line">    image: ghcr.io/immich-app/immich-server:$&#123;IMMICH_VERSION:-release&#125;</span><br><span class="line"><span class="deletion">-    # extends:</span></span><br><span class="line"><span class="deletion">-    #   file: hwaccel.transcoding.yml</span></span><br><span class="line"><span class="deletion">-    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding</span></span><br><span class="line"><span class="addition">+      extends:</span></span><br><span class="line"><span class="addition">+      file: hwaccel.transcoding.yml</span></span><br><span class="line"><span class="addition">+      service: nvenc # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding</span></span><br><span class="line">    volumes:</span><br><span class="line">        # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file</span><br><span class="line">        - $&#123;UPLOAD_LOCATION&#125;:/usr/src/app/upload</span><br><span class="line">        - /etc/localtime:/etc/localtime:ro</span><br><span class="line"><span class="addition">+      - F:/together:/mnt/media:ro</span></span><br><span class="line">    immich-machine-learning:</span><br><span class="line">    container_name: immich_machine_learning</span><br><span class="line">    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.</span><br><span class="line">    # Example tag: $&#123;IMMICH_VERSION:-release&#125;-cuda</span><br><span class="line">    image: ghcr.io/immich-app/immich-machine-learning:$&#123;IMMICH_VERSION:-release&#125;</span><br><span class="line"><span class="deletion">-    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration</span></span><br><span class="line"><span class="deletion">-    #   file: hwaccel.ml.yml</span></span><br><span class="line"><span class="deletion">-    #   service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable</span></span><br><span class="line"><span class="addition">+    extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration</span></span><br><span class="line"><span class="addition">+      file: hwaccel.ml.yml</span></span><br><span class="line"><span class="addition">+      service: cuda # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference - use the `-wsl` version for WSL2 where applicable</span></span><br><span class="line">    volumes:</span><br><span class="line"><span class="addition">+      - F:/web/model-cache:/cache</span></span><br></pre></td></tr></table></figure></li><li>下载模型（自行配置SSH）<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://huggingface.co/immich-app/buffalo_l</span><br><span class="line">git <span class="built_in">clone</span> https://huggingface.co/immich-app/XLM-Roberta-Large-Vit-B-16Plus</span><br><span class="line"><span class="comment"># 国内镜像</span></span><br><span class="line">git <span class="built_in">clone</span> https://hf-mirror.com/immich-app/buffalo_l</span><br><span class="line">git <span class="built_in">clone</span> https://hf-mirror.com/immich-app/XLM-Roberta-Large-Vit-B-16Plus</span><br></pre></td></tr></table></figure></li><li>移动文件夹，树状图如下<br> <figure class="highlight markdown"><figcaption><span>F:/web/model-cache</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">model-cache</span><br><span class="line">├─clip</span><br><span class="line">│  └─XLM-Roberta-Large-Vit-B-16Plus</span><br><span class="line">│      ├─textual</span><br><span class="line">│      └─visual</span><br><span class="line">└─facial-recognition</span><br><span class="line"><span class="code">    └─buffalo_l</span></span><br></pre></td></tr></table></figure></li><li>跟之前一样，运行安装代码等待部署即可<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker compose up -d</span><br></pre></td></tr></table></figure></li></ol><h3 id="2-内网穿透"><a href="#2-内网穿透" class="headerlink" title="2. 内网穿透"></a>2. 内网穿透</h3><p><a href="https://linux.do/t/topic/116168">自己琢磨吧</a></p><h3 id="3-效果"><a href="#3-效果" class="headerlink" title="3. 效果"></a>3. 效果</h3><a href="Immich,https://photo.418121.xyz" title="" target="">叶泯希,登录 -</a><a href="Immich,https://photos.418121.xyz" title="" target="">叶泯希,登录 -</a><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%E4%BF%9D%E6%8C%81%E9%BB%98%E8%AE%A4,win11%E9%83%A8%E7%BD%B2immich%E7%9B%B8%E5%86%8C%EF%BC%8C%E6%89%93%E9%80%A0%E5%B1%9E%E4%BA%8E%E8%87%AA%E5%B7%B1%E7%9A%84%E7%9B%B8%E5%86%8C%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7,https://zhuanlan.zhihu.com/p/1044574721" title="" target=""></a><a href="%E7%9A%84%E9%83%A8%E7%BD%B2%E5%92%8C%E4%BD%BF%E7%94%A8%EF%BC%89,https://blog.hentioe.dev/posts/deploy-immich.html" title="" target="">绅士喵,自建照片&#x2F;视频管理方案（Immich</a>]]></content>
    
    
    <summary type="html">本文详细介绍了如何在 Windows 系统上通过 Docker 部署 Immich，一个开源的图片管理工具。</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Docker" scheme="https://one.blog.418121.xyz/tags/Docker/"/>
    
    <category term="Windows" scheme="https://one.blog.418121.xyz/tags/Windows/"/>
    
    <category term="Immich" scheme="https://one.blog.418121.xyz/tags/Immich/"/>
    
  </entry>
  
  <entry>
    <title>主题魔改——Solitude主题</title>
    <link href="https://one.blog.418121.xyz/posts/e4ce9af4.html"/>
    <id>https://one.blog.418121.xyz/posts/e4ce9af4.html</id>
    <published>2025-03-24T16:20:00.000Z</published>
    <updated>2025-11-30T08:50:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>这几天有时间就把主题升级一下，顺便总结一下修改和添加内容。我很蠢，但是蠢人有蠢人的办法，一样能实现功能就好了。</p><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>更新记录</span></div>    <div class="collapse-box-content"><div class="inner">        <div class="timeline">    <div class="timenode"><div class="meta"><p><p>2025-11-15</p></p></div><div class="body"><p><a href="#22-%E8%B5%9E%E8%B5%8F%E4%BE%A7%E8%BE%B9%E6%A0%8F">添加赞赏卡片侧边栏</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-09-21</p></p></div><div class="body"><p><a href="#12-%E6%81%A2%E5%A4%8D%E8%83%8C%E6%99%AF%E5%9B%BE%E7%89%87">恢复背景图片，新版本已删除</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-05-16</p></p></div><div class="body"><p><a href="#11-%E5%8D%B3%E5%88%BB%E7%9F%AD%E6%96%87%E4%BB%BF%E5%BE%AE%E4%BF%A1%E6%9C%8B%E5%8F%8B%E5%9C%88%E6%A0%B7%E5%BC%8F">即刻短文仿微信朋友圈样式</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-05-11</p></p></div><div class="body"><p><a href="#10-%E5%8D%B3%E5%8F%AF%E7%9F%AD%E6%96%87%E8%AF%86%E5%88%AB-Html-%E6%A0%87%E7%AD%BE%EF%BC%88%E6%8D%A2%E8%A1%8C%E5%8A%A0%E7%B2%97%E7%AD%89%EF%BC%89">添加即刻短文html标签识别</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-04-07</p></p></div><div class="body"><p><a href="#9-%E9%AD%94%E6%94%B9%E4%B8%BB%E9%A2%98%E5%85%B3%E4%BA%8E%E9%A1%B5">修复关于按钮点击</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-04-05</p></p></div><div class="body"><p><a href="#9-%E9%AD%94%E6%94%B9%E4%B8%BB%E9%A2%98%E5%85%B3%E4%BA%8E%E9%A1%B5">魔改主题关于页</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-03-30</p></p></div><div class="body"><p><a href="#21-%E9%85%8D%E7%BD%AEswpp%E5%92%8CPWA%EF%BC%88%E4%B8%BB%E9%A2%98%E6%98%AFv2-%E7%8E%B0%E7%89%88%E6%9C%ACv3%EF%BC%89">添加 SWPP 开启 PWA</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-03-29</p></p></div><div class="body"><p><a href="#8-%E9%80%82%E9%85%8DWaline%E6%96%87%E7%AB%A0%E7%83%AD%E5%BA%A6">适配 Waline 文章热度</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-03-28</p></p></div><div class="body"><p><a href="#7-%E6%B7%BB%E5%8A%A0%E5%8D%B3%E5%88%BB%E7%9F%AD%E6%96%87%E5%9B%BE%E7%89%87%E7%9A%84%E6%8F%8F%E8%BF%B0">添加即刻短文图片的描述</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-03-27</p></p></div><div class="body"><p><a href="#6-%E6%B7%BB%E5%8A%A0%E8%AF%84%E8%AE%BA%E5%8D%8F%E8%AE%AE">添加评论协议至评论区</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-03-26</p></p></div><div class="body"><p><a href="#2-Tab%E6%A0%87%E7%AD%BE">修改Tab标签生成逻辑</a>    </p></div></div>    <div class="timenode"><div class="meta"><p><p>2025-03-25</p></p></div><div class="body"><p>首稿，solitude版本 v3.0.19    </p></div></div></div>     </div></div>    </div><h2 id="修改了什么"><a href="#修改了什么" class="headerlink" title="修改了什么"></a>修改了什么</h2><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>修改内容</span></div>    <div class="collapse-box-content"><div class="inner">        <h3 id="1-加载动画"><a href="#1-加载动画" class="headerlink" title="1. 加载动画"></a>1. 加载动画</h3><div class="tabs" id="fullpage"><ul class="nav-tabs"><li class="tab active"><a class="#fullpage-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#fullpage-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#fullpage-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="fullpage-1"><p>切换页面时展现。</p></div><div class="tab-pane" id="fullpage-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;source&#x2F;css&#x2F;_layout&#x2F;fullpage.styl</strong> 文件： <figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ...</span></span><br><span class="line">    <span class="selector-class">.loading-bg</span></span><br><span class="line">      <span class="attribute">display</span> flex</span><br><span class="line">      <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">position</span> fixed</span><br><span class="line">      <span class="attribute">background</span> <span class="built_in">var</span>(--loading-bg)  // 修改这一行</span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line">    <span class="selector-class">.loading-img</span></span><br><span class="line">      <span class="attribute">width</span> <span class="number">100px</span></span><br><span class="line">      <span class="attribute">height</span> <span class="number">100px</span></span><br><span class="line">      <span class="attribute">margin</span> auto</span><br><span class="line">      <span class="attribute">animation-duration</span> <span class="number">0.5s</span> // 修改这一行，复制完后请删除注释</span><br><span class="line"><span class="comment">// ...</span></span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;source&#x2F;css&#x2F;_mode&#x2F;index.styl</strong> 文件： <figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-attr">[data-theme=dark]</span></span><br><span class="line"><span class="attr">--loading-bg</span> <span class="number">#000000dd</span>  <span class="comment">// 添加这一行</span></span><br><span class="line"><span class="comment">// ...</span></span><br><span class="line"><span class="selector-attr">[data-theme=light]</span></span><br><span class="line"><span class="attr">--loading-bg</span> <span class="number">#ffffffdd</span>  <span class="comment">// 添加这一行</span></span><br><span class="line"><span class="comment">// ...</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="fullpage-3"><table><thead><tr><th>参考</th><th>原帖</th></tr></thead><tbody><tr><td>关于本站｜Solitude主题魔改内容</td><td><a href="https://blog.starsharbor.com/posts/solitude-changefiles/#%E5%8A%A0%E8%BD%BD%E5%8A%A8%E7%94%BB">❖星港◎Star☆</a></td></tr></tbody></table></div></div></div><h3 id="2-Tab标签"><a href="#2-Tab标签" class="headerlink" title="2. Tab标签"></a>2. Tab标签</h3><div class="tabs" id="tabsxiugai"><ul class="nav-tabs"><li class="tab active"><a class="#tabsxiugai-1"><i class="fas fa-wand-magic-sparkles [/about/]"></i>效果</a></li><li class="tab"><a class="#tabsxiugai-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#tabsxiugai-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="tabsxiugai-1"><p>点击按钮可以跳转页面。</p></div><div class="tab-pane" id="tabsxiugai-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;scripts&#x2F;tags&#x2F;tabs.js</strong> 如下： <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&#x27;use strict&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">postTabs</span>(<span class="params">[name, active], content</span>) &#123;</span><br><span class="line">  <span class="comment">// 定义正则表达式，用于匹配选项卡块</span></span><br><span class="line">  <span class="keyword">const</span> tabBlock = <span class="regexp">/&lt;!--\s*tab (.*?)(?:\s*\[(.*?)\])?\s*--&gt;\n([\s\S]*?)&lt;!--\s*endtab\s*--&gt;/g</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 使用 matchAll 来获取所有匹配的选项卡</span></span><br><span class="line">  <span class="keyword">const</span> matches = [...content.<span class="title function_">matchAll</span>(tabBlock)];</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 将一个字符串转换为数字，设置默认选中的标签索引</span></span><br><span class="line">  active = <span class="title class_">Number</span>(active) || <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 生成选项卡项函数</span></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">generateTabItems</span> = (<span class="params">matches, name, active, parentId</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> matches.<span class="title function_">map</span>(<span class="function">(<span class="params">match, tabId</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="comment">// 捕获选项卡标题和图标</span></span><br><span class="line">      <span class="keyword">const</span> [tabCaption = <span class="string">&#x27;&#x27;</span>, tabIcon = <span class="string">&#x27;&#x27;</span>] = match[<span class="number">1</span>].<span class="title function_">split</span>(<span class="string">&#x27;@&#x27;</span>);</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 获取可选的链接，如果有的话</span></span><br><span class="line">      <span class="keyword">const</span> link = match[<span class="number">2</span>] ? match[<span class="number">2</span>].<span class="title function_">trim</span>() : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 渲染内容，使用 Hexo 的 Markdown 渲染引擎</span></span><br><span class="line">      <span class="keyword">const</span> postContent = <span class="title function_">renderMarkdown</span>(match[<span class="number">3</span>]);</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 生成唯一的 id，用于对应选项卡内容区域</span></span><br><span class="line">      <span class="keyword">const</span> tabHref = <span class="string">`<span class="subst">$&#123;parentId&#125;</span>-<span class="subst">$&#123;tabId&#125;</span>`</span>;</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 处理图标 HTML</span></span><br><span class="line">      <span class="keyword">const</span> iconHtml = tabIcon ? <span class="string">`&lt;i class=&quot;<span class="subst">$&#123;tabIcon.trim()&#125;</span> tab solitude&quot;&gt;&lt;/i&gt;`</span> : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 判断是否为活动状态（选中状态）</span></span><br><span class="line">      <span class="keyword">const</span> isActive = active === tabId ? <span class="string">&#x27; active&#x27;</span> : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 回到顶部按钮的 HTML</span></span><br><span class="line">      <span class="keyword">const</span> toTopButton = <span class="string">&#x27;&lt;button type=&quot;button&quot; class=&quot;tab-to-top&quot; aria-label=&quot;scroll to top&quot;&gt;&lt;i class=&quot;solitude fas fa-arrow-up&quot;&gt;&lt;/i&gt;&lt;/button&gt;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">      <span class="comment">// 根据是否存在链接来生成导航项</span></span><br><span class="line">      <span class="keyword">return</span> &#123;</span><br><span class="line">        <span class="attr">nav</span>: <span class="title function_">createNavItem</span>(link, tabHref, iconHtml, tabCaption, isActive, ),</span><br><span class="line">        <span class="comment">// 选项卡的内容部分</span></span><br><span class="line">        <span class="attr">content</span>: <span class="string">`&lt;div class=&quot;tab-item-content<span class="subst">$&#123;isActive&#125;</span>&quot; id=&quot;<span class="subst">$&#123;tabHref&#125;</span>&quot;&gt;<span class="subst">$&#123;postContent&#125;</span><span class="subst">$&#123;toTopButton&#125;</span>&lt;/div&gt;`</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="keyword">const</span> <span class="title function_">renderMarkdown</span> = (<span class="params">text</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> hexo.<span class="property">render</span>.<span class="title function_">renderSync</span>(&#123; text, <span class="attr">engine</span>: <span class="string">&#x27;markdown&#x27;</span> &#125;).<span class="title function_">trim</span>();</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">createNavItem</span> = (<span class="params">link, tabHref, iconHtml, tabCaption, isActive</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> buttonContent = <span class="string">`<span class="subst">$&#123;iconHtml&#125;</span><span class="subst">$&#123;tabCaption.trim() || <span class="string">`<span class="subst">$&#123;name&#125;</span> <span class="subst">$&#123;tabHref&#125;</span>`</span>&#125;</span>`</span>;</span><br><span class="line">    <span class="keyword">return</span> link ? <span class="string">`</span></span><br><span class="line"><span class="string">      &lt;li class=&quot;tab<span class="subst">$&#123;isActive&#125;</span>&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;button onclick=&quot;location.href=&#x27;<span class="subst">$&#123;link&#125;</span>&#x27;&quot; data-href=&quot;#<span class="subst">$&#123;tabHref&#125;</span>&quot; type=&quot;button&quot;&gt;</span></span><br><span class="line"><span class="string">          <span class="subst">$&#123;buttonContent&#125;</span></span></span><br><span class="line"><span class="string">        &lt;/button&gt;</span></span><br><span class="line"><span class="string">      &lt;/li&gt;`</span> : <span class="string">`</span></span><br><span class="line"><span class="string">      &lt;li class=&quot;tab<span class="subst">$&#123;isActive&#125;</span>&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;button type=&quot;button&quot; data-href=&quot;#<span class="subst">$&#123;tabHref&#125;</span>&quot;&gt;</span></span><br><span class="line"><span class="string">          <span class="subst">$&#123;buttonContent&#125;</span></span></span><br><span class="line"><span class="string">        &lt;/button&gt;</span></span><br><span class="line"><span class="string">      &lt;/li&gt;`</span>;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 生成选项卡项</span></span><br><span class="line">  <span class="keyword">const</span> tabItems = <span class="title function_">generateTabItems</span>(matches, name, active, name.<span class="title function_">toLowerCase</span>().<span class="title function_">replace</span>(<span class="regexp">/\s+/g</span>, <span class="string">&#x27;-&#x27;</span>));</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 回到顶部按钮的 HTML</span></span><br><span class="line">  <span class="keyword">const</span> toTopButton = <span class="string">&#x27;&lt;button type=&quot;button&quot; class=&quot;tab-to-top&quot; aria-label=&quot;scroll to top&quot;&gt;&lt;i class=&quot;solitude fas fa-arrow-up&quot;&gt;&lt;/i&gt;&lt;/button&gt;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 创建完整选项卡结构（包含导航和内容）</span></span><br><span class="line">  <span class="keyword">const</span> <span class="title function_">createTabStructure</span> = (<span class="params">tabItems</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> tabNav = <span class="string">`&lt;ul class=&quot;nav-tabs&quot;&gt;<span class="subst">$&#123;tabItems.map(item =&gt; item.nav).join(<span class="string">&#x27;&#x27;</span>)&#125;</span>&lt;/ul&gt;`</span>;</span><br><span class="line">    <span class="keyword">const</span> tabContent = <span class="string">`&lt;div class=&quot;tab-contents&quot;&gt;<span class="subst">$&#123;tabItems.map(item =&gt; item.content).join(<span class="string">&#x27;&#x27;</span>)&#125;</span>&lt;/div&gt;`</span>;</span><br><span class="line">    <span class="keyword">return</span> &#123; tabNav, tabContent &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 获取生成的选项卡导航和内容</span></span><br><span class="line">  <span class="keyword">const</span> &#123; tabNav, tabContent &#125; = <span class="title function_">createTabStructure</span>(tabItems);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 返回最终的选项卡 HTML 结构</span></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`&lt;div class=&quot;tabs&quot; id=&quot;<span class="subst">$&#123;name.toLowerCase().replace(/\s+/g, <span class="string">&#x27;-&#x27;</span>)&#125;</span>&quot;&gt;<span class="subst">$&#123;tabNav&#125;</span><span class="subst">$&#123;tabContent&#125;</span>&lt;/div&gt;`</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 注册自定义标签，以便在 Hexo 中使用</span></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">tag</span>.<span class="title function_">register</span>(<span class="string">&#x27;tabs&#x27;</span>, postTabs, &#123; <span class="attr">ends</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">tag</span>.<span class="title function_">register</span>(<span class="string">&#x27;subtabs&#x27;</span>, postTabs, &#123; <span class="attr">ends</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">tag</span>.<span class="title function_">register</span>(<span class="string">&#x27;subsubtabs&#x27;</span>, postTabs, &#123; <span class="attr">ends</span>: <span class="literal">true</span> &#125;);</span><br></pre></td></tr></table></figure></li><li>在 <strong>source&#x2F;custom&#x2F;css&#x2F;custom.css</strong> 最后添加（没有就新建）： <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* tab标签的链接跳转 */</span></span><br><span class="line"><span class="selector-class">.tab-to-top</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">16px</span> <span class="number">0</span> <span class="number">0</span> auto;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-lighttext);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tabs</span> <span class="selector-class">.nav-tabs</span> <span class="selector-class">.tab</span> <span class="selector-tag">button</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">0.3rem</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tabs</span> <span class="selector-class">.nav-tabs</span> <span class="selector-class">.tab</span><span class="selector-class">.active</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--light-grey);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tabs</span> <span class="selector-class">.nav-tabs</span> <span class="selector-class">.tab</span><span class="selector-class">.active</span> <span class="selector-tag">i</span>,</span><br><span class="line"><span class="selector-class">.tabs</span> <span class="selector-class">.nav-tabs</span> <span class="selector-class">.tab</span><span class="selector-class">.active</span> <span class="selector-tag">button</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-lighttext);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.tabs</span> <span class="selector-class">.nav-tabs</span> <span class="selector-class">.tab</span> <span class="selector-tag">i</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">0.3rem</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>在 <strong>themes&#x2F;solitude&#x2F;source&#x2F;js&#x2F;main.js</strong> 最后添加： <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">initCodeBlocks</span> = (<span class="params">container</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123; highlight &#125; = <span class="variable constant_">GLOBAL_CONFIG</span>;</span><br><span class="line">  <span class="keyword">if</span> (!highlight?.<span class="property">limit</span>) <span class="keyword">return</span>;</span><br><span class="line">  <span class="keyword">const</span> limit = highlight.<span class="property">limit</span>;</span><br><span class="line">  <span class="keyword">const</span> syntax = highlight.<span class="property">syntax</span> || <span class="string">&#x27;prismjs&#x27;</span>;</span><br><span class="line">  <span class="keyword">const</span> selector = syntax === <span class="string">&#x27;highlight.js&#x27;</span> </span><br><span class="line">    ? <span class="string">&#x27;figure.highlight&#x27;</span> </span><br><span class="line">    : <span class="string">&#x27;pre[class*=&quot;language-&quot;]&#x27;</span>;</span><br><span class="line">  container.<span class="title function_">querySelectorAll</span>(selector).<span class="title function_">forEach</span>(<span class="function"><span class="params">item</span> =&gt;</span> &#123;</span><br><span class="line">    item.<span class="property">style</span>.<span class="property">maxHeight</span> = <span class="string">`<span class="subst">$&#123;limit&#125;</span>px`</span>;</span><br><span class="line">    item.<span class="property">style</span>.<span class="property">overflow</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line">    <span class="keyword">if</span> (item.<span class="property">scrollHeight</span> &gt; limit + <span class="number">30</span> &amp;&amp; !item.<span class="title function_">querySelector</span>(<span class="string">&#x27;.code-expand-btn&#x27;</span>)) &#123;</span><br><span class="line">      <span class="keyword">const</span> btn = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>);</span><br><span class="line">      btn.<span class="property">className</span> = <span class="string">&#x27;code-expand-btn&#x27;</span>;</span><br><span class="line">      btn.<span class="property">innerHTML</span> = <span class="string">&#x27;&lt;i class=&quot;solitude fas fa-angles-down&quot;&gt;&lt;/i&gt;&#x27;</span>;</span><br><span class="line">      btn.<span class="property">onclick</span> = <span class="function">() =&gt;</span> &#123;</span><br><span class="line">        item.<span class="property">style</span>.<span class="property">maxHeight</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">        btn.<span class="title function_">remove</span>();</span><br><span class="line">      &#125;;</span><br><span class="line">      syntax === <span class="string">&#x27;highlight.js&#x27;</span></span><br><span class="line">        ? item.<span class="title function_">querySelector</span>(<span class="string">&#x27;table&#x27;</span>).<span class="title function_">appendChild</span>(btn)</span><br><span class="line">        : item.<span class="property">parentNode</span>.<span class="title function_">insertBefore</span>(btn, item.<span class="property">nextSibling</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;;</span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="title function_">initCodeBlocks</span>(<span class="variable language_">document</span>);</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, handleTabClick);</span><br><span class="line">&#125;);</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">handleTabClick</span> = (<span class="params">e</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> tab = e.<span class="property">target</span>.<span class="title function_">closest</span>(<span class="string">&#x27;.nav-tabs [data-href]&#x27;</span>);</span><br><span class="line">  <span class="keyword">if</span> (!tab) <span class="keyword">return</span>;</span><br><span class="line">  <span class="keyword">const</span> targetContent = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(tab.<span class="title function_">getAttribute</span>(<span class="string">&#x27;data-href&#x27;</span>));</span><br><span class="line">  targetContent.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;active&#x27;</span>);</span><br><span class="line">  <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="title function_">initCodeBlocks</span>(targetContent), <span class="number">50</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="title function_">initCodeBlocks</span>(<span class="variable language_">document</span>);</span><br><span class="line">  <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, handleTabClick);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li>用法 <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs 唯一名称, [index] %&#125;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab [唯一Tab] [@icon] [链接] --&gt;</span><br><span class="line"></span><br><span class="line">任何内容（也支持内联标签）。</span><br><span class="line"></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&#123;% endtabs %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% tabs test, 1 %&#125;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab test @fas fa-book [https://test.com] --&gt;</span><br><span class="line"></span><br><span class="line">任何内容（也支持内联标签）。</span><br><span class="line"></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="tabsxiugai-3"><table><thead><tr><th>参考</th><th>原帖</th></tr></thead><tbody><tr><td>外挂标签使用</td><td><a href="https://solitude.js.org/posts/8f9926b7.html#Tabs">伍十七</a></td></tr></tbody></table></div></div></div><h3 id="3-微信公众号卡片"><a href="#3-微信公众号卡片" class="headerlink" title="3. 微信公众号卡片"></a>3. 微信公众号卡片</h3><div class="tabs" id="flip"><ul class="nav-tabs"><li class="tab active"><a class="#flip-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#flip-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="flip-1"><p>左边侧边栏，点击它可以跳转wechatOA。</p></div><div class="tab-pane" id="flip-2"><ul><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;aside&#x2F;asideFlipCard.pug</strong> 文件：  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//- 添加这一行，位于第一行</span><br><span class="line">a(href=&quot;/rss/wechatOA/&quot;,data-pajx)</span><br><span class="line">    .card-widget.card-platform</span><br><span class="line">        #flip-wrapper</span><br><span class="line">            #flip-content</span><br><span class="line">                .face</span><br><span class="line">                .back.face</span><br></pre></td></tr></table></figure></li></ul></div></div></div><h3 id="4-友链、留言页"><a href="#4-友链、留言页" class="headerlink" title="4. 友链、留言页"></a>4. 友链、留言页</h3><div class="tabs" id="linkban"><ul class="nav-tabs"><li class="tab active"><a class="#linkban-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#linkban-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="linkban-1"><p>改为点击按钮跳转页面。</p></div><div class="tab-pane" id="linkban-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;languages&#x2F;</strong> 下所有文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># default.yml</span></span><br><span class="line"><span class="attr">link:</span></span><br><span class="line">  <span class="attr">banner:</span></span><br><span class="line">    <span class="attr">toComment:</span> <span class="string">申请/修改友链</span> <span class="comment"># 修改这一行</span></span><br><span class="line"><span class="comment"># en.yml</span></span><br><span class="line"><span class="attr">link:</span></span><br><span class="line">  <span class="attr">banner:</span></span><br><span class="line">    <span class="attr">toComment:</span> <span class="string">Application/Modification</span> <span class="string">link</span></span><br><span class="line"><span class="comment"># zh-CN.yml</span></span><br><span class="line"><span class="attr">link:</span></span><br><span class="line">  <span class="attr">banner:</span></span><br><span class="line">    <span class="attr">toComment:</span> <span class="string">申请/修改友链</span></span><br><span class="line"><span class="comment"># zh-TW.yml</span></span><br><span class="line"><span class="attr">link:</span></span><br><span class="line">  <span class="attr">banner:</span></span><br><span class="line">    <span class="attr">toComment:</span> <span class="string">申請/修改友鏈</span></span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;page&#x2F;links&#x2F;banner.pug</strong> 文件： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">//- ...</span><br><span class="line">if theme.comment.use</span><br><span class="line">    //- 替换链接跳转 </span><br><span class="line">    a.banner-button(onclick=&quot;window.open(&#x27;https://github.com/ymxblog/friends/&#x27;,&#x27; _blank&#x27;)&quot;)</span><br><span class="line">        i.solitude.fas.fa-circle-chevron-right</span><br><span class="line">        span.solitude.banner-button-text=_p(&#x27;link.banner.toComment&#x27;)</span><br><span class="line">//- ...</span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;page&#x2F;message&#x2F;content.pug</strong> 文件： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">.article-container</span><br><span class="line">    != page.content</span><br><span class="line">    if theme.envelope.enable</span><br><span class="line">        .switch_message</span><br><span class="line">            button.open(type=&#x27;button&#x27; onclick=&quot;document.getElementById(&#x27;barrage&#x27;).classList.remove(&#x27;hide&#x27;)&quot;)</span><br><span class="line">                span(aria-hidden=&#x27;true&#x27;)= __(&#x27;message.open&#x27;)</span><br><span class="line">            button.close(type=&#x27;button&#x27; onclick=&quot;document.getElementById(&#x27;barrage&#x27;).classList.add(&#x27;hide&#x27;)&quot;)</span><br><span class="line">                span(aria-hidden=&#x27;true&#x27;)= __(&#x27;message.close&#x27;)</span><br><span class="line">            //- 添加这两行，链接可改</span><br><span class="line">            button(type=&#x27;button&#x27; onclick=&quot;window.open(&#x27;https://github.com/ymxblog/friends/&#x27;,&#x27; _blank&#x27;)&quot;)</span><br><span class="line">                span(aria-hidden=&#x27;true&#x27;)= __(&#x27;link.banner.toComment&#x27;) </span><br><span class="line">        #barrage</span><br></pre></td></tr></table></figure></li></ol></div></div></div><h3 id="5-waline评论计数"><a href="#5-waline评论计数" class="headerlink" title="5. waline评论计数"></a>5. waline评论计数</h3><div class="tabs" id="pl"><ul class="nav-tabs"><li class="tab active"><a class="#pl-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#pl-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#pl-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="pl-1"><p>无法获取waline的评论数据，返回undefined，翻了一下官方文档进行修改。</p></div><div class="tab-pane" id="pl-2"><ul><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;sidebar&#x2F;waline.pug</strong> 如下：  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">.length-num#waline_allcount</span><br><span class="line">  i.solitude.fa-solid.fa-spinner.fa-spin</span><br><span class="line"></span><br><span class="line">script(pjax).</span><br><span class="line">  (async () =&gt; &#123;</span><br><span class="line">    await fetch(&#x27;!&#123;theme.waline.envId&#125;/api/comment?type=count&#x27;, &#123;method: &#x27;GET&#x27;&#125;).then(async res =&gt; res.json())</span><br><span class="line">      .then(async data =&gt; &#123;</span><br><span class="line">        document.querySelector(&#x27;#waline_allcount&#x27;).innerHTML = data.data</span><br><span class="line">      &#125;)</span><br><span class="line">  &#125;)()</span><br></pre></td></tr></table></figure></li></ul></div><div class="tab-pane" id="pl-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>API-Waline</td><td><a href="https://waline.js.org/reference/server/api.html">官网</a></td></tr></tbody></table></div></div></div><h3 id="6-添加评论协议"><a href="#6-添加评论协议" class="headerlink" title="6. 添加评论协议"></a>6. 添加评论协议</h3><div class="tabs" id="xypl"><ul class="nav-tabs"><li class="tab active"><a class="#xypl-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#xypl-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="xypl-1"><p>评论区可看。</p></div><div class="tab-pane" id="xypl-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;third-party&#x2F;comments&#x2F;comment.pug</strong> 如下： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">//- ...</span><br><span class="line"></span><br><span class="line">if use.length &gt; 1</span><br><span class="line">    .comment-switch</span><br><span class="line">        span.first=use[0]</span><br><span class="line">        span#switch-btn</span><br><span class="line">        span.second=use[1]</span><br><span class="line"></span><br><span class="line">a.plxycss(href=&quot;/comment/&quot;)</span><br><span class="line">    i.solitude.fas.fa-file-lines</span><br><span class="line">    span &amp;nbsp;评论协议</span><br><span class="line"></span><br><span class="line">//- ...</span><br></pre></td></tr></table></figure></li><li>在 <strong>source&#x2F;custom&#x2F;css&#x2F;custom.css</strong> 最后添加（没有就新建）： <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 评论协议样式 */</span></span><br><span class="line"><span class="selector-tag">a</span><span class="selector-class">.plxycss</span> &#123;</span><br><span class="line">  <span class="attribute">float</span>: right;</span><br><span class="line">  <span class="attribute">font-weight</span>: bold;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol></div></div></div><h3 id="7-添加即刻短文图片的描述"><a href="#7-添加即刻短文图片的描述" class="headerlink" title="7. 添加即刻短文图片的描述"></a>7. 添加即刻短文图片的描述</h3><div class="tabs" id="jkdy"><ul class="nav-tabs"><li class="tab active"><a class="#jkdy-1"><i class="fas fa-wand-magic-sparkles [/essay/]"></i>效果</a></li><li class="tab"><a class="#jkdy-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="jkdy-1"><p>即刻短言可看，点效果跳转</p></div><div class="tab-pane" id="jkdy-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;page&#x2F;brevity.pug</strong> 如下： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">//- ...</span><br><span class="line"></span><br><span class="line">if item.image</span><br><span class="line">    .bber-content-img</span><br><span class="line">        each img in item.image</span><br><span class="line">            if typeof img === &#x27;string&#x27;</span><br><span class="line">                img(src=img, alt=item.content || &quot;图片暂无描述&quot;)</span><br><span class="line">            else</span><br><span class="line">                img(src=img.url, alt=(img.alt || item.content || &quot;图片暂无描述&quot;))</span><br><span class="line"></span><br><span class="line">//- ...</span><br></pre></td></tr></table></figure></li><li>用法两者皆可 <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">content:</span> <span class="string">这次做的椰奶冻粉还不错，就是糖放多了，好吃(╯▽╰</span> <span class="string">)好香~~</span></span><br><span class="line">  <span class="attr">date:</span> <span class="number">2025-03-27 00:01:00</span></span><br><span class="line">  <span class="attr">location:</span> <span class="string">家</span></span><br><span class="line">  <span class="attr">image:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">url:</span> <span class="string">https://images.418121.xyz/file/blog/essay/2025/03/27/01.webp</span></span><br><span class="line">      <span class="attr">alt:</span> <span class="string">按着教程来的，事不过三，终于成功了</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">content:</span> <span class="string">我弟弟妹妹画的，很有天赋，像我小时候一样</span> <span class="string">b(￣▽￣)d</span> <span class="string">~</span></span><br><span class="line">  <span class="attr">date:</span> <span class="number">2025-03-26 21:30:00</span></span><br><span class="line">  <span class="attr">location:</span> <span class="string">家</span></span><br><span class="line">  <span class="attr">image:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">https://images.418121.xyz/file/blog/essay/2025/03/26/01.webp</span></span><br></pre></td></tr></table></figure></li></ol></div></div></div><h3 id="8-适配Waline文章热度"><a href="#8-适配Waline文章热度" class="headerlink" title="8. 适配Waline文章热度"></a>8. 适配Waline文章热度</h3><div class="tabs" id="redu"><ul class="nav-tabs"><li class="tab active"><a class="#redu-1"><i class="fas fa-wand-magic-sparkles [/]"></i>效果</a></li><li class="tab"><a class="#redu-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#redu-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="redu-1"><p>超过五条评论即可显示”多人互动“，点效果跳转。</p></div><div class="tab-pane" id="redu-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;third-party&#x2F;hot&#x2F;index.pug</strong> 如下： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">- const &#123; count &#125; = theme.comment.hot_tip</span><br><span class="line">- const &#123; use &#125; = theme.comment</span><br><span class="line"></span><br><span class="line">if use</span><br><span class="line">    case use[0]</span><br><span class="line">      when &#x27;Twikoo&#x27;</span><br><span class="line">          include ./twikoo</span><br><span class="line">      when &#x27;Artalk&#x27;</span><br><span class="line">          include ./artalk</span><br><span class="line">      //- 添加下面两行</span><br><span class="line">      when &#x27;Waline&#x27;</span><br><span class="line">          include ./waline</span><br></pre></td></tr></table></figure></li><li>在 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;third-party&#x2F;hot&#x2F;</strong> 下添加 <strong>waline.pug</strong> 文件： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">script.</span><br><span class="line">  function updatePostsBasedOnComments() &#123;</span><br><span class="line">    const location = window.location.origin;</span><br><span class="line">    const posts = Array.from(document.querySelectorAll(&#x27;.recent-post-item[onclick] .post_cover a&#x27;))</span><br><span class="line">      .map(item =&gt; item.href.replace(location, &#x27;&#x27;));</span><br><span class="line">    const fetchCommentsCount = () =&gt; &#123;</span><br><span class="line">      const requests = posts.map(url =&gt; &#123;</span><br><span class="line">        return fetch(`#&#123;theme.waline.envId&#125;/api/comment?type=count&amp;url=$&#123;encodeURIComponent(url)&#125;`)</span><br><span class="line">          .then(response =&gt; response.json())</span><br><span class="line">          .then(data =&gt; (&#123;</span><br><span class="line">            url: url,</span><br><span class="line">            count: data.errno === 0 ? data.data[0] : 0</span><br><span class="line">          &#125;));</span><br><span class="line">      &#125;);</span><br><span class="line">      Promise.all(requests)</span><br><span class="line">        .then(handleCommentsResponse)</span><br><span class="line">        .catch(error =&gt; console.error(&quot;Error fetching comments:&quot;, error));</span><br><span class="line">    &#125;;</span><br><span class="line">    const handleCommentsResponse = (response) =&gt; &#123;</span><br><span class="line">      response.forEach((&#123; url, count &#125;) =&gt; &#123;</span><br><span class="line">        if (count &gt; #&#123;count&#125;) &#123;</span><br><span class="line">          const postElement = document.querySelector(`.recent-post-item[onclick*=&quot;$&#123;url&#125;&quot;]`);</span><br><span class="line">          if (postElement) updatePostElement(postElement);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;;</span><br><span class="line">    const updatePostElement = (postElement) =&gt; &#123;</span><br><span class="line">      const infoTopTips = postElement.querySelector(&quot;.recent-post-info-top-tips&quot;);</span><br><span class="line">      const originalSpan = infoTopTips?.querySelector(&quot;.original&quot;);</span><br><span class="line">      const existingHotTip = infoTopTips?.querySelector(&quot;.hot-tip&quot;);</span><br><span class="line">      if (!existingHotTip &amp;&amp; originalSpan) &#123;</span><br><span class="line">        const hotTip = createHotTipElement();</span><br><span class="line">        infoTopTips.insertBefore(hotTip, originalSpan);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    const createHotTipElement = () =&gt; &#123;</span><br><span class="line">      const hotTip = document.createElement(&quot;span&quot;);</span><br><span class="line">      hotTip.classList.add(&quot;hot-tip&quot;);</span><br><span class="line">      const icon = document.createElement(&quot;i&quot;);</span><br><span class="line">      icon.classList.add(&quot;solitude&quot;, &quot;fas&quot;, &quot;fa-fire-flame-curved&quot;);</span><br><span class="line">      hotTip.appendChild(icon);</span><br><span class="line">      const commentCount = document.createTextNode(&quot;#&#123;_p(&#x27;hot-tip&#x27;)&#125;&quot;);</span><br><span class="line">      hotTip.appendChild(commentCount);</span><br><span class="line">      return hotTip;</span><br><span class="line">    &#125;;</span><br><span class="line">      fetchCommentsCount();</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure></li><li>确认功能是否开启 <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ...</span></span><br><span class="line">  <span class="comment"># Hot comment tips</span></span><br><span class="line">  <span class="comment"># 热评提示</span></span><br><span class="line">  <span class="attr">hot_tip:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="comment"># Number of hot comments</span></span><br><span class="line">    <span class="attr">count:</span> <span class="number">5</span></span><br><span class="line"><span class="comment"># ...</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="redu-3"><p>参考了本<a href="https://github.com/everfu/hexo-theme-solitude">主题</a>适配Twikoo的用法。</p></div></div></div><h3 id="9-魔改主题关于页"><a href="#9-魔改主题关于页" class="headerlink" title="9. 魔改主题关于页"></a>9. 魔改主题关于页</h3><div class="tabs" id="about"><ul class="nav-tabs"><li class="tab active"><a class="#about-1"><i class="fas fa-wand-magic-sparkles [/about/]"></i>效果</a></li><li class="tab"><a class="#about-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#about-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="about-1"><p>点击效果，即可跳转至关于页。</p></div><div class="tab-pane" id="about-2"><ol><li>参考 <a href="https://blog.anheyu.com/about/">anzhiyu 主题关于页</a>进行魔改 <a href="/about/">solitude 主题关于页</a></li><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;page&#x2F;about&#x2F;hobbies.pug</strong> 如下（复制粘贴覆盖）： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">- var games = site.data.about.game</span><br><span class="line"></span><br><span class="line">if games</span><br><span class="line">    .author-content</span><br><span class="line">        each game, index in games</span><br><span class="line">            style.</span><br><span class="line">                .game-#&#123;index&#125;::after &#123;</span><br><span class="line">                    box-shadow: #&#123;game.box_shadow&#125; !important;</span><br><span class="line">                &#125;</span><br><span class="line">            .author-content-item.game(class=`game-$&#123;index&#125;`, style=`background: url($&#123;game.img&#125;) no-repeat top; background-size: cover;`)</span><br><span class="line">                .card-content</span><br><span class="line">                    .author-content-item-tips= game.title</span><br><span class="line">                    span.author-content-item-title= game.subtitle</span><br><span class="line">                    .content-bottom</span><br><span class="line">                        if game.icon_group</span><br><span class="line">                            .icon-group</span><br><span class="line">                                each icon in game.icon_group</span><br><span class="line">                                    i(style=`background-image: url($&#123;icon&#125;)`)</span><br><span class="line">                        else if game.tips_left</span><br><span class="line">                            .tips= game.tips_left</span><br><span class="line">                        if game.tips_right</span><br><span class="line">                            .tips= game.tips_right</span><br><span class="line"></span><br><span class="line">if site.data.about.likes</span><br><span class="line">  - const likes = site.data.about.likes</span><br><span class="line">  .author-content</span><br><span class="line">    each like in likes</span><br><span class="line">      if like.type === &#x27;comic&#x27;</span><br><span class="line">        .author-content-item.comic</span><br><span class="line">            .card-content</span><br><span class="line">            .author-content-item-tips= like.tips</span><br><span class="line">            span.author-content-item-title= like.title</span><br><span class="line">            .content-bottom</span><br><span class="line">              if like.subtips</span><br><span class="line">                .tips= like.subtips</span><br><span class="line">              if like.button</span><br><span class="line">                .banner-button-group</span><br><span class="line">                  a.banner-button(href=url_for(like.button_link))</span><br><span class="line">                    i.solitude.fas.fa-circle-chevron-right</span><br><span class="line">                    span.banner-button-text= like.button_text</span><br><span class="line">            .comic-box</span><br><span class="line">              each item in like.list</span><br><span class="line">              a.comic-item(href=item.href target=&quot;_blank&quot;, rel=&quot;noopener noreferrer&quot;, title=item.name)</span><br><span class="line">                .comic-item-cover</span><br><span class="line">                //- nolazyload 我感觉不用加，不加的话好像会一直请求，所以我加了，自己试试吧。</span><br><span class="line">                img.nolazyload(src=item.cover, alt=item.name)</span><br><span class="line"></span><br><span class="line">      else</span><br><span class="line">        .author-content-item(class=like.type style=`background: url($&#123;like.bg&#125;) no-repeat center/cover`)</span><br><span class="line">          .card-content</span><br><span class="line">            .author-content-item-tips= like.tips</span><br><span class="line">            span.author-content-item-title= like.title</span><br><span class="line">            .content-bottom</span><br><span class="line">              if like.subtips</span><br><span class="line">                .tips= like.subtips</span><br><span class="line">              if like.button</span><br><span class="line">                .banner-button-group</span><br><span class="line">                  a.banner-button(href=url_for(like.button_link))</span><br><span class="line">                    i.solitude.fas.fa-circle-chevron-right</span><br><span class="line">                    span.banner-button-text= like.button_text</span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;source&#x2F;css&#x2F;_page&#x2F;_about&#x2F;like.styl</strong> 如下（复制粘贴覆盖）： <figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#about-page</span></span><br><span class="line">  <span class="selector-class">.author-content-item</span><span class="selector-class">.like-technology</span></span><br><span class="line">    <span class="attribute">background-size</span> cover</span><br><span class="line">    <span class="attribute">min-height</span> <span class="number">230px</span></span><br><span class="line">    <span class="attribute">color</span> <span class="built_in">var</span>(--efu-white)</span><br><span class="line">    <span class="selector-pseudo">&amp;::after</span></span><br><span class="line">      <span class="attribute">box-shadow</span> <span class="number">0</span> -<span class="number">69px</span> <span class="number">100px</span> <span class="number">10px</span> <span class="number">#050b20</span> inset</span><br><span class="line">      <span class="attribute">position</span> absolute</span><br><span class="line">      <span class="attribute">content</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">      <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">      <span class="attribute">left</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.author-content-item</span><span class="selector-class">.like-music</span></span><br><span class="line">    <span class="attribute">background-size</span> cover</span><br><span class="line">    <span class="attribute">min-height</span> <span class="number">400px</span></span><br><span class="line">    <span class="attribute">color</span> <span class="built_in">var</span>(--efu-white)</span><br><span class="line">    <span class="attribute">overflow</span> hidden</span><br><span class="line">    <span class="selector-pseudo">&amp;::after</span></span><br><span class="line">      <span class="attribute">box-shadow</span> <span class="number">0</span> -<span class="number">69px</span> <span class="number">100px</span> <span class="number">10px</span> <span class="number">#0e0e0e</span> inset</span><br><span class="line">      <span class="attribute">position</span> absolute</span><br><span class="line">      <span class="attribute">content</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">      <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">      <span class="attribute">left</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.author-content-item</span><span class="selector-class">.comic</span></span><br><span class="line">    <span class="attribute">min-height</span> <span class="number">400px</span></span><br><span class="line">    <span class="attribute">color</span> <span class="built_in">var</span>(--efu-white)</span><br><span class="line">    <span class="attribute">position</span> relative</span><br><span class="line">    </span><br><span class="line">    <span class="selector-class">.comic-box</span></span><br><span class="line">      <span class="attribute">width</span> <span class="number">110%</span></span><br><span class="line">      <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">display</span> flex</span><br><span class="line">      <span class="attribute">position</span> absolute</span><br><span class="line">      <span class="attribute">left</span> <span class="number">50%</span></span><br><span class="line">      <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">      <span class="attribute">transform</span> <span class="built_in">translateX</span>(-<span class="number">50%</span>)</span><br><span class="line">      <span class="selector-pseudo">&amp;::after</span></span><br><span class="line">        <span class="attribute">box-shadow</span> <span class="number">0</span> -<span class="number">69px</span> <span class="number">100px</span> <span class="number">10px</span> <span class="number">#04120f</span> inset</span><br><span class="line">        <span class="attribute">position</span> absolute</span><br><span class="line">        <span class="attribute">content</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">        <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">        <span class="attribute">left</span> <span class="number">0</span></span><br><span class="line">        <span class="attribute">pointer-events</span>: none;</span><br><span class="line">    </span><br><span class="line">    <span class="selector-class">.author-content-item-tips</span>,</span><br><span class="line">    <span class="selector-class">.author-content-item-title</span>,</span><br><span class="line">    <span class="selector-class">.content-bottom</span></span><br><span class="line">      <span class="attribute">z-index</span> <span class="number">3</span></span><br><span class="line">      <span class="attribute">color</span> <span class="built_in">var</span>(--efu-white)</span><br><span class="line">    </span><br><span class="line">    <span class="selector-class">.comic-item</span></span><br><span class="line">      <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">      <span class="attribute">color</span> <span class="built_in">var</span>(--efu-white)</span><br><span class="line">      <span class="attribute">width</span> <span class="number">20%</span></span><br><span class="line">      <span class="attribute">transform</span> <span class="built_in">skew</span>(-<span class="number">10deg</span>, <span class="number">0deg</span>)</span><br><span class="line">      <span class="attribute">transition</span> <span class="number">0.8s</span></span><br><span class="line">      <span class="attribute">position</span> relative</span><br><span class="line">      <span class="attribute">overflow</span> hidden</span><br><span class="line">      <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">46%</span></span><br><span class="line">        <span class="selector-class">.comic-item-cover</span></span><br><span class="line">          <span class="attribute">left</span> <span class="number">16%</span></span><br><span class="line">          <span class="attribute">transform</span> <span class="built_in">skew</span>(<span class="number">10deg</span>, <span class="number">0deg</span>) <span class="built_in">scale</span>(<span class="number">1.6</span>)</span><br><span class="line"></span><br><span class="line">      <span class="selector-class">.comic-item-cover</span></span><br><span class="line">        <span class="attribute">position</span> absolute</span><br><span class="line">        <span class="attribute">top</span> <span class="number">0</span></span><br><span class="line">        <span class="attribute">left</span> -<span class="number">50%</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">        <span class="attribute">transform</span> <span class="built_in">skew</span>(<span class="number">10deg</span>, <span class="number">0deg</span>)</span><br><span class="line">        <span class="attribute">object-fit</span> cover</span><br><span class="line">        <span class="attribute">transition</span> scale <span class="number">0.2s</span>, all <span class="number">0.8s</span></span><br><span class="line">        <span class="selector-tag">img</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">          <span class="attribute">max-width</span> none</span><br><span class="line">          <span class="attribute">transition</span> <span class="number">0.8s</span></span><br><span class="line"></span><br><span class="line">  <span class="selector-class">.author-content-item</span><span class="selector-class">.comic</span></span><br><span class="line">    <span class="selector-class">.comic-box</span></span><br><span class="line">      +<span class="built_in">maxWidth1400</span>()</span><br><span class="line">          <span class="attribute">width</span> <span class="number">120%</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">100%</span>      </span><br><span class="line">      +<span class="built_in">maxWidth768</span>()</span><br><span class="line">          <span class="attribute">width</span> <span class="number">109%</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">      +<span class="built_in">maxWidth690</span>()</span><br><span class="line">          <span class="attribute">width</span> <span class="number">120%</span></span><br><span class="line">          <span class="attribute">height</span> <span class="number">100%</span></span><br></pre></td></tr></table></figure></li><li>用法：保留之前的格式，新增comic类型 <a href="https://blog.418121.xyz/about/">示例</a> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># comic 和 like-technology 二选一 你全要也可以</span></span><br><span class="line"><span class="attr">likes:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">type:</span> <span class="string">&quot;comic&quot;</span></span><br><span class="line">    <span class="attr">tips:</span> <span class="string">爱好番剧</span> <span class="comment"># 右上角提示</span></span><br><span class="line">    <span class="attr">title:</span> <span class="string">追番</span> <span class="comment"># 标题</span></span><br><span class="line">    <span class="attr">subtips:</span> <span class="string">&quot;科幻、动漫、喜剧&quot;</span> <span class="comment"># 左下小字，可不要</span></span><br><span class="line">    <span class="attr">list:</span> <span class="comment"># 最好就是五个或以上，相信你们肯定没那么少的。</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">你的名字</span> <span class="comment"># 动漫或影视名</span></span><br><span class="line">        <span class="attr">href:</span> <span class="string">https://movie.douban.com/subject/26683290/</span> <span class="comment"># B站或豆瓣某个位置</span></span><br><span class="line">        <span class="attr">cover:</span> <span class="string">https://images.418121.xyz/file/blog/covers/p2910701461.webp</span>  <span class="comment"># 封面图</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">href:</span> <span class="string">https://www.bilibili.com/bangumi/media/md1699</span></span><br><span class="line">        <span class="attr">cover:</span> <span class="string">https://images.418121.xyz/file/blog/covers/p2232343678.webp</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">流浪地球2</span></span><br><span class="line">        <span class="attr">href:</span> <span class="string">https://movie.douban.com/subject/35267208/</span></span><br><span class="line">        <span class="attr">cover:</span> <span class="string">https://images.418121.xyz/file/blog/covers/p2886653882.webp</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">href:</span> <span class="string">https://movie.douban.com/subject/34874432/</span></span><br><span class="line">        <span class="attr">cover:</span> <span class="string">https://images.418121.xyz/file/blog/covers/p2868462052.webp</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">href:</span> <span class="string">https://movie.douban.com/subject/30402296/</span></span><br><span class="line">        <span class="attr">cover:</span> <span class="string">https://images.418121.xyz/file/blog/covers/p2558022335.webp</span></span><br><span class="line">    <span class="attr">button:</span> <span class="literal">true</span> <span class="comment"># false 可以关闭右边按钮</span></span><br><span class="line">    <span class="attr">button_link:</span> <span class="string">&quot;/pyq/&quot;</span>  <span class="comment"># 跳转路径</span></span><br><span class="line">    <span class="attr">button_text:</span> <span class="string">&quot;观看记录&quot;</span>   <span class="comment"># 按钮文字</span></span><br><span class="line">  <span class="comment"># - type: &quot;like-technology&quot;</span></span><br><span class="line">  <span class="comment">#   bg: &quot;https://images.418121.xyz/file/blog/page/movie.webp&quot;</span></span><br><span class="line">  <span class="comment">#   tips: &quot;与她一起看&quot;</span></span><br><span class="line">  <span class="comment">#   title: &quot;影视偏好&quot;</span></span><br><span class="line">  <span class="comment">#   subtips: &quot;科幻、动漫、喜剧&quot;</span></span><br><span class="line">  <span class="comment">#   button: true</span></span><br><span class="line">  <span class="comment">#   button_link: &quot;/pyq/&quot;</span></span><br><span class="line">  <span class="comment">#   button_text: &quot;观看记录&quot;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">type:</span> <span class="string">&quot;like-music&quot;</span></span><br><span class="line">    <span class="attr">bg:</span> <span class="string">&quot;https://images.418121.xyz/file/blog/page/yy.webp&quot;</span></span><br><span class="line">    <span class="attr">tips:</span> <span class="string">&quot;粤语、流行&quot;</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">subtips:</span> <span class="string">&quot;账号密码：ymx&quot;</span></span><br><span class="line">    <span class="attr">button:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">button_link:</span> <span class="string">&quot;https://music.418121.xyz/app/#/login/&quot;</span></span><br><span class="line">    <span class="attr">button_text:</span> <span class="string">&quot;音乐库&quot;</span>        </span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="about-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>关于-安知鱼</td><td><a href="https://blog.anheyu.com/about/">安知鱼</a></td></tr></tbody></table></div></div></div><h3 id="10-即可短文识别-Html-标签（换行加粗等）"><a href="#10-即可短文识别-Html-标签（换行加粗等）" class="headerlink" title="10. 即可短文识别 Html 标签（换行加粗等）"></a>10. 即可短文识别 Html 标签（换行加粗等）</h3><div class="tabs" id="essaytabs"><ul class="nav-tabs"><li class="tab active"><a class="#essaytabs-1"><i class="fas fa-wand-magic-sparkles [/essay/]"></i>效果</a></li><li class="tab"><a class="#essaytabs-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="essaytabs-1"><p>单击效果跳转</p></div><div class="tab-pane" id="essaytabs-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;page&#x2F;brevity.pug</strong> 文件（第19行）： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">p.datacont!= item.content</span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;home&#x2F;bbTimeList.pug</strong> 文件（第7行）： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">| #&#123;item.content.replace(/&lt;[^&gt;]*&gt;/g, &#x27;&#x27;)&#125;</span><br></pre></td></tr></table></figure></li></ol></div></div></div><h3 id="11-即刻短文仿微信朋友圈样式"><a href="#11-即刻短文仿微信朋友圈样式" class="headerlink" title="11. 即刻短文仿微信朋友圈样式"></a>11. 即刻短文仿微信朋友圈样式</h3><div class="tabs" id="jkdwpyq"><ul class="nav-tabs"><li class="tab active"><a class="#jkdwpyq-1"><i class="fas fa-wand-magic-sparkles [/essay/]"></i>效果</a></li><li class="tab"><a class="#jkdwpyq-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#jkdwpyq-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="jkdwpyq-1"><p>点击效果即可跳转。</p></div><div class="tab-pane" id="jkdwpyq-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;page&#x2F;brevity.pug</strong> 如下： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line">include ../widgets/page/banner</span><br><span class="line">if theme.brevity.enable</span><br><span class="line">    #brevity_page</span><br><span class="line">      .author-info</span><br><span class="line">        .msg</span><br><span class="line">          .avatar</span><br><span class="line">              a.brevity-avatar(href=url_for(&#x27;/about&#x27;))</span><br><span class="line">                img(src=theme.aside.my_card.author.img)</span><br><span class="line">          .brevity-name=theme.site.name.custom</span><br><span class="line">        .desc=theme.aside.my_card.description</span><br><span class="line">    #bber</span><br><span class="line">        section.timeline.page-1</span><br><span class="line">            ul.list.waterfall</span><br><span class="line">                each item in site.data.brevity.slice(0, theme.brevity.strip)</span><br><span class="line">                    li.item</span><br><span class="line">                        if theme.brevity.style === 1</span><br><span class="line">                            .meta</span><br><span class="line">                                img.avatar(src=theme.aside.my_card.author.img)</span><br><span class="line"></span><br><span class="line">                        #bber-content</span><br><span class="line">                            .info</span><br><span class="line">                                span.bber_nick= config.author</span><br><span class="line">                            p.datacont!= item.content</span><br><span class="line">                            if item.image</span><br><span class="line">                                .bber-content-img</span><br><span class="line">                                    each img in item.image</span><br><span class="line">                                        if typeof img === &#x27;string&#x27;</span><br><span class="line">                                            img(src=img, alt=item.content || &quot;图片暂无描述&quot;)</span><br><span class="line">                                        else</span><br><span class="line">                                            img(src=img.url, alt=(img.alt || item.content || &quot;图片暂无描述&quot;))</span><br><span class="line"></span><br><span class="line">                        if item.aplayer</span><br><span class="line">                            .bber-music</span><br><span class="line">                                meting-js(server=item.aplayer.server type=&quot;song&quot; id=item.aplayer.id mutex=&quot;true&quot; preload=&quot;none&quot; theme=&quot;var(--efu-main)&quot; data-lrctype=&quot;0&quot;)</span><br><span class="line"></span><br><span class="line">                        if item.video</span><br><span class="line">                            .bber-video</span><br><span class="line">                                if item.video.player</span><br><span class="line">                                    video(src=item.video.player controls=&quot;controls&quot; style=&quot;object-fit: cover;&quot;)</span><br><span class="line">                                if item.video.bilibili</span><br><span class="line">                                    iframe(src=&#x27;//player.bilibili.com/player.html?autoplay=0&amp;bvid=&#x27; + item.video.bilibili scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;)</span><br><span class="line"></span><br><span class="line">                        if theme.brevity.style === 1</span><br><span class="line">                            .bber-bottom</span><br><span class="line">                                .bber-info</span><br><span class="line">                                    .bber-info-time</span><br><span class="line">                                        time.datetime(datetime=moment(item.date).format())</span><br><span class="line">                                    if item.location</span><br><span class="line">                                        .bber-info-location</span><br><span class="line">                                            = item.location</span><br><span class="line">                                    if item.link</span><br><span class="line">                                        a.bber-content-link(href=url_for(item.link) target=&quot;_blank&quot;)</span><br><span class="line">                                            i.solitude.fas.fa-link</span><br><span class="line">                                            = _p(&#x27;essay.link&#x27;)</span><br><span class="line">                                if theme.comment.use &amp;&amp; item.content</span><br><span class="line">                                    a.bber-reply(onclick=`sco.toTalk(&#x27;$&#123;item.content&#125;&#x27;)`)</span><br><span class="line">                                        i.solitude.fas.fa-comment</span><br><span class="line">                            hr</span><br><span class="line"></span><br><span class="line">            #bber-tips</span><br><span class="line">                if theme.brevity.strip === -1</span><br><span class="line">                    = _p(&#x27;essay.tip0&#x27;)</span><br><span class="line">                else</span><br><span class="line">                    = _p(&#x27;essay.tip1&#x27;).replace(&#x27;#&#123;count&#125;&#x27;, theme.brevity.strip)</span><br></pre></td></tr></table></figure></li><li>在 <strong>source&#x2F;custom&#x2F;css&#x2F;custom.css</strong> 最后添加（没有就新建）： <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 魔改即刻短文样式 */</span></span><br><span class="line"><span class="selector-id">#brevity_page</span> <span class="selector-class">.author-info</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">flex-direction</span>: column;</span><br><span class="line">    <span class="attribute">align-items</span>: flex-end;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">top</span>: -<span class="number">35px</span>;</span><br><span class="line">    <span class="attribute">z-index</span>: <span class="number">3</span>;</span><br><span class="line">    <span class="attribute">margin-right</span>: <span class="number">25px</span>;</span><br><span class="line">    <span class="attribute">padding-bottom</span>: <span class="number">25px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.desc</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">    <span class="attribute">padding-bottom</span>: <span class="number">8px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#brevity_page</span> <span class="selector-class">.author-info</span> <span class="selector-class">.msg</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">flex-direction</span>: row-reverse;</span><br><span class="line">    <span class="attribute">align-items</span>: flex-start;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#brevity_page</span> <span class="selector-tag">a</span><span class="selector-class">.brevity-avatar</span> &#123;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">60px</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">60px</span>;</span><br><span class="line">    <span class="attribute">display</span>: block;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">margin-top</span>: -<span class="number">15px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#brevity_page</span> <span class="selector-tag">a</span><span class="selector-class">.brevity-avatar</span> <span class="selector-tag">img</span>&#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=dark]</span> <span class="selector-id">#brevity_page</span> <span class="selector-tag">a</span><span class="selector-class">.brevity-avatar</span> &#123;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#ffffffad</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#brevity_page</span> <span class="selector-class">.brevity-name</span> &#123;</span><br><span class="line">    <span class="attribute">margin-right</span>: <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">margin-top</span>: -<span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">padding-top</span>: <span class="number">2px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#eee</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">    -webkit-<span class="selector-tag">line</span>-clamp: <span class="number">1</span>;</span><br><span class="line">    <span class="selector-tag">line</span>-clamp: <span class="number">1</span>;</span><br><span class="line">    -webkit-<span class="attribute">box-orient</span>: vertical;</span><br><span class="line">    <span class="attribute">word-break</span>: break-all;</span><br><span class="line">    <span class="attribute">display</span>: -webkit-box;</span><br><span class="line">    <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> &#123;</span><br><span class="line">    <span class="attribute">margin-top</span>: -<span class="number">2rem</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-tag">div</span><span class="selector-id">#bber-content</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-content-img</span>&#123;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">height</span>: auto;</span><br><span class="line">  <span class="attribute">display</span>: grid;</span><br><span class="line">  <span class="attribute">grid-template-columns</span>: <span class="built_in">repeat</span>(<span class="number">3</span>, <span class="number">1</span>fr); </span><br><span class="line">  <span class="attribute">gap</span>: <span class="number">4px</span>; </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-content-img</span> <span class="selector-tag">a</span>&#123;</span><br><span class="line">    <span class="attribute">overflow</span>: hidden; </span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">min-height</span>: <span class="number">0</span>; </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-content-img</span> <span class="selector-tag">a</span> <span class="selector-tag">img</span>,</span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-content</span> <span class="selector-class">.bber-video</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>; </span><br><span class="line">    <span class="attribute">height</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">object-fit</span>: cover; </span><br><span class="line">    <span class="attribute">display</span>: block; </span><br><span class="line">    <span class="attribute">transition</span>: transform <span class="number">0.3s</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-content-img</span> <span class="selector-tag">a</span><span class="selector-pseudo">:only-child</span>&#123;</span><br><span class="line">  <span class="attribute">grid-column</span>: <span class="number">1</span> / -<span class="number">1</span>; </span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-content-img</span> <span class="selector-tag">a</span><span class="selector-pseudo">:only-child</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">200px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-id">#bber-content</span> <span class="selector-class">.datacont</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">400</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--font-color);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-id">#bber-content-img</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-bottom</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: inline <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">padding-top</span>: <span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">padding-bottom</span>: <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span>&gt;<span class="selector-tag">section</span>&gt;<span class="selector-tag">ul</span>&gt;<span class="selector-tag">li</span>&gt;<span class="selector-tag">div</span> <span class="selector-class">.bber-info-from</span>,</span><br><span class="line"><span class="selector-id">#bber</span>&gt;<span class="selector-tag">section</span>&gt;<span class="selector-tag">ul</span>&gt;<span class="selector-tag">li</span>&gt;<span class="selector-tag">div</span> <span class="selector-class">.bber-info</span> <span class="selector-class">.bber-info-time</span> <span class="selector-tag">time</span><span class="selector-class">.datetime</span> &#123;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">26px</span>;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">13px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#808080</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-id">#bber-content</span> <span class="selector-class">.info</span> <span class="selector-tag">span</span><span class="selector-class">.bber_nick</span>,</span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.meta</span> <span class="selector-class">.avatar</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#8eaccd</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.bber-reply</span> &#123;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">bottom</span>: <span class="number">33px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">26px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">26px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.bber-content-link</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">13px</span> <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">position</span>: absolute;</span><br><span class="line">    <span class="attribute">right</span>: <span class="number">30px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">26px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-main)<span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.bber-content-link</span> <span class="selector-tag">i</span><span class="selector-class">.solitude</span>,</span><br><span class="line"><span class="selector-class">.bber-reply</span> <span class="selector-tag">i</span><span class="selector-class">.solitude</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">16px</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.bber-info-location</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#8eaccd</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">13px</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: transparent <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.timeline</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-class">.item</span> hr &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">var</span>(--efu-theme-op) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#bber</span> <span class="selector-class">.bber-info</span> <span class="selector-class">.bber-info-time</span>&#123;</span><br><span class="line">  <span class="attribute">background-color</span>: transparent <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">div</span><span class="selector-id">#bber-tips</span> &#123;</span><br><span class="line">    <span class="attribute">padding-bottom</span>: <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>:<span class="number">768px</span>),</span><br><span class="line">(<span class="attribute">max-height</span>:<span class="number">580px</span>) &#123;</span><br><span class="line"></span><br><span class="line">    <span class="selector-tag">body</span><span class="selector-attr">[data-type=brevity]</span> <span class="selector-id">#bber-content</span> &#123;</span><br><span class="line">        <span class="attribute">margin-left</span>: <span class="number">55px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#brevity_page</span> <span class="selector-class">.author-info</span> &#123;</span><br><span class="line">      <span class="attribute">margin-right</span>: <span class="number">10px</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="selector-class">.bber-reply</span> &#123;</span><br><span class="line">      <span class="attribute">bottom</span>: <span class="number">22px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.bber-content-link</span> &#123;</span><br><span class="line">        <span class="attribute">right</span>: <span class="number">35px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-tag">a</span><span class="selector-class">.brevity-avatar</span> &#123;</span><br><span class="line">        <span class="attribute">height</span>: <span class="number">60px</span>;</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">60px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.author-content</span><span class="selector-class">.author-content-item</span><span class="selector-class">.sharePage</span> &#123;</span><br><span class="line">        <span class="attribute">height</span>: <span class="number">16rem</span>;</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-class">.bber-bottom</span> &#123;</span><br><span class="line">      <span class="attribute">margin-left</span>: <span class="number">55px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.desc</span> &#123;</span><br><span class="line">        <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">        <span class="attribute">padding-bottom</span>: <span class="number">8px</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#bber</span> &#123;</span><br><span class="line">        <span class="attribute">margin-top</span>: -<span class="number">3rem</span> <span class="meta">!important</span>;</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">95%</span>;</span><br><span class="line">        <span class="attribute">margin</span>: auto;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-class">.timeline</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-class">.item</span> &#123;</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">        <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">        <span class="attribute">border</span>: none;</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">0</span>;</span><br><span class="line">        <span class="attribute">background</span>: <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">        <span class="attribute">box-shadow</span>: none;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-class">.timeline</span> <span class="selector-tag">ul</span> <span class="selector-tag">li</span><span class="selector-class">.item</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">        <span class="attribute">border</span>: none;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-id">#bber-content</span> <span class="selector-class">.info</span> <span class="selector-tag">span</span><span class="selector-class">.bber_nick</span> &#123;</span><br><span class="line">        <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">        <span class="attribute">font-weight</span>: <span class="number">800</span>;</span><br><span class="line">        <span class="attribute">display</span>: block;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-class">.meta</span> <span class="selector-class">.avatar</span> &#123;</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">45px</span>;</span><br><span class="line">        <span class="attribute">height</span>: <span class="number">45px</span>;</span><br><span class="line">        <span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">        <span class="attribute">overflow</span>: hidden;</span><br><span class="line">        <span class="attribute">position</span>: absolute;</span><br><span class="line">        <span class="attribute">display</span>: block;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-class">.bber-music</span> &#123;</span><br><span class="line">      <span class="attribute">width</span>: <span class="number">85%</span>;</span><br><span class="line">      <span class="attribute">margin-left</span>: <span class="number">55px</span>;</span><br><span class="line">      <span class="attribute">border</span>: none;</span><br><span class="line">      <span class="attribute">background</span>: <span class="number">0</span> <span class="number">0</span>;</span><br><span class="line">      <span class="attribute">box-shadow</span>: none;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="selector-id">#bber</span> <span class="selector-class">.bber-video</span>&#123;</span><br><span class="line">      <span class="attribute">padding</span>: <span class="number">30%</span> <span class="number">43%</span>;</span><br><span class="line">      <span class="attribute">margin-left</span>: <span class="number">55px</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>修改主题文件 <strong>_config_solitude.yml</strong>： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/custom/css/custom.css&quot;&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># --------------------------- start ---------------------------</span></span><br><span class="line"><span class="comment"># Brevity Page</span></span><br><span class="line"><span class="comment"># 即刻短文</span></span><br><span class="line"><span class="attr">brevity:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">home_mini:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">music:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">page:</span> <span class="string">/essay/</span></span><br><span class="line">  <span class="attr">style:</span> <span class="number">1</span></span><br><span class="line">  <span class="attr">strip:</span> <span class="number">-1</span></span><br><span class="line"><span class="comment"># --------------------------- end ---------------------------</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="jkdwpyq-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>主题魔改-即刻短文</td><td><a href="https://blog.bsgun.cn/posts/d0a0eba1/">梦爱吃鱼</a></td></tr></tbody></table></div></div></div><h3 id="12-恢复背景图片"><a href="#12-恢复背景图片" class="headerlink" title="12. 恢复背景图片"></a>12. 恢复背景图片</h3><div class="tabs" id="huifu"><ul class="nav-tabs"><li class="tab active"><a class="#huifu-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#huifu-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="huifu-1"><p>当前主题展示</p></div><div class="tab-pane" id="huifu-2"><ol><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;layout.pug</strong> 文件（第14行）： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">body#body(data-type=page.type)</span><br><span class="line">    //- 背景特效</span><br><span class="line">    if theme.display_mode.universe</span><br><span class="line">        +conditionalWrapper(theme.display_mode.universe)</span><br><span class="line">            canvas#universe</span><br><span class="line">    //- 背景图片（这里添加）</span><br><span class="line">    if theme.background.enable</span><br><span class="line">        #global_bg</span><br><span class="line">    //- 全屏加载动画</span><br><span class="line">    if theme.loading.fullpage</span><br><span class="line">        +conditionalWrapper(theme.loading.fullpage)</span><br><span class="line">            include ./loading.pug</span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;source&#x2F;css&#x2F;_global&#x2F;index.styl</strong> 文件最后添加： <figure class="highlight styl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;background.enable&#x27;</span>)</span><br><span class="line">  <span class="selector-id">#global_bg</span></span><br><span class="line">    <span class="attribute">position</span> fixed</span><br><span class="line">    <span class="attribute">z-index</span> <span class="number">999</span></span><br><span class="line">    <span class="attribute">opacity</span> <span class="built_in">hexo-config</span>(<span class="string">&#x27;background.opacity&#x27;</span>)</span><br><span class="line">    <span class="attribute">width</span> <span class="number">100%</span></span><br><span class="line">    <span class="attribute">height</span> <span class="number">100%</span></span><br><span class="line">    <span class="attribute">background-image</span> <span class="built_in">url</span>(<span class="built_in">hexo-config</span>(<span class="string">&#x27;background.light&#x27;</span>))</span><br><span class="line">    <span class="attribute">background-size</span> cover</span><br><span class="line">    <span class="attribute">background-position</span> center</span><br><span class="line">    <span class="attribute">pointer-events</span> none</span><br><span class="line">    <span class="attribute">background-repeat</span> no-repeat</span><br><span class="line"></span><br><span class="line">    <span class="selector-attr">[data-theme=dark]</span> &amp;</span><br><span class="line">      <span class="attribute">background-image</span> <span class="built_in">url</span>(<span class="built_in">hexo-config</span>(<span class="string">&#x27;background.dark&#x27;</span>))</span><br></pre></td></tr></table></figure></li><li>在主题文件 <strong>_config_solitude.yml</strong> 任意处添加： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># --------------------------- start ---------------------------</span></span><br><span class="line"><span class="comment"># Background</span></span><br><span class="line"><span class="comment"># 背景图片</span></span><br><span class="line"><span class="attr">background:</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">opacity:</span> <span class="number">.3</span> <span class="comment">#透明度</span></span><br><span class="line">  <span class="attr">dark:</span> <span class="string">/images/bg_d.webp</span> <span class="comment">#深色模式，可填入url</span></span><br><span class="line">  <span class="attr">light:</span> <span class="string">/images/bg_l.webp</span> <span class="comment">#浅色模式，可填入url</span></span><br><span class="line"><span class="comment"># --------------------------- end ---------------------------</span></span><br></pre></td></tr></table></figure></li></ol></div></div></div><br>     </div></div>    </div><h2 id="添加了什么"><a href="#添加了什么" class="headerlink" title="添加了什么"></a>添加了什么</h2><div class="collapse-box-control active">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>添加内容</span></div>    <div class="collapse-box-content"><div class="inner">        <h3 id="1-Do-you-like-me"><a href="#1-Do-you-like-me" class="headerlink" title="1. Do you like me"></a>1. Do you like me</h3><div class="tabs" id="like"><ul class="nav-tabs"><li class="tab active"><a class="#like-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#like-2"><i class="fas fa-book-open  [/posts/c88f8d39.html]"></i>教程</a></li><li class="tab"><a class="#like-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="like-1"><p>右边侧边栏有显示你可以点来看看，手机不展示。</p></div><div class="tab-pane" id="like-2"></div><div class="tab-pane" id="like-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>为你的网站添加 Do you like me 小组件</td><td><a href="https://5ime.cn/doyoulikeme.html">I Am I</a></td></tr></tbody></table></div></div></div><h3 id="2-恋爱墙"><a href="#2-恋爱墙" class="headerlink" title="2. 恋爱墙"></a>2. 恋爱墙</h3><div class="tabs" id="love"><ul class="nav-tabs"><li class="tab active"><a class="#love-1"><i class="fas fa-wand-magic-sparkles [/]"></i>效果</a></li><li class="tab"><a class="#love-2"><i class="fas fa-book-open  [/posts/dca7dbdb.html]"></i>教程</a></li><li class="tab"><a class="#love-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="love-1"><p>主页可以看，点效果即可跳转。</p></div><div class="tab-pane" id="love-2"></div><div class="tab-pane" id="love-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>侧边栏</td><td><a href="https://hexo-theme-bamboo.netlify.app/post/hexo-theme-bamboo/sidebar/">yuang01</a></td></tr></tbody></table></div></div></div><h3 id="3-弹幕留言板"><a href="#3-弹幕留言板" class="headerlink" title="3. 弹幕留言板"></a>3. 弹幕留言板</h3><div class="tabs" id="pl"><ul class="nav-tabs"><li class="tab active"><a class="#pl-1"><i class="fas fa-wand-magic-sparkles [/message/]"></i>效果</a></li><li class="tab"><a class="#pl-2"><i class="fas fa-book-open [/posts/efc9bbdc.html]"></i>教程</a></li><li class="tab"><a class="#pl-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="pl-1"><p>类似于🍭Akilarの糖果屋信笺样式留言板，点效果即可跳转。</p></div><div class="tab-pane" id="pl-2"></div><div class="tab-pane" id="pl-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>信笺样式留言板</td><td><a href="https://akilar.top/posts/e2d3c450/">🍭Akilarの糖果屋</a></td></tr></tbody></table></div></div></div><h3 id="4-添加建站时间置页脚"><a href="#4-添加建站时间置页脚" class="headerlink" title="4. 添加建站时间置页脚"></a>4. 添加建站时间置页脚</h3><div class="tabs" id="yj"><ul class="nav-tabs"><li class="tab active"><a class="#yj-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#yj-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="yj-1"><p>左边控件点评论即可到页脚。</p></div><div class="tab-pane" id="yj-2"><ol><li>新建 <strong>source&#x2F;custom&#x2F;js&#x2F;jz.min.js</strong> 文件填入内容（可改）： <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;DOMContentLoaded&quot;</span>,(<span class="keyword">function</span>(<span class="params"></span>)&#123;<span class="keyword">const</span> startTime=<span class="keyword">new</span> <span class="title class_">Date</span>(<span class="string">&quot;2024-05-12T00:00:00Z&quot;</span>);<span class="keyword">function</span> <span class="title function_">padZero</span>(<span class="params">num</span>)&#123;<span class="keyword">return</span> num&lt;<span class="number">10</span>?<span class="string">&quot;0&quot;</span>+<span class="attr">num</span>:<span class="title class_">String</span>(num)&#125;<span class="keyword">function</span> <span class="title function_">calculateElapsedTime</span>(<span class="params">start</span>)&#123;<span class="keyword">const</span> elapsedMilliseconds=<span class="keyword">new</span> <span class="title class_">Date</span>-start,totalSeconds=<span class="title class_">Math</span>.<span class="title function_">floor</span>(elapsedMilliseconds/<span class="number">1e3</span>);<span class="keyword">return</span>&#123;<span class="attr">days</span>:<span class="title class_">Math</span>.<span class="title function_">floor</span>(totalSeconds/<span class="number">86400</span>),<span class="attr">hours</span>:<span class="title class_">Math</span>.<span class="title function_">floor</span>(totalSeconds%<span class="number">86400</span>/<span class="number">3600</span>),<span class="attr">minutes</span>:<span class="title function_">padZero</span>(<span class="title class_">Math</span>.<span class="title function_">floor</span>(totalSeconds%<span class="number">3600</span>/<span class="number">60</span>)),<span class="attr">seconds</span>:<span class="title function_">padZero</span>(totalSeconds%<span class="number">60</span>)&#125;&#125;<span class="keyword">function</span> <span class="title function_">updateDisplay</span>(<span class="params"></span>)&#123;<span class="keyword">const</span>&#123;<span class="attr">days</span>:days,<span class="attr">hours</span>:hours,<span class="attr">minutes</span>:minutes,<span class="attr">seconds</span>:seconds&#125;=<span class="title function_">calculateElapsedTime</span>(startTime),runtimeElement=<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;runtime&quot;</span>);runtimeElement&amp;&amp;(runtimeElement.<span class="property">textContent</span>=<span class="string">`花期：<span class="subst">$&#123;days&#125;</span> 天 <span class="subst">$&#123;hours&#125;</span> 小时 <span class="subst">$&#123;minutes&#125;</span> 分 <span class="subst">$&#123;seconds&#125;</span> 秒`</span>),<span class="title function_">requestAnimationFrame</span>(updateDisplay)&#125;<span class="title function_">updateDisplay</span>()&#125;));</span><br></pre></td></tr></table></figure></li><li>修改主题配置文件（url可改）： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 页脚信息文字</span></span><br><span class="line"><span class="comment"># 请不要删除主题信息，这是对作者的尊重</span></span><br><span class="line"><span class="attr">links:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">&lt;span</span> <span class="string">id=&quot;runtime&quot;&gt;&lt;/span&gt;</span></span><br><span class="line">    <span class="attr">url:</span> <span class="string">/history/</span></span><br></pre></td></tr></table></figure></li></ol></div></div></div><h3 id="5-文章内插入地图"><a href="#5-文章内插入地图" class="headerlink" title="5. 文章内插入地图"></a>5. 文章内插入地图</h3><div class="tabs" id="dt"><ul class="nav-tabs"><li class="tab active"><a class="#dt-1"><i class="fas fa-wand-magic-sparkles [/posts/63e1fc9e.html]"></i>效果</a></li><li class="tab"><a class="#dt-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#dt-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="dt-1"><p>点击效果，即可跳转，如无显示请后退重新点一次。</p></div><div class="tab-pane" id="dt-2"><ol><li>安装插件 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-tag-map --save</span><br></pre></td></tr></table></figure></li><li>在想用的地方使用这外挂标签即可 <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">插入一个混合地图的示例： &#123;% map %&#125;</span><br><span class="line">&#123;% + 标签值 + 经度 + 纬度 + 文本 + 缩放等级 + 宽 + 高 + 默认图层 + %&#125;</span><br><span class="line">&#123;% map 120.101101,30.239119, 这里是西湖灵隐寺，据说求姻缘很灵验哦！, 15, 100%, 360px, 1 %&#125;</span><br><span class="line">其它地图用法请参考原帖</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="dt-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>使用Hexo-tag-map插件，给文章插入高德百度谷歌等5类9种地图</td><td><a href="https://blog.guole.fun/posts/41887/">八章</a></td></tr><tr><td>关于给你的 Hexo 文章插入交互式地图吧！</td><td><a href="https://github.com/kuole-o/hexo-tag-map">kuole-o</a></td></tr></tbody></table></div></div></div><h3 id="6-足迹图"><a href="#6-足迹图" class="headerlink" title="6. 足迹图"></a>6. 足迹图</h3><div class="tabs" id="zdt"><ul class="nav-tabs"><li class="tab active"><a class="#zdt-1"><i class="fas fa-wand-magic-sparkles [/footmap/]"></i>效果</a></li><li class="tab"><a class="#zdt-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#zdt-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="zdt-1"><p>点击效果，即可跳转。</p></div><div class="tab-pane" id="zdt-2"><ol><li>下载zip并解压到 <strong>source&#x2F;footmap&#x2F;</strong> 目录下</li><li>经过我的修改可以适配本主题，你想改可以自定义。</li><li>修改根目录 <strong>_config.yml</strong> 文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ...</span></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; collapseer</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 class="bullet">-</span> <span class="string">source/footmap/*</span>  <span class="comment">#添加这一句</span></span><br><span class="line"><span class="comment">#...</span></span><br></pre></td></tr></table></figure></li><li>打开 <strong>source&#x2F;footmap&#x2F;data&#x2F;config.json</strong> 设置数据： <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;latLng&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="number">22.354887</span><span class="punctuation">,</span><span class="number">110.946866</span><span class="punctuation">]</span><span class="punctuation">,</span>   <span class="comment">//为足迹的经纬度，可以通过 https://jingweidu.bmcx.com查询得到</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 class="comment">//足迹地点的名称</span></span><br><span class="line">        <span class="attr">&quot;articleUrl&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/posts/63e1fc9e.html&quot;</span><span class="punctuation">,</span>   <span class="comment">//文章地址</span></span><br><span class="line">        <span class="attr">&quot;desc&quot;</span><span class="punctuation">:</span> <span class="string">&quot;老家&quot;</span><span class="punctuation">,</span> <span class="comment">//足迹地点的描述， \n 为换行符</span></span><br><span class="line">        <span class="attr">&quot;photos&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span></span><br><span class="line">            <span class="string">&quot;https://photo.tuchong.com/20342439/f/1276790136.jpg&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="string">&quot;https://photo.tuchong.com/20342439/f/712590584.jpg&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="string">&quot;https://photo.tuchong.com/20342439/f/888292716.jpg&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="string">&quot;https://photo.tuchong.com/20342439/f/1184318812.jpg&quot;</span></span><br><span class="line">        <span class="punctuation">]</span><span class="punctuation">,</span>  <span class="comment">//足迹地点的照片链接，为一组图片 url 数据</span></span><br><span class="line">        <span class="attr">&quot;freq&quot;</span><span class="punctuation">:</span> <span class="number">2</span>   <span class="comment">//足迹地点的到访次数，范围为 [1, 10]</span></span><br><span class="line">    <span class="punctuation">&#125;</span> <span class="comment">// 写下一个的时候记得加逗号，最后一个不要加。</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure> <a href="%E8%93%9D%E5%A5%8F%E4%BA%91,%E5%AF%86%E7%A0%81%EF%BC%9Adtm5,https://wanhan.lanzouu.com/idci62rdic6j" title="" target=""></a></li></ol></div><div class="tab-pane" id="zdt-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>给自己做一个旅行地图吧（2.0升级版）</td><td><a href="https://pwsz.com/hobby/4108.html">扶苏</a></td></tr></tbody></table></div></div></div><h3 id="7-订阅页面"><a href="#7-订阅页面" class="headerlink" title="7. 订阅页面"></a>7. 订阅页面</h3><div class="tabs" id="rss"><ul class="nav-tabs"><li class="tab active"><a class="#rss-1"><i class="fas fa-wand-magic-sparkles [/rss/]"></i>效果</a></li><li class="tab"><a class="#rss-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#rss-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="rss-1"><p>点击效果，即可跳转。</p></div><div class="tab-pane" id="rss-2"><ol><li>新建 <strong>source&#x2F;rss&#x2F;index.md</strong> 文件，在文件内输入内容（按需修改）： <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 订阅本站</span><br><span class="line">date: 2024-11-16 23:10:28</span><br><span class="line">update: 2024-11-17 02:21:48</span><br><span class="line">desc: 推送全部文章推送简介</span><br><span class="line"><span class="section">container: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">center</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">h1</span>&gt;</span></span>订阅本站<span class="language-xml"><span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">center</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">p</span> <span class="attr">style</span>=<span class="string">&quot;text-align: right;&quot;</span>&gt;</span></span>最新更新时间为：2024-11-27<span class="language-xml"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">br</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;rss-plan-list&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;rss-plan-item rss-plan-wechat&quot;</span> <span class="attr">href</span>=<span class="string">&quot;./wechatOA/&quot;</span> <span class="attr">title</span>=<span class="string">&quot;公众号&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span></span><br><span class="line"><span class="code">        &lt;div class=&quot;rss-plan-description&quot;&gt;推送精选文章&lt;br&gt;推送全文&lt;/div&gt;</span></span><br><span class="line"><span class="code">        &lt;div class=&quot;rss-plan-info-group&quot;&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;rss-plan-title&quot;&gt;公众号订阅&lt;/div&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;rss-plan-info&quot;&gt;推荐的订阅方式&lt;/div&gt;&lt;img class=&quot;rss-plan-icon no-lightbox entered loaded&quot;</span></span><br><span class="line"><span class="code">                src=&quot;https://images.418121.xyz/file/blog/page/wechat.webp&quot; data-lazy-src=&quot;https://images.418121.xyz/file/blog/page/wechat.webp&quot;</span></span><br><span class="line"><span class="code">                data-ll-status=&quot;loaded&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;/div&gt;</span></span><br><span class="line"><span class="code">    &lt;/a&gt;&lt;a class=&quot;rss-plan-item rss-plan-mail&quot; title=&quot;邮箱订阅&quot; href=&quot;https://github.com/yeminxi/Friend-Circle-Lite/issues/new?assignees=&amp;labels=&amp;projects=&amp;template=%E9%82%AE%E7%AE%B1%E8%AE%A2%E9%98%85.md&amp;title=%5B%E9%82%AE%E7%AE%B1%E8%AE%A2%E9%98%85%5D&quot; target=&quot;_blank&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;div class=&quot;rss-plan-description&quot;&gt;推送全部文章&lt;br&gt;更新推送简介&lt;/div&gt;</span></span><br><span class="line"><span class="code">        &lt;div class=&quot;rss-plan-info-group&quot;&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;rss-plan-title&quot;&gt;邮件订阅&lt;/div&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;rss-plan-info&quot;&gt;推荐的订阅方式&lt;/div&gt;&lt;img class=&quot;rss-plan-icon no-lightbox entered loaded&quot;</span></span><br><span class="line"><span class="code">                src=&quot;https://images.418121.xyz/file/blog/page/mail.webp&quot; data-lazy-src=&quot;https://images.418121.xyz/file/blog/page/mail.webp&quot;</span></span><br><span class="line"><span class="code">                data-ll-status=&quot;loaded&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;/div&gt;</span></span><br><span class="line"><span class="code">    &lt;/a&gt;&lt;a class=&quot;rss-plan-item rss-plan-rss&quot; href=&quot;/rss2.xml&quot; title=&quot;rss&quot; target=&quot;_blank&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;div class=&quot;rss-plan-description&quot;&gt;推送全部文章&lt;br&gt;推送简介&lt;/div&gt;</span></span><br><span class="line"><span class="code">        &lt;div class=&quot;rss-plan-info-group&quot;&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;rss-plan-title&quot;&gt;RSS&lt;/div&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;rss-plan-info&quot;&gt;备用订阅方式&lt;/div&gt;&lt;img class=&quot;rss-plan-icon no-lightbox entered loaded&quot;</span></span><br><span class="line"><span class="code">                src=&quot;https://images.418121.xyz/file/blog/page/rss.webp&quot; data-lazy-src=&quot;https://images.418121.xyz/file/blog/page/rss.webp&quot;</span></span><br><span class="line"><span class="code">                data-ll-status=&quot;loaded&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;/div&gt;</span></span><br><span class="line"><span class="code">    &lt;/a&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="section"># 订阅本站</span></span><br><span class="line">首先感谢你对本站的文章产生一些兴趣，本站的主要内容风格为日常及教程分享、电脑骚操作，如果你对这方面内容感兴趣，欢迎关注。</span><br><span class="line"><span class="section">## 全部文章订阅方式</span></span><br><span class="line"><span class="section">### 1. 公众号订阅</span></span><br><span class="line">公众号订阅可以收到我觉得有价值，很重要，比较精彩的文章。这些文章将通过微信公众号发送。并不是所有博客文章都会发到公众号中。建议所有用户订阅。</span><br><span class="line"><span class="section">### 2. RSS订阅（文章摘要）</span></span><br><span class="line">你可以使用第三方RSS客户端接收到博客的文章摘要通知。</span><br><span class="line">[<span class="string">https://blog.418121.xyz/atom.xml</span>](<span class="link">https://blog.418121.xyz/atom.xml</span>)</span><br><span class="line">[<span class="string">https://blog.418121.xyz/rss2.xml</span>](<span class="link">https://blog.418121.xyz/rss2.xml</span>)</span><br><span class="line">&#123;% link ATOM,订阅链接,https://blog.418121.xyz/atom.xml %&#125;</span><br><span class="line">&#123;% link RSS,订阅链接,https://blog.418121.xyz/rss2.xml %&#125;</span><br><span class="line"><span class="section">### 3. Follow订阅</span></span><br><span class="line">你可以使用[<span class="string">Follow客户端</span>](<span class="link">https://follow.is/</span>)接收到博客的文章通知。</span><br><span class="line">&#123;% link Follow,订阅链接,https://app.follow.is/share/users/yeminxi %&#125;</span><br><span class="line"><span class="section">### 4. 邮箱订阅</span></span><br><span class="line"><span class="bullet">*</span> 如果你更喜欢通过邮箱接收更新，本站提供了邮箱订阅功能。此功能通过[<span class="string">Friend Circle Lite</span>](<span class="link">https://github.com/willow-god/Friend-Circle-Lite</span>)支持。只需简单的填写你的邮箱提交到GitHub Issue，即可开始接收本站的更新邮件，可以通过删除issue进行取消订阅！</span><br><span class="line"><span class="bullet">    1.</span> 访问 [<span class="string">GitHub Issue</span>](<span class="link">https://github.com/yeminxi/Friend-Circle-Lite/issues/new?assignees=&amp;labels=&amp;projects=&amp;template=%E9%82%AE%E7%AE%B1%E8%AE%A2%E9%98%85.md&amp;title=%5B%E9%82%AE%E7%AE%B1%E8%AE%A2%E9%98%85%5D</span>) 页面。</span><br><span class="line"><span class="bullet">    2.</span> 填写你的邮箱信息。</span><br><span class="line"><span class="bullet">    3.</span> 提交 Issue，即可完成订阅！</span><br><span class="line"><span class="bullet">*</span> 期待与你的互动！如果你有任何问题或建议，欢迎随时联系我。</span><br><span class="line"><span class="section">## 邮箱订阅功能提供鸣谢：</span></span><br><span class="line">&#123;% link 清羽飞扬,柳影曳曳，清酒孤灯，扬笔撒墨，心境如霜,https://blog.liushen.fun/ %&#125;</span><br><span class="line"><span class="section">## 本站是如何维持的</span></span><br><span class="line">做公众号是为了保护文章版权，因为发布在个人博客站点对于版权保护能力比较弱，所以发在公众号并且标记为原创可以对文章版权有很好的保护。</span><br></pre></td></tr></table></figure></li><li>新建 <strong>source&#x2F;rss&#x2F;wechatOA&#x2F;index.md</strong> 文件，在文件内输入内容（按需修改）： <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line"><span class="section">layout: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line"><span class="language-xml"><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></span><br><span class="line"><span class="code">    &lt;head&gt;</span></span><br><span class="line"><span class="code">        &lt;meta charset=&quot;UTF-8&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;title&gt;关注「叶泯希」微信公众号&lt;/title&gt;</span></span><br><span class="line"><span class="code">        &lt;link rel=&quot;icon&quot; type=&quot;image/x-icon&quot; href=&quot;/favicon.ico&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;meta name=&quot;apple-mobile-web-app-title&quot; content=&quot;叶泯希&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;link rel=&quot;bookmark&quot; href=&quot;/favicon.ico&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;meta name=&quot;description&quot; content=&quot;关注叶泯希信公众号，获取更多最新内容。&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;meta name=&quot;theme-color&quot; content=&quot;#f6f7f8&quot;&gt;</span></span><br><span class="line"><span class="code">        &lt;style&gt;</span></span><br><span class="line"><span class="code">            body &#123;</span></span><br><span class="line"><span class="code">                background: #f6f7f8;</span></span><br><span class="line"><span class="code">                margin: 0;</span></span><br><span class="line"><span class="code">                padding: 0</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .wechatOA &#123;</span></span><br><span class="line"><span class="code">                position: relative;</span></span><br><span class="line"><span class="code">                display: flex;</span></span><br><span class="line"><span class="code">                flex-direction: column;</span></span><br><span class="line"><span class="code">                justify-content: space-between;</span></span><br><span class="line"><span class="code">                align-items: center;</span></span><br><span class="line"><span class="code">                height: var(--vh)</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .wechat-card &#123;</span></span><br><span class="line"><span class="code">                background: #fff;</span></span><br><span class="line"><span class="code">                max-width: 428px;</span></span><br><span class="line"><span class="code">                max-height: 569px;</span></span><br><span class="line"><span class="code">                border-radius: 16px;</span></span><br><span class="line"><span class="code">                padding: 24px 36px 20px 36px;</span></span><br><span class="line"><span class="code">                display: flex;</span></span><br><span class="line"><span class="code">                flex-direction: column;</span></span><br><span class="line"><span class="code">                margin: auto;</span></span><br><span class="line"><span class="code">                align-items: center</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .qrcode &#123;</span></span><br><span class="line"><span class="code">                width: 256px;</span></span><br><span class="line"><span class="code">                height: 256px;</span></span><br><span class="line"><span class="code">                display: flex</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .tips &#123;</span></span><br><span class="line"><span class="code">                font-size: 14px;</span></span><br><span class="line"><span class="code">                color: #000;</span></span><br><span class="line"><span class="code">                opacity: .5;</span></span><br><span class="line"><span class="code">                margin-top: 8px</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .wechatOA-card &#123;</span></span><br><span class="line"><span class="code">                width: 100%;</span></span><br><span class="line"><span class="code">                display: flex;</span></span><br><span class="line"><span class="code">                margin-top: 16px;</span></span><br><span class="line"><span class="code">                background: #f7f7f7;</span></span><br><span class="line"><span class="code">                padding: 18px;</span></span><br><span class="line"><span class="code">                border-radius: 16px;</span></span><br><span class="line"><span class="code">                align-items: center</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .wechatOA-head &#123;</span></span><br><span class="line"><span class="code">                width: 48px;</span></span><br><span class="line"><span class="code">                height: 48px;</span></span><br><span class="line"><span class="code">                background-image: url(/images/avatar.webp);</span></span><br><span class="line"><span class="code">                border-radius: 68px;</span></span><br><span class="line"><span class="code">                background-size: contain;</span></span><br><span class="line"><span class="code">                margin-right: 16px</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .wechatOA-name &#123;</span></span><br><span class="line"><span class="code">                font-weight: 700;</span></span><br><span class="line"><span class="code">                color: #000;</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            .wechatOA-description &#123;</span></span><br><span class="line"><span class="code">                font-size: 12px;</span></span><br><span class="line"><span class="code">                color: #000;</span></span><br><span class="line"><span class="code">                opacity: .5</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            a.help &#123;</span></span><br><span class="line"><span class="code">                font-size: 14px;</span></span><br><span class="line"><span class="code">                color: #000;</span></span><br><span class="line"><span class="code">                opacity: .5;</span></span><br><span class="line"><span class="code">                text-decoration: none;</span></span><br><span class="line"><span class="code">                margin: 20px 0</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            a.help:visited &#123;</span></span><br><span class="line"><span class="code">                color: #000</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">        &lt;/style&gt;</span></span><br><span class="line"><span class="code">    &lt;/head&gt;</span></span><br><span class="line"><span class="code">    &lt;body&gt;</span></span><br><span class="line"><span class="code">        &lt;div class=&quot;wechatOA&quot;&gt;</span></span><br><span class="line"><span class="code">            &lt;div class=&quot;wechat-card&quot;&gt;</span></span><br><span class="line"><span class="code">                &lt;img src=&quot;gzh.webp&quot; class=&quot;qrcode&quot; alt=&quot;&quot;&gt;</span></span><br><span class="line"><span class="code">                &lt;div class=&quot;tips&quot;&gt;扫描二维码关注公众号&lt;/div&gt;</span></span><br><span class="line"><span class="code">                &lt;div class=&quot;wechatOA-card&quot;&gt;</span></span><br><span class="line"><span class="code">                    &lt;div class=&quot;wechatOA-head&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="code">                    &lt;div class=&quot;wechatOA-info&quot;&gt;</span></span><br><span class="line"><span class="code">                        &lt;div class=&quot;wechatOA-name&quot;&gt;叶泯希&lt;/div&gt;</span></span><br><span class="line"><span class="code">                        &lt;div class=&quot;wechatOA-description&quot;&gt;意义是自己赐予的&lt;/div&gt;</span></span><br><span class="line"><span class="code">                    &lt;/div&gt;</span></span><br><span class="line"><span class="code">                &lt;/div&gt;</span></span><br><span class="line"><span class="code">            &lt;/div&gt;</span></span><br><span class="line"><span class="code">            &lt;a class=&quot;help&quot; href=&quot;https://kf.qq.com/touch/wxappfaq/1208117b2mai141113jaqAnU.html?platform=14&quot; title=&quot;帮助&quot; target=&quot;_blank&quot;&gt;不会扫码？&lt;/a&gt;</span></span><br><span class="line"><span class="code">        &lt;/div&gt;</span></span><br><span class="line"><span class="code">        &lt;script&gt;</span></span><br><span class="line"><span class="code">            const vh = 1 * window.innerHeight;</span></span><br><span class="line"><span class="code">            document.documentElement.style.setProperty(&quot;--vh&quot;, `$&#123;vh&#125;px`),</span></span><br><span class="line"><span class="code">            window.addEventListener(&quot;resize&quot;, (()=&gt;&#123;</span></span><br><span class="line"><span class="code">                let e = 1 * window.innerHeight;</span></span><br><span class="line"><span class="code">                document.documentElement.style.setProperty(&quot;--vh&quot;, `$&#123;e&#125;px`)</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            ))</span></span><br><span class="line"><span class="code">        &lt;/script&gt;</span></span><br><span class="line"><span class="code">    &lt;/body&gt;</span></span><br><span class="line"><span class="code">&lt;/html&gt;</span></span><br></pre></td></tr></table></figure></li><li>在 <strong>source&#x2F;custom&#x2F;css&#x2F;custom.css</strong> 最后添加（没有就新建）： <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 卡片订阅样式 */</span></span><br><span class="line"><span class="selector-id">#post</span> <span class="selector-class">.tag_share</span> + <span class="selector-id">#follow</span> &#123;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">40px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-list</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">flex-direction</span>: row;</span><br><span class="line">  <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> -<span class="number">4px</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">justify-content</span>: space-between;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-list</span> <span class="selector-tag">a</span> &#123;</span><br><span class="line">  <span class="attribute">border-bottom</span>: none;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-pseudo">:visited</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-white);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-class">.rss-plan-wechat</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#27c125</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-class">.rss-plan-mail</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--efu-blue);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-class">.rss-plan-rss</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="built_in">var</span>(--efu-orange);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">flex-direction</span>: column;</span><br><span class="line">  <span class="attribute">justify-content</span>: space-between;</span><br><span class="line">  <span class="attribute">min-width</span>: <span class="number">240px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">240px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">6px</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none;</span><br><span class="line">  <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> / <span class="number">3</span> - <span class="number">8px</span>);</span><br><span class="line">  <span class="attribute">filter</span>: <span class="built_in">brightness</span>(<span class="number">1</span>);</span><br><span class="line">  <span class="attribute">transition</span>: .<span class="number">3s</span>;</span><br><span class="line">  <span class="attribute">border</span>: <span class="built_in">var</span>(--style-border);</span><br><span class="line">  <span class="attribute">box-shadow</span>: <span class="built_in">var</span>(--efu-shadow-border);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">filter</span>: <span class="built_in">brightness</span>(<span class="number">1.1</span>)</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">1024px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.rss-plan-item</span> &#123;</span><br><span class="line">      <span class="attribute">width</span>:<span class="built_in">calc</span>(<span class="number">100%</span> / <span class="number">2</span> - <span class="number">4px</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.rss-plan-item</span><span class="selector-pseudo">:first-child</span> &#123;</span><br><span class="line">      <span class="attribute">width</span>: <span class="number">100%</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">768px</span>) &#123;</span><br><span class="line">  <span class="selector-class">.rss-plan-item</span> &#123;</span><br><span class="line">      <span class="attribute">width</span>:<span class="number">100%</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 卡片大小 */</span></span><br><span class="line"><span class="selector-class">.rss-plan-description</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-white);</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">26px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">20px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-info-group</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">26px</span> <span class="number">30px</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-white);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-title</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">36px</span>;</span><br><span class="line">  <span class="attribute">font-weight</span>: <span class="number">700</span>;</span><br><span class="line">  <span class="attribute">width</span>: fit-content;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-info</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: fit-content;</span><br><span class="line">  <span class="attribute">opacity</span>: .<span class="number">6</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-tag">img</span><span class="selector-class">.rss-plan-icon</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">bottom</span>: -<span class="number">50px</span>;</span><br><span class="line">  <span class="attribute">right</span>: -<span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">140px</span>;</span><br><span class="line">  -webkit-user-drag: none;</span><br><span class="line">  <span class="attribute">user-select</span>: none;</span><br><span class="line">  -webkit-<span class="attribute">transition</span>: all <span class="number">1.2s</span> <span class="built_in">cubic-bezier</span>(.<span class="number">39</span>,.<span class="number">575</span>,.<span class="number">565</span>,<span class="number">1</span>) <span class="meta">!important</span>;</span><br><span class="line">  -moz-<span class="attribute">transition</span>: all <span class="number">1.2s</span> <span class="built_in">cubic-bezier</span>(.<span class="number">39</span>,.<span class="number">575</span>,.<span class="number">565</span>,<span class="number">1</span>) <span class="meta">!important</span>;</span><br><span class="line">  -o-<span class="attribute">transition</span>: all <span class="number">1.2s</span> <span class="built_in">cubic-bezier</span>(.<span class="number">39</span>,.<span class="number">575</span>,.<span class="number">565</span>,<span class="number">1</span>) <span class="meta">!important</span>;</span><br><span class="line">  -ms-<span class="attribute">transition</span>: all <span class="number">1.2s</span> <span class="built_in">cubic-bezier</span>(.<span class="number">39</span>,.<span class="number">575</span>,.<span class="number">565</span>,<span class="number">1</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">transition</span>: all <span class="number">1.2s</span> <span class="built_in">cubic-bezier</span>(.<span class="number">39</span>,.<span class="number">575</span>,.<span class="number">565</span>,<span class="number">1</span>) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">transform-origin</span>: bottom right;</span><br><span class="line">  <span class="attribute">filter</span>: <span class="built_in">blur</span>(<span class="number">8px</span>);</span><br><span class="line">  <span class="attribute">opacity</span>: .<span class="number">6</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-pseudo">:hover</span> <span class="selector-tag">img</span><span class="selector-class">.rss-plan-icon</span> &#123;</span><br><span class="line">  <span class="attribute">bottom</span>: -<span class="number">40px</span>;</span><br><span class="line">  <span class="attribute">right</span>: -<span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">filter</span>: <span class="built_in">blur</span>(<span class="number">0</span>);</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.rss-plan-item</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="rss-3"><table><thead><tr><th>参考</th><th>原帖</th></tr></thead><tbody><tr><td>如果你喜欢本站内容，欢迎订阅！</td><td><a href="https://blog.liushen.fun/subscribe/">Liushen</a></td></tr><tr><td>订阅本站与运营模式</td><td><a href="https://blog.zhheo.com/rss/">张洪Heo</a></td></tr></tbody></table></div></div></div><h3 id="8-重构404页"><a href="#8-重构404页" class="headerlink" title="8. 重构404页"></a>8. 重构404页</h3><div class="tabs" id="404"><ul class="nav-tabs"><li class="tab active"><a class="#404-1"><i class="fas fa-wand-magic-sparkles [/404]"></i>效果</a></li><li class="tab"><a class="#404-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#404-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="404-1"><p>点击效果，即可跳转。</p></div><div class="tab-pane" id="404-2"><ol><li>新建 <strong>source&#x2F;404.md</strong> 文件，在文件内输入以下内容： <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line"><span class="section">layout: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;//cdn.dnpw.org/404/v1.min.js&quot;</span> <span class="attr">maincolor</span>=<span class="string">&quot;#000&quot;</span> <span class="attr">jumptime</span>=<span class="string">&quot;-1&quot;</span> <span class="attr">jumptarget</span>=<span class="string">&quot;/&quot;</span> <span class="attr">tips</span>=<span class="string">&quot;404&quot;</span> <span class="attr">error</span>=<span class="string">&quot;&quot;</span> <span class="attr">charset</span>=<span class="string">&quot;utf-8&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span></span><br></pre></td></tr></table></figure></li><li>修改主题配置文件 <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Page default settings</span></span><br><span class="line"><span class="comment"># 页面默认设置</span></span><br><span class="line"><span class="attr">page:</span></span><br><span class="line">  <span class="comment"># 404 page</span></span><br><span class="line">  <span class="comment"># 404 页面</span></span><br><span class="line">  <span class="attr">error:</span> <span class="literal">false</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="404-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>小代码，大公益</td><td><a href="https://www.dnpw.org/cn/pa-notfound.html">域名公益</a></td></tr></tbody></table></div></div></div><h3 id="9-自定义link标签"><a href="#9-自定义link标签" class="headerlink" title="9. 自定义link标签"></a>9. 自定义link标签</h3><div class="tabs" id="link"><ul class="nav-tabs"><li class="tab active"><a class="#link-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#link-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#link-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="link-1"><p><a href="%E5%8F%B6%E6%B3%AF%E5%B8%8C,%E4%B8%BB%E9%A1%B5,https://418121.xyz" title="" target=""></a></p></div><div class="tab-pane" id="link-2"><ol><li>新建 <strong>themes&#x2F;solitude&#x2F;scripts&#x2F;tags&#x2F;link.js</strong> 文件，在文件内输入内容： <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&#x27;use strict&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> &#123; parse &#125; = <span class="built_in">require</span>(<span class="string">&#x27;psl&#x27;</span>);</span><br><span class="line"><span class="comment">// 定义不同域名对应的头像URL</span></span><br><span class="line"><span class="keyword">const</span> avatarMap = <span class="keyword">new</span> <span class="title class_">Map</span>([</span><br><span class="line">  [<span class="string">&#x27;418121.xyz&#x27;</span>, <span class="string">&#x27;/images/avatar.webp&#x27;</span>],</span><br><span class="line">  [<span class="string">&#x27;github.com&#x27;</span>, <span class="string">&#x27;https://images.418121.xyz/file/blog/page/git.webp&#x27;</span>]</span><br><span class="line">]);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义白名单域名</span></span><br><span class="line"><span class="keyword">const</span> whitelist = <span class="keyword">new</span> <span class="title class_">Set</span>([</span><br><span class="line">  <span class="string">&#x27;418121.xyz&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;yeminxi.github.io&#x27;</span></span><br><span class="line">]);</span><br><span class="line"><span class="comment">// 获取URL的根域名</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getRootDomain</span>(<span class="params">url</span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> hostname = <span class="keyword">new</span> <span class="title function_">URL</span>(url).<span class="property">hostname</span>;</span><br><span class="line">    <span class="keyword">const</span> parsed = <span class="title function_">parse</span>(hostname);</span><br><span class="line">    <span class="keyword">return</span> parsed.<span class="property">domain</span> || hostname;</span><br><span class="line">  &#125; <span class="keyword">catch</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> url.<span class="title function_">split</span>(<span class="string">&#x27;/&#x27;</span>)[<span class="number">0</span>]; <span class="comment">// Fallback</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">function</span> <span class="title function_">link</span>(<span class="params">args</span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="comment">// 参数解析（支持转义逗号）</span></span><br><span class="line">    <span class="keyword">const</span> parsedArgs = args.<span class="title function_">join</span>(<span class="string">&#x27; &#x27;</span>)</span><br><span class="line">      .<span class="title function_">split</span>(<span class="regexp">/(?&lt;!\\),/</span>)</span><br><span class="line">      .<span class="title function_">map</span>(<span class="function"><span class="params">s</span> =&gt;</span> s.<span class="title function_">replace</span>(<span class="regexp">/\\,/g</span>, <span class="string">&#x27;,&#x27;</span>).<span class="title function_">trim</span>());</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> [title = <span class="string">&#x27;&#x27;</span>, sitename = <span class="string">&#x27;&#x27;</span>, rawLink = <span class="string">&#x27;&#x27;</span>] = parsedArgs;</span><br><span class="line">    <span class="keyword">const</span> link = rawLink.<span class="title function_">startsWith</span>(<span class="string">&#x27;http&#x27;</span>) ? rawLink : <span class="string">`https://<span class="subst">$&#123;rawLink&#125;</span>`</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 域名处理</span></span><br><span class="line">    <span class="keyword">const</span> rootDomain = <span class="title function_">getRootDomain</span>(link);</span><br><span class="line">    <span class="keyword">const</span> imgUrl = avatarMap.<span class="title function_">get</span>(rootDomain) || </span><br><span class="line">                  <span class="string">`https://api.xinac.net/icon/?url=<span class="subst">$&#123;<span class="built_in">encodeURIComponent</span>(rootDomain)&#125;</span>`</span>; <span class="comment">//使用api获取网站的ico</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 白名单校验</span></span><br><span class="line">    <span class="keyword">const</span> isSafe = whitelist.<span class="title function_">has</span>(rootDomain) || rootDomain.<span class="title function_">endsWith</span>(<span class="string">&#x27;.418121.xyz&#x27;</span>);</span><br><span class="line">    <span class="keyword">const</span> tipMessage = isSafe </span><br><span class="line">      ? <span class="string">&#x27;🛡️ 来自本站地址，本站可确保其安全性，请放心点击跳转&#x27;</span></span><br><span class="line">      : <span class="string">&#x27;⚠️ 引用站外地址，不保证站点的可用性和安全性，慎重点&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">&lt;div class=&quot;liushen-tag-link&quot;&gt;</span></span><br><span class="line"><span class="string">  &lt;a class=&quot;tag-Link&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; href=&quot;<span class="subst">$&#123;link&#125;</span>&quot;&gt;</span></span><br><span class="line"><span class="string">    &lt;div class=&quot;tag-link-tips&quot;&gt;<span class="subst">$&#123;tipMessage&#125;</span>&lt;/div&gt;</span></span><br><span class="line"><span class="string">    &lt;div class=&quot;tag-link-bottom&quot;&gt;</span></span><br><span class="line"><span class="string">      &lt;div class=&quot;tag-link-left&quot; </span></span><br><span class="line"><span class="string">          style=&quot;background-image: url(<span class="subst">$&#123;imgUrl&#125;</span>)&quot;</span></span><br><span class="line"><span class="string">          onerror=&quot;this.style.backgroundImage=&#x27;url(/images/default-avatar.webp)&#x27;&quot;&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;div class=&quot;tag-link-right&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;div class=&quot;tag-link-title&quot;&gt;<span class="subst">$&#123;hexo.extend.helper.get(<span class="string">&#x27;escape_html&#x27;</span>)(title)&#125;</span>&lt;/div&gt;</span></span><br><span class="line"><span class="string">        &lt;div class=&quot;tag-link-sitename&quot;&gt;<span class="subst">$&#123;hexo.extend.helper.get(<span class="string">&#x27;escape_html&#x27;</span>)(sitename)&#125;</span>&lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;i class=&quot;fa-solid fa-angle-right&quot;&gt;&lt;/i&gt;</span></span><br><span class="line"><span class="string">    &lt;/div&gt;</span></span><br><span class="line"><span class="string">  &lt;/a&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;`</span>;</span><br><span class="line">  &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;Link tag error:&#x27;</span>, error);</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`&lt;div class=&quot;liushen-error&quot;&gt;链接卡片生成失败：<span class="subst">$&#123;error.message&#125;</span>&lt;/div&gt;`</span>;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">tag</span>.<span class="title function_">register</span>(<span class="string">&#x27;link&#x27;</span>, link, &#123; <span class="attr">ends</span>: <span class="literal">false</span> &#125;);</span><br></pre></td></tr></table></figure></li><li>新建 <strong>themes&#x2F;solitude&#x2F;source&#x2F;css&#x2F;_tags&#x2F;link.styl</strong> 文件，在文件内输入内容： <figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#content-inner</span></span><br><span class="line">  <span class="selector-class">.tag-Link</span></span><br><span class="line">    <span class="attribute">background</span> <span class="built_in">var</span>(--efu-secondbg)</span><br><span class="line">    <span class="attribute">border-radius</span> <span class="number">12px</span> <span class="meta">!important</span></span><br><span class="line">    <span class="attribute">display</span> flex</span><br><span class="line">    <span class="attribute">border</span> <span class="number">1px</span> solid <span class="built_in">var</span>(--style-border)</span><br><span class="line">    <span class="attribute">flex-direction</span> column</span><br><span class="line">    <span class="attribute">padding</span> <span class="number">0.5rem</span> <span class="number">1rem</span></span><br><span class="line">    <span class="attribute">margin-top</span> <span class="number">1rem</span></span><br><span class="line">    <span class="attribute">text-decoration</span> none <span class="meta">!important</span></span><br><span class="line">    <span class="attribute">color</span> <span class="built_in">var</span>(--efu-fontcolor)</span><br><span class="line">    <span class="attribute">margin-bottom</span> <span class="number">10px</span></span><br><span class="line">    <span class="attribute">transition</span> background-color <span class="number">0.3s</span>, border-color <span class="number">0.3s</span>, box-shadow <span class="number">0.3s</span></span><br><span class="line"></span><br><span class="line">    <span class="selector-pseudo">&amp;:hover</span></span><br><span class="line">      <span class="attribute">border-color</span> <span class="built_in">var</span>(--style-border-hover)</span><br><span class="line">      <span class="attribute">background-color</span> <span class="built_in">var</span>(--efu-main)</span><br><span class="line">      <span class="attribute">box-shadow</span> <span class="number">0</span> <span class="number">0</span> <span class="number">5px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.2</span>)</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.tag-link-tips</span></span><br><span class="line">      <span class="attribute">color</span> <span class="built_in">var</span>(--efu-fontcolor)</span><br><span class="line">      <span class="attribute">border-bottom</span> <span class="number">1px</span> solid <span class="built_in">var</span>(--efu-gray)</span><br><span class="line">      <span class="attribute">padding-bottom</span> <span class="number">4px</span></span><br><span class="line">      <span class="attribute">font-size</span> <span class="number">0.6rem</span></span><br><span class="line">      <span class="attribute">font-weight</span> normal</span><br><span class="line"></span><br><span class="line">    <span class="selector-class">.tag-link-bottom</span></span><br><span class="line">      <span class="attribute">display</span> flex</span><br><span class="line">      <span class="attribute">margin-top</span> <span class="number">0.5rem</span></span><br><span class="line">      <span class="attribute">align-items</span> center</span><br><span class="line">      <span class="attribute">justify-content</span> space-around</span><br><span class="line"></span><br><span class="line">      <span class="selector-class">.tag-link-left</span></span><br><span class="line">        <span class="attribute">width</span> <span class="number">60px</span></span><br><span class="line">        <span class="attribute">min-width</span> <span class="number">60px</span></span><br><span class="line">        <span class="attribute">height</span> <span class="number">60px</span></span><br><span class="line">        <span class="attribute">background-size</span> cover</span><br><span class="line">        <span class="attribute">border-radius</span> <span class="number">25%</span></span><br><span class="line">        <span class="attribute">background-color</span> <span class="built_in">var</span>(--efu-card-bg)</span><br><span class="line"></span><br><span class="line">      <span class="selector-class">.tag-link-right</span></span><br><span class="line">        <span class="attribute">margin-left</span> <span class="number">1rem</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-class">.tag-link-title</span></span><br><span class="line">          <span class="attribute">font-size</span> <span class="number">1rem</span></span><br><span class="line">          <span class="attribute">line-height</span> <span class="number">1.2</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-class">.tag-link-sitename</span></span><br><span class="line">          <span class="attribute">font-size</span> <span class="number">0.7rem</span></span><br><span class="line">          <span class="attribute">color</span> <span class="built_in">var</span>(--efu-fontcolor)</span><br><span class="line">          <span class="attribute">font-weight</span> normal</span><br><span class="line">          <span class="attribute">margin-top</span> <span class="number">4px</span></span><br><span class="line">          <span class="attribute">transition</span> color <span class="number">0.3s</span></span><br><span class="line"></span><br><span class="line">        <span class="selector-pseudo">&amp;:hover</span> <span class="selector-class">.tag-link-sitename</span></span><br><span class="line">          <span class="attribute">color</span> <span class="built_in">var</span>(--efu-main)</span><br><span class="line"></span><br><span class="line">      <span class="selector-tag">i</span></span><br><span class="line">        <span class="attribute">margin-left</span> auto</span><br><span class="line">        <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-fontcolor)</span><br></pre></td></tr></table></figure></li><li>用法 <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% link 标题,描述,链接 %&#125;</span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="link-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>魔改笔记七：分类条及外链卡片</td><td><a href="https://blog.liushen.fun/posts/a64defb4/">LiuShen</a></td></tr></tbody></table></div></div></div><h3 id="10-安全跳转页面"><a href="#10-安全跳转页面" class="headerlink" title="10. 安全跳转页面"></a>10. 安全跳转页面</h3><div class="tabs" id="safe"><ul class="nav-tabs"><li class="tab active"><a class="#safe-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#safe-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#safe-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="safe-1"><p><a href="%E7%99%BE%E5%BA%A6,%E6%95%88%E6%9E%9C%E5%B1%95%E7%A4%BA,https://www.baidu.com" title="" target=""></a></p></div><div class="tab-pane" id="safe-2"><ol><li>安装 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install cheerio --save</span><br><span class="line">npm install hexo-safego --save</span><br></pre></td></tr></table></figure></li><li>在 <strong>Hexo</strong> 根目录 <strong>_config.yml</strong> 文件中添加以下内容： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><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="attr">general:</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">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="attr">security:</span>                     <span class="comment"># 安全设置</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="attr">scope:</span>                        <span class="comment"># 容器与页面设置</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;#post&#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="attr">exclude_pages:</span>              <span class="comment"># 排除的页面路径</span></span><br><span class="line">  <span class="attr">whitelist:</span>                    <span class="comment"># 域名白名单</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;yeminixi.github.io&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;418121.xyz&quot;</span></span><br><span class="line">  <span class="attr">appearance:</span>                   <span class="comment"># 页面外观设置</span></span><br><span class="line">    <span class="attr">avatar:</span> <span class="string">./images/avatar.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="literal">false</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="attr">debug:</span>                        <span class="comment"># 调试设置</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></li></ol></div><div class="tab-pane" id="safe-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>安全跳转页面·插件版</td><td><a href="https://blog.liushen.fun/posts/1dfd1f41/">LiuShen</a></td></tr></tbody></table></div></div></div><h3 id="11-Waline评论链接安全跳转"><a href="#11-Waline评论链接安全跳转" class="headerlink" title="11. Waline评论链接安全跳转"></a>11. Waline评论链接安全跳转</h3><div class="tabs" id="plaq"><ul class="nav-tabs"><li class="tab active"><a class="#plaq-1"><i class="fas fa-wand-magic-sparkles [/message/]"></i>效果</a></li><li class="tab"><a class="#plaq-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#plaq-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="plaq-1"><p>点击效果，即可跳转，下面有链接点点看。</p></div><div class="tab-pane" id="plaq-2"><ol><li>在你 <strong>Github</strong> 中 <strong>Fork</strong> 的 <strong>Waline</strong> 仓库下修改 <strong>index.cjs</strong> 文件内容如下： <figure class="highlight cjs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title class_">Application</span> = <span class="built_in">require</span>(<span class="string">&#x27;@waline/vercel&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> <span class="title class_">LinkInterceptor</span> = <span class="built_in">require</span>(<span class="string">&#x27;waline-link-interceptor&#x27;</span>); <span class="comment">// 添加这一行</span></span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = <span class="title class_">Application</span>(&#123;</span><br><span class="line">  <span class="attr">forbiddenWords</span>: [<span class="string">&#x27;唱跳&#x27;</span>, <span class="string">&#x27;rap篮球&#x27;</span>], <span class="comment">//词汇限制</span></span><br><span class="line">  <span class="attr">disallowIPList</span>: [<span class="string">&#x27;8.8.8.8&#x27;</span>, <span class="string">&#x27;4.4.4.4&#x27;</span>],<span class="comment">//黑名单IP</span></span><br><span class="line">  <span class="attr">plugins</span>: [</span><br><span class="line">    <span class="title class_">LinkInterceptor</span>(&#123;</span><br><span class="line">      <span class="attr">whiteList</span>: [</span><br><span class="line">        <span class="string">&#x27;yeminxi.github.io&#x27;</span>,</span><br><span class="line">        <span class="string">&#x27;418121.xyz&#x27;</span></span><br><span class="line">      ],</span><br><span class="line">      <span class="comment">// blackList: [],</span></span><br><span class="line">      <span class="comment">// interceptorTemplate: `hello __URL__ `,   // 如果下面自定义了跳转地址，那么此处模板不生效</span></span><br><span class="line">      <span class="attr">redirectUrl</span>: <span class="string">&quot;https://blog.418121.xyz/go.html&quot;</span>, <span class="comment">// 填写中间页的具体 html 地址。</span></span><br><span class="line">      <span class="attr">encodeFunc</span>: <span class="function">(<span class="params">url</span>) =&gt;</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;u=&quot;</span>+<span class="title class_">Buffer</span>.<span class="title function_">from</span>(url).<span class="title function_">toString</span>(<span class="string">&#x27;base64&#x27;</span>);                               <span class="comment">// 填入一个外链 url 的处理函数</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">async</span> <span class="title function_">postSave</span>(<span class="params">comment</span>) &#123;</span><br><span class="line">    <span class="comment">// do what ever you want after comment saved</span></span><br><span class="line">  &#125;,</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li>修改 <strong>package.json</strong> 文件： <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;template&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.32.3&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;private&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;dependencies&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;@waline/vercel&quot;</span><span class="punctuation">:</span> <span class="string">&quot;latest&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;waline-link-interceptor&quot;</span><span class="punctuation">:</span> <span class="string">&quot;^0.1.2&quot;</span> <span class="comment">//添加这一句</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="plaq-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Hexo 博客与 Waline 评论区实现外链跳转中间页</td><td><a href="https://blog.uuanqin.top/p/e1ee5eca/">wuanqin</a></td></tr></tbody></table></div></div></div><h3 id="12-添加统计页面"><a href="#12-添加统计页面" class="headerlink" title="12. 添加统计页面"></a>12. 添加统计页面</h3><div class="tabs" id="tj"><ul class="nav-tabs"><li class="tab active"><a class="#tj-1"><i class="fas fa-wand-magic-sparkles [/history/]"></i>效果</a></li><li class="tab"><a class="#tj-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#tj-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="tj-1"><p>点击效果，即可跳转。</p></div><div class="tab-pane" id="tj-2"><ol><li>新建 **<strong>themes&#x2F;solitude&#x2F;sscripts&#x2F;helper&#x2F;charts.js</strong> 文件： <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> cheerio = <span class="built_in">require</span>(<span class="string">&#x27;cheerio&#x27;</span>)</span><br><span class="line"><span class="keyword">const</span> moment = <span class="built_in">require</span>(<span class="string">&#x27;moment&#x27;</span>)</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;after_render:html&#x27;</span>, <span class="keyword">function</span> (<span class="params">locals</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> $ = cheerio.<span class="title function_">load</span>(locals)</span><br><span class="line">  <span class="keyword">const</span> post = $(<span class="string">&#x27;#posts-chart&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> tag = $(<span class="string">&#x27;#tags-chart&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> category = $(<span class="string">&#x27;#categories-chart&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> htmlEncode = <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (post.<span class="property">length</span> &gt; <span class="number">0</span> || tag.<span class="property">length</span> &gt; <span class="number">0</span> || category.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (post.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; $(<span class="string">&#x27;#postsChart&#x27;</span>).<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (post.<span class="title function_">attr</span>(<span class="string">&#x27;data-encode&#x27;</span>) === <span class="string">&#x27;true&#x27;</span>) htmlEncode = <span class="literal">true</span></span><br><span class="line">      post.<span class="title function_">after</span>(<span class="title function_">postsChart</span>(post.<span class="title function_">attr</span>(<span class="string">&#x27;data-start&#x27;</span>)))</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (tag.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; $(<span class="string">&#x27;#tagsChart&#x27;</span>).<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (tag.<span class="title function_">attr</span>(<span class="string">&#x27;data-encode&#x27;</span>) === <span class="string">&#x27;true&#x27;</span>) htmlEncode = <span class="literal">true</span></span><br><span class="line">      tag.<span class="title function_">after</span>(<span class="title function_">tagsChart</span>(tag.<span class="title function_">attr</span>(<span class="string">&#x27;data-length&#x27;</span>)))</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (category.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; $(<span class="string">&#x27;#categoriesChart&#x27;</span>).<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">      <span class="keyword">if</span> (category.<span class="title function_">attr</span>(<span class="string">&#x27;data-encode&#x27;</span>) === <span class="string">&#x27;true&#x27;</span>) htmlEncode = <span class="literal">true</span></span><br><span class="line">      category.<span class="title function_">after</span>(<span class="title function_">categoriesChart</span>(category.<span class="title function_">attr</span>(<span class="string">&#x27;data-parent&#x27;</span>)))</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (htmlEncode) &#123;</span><br><span class="line">      <span class="keyword">return</span> $.<span class="title function_">root</span>().<span class="title function_">html</span>().<span class="title function_">replace</span>(<span class="regexp">/&amp;amp;#/g</span>, <span class="string">&#x27;&amp;#&#x27;</span>)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="keyword">return</span> $.<span class="title function_">root</span>().<span class="title function_">html</span>()</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">return</span> locals</span><br><span class="line">  &#125;</span><br><span class="line">&#125;, <span class="number">15</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">postsChart</span> (<span class="params">startMonth</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> startDate = <span class="title function_">moment</span>(startMonth || <span class="string">&#x27;2020-01&#x27;</span>)</span><br><span class="line">  <span class="keyword">const</span> endDate = <span class="title function_">moment</span>()</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> monthMap = <span class="keyword">new</span> <span class="title class_">Map</span>()</span><br><span class="line">  <span class="keyword">const</span> dayTime = <span class="number">3600</span> * <span class="number">24</span> * <span class="number">1000</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> time = startDate; time &lt;= endDate; time += dayTime) &#123;</span><br><span class="line">    <span class="keyword">const</span> month = <span class="title function_">moment</span>(time).<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> (!monthMap.<span class="title function_">has</span>(month)) &#123;</span><br><span class="line">      monthMap.<span class="title function_">set</span>(month, <span class="number">0</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  hexo.<span class="property">locals</span>.<span class="title function_">get</span>(<span class="string">&#x27;posts&#x27;</span>).<span class="title function_">forEach</span>(<span class="keyword">function</span> (<span class="params">post</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> month = post.<span class="property">date</span>.<span class="title function_">format</span>(<span class="string">&#x27;YYYY-MM&#x27;</span>)</span><br><span class="line">    <span class="keyword">if</span> (monthMap.<span class="title function_">has</span>(month)) &#123;</span><br><span class="line">      monthMap.<span class="title function_">set</span>(month, monthMap.<span class="title function_">get</span>(month) + <span class="number">1</span>)</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;)</span><br><span class="line">  <span class="keyword">const</span> monthArr = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>([...monthMap.<span class="title function_">keys</span>()])</span><br><span class="line">  <span class="keyword">const</span> monthValueArr = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>([...monthMap.<span class="title function_">values</span>()])</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">  &lt;script id=&quot;postsChart&quot;&gt;</span></span><br><span class="line"><span class="string">    var color = document.documentElement.getAttribute(&#x27;data-theme&#x27;) === &#x27;light&#x27; ? &#x27;#4c4948&#x27; : &#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line"><span class="string">    var postsChart = echarts.init(document.getElementById(&#x27;posts-chart&#x27;), &#x27;light&#x27;);</span></span><br><span class="line"><span class="string">    var postsOption = &#123;</span></span><br><span class="line"><span class="string">      title: &#123;</span></span><br><span class="line"><span class="string">        text: &#x27;文章发布统计图&#x27;,</span></span><br><span class="line"><span class="string">        x: &#x27;center&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      tooltip: &#123;</span></span><br><span class="line"><span class="string">        trigger: &#x27;axis&#x27;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      xAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;日期&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;category&#x27;,</span></span><br><span class="line"><span class="string">        boundaryGap: false,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;monthArr&#125;</span></span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      yAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;value&#x27;,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        splitLine: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      series: [&#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;line&#x27;,</span></span><br><span class="line"><span class="string">        smooth: true,</span></span><br><span class="line"><span class="string">        lineStyle: &#123;</span></span><br><span class="line"><span class="string">            width: 0</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        showSymbol: false,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          opacity: 1,</span></span><br><span class="line"><span class="string">          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">            offset: 0,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(128, 255, 165)&#x27;</span></span><br><span class="line"><span class="string">          &#125;,</span></span><br><span class="line"><span class="string">          &#123;</span></span><br><span class="line"><span class="string">            offset: 1,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(1, 191, 236)&#x27;</span></span><br><span class="line"><span class="string">          &#125;])</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        areaStyle: &#123;</span></span><br><span class="line"><span class="string">          opacity: 1,</span></span><br><span class="line"><span class="string">          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">            offset: 0,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(128, 255, 165)&#x27;</span></span><br><span class="line"><span class="string">          &#125;, &#123;</span></span><br><span class="line"><span class="string">            offset: 1,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(1, 191, 236)&#x27;</span></span><br><span class="line"><span class="string">          &#125;])</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;monthValueArr&#125;</span>,</span></span><br><span class="line"><span class="string">        markLine: &#123;</span></span><br><span class="line"><span class="string">          data: [&#123;</span></span><br><span class="line"><span class="string">            name: &#x27;平均值&#x27;,</span></span><br><span class="line"><span class="string">            type: &#x27;average&#x27;,</span></span><br><span class="line"><span class="string">            label: &#123;</span></span><br><span class="line"><span class="string">              color: color</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">          &#125;]</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;]</span></span><br><span class="line"><span class="string">    &#125;;</span></span><br><span class="line"><span class="string">    postsChart.setOption(postsOption);</span></span><br><span class="line"><span class="string">    window.addEventListener(&#x27;resize&#x27;, () =&gt; &#123; </span></span><br><span class="line"><span class="string">      postsChart.resize();</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">    postsChart.on(&#x27;click&#x27;, &#x27;series&#x27;, (event) =&gt; &#123;</span></span><br><span class="line"><span class="string">      if (event.componentType === &#x27;series&#x27;) window.location.href = &#x27;/archives/&#x27; + event.name.replace(&#x27;-&#x27;, &#x27;/&#x27;);</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"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">tagsChart</span> (<span class="params">len</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> tagArr = []</span><br><span class="line">  hexo.<span class="property">locals</span>.<span class="title function_">get</span>(<span class="string">&#x27;tags&#x27;</span>).<span class="title function_">map</span>(<span class="keyword">function</span> (<span class="params">tag</span>) &#123;</span><br><span class="line">    tagArr.<span class="title function_">push</span>(&#123; <span class="attr">name</span>: tag.<span class="property">name</span>, <span class="attr">value</span>: tag.<span class="property">length</span>, <span class="attr">path</span>: tag.<span class="property">path</span> &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">  tagArr.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123; <span class="keyword">return</span> b.<span class="property">value</span> - a.<span class="property">value</span> &#125;)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> dataLength = <span class="title class_">Math</span>.<span class="title function_">min</span>(tagArr.<span class="property">length</span>, len) || tagArr.<span class="property">length</span></span><br><span class="line">  <span class="keyword">const</span> tagNameArr = []</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; dataLength; i++) &#123;</span><br><span class="line">    tagNameArr.<span class="title function_">push</span>(tagArr[i].<span class="property">name</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">const</span> tagNameArrJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(tagNameArr)</span><br><span class="line">  <span class="keyword">const</span> tagArrJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(tagArr)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">  &lt;script id=&quot;tagsChart&quot;&gt;</span></span><br><span class="line"><span class="string">    var color = document.documentElement.getAttribute(&#x27;data-theme&#x27;) === &#x27;light&#x27; ? &#x27;#4c4948&#x27; : &#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line"><span class="string">    var tagsChart = echarts.init(document.getElementById(&#x27;tags-chart&#x27;), &#x27;light&#x27;);</span></span><br><span class="line"><span class="string">    var tagsOption = &#123;</span></span><br><span class="line"><span class="string">      title: &#123;</span></span><br><span class="line"><span class="string">        text: &#x27;Top <span class="subst">$&#123;dataLength&#125;</span> 标签统计图&#x27;,</span></span><br><span class="line"><span class="string">        x: &#x27;center&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      tooltip: &#123;&#125;,</span></span><br><span class="line"><span class="string">      xAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;标签&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;category&#x27;,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color,</span></span><br><span class="line"><span class="string">          interval: 0</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;tagNameArrJson&#125;</span></span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      yAxis: &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;value&#x27;,</span></span><br><span class="line"><span class="string">        splitLine: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        nameTextStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisTick: &#123;</span></span><br><span class="line"><span class="string">          show: false</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLabel: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        axisLine: &#123;</span></span><br><span class="line"><span class="string">          show: true,</span></span><br><span class="line"><span class="string">          lineStyle: &#123;</span></span><br><span class="line"><span class="string">            color: color</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      series: [&#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;bar&#x27;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;tagArrJson&#125;</span>,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          borderRadius: [5, 5, 0, 0],</span></span><br><span class="line"><span class="string">          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">            offset: 0,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(128, 255, 165)&#x27;</span></span><br><span class="line"><span class="string">          &#125;,</span></span><br><span class="line"><span class="string">          &#123;</span></span><br><span class="line"><span class="string">            offset: 1,</span></span><br><span class="line"><span class="string">            color: &#x27;rgba(1, 191, 236)&#x27;</span></span><br><span class="line"><span class="string">          &#125;])</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        emphasis: &#123;</span></span><br><span class="line"><span class="string">          itemStyle: &#123;</span></span><br><span class="line"><span class="string">            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [&#123;</span></span><br><span class="line"><span class="string">              offset: 0,</span></span><br><span class="line"><span class="string">              color: &#x27;rgba(128, 255, 195)&#x27;</span></span><br><span class="line"><span class="string">            &#125;,</span></span><br><span class="line"><span class="string">            &#123;</span></span><br><span class="line"><span class="string">              offset: 1,</span></span><br><span class="line"><span class="string">              color: &#x27;rgba(1, 211, 255)&#x27;</span></span><br><span class="line"><span class="string">            &#125;])</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        markLine: &#123;</span></span><br><span class="line"><span class="string">          data: [&#123;</span></span><br><span class="line"><span class="string">            name: &#x27;平均值&#x27;,</span></span><br><span class="line"><span class="string">            type: &#x27;average&#x27;,</span></span><br><span class="line"><span class="string">            label: &#123;</span></span><br><span class="line"><span class="string">              color: color</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">          &#125;]</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;]</span></span><br><span class="line"><span class="string">    &#125;;</span></span><br><span class="line"><span class="string">    tagsChart.setOption(tagsOption);</span></span><br><span class="line"><span class="string">    window.addEventListener(&#x27;resize&#x27;, () =&gt; &#123; </span></span><br><span class="line"><span class="string">      tagsChart.resize();</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">    tagsChart.on(&#x27;click&#x27;, &#x27;series&#x27;, (event) =&gt; &#123;</span></span><br><span class="line"><span class="string">      if(event.data.path) window.location.href = &#x27;/&#x27; + event.data.path;</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"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">categoriesChart</span> (<span class="params">dataParent</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> categoryArr = []</span><br><span class="line">  <span class="keyword">let</span> categoryParentFlag = <span class="literal">false</span></span><br><span class="line">  hexo.<span class="property">locals</span>.<span class="title function_">get</span>(<span class="string">&#x27;categories&#x27;</span>).<span class="title function_">map</span>(<span class="keyword">function</span> (<span class="params">category</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (category.<span class="property">parent</span>) categoryParentFlag = <span class="literal">true</span></span><br><span class="line">    categoryArr.<span class="title function_">push</span>(&#123;</span><br><span class="line">      <span class="attr">name</span>: category.<span class="property">name</span>,</span><br><span class="line">      <span class="attr">value</span>: category.<span class="property">length</span>,</span><br><span class="line">      <span class="attr">path</span>: category.<span class="property">path</span>,</span><br><span class="line">      <span class="attr">id</span>: category.<span class="property">_id</span>,</span><br><span class="line">      <span class="attr">parentId</span>: category.<span class="property">parent</span> || <span class="string">&#x27;0&#x27;</span></span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;)</span><br><span class="line">  categoryParentFlag = categoryParentFlag &amp;&amp; dataParent === <span class="string">&#x27;true&#x27;</span></span><br><span class="line">  categoryArr.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123; <span class="keyword">return</span> b.<span class="property">value</span> - a.<span class="property">value</span> &#125;)</span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">translateListToTree</span> (<span class="params">data, parent</span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> tree = []</span><br><span class="line">    <span class="keyword">let</span> temp</span><br><span class="line">    data.<span class="title function_">forEach</span>(<span class="function">(<span class="params">item, index</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> (data[index].<span class="property">parentId</span> == parent) &#123;</span><br><span class="line">        <span class="keyword">let</span> obj = data[index];</span><br><span class="line">        temp = <span class="title function_">translateListToTree</span>(data, data[index].<span class="property">id</span>);</span><br><span class="line">        <span class="keyword">if</span> (temp.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">          obj.<span class="property">children</span> = temp</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (tree.<span class="title function_">indexOf</span>())</span><br><span class="line">          tree.<span class="title function_">push</span>(obj)</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">    <span class="keyword">return</span> tree</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">const</span> categoryNameJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(categoryArr.<span class="title function_">map</span>(<span class="keyword">function</span> (<span class="params">category</span>) &#123; <span class="keyword">return</span> category.<span class="property">name</span> &#125;))</span><br><span class="line">  <span class="keyword">const</span> categoryArrJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(categoryArr)</span><br><span class="line">  <span class="keyword">const</span> categoryArrParentJson = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(<span class="title function_">translateListToTree</span>(categoryArr, <span class="string">&#x27;0&#x27;</span>))</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">  &lt;script id=&quot;categoriesChart&quot;&gt;</span></span><br><span class="line"><span class="string">    var color = document.documentElement.getAttribute(&#x27;data-theme&#x27;) === &#x27;light&#x27; ? &#x27;#4c4948&#x27; : &#x27;rgba(255,255,255,0.7)&#x27;</span></span><br><span class="line"><span class="string">    var categoriesChart = echarts.init(document.getElementById(&#x27;categories-chart&#x27;), &#x27;light&#x27;);</span></span><br><span class="line"><span class="string">    var categoryParentFlag = <span class="subst">$&#123;categoryParentFlag&#125;</span></span></span><br><span class="line"><span class="string">    var categoriesOption = &#123;</span></span><br><span class="line"><span class="string">      title: &#123;</span></span><br><span class="line"><span class="string">        text: &#x27;文章分类统计图&#x27;,</span></span><br><span class="line"><span class="string">        x: &#x27;center&#x27;,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      legend: &#123;</span></span><br><span class="line"><span class="string">        top: &#x27;bottom&#x27;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;categoryNameJson&#125;</span>,</span></span><br><span class="line"><span class="string">        textStyle: &#123;</span></span><br><span class="line"><span class="string">          color: color</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      tooltip: &#123;</span></span><br><span class="line"><span class="string">        trigger: &#x27;item&#x27;</span></span><br><span class="line"><span class="string">      &#125;,</span></span><br><span class="line"><span class="string">      series: []</span></span><br><span class="line"><span class="string">    &#125;;</span></span><br><span class="line"><span class="string">    categoriesOption.series.push(</span></span><br><span class="line"><span class="string">      categoryParentFlag ? </span></span><br><span class="line"><span class="string">      &#123;</span></span><br><span class="line"><span class="string">        nodeClick :false,</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;sunburst&#x27;,</span></span><br><span class="line"><span class="string">        radius: [&#x27;15%&#x27;, &#x27;90%&#x27;],</span></span><br><span class="line"><span class="string">        center: [&#x27;50%&#x27;, &#x27;55%&#x27;],</span></span><br><span class="line"><span class="string">        sort: &#x27;desc&#x27;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;categoryArrParentJson&#125;</span>,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          borderColor: &#x27;#fff&#x27;,</span></span><br><span class="line"><span class="string">          borderWidth: 2,</span></span><br><span class="line"><span class="string">          emphasis: &#123;</span></span><br><span class="line"><span class="string">            focus: &#x27;ancestor&#x27;,</span></span><br><span class="line"><span class="string">            shadowBlur: 10,</span></span><br><span class="line"><span class="string">            shadowOffsetX: 0,</span></span><br><span class="line"><span class="string">            shadowColor: &#x27;rgba(255, 255, 255, 0.5)&#x27;</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">      :</span></span><br><span class="line"><span class="string">      &#123;</span></span><br><span class="line"><span class="string">        name: &#x27;文章篇数&#x27;,</span></span><br><span class="line"><span class="string">        type: &#x27;pie&#x27;,</span></span><br><span class="line"><span class="string">        radius: [30, 80],</span></span><br><span class="line"><span class="string">        roseType: &#x27;area&#x27;,</span></span><br><span class="line"><span class="string">        label: &#123;</span></span><br><span class="line"><span class="string">          color: color,</span></span><br><span class="line"><span class="string">          formatter: &#x27;&#123;b&#125; : &#123;c&#125; (&#123;d&#125;%)&#x27;</span></span><br><span class="line"><span class="string">        &#125;,</span></span><br><span class="line"><span class="string">        data: <span class="subst">$&#123;categoryArrJson&#125;</span>,</span></span><br><span class="line"><span class="string">        itemStyle: &#123;</span></span><br><span class="line"><span class="string">          emphasis: &#123;</span></span><br><span class="line"><span class="string">            shadowBlur: 10,</span></span><br><span class="line"><span class="string">            shadowOffsetX: 0,</span></span><br><span class="line"><span class="string">            shadowColor: &#x27;rgba(255, 255, 255, 0.5)&#x27;</span></span><br><span class="line"><span class="string">          &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">      &#125;</span></span><br><span class="line"><span class="string">    )</span></span><br><span class="line"><span class="string">    categoriesChart.setOption(categoriesOption);</span></span><br><span class="line"><span class="string">    window.addEventListener(&#x27;resize&#x27;, () =&gt; &#123; </span></span><br><span class="line"><span class="string">      categoriesChart.resize();</span></span><br><span class="line"><span class="string">    &#125;);</span></span><br><span class="line"><span class="string">    categoriesChart.on(&#x27;click&#x27;, &#x27;series&#x27;, (event) =&gt; &#123;</span></span><br><span class="line"><span class="string">      if(event.data.path) window.location.href = &#x27;/&#x27; + event.data.path;</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></pre></td></tr></table></figure></li><li>修改主题配置文件 <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://npm.elemecdn.com/echarts@4.9.0/dist/echarts.min.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li><li>用法，在任意位置插入（记得开启 <strong>container: true</strong> ）： <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 文章发布时间统计图 --&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;posts-chart&quot;</span> <span class="attr">data-start</span>=<span class="string">&quot;2021-01&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px; height: 300px; padding: 10px;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</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;tags-chart&quot;</span> <span class="attr">data-length</span>=<span class="string">&quot;10&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px; height: 300px; padding: 10px;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</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;categories-chart&quot;</span> <span class="attr">data-parent</span>=<span class="string">&quot;true&quot;</span> <span class="attr">style</span>=<span class="string">&quot;border-radius: 8px; height: 300px; padding: 10px;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="tj-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>关于本站｜Solitude主题魔改内容</td><td><a href="https://blog.starsharbor.com/posts/solitude-changefiles/#%E6%96%87%E7%AB%A0%E7%BB%9F%E8%AE%A1">❖星港◎Star☆</a></td></tr></tbody></table></div></div></div><h3 id="13-页面预加载"><a href="#13-页面预加载" class="headerlink" title="13. 页面预加载"></a>13. 页面预加载</h3><div class="tabs" id="inpage"><ul class="nav-tabs"><li class="tab active"><a class="#inpage-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#inpage-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#inpage-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="inpage-1"><p>打开浏览器开发者模式切换到网络，然后找个本站页面把鼠标放上去，会进行预加载。</p></div><div class="tab-pane" id="inpage-2"><ul><li>修改主题配置文件  <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;//instant.page/5.2.0&quot;</span> <span class="string">type=&quot;module&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ul></div><div class="tab-pane" id="inpage-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>使您网站的页面即时在 1 分钟内并显着提高您的转化率</td><td><a href="https://instant.page/">Alexandre Dieulot</a></td></tr></tbody></table></div></div></div> <h3 id="14-Vercel-加速"><a href="#14-Vercel-加速" class="headerlink" title="14. Vercel 加速"></a>14. Vercel 加速</h3><div class="tabs" id="vercel"><ul class="nav-tabs"><li class="tab active"><a class="#vercel-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#vercel-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#vercel-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="vercel-1"><p><a href='https://zhale.me/http/?{"Target":"https://blog.418121.xyz","Options":{"ISPs":["移动","电信","联通","海外"]},"IsContinue":false}' target="_blank">你觉得访问本站快吗，所见即所得。</a></p></div><div class="tab-pane" id="vercel-2"><ul><li>在 <strong>source&#x2F;</strong> 目录下新建一个 <strong>vercel.json</strong> 文件，在文件内输入以下内容：  <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;headers&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;source&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/sw.js&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;headers&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;key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Cache-Control&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="string">&quot;public, max-age=0, must-revalidate&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</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;source&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;headers&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;key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Cache-Control&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="string">&quot;public, s-maxage=86400, max-age=86400&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span><span class="punctuation">,</span> <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;key&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Vercel-CDN-Cache-Control&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;value&quot;</span><span class="punctuation">:</span> <span class="string">&quot;max-age=31536000&quot;</span></span><br><span class="line">          <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li></ul></div><div class="tab-pane" id="vercel-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Vercel 加速，快，不止更快</td><td><a href="https://www.mysticstars.cn/archives/speed-vercel">Mystic Stars</a></td></tr></tbody></table></div></div></div><h3 id="15-友链状态检测"><a href="#15-友链状态检测" class="headerlink" title="15. 友链状态检测"></a>15. 友链状态检测</h3><div class="tabs" id="links"><ul class="nav-tabs"><li class="tab active"><a class="#links-1"><i class="fas fa-wand-magic-sparkles [/links/]"></i>效果</a></li><li class="tab"><a class="#links-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#links-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="links-1"><p>点击效果，即可跳转。</p></div><div class="tab-pane" id="links-2"><ol><li>这里只讲前端配置，完整教程请看参考。</li><li>动态获取json，适配 <strong>solitude主题</strong> 的方法，根目录下新建 <strong>link.js</strong> 文件输入以下内容：  <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;node:fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> https = <span class="built_in">require</span>(<span class="string">&#x27;node:https&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> dataUrl = <span class="string">&#x27;https://cdn.418121.xyz/links/active.json&#x27;</span>; <span class="comment">// 替换成你的数据来源的URL</span></span><br><span class="line"><span class="keyword">const</span> outputFilePath = <span class="string">&#x27;./source/friend.json&#x27;</span>; <span class="comment">// 替换成你想要保存json文件的路径</span></span><br><span class="line"><span class="keyword">const</span> forbiddenNames = [</span><br><span class="line">  <span class="string">&#x27;Hexo&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;开往-友链接力&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;笔墨迹BLOGS·CN&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;博客录boke.lu&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;博友圈&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;集博栈&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;博客圈&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;叶泯希-&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;叶泯希~&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;博客驿站&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;十年之约&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;个站商店&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;BlogFinder&#x27;</span></span><br><span class="line">]; <span class="comment">// 想要禁止的name，可以修改</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">generateFriendJson</span>(<span class="params">dataUrl, outputFilePath, forbiddenNames</span>) &#123;</span><br><span class="line">  https.<span class="title function_">get</span>(dataUrl, <span class="function">(<span class="params">response</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> data = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 检查响应状态</span></span><br><span class="line">    <span class="keyword">if</span> (response.<span class="property">statusCode</span> !== <span class="number">200</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`请求失败，状态码: <span class="subst">$&#123;response.statusCode&#125;</span>`</span>);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 监听数据块</span></span><br><span class="line">    response.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="function">(<span class="params">chunk</span>) =&gt;</span> &#123;</span><br><span class="line">      data += chunk;</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 完成请求</span></span><br><span class="line">    response.<span class="title function_">on</span>(<span class="string">&#x27;end&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> jsonData = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(data);</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">const</span> friends = [];</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;获取的数据:&quot;</span>, jsonData); <span class="comment">// 输出获取的数据以确认结构</span></span><br><span class="line">        </span><br><span class="line">        jsonData.<span class="property">content</span>.<span class="title function_">forEach</span>(<span class="function"><span class="params">item</span> =&gt;</span> &#123;</span><br><span class="line">          <span class="comment">// 打印每个 item 的名字，看是否在 forbiddenNames 中</span></span><br><span class="line">          <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`正在处理: <span class="subst">$&#123;item.title&#125;</span>`</span>);</span><br><span class="line">          <span class="keyword">if</span> (!forbiddenNames.<span class="title function_">includes</span>(item.<span class="property">title</span>)) &#123;</span><br><span class="line">            friends.<span class="title function_">push</span>(&#123;</span><br><span class="line">              <span class="attr">name</span>: item.<span class="property">title</span>,</span><br><span class="line">              <span class="attr">link</span>: item.<span class="property">link</span>,</span><br><span class="line">              <span class="attr">avatar</span>: item.<span class="property">avatar</span></span><br><span class="line">            &#125;);</span><br><span class="line">          &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`禁用项: <span class="subst">$&#123;item.title&#125;</span>`</span>); <span class="comment">// 如果是禁用项，打印提示</span></span><br><span class="line">          &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 根据规定的格式构建 JSON 数据</span></span><br><span class="line">        <span class="keyword">const</span> friendData = &#123; <span class="attr">friends</span>: friends.<span class="title function_">map</span>(<span class="function"><span class="params">item</span> =&gt;</span> [item.<span class="property">name</span>, item.<span class="property">link</span>, item.<span class="property">avatar</span>]) &#125;;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 将 JSON 对象转换为字符串</span></span><br><span class="line">        <span class="keyword">const</span> friendJSON = <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(friendData, <span class="literal">null</span>, <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 写入 friend.json 文件</span></span><br><span class="line">        fs.<span class="title function_">writeFileSync</span>(outputFilePath, friendJSON);</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`创建文件成功 friend.json at <span class="subst">$&#123;outputFilePath&#125;</span>`</span>);</span><br><span class="line">        </span><br><span class="line">      &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <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">  &#125;).<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="function">(<span class="params">error</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;请求错误:&#x27;</span>, error);</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 调用函数生成 JSON 文件</span></span><br><span class="line"><span class="title function_">generateFriendJson</span>(dataUrl, outputFilePath, forbiddenNames);</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>使用命令生成 <strong>friend.json</strong> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node link.js</span><br></pre></td></tr></table></figure></li><li>我使用 <strong>Github Action</strong> 构建站点，在前面加上： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><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 gulp-cli -g #全局安装gulp</span></span><br><span class="line"><span class="string">    npm install --save</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><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">    node links.js</span></span><br><span class="line"><span class="string">    node autolinks.js</span></span><br></pre></td></tr></table></figure></li><li>在友链的页面 <strong>&#x2F;links&#x2F;index.md</strong> 添加以下内容： <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 友情链接</span><br><span class="line">date: 2024-11-17 06:08:33</span><br><span class="line">type: links</span><br><span class="line">desc: 与数百名博主共同进步</span><br><span class="line">data: links</span><br><span class="line">banner: true</span><br><span class="line"><span class="section">comment: false</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line"><span class="code">    .status-tag &#123;</span></span><br><span class="line"><span class="code">        position: absolute;</span></span><br><span class="line"><span class="code">        bottom: 0px;</span></span><br><span class="line"><span class="code">        right: 0px;</span></span><br><span class="line"><span class="code">        padding: 3px 8px;</span></span><br><span class="line"><span class="code">        border-radius: 12px 0px 12px 0px;</span></span><br><span class="line"><span class="code">        font-size: 12px;</span></span><br><span class="line"><span class="code">        color: white;</span></span><br><span class="line"><span class="code">        font-weight: bold;</span></span><br><span class="line"><span class="code">        transition: font-size 0.3s ease-out, width 0.3s ease-out, opacity 0.3s ease-out;</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    .flink-list-item:hover .status-tag &#123;</span></span><br><span class="line"><span class="code">        font-size: 0px;</span></span><br><span class="line"><span class="code">        opacity: 0;</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    /* 固态颜色 */</span></span><br><span class="line"><span class="code">    .status-tag-green &#123;</span></span><br><span class="line"><span class="code">        background-color: #005E00; /* 绿色 */</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    .status-tag-light-yellow &#123;</span></span><br><span class="line"><span class="code">        background-color: #FED101; /* 浅黄色 */</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    .status-tag-dark-yellow &#123;</span></span><br><span class="line"><span class="code">        background-color: #F0B606; /* 深黄色 */</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    .status-tag-red &#123;</span></span><br><span class="line"><span class="code">        background-color: #B90000; /* 红色 */</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">&lt;/style&gt;</span></span><br><span class="line"><span class="code">&lt;script&gt;</span></span><br><span class="line"><span class="code">function addStatusTagsWithCache(jsonUrl) &#123;</span></span><br><span class="line"><span class="code">    const cacheKey = &quot;statusTagsData&quot;;</span></span><br><span class="line"><span class="code">    const cacheExpirationTime = 30 * 60 * 1000; // 半小时</span></span><br><span class="line"><span class="code">    function applyStatusTags(data) &#123;</span></span><br><span class="line"><span class="code">        const linkStatus = data.link_status;</span></span><br><span class="line"><span class="code">        document.querySelectorAll(&#x27;.cf-friends-link&#x27;).forEach(card =&gt; &#123; // 一定要注意这里的类名，小心匹配不上</span></span><br><span class="line"><span class="code">            if (!card.href) return;</span></span><br><span class="line"><span class="code">            const link = card.href.replace(/\/$/, &#x27;&#x27;);</span></span><br><span class="line"><span class="code">            const statusTag = document.createElement(&#x27;div&#x27;);</span></span><br><span class="line"><span class="code">            statusTag.classList.add(&#x27;status-tag&#x27;);</span></span><br><span class="line"><span class="code">            let matched = false;</span></span><br><span class="line"><span class="code">            // 查找链接状态</span></span><br><span class="line"><span class="code">            const status = linkStatus.find(item =&gt; item.link.replace(/\/$/, &#x27;&#x27;) === link);</span></span><br><span class="line"><span class="code">            if (status) &#123;</span></span><br><span class="line"><span class="code">                let latencyText = &#x27;未知&#x27;;</span></span><br><span class="line"><span class="code">                let className = &#x27;status-tag-red&#x27;; // 默认红色</span></span><br><span class="line"><span class="code">                if (status.latency === -1) &#123;</span></span><br><span class="line"><span class="code">                    latencyText = &#x27;未知&#x27;;</span></span><br><span class="line"><span class="code">                &#125; else &#123;</span></span><br><span class="line"><span class="code">                    latencyText = status.latency.toFixed(2) + &#x27; s&#x27;;</span></span><br><span class="line"><span class="code">                    if (status.latency &lt;= 2) &#123;</span></span><br><span class="line"><span class="code">                        className = &#x27;status-tag-green&#x27;;</span></span><br><span class="line"><span class="code">                    &#125; else if (status.latency &lt;= 5) &#123;</span></span><br><span class="line"><span class="code">                        className = &#x27;status-tag-light-yellow&#x27;;</span></span><br><span class="line"><span class="code">                    &#125; else if (status.latency &lt;= 10) &#123;</span></span><br><span class="line"><span class="code">                        className = &#x27;status-tag-dark-yellow&#x27;;</span></span><br><span class="line"><span class="code">                    &#125;</span></span><br><span class="line"><span class="code">                &#125;</span></span><br><span class="line"><span class="code">                statusTag.textContent = latencyText;</span></span><br><span class="line"><span class="code">                statusTag.classList.add(className);</span></span><br><span class="line"><span class="code">                matched = true;</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">            if (matched) &#123;</span></span><br><span class="line"><span class="code">                card.style.position = &#x27;relative&#x27;;</span></span><br><span class="line"><span class="code">                card.appendChild(statusTag);</span></span><br><span class="line"><span class="code">            &#125;</span></span><br><span class="line"><span class="code">        &#125;);</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    function fetchDataAndUpdateUI() &#123;</span></span><br><span class="line"><span class="code">        fetch(jsonUrl)</span></span><br><span class="line"><span class="code">            .then(response =&gt; response.json())</span></span><br><span class="line"><span class="code">            .then(data =&gt; &#123;</span></span><br><span class="line"><span class="code">                applyStatusTags(data);</span></span><br><span class="line"><span class="code">                const cacheData = &#123;</span></span><br><span class="line"><span class="code">                    data: data,</span></span><br><span class="line"><span class="code">                    timestamp: Date.now()</span></span><br><span class="line"><span class="code">                &#125;;</span></span><br><span class="line"><span class="code">                localStorage.setItem(cacheKey, JSON.stringify(cacheData));</span></span><br><span class="line"><span class="code">            &#125;)</span></span><br><span class="line"><span class="code">            .catch(error =&gt; console.error(&#x27;Error fetching test-flink result.json:&#x27;, error));</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    const cachedData = localStorage.getItem(cacheKey);</span></span><br><span class="line"><span class="code">    if (cachedData) &#123;</span></span><br><span class="line"><span class="code">        const &#123; data, timestamp &#125; = JSON.parse(cachedData);</span></span><br><span class="line"><span class="code">        if (Date.now() - timestamp &lt; cacheExpirationTime) &#123;</span></span><br><span class="line"><span class="code">            applyStatusTags(data);</span></span><br><span class="line"><span class="code">            return;</span></span><br><span class="line"><span class="code">        &#125;</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">    fetchDataAndUpdateUI();</span></span><br><span class="line"><span class="code">&#125;</span></span><br><span class="line"><span class="code">setTimeout(() =&gt; &#123;</span></span><br><span class="line"><span class="code">    addStatusTagsWithCache(&#x27;https://check.api.418121.xyz/result.json&#x27;);</span></span><br><span class="line"><span class="code">&#125;, 0);</span></span><br><span class="line"><span class="code">&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="links-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Github Action实现友链状态检测</td><td><a href="https://blog.liushen.fun/posts/c2262998/">LiuShen</a></td></tr></tbody></table></div></div></div><h3 id="16-朋友圈"><a href="#16-朋友圈" class="headerlink" title="16. 朋友圈"></a>16. 朋友圈</h3><div class="tabs" id="pyq"><ul class="nav-tabs"><li class="tab active"><a class="#pyq-1"><i class="fas fa-wand-magic-sparkles [/links/]"></i>效果</a></li><li class="tab"><a class="#pyq-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#pyq-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="pyq-1"><p>点击效果，即可跳转，往下拖到最后。</p></div><div class="tab-pane" id="pyq-2"><ol><li>这里只讲前端配置，完整教程请看参考。</li><li>动态获取json，适配 <strong>solitude主题</strong> 的方法，根目录下新建 <strong>links.js</strong> 文件输入以下内容：  <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> https = <span class="built_in">require</span>(<span class="string">&#x27;https&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> dataUrl = <span class="string">&#x27;https://cdn.418121.xyz/links/active.json&#x27;</span>; <span class="comment">// 替换成你的数据来源的URL</span></span><br><span class="line"><span class="keyword">const</span> outputFilePath = <span class="string">&#x27;./source/flink_count.json&#x27;</span>; <span class="comment">// 替换成你想要保存json文件的路径</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">generateLinkCountJson</span>(<span class="params">dataUrl, outputFilePath</span>) &#123;</span><br><span class="line">  https.<span class="title function_">get</span>(dataUrl, <span class="function">(<span class="params">response</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">let</span> data = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 检查响应状态</span></span><br><span class="line">    <span class="keyword">if</span> (response.<span class="property">statusCode</span> !== <span class="number">200</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`请求失败，状态码: <span class="subst">$&#123;response.statusCode&#125;</span>`</span>);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 监听数据块</span></span><br><span class="line">    response.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="function">(<span class="params">chunk</span>) =&gt;</span> &#123;</span><br><span class="line">      data += chunk;</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 完成请求</span></span><br><span class="line">    response.<span class="title function_">on</span>(<span class="string">&#x27;end&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> jsonData = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(data);</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Array</span>.<span class="title function_">isArray</span>(jsonData.<span class="property">content</span>)) &#123;</span><br><span class="line">          <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&quot;错误: JSON 文件中没有有效的 content 数组&quot;</span>);</span><br><span class="line">          <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> ls = [];</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`链接列表条目数: <span class="subst">$&#123;jsonData.content.length&#125;</span>`</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> item <span class="keyword">of</span> jsonData.<span class="property">content</span>) &#123;</span><br><span class="line">          <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`正在处理链接: <span class="subst">$&#123;item.title&#125;</span>`</span>);</span><br><span class="line">          ls.<span class="title function_">push</span>(&#123;</span><br><span class="line">            <span class="attr">name</span>: item.<span class="property">title</span>,</span><br><span class="line">            <span class="attr">link</span>: item.<span class="property">link</span>,</span><br><span class="line">            <span class="attr">avatar</span>: item.<span class="property">avatar</span> || <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">            <span class="attr">descr</span>: item.<span class="property">descr</span> || <span class="string">&#x27;无描述&#x27;</span>,</span><br><span class="line">            <span class="attr">topimg</span>: item.<span class="property">topimg</span> || <span class="literal">null</span></span><br><span class="line">          &#125;);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 计数</span></span><br><span class="line">        <span class="keyword">const</span> length = ls.<span class="property">length</span>;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`总链接数: <span class="subst">$&#123;length&#125;</span>`</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 将结果写入到 JSON 文件中</span></span><br><span class="line">        fs.<span class="title function_">writeFileSync</span>(outputFilePath, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123; <span class="attr">link_list</span>: ls, <span class="attr">length</span>: length &#125;, <span class="literal">null</span>, <span class="number">2</span>));</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`创建文件成功 flink_count.json at <span class="subst">$&#123;outputFilePath&#125;</span>`</span>);</span><br><span class="line">        </span><br><span class="line">      &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <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">  &#125;).<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="function">(<span class="params">error</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;请求错误:&#x27;</span>, error);</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 调用函数生成 JSON 文件</span></span><br><span class="line"><span class="title function_">generateLinkCountJson</span>(dataUrl, outputFilePath);</span><br></pre></td></tr></table></figure></li><li>使用命令生成 <strong>flink_count.json</strong> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node links.js</span><br></pre></td></tr></table></figure></li><li>我使用 <strong>Github Action</strong> 构建站点，在前面加上： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><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 gulp-cli -g #全局安装gulp</span></span><br><span class="line"><span class="string">    npm install --save</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><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">    node links.js   //加入这一句</span></span><br><span class="line"><span class="string">    node autolinks.js</span></span><br></pre></td></tr></table></figure></li><li>在友链的页面 <strong>&#x2F;pyq&#x2F;index.md</strong> 添加以下内容： <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 朋友圈</span><br><span class="line">date: 2024-11-17 06:08:33</span><br><span class="line">type: banner</span><br><span class="line"><span class="section">container: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;friend-circle-lite-root&quot;</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">script</span>&gt;</span></span></span><br><span class="line"><span class="code">    if (typeof UserConfig === &#x27;undefined&#x27;) &#123;</span></span><br><span class="line"><span class="code">        var UserConfig = &#123;</span></span><br><span class="line"><span class="code">            // 填写你的fc Lite地址</span></span><br><span class="line"><span class="code">            private_api_url: &#x27;https://fc.api.418121.xyz/&#x27;,</span></span><br><span class="line"><span class="code">            // 点击加载更多时，一次最多加载几篇文章，默认20</span></span><br><span class="line"><span class="code">            page_turning_number: 20,</span></span><br><span class="line"><span class="code">            // 头像加载失败时，默认头像地址</span></span><br><span class="line"><span class="code">            error_img: &#x27;https://api.vvhan.com/api/avatar/niche&#x27;,</span></span><br><span class="line"><span class="code">        &#125;</span></span><br><span class="line"><span class="code">    &#125;</span></span><br><span class="line"><span class="code">&lt;/script&gt;</span></span><br><span class="line"><span class="code">&lt;link rel=&quot;stylesheet&quot; href=&quot;https://fc.api.418121.xyz/main/fclite.css&quot;&gt;</span></span><br><span class="line"><span class="code">&lt;script src=&quot;https://fc.api.418121.xyz/main/fclite.js&quot;&gt;//https://cdn.jsdelivr.net/gh/yeminxi/Friend-Circle-Lite/main/fclite.js</span></span><br><span class="line"><span class="code">&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="pyq-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Friend-Circle-Lite:轻量友链朋友圈</td><td><a href="https://blog.liushen.fun/posts/4dc716ec/">LiuShen</a></td></tr></tbody></table></div></div></div><h3 id="17-动态友链结合友链状态检测及朋友圈"><a href="#17-动态友链结合友链状态检测及朋友圈" class="headerlink" title="17. 动态友链结合友链状态检测及朋友圈"></a>17. 动态友链结合友链状态检测及朋友圈</h3><div class="tabs" id="zzyl"><ul class="nav-tabs"><li class="tab active"><a class="#zzyl-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#zzyl-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#zzyl-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="zzyl-1"><p><a href="https://github.com/ymxblog/friends/">https://github.com/ymxblog/friends/</a></p></div><div class="tab-pane" id="zzyl-2"><ol><li>动态获取json生成 <strong>links.yml</strong> 友链文件，适配 <strong>solitude主题</strong> 的方法，根目录下新建 <strong>autolinks.js</strong> 文件输入以下内容：  <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> fs = <span class="built_in">require</span>(<span class="string">&#x27;fs&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> https = <span class="built_in">require</span>(<span class="string">&#x27;https&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> yaml = <span class="built_in">require</span>(<span class="string">&#x27;js-yaml&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义输入 URL 和输出文件名</span></span><br><span class="line"><span class="keyword">const</span> inputUrls = [</span><br><span class="line">    <span class="string">&#x27;https://cdn.418121.xyz/links/花架.json&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;https://cdn.418121.xyz/links/花友.json&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;https://cdn.418121.xyz/links/花族.json&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;https://cdn.418121.xyz/links/花主.json&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;https://cdn.418121.xyz/links/suspend.json&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;https://cdn.418121.xyz/links/404.json&#x27;</span>,</span><br><span class="line">];</span><br><span class="line"><span class="keyword">const</span> outputFileName = <span class="string">&#x27;./source/_data/links.yml&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 自定义名称和描述字典，可以根据 URL 或文件名进行变更</span></span><br><span class="line"><span class="keyword">const</span> customNames = &#123;</span><br><span class="line">    <span class="string">&#x27;花架&#x27;</span>: <span class="string">&#x27;花架&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花友&#x27;</span>: <span class="string">&#x27;花友&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花族&#x27;</span>: <span class="string">&#x27;花族&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花主&#x27;</span>: <span class="string">&#x27;花主&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;suspend&#x27;</span>: <span class="string">&#x27;花单&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;404&#x27;</span>: <span class="string">&#x27;花失&#x27;</span>,</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> descriptions = &#123;</span><br><span class="line">    <span class="string">&#x27;花架&#x27;</span>: <span class="string">&#x27;鸣谢提供框架及主题、技术支持&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花友&#x27;</span>: <span class="string">&#x27;造物主自玫瑰诞生起便策划了这场名为救赎的邂逅&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花族&#x27;</span>: <span class="string">&#x27;本站已加入的族织&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花主&#x27;</span>: <span class="string">&#x27;许是太久没有惊艳了，花也会忘了它是什么样子&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;suspend&#x27;</span>: <span class="string">&#x27;单向友链，请添加本站链接后在GitHub提交issue留言&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;404&#x27;</span>: <span class="string">&#x27;失效友链，请在GitHub提交issue修改后留言&#x27;</span>,</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 自定义类型字典</span></span><br><span class="line"><span class="keyword">const</span> customTypes = &#123;</span><br><span class="line">    <span class="string">&#x27;花架&#x27;</span>: <span class="string">&#x27;item&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花友&#x27;</span>: <span class="string">&#x27;item&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花族&#x27;</span>: <span class="string">&#x27;item&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;花主&#x27;</span>: <span class="string">&#x27;item&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;suspend&#x27;</span>: <span class="string">&#x27;discn&#x27;</span>,</span><br><span class="line">    <span class="string">&#x27;404&#x27;</span>: <span class="string">&#x27;discn&#x27;</span>,</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 用于存储所有分类的数组</span></span><br><span class="line"><span class="keyword">const</span> allCategories = [];</span><br><span class="line"></span><br><span class="line"><span class="comment">// 读取每个 JSON URL 并处理数据</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">readJsonUrls</span> = <span class="keyword">async</span> (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> index = <span class="number">0</span>; index &lt; inputUrls.<span class="property">length</span>; index++) &#123;</span><br><span class="line">        <span class="keyword">const</span> url = inputUrls[index];</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> jsonObj = <span class="keyword">await</span> <span class="title function_">fetchJson</span>(url);</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 提取 URL 最后一部分作为分类名称（去掉扩展名）</span></span><br><span class="line">            <span class="keyword">const</span> className = url.<span class="title function_">split</span>(<span class="string">&#x27;/&#x27;</span>).<span class="title function_">pop</span>().<span class="title function_">replace</span>(<span class="string">&#x27;.json&#x27;</span>, <span class="string">&#x27;&#x27;</span>);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 获取对应的描述、自定义名称和类型，如果不存在则使用默认</span></span><br><span class="line">            <span class="keyword">const</span> descr = descriptions[className] || <span class="string">`来自 <span class="subst">$&#123;className&#125;</span> 的链接`</span>;</span><br><span class="line">            <span class="keyword">const</span> customName = customNames[className] || <span class="string">`默认名称 <span class="subst">$&#123;className&#125;</span>`</span>;</span><br><span class="line">            <span class="keyword">const</span> customType = customTypes[className] || <span class="string">&#x27;default&#x27;</span>; <span class="comment">// 默认类型</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">// 将当前文件内容转换为 YAML 格式的数据结构</span></span><br><span class="line">            <span class="keyword">let</span> links = jsonObj.<span class="property">content</span>.<span class="title function_">map</span>(<span class="function"><span class="params">item</span> =&gt;</span> (&#123;</span><br><span class="line">                <span class="attr">name</span>: item.<span class="property">title</span>,</span><br><span class="line">                <span class="attr">link</span>: item.<span class="property">link</span>,</span><br><span class="line">                <span class="attr">avatar</span>: item.<span class="property">avatar</span>,</span><br><span class="line">                <span class="attr">descr</span>: item.<span class="property">descr</span>,</span><br><span class="line">                <span class="attr">topimg</span>: item.<span class="property">topimg</span> || <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">                <span class="attr">tag</span>: item.<span class="property">tag</span> || <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">                <span class="attr">color</span>: item.<span class="property">color</span> || <span class="string">&#x27;&#x27;</span></span><br><span class="line">            &#125;));</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 如果是第二个 URL，我们进行乱序处理</span></span><br><span class="line">            <span class="keyword">if</span> (index === <span class="number">1</span>) &#123; <span class="comment">// 注意这里的 index 从 0 开始，所以2号的位置是1</span></span><br><span class="line">                links = <span class="title function_">shuffleArray</span>(links); <span class="comment">// 乱序</span></span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            links.<span class="title function_">reverse</span>(); <span class="comment">// 逆序处理</span></span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 创建分类对象并推入分类数组</span></span><br><span class="line">            allCategories.<span class="title function_">push</span>(&#123;</span><br><span class="line">                <span class="attr">class_name</span>: customName,</span><br><span class="line">                <span class="attr">descr</span>: descr,</span><br><span class="line">                <span class="attr">type</span>: customType,</span><br><span class="line">                <span class="attr">suffix</span>: <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">                <span class="attr">link_list</span>: links</span><br><span class="line">            &#125;);</span><br><span class="line">            </span><br><span class="line">        &#125; <span class="keyword">catch</span> (err) &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">`读取 URL <span class="subst">$&#123;url&#125;</span> 时出错:`</span>, err.<span class="property">message</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="comment">// 随机打乱数组的函数</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">shuffleArray</span> = (<span class="params">array</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = array.<span class="property">length</span> - <span class="number">1</span>; i &gt; <span class="number">0</span>; i--) &#123;</span><br><span class="line">        <span class="keyword">const</span> j = <span class="title class_">Math</span>.<span class="title function_">floor</span>(<span class="title class_">Math</span>.<span class="title function_">random</span>() * (i + <span class="number">1</span>));</span><br><span class="line">        [array[i], array[j]] = [array[j], array[i]]; <span class="comment">// 交换元素</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> array;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">// 使用 https 模块获取 JSON 数据</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">fetchJson</span> = (<span class="params">url</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line">        https.<span class="title function_">get</span>(url, <span class="function">(<span class="params">res</span>) =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">let</span> data = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 收集数据</span></span><br><span class="line">            res.<span class="title function_">on</span>(<span class="string">&#x27;data&#x27;</span>, <span class="function"><span class="params">chunk</span> =&gt;</span> &#123;</span><br><span class="line">                data += chunk;</span><br><span class="line">            &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 请求结束后解析 JSON</span></span><br><span class="line">            res.<span class="title function_">on</span>(<span class="string">&#x27;end&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="title function_">resolve</span>(<span class="title class_">JSON</span>.<span class="title function_">parse</span>(data));</span><br><span class="line">                &#125; <span class="keyword">catch</span> (e) &#123;</span><br><span class="line">                    <span class="title function_">reject</span>(<span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">&#x27;无法解析 JSON&#x27;</span>));</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125;).<span class="title function_">on</span>(<span class="string">&#x27;error&#x27;</span>, <span class="function">(<span class="params">err</span>) =&gt;</span> &#123;</span><br><span class="line">            <span class="title function_">reject</span>(err);</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="comment">// 生成 YAML 数据并写入文件</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">generateYaml</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> yamlData = &#123;</span><br><span class="line">        <span class="attr">banner_suffix</span>: <span class="string">&#x27;&#x27;</span>,</span><br><span class="line">        <span class="attr">links</span>: allCategories</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 将生成的数据转换为 YAML 格式，强制使用双引号来防止折叠格式</span></span><br><span class="line">    <span class="keyword">const</span> generatedYaml = yaml.<span class="title function_">dump</span>(yamlData, &#123;</span><br><span class="line">        <span class="attr">noRefs</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="attr">lineWidth</span>: -<span class="number">1</span> <span class="comment">// 设置行宽为 -1，避免自动折行</span></span><br><span class="line">    &#125;); </span><br><span class="line"></span><br><span class="line">    <span class="comment">// 写入到 YAML 文件</span></span><br><span class="line">    fs.<span class="title function_">writeFileSync</span>(outputFileName, generatedYaml, <span class="string">&#x27;utf8&#x27;</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;YAML 文件已成功生成。&#x27;</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 执行读取和写入流程</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">processUrls</span> = <span class="keyword">async</span> (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">await</span> <span class="title function_">readJsonUrls</span>();</span><br><span class="line">    <span class="title function_">generateYaml</span>();</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="title function_">processUrls</span>();</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>请参考原教程到<code>5. 配置 config.yml</code>，后接着下来我的步骤，或者直接<a href="https://github.com/ymxblog/friends/">Fork</a>我的仓库进行修改。 <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 网络请求设置</span></span><br><span class="line"><span class="attr">request:</span></span><br><span class="line">  <span class="attr">timeout:</span> <span class="number">10</span> <span class="comment"># 超时设置</span></span><br><span class="line">  <span class="attr">ssl:</span> <span class="literal">false</span> <span class="comment"># ssl设置</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 要抓取的 issues 配置</span></span><br><span class="line"><span class="attr">issues:</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">ymxblog/friends</span> <span class="comment"># 仓库持有者/仓库名</span></span><br><span class="line">  <span class="attr">label:</span></span><br><span class="line">  <span class="attr">groups:</span> [<span class="string">&#x27;active&#x27;</span>,<span class="string">&#x27;checklist&#x27;</span>,<span class="string">&#x27;suspend&#x27;</span>,<span class="string">&#x27;404&#x27;</span>,<span class="string">&#x27;花架&#x27;</span>,<span class="string">&#x27;花友&#x27;</span>,<span class="string">&#x27;花族&#x27;</span>,<span class="string">&#x27;花主&#x27;</span>] <span class="comment">#标签有多少个就都写进去</span></span><br><span class="line">  <span class="attr">sort:</span></span><br></pre></td></tr></table></figure></li><li>修改 <strong>&#x2F;generator&#x2F;main.py</strong> 文件： <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">outputdir = os.path.join(version, <span class="string">&#x27;links&#x27;</span>)  <span class="comment"># 第十行。输出文件结构变化时，更新输出路径版本</span></span><br></pre></td></tr></table></figure></li><li>修改 <strong>.github&#x2F;workflows&#x2F;generator.yml</strong> 文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Generator</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">issues:</span></span><br><span class="line">  <span class="attr">watch:</span></span><br><span class="line">    <span class="attr">types:</span> [<span class="string">started</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">Python</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">actions/setup-python@v5</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">python-version:</span> <span class="number">3.</span><span class="string">x</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">requirements</span> <span class="comment">#安装requests</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        pip install -r requirements.txt</span></span><br><span class="line"><span class="string"></span>    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Update</span> <span class="string">links</span> <span class="comment">#更新</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        python generator/main.py</span></span><br><span class="line"><span class="string"></span>    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Commit</span> <span class="string">&amp;</span> <span class="string">Push</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">action-x/commit@v2.9</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">github-token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.PAT</span> <span class="string">&#125;&#125;</span></span><br><span class="line">        <span class="attr">push-branch:</span> <span class="string">&#x27;output&#x27;</span></span><br><span class="line">        <span class="attr">force-push:</span> <span class="string">&#x27;true&#x27;</span></span><br><span class="line">        <span class="attr">commit-message:</span> <span class="string">&#x27;Generate Json&#x27;</span></span><br><span class="line">        <span class="attr">name:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUBUSERNAME</span> <span class="string">&#125;&#125;</span></span><br><span class="line">        <span class="attr">email:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUBEMAIL</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">CDN</span> <span class="string">repository</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          git clone https://$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;:$&#123;&#123; secrets.PAT &#125;&#125;@github.com/$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;/CDN.git</span></span><br><span class="line"><span class="string">          cd CDN</span></span><br><span class="line"><span class="string"></span>          </span><br><span class="line">          <span class="comment"># 确保没有未加入分支的内容</span></span><br><span class="line">          <span class="string">git</span> <span class="string">fetch</span> <span class="string">origin</span></span><br><span class="line"></span><br><span class="line">          <span class="comment"># 如果需要删除完整的 links 目录，请使用 -r 参数</span></span><br><span class="line">          <span class="string">git</span> <span class="string">rm</span> <span class="string">-r</span> <span class="string">links/</span>  <span class="comment"># 删除整个 links 目录（如有必要）</span></span><br><span class="line">          <span class="comment"># 配置用户信息</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.name</span> <span class="string">&quot;$<span class="template-variable">&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;</span>&quot;</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.email</span> <span class="string">&quot;$<span class="template-variable">&#123;&#123; secrets.GITHUBEMAIL &#125;&#125;</span>&quot;</span></span><br><span class="line">          <span class="string">git</span> <span class="string">commit</span> <span class="string">-m</span> <span class="string">&quot;Delete links directory&quot;</span></span><br><span class="line">          <span class="string">git</span> <span class="string">push</span> <span class="string">origin</span> <span class="string">main</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">延迟30s执行</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          echo &quot;Starting delay...&quot;</span></span><br><span class="line"><span class="string">          sleep 30  # 延迟 30 秒</span></span><br><span class="line"><span class="string">          echo &quot;Delay completed.&quot;</span></span><br><span class="line"><span class="string"></span>    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Push</span> <span class="string">changes</span> <span class="string">to</span> <span class="string">CDN</span> <span class="string">repository</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          cd ./v2</span></span><br><span class="line"><span class="string"></span>          </span><br><span class="line">          <span class="comment"># 设置默认主分支为 &#x27;main&#x27;</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">init.defaultBranch</span> <span class="string">main</span></span><br><span class="line">          </span><br><span class="line">          <span class="string">if</span> [ <span class="string">!</span> <span class="string">-d</span> <span class="string">&quot;.git&quot;</span> ]<span class="string">;</span> <span class="string">then</span></span><br><span class="line">            <span class="string">git</span> <span class="string">init</span></span><br><span class="line">            <span class="string">echo</span> <span class="string">&quot;Initialized new Git repository.&quot;</span></span><br><span class="line">          <span class="string">fi</span></span><br><span class="line"></span><br><span class="line">          <span class="comment"># 配置用户信息</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.name</span> <span class="string">&quot;$<span class="template-variable">&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;</span>&quot;</span></span><br><span class="line">          <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">user.email</span> <span class="string">&quot;$<span class="template-variable">&#123;&#123; secrets.GITHUBEMAIL &#125;&#125;</span>&quot;</span></span><br><span class="line">          </span><br><span class="line">          <span class="string">git</span> <span class="string">remote</span> <span class="string">add</span> <span class="string">origin</span> <span class="string">https://$&#123;&#123;</span> <span class="string">secrets.GITHUBUSERNAME</span> <span class="string">&#125;&#125;:$&#123;&#123;</span> <span class="string">secrets.PAT</span> <span class="string">&#125;&#125;@github.com/$&#123;&#123;</span> <span class="string">secrets.GITHUBUSERNAME</span> <span class="string">&#125;&#125;/CDN.git</span></span><br><span class="line">          </span><br><span class="line">          <span class="comment"># 更新本地分支以确保所有更改都已拉取</span></span><br><span class="line">          <span class="string">git</span> <span class="string">fetch</span> <span class="string">origin</span></span><br><span class="line">          </span><br><span class="line">          <span class="comment"># 合并最新的主分支</span></span><br><span class="line">          <span class="string">git</span> <span class="string">merge</span> <span class="string">origin/main</span> <span class="string">--allow-unrelated-histories</span> <span class="string">||</span> &#123; <span class="string">echo</span> <span class="string">&quot;Merge conflict detected&quot;</span><span class="string">;</span> <span class="string">exit</span> <span class="number">1</span><span class="string">;</span> &#125;</span><br><span class="line">          </span><br><span class="line">          <span class="comment"># 显示当前状态</span></span><br><span class="line">          <span class="string">git</span> <span class="string">status</span></span><br><span class="line">          </span><br><span class="line">          <span class="comment"># 列出特定目录的内容</span></span><br><span class="line">          <span class="string">ls</span> <span class="string">-la</span> <span class="string">./links/</span></span><br><span class="line">          </span><br><span class="line">          <span class="comment"># 添加文件并提交</span></span><br><span class="line">          <span class="string">git</span> <span class="string">add</span> <span class="string">.</span></span><br><span class="line">          </span><br><span class="line">          <span class="string">if</span> [ <span class="string">-n</span> <span class="string">&quot;$(git status --porcelain)&quot;</span> ]<span class="string">;</span> <span class="string">then</span></span><br><span class="line">            <span class="string">git</span> <span class="string">commit</span> <span class="string">-m</span> <span class="string">&quot;友链更新&quot;</span> <span class="string">||</span> <span class="string">echo</span> <span class="string">&quot;No changes to commit&quot;</span></span><br><span class="line">          <span class="string">else</span></span><br><span class="line">            <span class="string">echo</span> <span class="string">&quot;No changes to commit.&quot;</span></span><br><span class="line">          <span class="string">fi</span></span><br><span class="line">          </span><br><span class="line">          <span class="comment"># 推送到远程</span></span><br><span class="line">          <span class="string">git</span> <span class="string">push</span> <span class="string">-u</span> <span class="string">origin</span> <span class="string">main</span> <span class="string">||</span> &#123; <span class="string">echo</span> <span class="string">&quot;Push failed, please resolve the issues.&quot;</span><span class="string">;</span> <span class="string">exit</span> <span class="number">1</span><span class="string">;</span> &#125;</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">peter-evans/repository-dispatch@v3</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUB_TOKEN</span> <span class="string">&#125;&#125;</span>  <span class="comment"># 使用默认的 GITHUB_TOKEN</span></span><br><span class="line">        <span class="attr">repository:</span> <span class="string">$&#123;&#123;</span> <span class="string">github.repository</span> <span class="string">&#125;&#125;</span>  <span class="comment"># 指向当前仓库</span></span><br><span class="line">        <span class="attr">event-type:</span> <span class="string">linkschange</span></span><br><span class="line">        <span class="attr">client-payload:</span> <span class="string">&#x27;&#123;&quot;branch&quot;: &quot;output&quot;&#125;&#x27;</span></span><br></pre></td></tr></table></figure></li><li>创建 <strong>.github&#x2F;workflows&#x2F;autolinks.yml</strong> 文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">更新网站友链</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">repository_dispatch:</span></span><br><span class="line">    <span class="attr">types:</span> [<span class="string">linkschange</span>]  <span class="comment"># 本工作流由 change 事件触发</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</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="comment"># 步骤1：检出代码（根据需求可选）</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">Code</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">$&#123;&#123;</span> <span class="string">github.event.client_payload.branch</span> <span class="string">||</span> <span class="string">&#x27;main&#x27;</span> <span class="string">&#125;&#125;</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># 步骤2：执行本地任务</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">Tasks</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;成功触发，当前分支：$<span class="template-variable">&#123;&#123; github.event.client_payload.branch &#125;&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># 步骤3：触发账号B的私有仓库工作流（关键修改部分）</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">peter-evans/repository-dispatch@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.MY_SECRET_TOKEN</span> <span class="string">&#125;&#125;</span>  <span class="comment"># 必须使用账号B的PAT</span></span><br><span class="line">          <span class="attr">repository:</span> <span class="string">yeminxi/hexo_code</span>          <span class="comment"># 格式：owner/repo</span></span><br><span class="line">          <span class="attr">event-type:</span> <span class="string">linkspush</span>              <span class="comment"># 与目标仓库的事件类型严格匹配</span></span><br><span class="line">          <span class="attr">client-payload:</span> <span class="string">&#x27;&#123;&quot;branch&quot;: &quot;output&quot;&#125;&#x27;</span> <span class="comment"># 简化参数，移除冗余字段</span></span><br></pre></td></tr></table></figure></li><li>我使用 <strong>Github Action</strong> 构建站点，在前面加上就可以实现友链检测，朋友圈，友链的三同步： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">自动部署</span></span><br><span class="line"><span class="comment"># 当有改动推送到master分支时，启动Action</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">repository_dispatch:</span></span><br><span class="line">    <span class="attr">types:</span> [<span class="string">linkspush</span>]  <span class="comment"># 本工作流由 change 事件触发</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">solitude</span></span><br><span class="line">      <span class="comment">#2020年10月后github新建仓库默认分支改为main，注意更改</span></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><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">permissions:</span></span><br><span class="line">      <span class="attr">actions:</span> <span class="string">write</span></span><br><span class="line">      <span class="attr">checks:</span> <span class="string">write</span></span><br><span class="line">      <span class="attr">contents:</span> <span class="string">write</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">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        echo &quot;Starting delay...&quot;</span></span><br><span class="line"><span class="string">        sleep 30  # 延迟 30 秒</span></span><br><span class="line"><span class="string">        echo &quot;Delay completed.&quot;</span></span><br><span class="line"><span class="string"></span>    <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">solitude</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;20.x&quot;</span> <span class="comment">#action使用的node版本，建议大版本和本地保持一致。可以在本地用node -v查询版本号。</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"></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">|</span></span><br><span class="line"><span class="string">          node_modules</span></span><br><span class="line"><span class="string">          .deploy_git</span></span><br><span class="line"><span class="string">          public</span></span><br><span class="line"><span class="string"></span>        <span class="attr">key:</span> <span class="string">$&#123;&#123;runner.OS&#125;&#125;-$&#123;&#123;hashFiles(&#x27;**/package-lock.json&#x27;)&#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 gulp-cli -g #全局安装gulp</span></span><br><span class="line"><span class="string">        npm install --save</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><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        hexo clean</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">        node links.js</span></span><br><span class="line"><span class="string">        node autolinks.js</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">        hexo generate</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">提交索引至Algolia</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</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">        gulp</span></span><br><span class="line"><span class="string"></span>    </span><br><span class="line">    <span class="comment"># - name: 部署    </span></span><br><span class="line">    <span class="comment">#   uses: JamesIves/github-pages-deploy-action@v4</span></span><br><span class="line">    <span class="comment">#   with:</span></span><br><span class="line">    <span class="comment">#     token: $&#123;&#123; secrets.GITHUBTOKEN &#125;&#125;</span></span><br><span class="line">    <span class="comment">#     repository-name: $&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;/$&#123;&#123; secrets.GITHUBUSERNAME &#125;&#125;.github.io</span></span><br><span class="line">    <span class="comment">#     branch: v3.0.0</span></span><br><span class="line">    <span class="comment">#     collapseer: public</span></span><br><span class="line">    <span class="comment">#     commit-message: &quot;$&#123;&#123; github.event.head_commit.message &#125;&#125; Updated By Github Actions&quot;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">部署到Cloudfare</span> <span class="string">Vercel</span> <span class="string">Pages</span> <span class="comment">#此处master:master 指从本地的master分支提交到远程仓库的master分支，若远程仓库没有对应分支则新建一个。如有其他需要，可以根据自己的需求更改。</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</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 branch -M solitude</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 -u +&quot;%Y-%m-%dT%H:%M:%SZ&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;/hexo_code_Solitude.git&quot; solitude:v3.0.0</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;/hexo_code_Solitude.git&quot; solitude:main</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">推送谷歌url</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        hexo deploy</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure></li><li>需要在仓库添加的环境变量，至于怎么获取token这里不多介绍，我这里是用了两个账号所以有两个token，一个只用设置PAT就好。<table><thead><tr><th>name</th><th>value</th></tr></thead><tbody><tr><td>GITHUBUSERNAME</td><td>你Github的用户名</td></tr><tr><td>GITHUBEMAIL</td><td>你Github的邮箱</td></tr><tr><td>PAT</td><td>包含repo和work的权限token</td></tr><tr><td>MY_SECRET_TOKEN</td><td>另一账号仓库包含repo和work的权限token</td></tr></tbody></table></li><li>说一下是什么原理<blockquote><p>获取issues的内容 -&gt; 按label生成对应的json -&gt; 推送至output分支和CDN仓库 -&gt; 发送请求至本仓库的另外一工作流 -&gt; 收到请求后，发送请求至另外账号仓库的构建站点的工作流 -&gt; 实现动态友链更新</p></blockquote></li></ol><p>  原教程只能生成json文件到本仓库的 *<strong>output</strong> 分支的v2文件夹里，这里我加了一个推送到我的CDN仓库的操作。然后通过Github Action获取CDN的json内容生成友链文件，友链检测文件，朋友圈文件，实现三端同步实时更新。<br>  同理可得动态即可短文。</p></div><div class="tab-pane" id="zzyl-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Stellar动态友链教程</td><td><a href="https://weekdaycare.cn/posts/stellar-friends/">星日语</a></td></tr></tbody></table></div></div></div><h3 id="18-添加回复时引用该评论"><a href="#18-添加回复时引用该评论" class="headerlink" title="18. 添加回复时引用该评论"></a>18. 添加回复时引用该评论</h3><div class="tabs" id="reply"><ul class="nav-tabs"><li class="tab active"><a class="#reply-1"><i class="fas fa-wand-magic-sparkles [/essay/]"></i>效果</a></li><li class="tab"><a class="#reply-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="reply-1"><p>点击效果，即可跳转，随便找条评论试试，只适用Waline。</p></div><div class="tab-pane" id="reply-2"><ol><li>新建 <strong>source&#x2F;custom&#x2F;js&#x2F;replycontent.js</strong> 文件填入内容： <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> walineContainer = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> observer = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="title function_">initWalineReply</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">        <span class="comment">// 移除旧的事件监听器</span></span><br><span class="line">        <span class="keyword">if</span> (walineContainer) &#123;</span><br><span class="line">            walineContainer.<span class="title function_">removeEventListener</span>(<span class="string">&#x27;click&#x27;</span>, handleClick);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 获取新的评论容器</span></span><br><span class="line">        walineContainer = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;waline-wrap&#x27;</span>);</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> (!walineContainer) &#123;</span><br><span class="line">            <span class="keyword">return</span>; <span class="comment">// 如果没有找到容器则退出</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 添加点击事件监听器</span></span><br><span class="line">        walineContainer.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, handleClick, &#123; <span class="attr">passive</span>: <span class="literal">true</span> &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 如果旧观察者存在，则断开连接</span></span><br><span class="line">        <span class="keyword">if</span> (observer) &#123;</span><br><span class="line">            observer.<span class="title function_">disconnect</span>();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 创建新的 MutationObserver 实例并开始观察</span></span><br><span class="line">        observer = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="comment">// 在 DOM 变化时重新初始化</span></span><br><span class="line">            <span class="title function_">initWalineReply</span>();</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        observer.<span class="title function_">observe</span>(walineContainer, &#123;</span><br><span class="line">            <span class="attr">childList</span>: <span class="literal">true</span>,</span><br><span class="line">            <span class="attr">subtree</span>: <span class="literal">true</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> <span class="title function_">handleClick</span> = (<span class="params">e</span>) =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> replyBtn = e.<span class="property">target</span>.<span class="title function_">closest</span>(<span class="string">&#x27;button.wl-reply&#x27;</span>);</span><br><span class="line">        <span class="keyword">if</span> (!replyBtn || walineContainer.<span class="property">dataset</span>.<span class="property">pjaxLoading</span> === <span class="string">&#x27;true&#x27;</span>) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 精准定位当前评论内容</span></span><br><span class="line">        <span class="keyword">const</span> commentItem = replyBtn.<span class="title function_">closest</span>(<span class="string">&#x27;.wl-card-item&#x27;</span>);</span><br><span class="line">        <span class="keyword">const</span> contentNode = commentItem.<span class="title function_">querySelector</span>(<span class="string">&#x27;.wl-card &gt; .wl-content&#x27;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (!contentNode) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 沙盒处理（保留链接结构）</span></span><br><span class="line">        <span class="keyword">const</span> sandbox = contentNode.<span class="title function_">cloneNode</span>(<span class="literal">true</span>);</span><br><span class="line">        </span><br><span class="line">        <span class="comment">// 移除干扰元素</span></span><br><span class="line">        sandbox.<span class="title function_">querySelectorAll</span>(</span><br><span class="line">            <span class="string">&#x27;span, .wl-meta, svg, img, .wl-quote, blockquote, a[href^=&quot;#&quot;], pre&#x27;</span></span><br><span class="line">        ).<span class="title function_">forEach</span>(<span class="function"><span class="params">n</span> =&gt;</span> n.<span class="title function_">remove</span>());</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 转换普通链接为Markdown格式（保留非锚点链接）</span></span><br><span class="line">        sandbox.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;a:not([href^=&quot;#&quot;])&#x27;</span>).<span class="title function_">forEach</span>(<span class="function"><span class="params">a</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> text = a.<span class="property">textContent</span>.<span class="title function_">trim</span>();</span><br><span class="line">            <span class="keyword">const</span> href = a.<span class="title function_">getAttribute</span>(<span class="string">&#x27;href&#x27;</span>) || <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">            a.<span class="title function_">replaceWith</span>(<span class="string">`[<span class="subst">$&#123;text&#125;</span>](<span class="subst">$&#123;href&#125;</span>)`</span>);</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 提取纯净文本（增加过滤@符号）</span></span><br><span class="line">        <span class="keyword">const</span> pureText = sandbox.<span class="property">textContent</span></span><br><span class="line">            .<span class="title function_">replace</span>(<span class="regexp">/@\S+/g</span>, <span class="string">&#x27;&#x27;</span>)               <span class="comment">// 新增@提及过滤</span></span><br><span class="line">            .<span class="title function_">replace</span>(<span class="regexp">/\n&#123;3,&#125;/g</span>, <span class="string">&#x27;\n\n&#x27;</span>)</span><br><span class="line">            .<span class="title function_">trim</span>()</span><br><span class="line">            .<span class="title function_">substring</span>(<span class="number">0</span>, <span class="number">500</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 获取编辑器实例</span></span><br><span class="line">        <span class="keyword">const</span> editor = walineContainer.<span class="title function_">querySelector</span>(<span class="string">&#x27;.wl-editor&#x27;</span>);</span><br><span class="line">        <span class="keyword">if</span> (!editor) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 执行插入</span></span><br><span class="line">        <span class="title function_">insertEditorContent</span>(editor, pureText);</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 通用插入方法（支持Markdown）</span></span><br><span class="line">    <span class="keyword">const</span> <span class="title function_">insertEditorContent</span> = (<span class="params">editor, text</span>) =&gt; &#123;</span><br><span class="line">        <span class="keyword">const</span> insertText = <span class="string">`&gt; <span class="subst">$&#123;text&#125;</span>\n\n`</span>;</span><br><span class="line">        <span class="keyword">const</span> inputEvent = <span class="keyword">new</span> <span class="title class_">Event</span>(<span class="string">&#x27;input&#x27;</span>, &#123; <span class="attr">bubbles</span>: <span class="literal">true</span> &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (editor.<span class="property">tagName</span> === <span class="string">&#x27;TEXTAREA&#x27;</span> || editor.<span class="property">tagName</span> === <span class="string">&#x27;INPUT&#x27;</span>) &#123;</span><br><span class="line">            <span class="comment">// 原生文本域处理</span></span><br><span class="line">            <span class="keyword">const</span> start = editor.<span class="property">selectionStart</span>;</span><br><span class="line">            editor.<span class="property">value</span> = </span><br><span class="line">                editor.<span class="property">value</span>.<span class="title function_">slice</span>(<span class="number">0</span>, start) + </span><br><span class="line">                insertText + </span><br><span class="line">                editor.<span class="property">value</span>.<span class="title function_">slice</span>(editor.<span class="property">selectionEnd</span>);</span><br><span class="line">            editor.<span class="property">selectionEnd</span> = start + insertText.<span class="property">length</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (editor.<span class="property">isContentEditable</span>) &#123;</span><br><span class="line">            <span class="comment">// 富文本编辑器处理</span></span><br><span class="line">            <span class="keyword">const</span> range = <span class="variable language_">document</span>.<span class="title function_">createRange</span>();</span><br><span class="line">            <span class="keyword">const</span> selection = <span class="variable language_">window</span>.<span class="title function_">getSelection</span>();</span><br><span class="line">            range.<span class="title function_">selectNodeContents</span>(editor);</span><br><span class="line">            range.<span class="title function_">collapse</span>(<span class="literal">false</span>); <span class="comment">// 光标移到最后</span></span><br><span class="line">            range.<span class="title function_">insertNode</span>(<span class="variable language_">document</span>.<span class="title function_">createTextNode</span>(insertText));</span><br><span class="line">            selection.<span class="title function_">removeAllRanges</span>();</span><br><span class="line">            selection.<span class="title function_">addRange</span>(range);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        editor.<span class="title function_">dispatchEvent</span>(inputEvent);</span><br><span class="line">        editor.<span class="title function_">focus</span>();</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 初始化及事件监听</span></span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, initWalineReply);</span><br><span class="line">    <span class="title function_">initWalineReply</span>(); <span class="comment">// 初次调用以进行初始化</span></span><br><span class="line">&#125;)();</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>修改主题配置文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">data-pjax</span> <span class="string">src=&quot;/custom/js/replycontent.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ol></div></div></div><h3 id="19-弹出式欢迎界面"><a href="#19-弹出式欢迎界面" class="headerlink" title="19. 弹出式欢迎界面"></a>19. 弹出式欢迎界面</h3><div class="tabs" id="welcome"><ul class="nav-tabs"><li class="tab active"><a class="#welcome-1"><i class="fas fa-wand-magic-sparkles [/]"></i>效果</a></li><li class="tab"><a class="#welcome-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#welcome-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="welcome-1"><p>首次进入本站即显示，点击效果即刻跳转。</p></div><div class="tab-pane" id="welcome-2"><ol><li>新建 <strong>source&#x2F;custom&#x2F;js&#x2F;welcome.js</strong> 文件填入以下内容（可改）： <figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&quot;DOMContentLoaded&quot;</span>, (<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="title function_">getCookie</span>(<span class="string">&quot;agreementAccepted&quot;</span>)) &#123;</span><br><span class="line">        <span class="keyword">const</span> referrer = <span class="variable language_">document</span>.<span class="property">referrer</span> ? <span class="keyword">new</span> <span class="title function_">URL</span>(<span class="variable language_">document</span>.<span class="property">referrer</span>).<span class="property">hostname</span> : <span class="string">&quot;直接访问&quot;</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="title function_">swal</span>(&#123;</span><br><span class="line">            <span class="attr">title</span>: <span class="string">&quot;欢迎来到 叶泯希 &lt;(￣︶￣)↗[GO!]&quot;</span>,</span><br><span class="line">            <span class="attr">content</span>: &#123;</span><br><span class="line">                <span class="attr">element</span>: <span class="string">&quot;div&quot;</span>,</span><br><span class="line">                <span class="attr">attributes</span>: &#123;</span><br><span class="line">                    <span class="attr">innerHTML</span>: <span class="string">`</span></span><br><span class="line"><span class="string">                        &lt;img src=&#x27;/images/avatar.webp&#x27; alt=&#x27;自定义图标&#x27; </span></span><br><span class="line"><span class="string">                            style=&#x27;width:80px; height:auto; border-radius: 50%; </span></span><br><span class="line"><span class="string">                            display: block; margin: 0 auto;&#x27; /&gt;&lt;br /&gt;</span></span><br><span class="line"><span class="string">                        您来自: <span class="subst">$&#123;referrer&#125;</span>&lt;br /&gt;</span></span><br><span class="line"><span class="string">                        请您在继续浏览本站之前，仔细阅读以下协议：&lt;br /&gt;&lt;br /&gt;</span></span><br><span class="line"><span class="string">                        1. &lt;a href=&#x27;/privacy/&#x27; title=&#x27;隐私协议&#x27; data-pjax-state=&#x27;&#x27;&gt;隐私协议&lt;/a&gt;&amp;nbsp;&amp;nbsp;</span></span><br><span class="line"><span class="string">                        2. &lt;a href=&#x27;/disclaimer/&#x27; title=&#x27;免责声明&#x27; data-pjax-state=&#x27;&#x27;&gt;免责声明&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;</span></span><br><span class="line"><span class="string">                        3. &lt;a href=&#x27;/copyright/&#x27; title=&#x27;版权协议&#x27; data-pjax-state=&#x27;&#x27;&gt;版权协议&lt;/a&gt;&amp;nbsp;&amp;nbsp;</span></span><br><span class="line"><span class="string">                        4. &lt;a href=&#x27;/comment/&#x27; title=&#x27;评论协议&#x27; data-pjax-state=&#x27;&#x27;&gt;评论协议&lt;/a&gt;&amp;nbsp;&amp;nbsp; </span></span><br><span class="line"><span class="string">                        5. &lt;a href=&#x27;/cookies/&#x27; title=&#x27;Cookies&#x27; data-pjax-state=&#x27;&#x27;&gt;Cookies&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;</span></span><br><span class="line"><span class="string">                        点击“同意”表示您已阅读并同意遵守以上协议。</span></span><br><span class="line"><span class="string">                    `</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="attr">buttons</span>: &#123;</span><br><span class="line">                <span class="attr">cancel</span>: <span class="string">&quot;不同意&quot;</span>,</span><br><span class="line">                <span class="attr">confirm</span>: <span class="string">&quot;同意&quot;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="attr">text</span>: <span class="string">&quot;若未获取新内容请清浏览器缓存。&quot;</span></span><br><span class="line">        &#125;).<span class="title function_">then</span>(<span class="function"><span class="params">willProceed</span> =&gt;</span> &#123;</span><br><span class="line">            willProceed ? <span class="title function_">setCookie</span>(<span class="string">&quot;agreementAccepted&quot;</span>, <span class="string">&quot;true&quot;</span>, <span class="number">30</span>) :</span><br><span class="line">            <span class="variable language_">window</span>.<span class="property">history</span>.<span class="property">length</span> &gt; <span class="number">1</span> ? <span class="variable language_">window</span>.<span class="property">history</span>.<span class="title function_">back</span>() :</span><br><span class="line">            <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">href</span> = <span class="string">&quot;https://xxx&quot;</span>;<span class="comment">// 替换为希望重定向的 URL</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">function</span> <span class="title function_">setCookie</span>(<span class="params">name, value, days</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> date = <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line">        date.<span class="title function_">setTime</span>(date.<span class="title function_">getTime</span>() + <span class="number">24</span> * days * <span class="number">60</span> * <span class="number">60</span> * <span class="number">1000</span>); <span class="comment">//添加30天的cookie</span></span><br><span class="line">        <span class="keyword">const</span> expires = <span class="string">&quot;expires=&quot;</span> + date.<span class="title function_">toUTCString</span>();</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">cookie</span> = name + <span class="string">&quot;=&quot;</span> + value + <span class="string">&quot;;&quot;</span> + expires + <span class="string">&quot;;path=/&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">getCookie</span>(<span class="params">name</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> nameEQ = name + <span class="string">&quot;=&quot;</span>;</span><br><span class="line">        <span class="keyword">const</span> ca = <span class="variable language_">document</span>.<span class="property">cookie</span>.<span class="title function_">split</span>(<span class="string">&quot;;&quot;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; ca.<span class="property">length</span>; i++) &#123;</span><br><span class="line">            <span class="keyword">let</span> c = ca[i];</span><br><span class="line">            <span class="keyword">while</span> (<span class="string">&quot; &quot;</span> === c.<span class="title function_">charAt</span>(<span class="number">0</span>)) c = c.<span class="title function_">substring</span>(<span class="number">1</span>, c.<span class="property">length</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="number">0</span> === c.<span class="title function_">indexOf</span>(nameEQ)) <span class="keyword">return</span> c.<span class="title function_">substring</span>(nameEQ.<span class="property">length</span>, c.<span class="property">length</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;));</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>在 <strong>source&#x2F;custom&#x2F;css&#x2F;custom.css</strong> 最后添加（没有就新建）： <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 弹出框样式 */</span></span><br><span class="line"><span class="selector-class">.swal-modal</span>,<span class="selector-class">.swal-text</span>,<span class="selector-class">.swal-title</span> &#123;</span><br><span class="line">  <span class="attribute">font-family</span>: <span class="built_in">var</span>(--efu-font) <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--efu-secondbg);</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-fontcolor) <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.swal-text</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.swal-content</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--efu-theme-op-deep);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.swal-content</span> <span class="selector-tag">a</span><span class="selector-pseudo">:not</span>(<span class="selector-class">.fancybox</span>) &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-fontcolor);</span><br><span class="line">  <span class="attribute">font-weight</span>: <span class="number">700</span>;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none;</span><br><span class="line">  <span class="attribute">border-bottom</span>: <span class="number">2px</span> dotted <span class="built_in">var</span>(--efu-lighttext);</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0px</span> <span class="number">4px</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">4px</span> <span class="number">4px</span> <span class="number">0px</span> <span class="number">0px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.swal-button--confirm</span>  &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">var</span>(--efu-fontcolor);</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="built_in">var</span>(--efu-theme-op-deep);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>修改主题配置文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/custom/css/custom.css&quot;&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://unpkg.com/sweetalert/dist/sweetalert.min.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/custom/js/welcome.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ol></div><div class="tab-pane" id="welcome-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>SweetAlert</td><td><a href="https://sweetalert.js.org/">官网</a></td></tr><tr><td>【Hexo+NexT主题】弹出欢迎弹窗</td><td><a href="https://blog.pai233.top/20210912/hexo-pop-welcome-window/">pai233</a></td></tr></tbody></table></div></div></div><h3 id="20-添加小米字体"><a href="#20-添加小米字体" class="headerlink" title="20. 添加小米字体"></a>20. 添加小米字体</h3><div class="tabs" id="front"><ul class="nav-tabs"><li class="tab active"><a class="#front-1"><i class="fas fa-wand-magic-sparkles"></i>效果</a></li><li class="tab"><a class="#front-2"><i class="fas fa-book-open"></i>教程</a></li></ul><div class="tab-content"><div class="tab-pane active" id="front-1"><p>所见即所得。</p></div><div class="tab-pane" id="front-2"><ul><li>修改主题配置文件  <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Font</span></span><br><span class="line"><span class="comment"># 字体</span></span><br><span class="line"><span class="attr">font:</span></span><br><span class="line">  <span class="attr">font-size:</span> <span class="string">20px</span></span><br><span class="line">  <span class="attr">code-font-size:</span> <span class="string">16px</span></span><br><span class="line">  <span class="comment"># Global font</span></span><br><span class="line">  <span class="comment"># 全局字体</span></span><br><span class="line">  <span class="attr">font-family:</span> <span class="string">&quot;MiSans, sans-serif&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;https://font.sec.miui.com/font/css?family=MiSans:400,700:MiSans&quot;&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul></div></div></div><h3 id="21-配置swpp和PWA（主题是v2-现版本v3）"><a href="#21-配置swpp和PWA（主题是v2-现版本v3）" class="headerlink" title="21. 配置swpp和PWA（主题是v2 现版本v3）"></a>21. 配置swpp和PWA（<a href="https://solitude.js.org/config/extend.html#pwa">主题是v2</a> 现版本v3）</h3><div class="tabs" id="swpp"><ul class="nav-tabs"><li class="tab active"><a class="#swpp-1"><i class="fas fa-wand-magic-sparkles [/]"></i>效果</a></li><li class="tab"><a class="#swpp-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#swpp-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="swpp-1"><p>进入页面即可显示。特别感谢<a href="https://blog.liushen.fun/">Liushen</a>的帮助！</p></div><div class="tab-pane" id="swpp-2"><ol><li>安装 <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install swpp-backends@3.0.0-alpha.908 --save</span><br><span class="line">npm install hexo-swpp@4.0.0-alpha.131 --save</span><br></pre></td></tr></table></figure></li><li>在Hexo配置文件最后添加： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># swpp</span></span><br><span class="line"><span class="comment"># npm install swpp-backends@3.0.0-alpha.902 --save</span></span><br><span class="line"><span class="comment"># npm install hexo-swpp@4.0.0-alpha.131 --save</span></span><br><span class="line"><span class="comment"># https://kmar.top/posts/b70ec88f/</span></span><br><span class="line"><span class="comment"># https://github.com/EmptyDreams/hexo-swpp</span></span><br><span class="line"><span class="attr">swpp:</span></span><br><span class="line">  <span class="comment"># 是否启用，默认 false</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">config_path:</span> <span class="string">&#x27;swpp.config.ts&#x27;</span></span><br><span class="line">  <span class="comment"># 是否生成 sw</span></span><br><span class="line">  <span class="attr">serviceWorker:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 是否向所有 HTML 插入注册 sw 的代码</span></span><br><span class="line">  <span class="attr">auto_register:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 是否生成 DOM 端的 JS 文件并在 HTML 中插入 script</span></span><br><span class="line">  <span class="attr">gen_dom:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 是否追踪链接，默认 false</span></span><br><span class="line">  <span class="comment"># ⚠️警告！！！未启用链接追踪时不要使用永久缓存，否则会导致被缓存的数据永远不会更新，在您不再使用该资源时，缓存也不会被删除！！！</span></span><br><span class="line">  <span class="attr">track_link:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 生成的 diff 文件的路径（可以是绝对路径也可以是相对路径，使用相对路径时相对于网站发布目录），留空表示不生成（默认为 null）</span></span><br><span class="line">  <span class="attr">gen_diff:</span> <span class="string">&#x27;./diff.json&#x27;</span></span><br><span class="line">  <span class="comment"># 是否在执行 hexo deploy 时自动执行 swpp 指令</span></span><br><span class="line">  <span class="comment"># auto_exec: false</span></span><br><span class="line">  <span class="comment"># 检查更新的网址，默认 &quot;https://registry.npmjs.org&quot;，注意不能以斜杠结尾</span></span><br><span class="line">  <span class="attr">npm_url:</span> <span class="string">&#x27;https://registry.npmmirror.com&#x27;</span></span><br><span class="line">  <span class="comment">#</span></span><br><span class="line">  <span class="comment"># 排序规则。</span></span><br><span class="line">  <span class="comment"># 该配置项是为了对 hexo 中的一些变量进行排序，避免每次生成 HTML 时由于这些变量的顺序变动导致生成结果不完全相同。</span></span><br><span class="line">  <span class="comment"># 示例：</span></span><br><span class="line">  <span class="comment"># ```yaml</span></span><br><span class="line">  <span class="comment"># # 下面给出的值为插件的缺省值，用户设置该项不会直接覆盖这些值，只有用户也声明 posts、pages 或 tags 时才会覆盖对应的值。</span></span><br><span class="line">  <span class="comment"># swpp:</span></span><br><span class="line">  <span class="comment">#   sort_rules:</span></span><br><span class="line">  <span class="comment">#     posts: &#x27;title&#x27;</span></span><br><span class="line">  <span class="comment">#     pages: &#x27;title&#x27;</span></span><br><span class="line">  <span class="comment">#     tags: &#x27;name&#x27;</span></span><br><span class="line">  <span class="comment"># ```</span></span><br><span class="line">  <span class="comment"># 其中 key 值为要排序的变量的名称，value 为变量排序时的依据，</span></span><br><span class="line">  <span class="comment"># 填 false 表示禁用该项排序，填 true 表示以 value 本身为键进行排序，填字符串表示以 value[tag] 为键进行排序。</span></span><br><span class="line">  <span class="comment"># sort_rules:</span></span><br></pre></td></tr></table></figure></li><li>在根目录下创建 <strong>swpp.config.ts</strong> 文件，把我的域名改成你自己的（不懂就看参考里的教程）： <figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123;</span><br><span class="line">    defineConfig</span><br><span class="line">&#125; <span class="keyword">from</span> <span class="string">&#x27;swpp-backends&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">    <span class="attr">compilationEnv</span>: &#123;</span><br><span class="line">        <span class="attr">DOMAIN_HOST</span>: <span class="keyword">new</span> <span class="title function_">URL</span>(<span class="string">&#x27;https://blog.418121.xyz&#x27;</span>),</span><br><span class="line">        <span class="attr">SERVICE_WORKER</span>: <span class="string">&quot;sw&quot;</span>,</span><br><span class="line">        <span class="title class_">JSON</span><span class="attr">_HTML_LIMIT</span>: <span class="number">10</span>,</span><br><span class="line">        <span class="attr">isStable</span>: <span class="function">(<span class="params"><span class="attr">url</span>: URL</span>) =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> [</span><br><span class="line">                <span class="regexp">/^(https?:\/\/|\/\/)(cdn|fastly)\.jsdelivr\.net\/npm\/.*@\d+\.\d+\.\d+\//</span>,</span><br><span class="line">                <span class="regexp">/^(https?:\/\/|\/\/)jsdelivr\.topthink\.com\/.*@\d+\.\d+\.\d+\//</span>,</span><br><span class="line">                <span class="regexp">/^(https?:\/\/|\/\/)cdn\.jsdmirror\.com\/.*@\d+\.\d+\.\d+\//</span>,</span><br><span class="line">                <span class="regexp">/^(https?:\/\/|\/\/)cdn\.staticfile\.org\/.*\/\d+\.\d+\.\d+\//</span>,</span><br><span class="line">                <span class="regexp">/^(https?:\/\/|\/\/)lf\d+-cdn-tos\.bytecdntp\.com\/.*\/\d+\.\d+\.\d+\//</span>,</span><br><span class="line">                <span class="regexp">/^(https?:\/\/|\/\/)npm\.elemecdn\.com\/.*@\d+\.\d+\.\d+\//</span></span><br><span class="line">            ].<span class="title function_">some</span>(<span class="function"><span class="params">it</span> =&gt;</span> it.<span class="title function_">test</span>(url.<span class="property">href</span>))</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="attr">VERSION_LENGTH_LIMIT</span>: <span class="number">512</span>,</span><br><span class="line">        <span class="attr">NETWORK_FILE_FETCHER</span>: &#123;</span><br><span class="line">            <span class="attr">referer</span>: <span class="string">&quot;https://blog.418121.xyz&quot;</span>,</span><br><span class="line">            <span class="title function_">getStandbyList</span>(<span class="attr">url</span>: <span class="built_in">string</span> | <span class="variable constant_">URL</span>): (<span class="built_in">string</span> | <span class="variable constant_">URL</span>)[] &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="keyword">typeof</span> url === <span class="string">&#x27;string&#x27;</span>) url = <span class="keyword">new</span> <span class="title function_">URL</span>(url)</span><br><span class="line">                <span class="keyword">if</span> (url.<span class="property">hostname</span> === <span class="string">&#x27;npm.elemecdn.com&#x27;</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> [<span class="string">`https://fastly.jsdelivr.net<span class="subst">$&#123;url.pathname&#125;</span>`</span>]</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> [url]</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="attr">crossEnv</span>: &#123;</span><br><span class="line">        <span class="attr">CACHE_NAME</span>: <span class="string">&quot;BlogCache&quot;</span>,</span><br><span class="line">        <span class="attr">VERSION_PATH</span>: <span class="string">&quot;https://id.v3/&quot;</span>,</span><br><span class="line">        <span class="attr">ESCAPE</span>: <span class="number">15</span>,</span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line">    <span class="attr">runtimeDep</span>: &#123;</span><br><span class="line">        <span class="attr">getStandbyRequests</span>: (<span class="attr">request</span>: <span class="title class_">Request</span>): &#123;<span class="attr">t</span>: <span class="built_in">number</span>, <span class="attr">l</span>: <span class="function">() =&gt;</span> <span class="title class_">Request</span>[]&#125; | <span class="function"><span class="params">void</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> srcUrl = request.<span class="property">url</span></span><br><span class="line">            <span class="keyword">const</span> &#123;host, pathname&#125; = <span class="keyword">new</span> <span class="title function_">URL</span>(srcUrl)</span><br><span class="line">            <span class="comment">// noinspection SpellCheckingInspection</span></span><br><span class="line">            <span class="keyword">const</span> commonCdnList = [<span class="string">&#x27;jsdelivr.topthink.com&#x27;</span>, <span class="string">&#x27;cdn.jsdmirror.com&#x27;</span>, <span class="string">&#x27;fastly.jsdelivr.net&#x27;</span>]</span><br><span class="line">            <span class="comment">// noinspection SpellCheckingInspection</span></span><br><span class="line">            <span class="keyword">const</span> elme = <span class="string">&#x27;npm.elemecdn.com&#x27;</span></span><br><span class="line">            <span class="keyword">const</span> <span class="title function_">urlMapper</span> = (<span class="params"><span class="attr">it</span>: <span class="built_in">string</span></span>) =&gt; <span class="keyword">new</span> <span class="title class_">Request</span>(it, request)</span><br><span class="line">            <span class="keyword">if</span> (host === elme) &#123;</span><br><span class="line">                <span class="keyword">return</span> &#123;</span><br><span class="line">                    <span class="attr">t</span>: <span class="number">2000</span>,</span><br><span class="line">                    <span class="attr">l</span>: <span class="function">() =&gt;</span> [...commonCdnList.<span class="title function_">map</span>(<span class="function"><span class="params">it</span> =&gt;</span> <span class="string">`https://<span class="subst">$&#123;it&#125;</span>/npm<span class="subst">$&#123;pathname&#125;</span>`</span>)].<span class="title function_">map</span>(urlMapper)</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (host === <span class="string">&#x27;jsdelivr.topthink.com&#x27;</span>) &#123;</span><br><span class="line">                commonCdnList.<span class="title function_">splice</span>(<span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">                <span class="keyword">return</span> &#123;</span><br><span class="line">                    <span class="attr">t</span>: <span class="number">2000</span>,</span><br><span class="line">                    <span class="attr">l</span>: <span class="function">() =&gt;</span> [...commonCdnList.<span class="title function_">map</span>(<span class="function"><span class="params">it</span> =&gt;</span> <span class="string">`https://<span class="subst">$&#123;it&#125;</span><span class="subst">$&#123;pathname&#125;</span>`</span>)].<span class="title function_">map</span>(urlMapper)</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="attr">crossDep</span>: &#123;</span><br><span class="line">        <span class="attr">matchCacheRule</span>: &#123;</span><br><span class="line">            <span class="attr">runOnBrowser</span>: <span class="function">(<span class="params"><span class="attr">url</span>: URL</span>)  =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">let</span> &#123; host, pathname &#125; = url;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 处理省略index.html的情况</span></span><br><span class="line">                <span class="keyword">if</span> (pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;/&#x27;</span>)) pathname += <span class="string">&#x27;index.html&#x27;</span>;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 仅仅对于blog.418121.xyz&#x27;)) &#123; 处理 html 和 json</span></span><br><span class="line">                <span class="keyword">if</span> (host.<span class="title function_">endsWith</span>(<span class="string">&#x27;blog.418121.xyz&#x27;</span>)) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;.json&#x27;</span>)) <span class="keyword">return</span> <span class="number">2592000000</span>; <span class="comment">// 30 dyas</span></span><br><span class="line">                    <span class="keyword">if</span> (pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;.html&#x27;</span>)) <span class="keyword">return</span> <span class="number">2592000000</span>; <span class="comment">// 30 dyas</span></span><br><span class="line">                    <span class="keyword">if</span> (pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;.webp&#x27;</span>) || pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;.jpg&#x27;</span>) || pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;.png&#x27;</span>) || pathname.<span class="title function_">endsWith</span>(<span class="string">&#x27;.gif&#x27;</span>)) <span class="keyword">return</span> <span class="number">2592000000</span>; <span class="comment">// 30 dyas</span></span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (<span class="regexp">/\.(js|css|woff2|woff|ttf|cur|json)$/</span>.<span class="title function_">test</span>(url.<span class="property">pathname</span>)) <span class="keyword">return</span> <span class="number">2592000000</span>; <span class="comment">// 30 dyas</span></span><br><span class="line">                </span><br><span class="line">                <span class="comment">// return ((url.host.endsWith(&#x27;blog.418121.xyz&#x27;)) &#123;&#x27;) &amp;&amp; /(\/|\.json)$/.test(url.pathname)) || /\.(js|css|woff2|woff|ttf|cur)$/.test(url.pathname)) ? 86400000 : false</span></span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="title function_">runOnNode</span>(<span class="params"><span class="attr">url</span>: URL</span>) &#123;</span><br><span class="line">                <span class="comment">// @ts-ignore</span></span><br><span class="line">                <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="title function_">runOnBrowser</span>(url)</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></pre></td></tr></table></figure></li><li>敲 <strong>hexo swpp</strong> , 使用Github Action 可以在压缩之前加上： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ...</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">缓存swpp</span></span><br><span class="line">      <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">        hexo swpp</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">        gulp</span></span><br><span class="line"><span class="string"></span><span class="comment"># ...</span></span><br></pre></td></tr></table></figure></li><li>配置 <strong>PWA</strong> ，修改主题文件 <strong>_config_solitude.yml</strong>（按自己的来）： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ...</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;#ff8080&quot;</span> <span class="comment"># Theme colort</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 class="comment"># ...</span></span><br></pre></td></tr></table></figure></li><li>新建 <strong>source&#x2F;manifest.json</strong> 文件（并准备好对应的图片）： <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;lang&quot;</span><span class="punctuation">:</span> <span class="string">&quot;zh&quot;</span><span class="punctuation">,</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;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;blog.418121.xyz&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;#ff8080&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;#ff8080&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;standalone&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;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_36.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;36x36&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><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_48.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;48x48&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><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_72.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;72x72&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><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_96.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;96x96&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><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_144.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;144x144&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><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_192.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;192x192&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><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_256.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;256x256&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><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_384.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;384x384&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><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_512.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;512x512&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><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li><li>网址右边出现安装应用，即成功。</li></ol></div><div class="tab-pane" id="swpp-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Hexo配置SWPP实现PWA</td><td><a href="https://blog.liushen.fun/posts/4355f2b3/">Liushen</a></td></tr><tr><td>Swpp Backends 官方文档</td><td><a href="https://kmar.top/posts/b70ec88f/">空梦</a></td></tr><tr><td>Github仓库</td><td><a href="https://github.com/EmptyDreams/hexo-swpp">EmptyDreams</a></td></tr></tbody></table></div></div></div><h3 id="22-赞赏侧边栏"><a href="#22-赞赏侧边栏" class="headerlink" title="22. 赞赏侧边栏"></a>22. 赞赏侧边栏</h3><div class="tabs" id="zscbl"><ul class="nav-tabs"><li class="tab active"><a class="#zscbl-1"><i class="fas fa-wand-magic-sparkles [/reward/]"></i>效果</a></li><li class="tab"><a class="#zscbl-2"><i class="fas fa-book-open"></i>教程</a></li><li class="tab"><a class="#zscbl-3"><i class="fas fa-link"></i>参考</a></li></ul><div class="tab-content"><div class="tab-pane active" id="zscbl-1"><p><img src="https://images.418121.xyz/file/lqlb/1763213717959.webp" alt="效果"></p></div><div class="tab-pane" id="zscbl-2"><ol><li>按照<a href="https://blog.liushen.fun/posts/deffcde0/">LiuShen的教程</a>顺序就好。</li><li>在 <strong>source&#x2F;custom&#x2F;css&#x2F;custom.css</strong> 最后添加（没有就新建）： <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 赞赏页面样式 */</span></span><br><span class="line"><span class="selector-pseudo">:root</span> &#123;</span><br><span class="line">  <span class="comment">/* ========== nav ========== */</span></span><br><span class="line">  <span class="attr">--liushen-nav-bg</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.8</span>);</span><br><span class="line">  <span class="attr">--liushen-nav-shadow</span>: <span class="built_in">rgba</span>(<span class="number">133</span>, <span class="number">133</span>, <span class="number">133</span>, <span class="number">0.6</span>) <span class="number">0px</span> <span class="number">5px</span> <span class="number">6px</span> -<span class="number">5px</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== ai_summary ========== */</span></span><br><span class="line">  <span class="attr">--liushen-title-font-color</span>: <span class="number">#0883b7</span>;</span><br><span class="line">  <span class="attr">--liushen-maskbg</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.85</span>);</span><br><span class="line">  <span class="attr">--liushen-ai-bg</span>: <span class="built_in">conic-gradient</span>(</span><br><span class="line">    from <span class="number">1.5708rad</span> at <span class="number">50%</span> <span class="number">50%</span>,</span><br><span class="line">    <span class="number">#d6b300</span> <span class="number">0%</span>,</span><br><span class="line">    <span class="number">#42a2ff</span> <span class="number">54%</span>,</span><br><span class="line">    <span class="number">#d6b300</span> <span class="number">100%</span></span><br><span class="line">  );</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== card ========== */</span></span><br><span class="line">  <span class="attr">--liushen-card-bg</span>: <span class="number">#fff</span>;</span><br><span class="line">  <span class="attr">--liushen-card-secondbg</span>: <span class="number">#f1f3f8</span>;</span><br><span class="line">  <span class="attr">--liushen-card-border</span>: <span class="number">1px</span> solid <span class="number">#e3e8f7</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== button ========== */</span></span><br><span class="line">  <span class="attr">--liushen-button-bg</span>: <span class="number">#f1f3f8</span>;</span><br><span class="line">  <span class="attr">--liushen-button-hover-bg</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== text ========== */</span></span><br><span class="line">  <span class="attr">--liushen-text</span>: <span class="number">#4c4948</span>;</span><br><span class="line">  <span class="attr">--liushen-secondtext</span>: <span class="number">#3c3c43cc</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-attr">[data-theme=<span class="string">&#x27;dark&#x27;</span>]</span> &#123;</span><br><span class="line">  <span class="comment">/* ========== nav ========== */</span></span><br><span class="line">  <span class="attr">--liushen-nav-bg</span>: <span class="built_in">rgba</span>(<span class="number">18</span>, <span class="number">18</span>, <span class="number">18</span>, <span class="number">0.8</span>);</span><br><span class="line">  <span class="attr">--liushen-nav-shadow</span>: <span class="built_in">rgba</span>(<span class="number">133</span>, <span class="number">133</span>, <span class="number">133</span>, <span class="number">0</span>) <span class="number">0px</span> <span class="number">5px</span> <span class="number">6px</span> -<span class="number">5px</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== ai_summary ========== */</span></span><br><span class="line">  <span class="attr">--liushen-maskbg</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.85</span>);</span><br><span class="line">  <span class="attr">--liushen-ai-bg</span>: <span class="built_in">conic-gradient</span>(</span><br><span class="line">    from <span class="number">1.5708rad</span> at <span class="number">50%</span> <span class="number">50%</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">214</span>, <span class="number">178</span>, <span class="number">0</span>, <span class="number">0.46</span>) <span class="number">0%</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">66</span>, <span class="number">161</span>, <span class="number">255</span>, <span class="number">0.53</span>) <span class="number">54%</span>,</span><br><span class="line">    <span class="built_in">rgba</span>(<span class="number">214</span>, <span class="number">178</span>, <span class="number">0</span>, <span class="number">0.49</span>) <span class="number">100%</span></span><br><span class="line">  );</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== card ========== */</span></span><br><span class="line">  <span class="attr">--liushen-card-bg</span>: <span class="number">#2d2d2d</span>;</span><br><span class="line">  <span class="attr">--liushen-card-secondbg</span>: <span class="number">#3e3f41</span>;</span><br><span class="line">  <span class="attr">--liushen-card-border</span>: <span class="number">1px</span> solid <span class="number">#42444a</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== button ========== */</span></span><br><span class="line">  <span class="attr">--liushen-button-bg</span>: <span class="number">#30343f</span>;</span><br><span class="line">  <span class="attr">--liushen-button-hover-bg</span>: <span class="built_in">var</span>(--theme-color);</span><br><span class="line"></span><br><span class="line">  <span class="comment">/* ========== text ========== */</span></span><br><span class="line">  <span class="attr">--liushen-text</span>: <span class="number">#ffffffb3</span>;</span><br><span class="line">  <span class="attr">--liushen-secondtext</span>: <span class="number">#a1a2b8</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> &#123;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">8px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-headline</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">4px</span> <span class="number">4px</span> <span class="number">4px</span> <span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">justify-content</span>: space-between;</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-headline</span> <span class="selector-class">.headline-content</span> <span class="selector-tag">i</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">1.1em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-headline</span> <span class="selector-class">.headline-content</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">1em</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-text);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-headline</span> <span class="selector-class">.show-more-inline</span> <span class="selector-class">.btn-show-more-inline</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: inline-flex;</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">4px</span> <span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="built_in">var</span>(--liushen-card-bg);</span><br><span class="line">    <span class="attribute">border</span>: <span class="built_in">var</span>(--liushen-card-border);</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-text);</span><br><span class="line">    <span class="attribute">text-decoration</span>: none;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">15px</span>;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">500</span>;</span><br><span class="line">    <span class="attribute">transition</span>: all <span class="number">0.3s</span> ease;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-headline</span> <span class="selector-class">.show-more-inline</span> <span class="selector-class">.btn-show-more-inline</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line">    <span class="attribute">margin-left</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-headline</span> <span class="selector-class">.show-more-inline</span> <span class="selector-class">.btn-show-more-inline</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="built_in">var</span>(--default-bg-color);</span><br><span class="line">    <span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">1px</span>);</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">8px</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><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">4px</span> <span class="number">4px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> &#123;</span><br><span class="line">    <span class="attribute">margin-bottom</span>: <span class="number">15px</span>; <span class="comment">/* Uncomment if rotating the carousel */</span></span><br><span class="line">    <span class="comment">/* position: relative; */</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">display</span>: flex <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">8px</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="built_in">var</span>(--liushen-card-bg);</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">border</span>: <span class="built_in">var</span>(--liushen-card-border);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span><span class="selector-class">.carousel-item-new</span> &#123;</span><br><span class="line">    <span class="attribute">animation</span>: slideIn <span class="number">0.5s</span> ease-out;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> <span class="selector-tag">a</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">    <span class="attribute">text-decoration</span>: none;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-text);</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> <span class="selector-class">.sponsor-avatar</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">60px</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">60px</span>;</span><br><span class="line">    <span class="attribute">margin-right</span>: <span class="number">10px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> <span class="selector-class">.sponsor-avatar</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">    <span class="attribute">object-fit</span>: cover;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">4px</span> solid <span class="built_in">var</span>(--liushen-card-secondbg);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> <span class="selector-class">.sponsor-info</span> &#123;</span><br><span class="line">    <span class="attribute">min-width</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> <span class="selector-class">.sponsor-info</span> <span class="selector-class">.sponsor-name</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">18px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">600</span>;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">margin-bottom</span>: <span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-text);</span><br><span class="line">    <span class="attribute">overflow</span>: hidden;</span><br><span class="line">    <span class="attribute">text-overflow</span>: ellipsis;</span><br><span class="line">    <span class="attribute">white-space</span>: nowrap;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.top-sponsor-carousel</span> <span class="selector-class">.carousel-container</span> <span class="selector-class">.carousel-item</span> <span class="selector-class">.sponsor-info</span> <span class="selector-class">.sponsor-desc</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-secondtext);</span><br><span class="line">    <span class="attribute">overflow</span>: hidden;</span><br><span class="line">    <span class="attribute">text-overflow</span>: ellipsis;</span><br><span class="line">    <span class="attribute">white-space</span>: nowrap;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.sponsors-list</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">flex-wrap</span>: wrap;</span><br><span class="line">    <span class="attribute">gap</span>: <span class="number">10px</span>;</span><br><span class="line">    <span class="attribute">margin-bottom</span>: <span class="number">12px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.sponsors-list</span> <span class="selector-class">.sponsor-item</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">align-items</span>: center;</span><br><span class="line">    <span class="attribute">line-height</span>: <span class="number">1.2</span>;</span><br><span class="line">    <span class="attribute">text-decoration</span>: underline;</span><br><span class="line">    <span class="attribute">text-underline-offset</span>: <span class="number">4px</span>;</span><br><span class="line">    <span class="attribute">text-decoration-color</span>: <span class="built_in">var</span>(--liushen-text);</span><br><span class="line">    <span class="attribute">text-decoration-style</span>: dashed;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-text);</span><br><span class="line">    <span class="attribute">transition</span>: all <span class="number">0.2s</span> ease;</span><br><span class="line">    <span class="attribute">white-space</span>: nowrap;</span><br><span class="line">    <span class="attribute">border</span>: <span class="number">1px</span> solid transparent;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.sponsors-list</span> <span class="selector-class">.sponsor-item</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--default-bg-color);</span><br><span class="line">    <span class="attribute">text-decoration-color</span>: <span class="built_in">var</span>(--default-bg-color);</span><br><span class="line">    <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">2px</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.sponsors-list</span> <span class="selector-class">.sponsor-item</span> <span class="selector-class">.sponsor-small-name</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line">    <span class="attribute">font-weight</span>: <span class="number">500</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.sponsors-note</span> &#123;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">12px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-secondtext);</span><br><span class="line">    <span class="attribute">opacity</span>: <span class="number">0.8</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.sponsors-note</span> <span class="selector-tag">p</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.no-sponsors</span> &#123;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">color</span>: <span class="built_in">var</span>(--liushen-secondtext);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.card-widget</span><span class="selector-class">.card-reward</span> <span class="selector-class">.item-content</span> <span class="selector-class">.no-sponsors</span> <span class="selector-tag">p</span> &#123;</span><br><span class="line">    <span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> slideIn &#123;</span><br><span class="line">    <span class="selector-tag">from</span> &#123;</span><br><span class="line">        <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">20px</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="selector-tag">to</span> &#123;</span><br><span class="line">        <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">        <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>修改 <strong>_config.solitude.yml</strong> 文件： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/custom/css/custom.css&quot;&gt;</span></span><br></pre></td></tr></table></figure></li><li>修改 <strong>source&#x2F;_data&#x2F;about.yml</strong> 文件赞赏位置添加： <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">award:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">description:</span> <span class="string">感谢那些欣赏和支持我的人。因为你，我觉得写博客可以为你创造价值。这将使我在这条道路上走得更远。</span></span><br><span class="line">  <span class="attr">tips:</span> <span class="string">总金额：</span> <span class="string">¥</span> &#123;<span class="string">sum</span>&#125; <span class="string">,</span> <span class="string">将用于博客的维护和更新。</span> <span class="comment"># Must include &#123;sum&#125;, otherwise the total amount will not be displayed</span></span><br><span class="line"><span class="attr">rewardList:</span> <span class="comment"># Bottom donations</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">money:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">time:</span> <span class="number">2024-05-24</span></span><br><span class="line">    <span class="attr">icon:</span> <span class="string">fab</span> <span class="string">fa-weixin</span></span><br><span class="line">    <span class="comment"># icon: fab fa-alipay</span></span><br><span class="line">    <span class="comment"># icon: fab fa-gratipay</span></span><br><span class="line">    <span class="attr">color:</span> <span class="string">green</span></span><br><span class="line">    <span class="comment">#以下是新添加</span></span><br><span class="line">    <span class="attr">avatar:</span> <span class="string">https://images.418121.xyz/file/blog/page/qt.webp</span></span><br><span class="line">    <span class="attr">website:</span> <span class="string">/</span></span><br><span class="line">    <span class="attr">description:</span> <span class="string">执子之手</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">test</span></span><br><span class="line">    <span class="attr">money:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">time:</span> <span class="number">2024-05-24</span></span><br><span class="line">    <span class="attr">icon:</span> <span class="string">fab</span> <span class="string">fa-weixin</span></span><br><span class="line">    <span class="comment"># icon: fab fa-alipay</span></span><br><span class="line">    <span class="comment"># icon: fab fa-gratipay</span></span><br><span class="line">    <span class="attr">color:</span> <span class="string">green</span></span><br><span class="line">    <span class="attr">avatar:</span> <span class="string">https://images.418121.xyz/file/blog/page/qtn.webp</span></span><br><span class="line">    <span class="attr">website:</span> <span class="string">/</span></span><br><span class="line">    <span class="attr">description:</span> <span class="string">test</span></span><br></pre></td></tr></table></figure></li><li>添加 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;aside&#x2F;asideRewards.pug</strong> 文件： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br></pre></td><td class="code"><pre><span class="line">.card-widget.card-reward</span><br><span class="line">  .item-headline</span><br><span class="line">    .headline-content</span><br><span class="line">      i.fa-solid.fa-person-praying</span><br><span class="line">      span 能量榜</span><br><span class="line">    .show-more-inline</span><br><span class="line">      - var pageUrl = &#x27;/reward/&#x27;</span><br><span class="line">      a(href=url_for(pageUrl) class=&quot;btn-show-more-inline&quot;)</span><br><span class="line">        span 前往赞赏</span><br><span class="line">  .item-content</span><br><span class="line">    if site.data.about &amp;&amp; site.data.about.rewardList &amp;&amp; site.data.about.award.enable</span><br><span class="line">      - var allSponsors = site.data.about.rewardList.slice()</span><br><span class="line">      - allSponsors.sort(function() &#123; return Math.random() - 0.5 &#125;)</span><br><span class="line">      - var carouselSponsors = allSponsors.slice(0, 40)</span><br><span class="line">      - var listSponsors = allSponsors.slice(0, 20)</span><br><span class="line">      </span><br><span class="line">      if carouselSponsors.length &gt; 0</span><br><span class="line">        .top-sponsor-carousel</span><br><span class="line">          .carousel-container</span><br><span class="line">            .carousel-item</span><br><span class="line">              a.sponsor-link-card(target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;)</span><br><span class="line">                .sponsor-avatar</span><br><span class="line">                  img.sponsor-avatar-img(src=url_for(carouselSponsors[0].avatar) alt=carouselSponsors[0].name onerror=`this.onerror=null;this.src=&#x27;$&#123;url_for(&#x27;/img/default_avatar.webp&#x27;)&#125;&#x27;;`)</span><br><span class="line">                .sponsor-info</span><br><span class="line">                  .sponsor-name= carouselSponsors[0].name</span><br><span class="line">                  .sponsor-desc= carouselSponsors[0].description</span><br><span class="line">        </span><br><span class="line">        if listSponsors.length &gt; 1</span><br><span class="line">          .sponsors-list</span><br><span class="line">            each sponsor in listSponsors</span><br><span class="line">              if sponsor.website</span><br><span class="line">                a.sponsor-item(href=sponsor.website target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;)</span><br><span class="line">                  .sponsor-small-name= sponsor.name</span><br><span class="line">              else</span><br><span class="line">                .sponsor-item</span><br><span class="line">                  .sponsor-small-name= sponsor.name</span><br><span class="line"></span><br><span class="line">            if allSponsors.length &gt; 20</span><br><span class="line">              - var pageUrl = &#x27;/reward/&#x27;</span><br><span class="line">              a.sponsor-item.more-sponsor(href=url_for(pageUrl) target=&quot;_blank&quot; rel=&quot;nofollow noopener&quot;)</span><br><span class="line">                .sponsor-small-name</span><br><span class="line">                  |  查看更多</span><br><span class="line">                  i.fa-solid.fa-angles-right</span><br><span class="line">          </span><br><span class="line">          .sponsors-note</span><br><span class="line">            p 你们的赞赏是我最大的动力</span><br><span class="line">            p ※ 此处数据随机显示</span><br><span class="line">        </span><br><span class="line">        script.</span><br><span class="line">          if (!window.sponsorsData) &#123;</span><br><span class="line">            window.sponsorsData = !&#123;JSON.stringify(carouselSponsors)&#125;;</span><br><span class="line">          &#125;</span><br><span class="line">          </span><br><span class="line">          function initRewardCarousel() &#123;</span><br><span class="line">            const container = document.querySelector(&#x27;.carousel-container&#x27;);</span><br><span class="line">            const link = container.querySelector(&#x27;.sponsor-link-card&#x27;);</span><br><span class="line">            const avatar = container.querySelector(&#x27;.sponsor-avatar-img&#x27;);</span><br><span class="line">            const name = container.querySelector(&#x27;.sponsor-name&#x27;);</span><br><span class="line">            const desc = container.querySelector(&#x27;.sponsor-desc&#x27;);</span><br><span class="line">            </span><br><span class="line">            if (!container || sponsorsData.length === 0) return;</span><br><span class="line">            </span><br><span class="line">            let currentIndex = 0;</span><br><span class="line">            let intervalId = null;</span><br><span class="line">            let isTransitioning = false;</span><br><span class="line">            </span><br><span class="line">            function updateSponsorInfo(sponsor) &#123;</span><br><span class="line">              if (sponsor.website) &#123;</span><br><span class="line">                link.href = sponsor.website;</span><br><span class="line">                // 确保有链接时移除 pointer-events 样式</span><br><span class="line">                link.style.pointerEvents = &#x27;&#x27;;</span><br><span class="line">                link.style.cursor = &#x27;pointer&#x27;;</span><br><span class="line">              &#125; else &#123;</span><br><span class="line">                link.removeAttribute(&#x27;href&#x27;);</span><br><span class="line">                // 只有在没有链接时才添加 pointer-events: none</span><br><span class="line">                link.style.pointerEvents = &#x27;none&#x27;;</span><br><span class="line">                link.style.cursor = &#x27;default&#x27;;</span><br><span class="line">              &#125;</span><br><span class="line">              </span><br><span class="line">              avatar.src = sponsor.avatar;</span><br><span class="line">              avatar.alt = sponsor.name;</span><br><span class="line">              </span><br><span class="line">              name.textContent = sponsor.name;</span><br><span class="line">              desc.textContent = sponsor.description;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function showSponsor(index) &#123;</span><br><span class="line">              if (index &lt; 0 || index &gt;= sponsorsData.length || isTransitioning) return;</span><br><span class="line">              </span><br><span class="line">              isTransitioning = true;</span><br><span class="line">              const sponsor = sponsorsData[index];</span><br><span class="line">              </span><br><span class="line">              container.style.opacity = &#x27;0&#x27;;</span><br><span class="line">              </span><br><span class="line">              setTimeout(() =&gt; &#123;</span><br><span class="line">                updateSponsorInfo(sponsor);</span><br><span class="line">                container.style.opacity = &#x27;1&#x27;;</span><br><span class="line">                currentIndex = index;</span><br><span class="line">                </span><br><span class="line">                setTimeout(() =&gt; &#123;</span><br><span class="line">                  isTransitioning = false;</span><br><span class="line">                &#125;, 300);</span><br><span class="line">              &#125;, 300);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function nextSponsor() &#123;</span><br><span class="line">              const nextIndex = (currentIndex + 1) % sponsorsData.length;</span><br><span class="line">              showSponsor(nextIndex);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function startAutoPlay() &#123;</span><br><span class="line">              if (intervalId) clearInterval(intervalId);</span><br><span class="line">              intervalId = setInterval(nextSponsor, 3000);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            function stopAutoPlay() &#123;</span><br><span class="line">              if (intervalId) &#123;</span><br><span class="line">                clearInterval(intervalId);</span><br><span class="line">                intervalId = null;</span><br><span class="line">              &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            const carousel = document.querySelector(&#x27;.top-sponsor-carousel&#x27;);</span><br><span class="line">            if (carousel) &#123;</span><br><span class="line">              carousel.addEventListener(&#x27;mouseenter&#x27;, stopAutoPlay);</span><br><span class="line">              carousel.addEventListener(&#x27;mouseleave&#x27;, startAutoPlay);</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            container.style.transition = &#x27;opacity 0.3s ease-in-out&#x27;;</span><br><span class="line">            </span><br><span class="line">            // 初始化第一个赞助者信息</span><br><span class="line">            updateSponsorInfo(sponsorsData[0]);</span><br><span class="line">            </span><br><span class="line">            startAutoPlay();</span><br><span class="line">            </span><br><span class="line">            return &#123;</span><br><span class="line">              showSponsor,</span><br><span class="line">              nextSponsor,</span><br><span class="line">              startAutoPlay,</span><br><span class="line">              stopAutoPlay</span><br><span class="line">            &#125;;</span><br><span class="line">          &#125;</span><br><span class="line">          initRewardCarousel();</span><br><span class="line">          //- document.addEventListener(&quot;pjax:complete&quot;, function() &#123;</span><br><span class="line">          //-   initRewardCarousel();</span><br><span class="line">          //- &#125;);</span><br><span class="line">      else</span><br><span class="line">        .no-sponsors</span><br><span class="line">          p 暂无赞助者，成为第一个支持本站的朋友吧！</span><br><span class="line">    else</span><br><span class="line">      .no-sponsors</span><br><span class="line">        p 暂无赞助者数据</span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;widgets&#x2F;aside&#x2F;asideSwitch.pug</strong> 文件： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">//- ===========================================</span><br><span class="line">//- 侧边栏组件切换器</span><br><span class="line">//- ===========================================</span><br><span class="line"></span><br><span class="line">include ../../mixins/common.pug</span><br><span class="line"></span><br><span class="line">//- 主切换逻辑</span><br><span class="line">case item</span><br><span class="line">  when &#x27;about&#x27;</span><br><span class="line">    include ./asideInfoCard.pug</span><br><span class="line">  when &#x27;flip&#x27;</span><br><span class="line">    include ./asideFlipCard.pug</span><br><span class="line">  when &#x27;newestPost&#x27;</span><br><span class="line">    include ./asideNewestPost.pug</span><br><span class="line">  when &#x27;allInfo&#x27;</span><br><span class="line">    include ./asideAllInfo.pug</span><br><span class="line">  when &#x27;ads&#x27;</span><br><span class="line">    include ./asideAdsense.pug</span><br><span class="line">  when &#x27;newest_comment&#x27;</span><br><span class="line">    include ./asideNewstComments.pug</span><br><span class="line">    //- 添加这两行==============================</span><br><span class="line">  when &#x27;rewards&#x27;</span><br><span class="line">    include ./asideRewards.pug</span><br><span class="line">    //- 结束====================================</span><br><span class="line">  default</span><br><span class="line">    //- 处理自定义组件</span><br><span class="line">    - const custom = site.data &amp;&amp; site.data.aside &amp;&amp; site.data.aside.find((i) =&gt; i.name === item)</span><br><span class="line">    +conditionalWrapper(custom)</span><br><span class="line">      include ./asideCustom.pug</span><br></pre></td></tr></table></figure></li><li>添加 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;includes&#x2F;page&#x2F;reward.pug</strong> 文件： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">if page.banner</span><br><span class="line">    include ../widgets/page/banner</span><br><span class="line">if site.data.about</span><br><span class="line">    #about-page</span><br><span class="line">        - award = site.data.about.award</span><br><span class="line"></span><br><span class="line">        - var sum = 0</span><br><span class="line">        if site.data.about.rewardList &amp;&amp; site.data.about.award.enable</span><br><span class="line">            .author-content</span><br><span class="line">                .author-content-item.single.reward</span><br><span class="line">                    .author-content-item-tips= _p(&#x27;award.thanks&#x27;)</span><br><span class="line">                    span.author-content-item-title= _p(&#x27;award.title&#x27;)</span><br><span class="line">                    .author-content-item-description</span><br><span class="line">                        != award.description</span><br><span class="line">                    .reward-list-all</span><br><span class="line">                        each reward in site.data.about.rewardList.sort((a, b) =&gt; b.time - a.time) || []</span><br><span class="line">                            - sum += reward.money</span><br><span class="line">                            .reward-list-item</span><br><span class="line">                                .reward-list-item-name= reward.name</span><br><span class="line">                                .reward-list-bottom-group</span><br><span class="line">                                    .reward-list-item-money(style=&quot;background-color:&quot; + reward.color)</span><br><span class="line">                                        if reward.icon</span><br><span class="line">                                            i.solitude(class=reward.icon)</span><br><span class="line">                                        | ¥ #&#123;reward.money&#125;</span><br><span class="line">                                    time.datetime.reward-list-item-time(datetime=moment(reward.time).format())</span><br><span class="line">                        if theme.post.award.enable</span><br><span class="line">                            .post-reward</span><br><span class="line">                                .post-reward(onclick=&quot;AddRewardMask()&quot;)</span><br><span class="line">                                .reward-button(title=_p(&#x27;award.tipping&#x27;))</span><br><span class="line">                                    i.solitude.fas.fa-heart</span><br><span class="line">                                    = _p(&#x27;award.tipping&#x27;)</span><br><span class="line">                                .reward-main</span><br><span class="line">                                    ul.reward-all</span><br><span class="line">                                        span.reward-title= theme.post.award.title</span><br><span class="line">                                        ul.reward-group</span><br><span class="line">                                            - var rewards = theme.post.award.list</span><br><span class="line">                                            each reward in rewards</span><br><span class="line">                                                li.reward-item</span><br><span class="line">                                                    a(href=url_for(reward.url))</span><br><span class="line">                                                        img.post-qr-code-img(alt=reward.name, src=reward.qcode, style=&quot;border-color:&quot; + reward.color)</span><br><span class="line">                                                    .post-qr-code-desc= reward.name</span><br><span class="line">                    .reward-list-tips</span><br><span class="line">                        p= award.tips.replace(&#x27;&#123;sum&#125;&#x27;, sum.toFixed(2))</span><br></pre></td></tr></table></figure></li><li>修改 <strong>themes&#x2F;solitude&#x2F;layout&#x2F;page.pug</strong> 文件（about下方）添加： <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">default</span><br><span class="line">  case page.type</span><br><span class="line">    when &#x27;categories&#x27;</span><br><span class="line">      include includes/page/categories</span><br><span class="line">    when &#x27;tags&#x27;</span><br><span class="line">      include includes/page/tags</span><br><span class="line">    when &#x27;links&#x27;</span><br><span class="line">      include includes/page/links</span><br><span class="line">    when &#x27;about&#x27;</span><br><span class="line">      include includes/page/about</span><br><span class="line">      //- 这里添加=========================</span><br><span class="line">    when &#x27;reward&#x27;</span><br><span class="line">      include includes/page/reward</span><br><span class="line">      //- 结束=============================</span><br><span class="line">    when &#x27;brevity&#x27;</span><br><span class="line">      include includes/page/brevity</span><br><span class="line">    when &#x27;kit&#x27;</span><br><span class="line">      include includes/page/kit</span><br><span class="line">    when &#x27;music&#x27;</span><br><span class="line">      include includes/page/music</span><br><span class="line">    default</span><br><span class="line">      include includes/page/default</span><br></pre></td></tr></table></figure></li><li>创建 <strong>source&#x2F;reward&#x2F;index.md</strong> 文件： <figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 致谢赞赏</span><br><span class="line">date: 2025-11-15 16:17:49</span><br><span class="line">type: reward</span><br><span class="line">data: about</span><br><span class="line">aside: false</span><br><span class="line">banner: true</span><br><span class="line">desc: 感谢每一份慷慨的赞赏</span><br><span class="line"><span class="section">leftend: 感谢赞赏，请在评论区留下您的备注，谢谢！</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br></pre></td></tr></table></figure></li><li>修改 <strong>_config.solitude.yml</strong> 文件：</li></ol><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ...</span></span><br><span class="line"><span class="comment"># Aside</span></span><br><span class="line"><span class="comment"># 侧边栏</span></span><br><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="comment"># Values: about (info card), newestPost (latest article), allInfo (website information), flip (official account QR code), newest_comment (latest comment)</span></span><br><span class="line">  <span class="comment"># 值: about(信息卡), newestPost(最新文章), allInfo(网站信息), flip(官方账号二维码), newest_comment(最新评论)，rewards(赞赏)</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Sticky: Fixed position / noSticky: Not fixed position</span></span><br><span class="line">  <span class="comment"># Sticky: 固定位置 / noSticky: 不固定位置</span></span><br><span class="line">  <span class="attr">home:</span> <span class="comment"># on the homepage</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,rewards&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;love,likeme,allInfo&quot;</span></span><br><span class="line">  <span class="attr">post:</span> <span class="comment"># on the article page</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;rewards,flip,newestPost,likeme&quot;</span></span><br><span class="line">  <span class="attr">page:</span> <span class="comment"># on the page</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;rewards,flip,likeme&quot;</span></span><br><span class="line">  <span class="comment"># 菜单栏位置(0: 左 1: 右)</span></span><br><span class="line">  <span class="attr">position:</span> <span class="number">0</span> <span class="comment"># Sidebar positioning(0: left 1: right)</span></span><br><span class="line"><span class="comment"># ...</span></span><br><span class="line">  <span class="comment"># Reward</span></span><br><span class="line">  <span class="comment"># 打赏</span></span><br><span class="line">  <span class="attr">award:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">appreciators:</span> <span class="string">/reward/</span> <span class="comment"># Reward page</span></span><br><span class="line">    <span class="comment"># Reward Title</span></span><br><span class="line">    <span class="comment"># 打赏标题</span></span><br><span class="line">    <span class="attr">title:</span> <span class="string">感谢您的赞赏</span> <span class="comment"># Thanks for your appreciation. / 感谢您的赞赏</span></span><br><span class="line">    <span class="attr">desc:</span> <span class="string">由于您的支持，我才能够实现写作的价值。</span> <span class="comment"># Because of your support, I realize the value of writing articles. / 由于您的支持，我才能够实现写作的价值。</span></span><br><span class="line">    <span class="comment"># Reward list</span></span><br><span class="line">    <span class="comment"># 打赏列表</span></span><br><span class="line">    <span class="attr">list:</span></span><br><span class="line">      <span class="comment"># - name: Github Sponsor</span></span><br><span class="line">      <span class="comment">#   qcode: https://s3.qjqq.cn/47/661ba900c4bc1.webp!color</span></span><br><span class="line">      <span class="comment">#   url: https://github.com/sponsors/everfu</span></span><br><span class="line">      <span class="comment">#   color: var(--efu-black)</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">qcode:</span> <span class="string">/images/wxm.webp</span></span><br><span class="line">        <span class="attr">url:</span> <span class="string">/images/wxm_l.webp</span></span><br><span class="line">        <span class="attr">color:</span> <span class="string">var(--efu-green)</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">qcode:</span> <span class="string">/images/zfbm.webp</span></span><br><span class="line">        <span class="attr">url:</span> <span class="string">/images/zfbm_l.webp</span></span><br><span class="line">        <span class="attr">color:</span> <span class="string">var(--efu-blue)</span></span><br></pre></td></tr></table></figure><ol start="9"><li>完成，再次感谢<a href="https://blog.liushen.fun/posts/deffcde0/">LiuShen</a>的大力支持！</li></ol></div><div class="tab-pane" id="zscbl-3"><table><thead><tr><th>原帖</th><th>作者</th></tr></thead><tbody><tr><td>Butterfly主题实现赞赏页面及侧边卡片</td><td><a href="https://blog.liushen.fun/posts/deffcde0/">LiuShen</a></td></tr></tbody></table></div></div></div>     </div></div>    </div><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，全篇结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">“添加赞赏卡片侧边栏，Hexo主题魔改，Solitude主题魔改。2025-11-15 版本更新适配，solitude版本 v3.0.21。”</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="博客折腾" scheme="https://one.blog.418121.xyz/tags/%E5%8D%9A%E5%AE%A2%E6%8A%98%E8%85%BE/"/>
    
    <category term="Solitude" scheme="https://one.blog.418121.xyz/tags/Solitude/"/>
    
  </entry>
  
  <entry>
    <title>自定义表盘导航软件——对小米手环9的折腾</title>
    <link href="https://one.blog.418121.xyz/posts/eb4d7b70.html"/>
    <id>https://one.blog.418121.xyz/posts/eb4d7b70.html</id>
    <published>2025-03-03T22:05:00.000Z</published>
    <updated>2025-03-03T22:05:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><div class="alert alert-warning">  <div class="icon"><i class="fa fa-warning"></i></div>  <div class="text">  <p>按需求选择教程步骤，任何操作都有<strong>变砖</strong>的可能，谨慎操作！！！</p>  </div>  </div><p>过新历年的时候，她给我们买了个礼物🎁<a href="https://www.mi.com/prod/xiaomi-shouhuan-9">小米手环9</a>，我的是黑色她的是银色，不过就简单的换了个软件自带免费的表盘，后面回到家后我在B站学习了一番，她看了效果她也想弄，我说我有空弄个教程给她。<br><img src="https://images.418121.xyz/file/blog/play/03/01.webp" alt="一起换的表盘"></p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>小米健康运动APP</li><li>需要一个米坛社区的账号</li><li>自定义表盘工具APP</li><li>小米健康研究</li></ul><h2 id="操作环境"><a href="#操作环境" class="headerlink" title="操作环境"></a>操作环境</h2><ul><li>vivo x50pro+ 版本：安卓13</li><li>自定义表盘工具 版本：6.1.5</li><li>小米健康运动 版本：3.37.3</li><li>小米健康研究 版本：1.3</li></ul><div class="alert alert-info">  <div class="icon"><i class="fa fa-info"></i></div>  <div class="text">  <p>自行在各大应用商店搜索下载</p>  </div>  </div><h2 id="第一步-注册米坛社区账号-并-安装自定义表盘工具"><a href="#第一步-注册米坛社区账号-并-安装自定义表盘工具" class="headerlink" title="第一步 注册米坛社区账号 并 安装自定义表盘工具"></a>第一步 注册<strong>米坛社区账号</strong> 并 安装<strong>自定义表盘工具</strong></h2><ol><li>米坛社区账户注册 <a href="%E7%B1%B3%E5%9D%9B%E7%A4%BE%E5%8C%BA,%E6%B3%A8%E5%86%8C%E9%93%BE%E6%8E%A5,https://www.bandbbs.cn/login/register" title="" target=""></a></li><li>自定义表盘工具下载并安装 <a href="%E8%93%9D%E5%A5%8F%E4%BA%91,%E5%AF%86%E7%A0%81%EF%BC%9Abi1w,https://wanhan.lanzouu.com/iVDoj2pgo3kb" title="" target=""></a></li><li>下载完成后，打开<strong>表盘自定义工具</strong></li><li>点击右上角切换到<strong>小米手环9</strong></li><li>点击右下角<strong>我的</strong>登录你的米坛社区账号</li><li>因为只是用来安装表盘所以我们选择<strong>我的</strong>-<strong>试用捐赠者功能</strong>试用时间是<strong>72小时</strong>。当然你也可以<strong>捐赠十块钱获取</strong>长期使用权**，毕竟官方表盘一个就要六块钱。开发者制作不易，不想花这十块钱，可以用别的软件。不要在本站辱骂开发者，会删评论。<br><img src="https://images.418121.xyz/file/blog/play/03/02.webp" alt="第一步"></li></ol><h2 id="第二步-获取AuthKey"><a href="#第二步-获取AuthKey" class="headerlink" title="第二步 获取AuthKey"></a>第二步 获取AuthKey</h2><ol><li>点击<strong>工具</strong>板块，点击<strong>AuthKey 读取工具（新）</strong></li><li>打开<strong>小米健康研究</strong>，点击<strong>我的</strong>，点击<strong>关于</strong></li><li>快速点击<strong>小米运动研究</strong>的Logo，在弹出的窗口中点击<strong>确定</strong></li><li>回到<strong>表盘自定义工具</strong>，点击<strong>开始读取</strong>，复制下方的<strong>AuthKey</strong><br><img src="https://images.418121.xyz/file/blog/play/03/03.webp" alt="第二步"></li></ol><div class="alert alert-info">  <div class="icon"><i class="fa fa-info"></i></div>  <div class="text">  <p>小米健康运动版本高于3.35.3以下请用旧版教程，推荐使用最新教程。</p>  </div>  </div><h2 id="第三步-蓝牙一键安装自定义表盘"><a href="#第三步-蓝牙一键安装自定义表盘" class="headerlink" title="第三步 蓝牙一键安装自定义表盘"></a>第三步 蓝牙一键安装自定义表盘</h2><ol><li>点击<strong>探索</strong>板块，寻找想要下载的表盘，这里以<strong>五子棋</strong>为例</li><li>点击<strong>下载</strong>图标，在弹出的界面中点击<strong>蓝牙一键安装</strong></li><li>打开手环，<strong>允许</strong>绑定请求，若绑定失败，请强制停止<strong>小米健康运动</strong></li><li>点击<strong>开始搜索</strong>，找到并点击自己的手环。</li><li>输入刚才复制的AuthKey，点击<strong>确定</strong></li><li>点击<strong>开始安装</strong>。<br><img src="https://images.418121.xyz/file/blog/play/03/04.webp" alt="第三步"><br><img src="https://images.418121.xyz/file/blog/play/03/05.gif" alt="安装后效果"></li></ol><h2 id="第四步-安装百度地图及其补丁"><a href="#第四步-安装百度地图及其补丁" class="headerlink" title="第四步 安装百度地图及其补丁"></a>第四步 安装百度地图及其补丁</h2><ol><li>由于作者限制请自行前往下载所需的两个文件，先回复一下帖子就可以下载了。 <a href="%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE&%E8%A1%A5%E4%B8%81,https://www.bandbbs.cn/threads/12359/" title="" target="">米坛社区,小米手环9 快应用</a></li><li>点击<strong>工具</strong>板块，点击<strong>蓝牙一键安装</strong>，使用上一步骤方法连接手环</li><li>连接成功后，点击<strong>选择文件</strong>，将刚刚下载的两个文件按顺序安装 .rpk .bin 点击<strong>开始安装</strong></li><li>安装完后，手环点击<strong>允许</strong>，等待手环重启后，长按删除表盘。</li><li>手机上下载安装<strong>百度地图</strong>，要开启百度地图的通知权限。启用导航之后，手环上的百度地图快应用会自动启动，并显示导航信息。 <a href="%E5%B0%8F%E7%B1%B3%E5%BA%94%E7%94%A8%E5%95%86%E5%9F%8E,%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE,https://m.app.mi.com/details?id=com.baidu.BaiduMap" title="" target=""></a><img src="https://images.418121.xyz/file/blog/play/03/06.webp" alt="第四步"></li><li>更多内容请探索APP及米坛社区先<a href="https://www.bilibili.com/video/BV1TM9LYwER4/?share_source=copy_web&vd_source=ef955460600120088a31fc38d20c0c97">看看效果</a>吧。 <iframe src='//player.bilibili.com/player.html?bvid=BV1TM9LYwER4&cid=25764109927&p=1&share_source=copy_web' scrolling='no' border='0' frameborder='no' framespacing='0' allowfullscreen='true'></iframe></li></ol><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%E9%99%88%E5%B0%91%E9%91%AB%E5%90%8C%E5%AD%A6,%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF9%E4%B8%8B%E8%BD%BD%E5%BA%94%E7%94%A8%E5%92%8C%E6%B8%B8%E6%88%8F%EF%BC%8C%E4%BB%A5%E5%8F%8A%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE%E5%AF%BC%E8%88%AA%EF%BC%81%E4%BF%9D%E5%A7%86%E7%BA%A7%E6%95%99%E7%A8%8B%EF%BC%81,https://www.bilibili.com/video/BV1BTHverEBG/?share_source=copy_web&vd_source=ef955460600120088a31fc38d20c0c97" title="" target=""></a><a href="%E6%8B%BE%E5%85%89%E3%81%AE%E6%98%9F%E7%81%AB,%E3%80%8E%E6%8B%BE%E5%85%89%E3%80%8F%E6%A6%A8%E5%B9%B2%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF9%EF%BC%81%E5%B0%8F%E7%A8%8B%E5%BA%8F&%E8%A1%A8%E7%9B%98%E5%A6%82%E7%BA%A6%E8%80%8C%E8%87%B3%EF%BC%81%E5%85%BC%E5%85%B7%E7%AE%80%E5%8D%95%E8%80%8C%E5%BF%AB%E6%8D%B7%E7%9A%84%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B%EF%BC%8C%E5%BF%AB%E6%9D%A5%E5%80%92%E8%85%BE%E4%BD%A0%E7%9A%84%E6%89%8B%E7%8E%AF%E5%90%A7~,https://www.bilibili.com/video/BV1mivveZEHb/?share_source=copy_web&vd_source=ef955460600120088a31fc38d20c0c97" title="" target=""></a>]]></content>
    
    
    <summary type="html">小米手环9的第三方表盘及功能安装详细教程</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="小米手环9" scheme="https://one.blog.418121.xyz/tags/%E5%B0%8F%E7%B1%B3%E6%89%8B%E7%8E%AF9/"/>
    
    <category term="百度地图" scheme="https://one.blog.418121.xyz/tags/%E7%99%BE%E5%BA%A6%E5%9C%B0%E5%9B%BE/"/>
    
    <category term="自定义表盘" scheme="https://one.blog.418121.xyz/tags/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%A1%A8%E7%9B%98/"/>
    
    <category term="安装" scheme="https://one.blog.418121.xyz/tags/%E5%AE%89%E8%A3%85/"/>
    
  </entry>
  
  <entry>
    <title>武汉之旅</title>
    <link href="https://one.blog.418121.xyz/posts/72442aca.html"/>
    <id>https://one.blog.418121.xyz/posts/72442aca.html</id>
    <published>2025-03-03T10:28:39.000Z</published>
    <updated>2025-03-03T10:28:39.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="第一站-武汉"><a href="#第一站-武汉" class="headerlink" title="第一站 武汉"></a>第一站 武汉</h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;别问为什么隔了那么久才发，问就是懒的写 <code>,,ԾㅂԾ,,</code> 我这辈子都不相信 <strong>高德地图</strong> 的预计时间了，害我赶不上车，明明还有5分钟才发车，我只能改签了，我还在站里拍了照片，其实我还比了 <code>( •̀ ω •́ )y</code> 我觉得不要为了打翻的牛奶而哭泣 <code>/(ㄒoㄒ)/~~</code> 既然事情已经发生了，那就积极面对，下次避免发生。幸亏的是北站还有票，虽然是站票，有票还要什么自行车。然后我就从广州站跑去广州北站，开启我人生中第一次十二小时的无座之旅 <code>(ง •_•)ง</code><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要说是什么感觉呢，简直是煎熬啊，广州是个大站，一上车，全是人，别说坐了，连站着都没位置，要为自己的拖延买单。到湖南才没那么多人，一直站到天亮才坐了会，日出真美 <code>(～o￣3￣)～</code> </p><h4 id="第二站-跨年"><a href="#第二站-跨年" class="headerlink" title="第二站 跨年"></a>第二站 跨年</h4><p>终于到了，我还让她等了我几个小时，铭记今天，做什么都要提前！！！本来是差不多时间一起到的 <code>/(ㄒoㄒ)/~~</code> 呃，异地恋懂得都懂，见面了怪尴尬的<code>,,ԾㅂԾ,,</code> 还不太熟，就抱了一下 <code>\(￣︶￣*\))</code><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;武汉的地铁有特色，奈何没文化只能说：好有文化特色啊，好像是每条线都不一样，就是太贵了，不愧是排全国轨道交通营收入第一。比广州地铁好太多了，座椅还是加热的 <code>(✿◠‿◠)</code> 我们去了 <strong>汉口江滩</strong> ， <strong>江汉关钟楼</strong> ，跨年真的感觉来了几亿人，车水马龙的。<br><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/01.webp" alt="为了想见的人，无所畏惧"></p><h4 id="第三站-黄鹤楼"><a href="#第三站-黄鹤楼" class="headerlink" title="第三站 黄鹤楼"></a>第三站 黄鹤楼</h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;崔颢描绘 <strong>黄鹤楼</strong> 周围的壮丽景色，表达了对过去的怀念和对人生无常的感慨。当诗句在现实具象化，那一刻我看到了古人中的 <strong>黄鹤楼</strong> ，也是这般磅礴雄伟。我们去的时候已经不让进去了，因为要作为春晚的分会场，体验各个位置时间的 <strong>黄鹤楼</strong> 吧 <code>(✧◕ ◡ ◕✧)</code> </p><p style="text-align: center;">《黄鹤楼》——唐·崔颢</p><p style="text-align: center;">昔人已乘黄鹤去，此地空余黄鹤楼。</p><p style="text-align: center;">黄鹤一去不复返，白云千载空悠悠。</p><p style="text-align: center;">晴川历历汉阳树，芳草萋萋鹦鹉洲。</p><p style="text-align: center;">日暮乡关何处是？烟波江上使人愁。</p><p><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/02.webp" alt="黄鹤楼"></p><h4 id="第四站-武汉长江大桥"><a href="#第四站-武汉长江大桥" class="headerlink" title="第四站 武汉长江大桥"></a>第四站 武汉长江大桥</h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们 <code>ヽ(￣ω￣(￣ω￣〃)ゝ</code> 去了 <strong>武汉长江大桥</strong> 看了日落，吹了江风，也看了火车的驶过，还看了夜景，也坐了轮渡。也让我感慨万分，它是新中国成立的第一座跨江大桥，作为中国现代化进程中的一部分，武汉长江大桥不仅见证了历史变迁，也反映了国家发展的成就。<br><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/03.webp" alt="武汉长江大桥"></p><h4 id="第五站-湖北省博物馆-湖北美术馆-东湖"><a href="#第五站-湖北省博物馆-湖北美术馆-东湖" class="headerlink" title="第五站 湖北省博物馆 湖北美术馆 东湖"></a>第五站 湖北省博物馆 湖北美术馆 东湖</h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;City Walk <strong>湖北省博物馆</strong> ，武汉是座英雄的城市,新冠疫情中，武汉以“封一城护一国”的壮士断腕之举，为全球抗疫作出表率。我也是这个时候认识了她。还有了解一下 <strong>武汉长江大桥</strong> 通车史。看了， <strong>越王勾践剑</strong> ：一把剑，半部春秋史。就是太多人了挤不进去 <code>O(∩_∩)O</code> 也看了， <strong>曾侯乙编钟</strong> ：一套编钟，半部文明史。太震撼了很难想象到古人的智慧，是中国古代礼乐文明的巅峰之作。我说这头猪是她，她还狡辩，也了解到原来古时候的猪长这样。也是去了 <strong>湖北美术馆看</strong> 了一下，奈何没有什么艺术天分，啥都没看明白 <code>(・ω・)?</code>  <strong>东湖</strong> 真的太美了，都是秋的颜色，落日余晖，与相爱的人共坐湖畔，享受一天中的宁静，我们想老了我们也这样吧 <code>(*￣▽￣*)☁️❤️</code><br><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/04.webp" alt="湖北省博物馆，湖北美术馆，东湖"></p><h4 id="第六站-武汉大学"><a href="#第六站-武汉大学" class="headerlink" title="第六站 武汉大学"></a>第六站 武汉大学</h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这次最主要的目标就是这 <strong>武汉大学</strong> ，因为是我俩的梦中情校，我们花了一下午的时间逛学校，可以认为是一起上学，一起下课，一起走操场，一起吃饭，主要是一起 <code>(❤ ω ❤)</code> 很出名的 <strong>樱花大道</strong> ，可惜来的不是时候，要是三四月份过去就能看到绝美的樱花了🌸<br><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/05.webp" alt="武汉大学"></p><h4 id="第七站-吃吃迟迟"><a href="#第七站-吃吃迟迟" class="headerlink" title="第七站 吃吃迟迟"></a>第七站 吃吃迟迟</h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;吃了很多当地的特色小吃。 <strong>真茶屋</strong> ，武汉当地品牌，只有在武汉当地才有的 <code>(✧ω✧)</code> 肯定少不了 <strong>热干面</strong> ，还有 <strong>汽水包</strong> 、 <strong>武汉老味面窝</strong> 、 <strong>孙氏豆皮</strong> 、 <strong>鸡冠礁</strong> 、 <strong>糯米鸡</strong> 、 <strong>汪记鲜鱼糊汤面</strong> 、 <strong>花卷</strong> 、 <strong>章鱼小丸子</strong> 、 <strong>炸蘑菇</strong> 。逛了 <strong>循礼门鲜花花市</strong> ，打卡了 <strong>江汉路步行街</strong> 3D大屏，走走吃吃就到家了，美好的日子总是过的很快，又到要说再见的时候了，不知道下次见面又是何时了，不过我们来日方长，下次再见啦 <code>ヾ(￣▽￣)Bye~Bye~</code><br><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/06.webp" alt="吃吃吃吃"></p><h4 id="提前过-三周年纪念日"><a href="#提前过-三周年纪念日" class="headerlink" title="提前过 三周年纪念日"></a>提前过 <strong>三周年纪念日</strong></h4><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因为时间的原因，我们打算提前过<code>( *^-^)ρ(^0^* )</code>在未来的日子里，我们还要一起创造更多美好的回忆，余生漫漫，我们来日方长，请多多关照。当然忘不了我们的老传统吃 <strong>螺蛳粉</strong> 吃的香香的离开<code>(╯▽╰ )好香~~</code><br><img src="https://images.418121.xyz/file/blog/daily/2025/03/01/07.webp" alt="三载相伴情更浓，蛋糕甜蜜心相通"><br><a href="/footmap/">已添加至足迹图，欢迎大家的查阅。</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天就这样。相信你过得也很好吧？期待下次与你再会😊。</p>]]></content>
    
    
    <summary type="html">武汉跨年之旅，从我错过的火车开始。我们跨越千里在跨年夜相拥，穿梭于汉口江滩的人潮与长江大桥的落日之间，在黄鹤楼的诗意屏障外聆听千年回响，于博物馆的青铜剑光中触摸文明脉络。挤不进樱花大道的遗憾被东湖的黄昏抚平，市井巷陌的热干面香气与螺蛳粉的纪念日仪式，交织成我们独特的旅程。这场始于狼狈的旅程，最终在长江的月光里淬炼出真理：生活的意外终将发酵为记忆的烈酒，而武汉这座英雄之城，永远在钢铁森林与碳水烟火中，等待着与迷路者的奇妙共振。</summary>
    
    
    
    <category term="日常" scheme="https://one.blog.418121.xyz/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="玩" scheme="https://one.blog.418121.xyz/tags/%E7%8E%A9/"/>
    
    <category term="与女朋友" scheme="https://one.blog.418121.xyz/tags/%E4%B8%8E%E5%A5%B3%E6%9C%8B%E5%8F%8B/"/>
    
    <category term="武汉" scheme="https://one.blog.418121.xyz/tags/%E6%AD%A6%E6%B1%89/"/>
    
    <category term="跨年" scheme="https://one.blog.418121.xyz/tags/%E8%B7%A8%E5%B9%B4/"/>
    
    <category term="纪念日" scheme="https://one.blog.418121.xyz/tags/%E7%BA%AA%E5%BF%B5%E6%97%A5/"/>
    
    <category term="旅行" scheme="https://one.blog.418121.xyz/tags/%E6%97%85%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>关于我在2024年做了这件事...</title>
    <link href="https://one.blog.418121.xyz/posts/3749d309.html"/>
    <id>https://one.blog.418121.xyz/posts/3749d309.html</id>
    <published>2024-12-25T06:50:33.000Z</published>
    <updated>2025-03-01T10:50:33.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="关于我在2024年做了这件事…"><a href="#关于我在2024年做了这件事…" class="headerlink" title="关于我在2024年做了这件事…"></a>关于我在<strong>2024</strong>年做了这件事…</h1><span class="blur">我也不知道做了什么，骗你们进来。</span><h1 id="回顾2024年"><a href="#回顾2024年" class="headerlink" title="回顾2024年"></a>回顾2024年</h1><div class="timeline">    <div class="timenode"><div class="meta"><p><p>1月</p></p></div><div class="body"><ul><li>又是新的一年。</li><li>我已经从上一年的11月就已经开始了实习了，但我没有找到实习单位。本科生都饱和了，何况我这种大专生，遍地都是大学生。</li><li>网上有个段子描述的很精髓：**“花3000块请不来技术师傅，但一定能请来大学生。”**很有讽刺感。</li><li>没学到精髓，都只学了一些皮毛。于是我在过年期间去酒楼干起了服务员，<strong>高端人才</strong>，端菜那种。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>2月</p></p></div><div class="body"><ul><li>过年了。</li><li>这个班也不是很好上的，刚上没几天就吃坏东西了，肚子痛了一天，最终请假回家休息。</li><li>请了干了三、四天活，休息两天，服了自己了。</li><li>过年前那几天还被惹到了<strong>甲流</strong>，班倒是没上几天，病俩次，还没发工资就要花钱了。</li><li>上了一个多月。去了几个熟人地方拜拜年。</li><li>看了一场电影《熊出没：逆转时空》，十年来第二次进电影院看熊出没，第一次献给了首部《熊出没：夺宝熊兵》，每年必看的系列电影。</li><li>到了开学日了，没好意思呆在家了，回学校呆。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>3月</p></p></div><div class="body"><ul><li>迷上了<strong>欧卡2</strong>，每天在宿舍里开车。</li><li>也去一趟她那玩了一个月，陪她吃减脂餐，逛过她的学校，吃过她吃的，玩过她玩过的，拿过她拿过的快递，吹过她吹的风，感受过她学校的温度，一起做饭，一起压马路，一起看电影，一起过生日，一起吃火锅，一起吃烧烤，一起去海边，一起疯狂过…</li><li>更多的是陪伴😘。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>4月</p></p></div><div class="body"><ul><li>她给我买了第一款游戏<strong>欧卡2</strong>，我之前一直玩的是学习版😘。</li><li>疯狂了一个月，也该回去了…</li><li>拿到了校奖学金。</li><li>看了场演唱会《Hi陌生人，庄心妍巡回演唱会（佛山站）》。</li><li>她送了耳机😘。</li><li>然后一直在学校摆烂…</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>5月</p></p></div><div class="body"><ul><li>她给买了一套衣服，一些水果零食😘。</li><li>弄实习的一些东西，也出去面试了几家。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>6月</p></p></div><div class="body"><ul><li>毕业季。</li><li>拿到了校“三好学生”。</li><li>参加毕业典礼。</li><li>获得校“优秀毕业生”。</li><li>拿毕业证，吃了顿散伙饭。</li><li>收拾东西，回家。</li><li>其实还是有点迷糊的，两年的大学生活就这样过去了，我的读书生涯也从此结束了，到现在还没转变过来，也没意识到我已经毕业半年了，在家也待了半年了。</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>7月</p></p></div><div class="body"><ul><li>在家…</li><li>陪爷爷去看病…</li><li>拍拍天空…</li><li>打打球…</li><li>写写博客..</li><li>为二次元白月光《你的名字》补票…</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>8月</p></p></div><div class="body"><ul><li>和哥哥一起独自生活的一个月…</li><li>手机屏幕坏了，天塌了，本就贫穷的我雪上加霜…</li><li>换了屏幕，又坏了(；′⌒**)…</li></ul><ul><li>她给我买了面包，饮料😘</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>9月</p></p></div><div class="body"><ul><li>闲鱼淘了一台二手手机…</li><li>她给我买了面包😘</li><li>一直打球、摄影…</li><li>也中秋了，她给我买了月饼😘</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>10月</p></p></div><div class="body"><ul><li>跟兄弟们聚餐…</li><li>回老家扫墓…</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>11月</p></p></div><div class="body"><ul><li>跟兄弟打打桌球…</li><li>另一台手机屏幕又坏了，倒霉…</li><li>跟兄弟们爬山…</li><li>去钓鱼…</li></ul></div></div>    <div class="timenode"><div class="meta"><p><p>12月</p></p></div><div class="body"><ul><li>陪叔叔们去做肠镜胃镜…</li><li>兄弟生日聚餐…</li><li>接了几单…</li><li>准备去武汉跨年…</li></ul></div></div></div><h1 id="总结2024年"><a href="#总结2024年" class="headerlink" title="总结2024年"></a>总结2024年</h1><p>总的来说，今年就是过的很迷糊，还没从学生转入到社会里，缺少社会的毒打。钱也没挣到，就要过年了。明年在努力吧，我也没什么追求，家里人健康快乐就好，家里也没要求什么，能养活自己就好。</p><p>她真的很好😘，就是我太差劲了，什么都给我买，感觉<span class="blur">像被包养了</span></p><p>新的一年祝大家<strong>平安喜乐</strong>。</p>]]></content>
    
    
    <summary type="html">总结我的2024年。</summary>
    
    
    
    <category term="年总" scheme="https://one.blog.418121.xyz/categories/%E5%B9%B4%E6%80%BB/"/>
    
    
    <category term="2024年总" scheme="https://one.blog.418121.xyz/tags/2024%E5%B9%B4%E6%80%BB/"/>
    
  </entry>
  
  <entry>
    <title>2024.11.24</title>
    <link href="https://one.blog.418121.xyz/posts/2d1e8e7a.html"/>
    <id>https://one.blog.418121.xyz/posts/2d1e8e7a.html</id>
    <published>2024-12-08T12:19:44.000Z</published>
    <updated>2024-12-08T14:19:44.000Z</updated>
    
    <content type="html"><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;别问为什么隔了那么久才发，问就是不想水 （；´д｀）ゞ ，再问的话就是只会写流水账，还问就是懒的写。有点忘记那天的事了 ,,ԾㅂԾ,, 没错今天又去爬山了，今天去爬 <strong>大夫山</strong> 挑战爬遍广州的山！好像每次出来，都不好运啊，刚出来就阴天了，搞不好要下雨啊，计划要泡汤啊，出发去地铁站了。坐上xjx的小电驴带上头盔出发了，他家离那里很近。开了一会天空中飘雨了，还没地方避雨，服了，兜兜转转终于找到地方避雨了，雨不大，一会后，我们就接着出发了。群里还在热火朝天的讨论要去哪个门，但是lyq已经到了北门，但我跟xjx已经到了南门，还有wzx还没到，也问我们确定去哪个门。我们决定就lyq他一个人，全都去北门，就拍了一张南门照片，就匆匆离去了。绕个大圈去北门，就怕 <strong>不够电</strong> 回来。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/01.webp" alt="出发了"><br><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/02.webp" alt="路上"><br><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/03.webp" alt="大夫山南门"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;路上还看到一条人工饲养的河，水也清澈见底，可能是因为水少的原因。半个小时后终于到了，集合地点是大大的打卡logo。废话不多说往上爬，中途在一个院子里吃了xjx的干粮。突然就下雨了，还很大，我跟xjx都没有带伞，就wzx带了，他遮lyq，我跟xjx只能戴帽子前行。他们能直接坐公交回家，我跟xjx还要开小电驴。现在的问题是只有一件雨衣，雨又那么大，他给我穿了，雨小了准备出发了。开冲！服了这个老六了一冲出去就下大雨了，他车好像没电了，还停了几次，还推了一段路的车，太快乐了，仿佛回到小时候淋雨出来玩耍的快乐，这是很难得的。 <strong>塞翁失马焉知非福</strong> 到他家换了双拖鞋拿了把伞，还拿了一包大辣条，两根香蕉。出来发现不下雨了。服了这个老六老天爷了，真的想*****它了。走到地铁站，发现地图这里好暖和，坐到家我的衣服全干了，除了鞋子袜子。上行的电梯还坏了，倒霉透了，也算是一段特别的经历了。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/04.webp" alt="观赏鱼"><br><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/05.webp" alt="集合地点北门"><br><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/06.webp" alt="很火的那个湖"><br><img src="https://images.418121.xyz/file/blog/daily/2024/12/08/07.webp" alt="上行的电梯坏了"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天就这样。相信你过得也很好吧？期待下次与你再会😊。</p>]]></content>
    
    
    <summary type="html">作者分享了与朋友们一起爬山的经历，尽管隔了很久才发文，但并不想写流水账。今天，他们挑战了广州的大夫山，刚出门时就遇上阴天，甚至开始下雨，让原本的计划受到影响。他们骑着小电驴到达目的地，却因天气原因分成两组。到达后，虽然刚开始的冒雨过程有些曲折，但在朋友的帮助下，作者换上雨衣，继续前行。途中，尽管遇到了较大的雨，和一些小麻烦（如电动车没电），但作者感受到了童年淋雨的快乐。最终，作者在地铁站干燥了衣服，回顾此次特别的经历。整篇文章体现了团队中的幽默和意外，同时也表达了对朋友的期待与珍惜。</summary>
    
    
    
    <category term="日常" scheme="https://one.blog.418121.xyz/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="爬山" scheme="https://one.blog.418121.xyz/tags/%E7%88%AC%E5%B1%B1/"/>
    
    <category term="玩" scheme="https://one.blog.418121.xyz/tags/%E7%8E%A9/"/>
    
    <category term="与好友" scheme="https://one.blog.418121.xyz/tags/%E4%B8%8E%E5%A5%BD%E5%8F%8B/"/>
    
  </entry>
  
  <entry>
    <title>他乡纵有当头月，不及家乡一盏灯</title>
    <link href="https://one.blog.418121.xyz/posts/63e1fc9e.html"/>
    <id>https://one.blog.418121.xyz/posts/63e1fc9e.html</id>
    <published>2024-12-04T10:30:20.000Z</published>
    <updated>2024-12-04T10:30:20.000Z</updated>
    
    <content type="html"><![CDATA[<p style="text-align: center;">之前回老家拍的，还是老家的环境适合我，巴适啊！</p><p><img src="https://images.418121.xyz/file/blog/camera/2024/12/04/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/12/04/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/12/04/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/12/04/04.webp"></p><link rel="stylesheet" href="//unpkg.com/hexo-tag-map/lib/leaflet@1.7.1.css"><script data-pjax src="//unpkg.com/hexo-tag-map/lib/leaflet@1.7.1.js"></script><script data-pjax src="//unpkg.com/hexo-tag-map/lib/leaflet.ChineseTmsProviders@1.0.4.js"></script><div class="map-box" style="margin: 0.8rem 0 1.6rem 0;"><div id="map-110.946866-22.354887" style="max-width:100%; height:300px;display: block;margin:0 auto;z-index:1;border-radius: 5px;"></div></div><script type="text/javascript">var normalm=L.tileLayer.chinaProvider('GaoDe.Normal.Map',{maxZoom:20,minZoom:1,attribution:'高德地图'});var imgm=L.tileLayer.chinaProvider('GaoDe.Satellite.Map',{maxZoom:20,minZoom:1,attribution:'高德地图'});var imga=L.tileLayer.chinaProvider('GaoDe.Satellite.Annotion',{maxZoom:20,minZoom:1,attribution:'高德地图'});var normalMap=L.tileLayer.chinaProvider('Google.Normal.Map',{maxZoom:20,minZoom:1,attribution:'Google Maps'}),satelliteMap=L.tileLayer.chinaProvider('Google.Satellite.Map',{maxZoom:21,minZoom:1,attribution:'Google Maps'});routeMap=L.tileLayer.chinaProvider('Google.Satellite.Annotion',{maxZoom:21,minZoom:1});var normalMap=L.tileLayer.chinaProvider('Google.Normal.Map',{maxZoom:21,minZoom:1,attribution:'Google Maps'}),satelliteMap=L.tileLayer.chinaProvider('Google.Satellite.Map',{maxZoom:21,minZoom:1,attribution:'Google Maps'}),routeMap=L.tileLayer.chinaProvider('Google.Satellite.Annotion',{maxZoom:21,minZoom:1,attribution:'Google Maps'});var normalm1=L.tileLayer.chinaProvider('Geoq.Normal.Map',{maxZoom:21,minZoom:1,attribution:'GeoQ'});var normal=L.layerGroup([normalm]),image=L.layerGroup([imgm,imga]);var baseLayers={"高德地图":normal,"智图地图":normalm1,"谷歌地图":normalMap,"高德卫星地图":imgm,"谷歌卫星地图":satelliteMap,"高德卫星标注":image,"谷歌卫星标注":routeMap};var mymap=L.map('map-110.946866-22.354887',{center:[22.354887,110.946866],zoom:15,layers:[normal],zoomControl:false});L.control.layers(baseLayers,null).addTo(mymap);L.control.zoom({zoomInTitle:'放大',zoomOutTitle:'缩小'}).addTo(mymap);var marker = L.marker(['22.354887','110.946866']).addTo(mymap);marker.bindPopup("来这里请你们吃佬粉！").openPopup();</script><p style="text-align: center;">🌏摄于：广东 · 信宜 2022-09-05</p><a href="%E6%97%A5,https://blog.418121.xyz/gallery/tuchong/" title="" target="">叶泯希,已同步至相册集 2024 年 7 月 24</a>]]></content>
    
    
    <summary type="html">他乡纵有当头月，不及家乡一盏灯。</summary>
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="乡野田间" scheme="https://one.blog.418121.xyz/tags/%E4%B9%A1%E9%87%8E%E7%94%B0%E9%97%B4/"/>
    
    <category term="大山里的味道" scheme="https://one.blog.418121.xyz/tags/%E5%A4%A7%E5%B1%B1%E9%87%8C%E7%9A%84%E5%91%B3%E9%81%93/"/>
    
    <category term="家乡的天空" scheme="https://one.blog.418121.xyz/tags/%E5%AE%B6%E4%B9%A1%E7%9A%84%E5%A4%A9%E7%A9%BA/"/>
    
    <category term="农村生活" scheme="https://one.blog.418121.xyz/tags/%E5%86%9C%E6%9D%91%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>Vercel+Aiven 自建Umami统计</title>
    <link href="https://one.blog.418121.xyz/posts/f4576f3d.html"/>
    <id>https://one.blog.418121.xyz/posts/f4576f3d.html</id>
    <published>2024-11-30T07:18:54.000Z</published>
    <updated>2024-12-18T04:50:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>本来是一直在用百度统计的，也不知道它抽什么风，就说我的网站违规了，真的莫名其妙。我啥都没干，搞我心态，就这样了后面我换了 <a href="https://v6.51.la/">51</a> ，换了51la感觉还是不好，数据保留不了很久，百度和51LA好像都只有 <strong>3年</strong> 。偶然的一次机会下接触到 <a href="https://github.com/umami-software/umami">Umami</a> 这个开源的项目，发现它可以在 <a href="https://vercel.com/">Vercel</a> 部署，众所周知 <strong><a href="https://dash.cloudflare.com/">Cloudfare</a></strong> 和 <strong>Vercel</strong> 都是大善啊🙂,我是白嫖怪(●ˇ∀ˇ●)，至于问为什么选择 <strong>Aiven</strong> 不选别的，因为它给的是 <strong>CPU：2核</strong> <strong>内存：1GB</strong> <strong>硬盘：5GB</strong> ，没办法给的太多了，还是免费，Vercel自带的也就才 <strong>512MB</strong> 不大够用，这个还能提供 <strong>迁移数据库</strong> 还原等，是真的香。最主要的原因就是51LA开了代理它就不生效了！！！</p><blockquote><p>尊敬的用户，<br>您好，经百度统计巡查发现，您的网站yeminxi.github.io已违反您开通百度统计服务时所同意的《百度统计服务条款》 “三、使用规则：1.您在使用百度服务时，必须遵守中华人民共和国相关法律法规的规定，您同意将不会利用本服务进行任何违法或不正当的活动，包括但不限于下列行为∶7）散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的”。建议您着重排查欺诈、病毒木马、色情博彩相关信息。根据《百度统计服务条款》的相关条款，百度统计自即日起终止为您提供数据监控服务，您的网站数据将不再更新。</p></blockquote><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><h3 id="Vercel"><a href="#Vercel" class="headerlink" title="Vercel"></a><a href="https://vercel.com/">Vercel</a></h3><p>Vercel 是一个云平台，专注于前端框架和静态网站的部署。</p><h3 id="Aiven"><a href="#Aiven" class="headerlink" title="Aiven"></a><a href="https://console.aiven.io/signup?referral_code=om3btxfe3nqebmf1zlhf">Aiven</a></h3><p>Aiven 公司提供的托管式 Google Cloud AlloyDB Omni 数据库服务。它允许用户在 Aiven 的云基础设施上轻松部署、管理和扩展 AlloyDB Omni 数据库，而无需自行管理底层基础设施。</p><h3 id="Umami"><a href="#Umami" class="headerlink" title="Umami"></a><a href="https://github.com/umami-software/umami">Umami</a></h3><p>Umami 是一种简单、快速、注重隐私的 Google Analytics 替代品。</p><p>详细的官方入门指南<a href="https://umami.is/docs/">umami.is&#x2F;docs</a>。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ul><li>需要Github，Vercel，Aiven账号</li></ul><h2 id="第一步fork仓库或点此处一键部署"><a href="#第一步fork仓库或点此处一键部署" class="headerlink" title="第一步fork仓库或点此处一键部署"></a>第一步fork仓库或<a href="https://vercel.com/new/clone?repository-url=https://github.com/umami-software/umami&env=DATABASE_URL">点此处一键部署</a></h2><ul><li><p>Fork仓库</p><a href="Umami,Umami,https://github.com/umami-software/umami" title="" target=""></a></li><li><p><a href="https://vercel.com/new/clone?repository-url=https://github.com/umami-software/umami&env=DATABASE_URL">点此处一键部署</a></p></li></ul><h2 id="第二步-注册Aiven"><a href="#第二步-注册Aiven" class="headerlink" title="第二步 注册Aiven"></a>第二步 注册Aiven</h2><ul><li><p>建议使用<a href="https://mail.google.com/mail?hl=zh-CN">谷歌邮箱</a>注册，没有的话 <strong>QQ邮箱</strong> 好像也没问题的，看能不能收验证链接而已。</p><a href="Aiven,%E6%B3%A8%E5%86%8C%E9%93%BE%E6%8E%A5,https://console.aiven.io/signup?referral_code=om3btxfe3nqebmf1zlhf" title="" target=""></a></li><li><p>创建数据库 <strong>MySQL</strong> 数据库（这里的PostgreSQL太拉了只能 <strong>20条的请求</strong> ）</p></li></ul><p><img src="https://images.418121.xyz/file/blog/play/02/01.webp" alt="创建MySQL数据库"></p><p><img src="https://images.418121.xyz/file/blog/play/02/02.webp" alt="选择free plan 在选择亚太地区"></p><h2 id="第三步-添加环境变量"><a href="#第三步-添加环境变量" class="headerlink" title="第三步 添加环境变量"></a>第三步 添加环境变量</h2><p>复制 <strong>Service URI</strong> 到 Vercel的项目里，打开项目发现是报错的，是因为没有添加环境变量。点击 <strong>settings</strong> 然后再点 <strong>environment-variables</strong> 添加并 <strong>重新部署</strong> 即可。</p><p><img src="https://images.418121.xyz/file/blog/play/02/03.webp" alt="复制 Service URI 到Vercel的环境变量中添加 DATABASE_URL "></p><p><img src="https://images.418121.xyz/file/blog/play/02/05.webp" alt="重新部署 等待一段时间"></p><h2 id="第四步-添加域名"><a href="#第四步-添加域名" class="headerlink" title="第四步 添加域名"></a>第四步 添加域名</h2><p>因为Vercel被墙，所以要配置一个域名，国内才能访问到。</p><p><img src="https://images.418121.xyz/file/blog/play/02/06.webp" alt="绑定域名cname"></p><h2 id="第五步-完成"><a href="#第五步-完成" class="headerlink" title="第五步 完成"></a>第五步 完成</h2><p><img src="https://images.418121.xyz/file/blog/play/02/07.webp" alt="部署成功"></p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">默认账号密码</span><br><span class="line">账号：admin</span><br><span class="line">密码：umami</span><br><span class="line">可用此账号登录我的示例网站观看</span><br></pre></td></tr></table></figure>  <a href="Umami,%E6%88%91%E7%9A%84%E7%A4%BA%E4%BE%8B%E7%BD%91%E7%AB%99,https://um.api.418121.xyz/" title="" target=""></a><p>更多操作请看<a href="#%E6%9C%AC%E6%96%87%E5%8F%82%E8%80%83">本文参考</a></p><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><ul><li>更 新 <strong>umami</strong></li></ul><p>打开你的fork的仓库找到 <strong>package.json</strong> 文件</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><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;umami&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2.15.1&quot;</span><span class="punctuation">,</span> <span class="comment">//修改这一行</span></span><br><span class="line">  <span class="attr">&quot;description&quot;</span><span class="punctuation">:</span> <span class="string">&quot;A simple, fast, privacy-focused alternative to Google Analytics.&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;author&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Umami Software, Inc. &lt;hello@umami.is&gt;&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;license&quot;</span><span class="punctuation">:</span> <span class="string">&quot;MIT&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;homepage&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://umami.is&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;repository&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;git&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;url&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://github.com/umami-software/umami.git&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%E6%9C%8D%E5%8A%A1,https://thewanderingallison.github.io/posts/how_to_host_umami_on_vercel/" title="" target="">The Wandering Allison,使用 Vercel 自建 Umami</a><a href="%E5%91%A8%E6%B6%A6%E5%8F%91,%E4%BD%BF%E7%94%A8vercel%E9%83%A8%E7%BD%B2Umami%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1%E6%9C%8D%E5%8A%A1%E3%80%81%E5%8F%AF%E6%98%BE%E7%A4%BA%E8%BF%91%E4%B8%80%E5%B9%B4%E7%9A%84pv%E3%80%81uv%E6%95%B0%E6%8D%AE,https://blog.aizrf.com/p/59/" title="" target=""></a><a href="Shire,%E9%9B%B6%E6%88%90%E6%9C%AC%E3%80%81%E4%B8%8D%E9%9C%80%E8%87%AA%E5%BB%BA%E6%90%AD%E5%BB%BAUmami%EF%BC%9A%E5%BC%80%E6%BA%90%E6%98%93%E7%94%A8%E7%9A%84%E7%BD%91%E7%AB%99%E8%AE%BF%E9%97%AE%E9%87%8F%E7%BB%9F%E8%AE%A1%E5%B7%A5%E5%85%B7,https://thirdshire.com/running-umami-on-planetscale-vercel/" title="" target="">第三夏尔 | Third</a><a href="%E7%BB%9F%E8%AE%A1,https://oldj.net/article/2022/06/24/use-umami/" title="" target="">oldj,使用 umami</a><a href="%E4%B8%80%E4%B8%AA%E7%AE%80%E7%BA%A6%E8%80%8C%E4%B8%8D%E7%AE%80%E5%8D%95%E7%9A%84%E7%BD%91%E9%A1%B5%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1%E5%B7%A5%E5%85%B7,https://www.nodeseek.com/post-16998-1" title="" target="">adonis142857,【教程】如何部署 umami —</a><a href="JayShao,Umami%E9%83%A8%E7%BD%B2%E7%8B%AC%E7%AB%8B%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1%E6%9C%8D%E5%8A%A1,https://jayshao.com/umami-analytics-system/" title="" target=""></a><a href="%E8%87%AA%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%AE%80%E6%B4%81%E7%BE%8E%E8%A7%82%E7%9A%84%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1%EF%BC%88%E5%88%86%E6%9E%90%EF%BC%89Umami,https://blog.captainz.cc/posts/umami_docker.html" title="" target="">闪闪发光的 ZZZ,使用 Docker</a><a href="Mintimate,%E4%BD%BF%E7%94%A8Umami%E4%B8%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E7%BD%91%E7%AB%99%E7%BB%9F%E8%AE%A1%E8%AE%BF%E9%97%AE%E6%B5%81%E9%87%8F%E5%B9%B6%E5%8F%AF%E8%A7%86%E5%8C%96%E6%95%B0%E6%8D%AE,https://www.mintimate.cn/2022/03/02/deployUmami/" title="" target=""></a><a href="%E7%BB%9F%E8%AE%A1%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99%E8%AE%BF%E9%97%AE%E6%95%B0%E6%8D%AE,https://www.cnblogs.com/himeka/p/16610706.html" title="" target="">Sakura Yumine,使用 Umami</a><a href="%E2%9D%96%E6%98%9F%E6%B8%AF%E2%97%8EStar%E2%98%86,%E5%85%B3%E4%BA%8E%E9%A1%B5%E6%95%B0%E6%8D%AE%E7%BB%9F%E8%AE%A1%E6%8E%A5%E5%85%A5%E8%87%AA%E5%BB%BAumami,https://blog.starsharbor.com/posts/solitude-about_umami/" title="" target=""></a><a href="Worker%E9%83%A8%E7%BD%B2Umami%E7%9A%84API,https://blog.bsgun.cn/posts/d0612c0e/" title="" target="">梦爱吃鱼,CF</a><a href="%E5%BC%A0%E6%B4%AAHeo,%E4%BD%BF%E7%94%A8Docker%E6%90%AD%E5%BB%BAUmami%E7%BB%9F%E8%AE%A1%EF%BC%8C%E6%98%BE%E7%A4%BA%E8%BF%91%E4%B8%80%E5%B9%B4%E7%9A%84pv%E3%80%81uv%E6%95%B0%E6%8D%AE%E7%9A%84API%E6%90%AD%E5%BB%BA,https://blog.zhheo.com/p/61e9.html" title="" target=""></a>]]></content>
    
    
    <summary type="html">如何在 Vercel 和 Aiven 上部署 Umami 的长篇文章。作者分享了他们switching 从 Baidu Analytics 到 Umami 的个人经验，原因是 Baidu Analytics 的限制。</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="Vercel" scheme="https://one.blog.418121.xyz/tags/Vercel/"/>
    
    <category term="Umami" scheme="https://one.blog.418121.xyz/tags/Umami/"/>
    
    <category term="Aiven" scheme="https://one.blog.418121.xyz/tags/Aiven/"/>
    
  </entry>
  
  <entry>
    <title>侧边栏——Solitude主题</title>
    <link href="https://one.blog.418121.xyz/posts/dca7dbdb.html"/>
    <id>https://one.blog.418121.xyz/posts/dca7dbdb.html</id>
    <published>2024-11-24T16:01:41.000Z</published>
    <updated>2026-03-25T05:38:37.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>换了主题以后发现之前侧边栏都要改了，所以有了这一篇文章。<a href="/">效果请单击此处观看</a></p><h2 id="恋爱墙"><a href="#恋爱墙" class="headerlink" title="恋爱墙"></a>恋爱墙</h2><ol><li><p>在 <strong>source&#x2F;custom&#x2F;</strong> 下，新建 <strong>js</strong> 文件夹，在里面新建一个 <strong>laq.min.js</strong> 文件填入以下内容，在 <strong>Date.UTC()</strong> 修改时间月份是从 <strong>0</strong> 开始算的11月就是 <strong>10</strong> 以此类推。（文件名可自定义，在 <strong>source</strong> 里就可以了）</p> <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> laq_time=<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;laq_time&quot;</span>),laq_time_time=<span class="literal">null</span>;<span class="keyword">function</span> <span class="title function_">setTime</span>(<span class="params"></span>)&#123;<span class="keyword">var</span> create_time=<span class="title class_">Math</span>.<span class="title function_">round</span>(<span class="keyword">new</span> <span class="title class_">Date</span>(<span class="title class_">Date</span>.<span class="title function_">UTC</span>(<span class="number">2021</span>,<span class="number">12</span>,<span class="number">21</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>)).<span class="title function_">getTime</span>()/<span class="number">1e3</span>),timestamp=<span class="title class_">Math</span>.<span class="title function_">round</span>(((<span class="keyword">new</span> <span class="title class_">Date</span>).<span class="title function_">getTime</span>()+<span class="number">288e5</span>)/<span class="number">1e3</span>);currentTime=<span class="title function_">secondToDate</span>(timestamp-create_time),currentTimeHtml=currentTime[<span class="number">0</span>]+<span class="string">&quot; 年 &quot;</span>+currentTime[<span class="number">1</span>]+<span class="string">&quot; 天 &quot;</span>+currentTime[<span class="number">2</span>]+<span class="string">&quot; 时 &quot;</span>+currentTime[<span class="number">3</span>]+<span class="string">&quot; 分 &quot;</span>+currentTime[<span class="number">4</span>]+<span class="string">&quot; 秒&quot;</span>,laq_time.<span class="property">innerHTML</span>=currentTimeHtml&#125;<span class="keyword">function</span> <span class="title function_">secondToDate</span>(<span class="params">second</span>)&#123;<span class="keyword">if</span>(!second)<span class="keyword">return</span> <span class="number">0</span>;<span class="keyword">var</span> time=<span class="keyword">new</span> <span class="title class_">Array</span>(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);<span class="keyword">return</span> second&gt;=<span class="number">31536e3</span>&amp;&amp;(time[<span class="number">0</span>]=<span class="built_in">parseInt</span>(second/<span class="number">31536e3</span>),second%=<span class="number">31536e3</span>),second&gt;=<span class="number">86400</span>&amp;&amp;(time[<span class="number">1</span>]=<span class="built_in">parseInt</span>(second/<span class="number">86400</span>),second%=<span class="number">86400</span>),second&gt;=<span class="number">3600</span>&amp;&amp;(time[<span class="number">2</span>]=<span class="built_in">parseInt</span>(second/<span class="number">3600</span>),second%=<span class="number">3600</span>),second&gt;=<span class="number">60</span>&amp;&amp;(time[<span class="number">3</span>]=<span class="built_in">parseInt</span>(second/<span class="number">60</span>),second%=<span class="number">60</span>),second&gt;<span class="number">0</span>&amp;&amp;(time[<span class="number">4</span>]=second),time&#125;laq_time?laq_time_time=<span class="built_in">setInterval</span>(setTime,<span class="number">1e3</span>):<span class="built_in">clearInterval</span>(laq_time_time);</span><br></pre></td></tr></table></figure></li><li><p>在 <strong>source&#x2F;_data</strong> 目录下新建一个 <strong>aside.yml</strong> 文件。</p></li><li><p>在文件中写入以下内容，更改 <strong>图片地址</strong> 和 <strong>js地址</strong> 。</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">love</span></span><br><span class="line">  <span class="attr">title:</span> <span class="string">恋爱墙</span></span><br><span class="line">  <span class="attr">class:</span> </span><br><span class="line">  <span class="attr">id:</span> <span class="string">testLove</span></span><br><span class="line">  <span class="attr">icon:</span> <span class="string">fas</span> <span class="string">fa-heart</span></span><br><span class="line">  <span class="attr">content_class:</span></span><br><span class="line">  <span class="attr">content_id:</span></span><br><span class="line">  <span class="attr">content_css:</span> </span><br><span class="line">  <span class="attr">content_html:</span> <span class="string">&#x27;&lt;div style=&quot;text-align: center;&quot;&gt;</span></span><br><span class="line"><span class="string">        &lt;img src=&quot;图片地址&quot;</span></span><br><span class="line"><span class="string">          style=&quot;width: 50px;height: 50px;vertical-align: -20px;border-radius: 50%;margin-right: 5px;margin-bottom: 5px;-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);border: 2px solid #fff;&quot; /&gt;</span></span><br><span class="line"><span class="string">        &lt;svg viewbox=&quot;0 0 1024 1024&quot; style=&quot;margin-left: 5px;margin-right: 5px;&quot; version=&quot;1.0&quot; width=&quot;15&quot; height=&quot;15&quot;</span></span><br><span class="line"><span class="string">          class=&quot;my-face&quot;&gt;</span></span><br><span class="line"><span class="string">          &lt;path</span></span><br><span class="line"><span class="string">            d=&quot;M863.597631 513.574282l-271.33965-140.213484L729.783667 81.926656c3.583731-7.87141 7.167462-15.742819 7.167462-25.214109C736.887134 25.226908 708.345275 0.012799 672.635953 0.012799a63.611229 63.611229 0 0 0-39.293053 12.607055c-1.791866 1.59988-3.519736 3.19976-5.311602 3.19976L147.87531 418.925381a55.547834 55.547834 0 0 0-19.646527 47.356448c1.791866 17.278704 14.27093 33.021523 32.125591 42.492813l271.33965 141.749369L292.504463 945.221908c-12.479064 25.214109-1.791866 53.563983 23.166262 69.306802 10.751194 6.335525 23.230258 9.47129 35.709322 9.47129 16.062795 0 32.125591-4.735645 44.604655-15.742819l480.091993-403.297753a55.547834 55.547834 0 0 0 19.646526-47.228458 61.243407 61.243407 0 0 0-32.12559-44.156688z&quot;</span></span><br><span class="line"><span class="string">            fill=&quot;#515151&quot; /&gt;</span></span><br><span class="line"><span class="string">        &lt;/svg&gt;</span></span><br><span class="line"><span class="string">        &lt;img src=&quot;图片地址&quot;</span></span><br><span class="line"><span class="string">          style=&quot;width: 50px;height: 50px;vertical-align: -20px;border-radius: 50%;margin-left: 5px;margin-bottom: 5px;-webkit-box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);box-shadow: 1px 1px 1px rgba(0,0,0,.1), 1px 1px 1px rgba(0,0,0,0.1), 1px 1px 1px rgba(0,0,0,0.1);border: 2px solid #fff;&quot; /&gt;&lt;br /&gt;</span></span><br><span class="line"><span class="string">        &lt;span id=&quot;laq_time&quot;&gt;&lt;/span&gt;</span></span><br><span class="line"><span class="string">      &lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;script defer src=&quot;js地址&quot;&gt;&lt;/script&gt;&#x27;</span></span><br><span class="line">      <span class="comment"># 套个a标签即可实现点击跳转&lt;a href=&quot;xxx&quot;&gt;&lt;div style...&gt;&lt;/div&gt;&lt;/a&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>在主题的配置文件 <strong>_config.solitude.yml</strong> ,在 <strong>home:</strong> 后插入 <strong>love</strong> 。（我是只在主页显示，若你想全部显示在 <strong>post</strong> 和 <strong>page</strong> 后面都可以加上）</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Aside</span></span><br><span class="line"><span class="comment"># 侧边栏</span></span><br><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="comment"># Values: about (info card), newestPost (latest article), allInfo (website information), flip (official account QR code), newest_comment (latest comment)</span></span><br><span class="line">  <span class="comment"># 值: about(信息卡), newestPost(最新文章), allInfo(网站信息), flip(官方账号二维码), newest_comment(最新评论)</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Sticky: Fixed position / noSticky: Not fixed position</span></span><br><span class="line">  <span class="comment"># Sticky: 固定位置 / noSticky: 不固定位置</span></span><br><span class="line">  <span class="attr">home:</span> <span class="comment"># on the homepage</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,love&quot;</span> <span class="comment">#在此处加入 love</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;allInfo,newest_comment&quot;</span></span><br><span class="line">  <span class="attr">post:</span> <span class="comment"># on the article page</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,flip&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;newestPost,newest_comment&quot;</span></span><br><span class="line">  <span class="attr">page:</span> <span class="comment"># on the page</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,flip&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="Do-you-like-me"><a href="#Do-you-like-me" class="headerlink" title="Do you like me"></a>Do you like me</h2><p>之前专门写过一篇文章，可以看看，都是大差不差的。</p>  <a href="%E5%B0%8F%E7%BB%84%E4%BB%B6,https://blog.418121.xyz/posts/c88f8d39.html" title="" target="">叶泯希,给自己的网站加上Do you like me</a><ol><li><p>在 <strong>aside.yml</strong> 文件中加入以下内容。（记得修改 <strong>serverURL</strong> 为你的api地址，用我的就成给我数据了）</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">likeme</span></span><br><span class="line">  <span class="attr">title:</span> </span><br><span class="line">  <span class="attr">class:</span> </span><br><span class="line">  <span class="attr">id:</span> <span class="string">likeme</span></span><br><span class="line">  <span class="attr">icon:</span> </span><br><span class="line">  <span class="attr">content_class:</span></span><br><span class="line">  <span class="attr">content_id:</span></span><br><span class="line">  <span class="attr">content_css:</span> </span><br><span class="line">  <span class="attr">content_html:</span> <span class="string">&#x27;&lt;script data-pajx&gt;likeMe(&#123; el: &quot;#likeme&quot;, serverURL: &quot;https://like.api.418121.xyz&quot;, color: &quot;#ff4e6ae6&quot; &#125;)&lt;/script&gt;&#x27;</span></span><br></pre></td></tr></table></figure></li><li><p>打开主题的配置文件 <strong>_config.solitude.yml</strong> ,在 <strong>home:</strong> 后插入 <strong>likeme</strong> 。（我是只在主页显示，若你想全部显示在 <strong>post</strong> 和 <strong>page</strong> 后面都可以加上）</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Aside</span></span><br><span class="line"><span class="comment"># 侧边栏</span></span><br><span class="line"><span class="attr">aside:</span></span><br><span class="line">  <span class="comment"># Values: about (info card), newestPost (latest article), allInfo (website information), flip (official account QR code), newest_comment (latest comment)</span></span><br><span class="line">  <span class="comment"># 值: about(信息卡), newestPost(最新文章), allInfo(网站信息), flip(官方账号二维码), newest_comment(最新评论)</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Sticky: Fixed position / noSticky: Not fixed position</span></span><br><span class="line">  <span class="comment"># Sticky: 固定位置 / noSticky: 不固定位置</span></span><br><span class="line">  <span class="attr">home:</span> <span class="comment"># on the homepage</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,love,likeme&quot;</span> <span class="comment">#在此处加入 likeme</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;allInfo,newest_comment&quot;</span></span><br><span class="line">  <span class="attr">post:</span> <span class="comment"># on the article page</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,flip&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;newestPost,newest_comment&quot;</span></span><br><span class="line">  <span class="attr">page:</span> <span class="comment"># on the page</span></span><br><span class="line">    <span class="attr">noSticky:</span> <span class="string">&quot;about,flip&quot;</span></span><br><span class="line">    <span class="attr">Sticky:</span> <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure></li><li><p>在 <b>head:</b> 后插入以下内容：</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;https://unpkg.com/@5ime/likeme@latest/static/css/likeme.css&quot;</span> <span class="string">/&gt;</span> </span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;https://unpkg.com/@5ime/likeme@latest/static/js/likeme.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="弄完呢记得Hexo三连击"><a href="#弄完呢记得Hexo三连击" class="headerlink" title="弄完呢记得Hexo三连击"></a>弄完呢记得Hexo三连击</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean &amp;&amp; hexo generate &amp;&amp; hexo server</span><br></pre></td></tr></table></figure><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BE%A7%E8%BE%B9%E6%A0%8F,https://solitude.js.org/posts/c63b9f20.html" title="" target="">伍十七,Solitude</a>]]></content>
    
    
    <summary type="html">这篇教程详细介绍了如何在Hexo主题Solitude中魔改，添加恋爱墙、Do you like me小组件和来访者统计功能到侧边栏。步骤清晰，代码示例完整，并提供了必要的配置文件修改说明。 尤其值得称赞的是，文章中明确指出了月份在JavaScript代码中从0开始计算的细节，避免了潜在的错误。 此外，文章还提供了参考链接，方便读者进一步学习。</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="博客折腾" scheme="https://one.blog.418121.xyz/tags/%E5%8D%9A%E5%AE%A2%E6%8A%98%E8%85%BE/"/>
    
    <category term="Solitude" scheme="https://one.blog.418121.xyz/tags/Solitude/"/>
    
  </entry>
  
  <entry>
    <title>弹幕留言板——Solitude主题</title>
    <link href="https://one.blog.418121.xyz/posts/efc9bbdc.html"/>
    <id>https://one.blog.418121.xyz/posts/efc9bbdc.html</id>
    <published>2024-11-24T14:23:18.000Z</published>
    <updated>2024-11-23T17:37:18.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>换了主题以后发现之前留言板的插件好像有点问题，我稍微改了一下，所以有了这一篇文章。<a href="/message/">效果请单击此处观看</a></p><h2 id="第一步-先安装插件"><a href="#第一步-先安装插件" class="headerlink" title="第一步 先安装插件"></a>第一步 先安装插件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-butterfly-envelope --save</span><br></pre></td></tr></table></figure><p><a href="#%E6%9C%AC%E6%96%87%E5%8F%82%E8%80%83">基础教程可参考</a></p><h2 id="第二步-修改配置文件"><a href="#第二步-修改配置文件" class="headerlink" title="第二步 修改配置文件"></a>第二步 修改配置文件</h2><ol><li><p>修改 <strong>_config.yml</strong> 文件</p></li><li><p>将 <strong>path</strong> 改成弹幕留言的页面名称 <strong>message</strong></p></li><li><p>在 <strong>front_matter:</strong> 下添加 <strong>type: message</strong></p></li><li><p>开启评论 <strong>comment: true</strong></p></li></ol><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">envelope_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">custom_pic:</span></span><br><span class="line">    <span class="attr">cover:</span> <span class="string">/images/violet.jpg</span> <span class="comment">#信笺头部图片</span></span><br><span class="line">    <span class="attr">line:</span> <span class="string">/images/line.png</span> <span class="comment">#信笺底部图片</span></span><br><span class="line">    <span class="attr">beforeimg:</span> <span class="string">/images/before.png</span> <span class="comment"># 信封前半部分</span></span><br><span class="line">    <span class="attr">afterimg:</span> <span class="string">/images/after.png</span> <span class="comment"># 信封后半部分</span></span><br><span class="line">  <span class="attr">message:</span> <span class="comment">#信笺正文，多行文本，写法如下</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">有什么想问的？</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">有什么想说的？</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">有什么想吐槽的？</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">哪怕是有什么想吃的，都可以告诉我哦~</span></span><br><span class="line">  <span class="attr">bottom:</span> <span class="string">自动书记人偶竭诚为您服务！</span> <span class="comment">#仅支持单行文本</span></span><br><span class="line">  <span class="attr">height:</span> <span class="comment">#1050px，信封划出的高度</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">message</span> <span class="comment">#【可选】comments 的路径名称。默认为 comments，生成的页面为 comments/index.html</span></span><br><span class="line">  <span class="attr">front_matter:</span> <span class="comment">#【可选】comments页面的 front_matter 配置</span></span><br><span class="line">    <span class="attr">title:</span> <span class="string">留言板</span></span><br><span class="line">    <span class="attr">comment:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">message</span></span><br></pre></td></tr></table></figure><h2 id="第三步-创建message页面"><a href="#第三步-创建message页面" class="headerlink" title="第三步 创建message页面"></a>第三步 创建message页面</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new page message</span><br></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 留言板</span><br><span class="line">comment: true</span><br><span class="line">type: message</span><br><span class="line">desc: 留言板</span><br><span class="line"><span class="section">date: 2024-11-20 20:55:50</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>效果是这样的，应该是样式有问题，修改一下。</p><h2 id="第四步-修改样式"><a href="#第四步-修改样式" class="headerlink" title="第四步 修改样式"></a>第四步 修改样式</h2><ol><li><p>在 <strong>source</strong> 下新建一个 <strong>custom</strong> 文件夹，再文件夹里新建 <strong>css</strong> 文件夹，在新建 <strong>custom.css</strong> 样式文件，在里面添加以下内容。（不一定要以我为准，在 <strong>source</strong> 新建就可以了， <strong>head</strong> 路径记得改就行）。</p> <figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#form-wrap</span> <span class="selector-class">.no-lightbox</span><span class="selector-class">.entered</span><span class="selector-class">.loaded</span>&#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> auto;</span><br><span class="line">    <span class="attribute">max-width</span>:<span class="number">100%</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>打开主题的配置文件 <strong>_config.solitude.yml</strong> ,在 <b>head:</b> 后插入你的用户css样式文件，以我的为例。</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Extend</span></span><br><span class="line"><span class="comment"># 扩展</span></span><br><span class="line"><span class="attr">extends:</span></span><br><span class="line">  <span class="comment"># Insert in head</span></span><br><span class="line">  <span class="comment"># 插入到 head</span></span><br><span class="line">  <span class="attr">head:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">&lt;link</span> <span class="string">rel=&quot;stylesheet&quot;</span> <span class="string">href=&quot;/custom/css/custom.css&quot;&gt;</span> <span class="comment">#插入这一行</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="第五步-Hexo三连击"><a href="#第五步-Hexo三连击" class="headerlink" title="第五步 Hexo三连击"></a>第五步 Hexo三连击</h2><pre><code><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean &amp;&amp; hexo generate &amp;&amp; hexo server</span><br></pre></td></tr></table></figure></code></pre><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%F0%9F%8D%ADAkilar%E3%81%AE%E7%B3%96%E6%9E%9C%E5%B1%8B,%E4%BF%A1%E7%AC%BA%E6%A0%B7%E5%BC%8F%E7%95%99%E8%A8%80%E6%9D%BF,https://akilar.top/posts/e2d3c450/" title="" target=""></a>]]></content>
    
    
    <summary type="html">Solitude主题魔改。这篇教程详细讲解了如何在Hexo博客中添加信笺样式留言板插件。步骤清晰，代码示例完整，并提供了必要的配置文件修改说明。 尤其值得称赞的是，文章中包含了对每个步骤的详细解释，以及对可能出现问题的提示（例如修改配置文件的注意事项）。 最后还贴心地提醒了Hexo的部署命令和参考链接，方便读者学习和实践。</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="博客折腾" scheme="https://one.blog.418121.xyz/tags/%E5%8D%9A%E5%AE%A2%E6%8A%98%E8%85%BE/"/>
    
    <category term="Solitude" scheme="https://one.blog.418121.xyz/tags/Solitude/"/>
    
  </entry>
  
  <entry>
    <title>2024.11.13</title>
    <link href="https://one.blog.418121.xyz/posts/41d7aa68.html"/>
    <id>https://one.blog.418121.xyz/posts/41d7aa68.html</id>
    <published>2024-11-14T13:20:04.000Z</published>
    <updated>2024-11-25T14:23:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天爬完山有点累😣，lyq还叫我有时间去他那钓鱼，我说来，今天就来了。今天的天阴沉沉的，要下雨又不要下雨的，又走去地铁站🚇。有点倒霉还想找个厕所🚾，没找着公交🚌也刚好走了，又得等半个小时，发现一个南沙大桥🌉。坐到lyq家村口了，他开电动车来接我🐔。发现稻谷熟了🌾，是秋收了，时间过得真快又是一年秋收。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/01.webp" alt="阴天"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/02.webp" alt="南沙大桥"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/03.webp" alt="稻谷"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/04.webp" alt="第一条"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到地方了。他运气太好了，一来他就钓到鱼了🐟，这不太合理啊！我也下竿了🎣，下了两次都挂网了，第三次才成功下。江面波光粼粼啊，还有大雁相伴，江风吹来，真的很巴适。服了他又上鱼了，还是一条非常大的鱼，差不多一只脚那么大。我钓了两个小时毛都没有，今天又当空军了，回家回家。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/05.webp" alt="江面"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/06.webp" alt="大雁"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/07.webp" alt="第二条"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;他送我来公交站，天空好美啊，更像末日来临，紫气东来，沾沾紫气，会更好的。呃，回到家没煮我饭，索性我偷溜出去吃。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/08.webp" alt="公交车上"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/09.webp" alt="末日般"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/14/10.webp" alt="炸酱面"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天就这样。相信你过得也很好吧？期待下次与你再会😊。</p>]]></content>
    
    
    <summary type="html">这篇日记生动地记录了作者与朋友lyq去钓鱼的一天。从阴沉的天气、乘坐地铁和公交的经历，到到达目的地后朋友lyq轻松钓到大鱼而作者却空军，最后以美丽的黄昏和一顿炸酱面结尾，整篇日记充满了生活气息。 作者运用丰富的细节描写，例如“要下雨又不要下雨的”、“江面波光粼粼”、“大雁相伴”、“差不多一只脚那么大”等，将场景和感受栩栩如生地展现出来。 图片的运用也恰到好处，与文字描述相辅相成，增强了读者的代入感。 最后，作者轻松的语气和对未来的期许，也给读者留下了一个温暖而美好的印象。 整篇日记语言流畅自然，读起来轻松愉快，是一篇非常优秀的个人生活记录。</summary>
    
    
    
    <category term="日常" scheme="https://one.blog.418121.xyz/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="玩" scheme="https://one.blog.418121.xyz/tags/%E7%8E%A9/"/>
    
    <category term="与好友" scheme="https://one.blog.418121.xyz/tags/%E4%B8%8E%E5%A5%BD%E5%8F%8B/"/>
    
    <category term="钓鱼" scheme="https://one.blog.418121.xyz/tags/%E9%92%93%E9%B1%BC/"/>
    
  </entry>
  
  <entry>
    <title>2024.11.12</title>
    <link href="https://one.blog.418121.xyz/posts/86799b4c.html"/>
    <id>https://one.blog.418121.xyz/posts/86799b4c.html</id>
    <published>2024-11-13T15:35:15.000Z</published>
    <updated>2024-11-25T15:30:15.000Z</updated>
    
    <content type="html"><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与好友们一起去爬山，本来是昨天出发的，途中有个有事就没去成。我们这次由住的最远的人来选山头，他选了凤凰山，这里要特别关注。我从家里出来，发现今天好晒，一看天气预报今天最高30度，还选了个阳人时间集合，下午两点，晒麻了🥲。坐上地铁了，上车就发现了一个好像初中班长，但又好像不是，不好意思一直盯着别人，我有点脸盲😅。还坐过站了，都怪xjx他一直再聊游戏，幸好没有迟到，说好是两点到，两点三十多也是两点。我们准备打车上去，带头的wzx手机还没有电，叫我打车，但是我一直没人接单，他打到了。到了山脚下，我们一直沿着大马路迎难而上，途中有好多农家乐，有机会尝尝味道，就是斜坡有点斜，爬了一会到了一个平台，吃了点宿舍长的干粮，我是白嫖怪，刚刚lyq还给我们买了水。小歇一会，我们准备继续往上爬，但是越爬越不对劲，因为没路了，上面是个雷达站，但是还是能看到一些风景的，后面一查发现搞错了，广州里有两个凤凰山，一个在天河区，一个在白云区，我们来错地方了，我们因该去天河区那边那个的，wzx背大锅，然后我们在山里到处乱窜，发现一条好长的蜈蚣😨，有个人小胆大的家伙wzx还去踩它。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/01.webp" alt="大太阳"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/02.webp" alt="平台"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/03.webp" alt="雷达站美景"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/04.webp" alt="蜈蚣"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们又回到了刚刚那个平台继续吃着xjx带的干粮，休整一下我们就准备下山了。下山半道遇到个湖挺美的，还发现有人在里面游泳，可惜用手机拍不到，肉眼能看得见。天上太阳都没下山，月亮就已经上来了，我们也商量着下个星期继续爬别的山头，争取爬遍广州。有点运气不好，遇上下班高峰期赌了十几分钟。我们准备商量着去市桥吃个晚饭，这里有个二五仔xjx说要回家吃饭🤯，上地铁的时候被我们孤立了，最搞笑的是，这趟车明明是直达车，他还在珠江新城下车换车了，还问我们怎么不下车，太搞笑了，但是不得不说三号线是真的多人，看这位老伯的手😊。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/05.webp" alt="有个水库"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/06.webp" alt="大白天的月亮"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/07.webp" alt="老伯最后的倔强"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到市桥了，车里的人也跟着下了。我们商量去遇见小面吃面，绕了大半圈终于找到了，但是人好多，我们又在外面等了会发现有位置了，但是有个人，只能搭台了，呃，后面发现后面有张空桌子。很好吃，酸酸的，对于我来说有点过酸了，但是问题不大，好吃就完了。聊了会天，又各奔东西了。我也回家了，给自己买了瓶屌丝饮料和糖，补充能量，爬了个山破两万了步数都快。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/08.webp" alt="遇见小面"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/09.webp" alt="新开站标语"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/10.webp" alt="地上铁"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/11.webp" alt="饮料糖"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/13/12.webp" alt="爬一个就两万步了"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天就这样。相信你过得也很好吧？期待下次与你再会😊。</p>]]></content>
    
    
    <summary type="html">这篇日记记录了作者和朋友们一起爬山的经历。从选择山头、坐地铁、爬山、下山到吃饭和散步，整个过程充满了生活气息。 作者运用了丰富的细节描写，例如“好晒”、“天气预报”、“农家乐”、“雷达站美景”等，将场景和感受栩栩如生地展现出来。 图片的运用也恰到好处，与文字描述相辅相成，增强了读者的代入感。 最后，作者轻松的语气和对未来的期许，也给读者留下了一个温暖而美好的印象。 整篇日记语言流畅自然，读起来轻松愉快，是一篇非常优秀的个人生活记录。</summary>
    
    
    
    <category term="日常" scheme="https://one.blog.418121.xyz/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="爬山" scheme="https://one.blog.418121.xyz/tags/%E7%88%AC%E5%B1%B1/"/>
    
    <category term="玩" scheme="https://one.blog.418121.xyz/tags/%E7%8E%A9/"/>
    
    <category term="与好友" scheme="https://one.blog.418121.xyz/tags/%E4%B8%8E%E5%A5%BD%E5%8F%8B/"/>
    
  </entry>
  
  <entry>
    <title>好像还没写过日常</title>
    <link href="https://one.blog.418121.xyz/posts/c4b51602.html"/>
    <id>https://one.blog.418121.xyz/posts/c4b51602.html</id>
    <published>2024-11-11T10:20:00.000Z</published>
    <updated>2024-11-25T14:20:00.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好像从来都没写过日常，第一次写还不知道怎么写，那就随便写写流水账，记录美好生活。</p><h2 id="2024-11-09"><a href="#2024-11-09" class="headerlink" title="2024.11.09"></a>2024.11.09</h2><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;又跟朋友去打桌球，体验了一把新开的地铁线路，月初刚开通的，上次都没开通，比之前的少转一趟车，速度也快不少，就是去地铁站比较远，没有公交近，也没有公交便宜，不赶时间真得坐公交，经济实惠，可我晕车，那感觉太难受了，要是遇上没有座位就更难受了，有苦硬吃。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;等半天他都没来，真是磨蹭，跟个娘们一样，看到对面有一排共享单车，第一次见那么多共享单车。等了差不多20分钟，终于来了，说去什么超市找牛肉干了，真服了他了，外面很晒有很热，不能相信广东人的转个弯就到。而且今天有点倒霉，自助桌球扫码开台还被球卡住了，还要打电话给店家，重新开台，地方比上次窄多了，出杆都会碰到别人，灯也很低，避雷了。离谱的事情天天有，咋就轮到我们头上了。打了一个小时就感觉累了，他下次提议打一个小时，出去逛一会，再回来再打一个小时，太闷了，最主要的是打又打不进，纯属就是又菜又爱玩。虽说今天是周六但是也挺多放学的学生，是个美好的年纪，可惜我都大学毕业了，怀念以前上学的时候了，没那么多压力，太难找工作了。打了俩个小时，就回去了，他还带我去另外一家新开的自助球馆，这比刚刚那家大多了，环境也好多了，采光也不错，刚刚那间黑麻麻的，真不推荐去。他把我送到地铁站就回家了，我也要回家了。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回家的路上总是美好的，沿途的风景，治愈人心，连风都是轻松愉快的味道。到家了，刚好也吃饭了，没有什么能比得了，路途上遇到美好的风景，与微风拂过，车水马龙，刚好到家吃上热腾腾的饭菜，也算是一种幸福吧。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/11/09/01.webp" alt="共享单车"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/09/02.webp" alt="地铁新开的路线"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/09/03.webp" alt="这可是地上铁"><br><img src="https://images.418121.xyz/file/blog/daily/2024/11/09/04.webp" alt="出站都天黑了"></p>            </div><h2 id="2024-10-31"><a href="#2024-10-31" class="headerlink" title="2024.10.31"></a>2024.10.31</h2><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;十月的最后一天，时间过的真快又是一个月啊。跟朋友出去打台球了，倒霉的一天。还没走到公交车站，就看到它走了。正如《再别康桥》中的“ 轻轻的我走了，正如我轻轻的来；我轻轻的招手，作别西天的云彩。 ”神马都是浮云，下一趟车30分钟，思虑再三还是去地铁吧，毕竟还要赶着回来吃晚饭，这太阳真毒啊！这地方好大啊，但没什么人，刚来就是包场，还是挺不错的，环境好了，更有兴致打桌球了，打了两个小时，就撤了，让他送我去公交站，车刚走，啧，刚刚没事先看有没有车了，又等了二十分钟，倒霉透了，但是还好风景还是很不错的。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/01.webp" alt="这应该是黄编牌坊吧"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/02.webp" alt="夕阳"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/03.webp" alt="也不知道自己再拍什么"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/04.webp" alt="不知道什么花"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/05.webp" alt="金黄的"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/06.webp" alt="生在国旗下"></p>            </div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;快到家的时候给自己买了糖和肥宅水，果然甜食使人的多巴胺分泌更多啊，心情都愉悦很多。晚上把我之前摔烂的屏幕换一下，是排线断了，换个一排线还不如换一个屏幕。途中差点把主板短接了，都冒火花了，换屏幕技能+1，虽然是出线屏幕，又不是不能用，其实就是买不起新的。</p><div class="gallery ">              <p><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/07.webp" alt="糖和肥宅水"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/08.webp" alt="测试"><br><img src="https://images.418121.xyz/file/blog/daily/2024/10/31/09.webp" alt="排线断了"></p>            </div><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样写就差不多了，反正不会，随心所欲好了，自己喜欢就好。</p>]]></content>
    
    
    <summary type="html">这篇日记以流水账的形式记录了作者在10月31日和11月9日两天与朋友打台球的经历，并穿插了一些生活细节和感悟。 文章语言轻松活泼，真实地展现了作者的日常生活。 作者细致地描写了交通工具的选择、等待朋友的焦急、打台球的感受以及回家的心情，展现了作者细腻的内心世界。 同时，作者也表达了对时间流逝的感叹、对过去生活的怀念以及对美好事物的珍惜。 图片的运用虽然没有在正文中体现，但从提供的标题可以推测出它们与日记内容相符，增强了文章的感染力。 文章结尾处作者对写作方式的自我调侃，也体现了作者随性洒脱的性格。 总而言之，这是一篇轻松愉快、充满生活气息的日记，读起来让人感到亲切自然。</summary>
    
    
    
    <category term="日常" scheme="https://one.blog.418121.xyz/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="玩" scheme="https://one.blog.418121.xyz/tags/%E7%8E%A9/"/>
    
    <category term="与好友" scheme="https://one.blog.418121.xyz/tags/%E4%B8%8E%E5%A5%BD%E5%8F%8B/"/>
    
    <category term="桌球" scheme="https://one.blog.418121.xyz/tags/%E6%A1%8C%E7%90%83/"/>
    
  </entry>
  
  <entry>
    <title>给自己的网站加上Do you like me 小组件</title>
    <link href="https://one.blog.418121.xyz/posts/c88f8d39.html"/>
    <id>https://one.blog.418121.xyz/posts/c88f8d39.html</id>
    <published>2024-11-06T06:24:39.000Z</published>
    <updated>2026-03-25T05:38:39.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>逛博客的时候发现一个很好玩的小组件Do you like me ，折腾半天才发现问题所在有感而发写下此文字，绝对不是水文&#96;(<em>&gt;﹏&lt;</em>)′。具体功能可在我的 <strong>侧边栏</strong> 点击体验~</p><h2 id="第一步"><a href="#第一步" class="headerlink" title="第一步"></a>第一步</h2><p><a href="https://github.com/5ime/likeMe">打开项目地址</a> 按照教程做就可以了，看多几次就会了，是不是很简单 (￣y▽,￣)╭ （<a href="#%E6%9C%AC%E6%96%87%E5%8F%82%E8%80%83">参考文章里有PHP版本</a>）</p><div class="collapse-box-control">    <div class="collapse-box-header"><div class="collapse-box-icon"><i class="fa fa-plus"></i></div><span>看不会来参考我的教程</span></div>    <div class="collapse-box-content"><div class="inner">        <h3 id="1-登录-或-注册-LeanCloud-国际版-并进入控制台"><a href="#1-登录-或-注册-LeanCloud-国际版-并进入控制台" class="headerlink" title="1. 登录 或 注册 LeanCloud 国际版 并进入控制台"></a>1. <a href="https://console.leancloud.app/login">登录</a> 或 <a href="https://console.leancloud.app/register">注册</a> LeanCloud 国际版 并进入<a href="https://console.leancloud.app/apps">控制台</a></h3><p><img src="https://images.418121.xyz/file/blog/play/01/01.webp" alt="注册登录"></p><h3 id="2-点击右上角创建应用起一个你喜欢的名字，最好选免费的开发版。"><a href="#2-点击右上角创建应用起一个你喜欢的名字，最好选免费的开发版。" class="headerlink" title="2. 点击右上角创建应用起一个你喜欢的名字，最好选免费的开发版。"></a>2. 点击右上角创建应用起一个你喜欢的名字，最好选免费的开发版。</h3><p><img src="https://images.418121.xyz/file/blog/play/01/02.webp" alt="创建应用"></p><h3 id="3-创建Class，-likeCount-。"><a href="#3-创建Class，-likeCount-。" class="headerlink" title="3. 创建Class， likeCount 。"></a>3. 创建Class， likeCount 。</h3><p><img src="https://images.418121.xyz/file/blog/play/01/03.webp" alt="创建likeCount"></p><h3 id="4-在Class-likeCount里面新建一行。"><a href="#4-在Class-likeCount里面新建一行。" class="headerlink" title="4. 在Class likeCount里面新建一行。"></a>4. 在Class likeCount里面新建一行。</h3><p><img src="https://images.418121.xyz/file/blog/play/01/04.webp" alt="在likeCount里新建一行"></p><h3 id="5-创建Class，-likeUser-。"><a href="#5-创建Class，-likeUser-。" class="headerlink" title="5. 创建Class， likeUser 。"></a>5. 创建Class， likeUser 。</h3><p><img src="https://images.418121.xyz/file/blog/play/01/05.webp" alt="创建likeUser"></p><h3 id="6-到vercel部署，不想写了，教程说的很明白。"><a href="#6-到vercel部署，不想写了，教程说的很明白。" class="headerlink" title="6. 到vercel部署，不想写了，教程说的很明白。"></a>6. 到vercel部署，不想写了，教程说的很明白。</h3><p><img src="https://images.418121.xyz/file/blog/play/01/06.webp" alt="到vercel部署"><br><img src="https://images.418121.xyz/file/blog/play/01/07.webp" alt="create"><br><img src="https://images.418121.xyz/file/blog/play/01/08.webp" alt="加变量，注意区分大小写，加完重新Redeploy"><br><img src="https://images.418121.xyz/file/blog/play/01/09.webp" alt="加域名就可以了，不加国内访问不了"></p><h3 id="7-在你的博客上引入html，就完成了。"><a href="#7-在你的博客上引入html，就完成了。" class="headerlink" title="7. 在你的博客上引入html，就完成了。"></a>7. 在你的博客上引入html，就完成了。</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;div id=&quot;likeme&quot;&gt;</span><br><span class="line">    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://unpkg.com/@5ime/likeme@1.0.1/static/css/likeme.css&quot;&gt;</span><br><span class="line">    &lt;script src=&quot;https://unpkg.com/@5ime/likeme@1.0.1/static/js/likeme.js&quot;&gt;&lt;/script&gt;</span><br><span class="line">    &lt;script&gt;new limeMe(&#123; el: &quot;#likeme&quot;, serverURL: &quot;https://your-domain.vercel.app&quot;, color: &quot;#ff4e6ae6&quot; &#125;)&lt;/script&gt;</span><br><span class="line">&lt;/div&gt;</span><br></pre></td></tr></table></figure>     </div></div>    </div><h2 id="第二步"><a href="#第二步" class="headerlink" title="第二步"></a>第二步</h2><h3 id="1-没有数据，异常。"><a href="#1-没有数据，异常。" class="headerlink" title="1. 没有数据，异常。"></a>1. 没有数据，异常。</h3><p><img src="https://images.418121.xyz/file/blog/play/01/10.webp" alt="而前端你怎么点都不行"><br>这时候应该怎么办呢，我们去到LeanCloud里面，添加一列 count 。<br><img src="https://images.418121.xyz/file/blog/play/01/11.webp" alt="添加后回去刷新"><br><img src="https://images.418121.xyz/file/blog/play/01/12.webp" alt="有数据了"></p><h3 id="2-通常会出现acl没有权限这种，该怎么办呢？"><a href="#2-通常会出现acl没有权限这种，该怎么办呢？" class="headerlink" title="2. 通常会出现acl没有权限这种，该怎么办呢？"></a>2. 通常会出现acl没有权限这种，该怎么办呢？</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Failed to create new object, with error message: Forbidden to add new fields by class &#x27;likeUser&#x27; permissions. [403 POST https://yjqopchz.api.lncldglobal.com/1.1/classes/likeUser]</span><br></pre></td></tr></table></figure><p>简单粗暴的方法把所有ACL权限全部改成所有用户，再去点一下奇迹发生了。<br><img src="https://images.418121.xyz/file/blog/play/01/13.webp" alt="修改ACL"><br><img src="https://images.418121.xyz/file/blog/play/01/14.webp" alt="已经成功了"><br>然后怎么办？再把ACL改回去看看？再去试试？<br><img src="https://images.418121.xyz/file/blog/play/01/14.webp" alt="也是一样的效果"></p><h3 id="3-通常来说点一次就应该-1点第二次的时候就应该是，你的爱意已经收到啦"><a href="#3-通常来说点一次就应该-1点第二次的时候就应该是，你的爱意已经收到啦" class="headerlink" title="3. 通常来说点一次就应该+1点第二次的时候就应该是，你的爱意已经收到啦~"></a>3. 通常来说点一次就应该+1点第二次的时候就应该是，你的爱意已经收到啦~</h3><p>我们右键打开检查或审查元素，发现点第二次的时候是报以下错，我们应该怎么办？</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Uncaught TypeError: Cannot read properties of undefined (reading &#x27;count&#x27;)</span><br><span class="line">    at xhr.onreadystatechange (likeme.js:1:1009)</span><br></pre></td></tr></table></figure><p>其实也很简单我们去问一下AI这句话是什么意思，AI给出以下回答，</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">问题分析</span><br><span class="line">错误信息 Uncaught TypeError: Cannot read properties of undefined (reading &#x27;count&#x27;) 表示在 likeme.js 文件的第 1 行，大约第 1009 个字符处，你试图访问一个未定义对象的 count 属性。这个错误发生在 xhr.onreadystatechange 函数中。</span><br><span class="line">可能的原因</span><br><span class="line">1. 服务器返回的数据不正确：服务器可能没有返回预期的 JSON 数据，或者返回的数据中没有 count 属性。</span><br><span class="line">2. 数据解析失败：即使服务器返回了数据，你的代码可能未能正确解析 JSON 数据。</span><br><span class="line">3. 异步操作的时机：如果 count 属性依赖于其他异步操作的结果，确保在访问 count 属性之前，这些异步操作已经完成。</span><br></pre></td></tr></table></figure><p>怎么办呢？那我们去检查以下返回数据到底有什么，接下来我们直接使用 地址&#x2F;like去检查一下。<br><img src="https://images.418121.xyz/file/blog/play/01/15.webp" alt="发现问题了"><br>结合俩次刷新，发现了一个是带count的数据，一个是不带的，符合AI给出来的第一点原因。发现问题了，我们该怎么解决问题？我们去到GitHub找自己的仓库。<br><img src="https://images.418121.xyz/file/blog/play/01/16.webp" alt="找找源代码"><br>看看源代码，找一下原因。发现代码第50行，跟问题是一样的所以我们修改一下,然后保存等待vercel的重新部署。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">const data = <span class="punctuation">&#123;</span>code<span class="punctuation">:</span> &#x27;<span class="number">201</span>&#x27;<span class="punctuation">,</span> msg<span class="punctuation">:</span> &#x27;error&#x27;<span class="punctuation">,</span> data<span class="punctuation">:</span> <span class="punctuation">&#123;</span>count<span class="punctuation">:</span> &#x27;你的爱意已经收到啦~&#x27;<span class="punctuation">&#125;</span><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/play/01/17.webp" alt="修改"><br>这时候我们再去试试，看看是什么效果。<br><img src="https://images.418121.xyz/file/blog/play/01/18.webp" alt="成功"><br>至此，我们可以欢呼了，我们成功了。</p><h3 id="4-html引入代码是有少量缺少的，可以用我的代码，记得更改serverURL，color也是可以改的你喜欢就好。"><a href="#4-html引入代码是有少量缺少的，可以用我的代码，记得更改serverURL，color也是可以改的你喜欢就好。" class="headerlink" title="4. html引入代码是有少量缺少的，可以用我的代码，记得更改serverURL，color也是可以改的你喜欢就好。"></a>4. html引入代码是有少量缺少的，可以用我的代码，记得更改serverURL，color也是可以改的你喜欢就好。</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://unpkg.com/@5ime/likeme@latest/static/css/likeme.css&quot;</span> /&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://unpkg.com/@5ime/likeme@latest/static/js/likeme.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</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;likeme&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">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="title function_">likeMe</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="attr">el</span>: <span class="string">&#x27;#likeme&#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 class="comment">// 替换为你的服务端地址，结尾勿带 /</span></span></span><br><span class="line"><span class="language-javascript">        <span class="attr">color</span>: <span class="string">&#x27;#ff9797&#x27;</span> <span class="comment">// 可选：自定义主题颜色</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></pre></td></tr></table></figure><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>至此，教程结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p><h2 id="本文参考"><a href="#本文参考" class="headerlink" title="本文参考"></a>本文参考</h2><a href="%E5%B0%8F%E7%BB%84%E4%BB%B6,https://5ime.cn/doyoulikeme.html" title="" target="">I Am I,为你的网站添加 Do you like me</a><a href="yuang01,%E4%BE%A7%E8%BE%B9%E6%A0%8F,https://hexo-theme-bamboo.netlify.app/post/hexo-theme-bamboo/sidebar/" title="" target=""></a><p><a href="https://github.com/5ime/likeMe">https://github.com/5ime/likeMe</a></p>]]></content>
    
    
    <summary type="html">详细介绍了如何在博客中添加一个名为“Do you like me”的小组件。文章从开始到结束都很流畅，步骤清晰，语言通顺。文章主要讲述了四个步骤：添加数据、解决_acl_权限问题、解决点赞次数显示错误、解决html引入代码缺少问题。在文章中，你提供了很多有用的信息和解决方案，帮助读者解决可能遇到的问题。文章的最后，你还提供了一些参考资源和联系方式，方便读者获取更多信息。总的来说，这篇文章写得非常好，非常有用。</summary>
    
    
    
    <category term="折腾" scheme="https://one.blog.418121.xyz/categories/%E6%8A%98%E8%85%BE/"/>
    
    
    <category term="Hexo" scheme="https://one.blog.418121.xyz/tags/Hexo/"/>
    
    <category term="Node" scheme="https://one.blog.418121.xyz/tags/Node/"/>
    
    <category term="Vercel" scheme="https://one.blog.418121.xyz/tags/Vercel/"/>
    
    <category term="博客折腾" scheme="https://one.blog.418121.xyz/tags/%E5%8D%9A%E5%AE%A2%E6%8A%98%E8%85%BE/"/>
    
  </entry>
  
  <entry>
    <title>网站数据库中表的设计</title>
    <link href="https://one.blog.418121.xyz/posts/a6b9660e.html"/>
    <id>https://one.blog.418121.xyz/posts/a6b9660e.html</id>
    <published>2024-10-15T06:24:39.000Z</published>
    <updated>2024-11-25T14:38:39.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="商品管理网站——基于PHP的动态网站设计与实现"><a href="#商品管理网站——基于PHP的动态网站设计与实现" class="headerlink" title="商品管理网站——基于PHP的动态网站设计与实现"></a>商品管理网站——基于PHP的动态网站设计与实现</h2><p>&nbsp;&nbsp;&nbsp;&nbsp;在网站开发中，数据库的功能是用于存储和处理数据，根据我的商品管理网站需求，设计若干数据表用于存储商品的基本信息。本网站数据表如 <strong>表1.1</strong> 所示。</p><table width="1108" border="0" cellpadding="0" cellspacing="0" style='width:831.00pt;border-collapse:collapse;table-layout:fixed;'>   <col width="127" style='mso-width-source:userset;mso-width-alt:4064;'/>   <col width="69" style='mso-width-source:userset;mso-width-alt:2208;'/>   <col width="154" style='mso-width-source:userset;mso-width-alt:4928;'/>   <col width="200" style='mso-width-source:userset;mso-width-alt:6400;'/>   <col width="199" style='mso-width-source:userset;mso-width-alt:6368;'/>   <col width="359" style='mso-width-source:userset;mso-width-alt:11488;'/>   <tr height="33.33" style='height:25.00pt;mso-height-source:userset;mso-height-alt:500;'>    <td class="xl65" height="33.33" width="127" style='height:25.00pt;width:95.25pt;' x:str>功能</td>    <td class="xl66" width="69" style='width:51.75pt;' x:str>表名</td>    <td class="xl67" width="912" colspan="4" style='width:684.00pt;border-right:none;border-bottom:1.0pt solid #000000;' x:str>表结构</td>   </tr>   <tr height="29.33" style='height:22.00pt;mso-height-source:userset;mso-height-alt:440;'>    <td class="xl69" height="218.33" rowspan="8" style='height:163.75pt;border-right:1.0pt solid #000000;border-bottom:none;' x:str>用户信息表</td>    <td class="xl70" rowspan="8" style='border-right:1.0pt solid windowtext;border-bottom:none;' x:str>users</td>    <td class="xl71" x:str>字段名称</td>    <td class="xl72" x:str>字段类型</td>    <td class="xl72" x:str>字段大小</td>    <td class="xl72" x:str>注释</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>id</td>    <td class="xl72" x:str>int</td>    <td class="xl75" x:num>11</td>    <td class="xl72" x:str>用户编号（主键，自增）</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>username</td>    <td class="xl72" x:str>varchar</td>    <td class="xl75" x:num>50</td>    <td class="xl72" x:str>用户名（唯一）</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>password</td>    <td class="xl72" x:str>varchar</td>    <td class="xl75" x:num>50</td>    <td class="xl76" x:str>用户密码</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>usertype</td>    <td class="xl72" x:str>varchar</td>    <td class="xl75" x:num>50</td>    <td class="xl76" x:str>用户类型</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>usertell</td>    <td class="xl72" x:str>bigint</td>    <td class="xl75" x:num>11</td>    <td class="xl76" x:str>电话号码</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>usermail</td>    <td class="xl72" x:str>varchar</td>    <td class="xl75" x:num>50</td>    <td class="xl76" x:str>邮箱地址</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl71" x:str>create_time</td>    <td class="xl72" x:str>datetime</td>    <td class="xl75"></td>    <td class="xl76" x:str>添加时间</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl73" height="27" style='height:20.25pt;'></td>    <td class="xl74"></td>    <td class="xl77"></td>    <td class="xl75"></td>    <td class="xl75"></td>    <td class="xl75"></td>   </tr>   <tr height="32" style='height:24.00pt;mso-height-source:userset;mso-height-alt:480;'>    <td class="xl69" height="195" rowspan="7" style='height:146.25pt;border-right:1.0pt solid #000000;border-bottom:none;' x:str>用户信息表</td>    <td class="xl70" rowspan="7" style='border-right:1.0pt solid windowtext;border-bottom:none;' x:str>shops</td>    <td class="xl71" x:str>字段名称</td>    <td class="xl72" x:str>字段类型</td>    <td class="xl72" x:str>字段大小</td>    <td class="xl72" x:str>注释</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl78" x:str>id</td>    <td class="xl76" x:str>int</td>    <td class="xl79" x:num>11</td>    <td class="xl76" x:str>商品编号（主键，自增）</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl78" x:str>shopname</td>    <td class="xl76" x:str>vharchar</td>    <td class="xl79" x:num>100</td>    <td class="xl76" x:str>商品名（唯一）</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl78" x:str>shopprice</td>    <td class="xl76" x:str>int</td>    <td class="xl79" x:num>11</td>    <td class="xl76" x:str>商品价格</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl78" x:str>shoptotal</td>    <td class="xl76" x:str>int</td>    <td class="xl79" x:num>11</td>    <td class="xl76" x:str>商品库存</td>   </tr>   <tr height="27" style='height:20.25pt;'>    <td class="xl78" x:str>shoptext</td>    <td class="xl76" x:str>text</td>    <td class="xl79"></td>    <td class="xl76" x:str>商品备注</td>   </tr>   <tr height="28" style='height:21.00pt;'>    <td class="xl80" x:str>create_time</td>    <td class="xl81" x:str>datetime</td>    <td class="xl82"></td>    <td class="xl81" x:str>添加时间</td>   </tr>   <tr height="19" style='height:14.25pt;'>    <td height="19" colspan="6" style='height:14.25pt;mso-ignore:colspan;'></td>   </tr>   <![if supportMisalignedColumns]>    <tr width="0" style='display:none;'>     <td width="127" style='width:95;'></td>     <td width="69" style='width:52;'></td>     <td width="154" style='width:116;'></td>     <td width="200" style='width:150;'></td>     <td width="199" style='width:149;'></td>     <td width="359" style='width:269;'></td>    </tr>   <![endif]>  </table><center>表1.1 网站数据表</center>]]></content>
    
    
    <summary type="html">提供了一个商品管理网站的数据表设计，包括用户信息表和商品信息表。</summary>
    
    
    
    <category term="毕业设计" scheme="https://one.blog.418121.xyz/categories/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="数据库" scheme="https://one.blog.418121.xyz/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="开发语言" scheme="https://one.blog.418121.xyz/tags/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/"/>
    
    <category term="MySql" scheme="https://one.blog.418121.xyz/tags/MySql/"/>
    
    <category term="PHP" scheme="https://one.blog.418121.xyz/tags/PHP/"/>
    
  </entry>
  
  <entry>
    <title>听山河把春风酿成千言万语吹过旧人故里</title>
    <link href="https://one.blog.418121.xyz/posts/a1bae895.html"/>
    <id>https://one.blog.418121.xyz/posts/a1bae895.html</id>
    <published>2024-10-15T01:54:18.000Z</published>
    <updated>2024-11-25T14:54:18.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/10/15/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/10/15/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/10/15/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/10/15/04.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/10/15/05.webp"></p><p> 2022-09-05</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/10/15/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/10</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="随手拍天空" scheme="https://one.blog.418121.xyz/tags/%E9%9A%8F%E6%89%8B%E6%8B%8D%E5%A4%A9%E7%A9%BA/"/>
    
  </entry>
  
  <entry>
    <title>网站页面规划设计</title>
    <link href="https://one.blog.418121.xyz/posts/b176c73c.html"/>
    <id>https://one.blog.418121.xyz/posts/b176c73c.html</id>
    <published>2024-09-26T12:39:49.000Z</published>
    <updated>2024-11-25T14:39:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="商品管理网站——基于PHP的动态网站设计与实现"><a href="#商品管理网站——基于PHP的动态网站设计与实现" class="headerlink" title="商品管理网站——基于PHP的动态网站设计与实现"></a>商品管理网站——基于PHP的动态网站设计与实现</h2><p>&nbsp;&nbsp;&nbsp;&nbsp;商品管理网站分管理员登录、用户登录两部分，其中 <strong>dl.html</strong> 是网站的首页。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;本网站共有18个页面，各个页面的名称和对应的功能如 <strong>表1.1</strong> 所示。</p><table><thead><tr><th align="center">页面</th><th align="center">功能</th></tr></thead><tbody><tr><td align="center">index.php</td><td align="center">个人中心</td></tr><tr><td align="center">user.php</td><td align="center">用户管理</td></tr><tr><td align="center">shop.php</td><td align="center">商品管理</td></tr><tr><td align="center">dl.php</td><td align="center">登录调用PHP代码验证</td></tr><tr><td align="center">zc.php</td><td align="center">注册调用PHP代码验证</td></tr><tr><td align="center">tc.php</td><td align="center">退出时调用PHP代码</td></tr><tr><td align="center">search.php</td><td align="center">搜索时调用PHP代码并显示</td></tr><tr><td align="center">add_shop.php</td><td align="center">添加商品</td></tr><tr><td align="center">add_user.php</td><td align="center">添加用户</td></tr><tr><td align="center">del_shop.php</td><td align="center">删除商品时调用的PHP代码</td></tr><tr><td align="center">del_user.php</td><td align="center">删除用户时调用的PHP代码</td></tr><tr><td align="center">edit_shop.php</td><td align="center">编辑商品</td></tr><tr><td align="center">edit_user.php</td><td align="center">编辑用户</td></tr><tr><td align="center">edit_people.php</td><td align="center">编辑个人信息</td></tr><tr><td align="center">config.php</td><td align="center">数据库信息</td></tr><tr><td align="center">con.php</td><td align="center">连接数据库</td></tr><tr><td align="center">dl.html</td><td align="center">登录</td></tr><tr><td align="center">zc.html</td><td align="center">注册</td></tr></tbody></table><center>表1.1 页面的名称和对应的功能</center>]]></content>
    
    
    <summary type="html">这份表格列出了商品管理网站的页面及其功能，清晰地展现了网站的结构。</summary>
    
    
    
    <category term="毕业设计" scheme="https://one.blog.418121.xyz/categories/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="数据库" scheme="https://one.blog.418121.xyz/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="开发语言" scheme="https://one.blog.418121.xyz/tags/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/"/>
    
    <category term="MySql" scheme="https://one.blog.418121.xyz/tags/MySql/"/>
    
    <category term="PHP" scheme="https://one.blog.418121.xyz/tags/PHP/"/>
    
  </entry>
  
  <entry>
    <title>你出现又幻灭是错觉</title>
    <link href="https://one.blog.418121.xyz/posts/d5e23d44.html"/>
    <id>https://one.blog.418121.xyz/posts/d5e23d44.html</id>
    <published>2024-09-25T12:17:10.000Z</published>
    <updated>2024-11-25T14:17:10.000Z</updated>
    
    <content type="html"><![CDATA[<iframe width="100%" height="800" src="//player.bilibili.com/player.html?isOutside=true&aid=113198191612492&bvid=BV1WtxgeREJH&cid=26001803564&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><p> 2023-08-18</p>]]></content>
    
    
      
      
    <summary type="html">&lt;iframe width=&quot;100%&quot; height=&quot;800&quot; src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;aid=113198191612492&amp;bvid=BV1WtxgeREJH&amp;cid=2600180356</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="延时摄影" scheme="https://one.blog.418121.xyz/tags/%E5%BB%B6%E6%97%B6%E6%91%84%E5%BD%B1/"/>
    
    <category term="日出" scheme="https://one.blog.418121.xyz/tags/%E6%97%A5%E5%87%BA/"/>
    
  </entry>
  
  <entry>
    <title>网站功能设计</title>
    <link href="https://one.blog.418121.xyz/posts/c65c243b.html"/>
    <id>https://one.blog.418121.xyz/posts/c65c243b.html</id>
    <published>2024-08-16T21:50:06.000Z</published>
    <updated>2024-11-25T14:50:06.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="商品管理网站——基于PHP的动态网站设计与实现"><a href="#商品管理网站——基于PHP的动态网站设计与实现" class="headerlink" title="商品管理网站——基于PHP的动态网站设计与实现"></a>商品管理网站——基于PHP的动态网站设计与实现</h2><p>&nbsp;&nbsp;&nbsp;&nbsp;根据我的设计，本网站分为管理员登录、用户管理模块。网站模块功能结构图如图3.1所示。</p><p><img src="https://images.418121.xyz/file/blog/study/graduate/02/01.webp" alt="图3.1 网站模块功能结构图"></p><ol><li><p>管理员模块：系统设一名管理员，日后可添加，为确保系统的安全性，管理员通过输入用户名、密码进入系统。本模块具有对管理员信息修改、对用户的权限修改、添加用户、修改用户、删除用户、搜索用户功能。</p></li><li><p>用户模块：用户可通过注册模块然后进行登录，本模块具有对用户个人信息修、商品的添加、商品的修改、商品的删除、商品的搜索的功能，用户模块是本网站的核心。</p></li></ol>]]></content>
    
    
    <summary type="html">展示了一个清晰的网站模块功能结构图，将网站功能划分为管理员模块和用户模块，并详细描述了每个模块的功能。</summary>
    
    
    
    <category term="毕业设计" scheme="https://one.blog.418121.xyz/categories/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="数据库" scheme="https://one.blog.418121.xyz/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="开发语言" scheme="https://one.blog.418121.xyz/tags/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/"/>
    
    <category term="MySql" scheme="https://one.blog.418121.xyz/tags/MySql/"/>
    
    <category term="PHP" scheme="https://one.blog.418121.xyz/tags/PHP/"/>
    
  </entry>
  
  <entry>
    <title>•ᴗ•</title>
    <link href="https://one.blog.418121.xyz/posts/c0331bf1.html"/>
    <id>https://one.blog.418121.xyz/posts/c0331bf1.html</id>
    <published>2024-07-20T13:18:16.000Z</published>
    <updated>2024-11-25T14:18:16.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/20/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/20/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/20/03.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/20/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="这个夏天" scheme="https://one.blog.418121.xyz/tags/%E8%BF%99%E4%B8%AA%E5%A4%8F%E5%A4%A9/"/>
    
    <category term="我怕来者不是你" scheme="https://one.blog.418121.xyz/tags/%E6%88%91%E6%80%95%E6%9D%A5%E8%80%85%E4%B8%8D%E6%98%AF%E4%BD%A0/"/>
    
    <category term="发呆" scheme="https://one.blog.418121.xyz/tags/%E5%8F%91%E5%91%86/"/>
    
    <category term="学校" scheme="https://one.blog.418121.xyz/tags/%E5%AD%A6%E6%A0%A1/"/>
    
  </entry>
  
  <entry>
    <title>相机喜欢镜头前的每一个故事</title>
    <link href="https://one.blog.418121.xyz/posts/49a9abe.html"/>
    <id>https://one.blog.418121.xyz/posts/49a9abe.html</id>
    <published>2024-07-19T13:20:29.000Z</published>
    <updated>2024-11-25T14:20:29.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/19/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/19/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/19/03.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/19/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="囍" scheme="https://one.blog.418121.xyz/tags/%E5%9B%8D/"/>
    
    <category term="随拍" scheme="https://one.blog.418121.xyz/tags/%E9%9A%8F%E6%8B%8D/"/>
    
    <category term="相机喜欢的镜头前的每一个故事" scheme="https://one.blog.418121.xyz/tags/%E7%9B%B8%E6%9C%BA%E5%96%9C%E6%AC%A2%E7%9A%84%E9%95%9C%E5%A4%B4%E5%89%8D%E7%9A%84%E6%AF%8F%E4%B8%80%E4%B8%AA%E6%95%85%E4%BA%8B/"/>
    
    <category term="每一帧都是热爱" scheme="https://one.blog.418121.xyz/tags/%E6%AF%8F%E4%B8%80%E5%B8%A7%E9%83%BD%E6%98%AF%E7%83%AD%E7%88%B1/"/>
    
  </entry>
  
  <entry>
    <title>白茶记异品，天曹玉玲珑</title>
    <link href="https://one.blog.418121.xyz/posts/cd128a1f.html"/>
    <id>https://one.blog.418121.xyz/posts/cd128a1f.html</id>
    <published>2024-07-18T15:13:00.000Z</published>
    <updated>2024-11-25T14:13:00.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/18/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/18/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/18/03.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/18/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="白山茶" scheme="https://one.blog.418121.xyz/tags/%E7%99%BD%E5%B1%B1%E8%8C%B6/"/>
    
    <category term="爬山" scheme="https://one.blog.418121.xyz/tags/%E7%88%AC%E5%B1%B1/"/>
    
    <category term="这个夏天" scheme="https://one.blog.418121.xyz/tags/%E8%BF%99%E4%B8%AA%E5%A4%8F%E5%A4%A9/"/>
    
  </entry>
  
  <entry>
    <title>岁月的年轮，再诚恳。也渡不过红尘《宿命》</title>
    <link href="https://one.blog.418121.xyz/posts/5d7b2f41.html"/>
    <id>https://one.blog.418121.xyz/posts/5d7b2f41.html</id>
    <published>2024-07-17T09:42:43.000Z</published>
    <updated>2024-11-25T14:42:43.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/17/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/17/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/17/03.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/17/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="年轮" scheme="https://one.blog.418121.xyz/tags/%E5%B9%B4%E8%BD%AE/"/>
    
    <category term="跌落暮色" scheme="https://one.blog.418121.xyz/tags/%E8%B7%8C%E8%90%BD%E6%9A%AE%E8%89%B2/"/>
    
  </entry>
  
  <entry>
    <title>云朵偷喝了酒，于是映红了半边天。</title>
    <link href="https://one.blog.418121.xyz/posts/36c511f0.html"/>
    <id>https://one.blog.418121.xyz/posts/36c511f0.html</id>
    <published>2024-07-16T06:24:28.000Z</published>
    <updated>2024-11-25T14:24:28.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/16/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/16/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/16/03.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/16/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="治愈系风景" scheme="https://one.blog.418121.xyz/tags/%E6%B2%BB%E6%84%88%E7%B3%BB%E9%A3%8E%E6%99%AF/"/>
    
    <category term="夏日晚风" scheme="https://one.blog.418121.xyz/tags/%E5%A4%8F%E6%97%A5%E6%99%9A%E9%A3%8E/"/>
    
  </entry>
  
  <entry>
    <title>用太多的精力因为上天自有安排</title>
    <link href="https://one.blog.418121.xyz/posts/341932d6.html"/>
    <id>https://one.blog.418121.xyz/posts/341932d6.html</id>
    <published>2024-07-15T15:11:52.000Z</published>
    <updated>2024-11-25T14:11:52.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/15/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/15/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/15/03.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/15/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="山楂树之恋" scheme="https://one.blog.418121.xyz/tags/%E5%B1%B1%E6%A5%82%E6%A0%91%E4%B9%8B%E6%81%8B/"/>
    
    <category term="治愈系风景" scheme="https://one.blog.418121.xyz/tags/%E6%B2%BB%E6%84%88%E7%B3%BB%E9%A3%8E%E6%99%AF/"/>
    
    <category term="随手拍天空" scheme="https://one.blog.418121.xyz/tags/%E9%9A%8F%E6%89%8B%E6%8B%8D%E5%A4%A9%E7%A9%BA/"/>
    
  </entry>
  
  <entry>
    <title>我一脚踏空，我就要飞起来了。</title>
    <link href="https://one.blog.418121.xyz/posts/fca7246b.html"/>
    <id>https://one.blog.418121.xyz/posts/fca7246b.html</id>
    <published>2024-07-14T12:16:25.000Z</published>
    <updated>2024-11-25T14:16:25.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/05.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/06.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/07.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/14/05.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="今天的天空特别美" scheme="https://one.blog.418121.xyz/tags/%E4%BB%8A%E5%A4%A9%E7%9A%84%E5%A4%A9%E7%A9%BA%E7%89%B9%E5%88%AB%E7%BE%8E/"/>
    
    <category term="撒野" scheme="https://one.blog.418121.xyz/tags/%E6%92%92%E9%87%8E/"/>
    
    <category term="乡野田间" scheme="https://one.blog.418121.xyz/tags/%E4%B9%A1%E9%87%8E%E7%94%B0%E9%97%B4/"/>
    
  </entry>
  
  <entry>
    <title>日落是永远拍不完的浪漫</title>
    <link href="https://one.blog.418121.xyz/posts/86472eb5.html"/>
    <id>https://one.blog.418121.xyz/posts/86472eb5.html</id>
    <published>2024-07-13T16:21:11.000Z</published>
    <updated>2024-11-25T14:21:11.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/14/04.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/14/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="今天的天空特别美" scheme="https://one.blog.418121.xyz/tags/%E4%BB%8A%E5%A4%A9%E7%9A%84%E5%A4%A9%E7%A9%BA%E7%89%B9%E5%88%AB%E7%BE%8E/"/>
    
    <category term="奇妙能力歌" scheme="https://one.blog.418121.xyz/tags/%E5%A5%87%E5%A6%99%E8%83%BD%E5%8A%9B%E6%AD%8C/"/>
    
    <category term="落日余晖晚霞一抹夕阳美如画" scheme="https://one.blog.418121.xyz/tags/%E8%90%BD%E6%97%A5%E4%BD%99%E6%99%96%E6%99%9A%E9%9C%9E%E4%B8%80%E6%8A%B9%E5%A4%95%E9%98%B3%E7%BE%8E%E5%A6%82%E7%94%BB/"/>
    
  </entry>
  
  <entry>
    <title>风吹过我的头发</title>
    <link href="https://one.blog.418121.xyz/posts/77d693d0.html"/>
    <id>https://one.blog.418121.xyz/posts/77d693d0.html</id>
    <published>2024-07-13T16:10:02.000Z</published>
    <updated>2024-11-25T14:10:02.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/05.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/06.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/07.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/13/05.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="今天的天空特别美" scheme="https://one.blog.418121.xyz/tags/%E4%BB%8A%E5%A4%A9%E7%9A%84%E5%A4%A9%E7%A9%BA%E7%89%B9%E5%88%AB%E7%BE%8E/"/>
    
    <category term="风吹一下" scheme="https://one.blog.418121.xyz/tags/%E9%A3%8E%E5%90%B9%E4%B8%80%E4%B8%8B/"/>
    
    <category term="想把晚霞分享给你" scheme="https://one.blog.418121.xyz/tags/%E6%83%B3%E6%8A%8A%E6%99%9A%E9%9C%9E%E5%88%86%E4%BA%AB%E7%BB%99%E4%BD%A0/"/>
    
  </entry>
  
  <entry>
    <title>童话里的王国住着巫婆</title>
    <link href="https://one.blog.418121.xyz/posts/95df9863.html"/>
    <id>https://one.blog.418121.xyz/posts/95df9863.html</id>
    <published>2024-07-13T15:59:25.000Z</published>
    <updated>2024-11-25T14:59:25.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/13/04.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/13/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="丁达尔效应" scheme="https://one.blog.418121.xyz/tags/%E4%B8%81%E8%BE%BE%E5%B0%94%E6%95%88%E5%BA%94/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="小公主" scheme="https://one.blog.418121.xyz/tags/%E5%B0%8F%E5%85%AC%E4%B8%BB/"/>
    
  </entry>
  
  <entry>
    <title>“晚风吹起你鬓间的白发”</title>
    <link href="https://one.blog.418121.xyz/posts/5846b592.html"/>
    <id>https://one.blog.418121.xyz/posts/5846b592.html</id>
    <published>2024-07-12T12:14:30.000Z</published>
    <updated>2024-11-25T14:14:30.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="抚平回忆留下的疤-你眼中-明暗交杂-一笑生花"><a href="#抚平回忆留下的疤-你眼中-明暗交杂-一笑生花" class="headerlink" title="抚平回忆留下的疤 你眼中 明暗交杂 一笑生花"></a>抚平回忆留下的疤 你眼中 明暗交杂 一笑生花</h3><p><img src="https://images.418121.xyz/file/blog/camera/2024/07/12/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/12/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/12/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/12/04.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;抚平回忆留下的疤-你眼中-明暗交杂-一笑生花&quot;&gt;&lt;a href=&quot;#抚平回忆留下的疤-你眼中-明暗交杂-一笑生花&quot; class=&quot;headerlink&quot; title=&quot;抚平回忆留下的疤 你眼中 明暗交杂 一笑生花&quot;&gt;&lt;/a&gt;抚平回忆留下的疤 你眼中 明暗交杂 一笑</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
    <category term="起风了" scheme="https://one.blog.418121.xyz/tags/%E8%B5%B7%E9%A3%8E%E4%BA%86/"/>
    
    <category term="今天的天空特别美" scheme="https://one.blog.418121.xyz/tags/%E4%BB%8A%E5%A4%A9%E7%9A%84%E5%A4%A9%E7%A9%BA%E7%89%B9%E5%88%AB%E7%BE%8E/"/>
    
  </entry>
  
  <entry>
    <title>人性的背后都是白云苍狗</title>
    <link href="https://one.blog.418121.xyz/posts/5fa19757.html"/>
    <id>https://one.blog.418121.xyz/posts/5fa19757.html</id>
    <published>2024-07-11T10:38:55.000Z</published>
    <updated>2024-11-25T14:38:55.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/04.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/05.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/06.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/07.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/08.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/09.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/11/10.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/11/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="又到了拍云的夏天" scheme="https://one.blog.418121.xyz/tags/%E5%8F%88%E5%88%B0%E4%BA%86%E6%8B%8D%E4%BA%91%E7%9A%84%E5%A4%8F%E5%A4%A9/"/>
    
    <category term="晚霞" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E9%9C%9E/"/>
    
  </entry>
  
  <entry>
    <title>蒲公英的约定</title>
    <link href="https://one.blog.418121.xyz/posts/8a6c74e3.html"/>
    <id>https://one.blog.418121.xyz/posts/8a6c74e3.html</id>
    <published>2024-07-10T07:12:15.000Z</published>
    <updated>2024-11-25T14:12:15.000Z</updated>
    
    <content type="html"><![CDATA[<iframe width="100%" height="800" src="//player.bilibili.com/player.html?isOutside=true&aid=112760927160467&bvid=BV1tea5efE3K&cid=500001610807521&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>]]></content>
    
    
      
      
    <summary type="html">&lt;iframe width=&quot;100%&quot; height=&quot;800&quot; src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;aid=112760927160467&amp;bvid=BV1tea5efE3K&amp;cid=5000016108</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
    <category term="延时摄影" scheme="https://one.blog.418121.xyz/tags/%E5%BB%B6%E6%97%B6%E6%91%84%E5%BD%B1/"/>
    
    <category term="音音不会嘤" scheme="https://one.blog.418121.xyz/tags/%E9%9F%B3%E9%9F%B3%E4%B8%8D%E4%BC%9A%E5%98%A4/"/>
    
  </entry>
  
  <entry>
    <title>我捡到过一束光，日落时还给了太阳。</title>
    <link href="https://one.blog.418121.xyz/posts/83dcefb7.html"/>
    <id>https://one.blog.418121.xyz/posts/83dcefb7.html</id>
    <published>2024-07-07T14:14:19.000Z</published>
    <updated>2024-11-25T14:14:19.000Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/04.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/05.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/06.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/07.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/07/07/08.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07/07/01.webp&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://images.418121.xyz/file/blog/camera/2024/07</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="丁达尔效应" scheme="https://one.blog.418121.xyz/tags/%E4%B8%81%E8%BE%BE%E5%B0%94%E6%95%88%E5%BA%94/"/>
    
    <category term="云" scheme="https://one.blog.418121.xyz/tags/%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>去拥抱陌生，期待惊喜，所有的不期而遇都在</title>
    <link href="https://one.blog.418121.xyz/posts/1fd2008f.html"/>
    <id>https://one.blog.418121.xyz/posts/1fd2008f.html</id>
    <published>2024-06-16T07:17:12.000Z</published>
    <updated>2024-11-25T14:17:12.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="只要你还在笑，那这个世界就不算太糟糕"><a href="#只要你还在笑，那这个世界就不算太糟糕" class="headerlink" title="只要你还在笑，那这个世界就不算太糟糕"></a>只要你还在笑，那这个世界就不算太糟糕</h3><p><img src="https://images.418121.xyz/file/blog/camera/2024/06/16/01.webp" alt="车水马龙"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;只要你还在笑，那这个世界就不算太糟糕&quot;&gt;&lt;a href=&quot;#只要你还在笑，那这个世界就不算太糟糕&quot; class=&quot;headerlink&quot; title=&quot;只要你还在笑，那这个世界就不算太糟糕&quot;&gt;&lt;/a&gt;只要你还在笑，那这个世界就不算太糟糕&lt;/h3&gt;&lt;p&gt;&lt;img s</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
    <category term="交通" scheme="https://one.blog.418121.xyz/tags/%E4%BA%A4%E9%80%9A/"/>
    
    <category term="晚上" scheme="https://one.blog.418121.xyz/tags/%E6%99%9A%E4%B8%8A/"/>
    
  </entry>
  
  <entry>
    <title>人生天地间，忽如远行客</title>
    <link href="https://one.blog.418121.xyz/posts/99b18e00.html"/>
    <id>https://one.blog.418121.xyz/posts/99b18e00.html</id>
    <published>2024-06-04T12:33:33.000Z</published>
    <updated>2024-11-25T14:33:33.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="奔向美好吧，不好听的话就不听了，不愉快的事情也会慢慢过去，可爱会发生，我知道在赶往更好的路上，你真的有在努力，也别忘了跟自己说辛苦了"><a href="#奔向美好吧，不好听的话就不听了，不愉快的事情也会慢慢过去，可爱会发生，我知道在赶往更好的路上，你真的有在努力，也别忘了跟自己说辛苦了" class="headerlink" title="奔向美好吧，不好听的话就不听了，不愉快的事情也会慢慢过去，可爱会发生，我知道在赶往更好的路上，你真的有在努力，也别忘了跟自己说辛苦了"></a>奔向美好吧，不好听的话就不听了，不愉快的事情也会慢慢过去，可爱会发生，我知道在赶往更好的路上，你真的有在努力，也别忘了跟自己说辛苦了</h3><p><img src="https://images.418121.xyz/file/blog/camera/2024/06/04/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/06/04/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/06/04/03.webp"><br>🌏山东 · 龙口</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;奔向美好吧，不好听的话就不听了，不愉快的事情也会慢慢过去，可爱会发生，我知道在赶往更好的路上，你真的有在努力，也别忘了跟自己说辛苦了&quot;&gt;&lt;a href=&quot;#奔向美好吧，不好听的话就不听了，不愉快的事情也会慢慢过去，可爱会发生，我知道在赶往更好的路上，你真的有在努力</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="海" scheme="https://one.blog.418121.xyz/tags/%E6%B5%B7/"/>
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
  </entry>
  
  <entry>
    <title>少年的征途应是星辰大海，而非烟尘人间</title>
    <link href="https://one.blog.418121.xyz/posts/25cdb40a.html"/>
    <id>https://one.blog.418121.xyz/posts/25cdb40a.html</id>
    <published>2024-05-30T03:16:13.000Z</published>
    <updated>2024-11-25T15:16:13.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="看腻了城市四点的日出，偶尔也想去看海边悠哉的日落"><a href="#看腻了城市四点的日出，偶尔也想去看海边悠哉的日落" class="headerlink" title="看腻了城市四点的日出，偶尔也想去看海边悠哉的日落"></a>看腻了城市四点的日出，偶尔也想去看海边悠哉的日落</h1><p><img src="https://images.418121.xyz/file/blog/camera/2024/05/30/01.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/05/30/02.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/05/30/03.webp"><br><img src="https://images.418121.xyz/file/blog/camera/2024/05/30/04.webp"><br>🌏山东 · 龙口</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;看腻了城市四点的日出，偶尔也想去看海边悠哉的日落&quot;&gt;&lt;a href=&quot;#看腻了城市四点的日出，偶尔也想去看海边悠哉的日落&quot; class=&quot;headerlink&quot; title=&quot;看腻了城市四点的日出，偶尔也想去看海边悠哉的日落&quot;&gt;&lt;/a&gt;看腻了城市四点的日出，偶尔也</summary>
      
    
    
    
    <category term="摄影" scheme="https://one.blog.418121.xyz/categories/%E6%91%84%E5%BD%B1/"/>
    
    
    <category term="海" scheme="https://one.blog.418121.xyz/tags/%E6%B5%B7/"/>
    
    <category term="乱拍" scheme="https://one.blog.418121.xyz/tags/%E4%B9%B1%E6%8B%8D/"/>
    
  </entry>
  
  <entry>
    <title>数据库表结构</title>
    <link href="https://one.blog.418121.xyz/posts/878c6909.html"/>
    <id>https://one.blog.418121.xyz/posts/878c6909.html</id>
    <published>2024-05-28T06:19:51.000Z</published>
    <updated>2024-11-25T15:19:51.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="商品管理网站——基于PHP的动态网站设计与实现"><a href="#商品管理网站——基于PHP的动态网站设计与实现" class="headerlink" title="商品管理网站——基于PHP的动态网站设计与实现"></a>商品管理网站——基于PHP的动态网站设计与实现</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- phpMyAdmin SQL Dump</span></span><br><span class="line"><span class="comment">-- version 4.8.5</span></span><br><span class="line"><span class="comment">-- https://www.phpmyadmin.net/</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 主机： localhost</span></span><br><span class="line"><span class="comment">-- 生成日期： 2023-12-04 01:05:11</span></span><br><span class="line"><span class="comment">-- 服务器版本： 8.0.12</span></span><br><span class="line"><span class="comment">-- PHP 版本： 7.3.4</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SET</span> SQL_MODE <span class="operator">=</span> &quot;NO_AUTO_VALUE_ON_ZERO&quot;;</span><br><span class="line"><span class="keyword">SET</span> AUTOCOMMIT <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">START</span> TRANSACTION;</span><br><span class="line"><span class="keyword">SET</span> time_zone <span class="operator">=</span> &quot;+00:00&quot;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */</span>;</span><br><span class="line"><span class="comment">/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */</span>;</span><br><span class="line"><span class="comment">/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */</span>;</span><br><span class="line"><span class="comment">/*!40101 SET NAMES utf8mb4 */</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 数据库： `www_ymx_com`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="keyword">CREATE</span> DATABASE IF <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> `www_ymx_com` <span class="keyword">DEFAULT</span> <span class="keyword">CHARACTER SET</span> utf8 <span class="keyword">COLLATE</span> utf8_general_ci;</span><br><span class="line">USE `www_ymx_com`;</span><br><span class="line"></span><br><span class="line"><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">-- 表的结构 `shops`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> `shops` (</span><br><span class="line">  `id` <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">  `shopname` <span class="type">varchar</span>(<span class="number">100</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `shopprice` <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `shoptotal` <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `shoptext` text,</span><br><span class="line">  `create_time` datetime <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span></span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8;</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 转存表中的数据 `shops`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT INTO</span> `shops` (`id`, `shopname`, `shopprice`, `shoptotal`, `shoptext`, `create_time`) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="number">4</span>, <span class="string">&#x27;柠檬茶&#x27;</span>, <span class="number">3</span>, <span class="number">34</span>, <span class="string">&#x27;这酸爽&#x27;</span>, <span class="string">&#x27;2023-11-23 06:05:17&#x27;</span>),</span><br><span class="line">(<span class="number">5</span>, <span class="string">&#x27;冰绿茶&#x27;</span>, <span class="number">3</span>, <span class="number">22</span>, <span class="string">&#x27;好喝好喝&#x27;</span>, <span class="string">&#x27;2023-11-23 06:05:47&#x27;</span>),</span><br><span class="line">(<span class="number">7</span>, <span class="string">&#x27;棒棒糖&#x27;</span>, <span class="number">1</span>, <span class="number">12</span>, <span class="string">&#x27;好吃好吃&#x27;</span>, <span class="string">&#x27;2023-11-23 06:10:26&#x27;</span>),</span><br><span class="line">(<span class="number">8</span>, <span class="string">&#x27;洗发水&#x27;</span>, <span class="number">23</span>, <span class="number">53</span>, <span class="string">&#x27;去油去屑&#x27;</span>, <span class="string">&#x27;2023-11-23 06:15:04&#x27;</span>),</span><br><span class="line">(<span class="number">9</span>, <span class="string">&#x27;沐浴露&#x27;</span>, <span class="number">32</span>, <span class="number">26</span>, <span class="string">&#x27;干净清爽&#x27;</span>, <span class="string">&#x27;2023-11-23 06:16:13&#x27;</span>),</span><br><span class="line">(<span class="number">10</span>, <span class="string">&#x27;笔记本电脑&#x27;</span>, <span class="number">2599</span>, <span class="number">5</span>, <span class="string">&#x27;i7级游戏本&#x27;</span>, <span class="string">&#x27;2023-11-23 06:16:50&#x27;</span>),</span><br><span class="line">(<span class="number">11</span>, <span class="string">&#x27;华为手机P60&#x27;</span>, <span class="number">5999</span>, <span class="number">1</span>, <span class="string">&#x27;遥遥领先&#x27;</span>, <span class="string">&#x27;2023-11-23 06:17:45&#x27;</span>),</span><br><span class="line">(<span class="number">12</span>, <span class="string">&#x27;玫瑰花&#x27;</span>, <span class="number">99</span>, <span class="number">999</span>, <span class="string">&#x27;浪漫主义&#x27;</span>, <span class="string">&#x27;2023-11-25 06:44:44&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><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">-- 表的结构 `users`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE TABLE</span> `users` (</span><br><span class="line">  `id` <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span>,</span><br><span class="line">  `username` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `password` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `usertype` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `usertell` <span class="type">bigint</span>(<span class="number">11</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `usermail` <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span>,</span><br><span class="line">  `create_time` datetime <span class="keyword">DEFAULT</span> <span class="keyword">NULL</span></span><br><span class="line">) ENGINE<span class="operator">=</span>InnoDB <span class="keyword">DEFAULT</span> CHARSET<span class="operator">=</span>utf8;</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 转存表中的数据 `users`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT INTO</span> `users` (`id`, `username`, `password`, `usertype`, `usertell`, `usermail`, `create_time`) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="number">1</span>, <span class="string">&#x27;admin&#x27;</span>, <span class="string">&#x27;admin&#x27;</span>, <span class="string">&#x27;管理员&#x27;</span>, <span class="number">13888156156</span>, <span class="string">&#x27;admin@test.com&#x27;</span>, <span class="string">&#x27;2023-11-23 05:04:33&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 转储表的索引</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 表的索引 `shops`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="keyword">ALTER TABLE</span> `shops`</span><br><span class="line">  <span class="keyword">ADD</span> <span class="keyword">PRIMARY KEY</span> (`id`),</span><br><span class="line">  <span class="keyword">ADD</span> <span class="keyword">UNIQUE</span> KEY `shopname` (`shopname`);</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 表的索引 `users`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="keyword">ALTER TABLE</span> `users`</span><br><span class="line">  <span class="keyword">ADD</span> <span class="keyword">PRIMARY KEY</span> (`id`),</span><br><span class="line">  <span class="keyword">ADD</span> <span class="keyword">UNIQUE</span> KEY `username` (`username`);</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 在导出的表使用AUTO_INCREMENT</span></span><br><span class="line"><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">-- 使用表AUTO_INCREMENT `shops`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="keyword">ALTER TABLE</span> `shops`</span><br><span class="line">  MODIFY `id` <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span> AUTO_INCREMENT, AUTO_INCREMENT<span class="operator">=</span><span class="number">16</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">-- 使用表AUTO_INCREMENT `users`</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="keyword">ALTER TABLE</span> `users`</span><br><span class="line">  MODIFY `id` <span class="type">int</span>(<span class="number">11</span>) <span class="keyword">NOT NULL</span> AUTO_INCREMENT, AUTO_INCREMENT<span class="operator">=</span><span class="number">17</span>;</span><br><span class="line"><span class="keyword">COMMIT</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */</span>;</span><br><span class="line"><span class="comment">/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */</span>;</span><br><span class="line"><span class="comment">/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">这段SQL脚本创建了名为www_ymx_com的数据库，并在其中创建了两个表：shops和users。</summary>
    
    
    
    <category term="毕业设计" scheme="https://one.blog.418121.xyz/categories/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/"/>
    
    
    <category term="数据库" scheme="https://one.blog.418121.xyz/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="开发语言" scheme="https://one.blog.418121.xyz/tags/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/"/>
    
    <category term="MySql" scheme="https://one.blog.418121.xyz/tags/MySql/"/>
    
    <category term="PHP" scheme="https://one.blog.418121.xyz/tags/PHP/"/>
    
  </entry>
  
  <entry>
    <title>第八章 Centos 7 Linux配置mariadb 实训任务：部署数据库</title>
    <link href="https://one.blog.418121.xyz/posts/660d7bf6.html"/>
    <id>https://one.blog.418121.xyz/posts/660d7bf6.html</id>
    <published>2024-05-28T05:51:51.000Z</published>
    <updated>2024-11-25T15:51:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>任务情境描述任务一某公司准备开发一套员工管理系统，其中数据库使用到了MariaDB数据库，现需要系统管理员完成以下部署工作：在公司一台Linux服务器（192.168.1.10）上安装数据库服务器和客户端，方便开发人员开发测试使用，在另一台Linux主机（192.168.1.100）上安装客户端；对数据库进行初始化设置。任务二，该公司准备开发一套新员工管理系统，现需要系统管理员完成以下安全管理工作：数据库服务器进行必要的网络安全设置，只允许从公司内部公司内部网络（192.168.1.0&#x2F;24）访问数据库服务。</p><p>虚拟机需求：1台服务器（Server）192.168.1.10、1台客户端（Client1）192.168.1.100</p><h2 id="部署数据库"><a href="#部署数据库" class="headerlink" title="部署数据库"></a>部署数据库</h2><h3 id="任务情境描述"><a href="#任务情境描述" class="headerlink" title="任务情境描述"></a>任务情境描述</h3><h4 id="任务一"><a href="#任务一" class="headerlink" title="任务一"></a>任务一</h4><blockquote><p>某公司准备开发一套员工管理系统，其中数据库使用到了MariaDB数据库，现需要系统管理员完成以下部署工作：在公司一台Linux服务器（192.168.1.10）上安装数据库服务器和客户端，方便开发人员开发测试使用，在另一台Linux主机（192.168.1.100）上安装客户端；<br>对数据库进行初始化设置。</p></blockquote><h4 id="任务二"><a href="#任务二" class="headerlink" title="任务二"></a>任务二</h4><blockquote><p>该公司准备开发一套新员工管理系统，现需要系统管理员完成以下安全管理工作：</p><ol><li><p>对数据库服务器进行必要的网络安全设置，只允许从公司内部网络（192.168.1.0&#x2F;24）访问数据库服务器；</p></li><li><p>从安全的角度对数据库的配置文件进行必要的安全设置，修改数据库端口号为“8800”，并设置日志文件为&#x2F;var&#x2F;log&#x2F;mariaDB&#x2F;access.log</p></li><li><p>登录数据库，并新建一个名为newstaff的数据库；在数据库中创建一个数据表为stafftable；字段类型为staff int，username varchar(20)，sex char(6)，age<br>int；并将下表中的总公司部门员工信息插入到stafftable表中：<img src="https://images.418121.xyz/file/blog/study/linux/08/01.webp"></p></li><li><p>对数据库账户和权限进行必要的管理，为开发人员创建一个名为“adminDB”的账户，但只允许他对newstaff数据库进行必要的操作；</p></li><li><p>为有效保护员工数据，编写一个定时任务，让系统每天凌晨0:00点对newstaff数据库自动进行数据备份。</p></li></ol></blockquote><h2 id="一、-服务器（Server）和客户端（Client1）安装数据库服务"><a href="#一、-服务器（Server）和客户端（Client1）安装数据库服务" class="headerlink" title="一、 服务器（Server）和客户端（Client1）安装数据库服务"></a>一、 服务器（Server）和客户端（Client1）安装数据库服务</h2><h3 id="1-服务器（Server）"><a href="#1-服务器（Server）" class="headerlink" title="1. 服务器（Server）"></a>1. 服务器（Server）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@server www]# yum -y install mariadb-server mysql  //安装</span><br><span class="line">[root@server www]# systemctl start mariadb.service    //开启</span><br><span class="line">[root@server www]# systemctl <span class="built_in">enable</span> mariadb.service   //自启</span><br><span class="line">Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-客户端（Client1）"><a href="#2-客户端（Client1）" class="headerlink" title="2. 客户端（Client1）"></a>2. 客户端（Client1）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver webserver]# yum -y install mysql    //安装</span><br></pre></td></tr></table></figure><h2 id="二、在服务器（Server）创建数据库和表"><a href="#二、在服务器（Server）创建数据库和表" class="headerlink" title="二、在服务器（Server）创建数据库和表"></a>二、在服务器（Server）创建数据库和表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line">[root@server www]# mysql -uroot -p    //登录数据库 默认密码应该是root或空</span><br><span class="line">Enter password: </span><br><span class="line">Welcome to the MariaDB monitor.  Commands end with ; or \g.</span><br><span class="line">Your MariaDB connection <span class="built_in">id</span> is 6</span><br><span class="line">Server version: 5.5.68-MariaDB MariaDB Server</span><br><span class="line"></span><br><span class="line">Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.</span><br><span class="line"></span><br><span class="line">Type <span class="string">&#x27;help;&#x27;</span> or <span class="string">&#x27;\h&#x27;</span> <span class="keyword">for</span> <span class="built_in">help</span>. Type <span class="string">&#x27;\c&#x27;</span> to clear the current input statement.</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; create database newstaff;     //创建数据库newstaff</span><br><span class="line">Query OK, 1 row affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; use newstaff;           //进入数据库newstaff</span><br><span class="line">Database changed</span><br><span class="line">MariaDB [newstaff]&gt; create table stafftable (   //按任务需求创建表</span><br><span class="line">    -&gt; staffID int auto_increment,          //自增</span><br><span class="line">    -&gt; username varchar(20),</span><br><span class="line">    -&gt; sex char(6),</span><br><span class="line">    -&gt; age int,</span><br><span class="line">    -&gt; primary key(staffID)             //主键</span><br><span class="line">    -&gt; )engine=innodb default charset=utf8;     //表的引擎字符类型</span><br><span class="line">Query OK, 0 rows affected (0.02 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [newstaff]&gt; insert into stafftable(username,sex,age) values(<span class="string">&#x27;Tom&#x27;</span>,<span class="string">&#x27;male&#x27;</span>,25),(<span class="string">&#x27;Mary&#x27;</span>,<span class="string">&#x27;female&#x27;</span>,30);                </span><br><span class="line">Query OK, 2 rows affected (0.05 sec)        //按要求插入数据</span><br><span class="line">Records: 2  Duplicates: 0  Warnings: 0</span><br><span class="line"></span><br><span class="line">MariaDB [newstaff]&gt; desc stafftable;        //查看表结构</span><br><span class="line">+----------+-------------+------+-----+---------+----------------+</span><br><span class="line">| Field    | Type        | Null | Key | Default | Extra          |</span><br><span class="line">+----------+-------------+------+-----+---------+----------------+</span><br><span class="line">| staffID  | int(11)     | NO   | PRI | NULL    | auto_increment |</span><br><span class="line">| username | varchar(20) | YES  |     | NULL    |                |</span><br><span class="line">| sex      | char(6)     | YES  |     | NULL    |                |</span><br><span class="line">| age      | int(11)     | YES  |     | NULL    |                |</span><br><span class="line">+----------+-------------+------+-----+---------+----------------+</span><br><span class="line">4 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [newstaff]&gt; <span class="keyword">select</span> * from stafftable;   //查询表内所有数据</span><br><span class="line">+---------+----------+--------+------+</span><br><span class="line">| staffID | username | sex    | age  |</span><br><span class="line">+---------+----------+--------+------+</span><br><span class="line">|       1 | Tom      | male   |   25 |</span><br><span class="line">|       2 | Mary     | female |   30 |</span><br><span class="line">+---------+----------+--------+------+</span><br><span class="line">2 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.01 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [newstaff]&gt; quit              //退出</span><br><span class="line">Bye</span><br><span class="line">[root@server www]# </span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="三、-服务器（Server）只允许192-168-1-0-24访问数据库"><a href="#三、-服务器（Server）只允许192-168-1-0-24访问数据库" class="headerlink" title="三、 服务器（Server）只允许192.168.1.0&#x2F;24访问数据库"></a>三、 服务器（Server）只允许192.168.1.0&#x2F;24访问数据库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[root@server www]# iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 8800 -j ACCEPT</span><br></pre></td></tr></table></figure><h2 id="四、-修改服务器（Server）默认端口"><a href="#四、-修改服务器（Server）默认端口" class="headerlink" title="四、 修改服务器（Server）默认端口"></a>四、 修改服务器（Server）默认端口</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/my.cnf   //插入以下</span><br><span class="line">port=8800                   //修改默认端口</span><br><span class="line">max_user_connections=2              //最大用户数</span><br><span class="line"><span class="built_in">log</span>=/var/log/mariadb/access.log         //修改日志默认路径</span><br><span class="line">[mysqld_safe]</span><br></pre></td></tr></table></figure><p>防火墙设置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">允许mysql[root@server www]# firewall-cmd --permanent --zone=public --add-service=mysql</span><br><span class="line">success</span><br><span class="line">允许端口[root@server www]# firewall-cmd --permanent --zone=public --add-port=8800/tcp</span><br><span class="line">success</span><br><span class="line">允许端口[root@server www]# firewall-cmd --permanent --zone=public --add-port=8800/udp</span><br><span class="line">success</span><br><span class="line">重启防火墙[root@server www]# semanage port -l | grep mysql</span><br><span class="line">mysqld_port_t                  tcp      8800, 1186, 3306, 63132-63164</span><br><span class="line">mysqlmanagerd_port_t           tcp      2273</span><br><span class="line">[root@server www]# semanage port -a -t mysqld_port_t -p tcp 8800</span><br><span class="line">[root@server www]# firewall-cmd --reload </span><br><span class="line">success</span><br><span class="line">[root@server www]# systemctl restart mariadb.service </span><br></pre></td></tr></table></figure><h2 id="五、在服务器（Server）上创建账户只允许他对newstaff数据库进行操作"><a href="#五、在服务器（Server）上创建账户只允许他对newstaff数据库进行操作" class="headerlink" title="五、在服务器（Server）上创建账户只允许他对newstaff数据库进行操作"></a>五、在服务器（Server）上创建账户只允许他对newstaff数据库进行操作</h2><p>创建用户</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">[root@server www]# mysql -uroot -p</span><br><span class="line">Enter password: </span><br><span class="line">Welcome to the MariaDB monitor.  Commands end with ; or \g.</span><br><span class="line">Your MariaDB connection <span class="built_in">id</span> is 7</span><br><span class="line">Server version: 5.5.68-MariaDB MariaDB Server</span><br><span class="line"></span><br><span class="line">Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.</span><br><span class="line"></span><br><span class="line">Type <span class="string">&#x27;help;&#x27;</span> or <span class="string">&#x27;\h&#x27;</span> <span class="keyword">for</span> <span class="built_in">help</span>. Type <span class="string">&#x27;\c&#x27;</span> to clear the current input statement.</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; use mysql;</span><br><span class="line">Reading table information <span class="keyword">for</span> completion of table and column names</span><br><span class="line">You can turn off this feature to get a quicker startup with -A</span><br><span class="line"></span><br><span class="line">Database changed</span><br><span class="line">MariaDB [mysql]&gt; create user <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span> identified by <span class="string">&#x27;root&#x27;</span>;  //设置用户名和密码root</span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [mysql]&gt; quit</span><br><span class="line">Bye</span><br><span class="line">[root@server www]# </span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>只允许对newstaff数据库进行操作</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">[root@server www]# mysql -uroot -p</span><br><span class="line">Enter password: </span><br><span class="line">Welcome to the MariaDB monitor.  Commands end with ; or \g.</span><br><span class="line">Your MariaDB connection <span class="built_in">id</span> is 8</span><br><span class="line">Server version: 5.5.68-MariaDB MariaDB Server</span><br><span class="line"></span><br><span class="line">Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.</span><br><span class="line"></span><br><span class="line">Type <span class="string">&#x27;help;&#x27;</span> or <span class="string">&#x27;\h&#x27;</span> <span class="keyword">for</span> <span class="built_in">help</span>. Type <span class="string">&#x27;\c&#x27;</span> to clear the current input statement.</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; show grants <span class="keyword">for</span> <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br><span class="line">+----------------------------------------------------------------------------------------------------------------+</span><br><span class="line">| Grants <span class="keyword">for</span> adminDB@%                                                                                   |</span><br><span class="line">+----------------------------------------------------------------------------------------------------------------+</span><br><span class="line">| GRANT USAGE ON *.* TO <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span> IDENTIFIED BY PASSWORD <span class="string">&#x27;*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B&#x27;</span> |</span><br><span class="line">+----------------------------------------------------------------------------------------------------------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; grant <span class="keyword">select</span>,insert,update,delete,create,drop on newstaff.* to <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span>; //只允许adminDB操作数据库newstaff</span><br><span class="line">Query OK, 0 rows affected (0.01 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; quit</span><br><span class="line">Bye</span><br><span class="line">[root@server www]# </span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="六、编写备份程序（可略，老师好像不看）"><a href="#六、编写备份程序（可略，老师好像不看）" class="headerlink" title="六、编写备份程序（可略，老师好像不看）"></a>六、编写备份程序（可略，老师好像不看）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">[root@server www]# mysqldump -uroot -p newstaff &gt; newstaff_backup.sql   //备份newstaff数据库</span><br><span class="line">Enter password: </span><br><span class="line">[root@server www]# <span class="built_in">cd</span> ..</span><br><span class="line">[root@server var]# <span class="built_in">cd</span> ..</span><br><span class="line">[root@server /]# vim backup.sh                        //编写程序</span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="keyword">time</span>=`<span class="built_in">date</span>+<span class="string">&quot;(&quot;</span>%F<span class="string">&quot;)&quot;</span>%R`</span><br><span class="line">$/usr/local/mysql/bin/mysqldump -uroot -proot newstaff|gzip &gt; /root/staffbackup-<span class="variable">$time</span>.gz</span><br><span class="line">[root@server /]# crontab -e                         //添加定时任务</span><br><span class="line">00 00 * * * /backup.sh                            //0点0分 每天 每月 每时 脚本路径</span><br><span class="line">crontab: installing new crontab</span><br><span class="line">[root@server /]# systemcrl restart mariadb</span><br></pre></td></tr></table></figure><h2 id="七、-测试"><a href="#七、-测试" class="headerlink" title="七、 测试"></a>七、 测试</h2><p>老师一般说这几条命令，她叫你打什么就打什么吧</p><h3 id="1-客户端（Client1）"><a href="#1-客户端（Client1）" class="headerlink" title="1. 客户端（Client1）"></a>1. 客户端（Client1）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver webserver]# mysql -uadminDB -p -P8800 -h 192.168.1.10 //带端口登录</span><br><span class="line">Enter password: </span><br><span class="line">Welcome to the MariaDB monitor.  Commands end with ; or \g.</span><br><span class="line">Your MariaDB connection <span class="built_in">id</span> is 8</span><br><span class="line">Server version: 5.5.68-MariaDB MariaDB Server</span><br><span class="line"></span><br><span class="line">Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.</span><br><span class="line"></span><br><span class="line">Type <span class="string">&#x27;help;&#x27;</span> or <span class="string">&#x27;\h&#x27;</span> <span class="keyword">for</span> <span class="built_in">help</span>. Type <span class="string">&#x27;\c&#x27;</span> to clear the current input statement.</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; use newstaff;</span><br><span class="line">Reading table information <span class="keyword">for</span> completion of table and column names</span><br><span class="line">You can turn off this feature to get a quicker startup with -A</span><br><span class="line"></span><br><span class="line">Database changed</span><br><span class="line">MariaDB [newstaff]&gt; desc stafftable;        //查看表结构</span><br><span class="line">+----------+-------------+------+-----+---------+----------------+</span><br><span class="line">| Field    | Type        | Null | Key | Default | Extra          |</span><br><span class="line">+----------+-------------+------+-----+---------+----------------+</span><br><span class="line">| staffID  | int(11)     | NO   | PRI | NULL    | auto_increment |</span><br><span class="line">| username | varchar(20) | YES  |     | NULL    |                |</span><br><span class="line">| sex      | char(6)     | YES  |     | NULL    |                |</span><br><span class="line">| age      | int(11)     | YES  |     | NULL    |                |</span><br><span class="line">+----------+-------------+------+-----+---------+----------------+</span><br><span class="line">4 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [newstaff]&gt; <span class="keyword">select</span> * from stafftable;   //查看表内容</span><br><span class="line">+---------+----------+--------+------+</span><br><span class="line">| staffID | username | sex    | age  |</span><br><span class="line">+---------+----------+--------+------+</span><br><span class="line">|       1 | Tom      | male   |   25 |</span><br><span class="line">|       2 | Mary     | female |   30 |</span><br><span class="line">+---------+----------+--------+------+</span><br><span class="line">2 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [newstaff]&gt; quit</span><br><span class="line">Bye</span><br><span class="line">[root@webserver webserver]#</span><br></pre></td></tr></table></figure><h3 id="2-服务器（Server）"><a href="#2-服务器（Server）" class="headerlink" title="2. 服务器（Server）"></a>2. 服务器（Server）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">[root@server /]# mysql -uroot -p</span><br><span class="line">Enter password: </span><br><span class="line">Welcome to the MariaDB monitor.  Commands end with ; or \g.</span><br><span class="line">Your MariaDB connection <span class="built_in">id</span> is 12</span><br><span class="line">Server version: 5.5.68-MariaDB MariaDB Server</span><br><span class="line"></span><br><span class="line">Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.</span><br><span class="line"></span><br><span class="line">Type <span class="string">&#x27;help;&#x27;</span> or <span class="string">&#x27;\h&#x27;</span> <span class="keyword">for</span> <span class="built_in">help</span>. Type <span class="string">&#x27;\c&#x27;</span> to clear the current input statement.</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; show grants <span class="keyword">for</span> <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br><span class="line">+--------------------------------------------------------------------------------------------------------------------+</span><br><span class="line">| Grants <span class="keyword">for</span> adminDB@%                                                                                   |</span><br><span class="line">+--------------------------------------------------------------------------------------------------------------------+</span><br><span class="line">| GRANT USAGE ON *.* TO <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span> IDENTIFIED BY PASSWORD <span class="string">&#x27;*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B&#x27;</span> |</span><br><span class="line">| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON `newstaff`.* TO <span class="string">&#x27;adminDB&#x27;</span>@<span class="string">&#x27;%&#x27;</span>                    |</span><br><span class="line">+--------------------------------------------------------------------------------------------------------------------+</span><br><span class="line">2 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br><span class="line">MariaDB [(none)]&gt; quit</span><br><span class="line">Bye</span><br><span class="line">[root@server /]#</span><br></pre></td></tr></table></figure><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">详细描述了如何在Linux服务器上安装和配置MariaDB数据库，以及如何进行必要的安全设置和数据库操作。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="数据库" scheme="https://one.blog.418121.xyz/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="mariadb" scheme="https://one.blog.418121.xyz/tags/mariadb/"/>
    
  </entry>
  
  <entry>
    <title>第七章 Centos 7 Linux配置ftp 实训任务1：FTP服务器加密传输</title>
    <link href="https://one.blog.418121.xyz/posts/2d95345a.html"/>
    <id>https://one.blog.418121.xyz/posts/2d95345a.html</id>
    <published>2024-05-28T05:31:51.000Z</published>
    <updated>2024-11-25T15:31:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><em><strong>&#x3D;&#x3D;前面的DNS一定要成功才能做！！！&#x3D;&#x3D;</strong></em></p><p>实训任务1：FTP服务器加密传输 任务情境描述，某公司在需要使用vsftpd搭建一台FTP服务器，用于web站点资料的更新和公司公用文件的存放。为了保证客户机和服务器之间传输数据的保密性和完整性，公司决定使用SSL&#x2F;TLS协议加固FTP服务器，客户机和服务器之间采用SSL&#x2F;TLS协议加密数据。</p><p>虚拟机需求：1台DNS服务器（Server）、1台Web服务器（Ftp Server）、1台客户端（Client1）</p><blockquote><p><strong>在第五章的基础上继续实训</strong></p></blockquote><h2 id="FTP服务器加密传输"><a href="#FTP服务器加密传输" class="headerlink" title="FTP服务器加密传输"></a>FTP服务器加密传输</h2><blockquote><p>任务情境描述<br>某公司在需要使用vsftpd搭建一台FTP服务器，用于web站点资料的更新和公司公用文件的存放。为了保证客户机和服务器之间传输数据的保密性和完整性，公司决定使用SSL&#x2F;TLS协议加固FTP服务器，客户机和服务器之间采用SSL&#x2F;TLS协议加密数据。</p></blockquote><h2 id="任务要求："><a href="#任务要求：" class="headerlink" title="任务要求："></a>任务要求：</h2><blockquote><h3 id="1-禁止使用不安全的FTP，请使用“CA”证书颁发机构，颁发的证书，启用FTPS服务；"><a href="#1-禁止使用不安全的FTP，请使用“CA”证书颁发机构，颁发的证书，启用FTPS服务；" class="headerlink" title="1. 禁止使用不安全的FTP，请使用“CA”证书颁发机构，颁发的证书，启用FTPS服务；"></a>1. 禁止使用不安全的FTP，请使用“CA”证书颁发机构，颁发的证书，启用FTPS服务；</h3><p>  Country Name (2 letter code) [XX]:CN<br>State or Province Name (fullname) []:GD<br>Locality Name (eg, city) [Default City]:GuangZhou<br>  Organization Name (eg, company) [Default Company Ltd]:mydomain.com<br>  Organizational Unit Name (eg, section) []:Operations Departments<br>  Common Name (eg, your name or your server’s hostname)[]:ftp.mydomain.com</p><h3 id="2-使用ftp-mydomian-com域名访问服务器；"><a href="#2-使用ftp-mydomian-com域名访问服务器；" class="headerlink" title="2. 使用ftp.mydomian.com域名访问服务器；"></a>2. 使用ftp.mydomian.com域名访问服务器；</h3><h3 id="3-用户webadmin，登录ftp服务器，根目录为-webdata-；"><a href="#3-用户webadmin，登录ftp服务器，根目录为-webdata-；" class="headerlink" title="3. 用户webadmin，登录ftp服务器，根目录为&#x2F;webdata&#x2F;；"></a>3. 用户webadmin，登录ftp服务器，根目录为&#x2F;webdata&#x2F;；</h3><h3 id="4-登录后限制在自己的根目录；"><a href="#4-登录后限制在自己的根目录；" class="headerlink" title="4. 登录后限制在自己的根目录；"></a>4. 登录后限制在自己的根目录；</h3><h3 id="5-允许WEB管理员上传和下载文件，但是禁止上传后缀名为-doc-docx-xlsx的文件；"><a href="#5-允许WEB管理员上传和下载文件，但是禁止上传后缀名为-doc-docx-xlsx的文件；" class="headerlink" title="5. 允许WEB管理员上传和下载文件，但是禁止上传后缀名为.doc .docx .xlsx的文件；"></a>5. 允许WEB管理员上传和下载文件，但是禁止上传后缀名为.doc .docx .xlsx的文件；</h3><h3 id="6-限制用户的下载最大速度为100kb-s；最大同一IP在线人数为2人；"><a href="#6-限制用户的下载最大速度为100kb-s；最大同一IP在线人数为2人；" class="headerlink" title="6. 限制用户的下载最大速度为100kb&#x2F;s；最大同一IP在线人数为2人；"></a>6. 限制用户的下载最大速度为100kb&#x2F;s；最大同一IP在线人数为2人；</h3><h3 id="7-用于通过工具或者浏览器下载的最大速度不超过100kb-s；"><a href="#7-用于通过工具或者浏览器下载的最大速度不超过100kb-s；" class="headerlink" title="7.用于通过工具或者浏览器下载的最大速度不超过100kb&#x2F;s；"></a>7.用于通过工具或者浏览器下载的最大速度不超过100kb&#x2F;s；</h3><h3 id="8-一个IP地址同时登陆的用户进程-人数不超过2人。"><a href="#8-一个IP地址同时登陆的用户进程-人数不超过2人。" class="headerlink" title="8. 一个IP地址同时登陆的用户进程&#x2F;人数不超过2人。"></a>8. 一个IP地址同时登陆的用户进程&#x2F;人数不超过2人。</h3></blockquote><h2 id="一、配置Ftp服务器（Ftp-Server）的IP地址"><a href="#一、配置Ftp服务器（Ftp-Server）的IP地址" class="headerlink" title="一、配置Ftp服务器（Ftp Server）的IP地址"></a>一、配置Ftp服务器（Ftp Server）的IP地址</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">BOOTPROTO=static</span><br><span class="line">IPADDR=192.168.1.100</span><br><span class="line">GATEWAY=192.168.1.2</span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">DNS1=192.168.1.10</span><br><span class="line">DNS2=202.96.128.86</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/07/01.webp"></p><h2 id="二、-为Ftp服务器（Ftp-Server）安装vsftp服务"><a href="#二、-为Ftp服务器（Ftp-Server）安装vsftp服务" class="headerlink" title="二、 为Ftp服务器（Ftp Server）安装vsftp服务"></a>二、 为Ftp服务器（Ftp Server）安装vsftp服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">yum -y install vsftpd //安装vsftp服务</span><br><span class="line">systemctl start vsftpd  //开启vsftp服务</span><br><span class="line">systemctl <span class="built_in">enable</span> vsftpd //开机自启</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/07/02.webp"></p><h2 id="三、Ftp服务器（Ftp-Server）生成证书"><a href="#三、Ftp服务器（Ftp-Server）生成证书" class="headerlink" title="三、Ftp服务器（Ftp Server）生成证书"></a>三、Ftp服务器（Ftp Server）生成证书</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">创建目录[root@webserver webserver]# <span class="built_in">mkdir</span> /etc/ssl/serverkey</span><br><span class="line">生成证书[root@webserver webserver]# openssl req -x509 -nodes -keyout /etc/ssl/serverkey/vsftpd.pem -out /etc/ssl/serverkey/vsftpd.pem -days 365 -newkey rsa:2048</span><br><span class="line">Generating a 2048 bit RSA private key</span><br><span class="line">................+++</span><br><span class="line">.....+++</span><br><span class="line">writing new private key to <span class="string">&#x27;/etc/ssl/serverkey/vsftpd.pem&#x27;</span></span><br><span class="line">-----</span><br><span class="line">You are about to be asked to enter information that will be incorporated</span><br><span class="line">into your certificate request.</span><br><span class="line">What you are about to enter is what is called a Distinguished Name or a DN.</span><br><span class="line">There are quite a few fields but you can leave some blank</span><br><span class="line">For some fields there will be a default value,</span><br><span class="line">If you enter <span class="string">&#x27;.&#x27;</span>, the field will be left blank.</span><br><span class="line">-----</span><br><span class="line">Country Name (2 letter code) [CN]:</span><br><span class="line">State or Province Name (full name) [China]:GD</span><br><span class="line">Locality Name (eg, city) [GuangZhou]:</span><br><span class="line">Organization Name (eg, company) [ymx.com]:</span><br><span class="line">Organizational Unit Name (eg, section) []:Operations Departments</span><br><span class="line">Common Name (eg, your name or your server<span class="string">&#x27;s hostname) []:ftp.ymx.com</span></span><br><span class="line"><span class="string">Email Address []:</span></span><br><span class="line"><span class="string">[root@webserver webserver]#</span></span><br></pre></td></tr></table></figure><p>图片打反了 别按照图片 按上面的文本<br><img src="https://images.418121.xyz/file/blog/study/linux/07/03.webp"></p><h2 id="四、-Ftp服务器（Ftp-Server）防火墙设置"><a href="#四、-Ftp服务器（Ftp-Server）防火墙设置" class="headerlink" title="四、 Ftp服务器（Ftp Server）防火墙设置"></a>四、 Ftp服务器（Ftp Server）防火墙设置</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">允许ftp通过[root@webserver webserver]# firewall-cmd --permanent --zone=public --add-service=ftp</span><br><span class="line">success</span><br><span class="line">允许端口通过[root@webserver webserver]# firewall-cmd --permanent --zone=public --add-port=990/tcp</span><br><span class="line">success</span><br><span class="line">允许端口通过[root@webserver webserver]# firewall-cmd --permanent --zone=public --add-port=990/udp</span><br><span class="line">success</span><br><span class="line">允许端口通过[root@webserver webserver]# firewall-cmd --permanent --zone=public --add-port=40000-50000/tcp</span><br><span class="line">success</span><br><span class="line">允许端口通过[root@webserver webserver]# firewall-cmd --permanent --zone=public --add-port=40000-50000/udp</span><br><span class="line">success</span><br><span class="line">重启防火墙[root@webserver webserver]# firewall-cmd --reload </span><br><span class="line">success</span><br><span class="line">[root@webserver webserver]# </span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/07/04.webp"></p><h2 id="五、-Ftp服务器（Ftp-Server）配置vsftp文件"><a href="#五、-Ftp服务器（Ftp-Server）配置vsftp文件" class="headerlink" title="五、 Ftp服务器（Ftp Server）配置vsftp文件"></a>五、 Ftp服务器（Ftp Server）配置vsftp文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/vsftpd/vsftpd.conf</span><br></pre></td></tr></table></figure><p>最后插入</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">ssl_enable=yes</span><br><span class="line">ssl_tlsv1=yes</span><br><span class="line">ssl_sslv2=no</span><br><span class="line">ssl_sslv3=no</span><br><span class="line">rsa_private_key_file=/etc/ssl/serverkey/vsftpd.pem</span><br><span class="line">rsa_cert_file=/etc/ssl/serverkey/vsftpd.pem</span><br><span class="line">allow_anon_ssl=no</span><br><span class="line">force_local_logins_ssl=yes</span><br><span class="line">force_local_data_ssl=yes</span><br><span class="line">pasv_min_port=40000</span><br><span class="line">pasv_max_port=50000</span><br><span class="line">systemctl restart vsftpd  //重启</span><br></pre></td></tr></table></figure><p>图片打错了请按照上面文本打<br><img src="https://images.418121.xyz/file/blog/study/linux/07/05.webp"></p><h2 id="六、创建用户和根目录以及虚拟用户（详情看学习通ftp虚拟用户章节-这里不做过多解释）"><a href="#六、创建用户和根目录以及虚拟用户（详情看学习通ftp虚拟用户章节-这里不做过多解释）" class="headerlink" title="六、创建用户和根目录以及虚拟用户（详情看学习通ftp虚拟用户章节 这里不做过多解释）"></a>六、创建用户和根目录以及虚拟用户（详情看学习通ftp虚拟用户章节 这里不做过多解释）</h2><p>看不懂去看ppt</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver webserver]# useradd webadmin -s /sbin/nologin </span><br><span class="line">[root@webserver webserver]# useradd admin -s /sbin/nologin  </span><br><span class="line">[root@webserver webserver]# passwd --stdin webadmin </span><br><span class="line">更改用户 webadmin 的密码 。</span><br><span class="line">root</span><br><span class="line">passwd：所有的身份验证令牌已经成功更新。</span><br><span class="line">[root@webserver webserver]# passwd --stdin admin</span><br><span class="line">更改用户 admin 的密码 。</span><br><span class="line">root</span><br><span class="line">passwd：所有的身份验证令牌已经成功更新。</span><br><span class="line">[root@webserver webserver]# vim /etc/vsftpd/vusr.txt </span><br><span class="line">webadmin</span><br><span class="line">root</span><br><span class="line">admin</span><br><span class="line">root</span><br><span class="line">[root@webserver webserver]# <span class="built_in">mkdir</span> -p /var/ftp/pub/ /webdata</span><br><span class="line">[root@webserver webserver]# <span class="built_in">chmod</span> 777 /webdata</span><br><span class="line">[root@webserver webserver]# <span class="built_in">chown</span> webadmin /var/ftp/pub/ /webdata</span><br><span class="line">[root@webserver webserver]# rpm -qf /usr/bin/db_load</span><br><span class="line">libdb-utils-5.3.21-24.el7.x86_64</span><br><span class="line">[root@webserver webserver]# db_load -T -t <span class="built_in">hash</span> -f /etc/vsftpd/vusr.txt /etc/vsftpd/vusr.db</span><br><span class="line">[root@webserver webserver]# file /etc/vsftpd/vusr.db</span><br><span class="line">/etc/vsftpd/vusr.db: Berkeley DB (Hash, version 9, native byte-order)</span><br><span class="line">[root@webserver webserver]# <span class="built_in">chmod</span> 600 /etc/vsftpd/vusr.*</span><br><span class="line">[root@webserver webserver]# <span class="built_in">cp</span> -p /etc/pam.d/vsftpd /etc/pam.d/vsftpd-vusr</span><br><span class="line">[root@webserver webserver]# vim /etc/pam.d/vsftpd-vusr</span><br><span class="line">auth       sufficient   /lib64/security/pam_userdb.so db=/etc/vsftpd/vusr</span><br><span class="line">account    sufficient   /lib64/security/pam_userdb.so db=/etc/vsftpd/vusr</span><br><span class="line">[root@webserver webserver]# vim /etc/vsftpd/vsftpd.conf </span><br><span class="line">local_enable=<span class="built_in">yes</span></span><br><span class="line">chroot_local_user=<span class="built_in">yes</span></span><br><span class="line">pam_service_name=vsftpd-vusr</span><br><span class="line">guest_enable=<span class="built_in">yes</span></span><br><span class="line">guest_username=webadmin</span><br><span class="line">user_config_dir=/etc/vsftpd/vconfig</span><br><span class="line">virtual_use_local_privs=<span class="built_in">yes</span></span><br><span class="line">allow_writeable_chroot=<span class="built_in">yes</span></span><br><span class="line">[root@webserver webserver]# <span class="built_in">mkdir</span> /etc/vsftpd/vconfig/</span><br><span class="line">[root@webserver webserver]# vim /etc/vsftpd/vconfig/webadmin</span><br><span class="line">local_root=/webdata</span><br><span class="line">[root@webserver webserver]# vim /etc/vsftpd/vconfig/admin</span><br><span class="line">local_root=/webdata</span><br><span class="line">write_enable=no</span><br><span class="line">[root@webserver webserver]# setsebool -P ftpd_full_access on</span><br><span class="line">[root@webserver webserver]# systemctl restart vsftpd</span><br></pre></td></tr></table></figure><h2 id="七、-使用域名登录要在Dns服务器（Dns-Server）上正反向加上一条（略过）"><a href="#七、-使用域名登录要在Dns服务器（Dns-Server）上正反向加上一条（略过）" class="headerlink" title="七、 使用域名登录要在Dns服务器（Dns Server）上正反向加上一条（略过）"></a>七、 使用域名登录要在Dns服务器（Dns Server）上正反向加上一条（略过）</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/07/06.webp"></p><h2 id="八、任务需求后四项Ftp服务器（Ftp-Server）上修改配置文件"><a href="#八、任务需求后四项Ftp服务器（Ftp-Server）上修改配置文件" class="headerlink" title="八、任务需求后四项Ftp服务器（Ftp Server）上修改配置文件"></a>八、任务需求后四项Ftp服务器（Ftp Server）上修改配置文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/vsftpd/vsftpd.conf</span><br><span class="line"><span class="comment">#允许WEB管理员上传和下载文件，但是禁止上传后缀名为.doc .docx .xlsx的文件；</span></span><br><span class="line">deny_file=&#123;*.doc,*.docx,*.xlsx&#125;</span><br><span class="line"><span class="comment">#限制用户的下载最大速度为100kb/s；用于通过工具或者浏览器下载的最大速度不超过100kb/s；人数为2人；</span></span><br><span class="line">local_max_rate=102400</span><br><span class="line"><span class="comment">#最大同一IP在线</span></span><br><span class="line">max_per_ip=2</span><br><span class="line"><span class="comment">#一个IP地址同时登陆的用户进程/人数不超过2人。</span></span><br><span class="line">max_clients=2</span><br><span class="line">systemctl restart vsftpd</span><br></pre></td></tr></table></figure><h2 id="九、客户端（client1）测试"><a href="#九、客户端（client1）测试" class="headerlink" title="九、客户端（client1）测试"></a>九、客户端（client1）测试</h2><h3 id="1-安装ftp服务和FileZilla"><a href="#1-安装ftp服务和FileZilla" class="headerlink" title="1. 安装ftp服务和FileZilla"></a>1. 安装ftp服务和FileZilla</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum -y install epel-release</span><br><span class="line">yum -y install filezilla</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/07/07.webp"></p><h3 id="2-创建测试文件"><a href="#2-创建测试文件" class="headerlink" title="2. 创建测试文件"></a>2. 创建测试文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[root@client server]# <span class="built_in">mkdir</span> /home/server/test /*server是我的用户名，看情况来*/</span><br><span class="line">[root@client server]# <span class="built_in">chmod</span> 777  /home/server/test</span><br><span class="line">[root@client server]# <span class="built_in">cd</span> /home/server/test/</span><br><span class="line">[root@client <span class="built_in">test</span>]# vim test.txt</span><br><span class="line">[root@client <span class="built_in">test</span>]# vim test.doc</span><br><span class="line">[root@client <span class="built_in">test</span>]# vim test.docx</span><br><span class="line">[root@client <span class="built_in">test</span>]# vim test.xlsx</span><br></pre></td></tr></table></figure><h3 id="3-尝试域名带证书CA登录ftp"><a href="#3-尝试域名带证书CA登录ftp" class="headerlink" title="3. 尝试域名带证书CA登录ftp"></a>3. 尝试域名带证书CA登录ftp</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/07/09.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/07/08.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/07/10.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/07/11.webp"><br>登录成功！</p><h3 id="4-尝试禁止上传文件类型上传"><a href="#4-尝试禁止上传文件类型上传" class="headerlink" title="4.  尝试禁止上传文件类型上传"></a>4.  尝试禁止上传文件类型上传</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/07/12.webp"><br>上传失败！</p><h3 id="5-尝试下载文件"><a href="#5-尝试下载文件" class="headerlink" title="5. 尝试下载文件"></a>5. 尝试下载文件</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/07/13.webp"><br>成功！</p><h3 id="6-单IP多用户登录"><a href="#6-单IP多用户登录" class="headerlink" title="6. 单IP多用户登录"></a>6. 单IP多用户登录</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/07/14.webp"><br>最多只能2个不能再多了！</p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">细描述了如何在Linux系统上搭建一个安全可靠的FTPS服务器，并进行了功能测试。步骤清晰，图文并茂，易于理解和操作。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="网络" scheme="https://one.blog.418121.xyz/tags/%E7%BD%91%E7%BB%9C/"/>
    
    <category term="FTP" scheme="https://one.blog.418121.xyz/tags/FTP/"/>
    
  </entry>
  
  <entry>
    <title>第六章 Centos 7 Linux配置web 实训任务：Apache服务器部署</title>
    <link href="https://one.blog.418121.xyz/posts/f0f1ea42.html"/>
    <id>https://one.blog.418121.xyz/posts/f0f1ea42.html</id>
    <published>2024-05-28T05:04:51.000Z</published>
    <updated>2024-11-25T15:04:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><em><strong>&#x3D;&#x3D;前面的DNS一定要成功才能做！！！&#x3D;&#x3D;</strong></em></p><p>Apache服务器部署任务情境描述某公司需要搭建一台Web服务器，用于公司办公和网站宣传；还有另一台DNS服务器，用于实现Web服务器的域名解析。部署信息如下：Server1为DNS服务器，IP地址为：192.168.1.10；Server2为Web服务器，IP地址为：192.168.1.100。</p><p>虚拟机需求：1台DNS服务器（Server）、1台Web服务器（Web Server）、1台客户端（Client1）</p><blockquote><p><strong>在第五章的基础上继续实训</strong></p></blockquote><h2 id="Apache服务器部署"><a href="#Apache服务器部署" class="headerlink" title="Apache服务器部署"></a>Apache服务器部署</h2><blockquote><p>任务情境描述</p><p>某公司需要搭建一台Web服务器，用于公司办公和网站宣传；还有另一台DNS服务器，用于实现Web服务器的域名解析。</p><p> 网络拓扑图如下：<br><img src="https://images.418121.xyz/file/blog/study/linux/06/01.webp"></p></blockquote><blockquote><p>部署信息如下：</p><p>•        Server1为DNS服务器，IP地址为：192.168.1.10；</p><p>•        Server2为Web服务器，IP地址为：192.168.1.100。</p></blockquote><blockquote><h3 id="实训任务："><a href="#实训任务：" class="headerlink" title="实训任务："></a>实训任务：</h3><h4 id="任务1"><a href="#任务1" class="headerlink" title="任务1"></a>任务1</h4><p>搭建http: &#x2F;&#x2F;web1.mydomain.com的web1服务器，主目录是&#x2F;var&#x2F;www&#x2F;web1，只允许192.168.1.0&#x2F;24网段的主机访问。</p></blockquote><blockquote><h4 id="任务2"><a href="#任务2" class="headerlink" title="任务2"></a>任务2</h4><p>搭建基于8008端口号的安全服务器，可使用https: &#x2F;&#x2F;web2.mydomain.com:8008地址访问，主目录是&#x2F;var&#x2F;www&#x2F;web2，使用CA颁发证书进行安全认证。<br>“CSK Global Root CA”颁发机构颁发，网站证书信息如下：<br> C &#x3D; CN<br> ST &#x3D; China<br> L &#x3D; GuangZhou<br> O &#x3D; mydomain.com<br> OU &#x3D; Operations Departments<br> CN &#x3D; web2.mydomain.com</p></blockquote><blockquote><h4 id="任务3-启动防火墙，SELinux设置为（Enforcing）。"><a href="#任务3-启动防火墙，SELinux设置为（Enforcing）。" class="headerlink" title="任务3 启动防火墙，SELinux设置为（Enforcing）。"></a>任务3 启动防火墙，SELinux设置为（Enforcing）。</h4></blockquote><h2 id="一、配置Web服务器（Web-Server）的IP地址"><a href="#一、配置Web服务器（Web-Server）的IP地址" class="headerlink" title="一、配置Web服务器（Web Server）的IP地址"></a>一、配置Web服务器（Web Server）的IP地址</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">BOOTPROTO=static</span><br><span class="line">IPADDR=192.168.1.100</span><br><span class="line">GATEWAY=192.168.1.2</span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">DNS1=192.168.1.10</span><br><span class="line">DNS2=202.96.128.86</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/02.webp"></p><h2 id="二、在Web服务器（Web-Server）上生成CA证书"><a href="#二、在Web服务器（Web-Server）上生成CA证书" class="headerlink" title="二、在Web服务器（Web Server）上生成CA证书"></a>二、在Web服务器（Web Server）上生成CA证书</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver webserver]# <span class="built_in">cd</span> /etc/pki/tls/certs/</span><br><span class="line">[root@webserver certs]# make server.key</span><br><span class="line"></span><br><span class="line">[root@webserver certs]# openssl rsa -<span class="keyword">in</span> server.key -out server.key</span><br><span class="line"></span><br><span class="line">[root@webserver certs]# make server.csr</span><br><span class="line"><span class="built_in">umask</span> 77 ; \</span><br><span class="line">/usr/bin/openssl req -utf8 -new -key server.key -out server.csr</span><br><span class="line">You are about to be asked to enter information that will be incorporated</span><br><span class="line">into your certificate request.</span><br><span class="line">What you are about to enter is what is called a Distinguished Name or a DN.</span><br><span class="line">There are quite a few fields but you can leave some blank</span><br><span class="line">For some fields there will be a default value,</span><br><span class="line">If you enter <span class="string">&#x27;.&#x27;</span>, the field will be left blank.</span><br><span class="line">-----</span><br><span class="line">Country Name (2 letter code) [XX]:CN</span><br><span class="line">State or Province Name (full name) []:China</span><br><span class="line">Locality Name (eg, city) [Default City]:GuangZhou</span><br><span class="line">Organization Name (eg, company) [Default Company Ltd]:ymx.com</span><br><span class="line">Organizational Unit Name (eg, section) []:Operations Deoartments</span><br><span class="line">Common Name (eg, your name or your server<span class="string">&#x27;s hostname) []:web2.ymx.com</span></span><br><span class="line"><span class="string">Email Address []:</span></span><br><span class="line"><span class="string">Please enter the following &#x27;</span>extra<span class="string">&#x27; attributes</span></span><br><span class="line"><span class="string">to be sent with your certificate request</span></span><br><span class="line"><span class="string">A challenge password []:</span></span><br><span class="line"><span class="string">An optional company name []:</span></span><br><span class="line"><span class="string">[root@webserver certs]# openssl x509 -in server.csr -out server.pem -req -signkey server.key -days 365</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">[root@webserver certs]# chmod 400 server.*</span></span><br><span class="line"><span class="string">[root@webserver certs]# yum -y install httpd mod_ssl</span></span><br><span class="line"><span class="string">[root@webserver certs]# systemctl restart httpd</span></span><br><span class="line"><span class="string"></span></span><br></pre></td></tr></table></figure><h3 id="1-修改OpenSSL配置文件"><a href="#1-修改OpenSSL配置文件" class="headerlink" title="1. 修改OpenSSL配置文件"></a>1. 修改OpenSSL配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/pki/tls/openssl.cnf  //打开OpenSSL配置文件修改以下</span><br><span class="line">my-ca.crt</span><br><span class="line">my-ca.crl</span><br><span class="line">my-ca.key</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/03.webp"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">[ req_distinguished_name ]</span><br><span class="line">countryName                     = Country Name (2 letter code)</span><br><span class="line">countryName_default             = CN</span><br><span class="line">countryName_min                 = 2</span><br><span class="line">countryName_max                 = 2</span><br><span class="line"></span><br><span class="line">stateOrProvinceName             = State or Province Name (full name)</span><br><span class="line">stateOrProvinceName_default     = China</span><br><span class="line"></span><br><span class="line">localityName                    = Locality Name (eg, city)</span><br><span class="line">localityName_default            = GuangZhou</span><br><span class="line"></span><br><span class="line">0.organizationName              = Organization Name (eg, company)</span><br><span class="line">0.organizationName_default      = ymx.com</span><br><span class="line"></span><br><span class="line"># we can do this but it is not needed normally :-)</span><br><span class="line">#1.organizationName             = Second Organization Name (eg, company)</span><br><span class="line">#1.organizationName_default     = World Wide Web Pty Ltd</span><br><span class="line"></span><br><span class="line">organizationalUnitName          = Organizational Unit Name (eg, section)</span><br><span class="line">organizationalUnitName_default  = Operations Deoartments</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/04.webp" alt="2"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">保存退出 :wq</span><br><span class="line"> <span class="built_in">cd</span> /etc/pki/CA/  //进入CA目录</span><br><span class="line"> <span class="built_in">ls</span>         //查看目录</span><br></pre></td></tr></table></figure><h3 id="2-生成CA文件"><a href="#2-生成CA文件" class="headerlink" title="2. 生成CA文件"></a>2. 生成CA文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">touch</span> /etc/pki/CA/index.txt             //新建一个放数据的文件</span><br><span class="line"><span class="built_in">echo</span> 01 &gt; /etc/pki/CA/serial            //创建一个索引文件</span><br><span class="line">openssl genrsa -out private/my-ca.key -des3 2048  //生成CA文件，输入两次密码（请记住）</span><br></pre></td></tr></table></figure><h3 id="3-生成公钥文件"><a href="#3-生成公钥文件" class="headerlink" title="3. 生成公钥文件"></a>3. 生成公钥文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl req -new -x509 -key private/my-ca.key -days 365 &gt; my-ca.crt //生成公钥文件</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/05.webp"></p><h3 id="4-创建Server-key"><a href="#4-创建Server-key" class="headerlink" title="4. 创建Server.key"></a>4. 创建Server.key</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">openssl genrsa -des3 -out server.key 2048 //创建server.key</span><br><span class="line"><span class="built_in">ls</span>                      //查看目录</span><br><span class="line">openssl rsa -noout -text -<span class="keyword">in</span> server.key   //不输出以text文本查看server.key，输入保护密钥</span><br><span class="line"><span class="built_in">cat</span> server.key                //查看</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/06.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">openssl req -new -key server.key -out server.csr  //证书申请</span><br><span class="line"><span class="built_in">ls</span>                          //查看目录</span><br><span class="line">openssl ca -<span class="keyword">in</span> server.csr -out server.crt     //生成公钥文件，输入密码，两次确认</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/07.webp"></p><h2 id="三、在DNS服务器（Server）上添加记录"><a href="#三、在DNS服务器（Server）上添加记录" class="headerlink" title="三、在DNS服务器（Server）上添加记录"></a>三、在DNS服务器（Server）上添加记录</h2><h3 id="1-添加正向区域记录"><a href="#1-添加正向区域记录" class="headerlink" title="1. 添加正向区域记录"></a>1. 添加正向区域记录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">vim /var/named/ymx.com.zone   //打开正向区域文件</span><br><span class="line"><span class="variable">$TTL</span> 1D</span><br><span class="line">@       IN SOA  dns ymx.com. (</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      dns</span><br><span class="line">dns     A       192.168.1.10</span><br><span class="line">www     A       192.168.1.100</span><br><span class="line">web1    A       192.168.1.100       //添加这两条</span><br><span class="line">web2    A       192.168.1.100</span><br><span class="line">mail    A       192.168.1.200</span><br><span class="line">ftp     CNAME   www</span><br><span class="line">mail    MX 10   mail</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/08.webp"></p><h3 id="2-添加反向区域记录"><a href="#2-添加反向区域记录" class="headerlink" title="2. 添加反向区域记录"></a>2. 添加反向区域记录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">vim /var/named/1.168.192.zone //打开反向区域配置文件</span><br><span class="line"><span class="variable">$TTL</span> 1D</span><br><span class="line">@       IN SOA  dns ymx.com. (</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      dns</span><br><span class="line">dns     A       192.168.1.10</span><br><span class="line">10      PTR     dns.ymx.com.</span><br><span class="line">100     PTR     web1.ymx.com.       //添加这两条</span><br><span class="line">100     PTR     web2.ymx.com.</span><br><span class="line">100     PTR     www.ymx.com.</span><br><span class="line">100     PTR     ftp.ymx.com.</span><br><span class="line">200     PTR     mail.ymx.com.</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/09.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart named     //重启dns服务</span><br></pre></td></tr></table></figure><h2 id="四、在Web服务器（Web-Server）上安装httpd和mod-ssl服务"><a href="#四、在Web服务器（Web-Server）上安装httpd和mod-ssl服务" class="headerlink" title="四、在Web服务器（Web Server）上安装httpd和mod_ssl服务"></a>四、在Web服务器（Web Server）上安装httpd和mod_ssl服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install http mod_ssl   //安装</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/10.webp"></p><h3 id="1-修改ssl配置文件"><a href="#1-修改ssl配置文件" class="headerlink" title="1.修改ssl配置文件"></a>1.修改ssl配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/httpd/conf.d/ssl.conf  //修改配置文件</span><br><span class="line">Listen 8008 https                 //监听8008端口</span><br><span class="line">&lt;VirtualHost *:8008&gt;                //虚拟主机头</span><br><span class="line">ServerName web2.ymx.com:8008            //服务器名</span><br><span class="line">DocumentRoot <span class="string">&quot;/var/www/web2&quot;</span>            //目录</span><br><span class="line">SSLCertificateFile /etc/pki/CA/server.crt     //ca证书文件</span><br><span class="line">SSLCertificateKeyFile /etc/pki/CA/server.key    //ca公钥文件</span><br><span class="line">SSLCACertificateFile /etc/pki/CA/server.crt     //ca私钥文件</span><br><span class="line">&lt;/VirtualHost&gt;</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/11.webp"></p><h3 id="2-新建网页"><a href="#2-新建网页" class="headerlink" title="2. 新建网页"></a>2. 新建网页</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver CA]# <span class="built_in">mkdir</span> /var/www/web1</span><br><span class="line">[root@webserver CA]# <span class="built_in">mkdir</span> /var/www/web2</span><br><span class="line">[root@webserver CA]# vim /var/www/html/index.html</span><br><span class="line">[root@webserver CA]# vim /var/www/web1/index.html</span><br><span class="line">[root@webserver CA]# vim /var/www/web2/index.html</span><br></pre></td></tr></table></figure><h3 id="3-新建虚拟主机"><a href="#3-新建虚拟主机" class="headerlink" title="3. 新建虚拟主机"></a>3. 新建虚拟主机</h3> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/httpd/conf.d/vhost.conf</span><br><span class="line">&lt;VirtualHost www.ymx.com&gt;</span><br><span class="line">ServerName www.ymx.com</span><br><span class="line">DocumentRoot <span class="string">&quot;/var/www/html&quot;</span></span><br><span class="line">&lt;/VirtualHost&gt;</span><br><span class="line"></span><br><span class="line">&lt;VirtualHost web1.ymx.com&gt;</span><br><span class="line">ServerName web1.ymx.com</span><br><span class="line">DocumentRoot <span class="string">&quot;/var/www/web1&quot;</span></span><br><span class="line">&lt;/VirtualHost&gt;</span><br><span class="line"></span><br><span class="line">&lt;Directory <span class="string">&#x27;/var/www/web1&#x27;</span>&gt;</span><br><span class="line">Options Indexes FollowSymLinks</span><br><span class="line">AllowOverride None</span><br><span class="line">Order allow,deny</span><br><span class="line">allow from 192.168.1.0/24 //只允许192.168.1.0/24 通过</span><br><span class="line">&lt;/Directory&gt;</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/12.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver webserver]# systemctl restart httpd         //重启http服务</span><br><span class="line">Enter SSL pass phrase <span class="keyword">for</span> web2.ymx.com:8008 (RSA) : ****      //输入密码</span><br><span class="line">[root@webserver webserver]# systemctl <span class="built_in">enable</span> httpd          //开机自启</span><br><span class="line">Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.</span><br><span class="line">[root@webserver webserver]# </span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="5-修改httpd-conf配置文件"><a href="#5-修改httpd-conf配置文件" class="headerlink" title="5. 修改httpd.conf配置文件"></a>5. 修改httpd.conf配置文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver CA]# vim /etc/httpd/conf/httpd.conf </span><br><span class="line">ServerName www.ymx.com:80</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/06/13.webp"></p><h3 id="6-防火墙设置"><a href="#6-防火墙设置" class="headerlink" title="6. 防火墙设置"></a>6. 防火墙设置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver CA]# firewall-cmd --permanent --zone=public --add-service=http  //开启http</span><br><span class="line">success</span><br><span class="line">[root@webserver CA]# firewall-cmd --permanent --zone=public --add-service=https //开启https</span><br><span class="line">success</span><br><span class="line">[root@webserver CA]# firewall-cmd --permanent --zone=public --add-port=8008/tcp //开启8008端口</span><br><span class="line">success</span><br><span class="line">[root@webserver CA]# firewall-cmd --permanent --zone=public --add-port=8008/udp</span><br><span class="line">success</span><br><span class="line">[root@webserver CA]# firewall-cmd --reload                    //重启防火墙</span><br><span class="line">success</span><br><span class="line">[root@webserver CA]# netstat -an | grep :8008                 //查看端口</span><br><span class="line">tcp6       0      0 :::8008                 :::*                    LISTEN     </span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="7-复制证书文件"><a href="#7-复制证书文件" class="headerlink" title="7. 复制证书文件"></a>7. 复制证书文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[root@webserver CA]# <span class="built_in">cd</span> /etc/pki/CA</span><br><span class="line">[root@webserver CA]# <span class="built_in">cp</span> my-ca.crt /var/www/web1/</span><br></pre></td></tr></table></figure><h3 id="8-客户端（Client-1）导入CA证书"><a href="#8-客户端（Client-1）导入CA证书" class="headerlink" title="8. 客户端（Client 1）导入CA证书"></a>8. 客户端（Client 1）导入CA证书</h3><h4 id="打开浏览器输入地址http-web1-ymx-com-my-ca-crt-下载证书文件并导入证书"><a href="#打开浏览器输入地址http-web1-ymx-com-my-ca-crt-下载证书文件并导入证书" class="headerlink" title="打开浏览器输入地址http://web1.ymx.com/my-ca.crt 下载证书文件并导入证书"></a>打开浏览器输入地址<a href="http://web1.ymx.com/my-ca.crt">http://web1.ymx.com/my-ca.crt</a> 下载证书文件并导入证书</h4><p><img src="https://images.418121.xyz/file/blog/study/linux/06/14.webp"></p><h3 id="9-最终效果"><a href="#9-最终效果" class="headerlink" title="9. 最终效果"></a>9. 最终效果</h3><p>http：&#x2F;&#x2F;web1.ymx.com<br>http: &#x2F;&#x2F;web2.ymx.com:8008<br><img src="https://images.418121.xyz/file/blog/study/linux/06/15.webp"></p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">详细地描述了搭建一个包含两个虚拟主机的Apache服务器的过程，并使用了SSL/TLS协议对其中一个虚拟主机进行安全加密。步骤清晰，图文并茂，易于理解和操作。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="Apache" scheme="https://one.blog.418121.xyz/tags/Apache/"/>
    
  </entry>
  
  <entry>
    <title>第五章 Centos 7 Linux配置dns 实训任务：部署DNS服务器</title>
    <link href="https://one.blog.418121.xyz/posts/974b3ed7.html"/>
    <id>https://one.blog.418121.xyz/posts/974b3ed7.html</id>
    <published>2024-05-28T04:32:51.000Z</published>
    <updated>2024-11-25T15:32:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在第四章的基础上继续实训，部署DNS服务器任务情境描述某公司要求在内部网络部署DNS服务器，用内部DNS服务器为内部网络中的计算机提供内部网络和Internet的域名解析服务。环境说明：（1） server安装CentOS 7基础设施服务器（2） client安装CentOS 7桌面环境（3） server、client均已配置网络和主机名（配置了第四章就不用配置了）</p><p>虚拟机需求：1台服务器（Server）、1台客户端（Client1）</p><blockquote><p><strong>在第四章的基础上继续实训</strong></p></blockquote><h2 id="部署DNS服务器"><a href="#部署DNS服务器" class="headerlink" title="部署DNS服务器"></a>部署DNS服务器</h2><blockquote><h3 id="任务情境描述"><a href="#任务情境描述" class="headerlink" title="任务情境描述"></a>任务情境描述</h3><p>某公司要求在内部网络部署DNS服务器，用内部DNS服务器为内部网络中的计算机提供内部网络和Internet的域名解析服务。</p></blockquote><h3 id="网络拓扑图如下："><a href="#网络拓扑图如下：" class="headerlink" title="网络拓扑图如下："></a>网络拓扑图如下：</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/05/01.webp"></p><blockquote><h3 id="环境说明："><a href="#环境说明：" class="headerlink" title="环境说明："></a>环境说明：</h3><p>（1） server安装CentOS 7基础设施服务器</p><p>（2） client安装CentOS 7桌面环境</p><p>（3） server、client均已配置网络和主机名（配置了第四章就不用配置了）</p></blockquote><blockquote><h3 id="部署信息如下："><a href="#部署信息如下：" class="headerlink" title="部署信息如下："></a>部署信息如下：</h3><p>（1） 公司的DNS域名为 ymx.com（或自己命名）&#x2F;&#x2F;这里我用了自己的，用老师的是myhost.com下面表格也要跟着改</p><p>（2） 名称解释要求如下表所示：</p></blockquote><table><thead><tr><th>角色</th><th>主机名</th><th>IP地址</th><th>备注</th></tr></thead><tbody><tr><td>Web服务器</td><td><a href="http://www.ymx.com/">www.ymx.com</a></td><td>192.168.1.100</td><td></td></tr><tr><td>FTP服务器</td><td>ftp.ymx.com</td><td>192.168.1.100</td><td>配置别名记录</td></tr><tr><td>邮件服务器</td><td>mail.ymx.com</td><td>192.168.1.200</td><td>配置相应的交换记录</td></tr><tr><td>DNS服务器</td><td>dns.ymx.com</td><td>192.168.1.10</td><td>DNS服务器</td></tr></tbody></table><blockquote><h3 id="任务1（用前面的就不用重新配置了）"><a href="#任务1（用前面的就不用重新配置了）" class="headerlink" title="任务1（用前面的就不用重新配置了）"></a>任务1（用前面的就不用重新配置了）</h3><p>根据上图中的网络图谱配置实训环境</p><p>（1） 修改计算机名</p><p>（2） 配置网络</p><p>（3）开启防火墙，添加对应的服务</p></blockquote><blockquote><h3 id="任务2"><a href="#任务2" class="headerlink" title="任务2"></a>任务2</h3><p>在server1上安装DNS服务，并将其配置为主DNS服务器</p><p>（1） 安装DNS服务</p><p>（2） 创建正向查找区域，并根据上表提供的信息在区域中添加资源记录；<br>       创建反向查找区域，并根据上表提供的信息在区域中添加资源记录；</p><p>（3） 检查区域数据文件语法错误</p><p>（4） 启动&#x2F;重启DNS服务</p><p>（5） 开启防火墙，添加对应的服务</p></blockquote><blockquote><h3 id="任务3"><a href="#任务3" class="headerlink" title="任务3"></a>任务3</h3><p>使用client对主DNS服务器进行测试</p><p>（1） client网络配置</p><p>（2） 在客户端执行DNS域名查询测试，对主&#x2F;辅DNS均进行域名查询测试（可使用命令指令使用主NDS或服务DNS进行查询）</p></blockquote><h2 id="一、在服务器（Server）上安装DNS服务"><a href="#一、在服务器（Server）上安装DNS服务" class="headerlink" title="一、在服务器（Server）上安装DNS服务"></a>一、在服务器（Server）上安装DNS服务</h2><h3 id="1-确保良好的网络连接也要保证设备的联网"><a href="#1-确保良好的网络连接也要保证设备的联网" class="headerlink" title="1. 确保良好的网络连接也要保证设备的联网"></a>1. 确保良好的网络连接也要保证设备的联网</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum list installed | grep <span class="built_in">bind</span>                                 \\查看是否安装了dns服务</span><br><span class="line">yum -y install <span class="built_in">bind</span>                                                    \\安装dns服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/02.webp"></p><h3 id="2-启动服务"><a href="#2-启动服务" class="headerlink" title="2. 启动服务"></a>2. 启动服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">systemctl start named           //启动dns服务</span><br><span class="line">systemctl <span class="built_in">enable</span> named          //开机自启dns服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/03.webp"></p><h3 id="3-防火墙配置"><a href="#3-防火墙配置" class="headerlink" title="3. 防火墙配置"></a>3. 防火墙配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">firewall-cmd --permanent --zone=public --add-port=53/tcp        //开启53端口</span><br><span class="line">firewall-cmd --permanent --zone=public --add-port=53/udp</span><br><span class="line">firewall-cmd --reload                                                                           //重启防火墙</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/04.webp"></p><h2 id="二、在服务器（Server）上配置dns服务"><a href="#二、在服务器（Server）上配置dns服务" class="headerlink" title="二、在服务器（Server）上配置dns服务"></a>二、在服务器（Server）上配置dns服务</h2><h3 id="1-配置全局服务实现高速缓存"><a href="#1-配置全局服务实现高速缓存" class="headerlink" title="1.配置全局服务实现高速缓存"></a>1.配置全局服务实现高速缓存</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/named.conf             //打开配置文件进行如下修改</span><br><span class="line">named-checkconf                 //检查语法</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/05.webp"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">listen-on port 53 &#123; any; &#125;;                                                     //改为any，named监听所有IP地址</span><br><span class="line">allow-query     &#123; any; &#125;;                                                       //改为any，接受所有客户端的查询</span><br><span class="line">forwarders      &#123;202.96.128.86;202.96.128.166;&#125;;        //添加该项，配置转发器</span><br><span class="line">dnssec-enable no;                                                                       //改为no，禁用dnssec</span><br><span class="line">dnssec-validation no;                                                           </span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/06.webp"></p><blockquote><p>检查语法发现错误，是因为我第22行打错单词了，重新编辑改回去就不报错了。</p></blockquote><h3 id="2-创建定义DNS服务器正向、反向查找区域"><a href="#2-创建定义DNS服务器正向、反向查找区域" class="headerlink" title="2. 创建定义DNS服务器正向、反向查找区域"></a>2. 创建定义DNS服务器正向、反向查找区域</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/named.conf             //打开配置文件进行如下修改</span><br><span class="line">named-checkconf                 //检查语法</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/07.webp"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">zone &quot;ymx.com&quot; IN &#123;                                                     //DNS域名</span><br><span class="line">        type master;                                            //区域类型为主要区域</span><br><span class="line">        file &quot;ymx.com.zone&quot;;                            //区域数据存储文件名，位置默认为 /var/named 目录</span><br><span class="line">&#125;;</span><br><span class="line">zone &quot;1.168.192.in-addr.arpa&quot; IN &#123;                      //子网地址需要反写，后缀是固定的</span><br><span class="line">        type master;                                            //区域类型为主要区域</span><br><span class="line">        file &quot;1.168.192.zone&quot;;                          //区域数据存储文件名，位置默认为 /var/named 目录</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><blockquote><p>如是按照题目（myhost.com）来的话如下:</p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">zone &quot;myhost.com&quot; IN &#123;                                                  //DNS域名</span><br><span class="line">        type master;                                            //区域类型为主要区域</span><br><span class="line">        file &quot;myhost.com.zone&quot;;                         //区域数据存储文件名，位置默认为 /var/named 目录</span><br><span class="line">&#125;;</span><br><span class="line">zone &quot;1.168.192.in-addr.arpa&quot; IN &#123;                      //子网地址需要反写，后缀是固定的</span><br><span class="line">        type master;                                            //区域类型为主要区域</span><br><span class="line">        file &quot;1.168.192.zone&quot;;                          //区域数据存储文件名，位置默认为 /var/named 目录</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="3-创建区域数据文件"><a href="#3-创建区域数据文件" class="headerlink" title="3. 创建区域数据文件"></a>3. 创建区域数据文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/named</span><br><span class="line"><span class="built_in">cp</span> -a named.localhost ymx.com.zone              //创建正向区域数据文件</span><br><span class="line"><span class="built_in">cp</span> -a named.loopback 1.168.192.zone             //创建反向区域数据文件</span><br><span class="line">systemctl restart named                                 //重启dns服务</span><br></pre></td></tr></table></figure><blockquote><p>如是按照题目（myhost.com）来的话如下:</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/named</span><br><span class="line"><span class="built_in">cp</span> -a named.localhost myhost.com.zone   //创建正向区域数据文件</span><br><span class="line"><span class="built_in">cp</span> -a named.loopback 1.168.192.zone             //创建反向区域数据文件</span><br><span class="line">systemctl restart named                                 //重启dns服务</span><br></pre></td></tr></table></figure><h3 id="4-编辑正向区域数据文件"><a href="#4-编辑正向区域数据文件" class="headerlink" title="4. 编辑正向区域数据文件"></a>4. 编辑正向区域数据文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim ymx.com.zone                                                                                //编辑正向区域数据</span><br><span class="line">named-checkzone ymx.com.zone  /var/named/ymx.com.zone   //检查语法</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/08.webp"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">$TTL 1D</span><br><span class="line">@       IN SOA  dns ymx.com. (                                                                  //区域授权服务器</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      dns</span><br><span class="line">dns     A       192.168.1.10                                                                    //名称服务器记录</span><br><span class="line">www     A       192.168.1.100                                                                   //主机记录</span><br><span class="line">mail    A       192.168.1.200</span><br><span class="line">ftp     CNAME   www                                                                                             //别名记录</span><br><span class="line">mail    MX 10   mail                                                                                    //邮箱交换器记录</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><p>如是按照题目（myhost.com）来的话如下:</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">vim myhost.com.zone                                                                                     //编辑正向区域数据</span><br><span class="line">named-checkzone myhost.com.zone  /var/named/myhost.com.zone     //检查语法</span><br><span class="line"><span class="variable">$TTL</span> 1D</span><br><span class="line">@       IN SOA  server myhost.com. (                                                                    //区域授权服务器</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      server</span><br><span class="line">server  A       192.168.1.10                                                                    //名称服务器记录</span><br><span class="line">www     A       192.168.1.100                                                                   //主机记录</span><br><span class="line">mail    A       192.168.1.200</span><br><span class="line">ftp     CNAME   www                                                                                             //别名记录</span><br><span class="line">mail    MX 10   mail                                                                                    //邮箱交换器记录</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/09.webp"></p><h3 id="5-编辑反向区域数据文件"><a href="#5-编辑反向区域数据文件" class="headerlink" title="5. 编辑反向区域数据文件"></a>5. 编辑反向区域数据文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim 1.168.192.zone                                                                                      //编辑反向区域数据</span><br><span class="line">named-checkzone 1.168.192.zone  /var/named/1.168.192.zone       //检查语法</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/10.webp"></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">$TTL 1D</span><br><span class="line">@       IN SOA  dns ymx.com. (                                                          //区域授权的DNS服务器</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      dns                                                                                     //名称服务器记录</span><br><span class="line">dns     A       192.168.1.10                                                            //指针记录</span><br><span class="line">10      PTR     dns.ymx.com.</span><br><span class="line">100     PTR     www.ymx.com.</span><br><span class="line">100     PTR     ftp.ymx.com.</span><br><span class="line">200     PTR     mail.ymx.com.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/11.webp"></p><blockquote><p>如是按照题目（myhost.com）来的话如下:</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">vim 1.168.192.zone                                                                                      //编辑反向区域数据</span><br><span class="line">named-checkzone 1.168.192.zone  /var/named/1.168.192.zone       //检查语法</span><br><span class="line"><span class="variable">$TTL</span> 1D</span><br><span class="line">@       IN SOA  server myhost.com. (                                                    //区域授权的DNS服务器</span><br><span class="line">                                        0       ; serial</span><br><span class="line">                                        1D      ; refresh</span><br><span class="line">                                        1H      ; retry</span><br><span class="line">                                        1W      ; expire</span><br><span class="line">                                        3H )    ; minimum</span><br><span class="line">        NS      server                                                                                  //名称服务器记录</span><br><span class="line">server  A       192.168.1.10                                                                    //指针记录</span><br><span class="line">10      PTR     server.myhost.com.                                              </span><br><span class="line">100     PTR     www.myhost.com.</span><br><span class="line">100     PTR     ftp.myhost.com.</span><br><span class="line">200     PTR     mail.myhost.com.</span><br><span class="line"></span><br></pre></td></tr></table></figure><blockquote><p>若语法检查无错误<br><img src="https://images.418121.xyz/file/blog/study/linux/05/12.webp"></p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart named         //重启dns服务，且无返回信息则成功</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/13.webp"></p><h2 id="三、在客户端（Client1）上进行测试"><a href="#三、在客户端（Client1）上进行测试" class="headerlink" title="三、在客户端（Client1）上进行测试"></a>三、在客户端（Client1）上进行测试</h2><h3 id="1-重新获取"><a href="#1-重新获取" class="headerlink" title="1. 重新获取"></a>1. 重新获取</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">dhclient -r                                             //释放租约</span><br><span class="line">dhclient                                                //重新获取租约</span><br><span class="line"><span class="built_in">tail</span> /etc/resolv.conf                   //查看客户端使用的DNS服务器</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/14.webp"></p><h3 id="2-nslookup非交互式操作"><a href="#2-nslookup非交互式操作" class="headerlink" title="2. nslookup非交互式操作"></a>2. nslookup非交互式操作</h3><h4 id="2-1-测试正向解析"><a href="#2-1-测试正向解析" class="headerlink" title="2.1 测试正向解析"></a>2.1 测试正向解析</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">nslookup www.ymx.com</span><br><span class="line">nslookup ftp.ymx.com</span><br><span class="line">nslookup mail.ymx.com</span><br><span class="line">nslookup www.baidu.com</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/15.webp"></p><h4 id="2-2-测试反向解析"><a href="#2-2-测试反向解析" class="headerlink" title="2.2 测试反向解析"></a>2.2 测试反向解析</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">nslookup 202.108.22.5</span><br><span class="line">nslookup 192.168.1.10</span><br><span class="line">nslookup 192.168.1.100</span><br><span class="line">nslookup 192.168.1.200</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/16.webp"></p><h3 id="3-nslookup交互式操作（知道就好不用做）"><a href="#3-nslookup交互式操作（知道就好不用做）" class="headerlink" title="3. nslookup交互式操作（知道就好不用做）"></a>3. nslookup交互式操作（知道就好不用做）</h3><h4 id="3-1-查看所有配置"><a href="#3-1-查看所有配置" class="headerlink" title="3.1 查看所有配置"></a>3.1 查看所有配置</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nslookup</span><br><span class="line"><span class="built_in">set</span> all</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/17.webp"></p><h4 id="3-2-查询主机名www-ymx-com"><a href="#3-2-查询主机名www-ymx-com" class="headerlink" title="3.2 查询主机名www.ymx.com"></a>3.2 查询主机名<a href="http://www.ymx.com/">www.ymx.com</a></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">www.ymx.com</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/18.webp"></p><h4 id="3-3-查询ymx-com区域授权记录"><a href="#3-3-查询ymx-com区域授权记录" class="headerlink" title="3.3 查询ymx.com区域授权记录"></a>3.3 查询ymx.com区域授权记录</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> <span class="built_in">type</span>=soa</span><br><span class="line">ymx.com</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/19.webp"></p><h4 id="3-4-查询1-168-192-in-addr-arpa区域授权记录"><a href="#3-4-查询1-168-192-in-addr-arpa区域授权记录" class="headerlink" title="3.4 查询1.168.192.in-addr.arpa区域授权记录"></a>3.4 查询1.168.192.in-addr.arpa区域授权记录</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1.168.192.in-addr.arpa</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/20.webp"></p><h4 id="3-5-查询邮箱交换器记录"><a href="#3-5-查询邮箱交换器记录" class="headerlink" title="3.5 查询邮箱交换器记录"></a>3.5 查询邮箱交换器记录</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> <span class="built_in">type</span>=mx</span><br><span class="line">ymx.com</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/21.webp"></p><h4 id="3-6-查询名称服务器记录"><a href="#3-6-查询名称服务器记录" class="headerlink" title="3.6 查询名称服务器记录"></a>3.6 查询名称服务器记录</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">set</span> <span class="built_in">type</span>=ns</span><br><span class="line">ymx.com</span><br><span class="line">1.168.192.in-addr.arpa</span><br><span class="line"><span class="built_in">exit</span>                                                    //退出</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/05/22.webp"></p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">部署和配置内部网络中的DNS服务器。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="运维" scheme="https://one.blog.418121.xyz/tags/%E8%BF%90%E7%BB%B4/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="网络" scheme="https://one.blog.418121.xyz/tags/%E7%BD%91%E7%BB%9C/"/>
    
    <category term="DNS" scheme="https://one.blog.418121.xyz/tags/DNS/"/>
    
  </entry>
  
  <entry>
    <title>第四章 Centos 7 Linux配置dhcp 实训任务1：使用DHCP中继部署多子网环境</title>
    <link href="https://one.blog.418121.xyz/posts/6d7d2758.html"/>
    <id>https://one.blog.418121.xyz/posts/6d7d2758.html</id>
    <published>2024-05-28T04:05:51.000Z</published>
    <updated>2024-11-25T15:05:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>任务情境描述：为校园网1号办公楼和2号办公楼的网络设备分配地址，客户端Client1和Client2可通过DHCP服务器分配地址。要求：1号楼地址池范围：192.168.1.110-192.168.1.190&#x2F;24，网关：192.168.1.2；2号楼地址池范围：192.168.2.100-192.168.2.200&#x2F;24，网关：192.168.2.254；域名解析服务器：192.168.1.10和192.168.1.11为Client1动态分配地址，Client2用户分配固定地址，</p><p>虚拟机需求：1台服务器（Server）、1台中继服务器（Relay Server）、2台客户端（Client1、Client2）</p><blockquote><p><strong>在第三章的基础上继续实训</strong></p></blockquote><h2 id="实训任务1：DHCP中继部署"><a href="#实训任务1：DHCP中继部署" class="headerlink" title="实训任务1：DHCP中继部署"></a>实训任务1：DHCP中继部署</h2><blockquote><p>任务情境描述：为校园网1号办公楼和2号办公楼的网络设备分配地址，客户端Client1和Client2可通过DHCP服务器分配地址。</p></blockquote><p>网络拓扑如下：<br><img src="https://images.418121.xyz/file/blog/study/linux/04/01.webp"></p><blockquote><h3 id="任务要求："><a href="#任务要求：" class="headerlink" title="任务要求："></a>任务要求：</h3><p>1号楼地址池范围：192.168.1.110-192.168.1.190&#x2F;24，网关：192.168.1.2；</p><p>2号楼地址池范围：192.168.2.100-192.168.2.200&#x2F;24，网关：192.168.2.254；</p><p>域名解析服务器：192.168.1.10和192.168.1.11；</p><p>为Client1动态分配地址，Client2用户分配固定地址，地址为 192.168.2.188&#x2F;24。</p></blockquote><blockquote><h3 id="检查要求：-会查看客户端和服务器端的租约文件，并理解租约信息。"><a href="#检查要求：-会查看客户端和服务器端的租约文件，并理解租约信息。" class="headerlink" title="检查要求： 会查看客户端和服务器端的租约文件，并理解租约信息。"></a>检查要求： 会查看客户端和服务器端的租约文件，并理解租约信息。</h3></blockquote><blockquote><h3 id="任务提示："><a href="#任务提示：" class="headerlink" title="任务提示："></a>任务提示：</h3><p>DHCP Relay设备配置两张网卡，分别为192.168.1.254和192.168.2.10</p><p>并在&#x2F;etc&#x2F;sysctl.conf中添加：</p><p>net.ipv4.ip_forward&#x3D;1            &#x2F;&#x2F;全网通</p><p>保存后，重新加载系统参数</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#sysctl -p </span></span><br></pre></td></tr></table></figure></blockquote><blockquote><h3 id="注意事项："><a href="#注意事项：" class="headerlink" title="注意事项："></a>注意事项：</h3><p>192.168.1.0&#x2F;24网络适配器选择NAT模式；</p><p>192.168.2.0&#x2F;24网络适配器选择仅主机模式；</p><p>Client1和Client2可以是独立的主机（资源允许），也可以通过在Server和Relay端添加网卡的形式，模拟客户端网卡。<br>这次实验一共4台虚拟机</p></blockquote><h2 id="一、在服务器（Server）和中继服务器（Relay-Server）上安装dhcp服务"><a href="#一、在服务器（Server）和中继服务器（Relay-Server）上安装dhcp服务" class="headerlink" title="一、在服务器（Server）和中继服务器（Relay Server）上安装dhcp服务"></a>一、在服务器（Server）和中继服务器（Relay Server）上安装dhcp服务</h2><h3 id="1-中继服务器安装双网卡详细看第一章-十五、中继服务器安装，和这里的方法如下："><a href="#1-中继服务器安装双网卡详细看第一章-十五、中继服务器安装，和这里的方法如下：" class="headerlink" title="1. 中继服务器安装双网卡详细看第一章 十五、中继服务器安装，和这里的方法如下："></a>1. 中继服务器安装双网卡详细看<a href="https://yeminxi.github.io/posts/6404ce4b.html#%E5%8D%81%E4%BA%94%E3%80%81%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%AE%89%E8%A3%85%E5%8F%AF%E4%BB%A5%E5%8F%82%E8%80%83%E8%BF%99%E4%B8%80%E6%AD%A5%EF%BC%88%E5%85%B6%E4%BD%99%E5%8F%AF%E5%BF%BD%E7%95%A5%E6%AD%A4%E6%AD%A5%EF%BC%89">第一章 十五、中继服务器安装</a>，和这里的方法如下：</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/04/02.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/04/03.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nmtui   //进入图形化设置</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/04.webp"><br>网卡会激活失败，原因是自动获取的，我已经关掉虚拟网络的dhcp服务，所以在另外在网卡脚本文件配置静态的IP的地址</p><h3 id="2-给中继服务器（Relay-Server）双网卡配置静态ip地址"><a href="#2-给中继服务器（Relay-Server）双网卡配置静态ip地址" class="headerlink" title="2. 给中继服务器（Relay Server）双网卡配置静态ip地址"></a>2. 给中继服务器（Relay Server）双网卡配置静态ip地址</h3><h4 id="2-1-配置NAT模式下的网卡静态地址"><a href="#2-1-配置NAT模式下的网卡静态地址" class="headerlink" title="2.1 配置NAT模式下的网卡静态地址"></a>2.1 配置NAT模式下的网卡静态地址</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/sysconfig/network-scripts/ifcfg-ens33  //每个人的网卡名称都不一样 一切按时来</span><br><span class="line">vim /etc/sysconfig/network-scripts/ifcfg-ens34  //我这里的 ens开头的 33是NAT模式的 34是仅主机模式的</span><br><span class="line"> BOOTPROTO=<span class="string">&quot;static&quot;</span> </span><br><span class="line">ONBOOT=<span class="string">&quot;yes&quot;</span> </span><br><span class="line"> IPADDR=192.168.1.254</span><br><span class="line">NETMASK=255.255.255.0 </span><br><span class="line">GATEWAY=192.168.1.2 </span><br><span class="line">DNS1=202.96.128.86（电信）  联通：221.5.88.88  移动：211.136.192.6</span><br><span class="line">DNS2=114.114.114.114</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/05.webp"></p><h4 id="2-2-配置仅主机模式下的网卡静态地址"><a href="#2-2-配置仅主机模式下的网卡静态地址" class="headerlink" title="2.2 配置仅主机模式下的网卡静态地址"></a>2.2 配置仅主机模式下的网卡静态地址</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">BOOTPROTO=static  </span><br><span class="line">ONBOOT=<span class="built_in">yes</span> </span><br><span class="line">IPADDR=192.168.2.10 </span><br><span class="line">NETMASK=255.255.255.0</span><br><span class="line">GATEWAY=192.168.2.254 </span><br><span class="line">DNS1=202.96.128.86 </span><br><span class="line">DNS2=114.114.114.114</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/06.webp"></p><h4 id="2-3-重启网络服务并ping通服务器（Server）"><a href="#2-3-重启网络服务并ping通服务器（Server）" class="headerlink" title="2.3 重启网络服务并ping通服务器（Server）"></a>2.3 重启网络服务并ping通服务器（Server）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart network       //重启网络</span><br><span class="line">ping 192.168.1.10                       //ping服务器（server）</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/07.webp"></p><h3 id="3-在服务器（Server）上安装dhcp服务（确保良好的网络连接也要保证设备的联网）"><a href="#3-在服务器（Server）上安装dhcp服务（确保良好的网络连接也要保证设备的联网）" class="headerlink" title="3. 在服务器（Server）上安装dhcp服务（确保良好的网络连接也要保证设备的联网）"></a>3. 在服务器（Server）上安装dhcp服务（确保良好的网络连接也要保证设备的联网）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum list installed | grep dhcp                                 \\查看是否安装了dhcp服务</span><br><span class="line">yum -y install dhcp                                                    \\安装dhcp服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/08.webp"></p><h3 id="4-中继服务器（Relay-Server）同理"><a href="#4-中继服务器（Relay-Server）同理" class="headerlink" title="4. 中继服务器（Relay Server）同理"></a>4. 中继服务器（Relay Server）同理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum list installed | grep dhcp                                 \\查看是否安装了dhcp服务</span><br><span class="line">yum -y install dhcp                                                    \\安装dhcp服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/09.webp"></p><h2 id="二、在服务器（Server）上配置地址池"><a href="#二、在服务器（Server）上配置地址池" class="headerlink" title="二、在服务器（Server）上配置地址池"></a>二、在服务器（Server）上配置地址池</h2><h3 id="1-添加地址池"><a href="#1-添加地址池" class="headerlink" title="1. 添加地址池"></a>1. 添加地址池</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/dhcp/dhcpd.conf        //打开配置文件</span><br><span class="line">option domain-name <span class="string">&quot;example.org&quot;</span>; </span><br><span class="line">option domain-name-servers 192.168.1.10,192.168.1.11; </span><br><span class="line">default-lease-time 600; </span><br><span class="line">max-lease-time 7200; </span><br><span class="line">subnet 192.168.1.0 netmask 255.255.255.0 &#123;</span><br><span class="line">         range 192.168.1.110 192.168.1.190;</span><br><span class="line">         option routers 192.168.1.2; </span><br><span class="line">&#125; </span><br><span class="line">subnet 192.168.2.0 netmask 255.255.255.0 &#123;</span><br><span class="line">         range 192.168.2.100 192.168.2.200;</span><br><span class="line">         option routers 192.168.2.254;</span><br><span class="line">         host client2 &#123;</span><br><span class="line">                 hardware ethernet 00:0C:29:B4:04:A7;</span><br><span class="line">                 fixed-address 192.168.2.188;</span><br><span class="line">         &#125; </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/10.webp"></p><p><img src="https://images.418121.xyz/file/blog/study/linux/04/11.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dhcpd -t        //检查语法错误</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/12.webp"></p><h3 id="2-重启dhcp服务并自启"><a href="#2-重启dhcp服务并自启" class="headerlink" title="2.重启dhcp服务并自启"></a>2.重启dhcp服务并自启</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart dhcpd         //重启dhcp服务</span><br><span class="line">systemctl <span class="built_in">enable</span> dhcpd          //开机自启dhcp服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/13.webp"></p><h3 id="3-添加默认路由"><a href="#3-添加默认路由" class="headerlink" title="3. 添加默认路由"></a>3. 添加默认路由</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">route add default gw 192.168.1.254</span><br><span class="line">route add default gw 192.168.1.2</span><br></pre></td></tr></table></figure><h2 id="三、在中继服务器（Relay-Server）配置中继服务"><a href="#三、在中继服务器（Relay-Server）配置中继服务" class="headerlink" title="三、在中继服务器（Relay Server）配置中继服务"></a>三、在中继服务器（Relay Server）配置中继服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cp</span> /lib/systemd/system/dhcrelay.service /etc/systemd/system   //将dhcp中继主配文件复制</span><br><span class="line">vim /etc/systemd/system/dhcrelay.service                      //编辑dhcp中继主配文件</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/14.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">systemctl daemon-reload                                 //重载</span><br><span class="line">systemctl start dhcrelay.service                //启动中继服务</span><br><span class="line">systemctl <span class="built_in">enable</span> dhcrelay.service               //开机自启中继服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/15.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/sysctl.conf    //打开配置文件</span><br><span class="line"><span class="string">&quot;net.ipv4.ip_forward=1&quot;</span> //加入这一句话</span><br><span class="line">sysctl -p                               //重载</span><br><span class="line">dhcrelay 192.168.1.10   //开启中继</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/16.webp"></p><h2 id="四、验证"><a href="#四、验证" class="headerlink" title="四、验证"></a>四、验证</h2><h3 id="1-客户端（Client1）验证"><a href="#1-客户端（Client1）验证" class="headerlink" title="1.客户端（Client1）验证"></a>1.客户端（Client1）验证</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/sysconfig/network-scripts/ifcfg-ens33  //打开网卡配置脚本 将之前的静态地址改成dhcp</span><br><span class="line">systemctl restart network                                               //重启网络服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/17.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">dhclient -r                                                             //释放租约</span><br><span class="line">dhclient                                                                //重新获取租约</span><br><span class="line">ip addr show ens33                                              //查看网卡ens33的状态</span><br><span class="line"><span class="built_in">tail</span> /var/lib/dhclient/dhclient.leases  //查看租约</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/18.webp"></p><h3 id="2-客户端（Client2）验证同理，这里就不演示了。下面展示一下window7怎么获取。"><a href="#2-客户端（Client2）验证同理，这里就不演示了。下面展示一下window7怎么获取。" class="headerlink" title="2.客户端（Client2）验证同理，这里就不演示了。下面展示一下window7怎么获取。"></a>2.客户端（Client2）验证同理，这里就不演示了。下面展示一下window7怎么获取。</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/04/19.webp"><br>查看租约<br><img src="https://images.418121.xyz/file/blog/study/linux/04/20.webp"></p><h3 id="3-服务器（Server）查看租约"><a href="#3-服务器（Server）查看租约" class="headerlink" title="3.服务器（Server）查看租约"></a>3.服务器（Server）查看租约</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">tail</span> /var/lib/dhcpd/dhcpd.leases</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/04/21.webp"></p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">部署和配置DHCP中继服务。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="网络安全" scheme="https://one.blog.418121.xyz/tags/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/"/>
    
    <category term="网络协议" scheme="https://one.blog.418121.xyz/tags/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/"/>
    
    <category term="DHCP" scheme="https://one.blog.418121.xyz/tags/DHCP/"/>
    
  </entry>
  
  <entry>
    <title>第三章 Centos 7 Linux配置samba 实训任务1：配置Samba服务</title>
    <link href="https://one.blog.418121.xyz/posts/cfebefbe.html"/>
    <id>https://one.blog.418121.xyz/posts/cfebefbe.html</id>
    <published>2024-05-28T03:48:51.000Z</published>
    <updated>2024-11-25T15:48:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在第二章的基础上继续实训，实训任务1：配置Samba服务，任务1 创建Samba共享，本地目录为&#x2F;data&#x2F;share，要求：共享名为share1，仅允许zsuser用户能上传文件，任务2 创建Samba共享，本地目录为&#x2F;data&#x2F;public，要求：共享名为public，允许匿名访问，所有用户都能上传文件。</p><p>虚拟机需求：1台服务器（Server）、1台客户端（Client）</p><blockquote><p><strong>在第二章的基础上继续实训</strong></p></blockquote><h2 id="实训任务1：配置Samba服务"><a href="#实训任务1：配置Samba服务" class="headerlink" title="实训任务1：配置Samba服务"></a>实训任务1：配置Samba服务</h2><blockquote><h3 id="任务1-创建Samba共享，本地目录为-data-share，要求："><a href="#任务1-创建Samba共享，本地目录为-data-share，要求：" class="headerlink" title="任务1 创建Samba共享，本地目录为&#x2F;data&#x2F;share，要求："></a>任务1 创建Samba共享，本地目录为&#x2F;data&#x2F;share，要求：</h3><p>共享名为share1<br>仅允许zsuser用户能上传文件</p></blockquote><blockquote><h3 id="任务2-创建Samba共享，本地目录为-data-public，要求："><a href="#任务2-创建Samba共享，本地目录为-data-public，要求：" class="headerlink" title="任务2 创建Samba共享，本地目录为&#x2F;data&#x2F;public，要求："></a>任务2 创建Samba共享，本地目录为&#x2F;data&#x2F;public，要求：</h3><p>共享名为public</p><p>允许匿名访问</p><p>所有用户都能上传文件</p></blockquote><h2 id="一、在服务器（Server）上安装Samba服务"><a href="#一、在服务器（Server）上安装Samba服务" class="headerlink" title="一、在服务器（Server）上安装Samba服务"></a>一、在服务器（Server）上安装Samba服务</h2><h3 id="1-确保良好的网络连接也要保证设备的联网"><a href="#1-确保良好的网络连接也要保证设备的联网" class="headerlink" title="1. 确保良好的网络连接也要保证设备的联网"></a>1. 确保良好的网络连接也要保证设备的联网</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum list installed | grep samba                                \\查看是否安装了samba服务</span><br><span class="line">yum -y install samba                                                   \\安装samba服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/01.webp"></p><h3 id="2-防火墙设置"><a href="#2-防火墙设置" class="headerlink" title="2. 防火墙设置"></a>2. 防火墙设置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">firewall-cmd --permanent --zone=public --add-service=samba              \\开启samba服务 允许通过</span><br><span class="line">firewall-cmd --reload                                                                                   \\重启防火墙</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/02.webp"></p><h3 id="3-开启samba服务"><a href="#3-开启samba服务" class="headerlink" title="3. 开启samba服务"></a>3. 开启samba服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">systemctl start smb nmb                                 \\开启samba服务</span><br><span class="line">systemctl <span class="built_in">enable</span> smb nmb                                \\开机自启samba服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/03.webp"></p><h3 id="4-创建samba用户"><a href="#4-创建samba用户" class="headerlink" title="4. 创建samba用户"></a>4. 创建samba用户</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">useradd zsuser                          \\添加zsuser用户</span><br><span class="line">smbpasswd -a zsuser                     \\为zsuser用户添加密码</span><br><span class="line">useradd tom                                     \\添加多一个用户好测试</span><br><span class="line">smbpasswd -a tom                        \\设置密码</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/04.webp"></p><h2 id="二、在服务器（Server）上创建samba共享目录"><a href="#二、在服务器（Server）上创建samba共享目录" class="headerlink" title="二、在服务器（Server）上创建samba共享目录"></a>二、在服务器（Server）上创建samba共享目录</h2><h3 id="1-创建share、public目录"><a href="#1-创建share、public目录" class="headerlink" title="1. 创建share、public目录"></a>1. 创建share、public目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> /data /data/share/ /data/public/                          \\创建share、public目录</span><br><span class="line"><span class="built_in">chmod</span> 777 /data /data/share/ /data/public/                      \\设置目录权限</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/05.webp"></p><h3 id="2-创建share1、public共享目录"><a href="#2-创建share1、public共享目录" class="headerlink" title="2. 创建share1、public共享目录"></a>2. 创建share1、public共享目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/samba/smb.conf                         \\编辑配置文件详细内容如下所示</span><br><span class="line">[global]                                        \\在全局变量中加入</span><br><span class="line">map to guest = bad user         \\开启匿名访问</span><br><span class="line">[share1]</span><br><span class="line">        comment = share1        \\共享注释</span><br><span class="line">        path = /data/share      \\指定共享目录</span><br><span class="line">        write list = zsuser     \\写入列表</span><br><span class="line">        writable = no           \\不支持写入数据（列表中写读，不在列表只读）</span><br><span class="line">[public]</span><br><span class="line">        comment = public        \\共享注释</span><br><span class="line">        path = /data/public     \\指定共享目录</span><br><span class="line">        guest ok = <span class="built_in">yes</span>          \\允许匿名访问</span><br><span class="line">        browseable = <span class="built_in">yes</span>        \\所有人可见</span><br><span class="line">        writeable = <span class="built_in">yes</span>         \\支持写入数据</span><br><span class="line">        <span class="built_in">read</span> only = no          \\是否可读</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/06.webp"></p><h3 id="3-检查语法错误跟重启samba服务"><a href="#3-检查语法错误跟重启samba服务" class="headerlink" title="3. 检查语法错误跟重启samba服务"></a>3. 检查语法错误跟重启samba服务</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">testparm                                                        \\检查语法错误</span><br><span class="line">systemctl restart sbm nmb                       \\重启samba服务</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/07.webp"></p><h3 id="4-配置selinux"><a href="#4-配置selinux" class="headerlink" title="4. 配置selinux"></a>4. 配置selinux</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">setenforce 1                                                                                    //开启</span><br><span class="line"><span class="built_in">ls</span> -ldZ /data/share /data/public                                                //查看文件夹安全上下文</span><br><span class="line"><span class="built_in">chcon</span> -t samba_share_t /data/share /data/public                 </span><br><span class="line">//为/data/share设置samba_share_t标签目录，使selinux允许samba读和写这个目录。</span><br><span class="line">//为/data/public设置samba_share_t标签目录，使selinux允许samba读和写这个目录。</span><br><span class="line"><span class="built_in">ls</span> -ldZ /data/share /data/public                                                //查看文件夹安全上下文</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/03/08.webp"></p><h2 id="三、在客户机（Client）上测试"><a href="#三、在客户机（Client）上测试" class="headerlink" title="三、在客户机（Client）上测试"></a>三、在客户机（Client）上测试</h2><h3 id="1-测试-任务1"><a href="#1-测试-任务1" class="headerlink" title="1. 测试 任务1"></a>1. 测试 任务1</h3><blockquote><p>smbclient &#x2F;&#x2F;192.168.1.10&#x2F;share1 -U zsuser                             &#x3D;&#x3D;使用zsuser用户访问samba服务&#x3D;&#x3D;<br>mkdir test                                                                                                                            &#x3D;&#x3D;测试是否能创建test文件夹&#x3D;&#x3D;<br>ls                                                                                                                                                            &#x3D;&#x3D;查看列表 显示test文件夹 证明成功&#x3D;&#x3D;<br>exit                                                                                                                                                  &#x3D;&#x3D;退出&#x3D;&#x3D;  </p></blockquote><blockquote><p>smbclient&#x2F;&#x2F;192.168.1.10&#x2F;share1 -U tom                                         &#x3D;&#x3D;使用tom用户访问samba服务&#x3D;&#x3D;<br>mkdir test1                                                                                                                           &#x3D;&#x3D;测试是否能创建test1文件夹&#x3D;&#x3D;<br>ls                                                                                                                                                            &#x3D;&#x3D;查看列表 不显示test1文件夹 证明除了zsuser用户能写入其余用户不能写入只能读&#x3D;&#x3D;<br>exit                                                                                                                                                  &#x3D;&#x3D;退出&#x3D;&#x3D;</p></blockquote><p><img src="https://images.418121.xyz/file/blog/study/linux/03/09.webp"></p><h3 id="2-测试-任务2"><a href="#2-测试-任务2" class="headerlink" title="2. 测试 任务2"></a>2. 测试 任务2</h3><blockquote><p>smbclient&#x2F;&#x2F;192.168.1.10&#x2F;share1 -U guest                                       &#x3D;&#x3D;使用匿名用户访问samba服务&#x3D;&#x3D;<br>mkdir test1                                                                                                                           &#x3D;&#x3D;测试是否能创建test1文件夹&#x3D;&#x3D;<br>ls                                                                                                                                                            &#x3D;&#x3D;查看列表 显示test1文件夹 证明所有用户都能读写&#x3D;&#x3D;<br>exit                                                                                                                                                  &#x3D;&#x3D;退出&#x3D;&#x3D;</p></blockquote><p><img src="https://images.418121.xyz/file/blog/study/linux/03/10.webp"></p><h3 id="3-windows-7-测试"><a href="#3-windows-7-测试" class="headerlink" title="3. windows 7 测试"></a>3. windows 7 测试</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/03/11.webp"></p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">在CentOS系统上配置Samba服务，并创建两个不同权限的共享目录：share1和public。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="运维" scheme="https://one.blog.418121.xyz/tags/%E8%BF%90%E7%BB%B4/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="网络" scheme="https://one.blog.418121.xyz/tags/%E7%BD%91%E7%BB%9C/"/>
    
    <category term="Samba" scheme="https://one.blog.418121.xyz/tags/Samba/"/>
    
  </entry>
  
  <entry>
    <title>第二章_Centos 7 Linux配置ssh 实训任务：SSH的安全配置</title>
    <link href="https://one.blog.418121.xyz/posts/c38d1213.html"/>
    <id>https://one.blog.418121.xyz/posts/c38d1213.html</id>
    <published>2024-05-28T03:21:51.000Z</published>
    <updated>2024-11-25T15:21:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>任务情境描述某公司管理员已经将自己个人电脑免密登录到远程服务器。服务器地址为192.168.1.10&#x2F;24（IP地址可自行设置）管理员PC地址为192.168.1.20&#x2F;24（IP地址可自行设置）管理员ID为admin，密码为password任务需求：（1）为了让SSH更安全，需要修改SSH的端口为61234；（2）限制SSH服务器只能由管理员PC通过admin用户登录，其他用户均无法远程访问服务器。请完成配置，并提交实验报告。（线下课程随堂检查）</p><p>虚拟机需求：1台服务器（Server）、1台客户端（Client）</p><blockquote><h2 id="实训任务2：SSH的安全配置"><a href="#实训任务2：SSH的安全配置" class="headerlink" title="实训任务2：SSH的安全配置"></a>实训任务2：SSH的安全配置</h2><h3 id="任务情境描述-某公司管理员已经将自己个人电脑免密登录到远程服务器。"><a href="#任务情境描述-某公司管理员已经将自己个人电脑免密登录到远程服务器。" class="headerlink" title="任务情境描述 某公司管理员已经将自己个人电脑免密登录到远程服务器。"></a>任务情境描述 某公司管理员已经将自己个人电脑免密登录到远程服务器。</h3></blockquote><blockquote><p><img src="https://images.418121.xyz/file/blog/study/linux/02/01.webp"></p></blockquote><blockquote><p><strong>服务器地址为192.168.1.10&#x2F;24（IP地址可自行设置）</strong><br><strong>管理员PC地址为192.168.1.20&#x2F;24（IP地址可自行设置）</strong><br><strong>管理员ID为admin，密码为password</strong></p></blockquote><blockquote><h3 id="任务需求："><a href="#任务需求：" class="headerlink" title="任务需求："></a>任务需求：</h3><h4 id="（1）为了让SSH更安全，需要修改SSH的端口为61234；"><a href="#（1）为了让SSH更安全，需要修改SSH的端口为61234；" class="headerlink" title="（1）为了让SSH更安全，需要修改SSH的端口为61234；"></a>（1）为了让SSH更安全，需要修改SSH的端口为61234；</h4><h4 id="（2）限制SSH服务器只能由管理员PC通过admin用户登录，其他用户均无法远程访问服务器。"><a href="#（2）限制SSH服务器只能由管理员PC通过admin用户登录，其他用户均无法远程访问服务器。" class="headerlink" title="（2）限制SSH服务器只能由管理员PC通过admin用户登录，其他用户均无法远程访问服务器。"></a>（2）限制SSH服务器只能由管理员PC通过admin用户登录，其他用户均无法远程访问服务器。</h4></blockquote><blockquote><p>请完成配置，并提交实验报告。（线下课程随堂检查） 若没有安装Centos 7 虚拟机 请单击此处 有详细的安装教程</p></blockquote><h2 id="一、配置虚拟网络（可自行设置）"><a href="#一、配置虚拟网络（可自行设置）" class="headerlink" title="一、配置虚拟网络（可自行设置）"></a>一、配置虚拟网络（可自行设置）</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/02/02.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/02/03.webp" alt="不勾选使用本地DHCP服务 按题目需求修改IP地址"></p><h3 id="1-修改NAT模式的子网IP：192-168-1-0-子网掩码：255-255-255-0"><a href="#1-修改NAT模式的子网IP：192-168-1-0-子网掩码：255-255-255-0" class="headerlink" title="1. 修改NAT模式的子网IP：192.168.1.0 子网掩码：255.255.255.0"></a>1. 修改NAT模式的子网IP：192.168.1.0 子网掩码：255.255.255.0</h3><h3 id="2-取消勾选使用本地DHCP服务将IP地址分配给虚拟机"><a href="#2-取消勾选使用本地DHCP服务将IP地址分配给虚拟机" class="headerlink" title="2. 取消勾选使用本地DHCP服务将IP地址分配给虚拟机"></a>2. 取消勾选使用本地DHCP服务将IP地址分配给虚拟机</h3><h3 id="3-单击“NAT-设置”-修改网关：192-168-1-2"><a href="#3-单击“NAT-设置”-修改网关：192-168-1-2" class="headerlink" title="3. 单击“NAT 设置” 修改网关：192.168.1.2"></a>3. 单击“NAT 设置” 修改网关：192.168.1.2</h3><h2 id="二、配置服务器（server）与客户端（client）的IP地址并使互相ping通"><a href="#二、配置服务器（server）与客户端（client）的IP地址并使互相ping通" class="headerlink" title="二、配置服务器（server）与客户端（client）的IP地址并使互相ping通"></a>二、配置服务器（server）与客户端（client）的IP地址并使互相ping通</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">su root                                                         \\进入root</span><br><span class="line">vim /etc/sysconfig/network-scripts/ifcfg-ens33                  \\修改默认网卡脚本 一切按照实际情况</span><br></pre></td></tr></table></figure><h3 id="1-服务器（server）网络配置（添加修改命令如下）"><a href="#1-服务器（server）网络配置（添加修改命令如下）" class="headerlink" title="1. 服务器（server）网络配置（添加修改命令如下）"></a>1. 服务器（server）网络配置（添加修改命令如下）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">BOOTPROTO=<span class="string">&quot;static&quot;</span> </span><br><span class="line">ONBOOT=<span class="string">&quot;yes&quot;</span> </span><br><span class="line">IPADDR=192.168.1.10</span><br><span class="line">GATEWAY=192.168.1.2 </span><br><span class="line">NETMAKS=255.255.255.0 </span><br><span class="line">DNS1=202.96.128.86（电信）  联通：221.5.88.88  移动：211.136.192.6</span><br><span class="line">DNS2=114.114.114.114</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/02/04.webp"></p><h3 id="2-客户端（client）同理"><a href="#2-客户端（client）同理" class="headerlink" title="2. 客户端（client）同理"></a>2. 客户端（client）同理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">BOOTPROTO=<span class="string">&quot;static&quot;</span> </span><br><span class="line">ONBOOT=<span class="string">&quot;yes&quot;</span> </span><br><span class="line">IPADDR=192.168.1.10</span><br><span class="line">GATEWAY=192.168.1.2 </span><br><span class="line">NETMAKS=255.255.255.0 </span><br><span class="line">DNS1=202.96.128.86（电信）  联通：221.5.88.88  移动：211.136.192.6</span><br><span class="line">DNS2=114.114.114.114</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/02/05.webp"></p><h3 id="3-服务器（Server）与客户端（Client）互相ping通"><a href="#3-服务器（Server）与客户端（Client）互相ping通" class="headerlink" title="3. 服务器（Server）与客户端（Client）互相ping通"></a>3. 服务器（Server）与客户端（Client）互相ping通</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/02/06.webp"></p><h2 id="三、在服务器（Server）上添加用户"><a href="#三、在服务器（Server）上添加用户" class="headerlink" title="三、在服务器（Server）上添加用户"></a>三、在服务器（Server）上添加用户</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">useradd admin                                   \\添加管理员admin</span><br><span class="line">passwd --stdin admin                            \\为管理员admin设置密码</span><br><span class="line">password                                        \\输入题目要求密码</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/02/07.webp"></p><h2 id="四、在服务器（Server）修改ssh默认端口"><a href="#四、在服务器（Server）修改ssh默认端口" class="headerlink" title="四、在服务器（Server）修改ssh默认端口"></a>四、在服务器（Server）修改ssh默认端口</h2><h3 id="1-确保虚拟机已安装openssh-server-以下命令可查询"><a href="#1-确保虚拟机已安装openssh-server-以下命令可查询" class="headerlink" title="1. 确保虚拟机已安装openssh-server 以下命令可查询"></a>1. 确保虚拟机已安装openssh-server 以下命令可查询</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum list installed | grep openssh-server</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/02/08.webp"></p><h3 id="若无结果就未安装，则可输入以下命令进行安装"><a href="#若无结果就未安装，则可输入以下命令进行安装" class="headerlink" title="若无结果就未安装，则可输入以下命令进行安装"></a>若无结果就未安装，则可输入以下命令进行安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install openssh-server</span><br></pre></td></tr></table></figure><h3 id="2-修改默认端口"><a href="#2-修改默认端口" class="headerlink" title="2. 修改默认端口"></a>2. 修改默认端口</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/02/09.webp"></p><h3 id="3-防火墙设置和修改安全上下文"><a href="#3-防火墙设置和修改安全上下文" class="headerlink" title="3. 防火墙设置和修改安全上下文"></a>3. 防火墙设置和修改安全上下文</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">firewall-cmd --permanent --add-port=61234/tcp               \\开启端口61234</span><br><span class="line">firewall-cmd --reload                                       \\重启防火墙</span><br><span class="line">semanage port -a -t ssh_port_t -p tcp 61234                 \\修改安全上下文</span><br><span class="line">semanage port -l | grep ssh                                 \\查看修改以后的上下文</span><br><span class="line">systemctl restart sshd                                      \\重启ssh服务</span><br><span class="line">systemctl <span class="built_in">enable</span> sshd                                       \\设置ssh服务开机自启</span><br></pre></td></tr></table></figure><p><img src="https://images.418121.xyz/file/blog/study/linux/02/10.webp"></p><h3 id="4-客户端（Client）测试"><a href="#4-客户端（Client）测试" class="headerlink" title="4.客户端（Client）测试"></a>4.客户端（Client）测试</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/02/11.webp"></p><h2 id="五、指定用户免密登录"><a href="#五、指定用户免密登录" class="headerlink" title="五、指定用户免密登录"></a>五、指定用户免密登录</h2><h3 id="1-首先在客户端（Client）生成密钥并发送到服务器（Server）"><a href="#1-首先在客户端（Client）生成密钥并发送到服务器（Server）" class="headerlink" title="1. 首先在客户端（Client）生成密钥并发送到服务器（Server）"></a>1. 首先在客户端（Client）生成密钥并发送到服务器（Server）</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/02/12.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen                                      \\生成密钥 连续 按3次 Enter键</span><br><span class="line">ssh-copy-id -p 61234 admin@192.168.1.10         \\把生成的密钥传到服务器去</span><br></pre></td></tr></table></figure><h3 id="2-其次在服务器（Server）修改配置文件-禁止root用户登录和无密码登录"><a href="#2-其次在服务器（Server）修改配置文件-禁止root用户登录和无密码登录" class="headerlink" title="2. 其次在服务器（Server）修改配置文件 禁止root用户登录和无密码登录"></a>2. 其次在服务器（Server）修改配置文件 禁止root用户登录和无密码登录</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/02/13.webp"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/ssh/sshd_config                        \\打开配置文件</span><br><span class="line">systemctl restart sshd                          \\修改完重启ssh服务</span><br></pre></td></tr></table></figure><h3 id="3-在客户端（Client）上测试"><a href="#3-在客户端（Client）上测试" class="headerlink" title="3. 在客户端（Client）上测试"></a>3. 在客户端（Client）上测试</h3><p><img src="https://images.418121.xyz/file/blog/study/linux/02/14.webp"><br> <strong>管理员admin成功免密登录，其他用户均无法远程访问服务器。</strong></p><h2 id="六、结尾"><a href="#六、结尾" class="headerlink" title="六、结尾"></a>六、结尾</h2><p>至此，实验结束。希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">详细描述了如何增强SSH服务器的安全性，主要包括修改SSH端口和限制特定IP地址访问。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
    <category term="安全" scheme="https://one.blog.418121.xyz/tags/%E5%AE%89%E5%85%A8/"/>
    
    <category term="SSH" scheme="https://one.blog.418121.xyz/tags/SSH/"/>
    
  </entry>
  
  <entry>
    <title>第一章 VMware Workstation Pro 17安装Centos 7 安装虚拟机及简单配置</title>
    <link href="https://one.blog.418121.xyz/posts/6404ce4b.html"/>
    <id>https://one.blog.418121.xyz/posts/6404ce4b.html</id>
    <published>2024-05-25T05:15:51.000Z</published>
    <updated>2024-11-25T15:15:51.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言-vm-17-安装Centos7-安装准备"><a href="#前言-vm-17-安装Centos7-安装准备" class="headerlink" title="前言  vm 17 安装Centos7 安装准备"></a>前言  vm 17 安装Centos7 安装准备</h1><p>vm装centos7 VMware Workstation Pro 17 安装Centos 7</p><blockquote><p>单击文字下载<br>  &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://pan-yz.cldisk.com/external/m/file/996322369614340096">镜像</a><br>  &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html">官网自行下载</a></p></blockquote><h2 id="一、创建新的虚拟机"><a href="#一、创建新的虚拟机" class="headerlink" title="一、创建新的虚拟机"></a>一、创建新的虚拟机</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/01.webp"></p><h2 id="二、选择硬件兼容性"><a href="#二、选择硬件兼容性" class="headerlink" title="二、选择硬件兼容性"></a>二、选择硬件兼容性</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/02.webp"></p><h2 id="三、安装客户机操作系统"><a href="#三、安装客户机操作系统" class="headerlink" title="三、安装客户机操作系统"></a>三、安装客户机操作系统</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/03.webp"></p><h2 id="四、个性化Linux"><a href="#四、个性化Linux" class="headerlink" title="四、个性化Linux"></a>四、个性化Linux</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/04.webp"></p><h2 id="五、命名虚拟机-位置"><a href="#五、命名虚拟机-位置" class="headerlink" title="五、命名虚拟机 位置"></a>五、命名虚拟机 位置</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/05.webp"></p><h2 id="六、处理器配置"><a href="#六、处理器配置" class="headerlink" title="六、处理器配置"></a>六、处理器配置</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/06.webp"></p><h2 id="七、此虚拟机内存（默认即可-看自己配置）"><a href="#七、此虚拟机内存（默认即可-看自己配置）" class="headerlink" title="七、此虚拟机内存（默认即可 看自己配置）"></a>七、此虚拟机内存（默认即可 看自己配置）</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/07.webp"></p><h2 id="八、网络类型"><a href="#八、网络类型" class="headerlink" title="八、网络类型"></a>八、网络类型</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/08.webp"></p><h2 id="九、选择磁盘类型"><a href="#九、选择磁盘类型" class="headerlink" title="九、选择磁盘类型"></a>九、选择磁盘类型</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/09.webp"></p><h2 id="十、选择I-O控制器类型"><a href="#十、选择I-O控制器类型" class="headerlink" title="十、选择I&#x2F;O控制器类型"></a>十、选择I&#x2F;O控制器类型</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/10.webp"></p><h2 id="十一、指定磁盘容量"><a href="#十一、指定磁盘容量" class="headerlink" title="十一、指定磁盘容量"></a>十一、指定磁盘容量</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/11.webp"></p><h2 id="十二、选择磁盘"><a href="#十二、选择磁盘" class="headerlink" title="十二、选择磁盘"></a>十二、选择磁盘</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/12.webp"></p><h2 id="十三、指定磁盘文件"><a href="#十三、指定磁盘文件" class="headerlink" title="十三、指定磁盘文件"></a>十三、指定磁盘文件</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/13.webp"></p><h2 id="十四、完成"><a href="#十四、完成" class="headerlink" title="十四、完成"></a>十四、完成</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/14.webp"></p><h2 id="十五、中继服务器安装可以参考这一步（其余可忽略此步）"><a href="#十五、中继服务器安装可以参考这一步（其余可忽略此步）" class="headerlink" title="十五、中继服务器安装可以参考这一步（其余可忽略此步）"></a>十五、中继服务器安装可以参考这一步（其余可忽略此步）</h2><p><strong>双网卡 NAT模式 仅主机</strong><br><img src="https://images.418121.xyz/file/blog/study/linux/01/15.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/16.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/17.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/18.webp"></p><h2 id="十六、启动虚拟机"><a href="#十六、启动虚拟机" class="headerlink" title="十六、启动虚拟机"></a>十六、启动虚拟机</h2><p><img src="https://images.418121.xyz/file/blog/study/linux/01/19.webp"><br>不需要任何操作，等待一段时间<br><img src="https://images.418121.xyz/file/blog/study/linux/01/20.webp"><br>出现此界面即安装完成</p><h2 id="十七、设置中文-拼音输入法-时区"><a href="#十七、设置中文-拼音输入法-时区" class="headerlink" title="十七、设置中文 拼音输入法 时区"></a>十七、设置中文 拼音输入法 时区</h2><p>按照步骤进行实验<br><img src="https://images.418121.xyz/file/blog/study/linux/01/21.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/22.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/23.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/24.webp"><br><img src="https://images.418121.xyz/file/blog/study/linux/01/25.webp"><br>重启即可</p><h2 id="至此，安装完成。"><a href="#至此，安装完成。" class="headerlink" title="至此，安装完成。"></a>至此，安装完成。</h2><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><h4 id="一开机就蓝屏的情况，可以参考以下方法："><a href="#一开机就蓝屏的情况，可以参考以下方法：" class="headerlink" title="一开机就蓝屏的情况，可以参考以下方法："></a>一开机就蓝屏的情况，可以参考以下方法：</h4><h5 id="1-配置虚拟内存（20480MB打上）"><a href="#1-配置虚拟内存（20480MB打上）" class="headerlink" title="1. 配置虚拟内存（20480MB打上）"></a>1. 配置虚拟内存（20480MB打上）</h5><p><img src="https://images.418121.xyz/file/blog/study/linux/01/26.webp"></p><h5 id="2-打开功能"><a href="#2-打开功能" class="headerlink" title="2. 打开功能"></a>2. 打开功能</h5><p><img src="https://images.418121.xyz/file/blog/study/linux/01/27.webp"></p><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>希望对你有所帮助，有任何问题请在下方留言。可以关注我的 <a href="/rss/">公众号以及订阅我的文章</a> ，感谢你的支持，是对我最大的动力，当然了，更多的是因为热爱。</p>]]></content>
    
    
    <summary type="html">详细介绍了在VMware Workstation Pro 17上安装CentOS 7操作系统的步骤，并提供了一些故障排除建议。</summary>
    
    
    
    <category term="服务器技术与应用" scheme="https://one.blog.418121.xyz/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8A%80%E6%9C%AF%E4%B8%8E%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="服务器" scheme="https://one.blog.418121.xyz/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="运维" scheme="https://one.blog.418121.xyz/tags/%E8%BF%90%E7%BB%B4/"/>
    
    <category term="VMware" scheme="https://one.blog.418121.xyz/tags/VMware/"/>
    
    <category term="Linux" scheme="https://one.blog.418121.xyz/tags/Linux/"/>
    
    <category term="CentOS" scheme="https://one.blog.418121.xyz/tags/CentOS/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://one.blog.418121.xyz/posts/4a17b156.html"/>
    <id>https://one.blog.418121.xyz/posts/4a17b156.html</id>
    <published>2024-05-12T06:00:35.000Z</published>
    <updated>2024-05-12T06:00:35.000Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;/a&gt;! This is your very first post. Check &lt;a href=&quot;https://hexo.io/docs/&quot;&gt;documentation&lt;/a&gt; for</summary>
      
    
    
    
    
  </entry>
  
</feed>
