<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>郭大侠的博客</title>
  
  
  <link href="https://www.guozhenyi.com/atom.xml" rel="self"/>
  
  <link href="https://www.guozhenyi.com/"/>
  <updated>2026-03-05T14:54:40.028Z</updated>
  <id>https://www.guozhenyi.com/</id>
  
  <author>
    <name>郭大侠</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>消失的他...</title>
    <link href="https://www.guozhenyi.com/post/2026/03/xiao-shi-de-ta.html"/>
    <id>https://www.guozhenyi.com/post/2026/03/xiao-shi-de-ta.html</id>
    <published>2026-03-01T12:41:33.000Z</published>
    <updated>2026-03-05T14:54:40.028Z</updated>
    
    <content type="html"><![CDATA[<p>2025年2月28日，下午2点多，阿春跟领导请了假，他胸前挎着个小包，走出公司，从此就消失无踪了…</p><span id="more"></span><p>阿春是一名程序员，30来岁的年纪，头发就掉了不少，头顶地中海，看起来比实际年龄偏大。</p><p>几年前，阿春在深圳上班。随着年龄渐长，家里开始给他安排相亲。后来，在家庭的张罗下，阿春和邻村的一个女孩相亲成功。</p><p>具体细节不多表述，只知道阿春跟我说过，他媳妇儿在结婚时两次提出临时加彩礼，他们家都妥协了，满足了女方的要求。</p><p>结婚后，女方不住男方家，直接回了娘家。在阿春和长辈去女方家施压之下，女方才回到男方家里住。</p><p>后来女方怀孕了，阿春没在家里多待，又跑到北京上班，把媳妇儿留在老家由父母照顾。女方后来顺利生下了一个女儿。</p><p>阿春每个月给媳妇儿转生活费，日子就这么过着。</p><p>2023年中，有一次中午吃饭回来的路上，阿春碰到我，聊起家里谁管钱的话题。他开始诉苦，说媳妇要他上交工资卡，他不同意。虽然他也给媳妇儿转生活费，但媳妇儿总是找他要钱，说不够花。阿春媳妇生完孩子后在老家找了份工作继续上班，却依然频繁找他要钱。因为这个事，两人没少吵架，当时已经冷战一两个月了，媳妇儿还总把他电话拉黑。</p><p>可能阿春也知道，夫妻长期两地分居总归不是个事。2023年9月，他还跟我讨论，想在北京周边买一套便宜点的房，把媳妇儿和孩子接来一起住。他问我去不去涿州看房，说那里房价便宜。我说那儿不是刚发生水灾吗？他说水淹后他去问过，火车站那块地势高，没有被淹…</p><p><img src="/uploads/2026/03/achun-001.webp" alt="achun-001"></p><p>后来从阿春的聊天中了解到，他和媳妇儿的矛盾越来越大，没有达成共识，冷战时间越来越长。</p><p>再后来，阿春跟媳妇儿说自己最近比较困难，而且她也已经上班，就不再给她生活费了。这导致了更深的家庭矛盾。</p><p>阿春的媳妇儿撇下女儿，也来北京打工了，却不跟阿春见面，也不跟他一起住。</p><p>据阿春讲，媳妇儿来北京大半年，他也就见过一两次，而且矛盾重重，媳妇儿还说要离婚，两人陷入长久的冷战。</p><p>阿春也不止一次跟我诉苦，说这种婚姻不是他想要的婚姻。阿春媳妇儿跟他闹离婚的时候，他沉默了，没有同意。</p><p>经历几次闹离婚和冷战后，时间来到2024年。阿春跟我说，他想了很久，就跟媳妇儿说同意离婚，想让她把彩礼退还给他。结果这回阿春媳妇儿沉默了，不接茬，并且拉黑了阿春的所有联系方式，处于近乎失联状态。</p><p>阿春问我怎么办，还能不能要回彩礼。我说这个有点难，毕竟女方已经给你生孩子了，真要离婚又联系不上女方，只能去法院起诉离婚。</p><p>我这样说完后，阿春反而犹豫了，只说想当面跟女方沟通，让她退还彩礼，哪怕退还一半也行。这说明阿春本意其实不太想离婚。</p><p>时间一晃到了2024年下半年。这期间，能明显感觉到阿春上班心不在焉，领导安排的任务基本能推就推，推不掉就说不会做，需求不够明确。后来领导干脆不安排任务给他了，他也乐得清闲。</p><p>某天午饭后回公司路上，我偶然问了一句：过年回家吗？啥时候回去？你媳妇儿回去吗？阿春说回去啊，媳妇儿也回去，但是他先回去，等他走了，媳妇儿才会回去看孩子。对此，我只能尴尬的笑一笑，结束了话题。</p><p>再后来某天路上遇到阿春，他主动跟我聊天，说如果不要求退还彩礼了，要她退生活费可行吗，哪怕退一半也行。我说这恐怕更难，去法院起诉离婚退彩礼还有一点可能，生活费都花掉了，而且男人给媳妇儿生活费是理所当然的，法院不会支持退生活费的。阿春嘟囔了一会，还是死咬着想让女方至少退还一半&quot;生活费&quot;。</p><p>直到后来，阿春主动给我发了一段话，我才大致明白了——阿春说的&quot;生活费&quot;，可能不是生活费，而可能是之前一段时间他被女方要求上交的工资。否则如果只是平常的生活费，金额不会很大，他也不会这么执着地要求女方退还一半。</p><p><img src="/uploads/2026/03/achun-002.webp" alt="achun-002"></p><p>从这儿也能感悟到：上交工资的男人，家庭和睦还好；一旦家庭不和，下场就很可悲，面临人财两空。</p><p>其他涉及隐私的部分不方便叙述。</p><p>2025年过完年后第3周，刚好2月28日，中午吃完饭，看到阿春跟领导请了假。当时不知道他请了多久。下午2点多，阿春胸前挎着个小包，匆匆离开公司。</p><p>直到一个星期后的3月10日，星期一，阿春没有来上班。恰好有一点之前分配给他的工作还没完成，有人问阿春来了吗，他的工作不知道完成了没。几个相关人员一对账，才发现阿春消失了。问了领导才知道阿春请了一个星期的假，按理说这周一应该回来上班，但他并没有来。</p><p>之后，公司人事就打电话给了阿春的家人，是阿春的妈妈接的电话，好像还有阿春的姐姐陪着他妈妈。人事问阿春的妈妈，为什么阿春没来上班，阿春向公司请假说回老家了，假期过了也没来上班，阿春在家里吗…</p><p>阿春的妈妈，表现也比较奇怪，她先是问阿春工资是多少，公司还有多少钱工资没发，想让公司把阿春没发的工资尽快算清楚给她。人事问阿春还回来上班吗，她们知不知道阿春的行踪。阿春的妈妈没有回答，只跟人事说，让她给阿春办理离职手续，其他都没有说。</p><p>这搞得我们都挺迷糊，一番讨论后，我们做了两个推测：<br>其一，阿春出国了，去了东南亚，回不来了。<br>其二，犯了点事，被行政拘留了。</p><p>因为阿春之前跟我说过，国内的女的都不太靠谱，太物质了，等离婚后，想去国外（东南亚）找个老婆…</p><p>我还劝过他别去东南亚，那边现在是诈骗重灾区，还可能被绑架到KK园区，那可就真出不来了。</p><p>当时阿春心不在焉，没有怎么继续谈这个话题。</p><h2 id="结果">结果</h2><p>大概半年后，阿春的妈妈打电话给公司人事，让帮忙整理一下阿春的个人物品，还说要把公司分配给阿春使用的笔记本电脑也寄回家，人事解释说那是公司的财物，员工只有使用权，离职了就要交还给公司，不能寄给她们，阿春的妈妈理解了以后也就没有再要笔记本电脑。人事就把阿春的所有个人物品打包后寄到了阿春的家里。</p><p>这时，阿春的妈妈才透露了一点消息，阿春因为犯了点糊涂事，被刑事拘留了。</p><p>涉及到个人隐私就不便细说。最后，只希望阿春积极改过自新，早日与家人团聚。</p><p>End</p><p>注：本文构思于2025年5月，行文于2025年6月~2026年3月（拖延症），发表于2026年3月。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2025年2月28日，下午2点多，阿春跟领导请了假，他胸前挎着个小包，走出公司，从此就消失无踪了…&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Vue Element 封装通用弹框的方法</title>
    <link href="https://www.guozhenyi.com/post/2025/10/vue-element-dialog-wrap.html"/>
    <id>https://www.guozhenyi.com/post/2025/10/vue-element-dialog-wrap.html</id>
    <published>2025-10-21T11:25:00.000Z</published>
    <updated>2026-02-27T12:23:38.217Z</updated>
    
    <content type="html"><![CDATA[<p>在前端开发中，使用 vue + element 封装业务弹框组件是一个比较高频的操作。</p><span id="more"></span><p>随着开发项目的增多，每次遇到这种场景都要去各个项目中翻找以前封装好的弹框组件。</p><p>年龄大了，这样找起来比较费脑子，索性记录下来吧，以后直接翻笔记。</p><h2 id="Vue2-Element">Vue2 + Element</h2><p>使用场景，比如在主业务组件中，一般这样写：</p><p>/src/views/xxx/index.vue</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;div&gt;这里可能有搜索栏、数据列表等...&lt;/div&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 这里引入业务弹框组件 --&gt;</span><br><span class="line">    &lt;SelectDialog :show.sync=&quot;businessShow&quot;&gt;&lt;/SelectDialog&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;script&gt;</span><br><span class="line">import SelectDialog from &quot;./select-dialog.vue&quot;;</span><br><span class="line"></span><br><span class="line">export default &#123;</span><br><span class="line">  components: &#123;</span><br><span class="line">    SelectDialog, // 注册组件</span><br><span class="line">  &#125;,</span><br><span class="line">  data() &#123;</span><br><span class="line">    return &#123;</span><br><span class="line">      businessShow: false,</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;,</span><br><span class="line">  methods: &#123;&#125;,</span><br><span class="line">&#125;;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>这个下拉弹框组件的封装方式如下：</p><p>/src/views/xxx/select-dialog.vue</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;el-dialog :visible=&quot;show&quot; title=&quot;XX下拉选择弹框&quot; v-loading=&quot;dial_loading&quot; width=&quot;600px&quot; @close=&quot;handleClose&quot;&gt;</span><br><span class="line">      &lt;div&gt;这里是具体业务组件...&lt;/div&gt;</span><br><span class="line"></span><br><span class="line">      &lt;template slot=&quot;footer&quot;&gt;</span><br><span class="line">        &lt;el-button @click=&quot;handleClose&quot; size=&quot;small&quot;&gt;关 闭&lt;/el-button&gt;</span><br><span class="line">        &lt;el-button @click=&quot;handleConfirm&quot; type=&quot;primary&quot; size=&quot;small&quot;&gt;确 认&lt;/el-button&gt;</span><br><span class="line">      &lt;/template&gt;</span><br><span class="line">    &lt;/el-dialog&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;script&gt;</span><br><span class="line">export default &#123;</span><br><span class="line">  props: &#123;</span><br><span class="line">    // 外部使用需要加修饰符 show.sync</span><br><span class="line">    show: &#123;</span><br><span class="line">      type: Boolean,</span><br><span class="line">      default: false,</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  data() &#123;</span><br><span class="line">    return &#123;</span><br><span class="line">      dial_loading: false,</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;,</span><br><span class="line">  watch: &#123;</span><br><span class="line">    show(value) &#123;</span><br><span class="line">      if (value) &#123;</span><br><span class="line">        console.log(&quot;监听到 show 的值有变化：&quot;, value);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">  methods: &#123;</span><br><span class="line">    handleConfirm() &#123;</span><br><span class="line">      this.dial_loading = true;</span><br><span class="line"></span><br><span class="line">      // 模拟执行业务</span><br><span class="line">      setTimeout(() =&gt; &#123;</span><br><span class="line">        // 业务执行完关闭弹框</span><br><span class="line">        this.dial_loading = false;</span><br><span class="line">        this.$modal.msgSuccess(&quot;已确认&quot;);</span><br><span class="line">        this.$emit(&quot;confirm&quot;);</span><br><span class="line">        this.$emit(&quot;close&quot;);</span><br><span class="line">        this.$emit(&quot;update:show&quot;, false);</span><br><span class="line">        this.resetDialog();</span><br><span class="line">      &#125;, 3000);</span><br><span class="line">    &#125;,</span><br><span class="line">    handleClose() &#123;</span><br><span class="line">      this.$emit(&quot;close&quot;);</span><br><span class="line">      this.$emit(&quot;update:show&quot;, false);</span><br><span class="line">      this.resetDialog();</span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line">    resetDialog() &#123;</span><br><span class="line">      // 重置弹框里面的数据，比如有表单、下拉框、筛选框等等</span><br><span class="line">    &#125;,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><h2 id="Vue3-Element-Plus">Vue3 + Element Plus</h2><p>在 Vue3 + Element Plus 中，稍微有点变化，<em>sync</em> 修饰符没有了。</p><p>/src/views/xxx/index.vue</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;div&gt;这里可能有搜索栏、数据列表等...&lt;/div&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 这里引入业务弹框组件 --&gt;</span><br><span class="line">    &lt;SelectDialog v-model=&quot;dialog.show&quot;&gt;&lt;/SelectDialog&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;script setup&gt;</span><br><span class="line">import &#123; ref, reactive &#125; from &quot;vue&quot;;</span><br><span class="line">import SelectDialog from &quot;./select-dialog.vue&quot;;</span><br><span class="line"></span><br><span class="line">const dialog = reactive(&#123;</span><br><span class="line">  show: false,</span><br><span class="line">&#125;);</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>这个下拉弹框组件的封装方式如下：</p><p>/src/views/xxx/select-dialog.vue</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;el-dialog :model-value=&quot;modelValue&quot; :title=&quot;title&quot; @closed=&quot;handleClose&quot; width=&quot;60vw&quot; top=&quot;5vh&quot;&gt;</span><br><span class="line">      &lt;div&gt;这里是具体业务组件...&lt;/div&gt;</span><br><span class="line"></span><br><span class="line">      &lt;template #footer&gt;</span><br><span class="line">        &lt;div class=&quot;dialog-footer&quot;&gt;</span><br><span class="line">          &lt;el-button @click=&quot;handleClose&quot;&gt;关 闭&lt;/el-button&gt;</span><br><span class="line">          &lt;el-button @click=&quot;handleConfirm&quot; type=&quot;primary&quot;&gt;确 认&lt;/el-button&gt;</span><br><span class="line">        &lt;/div&gt;</span><br><span class="line">      &lt;/template&gt;</span><br><span class="line">    &lt;/el-dialog&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;script setup&gt;</span><br><span class="line">import &#123; ref &#125; from &quot;vue&quot;;</span><br><span class="line"></span><br><span class="line">const props = defineProps(&#123;</span><br><span class="line">  modelValue: &#123;</span><br><span class="line">    type: Boolean,</span><br><span class="line">    default: false,</span><br><span class="line">  &#125;,</span><br><span class="line">  title: &#123;</span><br><span class="line">    type: String,</span><br><span class="line">    default: &quot;XX下拉选择弹框&quot;,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">const emit = defineEmits([&quot;update:modelValue&quot;, &quot;confirm&quot;, &quot;close&quot;]);</span><br><span class="line"></span><br><span class="line">// const dial_loading = ref(false);</span><br><span class="line"></span><br><span class="line">// 关闭弹窗</span><br><span class="line">function handleClose() &#123;</span><br><span class="line">  emit(&quot;update:modelValue&quot;, false);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function handleConfirm() &#123;</span><br><span class="line">  // dial_loading.value = true;</span><br><span class="line"></span><br><span class="line">  // 模拟执行业务</span><br><span class="line">  setTimeout(() =&gt; &#123;</span><br><span class="line">    // 业务执行完关闭弹框</span><br><span class="line">    // dial_loading.value = false;</span><br><span class="line">    emit(&quot;confirm&quot;);</span><br><span class="line">    emit(&quot;close&quot;);</span><br><span class="line">    emit(&quot;update:modelValue&quot;, false);</span><br><span class="line">    resetDialog();</span><br><span class="line">  &#125;, 3000);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function resetDialog() &#123;</span><br><span class="line">  // 重置弹框里面的数据，比如有表单、下拉框、筛选框等等</span><br><span class="line">&#125;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><h2 id="业务样例（Vue3）">业务样例（Vue3）</h2><p>写一个业务样例，方便开发时直接复制：</p><p>/src/api/role.api.js</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> request <span class="keyword">from</span> <span class="string">&quot;@/utils/request&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title class_">RoleAPI</span> = &#123;</span><br><span class="line">  <span class="comment">// 查询列表</span></span><br><span class="line">  <span class="title function_">roleList</span>(<span class="params">query</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">request</span>(&#123;</span><br><span class="line">      <span class="attr">url</span>: <span class="string">&#x27;/api/sys/roles&#x27;</span>,</span><br><span class="line">      <span class="attr">method</span>: <span class="string">&#x27;get&#x27;</span>,</span><br><span class="line">      <span class="attr">params</span>: query</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="title function_">roleInfo</span>(<span class="params">id</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">request</span>(&#123;</span><br><span class="line">      <span class="attr">url</span>: <span class="string">&#x27;/api/sys/role/&#x27;</span> + id,</span><br><span class="line">      <span class="attr">method</span>: <span class="string">&#x27;get&#x27;</span></span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="comment">// 新增</span></span><br><span class="line">  <span class="title function_">roleAdd</span>(<span class="params">data</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">request</span>(&#123;</span><br><span class="line">      <span class="attr">url</span>: <span class="string">&#x27;/api/sys/roles&#x27;</span>,</span><br><span class="line">      <span class="attr">method</span>: <span class="string">&#x27;post&#x27;</span>,</span><br><span class="line">      <span class="attr">data</span>: data</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="comment">// 修改</span></span><br><span class="line">  <span class="title function_">roleUpdate</span>(<span class="params">data</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">request</span>(&#123;</span><br><span class="line">      <span class="attr">url</span>: <span class="string">&#x27;/api/sys/roles&#x27;</span>,</span><br><span class="line">      <span class="attr">method</span>: <span class="string">&#x27;put&#x27;</span>,</span><br><span class="line">      <span class="attr">data</span>: data</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="comment">// 删除</span></span><br><span class="line">  <span class="title function_">roleRemove</span>(<span class="params">id</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">request</span>(&#123;</span><br><span class="line">      <span class="attr">url</span>: <span class="string">&#x27;/api/sys/role/&#x27;</span> + id,</span><br><span class="line">      <span class="attr">method</span>: <span class="string">&#x27;delete&#x27;</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">export</span> <span class="keyword">default</span> <span class="title class_">RoleAPI</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>/src/views/system/role-add.vue</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div&gt;</span><br><span class="line">    &lt;el-dialog :model-value=&quot;modelValue&quot; :title=&quot;title&quot; @closed=&quot;handleClose&quot; </span><br><span class="line">      :width=&quot;width&quot; :top=&quot;top&quot; :close-on-click-modal=&quot;false&quot; append-to-body&gt;</span><br><span class="line">      &lt;div&gt;</span><br><span class="line">        &lt;el-form ref=&quot;form1Ref&quot; :model=&quot;form1&quot; :rules=&quot;form1Rules&quot; label-width=&quot;80px&quot;&gt;</span><br><span class="line">          &lt;el-form-item label=&quot;名称&quot; prop=&quot;name&quot;&gt;</span><br><span class="line">            &lt;el-input v-model=&quot;form1.name&quot; placeholder=&quot;请输入&quot; /&gt;</span><br><span class="line">          &lt;/el-form-item&gt;</span><br><span class="line">          &lt;el-form-item label=&quot;状态&quot; prop=&quot;status&quot;&gt;</span><br><span class="line">            &lt;el-radio-group v-model=&quot;form1.status&quot;&gt;</span><br><span class="line">              &lt;el-radio :label=&quot;1&quot;&gt;启用&lt;/el-radio&gt;</span><br><span class="line">              &lt;el-radio :label=&quot;0&quot;&gt;停用&lt;/el-radio&gt;</span><br><span class="line">            &lt;/el-radio-group&gt;</span><br><span class="line">          &lt;/el-form-item&gt;</span><br><span class="line">        &lt;/el-form&gt;</span><br><span class="line">      &lt;/div&gt;</span><br><span class="line"></span><br><span class="line">      &lt;template #footer&gt;</span><br><span class="line">        &lt;div class=&quot;dialog-footer&quot;&gt;</span><br><span class="line">          &lt;el-button @click=&quot;handleClose&quot;&gt;取 消&lt;/el-button&gt;</span><br><span class="line">          &lt;el-button @click=&quot;handleConfirm&quot; type=&quot;primary&quot;&gt;确 认&lt;/el-button&gt;</span><br><span class="line">        &lt;/div&gt;</span><br><span class="line">      &lt;/template&gt;</span><br><span class="line">    &lt;/el-dialog&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;script setup&gt;</span><br><span class="line">import &#123; reactive, ref, watch &#125; from &quot;vue&quot;;</span><br><span class="line">import RoleAPI from &#x27;@/api/role.api&#x27;;</span><br><span class="line"></span><br><span class="line">const &#123; proxy &#125; = getCurrentInstance();</span><br><span class="line"></span><br><span class="line">const props = defineProps(&#123;</span><br><span class="line">  modelValue: &#123;</span><br><span class="line">    type: Boolean,</span><br><span class="line">    default: false,</span><br><span class="line">  &#125;,</span><br><span class="line">  title: &#123;</span><br><span class="line">    type: String,</span><br><span class="line">    default: &quot;XX下拉选择弹框&quot;,</span><br><span class="line">  &#125;,</span><br><span class="line">  width: &#123;</span><br><span class="line">    type: String,</span><br><span class="line">    default: &quot;60vw&quot;,</span><br><span class="line">  &#125;,</span><br><span class="line">  top: &#123;</span><br><span class="line">    type: String,</span><br><span class="line">    default: &quot;5vh&quot;,</span><br><span class="line">  &#125;,</span><br><span class="line">  id: &#123;</span><br><span class="line">    type: [String, Number],</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">const emit = defineEmits([&quot;update:modelValue&quot;, &quot;confirm&quot;, &quot;close&quot;]);</span><br><span class="line"></span><br><span class="line">// const dial_loading = ref(false);</span><br><span class="line"></span><br><span class="line">// 是否为更新模式</span><br><span class="line">const isUpdateMode = ref(false);</span><br><span class="line"></span><br><span class="line">const init_form1 = &#123;</span><br><span class="line">  name: &#x27;&#x27;,</span><br><span class="line">  status: 1</span><br><span class="line">&#125;;</span><br><span class="line">const form1Ref = ref();</span><br><span class="line">const form1 = reactive(&#123;</span><br><span class="line">  id: null,</span><br><span class="line">  name: &#x27;&#x27;,</span><br><span class="line">  status: 1</span><br><span class="line">&#125;);</span><br><span class="line">const form1Rules = reactive(&#123;</span><br><span class="line">  name: [</span><br><span class="line">    &#123; required: true, message: &#x27;名称不能为空&#x27;, trigger: &#x27;blur&#x27; &#125;,</span><br><span class="line">    // &#123; min: 3, max: 5, message: &#x27;Length should be 3 to 5&#x27;, trigger: &#x27;blur&#x27; &#125;,</span><br><span class="line">  ],</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">watch(() =&gt; props.modelValue, (value) =&gt; &#123;</span><br><span class="line">  if (value) &#123;</span><br><span class="line">    if (props.id) &#123;</span><br><span class="line">      form1.id = props.id;</span><br><span class="line">      isUpdateMode.value = true;</span><br><span class="line">      RoleAPI.roleInfo(props.id).then((res) =&gt; &#123;</span><br><span class="line">        Object.assign(form1, res.data);</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">      form1.id = null;</span><br><span class="line">      isUpdateMode.value = false;</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><br><span class="line">function resetDialog() &#123;</span><br><span class="line">  Object.assign(form1, init_form1);</span><br><span class="line">  form1Ref.value.resetFields();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/** 关闭弹窗 */</span><br><span class="line">function handleClose() &#123;</span><br><span class="line">  resetDialog();</span><br><span class="line">  emit(&quot;update:modelValue&quot;, false);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/** 确认并关闭 */</span><br><span class="line">function confirmClose() &#123;</span><br><span class="line">  resetDialog();</span><br><span class="line">  emit(&quot;confirm&quot;);</span><br><span class="line">  emit(&quot;close&quot;);</span><br><span class="line">  emit(&quot;update:modelValue&quot;, false);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">/** 确认按钮 */</span><br><span class="line">function handleConfirm() &#123;</span><br><span class="line">  // 验证表单后再提交</span><br><span class="line">  form1Ref.value.validate(valid =&gt; &#123;</span><br><span class="line">    if (valid) &#123;</span><br><span class="line">      if (this.isUpdateMode) &#123; // 更新时</span><br><span class="line">        RoleAPI.roleUpdate(form1).then(() =&gt; &#123;</span><br><span class="line">          proxy.$modal.msgSuccess(&quot;修改成功&quot;);</span><br><span class="line">          confirmClose();</span><br><span class="line">        &#125;);</span><br><span class="line">      &#125; else &#123; // 新增时</span><br><span class="line">        RoleAPI.roleAdd(form1).then(() =&gt; &#123;</span><br><span class="line">          proxy.$modal.msgSuccess(&quot;新增成功&quot;);</span><br><span class="line">          confirmClose();</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">&#125;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;在前端开发中，使用 vue + element 封装业务弹框组件是一个比较高频的操作。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Vuejs" scheme="https://www.guozhenyi.com/tags/vuejs/"/>
    
  </entry>
  
  <entry>
    <title>茶叶蛋的救赎</title>
    <link href="https://www.guozhenyi.com/post/2025/08/cha-ye-dan-de-jiu-shu.html"/>
    <id>https://www.guozhenyi.com/post/2025/08/cha-ye-dan-de-jiu-shu.html</id>
    <published>2025-08-29T11:20:00.000Z</published>
    <updated>2025-08-29T13:09:51.199Z</updated>
    
    <content type="html"><![CDATA[<p>早上在常买早餐的那家店，买了两个茶叶蛋做早餐，不出意外的，出意外了，窜了。。。</p><span id="more"></span><p>其实对于茶叶蛋，本人比较抵触，被它伤害过好几次了，奈何不长教训诶。</p><h2 id="起">起</h2><p>起因是，每天都吃那家店的米糕，有点吃腻了，想换一下，鬼使神差的就买了两个茶叶蛋。</p><p>之前没在他们家买过茶叶蛋，因此没有啥防备心理。</p><p>拿到茶叶蛋闻了一下，好像也没啥怪味，也就几口下肚做早餐了。</p><h2 id="转">转</h2><p>起初都没啥事，等中午吃完饭，好家伙，开始串稀，在厕所蹲了大半个小时，腿都蹲麻了。</p><p>不用怀疑，直接就能锁定是他们家的茶叶蛋有问题。</p><p>为啥这么笃定是他们家茶叶蛋有问题呢。</p><p>且听吾细细道来。</p><p>本人吃东西都很有规律，这段时间，早餐一直吃他们家的米糕和绿豆汤。</p><p>后来发现绿豆汤里面添加剂太多了，就不再购买，只买米糕做早餐。</p><p>偶尔买瓶营养快线搭配着喝，这都没有问题，未出现串稀的情况。</p><p>他们家大多是油炸食品，本人不太喜欢大多数油炸食品，因此选择的食物就不多了。</p><p>前两天还在想自己煮鸡蛋当早餐，但是一直没买生鸡蛋，就搁置了。</p><p>于是，今天早上，就想着买两个茶叶蛋做早餐，还顺便去零食铺买了一瓶营养快线，碰一碰支付，减了2元【笑】。</p><p>中午吃饭，也是延续前几天的习惯，没有变换口味。</p><p>那么，引起串稀的原因，那不就呼之欲出了。</p><p>还有一个细节也可以间接论证茶叶蛋有问题，本人发现这两个茶叶蛋不太好剥，壳子和那层膜黏上了。</p><p>之前吃的新鲜茶叶蛋，都是光滑光滑的，蛋壳很好剥开。</p><p>事后反思，可能就是这个茶叶蛋放太久了，也可能隔N夜。</p><h2 id="承">承</h2><p>细数那些串稀的日子，诶，都是泪。</p><h3 id="第一家：早阳包子铺">第一家：早阳包子铺</h3><p>这家卷饼店的上一个店主，开的是早阳包子铺，加盟的，开始卖包子、豆浆等等，估计准备大干一场，开业那几天，有三四个人在店里忙活。</p><p>也许是生意确实不咋地，没过几天，店里只剩两个人，再过了一段时间，就只剩一个大妈守店了。</p><p>他们家的包子，都是预制的，所谓的由中央厨房配送过来，印象中好像买过一次，就再也没买过了，味道已经记不清，行动已经给了答案。</p><p>这个包子铺，开始卖的豆浆也是预制的，买过，非常难喝，后来有个女生说你这个豆浆肯定没人买，现在都需要现磨豆浆，巴拉…</p><p>后来店主也发现生意确实不好，就去买了豆浆机，豆浆粉，开始卖“现磨”豆浆，买的人就稍微多了一点。</p><p>哦，吾在他家主要就是买茶叶蛋和豆浆，直到有一天，吃了他们家的茶叶蛋，串稀了…</p><p>想了几天，有点想不通，就去跟那个老板说了句：“我前几天吃了你家的茶叶蛋拉肚子了，是不是没卖完的放了好久还在卖…”</p><p>大妈还比较镇定，赶紧说：“我们都是卖的新鲜的，茶叶蛋要提前煮…”</p><p>不承认呗，反正吾也没准备找他的麻烦，就是好心提醒一下。</p><p>大概过了个把月，就看到该店贴了个告示：带技术转让。只贴了一两天，发现没有人接盘，直接闭店搬空了。</p><p>这个早阳包子铺，前后开了不到一年就倒闭了。</p><p>在这个早阳包子铺之前，其实还开过另一个包子铺，偏南方口味，挺适合吾，每天都买，但是也是一天一天看到他家的包子越来越小。</p><p>那个包子铺的包子是用酵母发酵过的，跟南方的包子差不多。不像其他北方的包子，死面包子，咽不下【笑cry】。</p><p>直到某一天，吾去买包子的时候，发现人去楼空。。。</p><p>当时还纳闷了好半天，因为吾昨天还在他家买了包子，没想到在毫无征兆的情况下就关门了。</p><p>他关门以后，没过几天，早阳包子铺就开业了。</p><h3 id="第二家：某个卤鸭烤鸭店">第二家：某个卤鸭烤鸭店</h3><p>去年夏秋之际，在这个早阳包子铺的旁边，开了一家卤味店，忘记店名了，有整只的烤鸭卖。</p><p>之前都只是经过，从来没买，直到秋冬的某一天，天气微凉，经过该店时，过去瞧了瞧，买了一只烤鸭。</p><p>买完，那个店员说有点凉了，就放微波炉加热了一下。</p><p>好家伙，回去吃的时候就发现，有点变味，估计是放了好多天了。</p><p>想着问题不大，就吃了一些，没有意外，这次串稀串了一天。。。</p><p>其实变味不太明显，只是本人嗅觉很发达，能够敏锐感知到这烤鸭至少放了三天以上。</p><p>如果是一直冷冻，其实不会这么快就坏。</p><p>但是，要是白天拿出来摆在桌子上，解冻了，没卖掉，晚上再拿去冷冻，两三天就会变质，外表还看不出来。</p><p>这家店死的更快，没过几天，就倒闭了。</p><p>店员不是老板，是拿工资的，明显感觉不上心，也不会做生意，还听见她抱怨店里没有暖气。</p><h2 id="合">合</h2><p>北方的美食，真是一言难尽啊。</p><p>貌似北方在吃的方面，不怎么上心。</p><p>想吃包子吧，大多数都是死面包子，难以下咽。</p><p>油炸食物又不想吃，面条倒是多，吃几次就腻得不行。</p><p>各种面食，也是死面居多，真不太好吃。</p><p>目前发现做包子做得好的就庆丰包子和一个小胖包子，皮薄馅足，包子比较小，更像是南方的大号小笼包。</p><p>经过几次教训，现在是真不敢随便吃茶叶蛋了。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;早上在常买早餐的那家店，买了两个茶叶蛋做早餐，不出意外的，出意外了，窜了。。。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>鲜为人知的城镇杀猪盘</title>
    <link href="https://www.guozhenyi.com/post/2025/07/cheng-zhen-sha-zhu-pan.html"/>
    <id>https://www.guozhenyi.com/post/2025/07/cheng-zhen-sha-zhu-pan.html</id>
    <published>2025-07-22T14:18:18.000Z</published>
    <updated>2025-08-29T12:05:39.435Z</updated>
    
    <content type="html"><![CDATA[<p>社会充满尔虞我诈，每当有人暴富，总会被各种陷阱洗劫一空，打回原形，能逃过此劫的人屈指可数。</p><span id="more"></span><h2 id="故事">故事</h2><p>不信，我先说三个真实的故事：</p><h3 id="故事一">故事一</h3><p>有个堂哥，80后，高中辍学，靠修电脑、下工地等打拼多年，生活还算过得去。大概在一三年吧，抓住镇上基建热潮，拿积蓄开了个水泥厂，靠水泥厂赚得第一桶金，生活逐渐富足。听说开始买了个十来万的代步车，后来为了谈生意撑场面，又买了辆几十万的车，具体就不得而知了，但是从这里也能看出来这位堂哥确实是挣到钱了。</p><p>堂哥的妻子，我只有缘见过一两次，当时看她体态丰盈，估计是生活富足后，有点发福了罢。堂哥的妻子也不用上班，在家照顾两个孩子，偶尔帮忙照看生意，日子肯定是很安逸的。</p><p>后来，堂哥的妻子被牌友拉去打麻将，起初只是图个热闹，几次赢钱后上瘾，渐渐沉迷其中。牌友们不断恭维、诱导，赌注越下越大。最后，她不但把家底输光了，连厂房都给输了拿去抵债，这还不算完，还欠下了巨额赌债。</p><p>堂哥也跟着遭罪，多年奋斗的成果毁于一旦，一切归零，还要跟着还赌债，车子也拿去卖了还债。</p><p>听长辈们说，欠的赌债，利滚利，利息都还不完…</p><h3 id="故事二">故事二</h3><p>有个表妹，也是初中辍学吧，结识了她老公，两人认识的早，所以感情深，后来就结婚生子了。</p><p>表妹靠着在县城里开了个服装店卖衣服，逐渐也挣到了钱，买了车，贷款在县城买了一套房，生活富余。</p><p>只要按照这个轨迹发展，他们不说大富大贵，起码衣食无忧。</p><p>可惜啊，表妹的老公在结婚头几年，还老老实实去上班挣钱，后来兴许是看到表妹开服装店能挣到钱，不太需要他挣钱养家。</p><p>他就逐渐的飘了，开始不务正业，到处鬼混，拈花惹草。</p><p>有人劝表妹跟他离，表妹看在两个孩子的份上，拒绝了。</p><p>后来，表妹的老公更飘了，也是认识了几个牌友，开始去打牌。</p><p>不出意外，出意外了，在赌桌上，他不但把自家才买的房子给输掉，还把他表弟的房子也输掉了。</p><p>结局不用说，肯定不太美好，积蓄归零，从头再来…</p><h3 id="故事三">故事三</h3><p>舅舅的儿子，比我小不到一岁，其实我跟他没啥交集。只是前几年听我妈跟我说了他的事。</p><p>同样的，不好好上班，到处鬼混，也是去打牌，说是输了十几万。</p><p>后来舅舅到处凑钱，给他还完了赌债。</p><p>没过多久，又出去打牌，不出意外，又欠了十几二十万的赌债。</p><p>这次舅舅的亲家都不乐意了，说这姑爷要是再去赌博，就让闺女跟他离婚，各过各的。</p><p>后来嘛，好像是女方家也帮忙凑了些钱，给他把赌债还了。</p><p>之后的事，我就不知道了。</p><h2 id="分析">分析</h2><p>听完这三个发生在我身边的故事，不知道你有什么看法。</p><p>先不说他们自身的问题，我们来找一找三个故事的共性。</p><p>其一，家里发了财，有点小钱了。（暴富）</p><p>其二，挣钱的人，勤勤恳恳；不挣钱的另一半，无所事事。（飘了）</p><p>其三，被人抓住弱点，做局，对他们的财富洗劫一空。（杀猪盘）</p><p>明白了吧，这些隐藏在城市、乡镇的“猎手”，最喜欢找那些暴发户下手。</p><p>他们通过多人配合做局，还可以谋划多年，博取你的信任，然后榨干你的价值，掳走你的财富。</p><p>那这些“猎手”，到底是哪些人构成的呢，这就需要自己去多想想了。</p><h2 id="总结">总结</h2><p>那么，我们普通人，应该如何避免陷入城市“猎手”的杀猪盘里呢？</p><p>我总结了这么几点：</p><ol><li><p>财不外露。</p><p>管住自己的嘴，家里的掌财者，一定不要给任何人说自己存了多少钱，包括家里嘴巴漏风的人。</p></li><li><p>培训家人。</p><p>多给家里人培训，让他们不要到处炫耀，低调做人，避免让人眼红，给你家人设圈套。</p></li><li><p>去上班。</p><p>家里哪怕衣食无忧，也要去上班，不要无所事事，游手好闲。一旦你游手好闲，就可能落入别人给你精心设下的赌博陷阱。</p></li><li><p>培养爱好。</p><p>钓鱼、打游戏、跑步、健身、跳舞、手工、烹饪，培养一些不跟人打交道的爱好，充实自己。内心富足，才不会被小人抓住漏洞，攫取你的财富。</p></li></ol><p>说到这，我陷入了深深的思考，为啥我就没遇到过赌博陷阱呢。</p><p>思衬良久，悲伤和苦涩逐渐浮上心头，或许，是我穷的太稳定了吧！！！</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;社会充满尔虞我诈，每当有人暴富，总会被各种陷阱洗劫一空，打回原形，能逃过此劫的人屈指可数。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>繁忙的六月</title>
    <link href="https://www.guozhenyi.com/post/2025/06/fan-mang-de-liu-yue.html"/>
    <id>https://www.guozhenyi.com/post/2025/06/fan-mang-de-liu-yue.html</id>
    <published>2025-06-26T14:11:11.000Z</published>
    <updated>2025-08-29T12:05:39.434Z</updated>
    
    <content type="html"><![CDATA[<p>六月，阿文迎来了家里的第二个孩子。</p><p>在6月6号接到妻子电话时，阿文在公司请了陪产假，匆匆买了高铁票，踏上了返回武汉的旅程。</p><span id="more"></span><h2 id="为孩子准备">为孩子准备</h2><p>因为是第二个孩子，阿文没有那么慌张，毕竟经验摆在那儿了，按照既定流程走就行。</p><p>经过社会磨练多年，阿文做事，喜欢谋定而后动，也喜欢规划和列清单。</p><p>在五月份的时候，阿文就跟妻子说，把孩子用品列个清单，按清单购买，避免遗漏。</p><p>经过两人讨论和补充，清单已经很全面了，之后阿文就陆陆续续买好了生孩子的必需品。</p><p>首先是待产包，里面物品一应俱全，虽然有些用不上，不过不影响大局。</p><p>其次，奶瓶，买SS奶嘴，最小流速的，贝亲有一款49元，号称人生第一款奶瓶，对，就那个就行。</p><p>奶粉，选1段，老大之前喝A2，现在想想，没啥必要折腾了，直接选飞鹤星飞帆就OK。</p><p>尿不湿，没有多犹豫，直接选好奇铂金装NB型，84片的先搞两包，老大也用这个，等孩子大了可以换金装、银装等更便宜的。</p><p>维生素AD，出生以后，每天一滴，助力孩子发育，老大都用到了四五岁，老二也必须用。</p><p>妙思乐护臀膏、润肤乳、面霜、沐浴露，全买上，都是老大用过来的。</p><p>爽身粉，备上，大宝之前买的，还有个没拆封，可以直接用。</p><p>婴儿衣服，贴身内衣，要柔软，2-3套，医院就提醒宝妈宝爸准备了。</p><p>浴巾，纯棉的，至少2条，我备了3条，加上亲戚朋友送了些，就很够了。</p><p>贴身包被 1-2 个薄款，把握不好换尿不湿的时机，可以多准备几个，哈哈。</p><p>外层包被 1-2 个。</p><p>小帽子、小袜子，按需购买。</p><h2 id="为宝妈准备">为宝妈准备</h2><p>产妇坐月子期间，需要囤一箱卫生巾，直接买医用级的那种卫生巾就行。</p><p>买了艾草叶，每天煮水给宝妈擦身体，比温水更好，抖音学的。</p><p>其他的，待产包里基本都有了。</p><p>（未完待续…）</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;六月，阿文迎来了家里的第二个孩子。&lt;/p&gt;
&lt;p&gt;在6月6号接到妻子电话时，阿文在公司请了陪产假，匆匆买了高铁票，踏上了返回武汉的旅程。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>神奇的重庆北站</title>
    <link href="https://www.guozhenyi.com/post/2025/05/shen-qi-de-chong-qing-bei.html"/>
    <id>https://www.guozhenyi.com/post/2025/05/shen-qi-de-chong-qing-bei.html</id>
    <published>2025-05-16T13:29:42.000Z</published>
    <updated>2025-05-23T15:20:35.245Z</updated>
    
    <content type="html"><![CDATA[<p>小巴是个重庆人，自从十几年前，从重庆的山沟沟外出打拼以后，就很少有时间回重庆了。</p><span id="more"></span><h2 id="起源">起源</h2><p>2024 年秋，由于家庭原因，小巴需要接父母到武汉帮忙一段时间。</p><p>小巴没有多想，在铁路 12306 APP 为父母买好了“重庆北-武汉”的火车票。</p><p><img src="/uploads/2025/05/16/chongqingbei-001.webp" alt="chongqingbei-001"></p><p>鉴于小巴的老家，在重庆的四环外，坐大巴到市区需要两个小时，所以小巴给父母买的上午 11 点左右的火车票。</p><p>等到了乘火车的那一天，小巴跟父母说先坐大巴到龙头寺（长途）汽车站，然后往北边走，走到北站北广场…</p><p>后来，小巴的父母说他们没在龙头寺汽车站诶，在南广场汽车站。</p><p>小巴有点懵，说你们坐错汽车了吧，只有龙头寺汽车站和龙头寺汽车北站。</p><p>龙头寺汽车北站就在重庆北站北广场旁边，坐火车很方便，但是小巴家乡好像没啥大巴车去那个站。</p><p>巴拉巴拉，说了一通，小巴也不知道他父母听懂了没，反正最后是他们自己问路，跌跌撞撞赶到了重庆北站北广场，进了候车室。</p><p>经过这件事以后，小巴心里直犯迷糊，难道记忆错乱了。</p><p>小巴对重庆的印象可能还停留在十年前，对于汽车站、火车站，也是十年前的记忆。</p><p>于是小巴就开始刨根究底的查资料，果然，对于重庆北站犯迷糊的远不止小巴这个重庆人。</p><p>外地去重庆旅游的人也对重庆北站的地名直呼“卧槽”。</p><p>先来个小巴查到的绕口令：</p><blockquote><p>到重庆北站南广场的乘客，请在重庆北站下车；</p><p>到重庆北站北广场的乘客，请在龙头寺站下车；</p><p>到龙头寺汽车站的乘客，请在重庆北站下车；</p><p>到龙头寺汽车北站的乘客，请在龙头寺站下车。</p></blockquote><p>啧啧啧，小巴试着念了一下，确实有点绕。</p><p>这一段绕口令，直接勾起了小巴往昔的记忆。</p><p>大概十五年前，小巴第一次出远门，就是坐汽车到的龙头寺汽车站，然后准备从重庆北站南广场穿到北广场去坐火车。</p><p><img src="/uploads/2025/05/16/chongqingbei-002.webp" alt="chongqingbei-002"></p><p>幸亏在走到南广场时，听到大喇叭不停的喊：“去北广场的乘客，请上摆渡车，南广场和北广场不互通…”</p><p>小巴很庆幸听到了广播，做摆渡车及时赶到了北广场，否则就赶不上火车了。</p><h2 id="真相">真相</h2><p>小巴为了搞清楚来龙去脉，专门查了重庆北站和龙头寺汽车站的过往。</p><p>最后发现，现在只有重庆北站南广场汽车站和重庆北站北广场汽车站了。</p><p>他们的历史名称如下：</p><p><strong>重庆北站南广场汽车站</strong></p><p>原名：龙头寺长途汽车站（位于重庆北站南广场旁边）</p><p>2016 年 1 月改名为：龙头寺汽车南站</p><p>2016 年 4 月改名为：重庆北站南广场汽车站</p><p><strong>重庆北站北广场汽车站</strong></p><p>原名：龙头寺汽车北站（位于重庆北站北广场）</p><p>2016 年 1 月投入使用。</p><p>2016 年 4 月改名为：重庆北站北广场汽车站</p><h2 id="了然">了然</h2><p>原来如此，一切就合情合理，解释得通了。</p><p>汽车站改名了呗，按照南北位置，改得更贴合实际了。</p><p>搜到一张图，更加直观展示改名前后的变化：</p><p><img src="/uploads/2025/05/16/chongqingbei-003.webp" alt="chongqingbei-003"></p><h2 id="总结">总结</h2><p>小巴查完以后，也觉得增长了见识，对家乡的了解也更多了一点。</p><p>或许是，小巴离开家乡太久，以往心心念念的丁家坡洋芋都已经记不清味道。</p><p>重庆的火锅这么独特，为啥不提及呢。</p><p>因为年少时的小巴，哪能随随便便下馆子吃火锅呀。</p><p>成长伴随着舍弃，有舍有得，怎么可能既要又要还要呢。</p><p>小巴也不知道，再过多少年后，家乡会成为小巴记忆中的一个符号，变成那个“熟悉的陌生城市”。</p><h2 id="名词释义">名词释义</h2><p>小巴：一个离开家乡许久的漂泊者。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;小巴是个重庆人，自从十几年前，从重庆的山沟沟外出打拼以后，就很少有时间回重庆了。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>什么 TM 是 99 新</title>
    <link href="https://www.guozhenyi.com/post/2025/05/13/shen-me-shi-99-xin.html"/>
    <id>https://www.guozhenyi.com/post/2025/05/13/shen-me-shi-99-xin.html</id>
    <published>2025-05-13T14:00:26.000Z</published>
    <updated>2025-05-23T15:20:35.244Z</updated>
    
    <content type="html"><![CDATA[<p>如题，小菜很想知道什么是 99 新，什么 TM 是 99 新。</p><span id="more"></span><h2 id="前言">前言</h2><p>小菜的手机 Redmi K40 Gaming 用了三年了，有点卡，并且 256g 的存储已经无法承载《原神》、《崩铁》、《鸣潮》、《王者荣耀》和微信这些巨无霸应用的数据了。</p><p>看着所剩无几的空间，小菜只能把之前拍的照片和视频拷贝到了电脑里，才勉强腾出了二三十个 G 的存储空间。</p><p>既然这样，那就换手机吧。</p><p>小菜依然记得，给家人买过一款小米 Redmi Note12 Turbo，12+512g，不打游戏的情况下，还挺好用的。</p><p>不过据小菜了解，后续 Redmi Note 13 系列没有 Turbo 了，已经全面改成了独立系列：Redmi Turbo 系列。</p><p>并且后续机型为小米 Redmi Turbo 3、Redmi Turbo 4、Redmi Turbo 4 Pro。</p><p>众所周知，小菜对联发科的 CPU 深恶痛绝，被伤害得很深。</p><p>早年间第一款使用的联发科 CPU 的手机，红米 Note2，wifi 断流，至今耿耿于怀。</p><p>而今小菜用的 Redmi K40 Gaming 采用联发科天玑 1200 CPU，屏幕断触、断触、断触…</p><p>小菜已经忍了它三年了！！！</p><p>通过复盘，小菜不禁陷入深深的思考，当初在拿到 Redmi K40 Gaming，知道它断触时，为啥没有找小米售后。</p><p>其实小菜当初有过冲动去找小米售后，但是这破手机，断触不好复现啊…</p><p>可能几天，也可能几个月才会断触一次，完全没规律，小菜也没办法举证它有断触的问题。</p><p>而且它还会死机、黑屏、无响应，遇到过几次，也没法复现。</p><p>好多次在打游戏时，上滑没法回到桌面，游戏里按钮无响应，错过好多次“五杀”的机会（手动滑稽）。</p><h2 id="碎碎念">碎碎念</h2><p>小菜非常喜欢小屏手机，并且青睐直面屏。</p><p>小米 12 是小屏，但它是曲面屏。</p><p>小米 13 是小屏，直面屏。</p><p>小米 14 是小屏，微曲面屏。</p><p>因此，综合下来，小菜最喜欢的是小米 13，可惜发售时间太长，没有新机了吧。</p><p>看过某鱼二手，好像磕碰挺多，惨不忍睹，实在选不到啥成色好的机子。</p><p>退而求其次，就想选择 Redmi Turbo 系列。</p><p>Redmi Turbo 4 是联发科 CPU，直接 PASS，再买联发科 CPU 手机小菜是狗…</p><p>Redmi Turbo 4 Pro 刚发售，是超大屏，厌恶，并且超过预算了，PASS。</p><p>Redmi Turbo 3 16+512g 官网已经没货了，某东好像还有点库存。</p><h2 id="购机">购机</h2><p>于是，小菜在某东 APP 上逛了逛，看了一下 Redmi Turbo 3，16+512g 白色 2099，还有货。</p><p>在往下翻时，看到一个某东拍拍二手自营，Turbo 3 99 新，只要 14xx 元。</p><p><img src="/uploads/2025/05/13/turbo3-001.webp" alt="turbo3-001"></p><p>短暂考虑后，小菜决定下单试试，搏一搏，单车变摩托，省 600 多拿去喝奶茶不香么。</p><p>当然了，不止有 99 新，还有 95 新，9 新等。</p><p>为了不扯皮，也不差那 95 新和 99 新之间那点差价，小菜就果断下单 99 新的了。</p><p><img src="/uploads/2025/05/13/turbo3-002.webp" alt="turbo3-002"></p><p>还有质检报告哦：</p><p><img src="/uploads/2025/05/13/turbo3-003.webp" alt="turbo3-003"></p><p>下完单，怀着愉快的心情，小菜等待了 3 天。</p><p>快递通知小菜去取件，小菜就迫不及待去驿站拿到了热乎的 99 新 Redmi Turbo 3 16+512g 青刃。</p><p><img src="/uploads/2025/05/13/turbo3-004.webp" alt="turbo3-004"></p><p><img src="/uploads/2025/05/13/turbo3-005.webp" alt="turbo3-005"></p><p>鉴于以往的经历，怕被坑，小菜就录了个开箱视频。</p><p>在打开手机盒，拿出手机的那一刻，小菜以为自己眼睛花了，怎么，感觉这个手机屏幕是弯的…</p><p>为了证明不是小菜眼花，就把手机屏幕贴在手机盒子上，对着灯，看了一下，哇塞：一线天耶~</p><p><img src="/uploads/2025/05/13/turbo3-006.webp" alt="turbo3-006"></p><p>经过几次反复观摩后，发现手机确实是弯的。</p><h2 id="退货">退货</h2><p>这次小菜决定不再忍了，果断去某东 APP 申请售后，提交开箱视频证据，申请退货退款。</p><p>某东客服看了视频后，也是果断滑跪，同意了退货退款。</p><h2 id="复盘">复盘</h2><p>既然已经退货退款，那么可以复盘了。</p><p>小菜把质检报告打开仔细看了一下，8 项外观检测里，就包含机身弯曲检测呀。</p><p><img src="/uploads/2025/05/13/turbo3-007.webp" alt="turbo3-007"></p><p>质检员难道是斗鸡眼，看不出来机身弯曲么。</p><p>小菜作为一个普通人，拿到手机的一瞬间都能看出手机是弯的，出质检报告的质检员为啥看不出来。</p><p>这个问题，小菜没有答案，只能陷入深深的思考。</p><h2 id="总结">总结</h2><p>本来对新机满怀期待，经过这么一折腾后，小菜已经浇灭了心中的火焰。</p><p>把此次购机经历写出来，没有 diss 任何商家的意思，只是充满了遗憾。</p><p>建立信任很难，打破信任却只在一瞬间。</p><p>对于这次购机经历，小菜对某东拍拍二手的 99 新已经不再信任。</p><p>小菜也不妄自揣度商家为什么会发与质检不符的商品去毁掉自己口碑。</p><p>最后，小菜只能无奈的仰天问一句：到底什么 TM 是 99 新，啊。</p><h2 id="名词释义">名词释义</h2><p>小菜：一个或一群不想被定义的菜鸟。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;如题，小菜很想知道什么是 99 新，什么 TM 是 99 新。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>盘点那些让人爆笑的中式英语翻译</title>
    <link href="https://www.guozhenyi.com/post/2025/04/24/hilarious-chinglish-translation.html"/>
    <id>https://www.guozhenyi.com/post/2025/04/24/hilarious-chinglish-translation.html</id>
    <published>2025-04-24T13:18:18.000Z</published>
    <updated>2025-05-23T15:20:35.243Z</updated>
    
    <content type="html"><![CDATA[<p>盘点网上那些让人捧腹的神级翻译。</p><span id="more"></span><p>God is a girl ------------ 天道不公</p><p>God is a girl ------------ 苍天有眼</p><p>MLGB first ------------ 丑话说在前头</p><p>No JJ Book ------------ 葵花宝典</p><p>Family⁹=0 ------------ 诛灭九族</p><p>Jerry ------------ 鼠辈</p><p>I’m a gay ------------ 寡人不近女色</p><p>Find east NB man want to be the CEO ------------ 早悉东方不败的不轨之心</p><p>Big JJ man  all like this ------------ 大丈夫当如是</p><p>God damn BMW ------------ 弼马温</p><p>IQ≈10086  HP≈10010 ------------ 智勇双全</p><p>See him jj be JJ ------------ 看着他一步步成长</p><p>Jack, slow fuck ------------ 捷克斯洛伐克</p><p>One, two, three go ------------ 三思而后行</p><p>0.5 yes 0.5 no ------------ 半信半疑</p><p>Panasonic ask the boy ------------ 松下问童子</p><p>You can you up, no can no BB ------------ 你行你上，不行别BB</p><p>VIP dog ------------ 贵宾犬</p><p>you dida dida me I huala huala you ------------ 滴水之恩涌泉相报</p><p>WiFi baby ------------ 天线宝宝</p><p>Beijing gaga ------------ 北京烤鸭</p><p>Half yes half no ------------ 半推半就</p><p>JJ boom fly in the sky ------------ 碉堡了</p><p>Ant on hot pot ------------ 热锅上的蚂蚁</p><p>People mountain people sea ------------ 人山人海</p><p>Husband and wife lung slice ------------ 夫妻肺片</p><p>注：以上内容来自于网络。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;盘点网上那些让人捧腹的神级翻译。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>杨天才传</title>
    <link href="https://www.guozhenyi.com/post/2025/04/13/chinese-teacher-yang-tian-cai.html"/>
    <id>https://www.guozhenyi.com/post/2025/04/13/chinese-teacher-yang-tian-cai.html</id>
    <published>2025-04-13T02:22:19.000Z</published>
    <updated>2025-05-23T15:20:35.243Z</updated>
    
    <content type="html"><![CDATA[<p>他真的可以称之为天才，语文教学被他拿捏得炉火纯青。</p><span id="more"></span><h2 id="缘起">缘起</h2><p>2005 年某月，二年级五班迎来了一位新的语文老师。他高高瘦瘦，穿着西装，打着领带，偏瘦的身材无法撑起西装，给人一种弱不禁风的感觉。但是他的眼神既坚定又犀利，仿佛能洞穿人心。</p><p>走上讲台，他徐徐说道：“同学们好，我是你们新的语文老师，… 你们放心，我能把本班语文带到全年级第一，这点你们不用担心…”</p><p>台下的同学们都惊呆了，开始议论纷纷，心想这位老师挺狂啊，刚来就说大话了。到时候要是本班语文没冲到年级第一，不怕羞愧的无地自容么…</p><p>话说为啥二年级五班会迎来新的语文老师呢，这还得从第一位语文老师说起。</p><p>在一年级时，五班的语文老师是一位非常漂亮的美女老师。上课认真负责，平时穿着打扮也很时尚。不知何故，在二年级时，被调走了…</p><p>于是学校安排了另外一位老师来教五班的语文课。这位老师也是女性，穿着打扮就比较普通了。也许是这位老师身材娇小，气场不够强大，亦或者同学们太调皮，不买这位老师的账。</p><p>在几次上课后，某一次上课时，不知道被哪个调皮的同学，带头起哄，把语文老师轰走了…走了…</p><p>具体经过不甚清楚，只记得通过班主任沟通，得知同学们对这位语文老师的教学不满意，最后校长知道了此事，就答应给我们换一位语文老师。</p><p>于是，前文所述的语文老师就闪亮登场了。</p><p>他的名字叫杨天才，男，高高瘦瘦，职称高级教师。</p><h2 id="传奇">传奇</h2><p>二年级五班的班主任是英语老师，非常认真负责，此处暂且不表，后续有机会专门著述。</p><p>当这位杨天才老师任教二年级五班语文以后，本班的“副”班主任就是语文老师了，没事就喜欢在班里溜达。</p><p>为什么溜达呢，因为他很闲…</p><p>不是贬义词，是真的闲。</p><p>他的教学模式也超出常规，大致如下。</p><p>场景一：</p><blockquote><p>今天要学一篇古文，上课时，老师说：“现在花 20 分钟，同学们把这篇古文熟悉一下”。（小声阅读）</p></blockquote><blockquote><p>20 分钟后，“好，停。我大概讲一下这篇古文里面的难点…”</p></blockquote><blockquote><p>再 10 分钟后，“还有一点时间，同学们再读一读课文…”（小声阅读）</p></blockquote><p>场景二：</p><blockquote><p>“今天语文课，所有同学拿好自己的书，我们去教室外（操场）读书去…”</p></blockquote><blockquote><p>所有同学带着书本，在操场找一个位置，或坐、或立，开始卖力的读书，小声阅读。</p></blockquote><p>场景三：</p><blockquote><p>“嗯，这节课自学，请同学们翻到课本第 xx 页，开始阅读吧…”</p></blockquote><blockquote><p>杨天才老师背负双手，在教室里来回踱步…</p></blockquote><p>作为学生，对他的教学，并无任何不适，反而太轻松了。</p><p>这位语文老师不喜欢布置作业，抓的最紧的就是阅读。</p><p>“读书百遍，其义自现。”这句话的含金量还在上升，并且被他运用得炉火纯青。</p><p>他鼓励同学们买课外杂志阅读，比如当时很火的《读者》《意林》等等。</p><p>学校每学期都会组织多场全年级统一的考试，考场座位混排，防止作弊。</p><p>随着几场考试下来，本班语文成绩一飞冲天，登顶年级第一。</p><p>当时同学们也很迷糊，本班语文成全年级第一了？？？</p><p>他有什么魔力，他做到了，他怎么做到的，他干了什么…</p><p>然后，杨天才老师依旧很淡定。在教室监督学生阅读时，依旧闲庭信步，毫无波澜。</p><p>他创造的奇迹，惊艳了同年级的所有语文老师。</p><p>后续，学校组织了多次其他班级的语文老师来本班听课。只有这个时候，本班杨天才老师才会稍微认真一点，该备课备课。</p><p>并且一改往日风格，开始一本正经的上课，整堂课没有了自由阅读时间。</p><p>我想，其他语文老师一堂课听下来，肯定心里带着不服：也不过如此嘛，无甚特别之处。</p><p>殊不知，天才型选手，从来都不按套路出牌。</p><p>有的教学方式，在学校看来是离经叛道，但是教学质量却出奇的高。</p><p>杨天才老师即使有心告诉各位老师他的教学方法，如果不知其所以然，那也只是邯郸学步罢了。</p><p>从那以后，二年级五班语文成绩一直很稳定，稳定在第一名，无法撼动。</p><p>每当班主任英语老师不在时，总能看到高高瘦瘦的语文老师溜进班里监督同学们学习。</p><p>杨天才老师依然喜欢背负双手，在教室里来回踱步…</p><h2 id="回忆">回忆</h2><p>自从中学毕业后，离开了家乡，也没有回去探望过一位老师。</p><p>十几年后的某一天，在亲戚家吃饭，遇到一位母校的年轻老师，就偶然寻问了几句：“杨天才老师、杨腾波老师还在学校吗？”</p><p>老师回答我说：“他们还在，还在搭档教学呢…”</p><p>对此，我都能想象出一帧一帧的画面，他们可能依然在续写着传奇。</p><p>匆匆二十多年过去了，回家乡的次数屈指可数。</p><p>大多数也是放假之时，老师们不在学校，更加不可能有机会能拜访昔日的各位老师了。</p><p>祝愿他们一切都好。</p><h2 id="后记">后记</h2><p>本篇致我人生中最尊敬的语文老师：杨天才。</p><p>春风化雨育桃李，愿您身体健康，桃李铺满园。</p><p>三尺讲台一颗心，愿您的光芒如星辰般永远闪亮。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;他真的可以称之为天才，语文教学被他拿捏得炉火纯青。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>使用 Algolia DocSearch 实现站内全文检索</title>
    <link href="https://www.guozhenyi.com/post/2025/04/02/algolia-docsearch-full-text-search.html"/>
    <id>https://www.guozhenyi.com/post/2025/04/02/algolia-docsearch-full-text-search.html</id>
    <published>2025-04-02T11:01:10.000Z</published>
    <updated>2025-05-23T15:20:35.242Z</updated>
    
    <content type="html"><![CDATA[<p>本博客站点的搜索框默认是使用 Google 搜索引擎去搜索网站内容，这里有两个问题：一是由于政策原因，国内无法访问 Google 搜索，导致此搜索功能无效；二是 Google 搜索对本站点内容的收录可能不及时、不全面，导致搜不到某些内容。</p><span id="more"></span><p>这里主要介绍 Algolia 出品的一个站内搜索工具 “DocSearch”，在软件开发圈里，很多开源软件的官网都集成了它，比如 <a href="https://vuejs.org">Vue</a>、<a href="https://vite.dev">Vite</a>、<a href="https://react.dev">React</a>、<a href="https://rollupjs.org">Rollup</a>、<a href="https://webpack.js.org">webpack</a> 等等。</p><p>下面讲一下我的博客接入 DocSearch 的过程：</p><h2 id="1、申请">1、申请</h2><p>在 Algolia 的官方网站去申请使用 DocSearch。</p><p>申请地址是：<a href="https://docsearch.algolia.com/apply/">https://docsearch.algolia.com/apply/</a></p><p>填写你的域名和邮箱，再勾选下面三个选项，如下图：</p><p><img src="/uploads/2025/04/02/algolia-001.webp" alt="algolia-001"></p><p>然后点击 “Join the prrogram”，出现下面的界面：</p><p><img src="/uploads/2025/04/02/algolia-002.webp" alt="algolia-002"></p><p>然后 1 分钟左右吧，他们就会往你的邮箱发一封邮件，表示收到了你的申请。</p><p>之后就是继续等待了，我是大概七八个小时以后，收到了第二封邮件，告诉我一切准备就绪，按照邮件里的指示，添加 css 和 js 就可以开始使用了。</p><p><img src="/uploads/2025/04/02/algolia-003.webp" alt="algolia-003"></p><h2 id="2、修改主题模板">2、修改主题模板</h2><p>官方文档地址：<a href="https://docsearch.algolia.com/docs/docsearch-v3">https://docsearch.algolia.com/docs/docsearch-v3</a></p><p>由于 Algolia 给我发的邮件里引用的静态资源是 jsdelivr CDN 的链接，jsdelivr 在国内不是很稳定，所以我改成了 unpkg CDN 的链接。</p><p>我使用的是 maupassant 主题，因此，先在 <code>themes/maupassant/layout/base.pug</code> 文件中头部的位置插入一个 div 标签：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;docsearch&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>我这里是 pug 模板引擎的写法，因此看起来有点不一样，但是最后编译出来就是上面那样的 div 标签（下图）：</p><p><img src="/uploads/2025/04/02/algolia-004.webp" alt="algolia-004"></p><p>再在 <code>themes/maupassant/source/css/style.scss</code> 文件中写入 css 样式：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#docsearch</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">0</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>实际的添加位置如下图：</p><p><img src="/uploads/2025/04/02/algolia-005.webp" alt="algolia-005"></p><p>然后在页头模板 <code>themes/maupassant/layout/_partial/head.pug</code> 文件中引入 css 样式文件：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</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/@docsearch/css@3.9.0/dist/style.css&quot;</span> /&gt;</span></span><br></pre></td></tr></table></figure><p>实际代码如下图：</p><p><img src="/uploads/2025/04/02/algolia-006.webp" alt="algolia-006"></p><p>再在页脚模板 <code>themes/maupassant/layout/_partial/after_footer.pug</code> 文件的最后写入 js 脚本：</p><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://unpkg.com/@docsearch/js@3.9.0/dist/umd/index.js&quot;</span>&gt;</span><span class="language-handlebars"><span class="language-xml"></span></span></span><br><span class="line"><span class="language-xml"><span class="language-handlebars">  <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">    <span class="title function_">docsearch</span>(&#123;</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">      <span class="attr">appId</span>: <span class="string">&quot;xxxxxxxxxx&quot;</span>,</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">      <span class="attr">apiKey</span>: <span class="string">&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;</span>,</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">      <span class="attr">indexName</span>: <span class="string">&quot;username&quot;</span>,</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">      <span class="attr">insights</span>: <span class="literal">true</span>,</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">      <span class="attr">container</span>: <span class="string">&quot;#docsearch&quot;</span>,</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">      <span class="attr">debug</span>: <span class="literal">false</span></span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars">    &#125;);</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="language-handlebars"></span></span></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>实际代码如下：</p><p><img src="/uploads/2025/04/02/algolia-007.webp" alt="algolia-007"></p><p>这段代码可以在 Algolia 发给我们的邮件里找到，唯一需要替换的就是红框中标出来的位置。</p><h2 id="3、验证">3、验证</h2><p>接下来，把网站打包部署到线上，就可以看到效果了。</p><p><img src="/uploads/2025/04/02/algolia-008.webp" alt="algolia-008"></p><h2 id="4、修改预设配置">4、修改预设配置</h2><p>默认情况下，Algolia 已经给我们配置好了一切。</p><p>如果要更详细的设置，或者调整抓取参数，就用申请时填写的邮箱，在 <a href="https://dashboard.algolia.com/users/sign_in">Algolia</a> 官网注册并登录管理后台，就能看到 Algolia 预设置的配置信息。</p><p><strong>记住，配置信息如果看不懂的话，不要去修改，更不要删除任何东西，否则容易出问题。</strong></p><p>我在 Algolia 的管理后台看了一下，配置的是每周检索一次博客内容。</p><p>我看有人说 Algolia 是可以配置为最小每 24 小时检索一次。</p><p>因此翻了一下官方文档，找到了配置检索频率的文档：<a href="https://www.algolia.com/doc/tools/crawler/apis/configuration/schedule/">Crawler: Schedule</a>。</p><p>然后我就把检索频率改为了每天的凌晨 1 点，如下图：</p><p><img src="/uploads/2025/04/02/algolia-009.webp" alt="algolia-009"></p><p>看了一下实际的检索时间，是北京时间的早上 9 点，所以他们应该是按照 UTC 时区来进行检索。</p><h2 id="5、总结">5、总结</h2><p>总的来说，Algolia DocSearch 接入丝滑，通过简单几步就顺利完成了。</p><p>不知道还有没有其他站内搜索方式可以用，我查了好几个，貌似都要自建服务，那就有点得不偿失。</p><p>大道至简，Algolia 做得非常好，难怪那么受众多开源软件的青睐。</p><h2 id="2025-05-11-更新">2025-05-11 更新</h2><p>目前本站使用的 <a href="https://github.com/guozhenyi/hexo-theme-clarity">hexo-theme-clarity</a> 主题，已经集成了 Algolia Docsearch 站内搜索功能。</p><p>只需要完成本页面的第一节所述申请好 Algolia 接入账号，填入主题配置中即可，不需要自己动手去修改主题模板了。</p><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本博客站点的搜索框默认是使用 Google 搜索引擎去搜索网站内容，这里有两个问题：一是由于政策原因，国内无法访问 Google 搜索，导致此搜索功能无效；二是 Google 搜索对本站点内容的收录可能不及时、不全面，导致搜不到某些内容。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>清明节回武汉的火车票真难抢</title>
    <link href="https://www.guozhenyi.com/post/2025/03/28/qingming-wuhan-train-ticket.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/28/qingming-wuhan-train-ticket.html</id>
    <published>2025-03-28T13:15:21.000Z</published>
    <updated>2025-05-23T15:20:35.241Z</updated>
    
    <content type="html"><![CDATA[<p>今天中午在跟同事一起吃饭的时候，谈到清明节买火车票的事，同事顺嘴问了一句‘你买的是靠窗还是靠过道的票啊？’。</p><span id="more"></span><p>转动脑瓜，思虑片刻，既然回答不出来。</p><p>突然想到当时抢票时，忘记选座位了，付款时也没看是靠窗还是靠过道。</p><p>动车组列车，我是肯定不会选择 B 座位的，一般都是选择 D 座或者 F 座。</p><p>于是，我就掏出手机，那么自然的打开了 12306 APP，然后看向座位时，脑瓜子嗡嗡的…</p><p><img src="/uploads/2025/03/28/train-001.webp" alt="train-001"></p><p>无座，无座，无座…</p><p>天啊，天都塌了。为啥是无座，我在买票时根本没勾选“自动抢无座票”的选项。</p><p>两年来，我记得就只买到过一次无座票，那次加了几十块钱去餐车车厢坐回去的。</p><p>那时正值冬天，还被绿皮车车厢缝隙刮进来的风吹感冒了，回家就发高烧。</p><p>24 年春以后，原来的绿皮车 Z1/Z2、Z37/Z38 升级成了 动车组 D1/D2、D37/D38，票价涨了 50 块左右。</p><p>这一次，我可是早早的就定好闹钟，准备抢票。</p><p>在 3 月 20 日，早上 7 点 55 分就守候在 12306 APP 上准备抢清明节回武汉的火车票了。</p><p>要是当时多看一眼，就多看一眼，看到是无座票，我肯定就赶紧候补了啊…</p><p>当时是有很大概率能候补到座位票的啊（卧铺票不敢奢求，抢不过大爷大妈们）。</p><p>也怪自己购票时手欠，看到卧铺还有几张票，就准备去搏一搏卧铺票，结果售罄。</p><p>再回过头来买二等座时，还排队了一两分钟，就是这个排队，在抢到票时，导致我没有去看是否有座就仓促付款了。</p><p>现在一个星期过去了，要是还能候补到票，那简直就是太阳从西边出来…</p><p>怎么办？</p><p>凉拌炒鸡蛋。</p><p>思来想去，没辙，恐怕要在火车上打地铺了…</p><p>为此，吃完饭后，我特意在网上下单了一张防潮垫。</p><p><img src="/uploads/2025/03/28/train-002.webp" alt="train-002"></p><p>希望 4 块 3 毛 4 能解吾之忧愁。</p><p>到时候上了火车就在门口一铺，往地上一躺，爱咋咋地吧。</p><p>要是在地上摆个碗，乘务员会不会把我赶下火车，哈哈哈…</p><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;今天中午在跟同事一起吃饭的时候，谈到清明节买火车票的事，同事顺嘴问了一句‘你买的是靠窗还是靠过道的票啊？’。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Git 日常使用指南</title>
    <link href="https://www.guozhenyi.com/post/2025/03/27/git-daily-usage-guide.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/27/git-daily-usage-guide.html</id>
    <published>2025-03-27T11:31:24.000Z</published>
    <updated>2025-05-23T15:20:35.240Z</updated>
    
    <content type="html"><![CDATA[<p>Git 是一个神奇的工具，不管是不是程序员，建议都学一学，对工作和学习都有帮助。</p><p>Git 也是我工作、学习和生活中的瑞士军刀，通过在各种场景下合理的使用它，使我更加从容面对各种挑战。</p><span id="more"></span><p>Git 的安装和配置，建议看我前一篇文章：<a href="/post/2025/03/22/git-installation-and-configuration-guide.html">Git 安装和配置指南</a></p><p>Git 命令列表可以看官方文档：<a href="https://git-scm.com/docs">https://git-scm.com/docs</a></p><h2 id="1、初识（克隆）">1、初识（克隆）</h2><p>对于程序员来说，干的最多的事就是把别人的仓库代码拉到自己本地电脑上。</p><p>这个操作最简单，我们以 Github 上的仓库举例，假设我对我的博客正在使用的主题 maupassant 有些不满意，想改动一些地方，那么我就可以先把它在 Github 上的仓库代码拉取到我本地。</p><p>打开它的 Github 仓库地址：<a href="https://github.com/tufu9441/maupassant-hexo">https://github.com/tufu9441/maupassant-hexo</a></p><p>找到它的仓库克隆地址：</p><p><img src="/uploads/2025/03/27/git-001.webp" alt="git-001"></p><p>在电脑桌面找到 “Git Bash” 图标，双击打开终端。比如我要把此仓库的代码克隆到本地的 <code>D:\code\</code> 目录下，则我们可以直接在终端中新建此目录，然后克隆代码：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /d       <span class="comment"># 先切换到D盘根目录</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> code  <span class="comment"># 再创建 code 目录</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> code     <span class="comment"># 进入code 目录</span></span><br><span class="line"></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/tufu9441/maupassant-hexo.git <span class="comment"># 克隆仓库</span></span><br></pre></td></tr></table></figure><p>如下图：</p><p><img src="/uploads/2025/03/27/git-002.webp" alt="git-002"></p><p>有点尴尬，网络不好，根本拉不下来。正常情况下，拉取代码成功后，在 <code>D:/code/</code> 目录下，会有个 <code>maupassant-hexo</code> 目录，里面就是 maupassant 主题的源码。</p><h2 id="2、常用命令">2、常用命令</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></pre></td><td class="code"><pre><span class="line">git init    <span class="comment"># 初始化仓库</span></span><br><span class="line"></span><br><span class="line">git status  <span class="comment"># 查看仓库状态</span></span><br><span class="line"></span><br><span class="line">git fetch  <span class="comment"># 拉取远程仓库的代码</span></span><br><span class="line"></span><br><span class="line">git merge  <span class="comment"># 合并代码</span></span><br><span class="line"></span><br><span class="line">git pull   <span class="comment"># 拉取远程仓库的代码并合并到本地分支</span></span><br><span class="line"></span><br><span class="line">git checkout dev  <span class="comment"># 切换到 dev 分支</span></span><br><span class="line"></span><br><span class="line">git push   <span class="comment"># 把本地分支提交的代码，推送到远程仓库的同名分支（main -&gt; origin/main）</span></span><br><span class="line"></span><br><span class="line">git branch -a  <span class="comment"># 查看所有本地和远程分支</span></span><br></pre></td></tr></table></figure><p>不用死记硬背，通过场景教学，多练习几次，很轻松就能记住并上手。</p><h2 id="3、场景教学">3、场景教学</h2><p>我在 <code>D:/code</code> 目录新建个文件夹 <code>my-note</code>，用来存放 markdown 笔记，应该如何用 git 帮我管理好这些笔记呢？</p><p>常见诉求：</p><ol><li>笔记内容不丟失。</li><li>能多台电脑同步。</li><li>最好能看到笔记的修改历史。</li></ol><h3 id="3-1-新建仓库">3.1 新建仓库</h3><p>创建文件夹，并初始化为 git 仓库。</p><p>打开 Git Bash，输入命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /d/code     <span class="comment"># 进入 D:/code 目录</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">mkdir</span> my-note  <span class="comment"># 创建文件夹</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> my-note     <span class="comment"># 进入文件夹</span></span><br><span class="line"></span><br><span class="line">git init       <span class="comment"># 初始化仓库</span></span><br></pre></td></tr></table></figure><p>如下图：</p><p><img src="/uploads/2025/03/27/git-003.webp" alt="git-003"></p><p>如此，my-note 文件夹就已经成为一个 git 仓库了，在该文件夹里有个隐藏的 .git 目录，里面保存了此仓库的所有信息。</p><h3 id="3-2-添加笔记并提交">3.2 添加笔记并提交</h3><p>现在我们可以在 <code>D:/code/my-note</code> 目录下创建一个笔记本文件 <code>how-to-use-git.md</code>，或者创建子文件夹 <code>2025-03</code>，再在子文件夹里创建笔记 <code>note-001.md</code>。</p><p>此时可以运用 Git 命令查看仓库状态：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status   <span class="comment"># 查看仓库状态</span></span><br></pre></td></tr></table></figure><p>结果如下图：</p><p><img src="/uploads/2025/03/27/git-004.webp" alt="git-004"></p><p>因为这是新仓库，一个提交记录都没有，新建的笔记也没提交到仓库，所以界面上的文字都给提示出来了。</p><p>那么，如何把刚添加的文件全部提交到仓库呢，可以执行如下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git add .     <span class="comment"># 把当前仓库里的所有文件加入暂存区（“点”表示所有）</span></span><br><span class="line"></span><br><span class="line">git commit -m <span class="string">&quot;第一次提交的笔记&quot;</span>  <span class="comment"># 把暂存区的文件提交到仓库，并附上提交信息</span></span><br><span class="line"></span><br><span class="line">git status    <span class="comment"># 查看仓库状态</span></span><br></pre></td></tr></table></figure><p>结果如下图：</p><p><img src="/uploads/2025/03/27/git-005.webp" alt="git-005"></p><p>看其中的英文信息：</p><blockquote><p>On branch main<br>nothing to commit, working tree clean</p></blockquote><p>翻译翻译，就是：</p><blockquote><p>在 main 分支<br>没有什么东西需要提交，工作树是干净的</p></blockquote><p>说明咱们把所有新添加的笔记都用 git 管理起来了，工作区很干净。</p><h3 id="3-3-修改笔记并提交">3.3 修改笔记并提交</h3><p>提交的两条笔记，突然觉得某个地方写错了，于是赶紧打开改了一下，再来看看 git 会有什么变化：</p><p><img src="/uploads/2025/03/27/git-006.webp" alt="git-006"></p><p>这个界面的英文提示也很全面，告诉你：</p><blockquote><p>用 <code>git add</code> 更新你想提交的<br>用 <code>git restore</code> 去撤销你不想更改的内容</p></blockquote><p>里面也追踪到 <code>how-to-use-git.md</code> 和 <code>note-001.md</code> 文件被修改了。</p><p>好，这里的动作就可以拆解了：</p><ol><li>我想把所有修改都提交到仓库，则执行（跟上面添加笔记的步骤一模一样）：</li></ol><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">git add .     <span class="comment"># 把当前仓库里的所有文件加入暂存区（“点”表示所有）</span></span><br><span class="line"></span><br><span class="line">git commit -m <span class="string">&quot;提交一些笔记的修改信息&quot;</span>  <span class="comment"># 把暂存区的文件提交到仓库，并附上提交信息</span></span><br></pre></td></tr></table></figure><ol start="2"><li><a href="http://how-to-use-git.md">how-to-use-git.md</a> 文件内容改错了，想恢复原样，则执行：</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git restore how-to-use-git.md    <span class="comment"># 还原文件到仓库里的版本状态</span></span><br></pre></td></tr></table></figure><ol start="3"><li>只想提交 <a href="http://note-001.md">note-001.md</a> 的修改内容到仓库，则执行：</li></ol><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">git add 2025-03/note-001.md    <span class="comment"># 把当前仓库里的指定文件加入暂存区</span></span><br><span class="line"></span><br><span class="line">git commit -m <span class="string">&quot;提交笔记修改信息&quot;</span>  <span class="comment"># 把暂存区的文件提交到仓库，并附上提交信息</span></span><br></pre></td></tr></table></figure><hr><p>（内容较长，未完待续…）</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Git 是一个神奇的工具，不管是不是程序员，建议都学一学，对工作和学习都有帮助。&lt;/p&gt;
&lt;p&gt;Git 也是我工作、学习和生活中的瑞士军刀，通过在各种场景下合理的使用它，使我更加从容面对各种挑战。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Git" scheme="https://www.guozhenyi.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Git 安装和配置指南</title>
    <link href="https://www.guozhenyi.com/post/2025/03/22/git-installation-and-configuration-guide.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/22/git-installation-and-configuration-guide.html</id>
    <published>2025-03-22T02:46:57.000Z</published>
    <updated>2025-05-23T15:20:35.239Z</updated>
    
    <content type="html"><![CDATA[<p>Git 是目前最流行的分布式版本控制系统，广泛用于软件开发和协作。Git 也不止可以用于代码的版本控制，任何文本型的文件，都可以用 Git 来控制版本，非常方便。下面介绍下 Git 的安装和配置：</p><span id="more"></span><h2 id="一、Git-安装">一、Git 安装</h2><p>Git 官方下载地址是：<a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a></p><p>（⚠️注意：有一个中文版的官网，应该是国内的爱好者搭建的，域名是 <a href="http://git-scm.cn">git-scm.cn</a>，请注意区别。我这里就是看错了，在中文版网站下载的 Git 安装程序，看了下载地址和官网是一致的，还好还好。）</p><p>（备注：我在中文站下载的是 <code>Git-2.47.0.2-64-bit.exe</code> 版本，实际官网最新现在是 <code>Git-2.49.0-64-bit.exe</code> 版本了。我把 <code>Git-2.49.0-64-bit.exe</code> 下载下来重新安装了一遍。）</p><p>打开链接，点击 “Windows”，去下载 windows 版本：</p><p><img src="/uploads/2025/03/22/git-001.webp" alt="git-001"></p><p>在 windows 下载页面，我们选择 <strong>64-bit Git for Windows Setup</strong>：</p><p><img src="/uploads/2025/03/22/git-002.webp" alt="git-002"></p><p>因为下载地址是 github，所以有可能链接打不开，或者很慢，请多试几次。</p><p>下载完成后，双击安装包，如果出现下图的安全警告，点击“运行”即可：</p><p><img src="/uploads/2025/03/22/git-003.webp" alt="git-003"></p><p>这里还可能出现“账户权限控制”的弹窗，选择“是”，如果没出现的话，就会来到正式的安装界面，点击“Next”，如下图：</p><p><img src="/uploads/2025/03/22/git-004.webp" alt="git-004"></p><p>这里会选择安装目录，默认的安装目录一般是 <code>C:\Program Files\Git</code>，可以不用改，但是我的习惯是把软件都安装到 <code>C:\app\</code> 目录，所以这里我改成了 <code>C:\app\Git</code>，继续点击“Next”，如下图：</p><p><img src="/uploads/2025/03/22/git-005.webp" alt="git-005"></p><p>接着进入选组件页，保持默认就好。不过我勾上了 <code>On the Desktop</code> 选项，此项会在桌面创建图标。并且去掉了“Open Git GUI here” 选项，用不到（Git 可视化工具有其他更好的选择），去掉此项可以让右键菜单少一个选项。如下图：</p><p><img src="/uploads/2025/03/22/git-006.webp" alt="git-006"></p><p>这里是问用户是否创建开始菜单目录，默认会创建，不用改动，直接点“Next”，如下图：</p><p><img src="/uploads/2025/03/22/git-007.webp" alt="git-007"></p><p>此界面是让你选择 Git 使用的编辑器，默认是 vim。可以不用修改，点“Next”就行，如下图：</p><p><img src="/uploads/2025/03/22/git-008.webp" alt="git-008"></p><p>这里是询问 <code>git init</code> 命令初始化新仓库时，默认的分支名用哪一个。以前都是叫 <code>master</code>，后来因为黑人搞政治正确，觉得 <code>master</code> 带有歧视，所以普遍都改用 <code>main</code> 作为默认分支名了，所以我们也选择使用 <code>main</code> 作为默认分支名，如下图：</p><p><img src="/uploads/2025/03/22/git-009.webp" alt="git-009"></p><p>这里选择第二项 “Git from the command line and also from 3d-party software”，让其他命令行工具（比如 <code>cmd</code>）也可以使用 <code>git</code> 命令，如下图：</p><p><img src="/uploads/2025/03/22/git-010.webp" alt="git-010"></p><p>这里保持默认，选择第一项 “Use bundled OpenSSH”，使用内建的 OpenSSH 即可，如下图：</p><p><img src="/uploads/2025/03/22/git-011.webp" alt="git-011"></p><p>这里也保持默认，选择第一项 “Use the OpenSSL library”，如下图：</p><p><img src="/uploads/2025/03/22/git-012.webp" alt="git-012"></p><p>注意，这里要选择第三项 “Checkout as-is, commit as-is”（就是不让 Git 去帮你更改换行符，保持文本原样），如下图：</p><p><img src="/uploads/2025/03/22/git-013.webp" alt="git-013"></p><p>这里也选择第一项 “Use MinTTY(the default terminal of MSYS2)”，如下图：</p><p><img src="/uploads/2025/03/22/git-014.webp" alt="git-014"></p><p>这里也保持默认，选择第一项 “Fast-forward or merge”，如下图：</p><p><img src="/uploads/2025/03/22/git-015.webp" alt="git-015"></p><p>这里选择第二项 “None”，不用 Git 的凭据管理。在 windows 系统，Git 需要输入账号密码时，会默认使用 &quot;windows 凭据管理&quot;来保存密码，实测更好用一些，如下图：</p><p><img src="/uploads/2025/03/22/git-016.webp" alt="git-016"></p><p>这里保持默认，不用改动，点击 “Install” 开始安装，如下图：</p><p><img src="/uploads/2025/03/22/git-017.webp" alt="git-017"></p><p>等待安装完成后，点击 “Finish”， 如下图：</p><p><img src="/uploads/2025/03/22/git-019.webp" alt="git-019"></p><p>至此，Git 就安装完成了。</p><h2 id="二、Git-基本配置">二、Git 基本配置</h2><p>安装 Git 后，需要进行基本的用户信息配置，以便提交代码时能够记录正确的身份信息。</p><p>在桌面上双击 “Git Bash” 图标，打开 Git 控制终端，执行两个配置命令，配置名字和邮箱：</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">git config --global user.name <span class="string">&quot;你的名字&quot;</span></span><br><span class="line">git config --global user.email <span class="string">&quot;你的邮箱&quot;</span></span><br></pre></td></tr></table></figure><p>如下图：</p><p><img src="/uploads/2025/03/22/git-020.webp" alt="git-020"></p><h2 id="三、生成-SSH-密钥">三、生成 SSH 密钥</h2><p>如果你使用 Git 连接 GitHub、GitLab 或其他远程仓库，建议生成 SSH 密钥进行身份验证。</p><p>同样的，在桌面上双击 “Git Bash” 图标，打开 Git 控制终端，输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -b 4096 -C <span class="string">&quot;你的邮箱&quot;</span></span><br></pre></td></tr></table></figure><p>这里会有几个选项，我们点击三次回车键（Enter）保持默认即可。</p><p>（备注：这里三个选项，第一个是让你选择密钥存放目录；第二个是设置密钥的密码；第三个是重复密钥的密码。设置了密码容易遗忘，所以一般都不设置密码。只要你给每台机器都生成单独的 SSH 密钥，并且不定期的更换 SSH 密钥，不要把私钥泄露出去，一般都不会有什么安全问题。如果实在涉及到高安全性的地方，建议还是设置一下密码。）</p><p>如下图：</p><p><img src="/uploads/2025/03/22/git-021.webp" alt="git-021"></p><p>到这里，SSH 密钥就生成好了。</p><h2 id="四、给-Github-配置-SSH-密钥">四、给 Github 配置 SSH 密钥</h2><p>如果要在 Github 上克隆仓库，或私有仓库，建议给 Github 配置 SSH 密钥。</p><p>如何创建 Github 账号，这里就不讲述了。只讲如何在 Github 账号中配置 SSH 密钥。</p><p>在桌面上双击 “Git Bash” 图标，打开 Git 控制终端，输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> ~/.ssh/id_rsa.pub</span><br></pre></td></tr></table></figure><p>把打印出来的公钥全部选中，然后点击右键，选择 “Copy” 复制，如下图：</p><p><img src="/uploads/2025/03/22/git-022.webp" alt="git-022"></p><p>接着，我们打开 Github 配置密钥的地址：<a href="https://github.com/settings/keys">https://github.com/settings/keys</a></p><p>点击 “New SSH key” 按钮，在 “Title” 里输入一点信息（辅助我们记忆添加这个 SSH 密钥的作用），再把刚复制的公钥粘贴到 “Key” 的文本框中，如下图：</p><p><img src="/uploads/2025/03/22/git-023.webp" alt="git-023"></p><p>点击 “Add SSH key”，在 Github 中就添加好 SSH 公钥了。</p><p>如何验证呢？</p><p>还是在桌面上双击 “Git Bash” 图标，打开 Git 控制终端，输入以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><p>如果控制台打印出 “Hi username! You’ve successfully authenticated…” 的字样，就表示 SSH 配置成功了。</p><p>如下图：</p><p><img src="/uploads/2025/03/22/git-024.webp" alt="git-024"></p><h2 id="五、Git-可视化工具-GUI-Client">五、Git 可视化工具(GUI Client)</h2><p>如果单纯用 Git 命令去管理版本，不太直观，我们可以用可视化工具配合使用 Git，可以减少很多手敲的命令。</p><p>Git 官方也列了很多可视化工具，我这里推荐使用 <strong>Git Extensions</strong>，用了很多年了，非常方便。</p><p><img src="/uploads/2025/03/22/git-025.webp" alt="git-025"></p><p>官方下载地址：<a href="https://github.com/gitextensions/gitextensions/releases">https://github.com/gitextensions/gitextensions/releases</a></p><p>打开官方下载链接，由于是 Github，可能比较慢，选择 msi 安装包下载：</p><p><img src="/uploads/2025/03/22/git-026.webp" alt="git-026"></p><p>双击安装包即可开始安装，下一步下一步就安装好了，比较简单。</p><h2 id="六、总结">六、总结</h2><p>至此，我们在 windows 系统上就安装并配置好了 Git，还顺便配置好了 Github SSH，安装了 GUI 客户端。</p><p>后续使用 Git 时，配合 GUI 客户端，简直是如虎添翼，非常丝滑。</p><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Git 是目前最流行的分布式版本控制系统，广泛用于软件开发和协作。Git 也不止可以用于代码的版本控制，任何文本型的文件，都可以用 Git 来控制版本，非常方便。下面介绍下 Git 的安装和配置：&lt;/p&gt;</summary>
    
    
    
    
    <category term="Git" scheme="https://www.guozhenyi.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Linux 系统使用 fnm 安装 Nodejs 任意版本</title>
    <link href="https://www.guozhenyi.com/post/2025/03/20/install-nodejs-with-fnm-on-linux.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/20/install-nodejs-with-fnm-on-linux.html</id>
    <published>2025-03-20T11:46:57.000Z</published>
    <updated>2025-05-23T15:20:35.239Z</updated>
    
    <content type="html"><![CDATA[<p>经过多年发展，Nodejs 版本管理工具层出不穷，比如 nvm、nvs、fnm、volta 等等，都是各具特色的工具。</p><p>比如在 Windows 系统上就是使用 <a href="https://github.com/coreybutler/nvm-windows">nvm-windows</a> 来切换 Nodejs 版本，简单方便。</p><span id="more"></span><p>在 Linux 系统上，软件仓库一般会有一个比较老的 Nodejs 版本，可以直接运行命令 <code>apt install nodejs</code> 安装使用。比如在 ubuntu 20.04 系统中，软件仓库默认集成是 Nodejs 10.x 的版本。</p><p>我现在想要在 ubuntu 服务器中部署一个持续集成工具，能帮我自动给前端项目打包，前端项目目前使用的 Nodejs 是 16.x 版本。</p><p>之前写过一篇介绍 ubuntu 安装 Nodejs 的文章：<a href="/post/2020/06/28/ubuntu-18-install-nodejs-12.html">ubuntu 18.04 安装 nodejs 最新版、指定版 12.x 14.x</a>。文章里面的内容好像过时了，而且操作起来不够简单。</p><p>那么我现在要给 ubuntu 20.04 服务器安装 Nodejs 16.x，经过研究后，我觉得使用 <code>fnm</code> 来安装 Nodejs 是比较简便的方式。</p><h2 id="安装-fnm">安装 fnm</h2><p>fnm 是使用 Rust 语言开发的一个 Nodejs 版本管理器。</p><p>fnm 官方下载地址：<a href="https://github.com/Schniz/fnm/releases">https://github.com/Schniz/fnm/releases</a></p><p>我们下载最新的 Linux 平台二进制压缩包：<code>fnm-linux.zip</code>，解压后会得到一个 <code>fnm</code> 程序文件。</p><p>接着在本地打开 <code>Git Bash</code> 终端，把 <code>fnm</code> 上传到 ubuntu 服务器：</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">scp fnm root@111.111.111.111:/usr/local/bin/</span><br></pre></td></tr></table></figure><p>注意，为了避免权限问题，这里要用 root 账号上传到 <code>/usr/local/bin</code> 目录。</p><p>上传完成后，登录 ubuntu 服务器，切换到 <code>/usr/local/bin</code> 目录，给 fnm 授予执行权限：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 切换目录</span></span><br><span class="line"><span class="built_in">cd</span> /usr/local/bin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 授予执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x fnm</span><br></pre></td></tr></table></figure><p>接着切换到 <code>/root</code> 目录，在 <code>.bashrc</code> 文件的最后增加一行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">eval &quot;$(fnm env --use-on-cd --shell bash)&quot;</span><br></pre></td></tr></table></figure><p>再执行命令重载一下配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> /root/.bashrc</span><br></pre></td></tr></table></figure><p>输入命令验证一下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fnm --version</span><br></pre></td></tr></table></figure><p>如果打印出版本信息，则 <code>fnm</code> 已经部署好了。</p><h2 id="安装-Nodejs">安装 Nodejs</h2><p>现在我们通过 <code>fnm</code> 安装 Nodejs。</p><p>我这里想安装 Nodejs v16.20.0 版本，则执行如下命令：</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">fnm install 16.20.0</span><br></pre></td></tr></table></figure><p>速度很快，一会就安装好了。</p><p>接着运行如下命令，就可以看到安装好的 Node 了：</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">fnm list</span><br></pre></td></tr></table></figure><p>默认情况下，node 和 npm 都会一起安装。</p><p>我这里要用 pnpm，所以还需要执行以下命令安装 pnpm：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i -g pnpm</span><br></pre></td></tr></table></figure><p>至此，ubuntu 服务器就安装好 Nodejs 比较新的版本了。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;经过多年发展，Nodejs 版本管理工具层出不穷，比如 nvm、nvs、fnm、volta 等等，都是各具特色的工具。&lt;/p&gt;
&lt;p&gt;比如在 Windows 系统上就是使用 &lt;a href=&quot;https://github.com/coreybutler/nvm-windows&quot;&gt;nvm-windows&lt;/a&gt; 来切换 Nodejs 版本，简单方便。&lt;/p&gt;</summary>
    
    
    
    
    <category term="ubuntu" scheme="https://www.guozhenyi.com/tags/ubuntu/"/>
    
    <category term="Linux" scheme="https://www.guozhenyi.com/tags/linux/"/>
    
    <category term="Nodejs" scheme="https://www.guozhenyi.com/tags/nodejs/"/>
    
  </entry>
  
  <entry>
    <title>如何部署 Hexo 博客到 Linux 服务器</title>
    <link href="https://www.guozhenyi.com/post/2025/03/19/how-to-deploy-hexo-to-linux-server.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/19/how-to-deploy-hexo-to-linux-server.html</id>
    <published>2025-03-19T13:18:06.000Z</published>
    <updated>2025-05-23T15:20:35.238Z</updated>
    
    <content type="html"><![CDATA[<p>自从把博客迁移到 Hexo 后，如何方便的把生成的静态博客部署到 Linux 服务器成了摆在眼前的问题。</p><span id="more"></span><p>Hexo 官网介绍了几种部署方式：<a href="https://hexo.io/zh-cn/docs/one-command-deployment">https://hexo.io/zh-cn/docs/one-command-deployment</a></p><h2 id="1、Rsync-方案（放弃）">1、Rsync 方案（放弃）</h2><p>本来想试一下 rsync 部署，发现它不支持 windows 系统。</p><p>后来灵机一动，Git 能在 windows 系统里用，Git for windows 里还自带 bash.exe，而 Git for windows 又是 msys2 的工具包封装而来。那么先看看 msys2 里有没有 rsync，有的话，复制到 Git 里不就可以在 windows 系统下用 rsync 了么。</p><p>打开 MSYS2 Shell，执行以下命令：</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">pacman -S rsync</span><br></pre></td></tr></table></figure><p><img src="/uploads/2025/03/19/rsync-001.webp" alt="rsync-001"></p><p>果然有，于是查看了 rsync 安装位置和依赖包，复制到 Git 里相应位置，运行时发现版本不兼容，无奈作罢。</p><h2 id="2、Bash-脚本方案">2、Bash 脚本方案</h2><p>看了下文档，还可以选择 SFTP 部署方式，我没尝试了，而是想到了更简单的部署方式。</p><p>目前我的部署方式是在 windows 系统本地运行 <code>hexo clean &amp;&amp; hexo g</code> 生成静态站点，然后 ftp 上传到服务器上。</p><p>而这一过程重复多次以后，就觉得很烦了，想着把它简化一下吧。</p><p>于是写了个 bash 脚本放在 Hexo 博客根目录，命名为 “<a href="http://deploy.sh">deploy.sh</a>”，内容如下：</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line">_date=$(<span class="built_in">date</span> +<span class="string">&quot;%Y%m%d-%H%M&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 清理缓存</span></span><br><span class="line">hexo clean</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成网站</span></span><br><span class="line">hexo generate</span><br><span class="line"></span><br><span class="line">_pkg=site-<span class="variable">$&#123;_date&#125;</span>.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 打包</span></span><br><span class="line">tar -czf <span class="variable">$&#123;_pkg&#125;</span> public</span><br><span class="line"></span><br><span class="line"><span class="comment"># 远程主机中的网站存放目录</span></span><br><span class="line">_remote_dir=/var/www/website/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 主机登录信息</span></span><br><span class="line">_remote_host=root@xxx.xx.xx.xxx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 上传</span></span><br><span class="line">scp <span class="variable">$&#123;_pkg&#125;</span> <span class="variable">$&#123;_remote_host&#125;</span>:<span class="variable">$&#123;_remote_dir&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 远程部署</span></span><br><span class="line">_tar=<span class="string">&quot;tar -xzf <span class="variable">$&#123;_pkg&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line">ssh <span class="variable">$&#123;_remote_host&#125;</span> <span class="string">&quot;cd <span class="variable">$&#123;_remote_dir&#125;</span> &amp;&amp; rm -rf public &amp;&amp; <span class="variable">$&#123;_tar&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;Deploy success.&quot;</span></span><br></pre></td></tr></table></figure><p>注意，此脚本运行的前提条件是为 Linux 服务器配置好免密登录，可以参考我的另一篇文章：</p><p>《<a href="/post/2023/11/30/configure-password-free-login-for-linux.html">Linux 服务器配置免密码登录</a>》</p><p>我在 Nginx 配置的完整目录是 <code>/var/www/website/public</code>。</p><p>脚本中的 <code>_remote_dir</code> 即为我的网站存放目录，因为网站打包已经包含了 public 目录，所以这里就不需要再填写 public 目录了。</p><p>脚本中的 <code>_remote_host</code> 则是配置我的 ubuntu 服务器的地址（username@ip）。</p><p>这样每当我写完新的文章以后，就可以在网站根目录打开 “Git Bash”，执行：</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">bash deploy.sh</span><br></pre></td></tr></table></figure><p>脚本运行完，就表示我的网站已经部署好啦，怎么样，是不是简单方便。</p><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;自从把博客迁移到 Hexo 后，如何方便的把生成的静态博客部署到 Linux 服务器成了摆在眼前的问题。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://www.guozhenyi.com/tags/linux/"/>
    
    <category term="Hexo" scheme="https://www.guozhenyi.com/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>春节前北京到武汉国道长途自驾经历</title>
    <link href="https://www.guozhenyi.com/post/2025/03/16/beijing-to-wuhan-guodao-zijia.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/16/beijing-to-wuhan-guodao-zijia.html</id>
    <published>2025-03-16T14:26:56.000Z</published>
    <updated>2025-05-23T15:20:35.237Z</updated>
    
    <content type="html"><![CDATA[<p>年前，想到要开1100多公里的高速从北京回武汉，就有点发慌。因为2023年也开过几次长途了，但是有个问题，就是长途开高速打瞌睡，是真打瞌睡，长时间看同样的路，出现视觉疲劳，非常难熬。</p><span id="more"></span><p>因此就有一点不一样的想法，加上自从开车以来，也从来没有在国道长途自驾过，以前走过几次跨市的国道，好像体验都不是太好，路比较烂。这次就想趁着离过年还有点时间，从北京走国道自驾回武汉。</p><p>在放假前一天，收拾好东西，提前放在了车里，准备等正式放假的时候，直接去取车开始启程。</p><h2 id="2025-01-24-周五">2025-01-24 周五</h2><p>临近年关，按照去年的经验，公司25号正式放假，那么24号下午应该就会提前放了，果不其然，下午2点左右，领导宣布开始放春节假期。迅速收拾好东西出公司，坐公交去停车场取车。</p><p>心情略显激动，因为这是我第一次国道长途自驾。这次是准备从北京出发，走国道 G106 回到武汉，全程 1150 余公里。</p><p>在下午2点50分到达停车场，调好导航就出发了，这注定是一场持久的考验。</p><p>北京市范围内的 G106 国道修得很好，速度也能到六七十，但是就是总感觉很慢，因为红绿灯太多，等待时间太长，所以平均每个小时行驶的路程就很少。</p><p>在一路行驶了三个多小时后，天已变得黑暗，肚子也有点饿了，却没有找到合适的吃饭的地方。这并不奇怪，因为当天已经腊月二十四，距离过年仅剩五天。在找到一家烧烤店时，我停车去问有面吗，老板说只有泡面…</p><p>于是只好作罢，继续行驶，并吃点自己备的饼干。没过多久，就看到路边有一家兰州拉面馆，进去吃了一碗土豆牛肉盖饭，吃完饭顺便接了一杯热水，之后继续赶路，此时是晚上6点五十几分。</p><p>在到达衡水市武邑县时，已经是晚上九点多了，找个路边临时停车，开始寻找住宿的宾馆。在衡水市衡水湖边，找到一家比较合适的宾馆，单人间只要五十元一晚。在到达宾馆前，刚好看到一家中国石化加油站，估摸了一下油量，加了100块的油。</p><p>在晚上 10点24分到达宾馆，除了宾馆设施比较老旧，其他没有什么问题，稍微整理一下就睡下了。</p><p>看了百度地图的历史轨迹，驾车时间从 14:51 到 22:24，导航 292 公里，耗时7小时33分，平均为36公里/小时。</p><p><img src="/uploads/2025/03/16/bj-wh-001.webp" alt="bj-wh-001"></p><h2 id="2024-01-25-周六">2024-01-25 周六</h2><p>第二日，醒来比较早，早上刚7点钟就开始出发，路上都比较顺利。</p><p>在早上10点多的时候，开始进入河南省境内，河南和河北的国道，感受就截然不同。</p><p>河北省内的国道，两边基本都是封闭的，也很少遇见人，司机可以专心开车。</p><p>河南省内的国道就不同了，每进入一个城镇，道路两边都是做生意的门面，路上人来人往，很是热闹，而且老年代步车简直泛滥成灾，在路上到处穿梭。</p><p>因此，每经过一个小镇，就会行驶缓慢，一点一点往前挪。到中午12点时，找了个合适的地方，停车吃饭。</p><p>此时，驾车时间从 07:03 到 12:10，导航 241 公里，耗时 5小时7分，平均为47公里/小时。</p><p><img src="/uploads/2025/03/16/bj-wh-002.webp" alt="bj-wh-002"></p><p>在濮阳市濮阳县八公桥镇王记牛肉馆，吃了一碗正宗河南烩面，吃完接着赶路。</p><p>过不多久，就进入了山东菏泽市的东明县，这儿有个小插曲，我在东明县找了个中国石化加油，加完出来，那里刚好是个红绿灯路口，由于我要跨多车道并道最左侧去掉头，我停在那儿等了很久，等车都过完，才准备在实线前并到最左侧车道去。这时，后方来了一辆奔驰，在后面疯狂按喇叭，把我搞慌了，就差一条道啊，结果就直挺挺的被逼进了直行车道，开始等红灯。绿灯起步后，后方的奔驰迅速加速到我前面，一脚急刹，然后伸出头嘴里估计是骂了几句国粹后扬长而去。</p><p>嗯，这个地方叫山东省菏泽市，鲁R车牌，应该是本地人吧，果然是礼仪之邦，受教了。</p><p>这里只有一小段穿过山东菏泽，然后又继续回到河南省，进入开封市。</p><p>时间来到下午天黑之前，天空下起了雨夹雪，等天晚上黑了之后，视线就不太好了。</p><p>在这之前，其实我也看到过几起事故了，有一辆小车在城区，撞到了花坛上，司机无大碍，站在路边打电话，估计是在报保险叫救援吧。还有个比亚迪f0被一辆丰田追尾，司机们在路边讨论着什么。</p><p>而我呢，也遇到了惊险时刻。在夜色朦胧中，前方星光点点的灯光中，一个红绿灯路口，在我靠近时，突然发现有一辆类似福特全顺的轻客，骑在红绿灯路口的实线上，半个车身在我这边的车道里，并且闪烁着灯光…</p><p>幸好车速不快，等我看清时，赶紧向右边打了一把方向，侧身而过，也幸好我的车身小巧，刚好能借着线外的一点道路，一个“滑铲”顺利通过。等过去后，心里惊出一身冷汗，真想骂几句国粹啊…</p><p>在晚上8点半时，路过一个小镇，看到一家羊肉馆还在营业，在路边停好车，顶着细雨中雪花，在羊肉馆切了一点羊肉，弄了一碗羊肉汤，就着一张饼，凑和了一顿晚餐（那张饼挺大的，没吃完…）。</p><p>时间匆匆，晚上九点多时，我已经在前方的项城市找好了宾馆。其实从天黑以后开始，路上的人就少了，开车都快了很多，本想接着人少再多赶路，想想这雨夹雪的夜晚，加上刚刚经历的惊险时刻，还是打消了这念头，找个宾馆休息。</p><p>此时，驾车时间从 12:50 到 22:07，导航 258 公里，耗时9小时17分，平均为25公里/小时。</p><p><img src="/uploads/2025/03/16/bj-wh-003.webp" alt="bj-wh-003"></p><h2 id="2024-01-26-周日">2024-01-26 周日</h2><p>一夜无话，等到第二天早晨，我认为不需要太过赶路，并还剩400公里了，一天时间怎么也够了。</p><p>结果是我判断失误了，低估了河南城镇的热闹，道路两旁铺满年货，人来人往，简直热闹非凡啊，如果不是知道各地卖的年货都差不多，我都想停车去逛一番河南大集。</p><p>现实往往是残酷的，从早上8点半出发，到中午12点时，我才仅仅行驶了七八十公里…</p><p>地图显示，前方新蔡县孙召镇的路线堵成酱紫色，光是在龙口镇和孙召镇之间的道路上，我就整整堵了一两个小时，耐心差点耗尽。</p><p>经过合计，我认为不能再走国道了。赶紧看地图，告诉小度上高速，终于慢慢挪到了高速口，右拐从新蔡县立交那里上了新阳高速，上高速后，一马平川，转到大广高速，淮内高速，安罗高速，京武高速，武大高速到达武汉。</p><p>并且在下午5点40分到达武汉的家。</p><p>此时，驾车时间从 08:33 到 17:39，导航 411 公里，耗时9小时6分，平均43公里/小时。</p><p><img src="/uploads/2025/03/16/bj-wh-004.webp" alt="bj-wh-004"></p><h2 id="本次国道自驾费用合计">本次国道自驾费用合计</h2><p>本次自驾，全程1150多公里，历时三天。花费如下：</p><p>第一天：加油 100 元，住宿 50 元，吃饭 16 元。</p><p>第二天：加油 250 元，住宿 52 元，吃饭 34 元。</p><p>第三天：加油 250 元，高速费 167 元，吃饭 18 元。</p><p>共计花费：937 元。</p><h2 id="以往高速自驾费用对比">以往高速自驾费用对比</h2><p>之前，我计算过，从武汉到北京，走京港澳高速，全程高速费是 491 元。</p><p>油费大概是 430 元（加了450元的油，没用完）。</p><p>所以如果走高速的话，费用是 920 元左右。</p><h2 id="总结">总结</h2><p>如果是长途行车，走国道确实会更省钱一点，但是所花费的时间会翻倍。如果住宿和吃饭稍微好点的话，其实就不省钱了。</p><p>如果是开油车走国道长途旅行，那么一天的极限行驶可能就400公里，而且会比较累，也玩不好，大把时间都花在赶路上了。从费用上来看，特别是多人同行时，旅行中住宿的费用占比会很高。所以长途旅行住车上能省钱，是有一定的道理。</p><p>在想象一下，如果是开电车走国道长途旅行，并且住车里，那么会很省钱！！！这不就意味着同样的钱，就能旅行更长时间了。</p><p>因此，从这一次国道自驾，我摸索出了一些窍门，以后去旅行，要想省钱，那就开电车走国道，既不错过风景，也不担忧费用无法承受。</p><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;年前，想到要开1100多公里的高速从北京回武汉，就有点发慌。因为2023年也开过几次长途了，但是有个问题，就是长途开高速打瞌睡，是真打瞌睡，长时间看同样的路，出现视觉疲劳，非常难熬。&lt;/p&gt;</summary>
    
    
    
    
    <category term="旅行" scheme="https://www.guozhenyi.com/tags/travel/"/>
    
  </entry>
  
  <entry>
    <title>给博客增加 Sitemap 和 Robots（Hexo）</title>
    <link href="https://www.guozhenyi.com/post/2025/03/14/hexo-site-add-sitemap-and-robots.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/14/hexo-site-add-sitemap-and-robots.html</id>
    <published>2025-03-14T11:26:56.000Z</published>
    <updated>2025-05-23T15:20:35.237Z</updated>
    
    <content type="html"><![CDATA[<p>Hexo 生成的静态网站，默认没有集成 Sitemap 功能。而我们的网站，如果想要更好的被搜索引擎收录，建议给站点增加 Sitemap。下面是操作步骤：</p><span id="more"></span><h2 id="1-安装-hexo-generator-sitemap">1. 安装 hexo-generator-sitemap</h2><p>在 Hexo 生成站点的根目录下执行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-sitemap --save</span><br></pre></td></tr></table></figure><p>因为我用的是 <code>pnpm</code> 包管理工具，所以我这里执行的命令是：</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">pnpm add hexo-generator-sitemap</span><br></pre></td></tr></table></figure><h2 id="2-配置-sitemap-xml">2. 配置 sitemap.xml</h2><p>安装完插件后，编辑站点根目录下的 <code>_config.yml</code> 配置文件，寻找是否有 sitemap 字样，如果没有则增加配置：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><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"># Sitemap</span></span><br><span class="line"><span class="attr">sitemap:</span></span><br><span class="line">  <span class="attr">path:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">sitemap.xml</span></span><br><span class="line">  <span class="attr">tags:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>我这里配置了在 sitemap 中显示标签，如果不想显示标签，可以把 <code>tags: true</code> 删掉。</p><h2 id="3-配置站点-URL">3. 配置站点 URL</h2><p>还是在 <code>_config.yml</code> 中，查看 <code>url</code> 字段是否配置正确。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">url:</span> <span class="string">https://www.guozhenyi.com</span></span><br></pre></td></tr></table></figure><p>如果没有正确配置 <code>url</code>，生成的 <code>sitemap.xml</code> 可能会缺少正确的链接结构。</p><h2 id="4-生成-Sitemap">4. 生成 Sitemap</h2><p>在站点根目录下执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo g</span><br></pre></td></tr></table></figure><p>生成完成后，即可在 <code>public/</code> 目录下看到 <code>sitemap.xml</code> 文件。</p><h2 id="5-增加-robots-txt">5. 增加 robots.txt</h2><p>同样的，Hexo 没有自带 <code>robots.txt</code> 文件，为了对搜索引擎更友好，建议在 <code>source/</code> 目录下创建 <code>robots.txt</code> 文件，内容为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">User-agent: *</span><br><span class="line">Disallow:</span><br><span class="line">Sitemap: https://www.guozhenyi.com/sitemap.xml</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>请把里面的域名换成你自己的域名。这样，搜索引擎就能很好的索引本站啦。</p><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Hexo 生成的静态网站，默认没有集成 Sitemap 功能。而我们的网站，如果想要更好的被搜索引擎收录，建议给站点增加 Sitemap。下面是操作步骤：&lt;/p&gt;</summary>
    
    
    
    
    <category term="Hexo" scheme="https://www.guozhenyi.com/tags/hexo/"/>
    
  </entry>
  
  <entry>
    <title>在 Debian 12 中搭建 Home Assistant 智能家居</title>
    <link href="https://www.guozhenyi.com/post/2025/03/13/installing-home-assistant-on-debian-12.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/13/installing-home-assistant-on-debian-12.html</id>
    <published>2025-03-13T11:37:06.000Z</published>
    <updated>2025-05-23T15:20:35.235Z</updated>
    
    <content type="html"><![CDATA[<p>智能家居很火，之前看到过文章说小米官宣开源 Home Assistant 插件，当时内心毫无波澜。</p><span id="more"></span><p>后来大概了解了一下 Home Assistant 是什么，借用 ChatGPT 的回答：</p><blockquote><p>Home Assistant 是一款开源的智能家居自动化平台，旨在通过中央化控制、自动化和智能化管理家中的各种设备和系统，从而提供更高效、便捷的生活方式。它支持与多个智能设备和服务集成，能够集中控制家中的各种硬件和软件系统，实现自定义自动化规则。</p></blockquote><p>直到第二次看到有人写：<a href="https://juejin.cn/post/7454170332712386572">小米正式官宣开源！杀疯了！</a></p><p>于是衍生出了对 Home Assistant 一探究竟的好奇心。</p><p>第一步就看官方安装文档：<a href="https://www.home-assistant.io/installation/">https://www.home-assistant.io/installation/</a></p><p>官方文档说最容易的安装是直接买安装了 Home Assistant 的树莓派硬件。</p><p>其次是自带树莓派硬件安装 Home Assistant。</p><p>最难的是自行在类安卓或 PC 机器上安装 Home Assistant。</p><p>然后出现了几种版本：</p><ul><li>Home Assistant Operating System（HA OS）</li><li>Home Assistant Container （Docker）</li><li>Home Assistant Supervised （Manual installation of the Supervisor.）</li><li>Home Assistant Core  （Manual installation using Python virtual environment.）</li></ul><p>详细区别请看官方文档，总结就是：</p><p>HA OS 是用定制版 Debian 系统安装了 Home Assistant。</p><p>Supervised 是自己用 Debian 系统去安装 Supervised 和 HA 那一套。</p><p>这两个方案都是全功能版，Container 和 Core 不能在 UI 界面上安装插件。</p><h2 id="安装1">安装1</h2><p>首先想的是在 windows 上安装 VirtualBox 虚拟机版本。刚好电脑上安装了 VirtualBox，这是最方便的方式。</p><p>等照着官网一步一步安装好，并且进了 UI 管理界面后，死活安装不是官方的 Terminal &amp; SSH 插件，这就尴尬了，没法进行下一步，而且最脑残的是官方竟然把 Ternimal &amp; SSH 这个插件打的 docker 包来安装，国内 docker 根本没法拉取，卡了好久，实在没想到好的解决方法，放弃了。</p><h2 id="安装2">安装2</h2><p>换个方案，我先在 VirtualBox 虚拟机安装一个 Debian 12 的操作系统，然后预先安装好以来的软件和工具，再安装 Home Assistant Supervised。</p><p>文档：<a href="https://www.home-assistant.io/installation/linux#install-home-assistant-supervised">https://www.home-assistant.io/installation/linux#install-home-assistant-supervised</a></p><p>这个文档里第一步让我先把系统弄得满足这个文档里的需求：</p><p><a href="https://github.com/home-assistant/architecture/blob/master/adr/0014-home-assistant-supervised.md">https://github.com/home-assistant/architecture/blob/master/adr/0014-home-assistant-supervised.md</a></p><blockquote><p>Docker CE &gt;= 20.10.17<br>Systemd &gt;= 239<br>NetworkManager &gt;= 1.14.6<br>udisks2 &gt;= 2.8<br>AppArmor == 2.13.x (built into the kernel)<br>Debian Linux Debian 12 aka Bookworm (no derivatives)<br>Home Assistant OS-Agent (Only the latest release is supported)</p></blockquote><h2 id="安装-Home-Assistant-Supervised">安装 Home Assistant Supervised</h2><h3 id="1、安装-Debian-12-7-xfce桌面">1、安装 Debian 12.7 xfce桌面</h3><p>下载 debian-12.7.0-amd64-DVD-1.iso，在虚拟机里安装，并且同时要安装 xfce桌面、SSH。</p><p>再把网络连接改成“桥接模式”，让虚拟机能获取到 IP 地址。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">apt update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 vim</span></span><br><span class="line">apt install vim</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑ssh配置，让root账号能远程登录</span></span><br><span class="line">vim /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><p>在 <code>/etc/ssh/sshd_config</code> 找到 PermitRootLogin 附近，加一行：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">PermitRootLogin yes</span><br></pre></td></tr></table></figure><p>重启sshd：</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 sshd</span><br></pre></td></tr></table></figure><p>在 Debian 系统里使用 <code>ip addr</code> 查一查 ip 地址。</p><p>在本机系统上，用 Git Bash 执行命令配置免密登录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id root@192.168.xx.xx</span><br></pre></td></tr></table></figure><h3 id="2、安装依赖软件">2、安装依赖软件</h3><p>在 Debian 12 上，Systemd、NetworkManager、udisks2、AppArmor 版本都已经满足要求。</p><h4 id="2-1、安装-Docker-CE">2.1、安装 Docker CE</h4><p>按照官方文档安装Docker：<a href="https://docs.docker.com/engine/install/debian/">https://docs.docker.com/engine/install/debian/</a></p><h4 id="2-2、安装-OS-Agent">2.2、安装 OS Agent</h4><p>从上面可以看到，系统需要 Home Assistant OS-Agent</p><p>地址：<a href="https://github.com/home-assistant/os-agent">https://github.com/home-assistant/os-agent</a></p><p>下载当前最新版本：os-agent_1.6.0_linux_x86_64.deb</p><p>打开 Git Bash，使用命令把安装包上传到 Debian 系统里：</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">scp os-agent_1.6.0_linux_x86_64.deb root@192.168.xx.xx:/root/ </span><br></pre></td></tr></table></figure><p>在 Debian 系统里执行安装：</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">dpkg -i os-agent_1.6.0_linux_x86_64.deb</span><br></pre></td></tr></table></figure><p>为了验证是否安装成功，还需要安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install libglib2.0-bin</span><br></pre></td></tr></table></figure><p>执行命令验证是否安装成功：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gdbus introspect --system --dest io.hass.os --object-path /io/hass/os</span><br></pre></td></tr></table></figure><h3 id="3、安装-Supervised">3、安装 Supervised</h3><p>看官方文档：<a href="https://github.com/home-assistant/supervised-installer">https://github.com/home-assistant/supervised-installer</a></p><p>再按照官方文档的步骤安装完成。</p><h3 id="4、配置">4、配置</h3><p>打开：<a href="http://192.168.xx.xx:8123">http://192.168.xx.xx:8123</a></p><p>正常情况下，就能看到欢迎页面了。选择注册账号，选择地理位置等，完成后就可以进入系统。</p><h3 id="5、安装-HACS-极速版">5、安装 HACS 极速版</h3><p>HACS 极速版介绍地址：<a href="https://github.com/hacs-china">https://github.com/hacs-china</a></p><p>简介：<a href="https://hacs.xyz/">HACS</a>是一款优秀的 <a href="https://www.home-assistant.io/">Home Assistant</a> 集成商店，然而国人想要使用它下载插件或前端卡片却困难重重，主要原因就是国内的网络环境。 本项目使用了<a href="https://gitmirror.com/">gitmirror.com</a>和<a href="https://fastgit.org/">fastgit.org</a>等提供的Github代理服务，可以让大家更快的下载商店里的插件。</p><p>下载地址：<a href="https://github.com/hacs-china/integration/releases">https://github.com/hacs-china/integration/releases</a></p><p>这里下载的是 <a href="https://github.com/hacs-china/integration/releases/tag/2.0.5.0">2.0.5.0 - china</a> 版本。</p><p>未完待续…</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;智能家居很火，之前看到过文章说小米官宣开源 Home Assistant 插件，当时内心毫无波澜。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="https://www.guozhenyi.com/tags/linux/"/>
    
    <category term="Debian" scheme="https://www.guozhenyi.com/tags/debian/"/>
    
  </entry>
  
  <entry>
    <title>DNS 之 DoH DoT DoQ 的区别</title>
    <link href="https://www.guozhenyi.com/post/2025/03/07/dns-doh-vs-dot-vs-doq.html"/>
    <id>https://www.guozhenyi.com/post/2025/03/07/dns-doh-vs-dot-vs-doq.html</id>
    <published>2025-03-07T11:46:58.000Z</published>
    <updated>2025-05-23T15:20:35.234Z</updated>
    
    <content type="html"><![CDATA[<p>DNS 全称 Domain Name System，中文叫域名系统，它是一种将域名和IP地址相互映射的技术。</p><span id="more"></span><p>举个例子：我们在浏览器中输入一个域名 <code>https://www.baidu.com</code> ，浏览器会向 DNS 发起查询，查询这个域名对应的 IP 地址，浏览器获得了 IP 地址，就可以去这个 IP 地址所在的服务器请求数据，然后再把数据在浏览器窗口中显示。</p><p>在上古纯情时代，靠 DNS 明文查询就可以满足需求了。但是，哪里有漏洞，哪里就有无良奸商。</p><p>还记得那个时代电信运营商给网站插广告么。就是因为 http 的明文传输，运营商可以劫持网页内容，并且在网页中插入自己的广告代码，所以你会看到，明明自己的网站没有广告，为何莫名其妙就弹出了一堆广告呢，那就是运营商搞得小动作。后来，经过技术发展，为了避免被运营商再在自己的网站中插入广告代码，浏览器厂商开始大面积推广 <code>https</code>，很多公司跟进，现在的网站几乎全面 <code>https</code> 化，运营商现在就没法劫持网页插播广告了。</p><p>DNS 也是同样的理，DNS 也是明文传输的，容易被劫持，因此衍生出了一些 DNS 加密技术，比如 DoH、DoT、DoQ 等。</p><p>DoH、DoT 和 DoQ 都是加密 DNS 请求的协议，主要作用是保护用户的隐私和安全，防止 DNS 请求被劫持或监听。它们的主要区别在于使用的加密传输方式。</p><h4 id="DoH（DNS-over-HTTPS）">DoH（DNS over HTTPS）</h4><p>DoH 是一种通过 https 协议传输 DNS 查询的方法。它利用了HTTPS协议天然的加密特性来保障数据传输的隐私性和安全性。</p><h4 id="DoT（DNS-over-TLS）">DoT（DNS over TLS）</h4><p>DoT 利用传输层安全性协议（TLS）来加密 DNS 查询。DoT 通常在 853 端口上运行，并提供了一种端到端加密的解决方案。</p><h4 id="DoQ（DNS-over-QUIC）">DoQ（DNS over QUIC）</h4><p>DoQ 是一种新兴的技术，它结合了 DNS 查询和 QUIC 协议的优势。QUIC 是一个基于 UDP 的多路复用传输协议，它减少了连接建立时间，并提供了更好的性能和加密支持。DoQ 旨在进一步提升 DNS 查询的效率和隐私性。</p><h2 id="公共DNS服务提供商">公共DNS服务提供商</h2><h4 id="阿里-DNS（国内）">阿里 DNS（国内）</h4><p>DNS IPv4：<code>223.5.5.5</code> 和 <code>223.6.6.6</code></p><p>DNS IPv6：<code>2400:3200::1</code> 和 <code>2400:3200:baba::1</code></p><p>DoH：<code>https://dns.alidns.com/dns-query</code></p><p>DoT：<code>tłs://dns.alidns.com</code></p><p>DoQ：<code>quic://dns.alidns.com</code></p><h4 id="腾讯-DNSPod-DNS（国内）">腾讯 DNSPod DNS（国内）</h4><p>DNS IPv4：<code>119.29.29.29</code></p><p>DNS IPv6：<code>2402:4e00::</code> 和 <code>2402:4e00:1::</code></p><p>DoH：<code>https://doh.pub/dns-query</code></p><p>DoT：<code>tłs://dot.pub</code></p><h4 id="Google-Public-DNS（国外）">Google Public DNS（国外）</h4><p>DNS IPv4：<code>8.8.8.8</code> 和 <code>8.8.4.4</code></p><p>DNS IPv6：<code>2001:4860:4860::8888</code> 和 <code>2001:4860:4860::8844</code></p><p>DoH：<code>https://dns.google/dns-query</code></p><p>DoT：<code>tls://dns.google</code></p><h4 id="Cloudflare-DNS（国外）">Cloudflare DNS（国外）</h4><p>DNS IPv4：<code>1.1.1.1</code> 和 <code>1.0.0.1</code></p><p>DNS IPv6：<code>2606:4700:4700::1111</code> 和 <code>2606:4700:4700::1001</code></p><p>DoH：<code>https://cloudflare-dns.com/dns-query</code></p><p>DoT：<code>tls://1dot1dot1dot1.cloudflare-dns.com</code></p><p>参考：</p><ul><li><a href="https://www.dnswiki.cn/index.php?title=DoH,_DoT,_DoQ_%E7%9A%84%E5%8C%BA%E5%88%AB">DoH, DoT, DoQ 的区别</a></li></ul><p>End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;DNS 全称 Domain Name System，中文叫域名系统，它是一种将域名和IP地址相互映射的技术。&lt;/p&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>迁移博客到 Hexo</title>
    <link href="https://www.guozhenyi.com/post/2025/02/23/migrate-blog-to-hexo.html"/>
    <id>https://www.guozhenyi.com/post/2025/02/23/migrate-blog-to-hexo.html</id>
    <published>2025-02-23T07:38:41.000Z</published>
    <updated>2025-05-23T15:20:35.233Z</updated>
    
    <content type="html"><![CDATA[<p>春天来了，又到了…唔，踏青的季节…</p><span id="more"></span><h2 id="过程">过程</h2><p>从2023年6月就已经在着手把原来系统里的文章迁移出来，更换为 Hexo 博客程序。看了 git 记录，陆陆续续拖到10月份好像就把文章全部迁出来了，但是，但是，就没有然后了。</p><p>现在也记不得是什么原因，可能是项目比较忙吧，就把这事给搁置了。</p><p>时间来到2024年年底，之前买的阿里云 ECS 1c1g 的云服务器在1月份就要到期了。鉴于阿里云在双十一的时候，没有给我续费优惠券，这个云服务器吧，续费就要200多了，这还是在宽带改为按使用付费的情况下的费用。</p><p>其实上一年的双十一的时候，就不想续费了。那时候就可以买99元 2c2g 的云服务器，可能是不想迁移数据，加上阿里云给了老用户续费优惠，111元又给它续了一年。</p><p>由于我的博客程序是我用 Laravel 开发的，比较粗糙，在当时 1核0.5g内存的服务器上，连 composer 都无法运行，后来才把配置升为1核1g。</p><p>没想到时间过得这么快，不得不考虑迁移数据了。所幸买的99的阿里云服务器和之前那个云服务器都选择的是深圳E区，配置好环境，打压缩包，直接内网迁移数据，还是挺快的。</p><p>这波搞完以后，又想起来 Hexo 博客还没理顺，因此花了些时间研究，终于是搭起来了。</p><p>接下来，还得做个重定向，把之前那些文章都重定向到现在的地址，不然会形成很多死链。</p><p>其实这几年吧，也写了很多笔记，只是都放在比较私密的思源笔记里，没有公开，等后续整理吧，整理一些有点价值的文章再发布出来。</p><h2 id="感悟">感悟</h2><p>折腾来，折腾去，博客的最终形态还是静态的模样最合适。</p><p>2014年的时候，其实就用 Hexo 搭建了博客，后来不满意，又换了 Typecho，还是不满意，就自己用 Laravel 写了个简陋版，等把它搭起来了才发现，又把写作的兴趣磨没了。到现在，又回到了 Hexo，回到了最初的模样。</p><p>之前看到过一句话：“别太沉迷于工具，专注写作吧”。当时感悟不深，现在觉得总结很到位。人生大概也如此吧，当我们一路走来，乱花渐入迷人眼，是否还记得最初的梦想。</p><p>–End–</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;春天来了，又到了…唔，踏青的季节…&lt;/p&gt;</summary>
    
    
    
    
    <category term="Hexo" scheme="https://www.guozhenyi.com/tags/hexo/"/>
    
  </entry>
  
</feed>
