<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>小明的部落格</title>
  <icon>https://www.xmdblog.com/icon.png</icon>
  <subtitle>探索科技，启迪技能</subtitle>
  <link href="https://www.xmdblog.com/atom.xml" rel="self"/>
  
  <link href="https://www.xmdblog.com/"/>
  <updated>2026-10-10T08:29:42.778Z</updated>
  <id>https://www.xmdblog.com/</id>
  
  <author>
    <name>xiaoming</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Maya 蒙皮权重保姆级教程：从绑定到导出，一次刷对</title>
    <link href="https://www.xmdblog.com/posts/a448187c.html"/>
    <id>https://www.xmdblog.com/posts/a448187c.html</id>
    <published>2026-10-10T03:18:02.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>适用版本</strong>：Maya 2016.5+（部分功能需 2018+）<br><strong>目标读者</strong>：会基础建模和骨骼、但被刷权重折磨过的角色制作者<br><strong>最终目标</strong>：拿到一套能直接导给 UE &#x2F; Unity &#x2F; Blender 使用的干净权重<br><strong>重要说明</strong>：本教程<strong>全程只使用 Maya 自带功能，不需要任何第三方插件</strong>。比赛、考试、以及禁止第三方工具的项目可以直接照做。</p></blockquote><hr><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ul><li><a href="#0-%E5%85%88%E6%90%9E%E6%87%82%E4%B8%BA%E4%BB%80%E4%B9%88%E5%88%B7%E6%9D%83%E9%87%8D%E8%BF%99%E4%B9%88%E7%B4%AF">0. 先搞懂：为什么刷权重这么累</a></li><li><a href="#%E7%AC%AC-1-%E7%AB%A0-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C%E6%BC%8F%E6%8E%89%E8%BF%99%E6%AD%A5%E5%90%8E%E9%9D%A2%E5%85%A8%E6%98%AF%E7%99%BD%E5%B7%A5">第 1 章 准备工作（漏掉这步，后面全是白工）</a></li><li><a href="#%E7%AC%AC-2-%E7%AB%A0-%E7%BB%91%E5%AE%9A%E6%89%93%E5%BA%95">第 2 章 绑定打底</a></li><li><a href="#%E7%AC%AC-3-%E7%AB%A0-%E5%8E%9F%E7%94%9F%E6%96%B9%E6%A1%88%E9%94%81%E5%AE%9A%E5%88%86%E7%BB%84%E6%B3%95%E6%97%A0%E6%8F%92%E4%BB%B6">第 3 章 原生方案：锁定分组法（无插件）</a></li><li><a href="#%E7%AC%AC-4-%E7%AB%A0-%E6%89%B9%E9%87%8F%E5%A4%8D%E7%94%A8%E4%B8%8D%E8%A6%81%E9%87%8D%E5%88%B7%E7%AC%AC%E4%BA%8C%E9%81%8D">第 4 章 批量复用：不要重刷第二遍</a></li><li><a href="#%E7%AC%AC-5-%E7%AB%A0-%E6%9E%81%E9%99%90%E5%A7%BF%E5%8A%BF%E7%B2%BE%E4%BF%AE">第 5 章 极限姿势精修</a></li><li><a href="#%E7%AC%AC-6-%E7%AB%A0-%E5%90%8E%E5%A4%84%E7%90%86%E4%B8%8E%E5%AF%BC%E5%87%BA">第 6 章 后处理与导出</a></li><li><a href="#%E7%AC%AC-7-%E7%AB%A0-%E4%B8%80%E9%94%AE%E6%94%B6%E5%B0%BE%E8%84%9A%E6%9C%AC">第 7 章 一键收尾脚本</a></li><li><a href="#%E7%AC%AC-8-%E7%AB%A0-%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5%E9%80%9F%E6%9F%A5%E8%A1%A8">第 8 章 故障排查速查表</a></li><li><a href="#%E7%AC%AC-9-%E7%AB%A0-%E6%8F%90%E9%80%9F%E8%B7%AF%E7%BA%BF%E6%80%8E%E4%B9%88%E9%80%89">第 9 章 提速路线怎么选</a></li><li><a href="#%E9%99%84%E5%BD%95-a-%E8%8F%9C%E5%8D%95%E8%B7%AF%E5%BE%84%E9%80%9F%E6%9F%A5">附录 A 菜单路径速查</a></li><li><a href="#%E9%99%84%E5%BD%95-b-%E6%9C%AF%E8%AF%AD%E4%B8%AD%E8%8B%B1%E5%AF%B9%E7%85%A7">附录 B 术语中英对照</a></li></ul><hr><h2 id="0-先搞懂：为什么刷权重这么累"><a href="#0-先搞懂：为什么刷权重这么累" class="headerlink" title="0. 先搞懂：为什么刷权重这么累"></a>0. 先搞懂：为什么刷权重这么累</h2><p>新手刷权重的典型姿势：绑定完 → 打开绘制蒙皮权重 → 从头到尾一笔一笔刷 → 刷到一半发现旁边被刷坏了 → 重新刷 → 循环。</p><p><strong>问题不在手上，在于这条路线本身就是最慢的。</strong> 权重真正的产出逻辑是五段：</p><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">flowchart TD</span><br><span class="line">    A[&quot;1 算法打底&lt;br/&gt;Geodesic Voxel 绑定 + 平滑&quot;] --&gt; B[&quot;2 锁定分组作业&lt;br/&gt;锁住其余骨骼，逐组精修&quot;]</span><br><span class="line">    B --&gt; C[&quot;3 批量复用&lt;br/&gt;镜像 / 复制 / 传递&quot;]</span><br><span class="line">    C --&gt; D[&quot;4 局部精修&lt;br/&gt;只修极限姿势下的别扭处&quot;]</span><br><span class="line">    D --&gt; E[&quot;5 后处理兜底&lt;br/&gt;Delta Mush + 限制影响数&quot;]</span><br></pre></td></tr></table></figure><p>记住三句话，整篇教程都是在展开它们：</p><ol><li><strong>权重不是”刷”出来的，是”算”出来的</strong> —— 让算法给你 70 分的底子，你只负责最后 30 分。</li><li><strong>管理权重比刷权重更重要</strong> —— 让你改一个部位时不破坏别的部位，靠的是「锁定权重」这把原生武器（第 3 章）。</li><li><strong>不要追求完美权重</strong> —— 剩下的瑕疵用 Delta Mush、修正形态、扭转骨去兜，比继续加笔画划算得多。</li></ol><hr><h2 id="第-1-章-准备工作（漏掉这步，后面全是白工）"><a href="#第-1-章-准备工作（漏掉这步，后面全是白工）" class="headerlink" title="第 1 章 准备工作（漏掉这步，后面全是白工）"></a>第 1 章 准备工作（漏掉这步，后面全是白工）</h2><h3 id="1-1-版本与工具清单"><a href="#1-1-版本与工具清单" class="headerlink" title="1.1 版本与工具清单"></a>1.1 版本与工具清单</h3><table><thead><tr><th>项目</th><th>要求</th><th>说明</th></tr></thead><tbody><tr><td>Maya 版本</td><td>2016.5 及以上</td><td>更低版本没有<strong>测地体素绑定</strong>，下拉框里只有”最近距离”和”热力图”</td></tr><tr><td>Maya 版本（推荐）</td><td>2018 及以上</td><td>才有 <code>限制总数</code>、<code>关节标签</code> 等蒙皮收尾功能</td></tr><tr><td><strong>第三方插件</strong></td><td><strong>不需要</strong></td><td>本教程全部使用 Maya 自带功能。比赛 &#x2F; 考试规则常禁止插件，所以第 3 章用的是原生替代方案</td></tr><tr><td>建模软件</td><td>无所谓</td><td>但模型必须经过第 1.2 节的自检</td></tr></tbody></table><blockquote><p><strong>关于插件</strong>：ngSkinTools 这类”权重图层”插件确实好用，但比赛和考试通常不允许安装。本教程第 3 章给了一套纯原生的等价方案——<strong>锁定分组法</strong>，能拿回插件约八成的效率。如果你在自己不受限制的日常项目里工作，装插件当然更快，那部分内容本教程不再展开。</p></blockquote><h3 id="1-2-模型自检清单（6-项，逐项过一遍）"><a href="#1-2-模型自检清单（6-项，逐项过一遍）" class="headerlink" title="1.2 模型自检清单（6 项，逐项过一遍）"></a>1.2 模型自检清单（6 项，逐项过一遍）</h3><p><strong>这一步最少花 5 分钟，能省你 5 小时。</strong></p><table><thead><tr><th>#</th><th>检查项</th><th>怎么查</th><th>不合格怎么办</th></tr></thead><tbody><tr><td>1</td><td><strong>顶点是否全部焊接</strong></td><td><code>显示 &gt; 多边形 &gt; 边界边</code>，如果关节附近出现不属于开口的红色亮边，说明有未焊接的缝</td><td><code>编辑网格 &gt; 合并</code> 焊接；确认模型不是由多个分离壳拼接</td></tr><tr><td>2</td><td><strong>关节处是否有足够边环</strong></td><td>手动观察：肘、膝、肩、胯、手指根，每个关节<strong>至少 3 圈</strong>完整边环</td><td>用 <code>编辑网格 &gt; 插入循环边</code> 补。补边环的效果远好于刷一百遍权重</td></tr><tr><td>3</td><td><strong>有没有五边面&#x2F;多边面</strong></td><td><code>网格 &gt; 清理</code>，勾选”非流形几何体””带洞的面””大于 4 边的面”</td><td>用 <code>编辑网格 &gt; 四边化</code> 或手动切开</td></tr><tr><td>4</td><td><strong>变换是否归零</strong></td><td>选中模型看属性编辑器，位移&#x2F;旋转&#x2F;缩放应该全是 0 &#x2F; 0 &#x2F; 0 &#x2F; 1 &#x2F; 1 &#x2F; 1</td><td><code>修改 &gt; 冻结变换</code></td></tr><tr><td>5</td><td><strong>是否居中、朝向正确</strong></td><td>角色应该站在世界原点，面朝 Z 轴正方向或 -Z（和你的引擎约定一致）</td><td>移动&#x2F;旋转模型，然后<strong>再次冻结变换</strong></td></tr><tr><td>6</td><td><strong>历史是否清干净</strong></td><td><code>编辑 &gt; 按类型删除 &gt; 历史</code></td><td>建好骨、绑好蒙皮之前别乱删，但建模阶段的历史要清</td></tr></tbody></table><blockquote><p><strong>特别提醒</strong>：如果模型是”躯干 + 手臂 + 头”三块分开的壳，绑定时测地体素算法会把人算废。<strong>先用 <code>编辑网格 &gt; 合并</code> 把缝焊起来，或者确认这些壳是故意分离的（比如衣服）。</strong></p></blockquote><h3 id="1-3-骨骼自检清单"><a href="#1-3-骨骼自检清单" class="headerlink" title="1.3 骨骼自检清单"></a>1.3 骨骼自检清单</h3><table><thead><tr><th>#</th><th>检查项</th><th>怎么查 &#x2F; 怎么做</th></tr></thead><tbody><tr><td>1</td><td><strong>关节落在网格体积中心</strong></td><td>这是”怎么刷都别扭”的第一大原因。见 <a href="#21-%E6%8A%8A%E5%85%B3%E8%8A%82%E5%AF%B9%E5%88%B0%E7%BD%91%E6%A0%BC%E4%BD%93%E7%A7%AF%E9%87%8Cinteractive-skin-bind">2.1 节</a></td></tr><tr><td>2</td><td><strong>左右关节命名规范</strong></td><td>必须用 <code>_L</code> &#x2F; <code>_R</code> 或 <code>Left</code> &#x2F; <code>Right</code> 后缀，例如 <code>upperarm_L</code>。<strong>镜像权限完全依赖这个</strong></td></tr><tr><td>3</td><td><strong>加了关节标签（2018+）</strong></td><td>选中骨架根节点 → <code>骨架 &gt; 关节标签 &gt; 添加关节标签</code>。加了标签后镜像、引擎导入都更稳</td></tr><tr><td>4</td><td><strong>关节朝向统一</strong></td><td><code>骨架 &gt; 定向关节</code>，让所有关节轴朝向一致（多数引擎按 X 轴向）</td></tr><tr><td>5</td><td><strong>骨架变换归零并冻结</strong></td><td>同上，<code>修改 &gt; 冻结变换</code></td></tr><tr><td>6</td><td><strong>骨骼层级合理</strong></td><td>前臂、上臂这类会有大扭转的部位，先加好 twist 扭转骨，别指望权重能解决 180° 扭转</td></tr></tbody></table><h3 id="1-4-环境准备：界面与快捷键"><a href="#1-4-环境准备：界面与快捷键" class="headerlink" title="1.4 环境准备：界面与快捷键"></a>1.4 环境准备：界面与快捷键</h3><p><strong>刷权重前必开的三个窗口：</strong></p><ul><li><code>蒙皮 &gt; 绘制蒙皮权重工具</code> 的工具设置面板（右侧，务必展开”工具设置”）</li><li><code>窗口 &gt; 常规编辑器 &gt; 组件编辑器</code>（Component Editor）</li><li><code>窗口 &gt; 常规编辑器 &gt; 大纲视图</code>（方便快速选骨骼）</li></ul><p><strong>必背快捷键（Artisan 笔刷通用）：</strong></p><table><thead><tr><th>操作</th><th>快捷键</th><th>说明</th></tr></thead><tbody><tr><td>调整笔刷半径</td><td>按住 <code>B</code> + 左键拖动</td><td>比去设置面板拉滑块快 10 倍</td></tr><tr><td>调整笔刷强度</td><td>按住 <code>M</code> + 左键拖动</td><td>调不透明度&#x2F;值</td></tr><tr><td>临时反向操作</td><td>按住 <code>Ctrl</code>（Windows）&#x2F; <code>Command</code>（Mac）</td><td>画笔从”相加”变”相减”，不用来回切模式</td></tr><tr><td>框选组件</td><td><code>Ctrl</code> + 右键圈选</td><td>快速选出一片顶点做批处理</td></tr><tr><td>单独显示选中对象</td><td><code>Shift</code> + <code>I</code></td><td>隔离当前网格，避免刷到旁边的衣服</td></tr><tr><td>显示全部</td><td><code>Shift</code> + <code>A</code></td><td>退出隔离</td></tr></tbody></table><blockquote><p><strong>强烈建议</strong>：先把左侧工具架的 <code>选择蒙版</code> 打开，把相机、骨骼之外的物体锁住，避免误刷。</p></blockquote><hr><h2 id="第-2-章-绑定打底"><a href="#第-2-章-绑定打底" class="headerlink" title="第 2 章 绑定打底"></a>第 2 章 绑定打底</h2><h3 id="2-1-把关节对到网格体积里（Interactive-Skin-Bind）"><a href="#2-1-把关节对到网格体积里（Interactive-Skin-Bind）" class="headerlink" title="2.1 把关节对到网格体积里（Interactive Skin Bind）"></a>2.1 把关节对到网格体积里（Interactive Skin Bind）</h3><p><strong>这是整篇教程里”性价比最高”的一步。</strong> 骨骼在网格外面、或者在网格边缘飘着，算法算出来的权重必然是扭曲的，你怎么刷都救不回来。</p><p><strong>操作步骤：</strong></p><ol><li>选中蒙皮网格（可以是多个），按住 <code>Shift</code> 再选中骨架根节点。</li><li>菜单：<code>蒙皮 &gt; 交互式蒙皮绑定 &gt; 选项</code></li><li>在工具设置里：<ul><li><strong>绑定方法</strong> → 选 <code>测地体素（Geodesic Voxel）</code></li><li>勾选与”体积”相关的选项（不同版本叫 <code>保留体积</code> &#x2F; <code>Volume</code>），让关节倾向于保持在网格体积内部</li></ul></li><li>在视口中，逐个&#x2F;批量选中需要处理的关节。</li><li>用移动工具把关节拖到<strong>网格横截面的几何中心</strong>上。肩、肘、膝、胯、指根这几个位置尤其重要。</li><li>确认后点击工具设置里的 <strong><code>绑定蒙皮</code> &#x2F; <code>完成</code></strong> 按钮。</li></ol><p><strong>判断标准</strong>：把视口切成四视图，关节应该在所有视图里都落在网格体积的中间，而不是贴在某一个面上。</p><blockquote><p>如果你觉得”交互式绑定”一次只处理一部分关节太麻烦，也可以：<br>先普通绑定 → 再回到绑定姿势（<code>蒙皮 &gt; 转到绑定姿势</code>）→ 手动调关节位置 → 重新绑定。<br>但<strong>必须在绑定姿势下调</strong>，否则姿势会跳。</p></blockquote><h3 id="2-2-选择绑定方法"><a href="#2-2-选择绑定方法" class="headerlink" title="2.2 选择绑定方法"></a>2.2 选择绑定方法</h3><p><code>蒙皮 &gt; 绑定蒙皮 &gt; 选项</code> → <strong>绑定方法（Bind Method）</strong> 下拉框：</p><table><thead><tr><th>方法</th><th>什么时候用</th><th>什么时候别用</th></tr></thead><tbody><tr><td><strong>最近距离</strong><br/>Closest Distance</td><td>基本淘汰，只在极端简单模型上试</td><td>默认别用，效果最粗糙</td></tr><tr><td><strong>热力图</strong><br/>Heat Map</td><td>封闭、干净、单壳的网格；躯干、头部</td><td>有开放边、穿模、未焊接的网格——<strong>经常会直接报错或者整块权重丢失</strong></td></tr><tr><td><strong>测地体素</strong><br/>Geodesic Voxel</td><td><strong>默认首选</strong>。对非流形、开放边、手指、耳朵这类薄壁结构稳得多</td><td>网格极其庞大（几百万面）时计算慢，可以先减面</td></tr></tbody></table><p><strong>结论：无脑先用测地体素。如果它算出来的结果明显不对，再试热力图。</strong></p><h3 id="2-3-绑定蒙皮参数逐项解释"><a href="#2-3-绑定蒙皮参数逐项解释" class="headerlink" title="2.3 绑定蒙皮参数逐项解释"></a>2.3 绑定蒙皮参数逐项解释</h3><p><code>蒙皮 &gt; 绑定蒙皮 &gt; 选项</code> 面板里，除了绑定方法，还有这些参数：</p><table><thead><tr><th>参数</th><th>建议值</th><th>为什么</th></tr></thead><tbody><tr><td><strong>绑定到</strong></td><td>关节层级（Joint Hierarchy）</td><td>选整个骨架，除非你只绑局部</td></tr><tr><td><strong>最大影响数</strong><br/>Max Influences</td><td><strong>4</strong></td><td>UE &#x2F; Unity 都是 4 骨骼权重。Maya 默认 5，不提前限制就是导出后返工</td></tr><tr><td><strong>衰减速率</strong><br/>Falloff Rate</td><td>默认 0.5</td><td>影响权重的过渡速度，先保持默认</td></tr><tr><td><strong>移除未使用的影响</strong></td><td>勾选</td><td>减掉一堆 0 权重的无用关节，蒙皮更轻</td></tr><tr><td><strong>归一化权重</strong><br/>Normalize Weights</td><td><strong>交互式（Interactive）</strong></td><td>避免刷出负权重、避免权重和不为 1。选”无”是最常见的新手坑</td></tr><tr><td><strong>锁定权重</strong></td><td>保持不动</td><td>后续用锁定功能固定已刷好的关节</td></tr></tbody></table><blockquote><p><code>归一化权重</code> 的三个值：<code>无 / 交互式 / 后处理</code>。</p><ul><li><strong>交互式</strong>：每次刷完立刻归一，权重和永远是 1（<strong>推荐</strong>）</li><li><strong>后处理</strong>：只在收尾时归一，刷的过程中数值会飘，容易刷出负权重</li><li><strong>无</strong>：完全不管，几乎必出问题</li></ul></blockquote><h3 id="2-4-绑定后立刻做的三件事"><a href="#2-4-绑定后立刻做的三件事" class="headerlink" title="2.4 绑定后立刻做的三件事"></a>2.4 绑定后立刻做的三件事</h3><p>绑定完成、还没开始刷之前，<strong>先做这三件事</strong>，你的起点会从 0 分变成 70 分：</p><p><strong>第一件：Flood 平滑打底</strong></p><ol><li>打开 <code>蒙皮 &gt; 绘制蒙皮权重工具</code>。</li><li>在工具设置的”画笔”区，把 <strong>画笔模式</strong> 切成 <code>平滑（Smooth）</code>。</li><li>把 <strong>不透明度</strong> 调到 0.3 左右（别拉满）。</li><li>把笔刷半径调到能覆盖半个身体的大小。</li><li>点工具面板下方的 <strong><code>Flood</code>（填充）</strong> 按钮，点 <strong>2~3 次</strong>。</li></ol><p>这一步会把算法算出来的硬边过渡揉开，手感立刻好很多。</p><p><strong>第二件：全模型统一平滑（可选但推荐）</strong></p><p>选中网格 → <code>蒙皮 &gt; 平滑蒙皮权重 &gt; 选项</code>：</p><ul><li>平滑迭代次数：<code>2 ~ 3</code></li><li>权重固定：如果某几个关节已经刷得很准，先 <code>锁定权重</code> 再平滑</li></ul><p><strong>第三件：确认归一化和影响数</strong></p><ol><li>选中骨架，打开属性编辑器，找到 <code>skinCluster</code> 节点（在大纲视图里按类型筛也行）。</li><li>确认 <code>归一化权重 (Normalize Weights)</code> &#x3D; <code>交互式 (1)</code></li><li>确认 <code>最大影响数 (Max Influences)</code> &#x3D; <code>4</code></li><li>确认 <code>遵守最大影响数 (Obey Max Influences)</code> 已勾选</li></ol><h3 id="2-5-绑定报错急救"><a href="#2-5-绑定报错急救" class="headerlink" title="2.5 绑定报错急救"></a>2.5 绑定报错急救</h3><table><thead><tr><th>报错 &#x2F; 现象</th><th>原因</th><th>解法</th></tr></thead><tbody><tr><td>热力图报错 “无法绑定”</td><td>网格有开放边&#x2F;未焊接</td><td>换测地体素；或用 <code>编辑网格 &gt; 合并</code> 焊接后重试</td></tr><tr><td>绑定后模型整个塌成一团</td><td>关节位置严重偏离网格，或骨架有非单位变换</td><td>冻结骨架变换，用 2.1 节重新对关节</td></tr><tr><td>绑定后某几个关节完全没权重</td><td><code>移除未使用的影响</code> 把它们当无用影响删了</td><td>用 <code>绘制蒙皮权重工具</code> 手动 Add 回来</td></tr><tr><td>蒙皮后模型形状变了</td><td>绑定姿势被破坏</td><td><code>蒙皮 &gt; 转到绑定姿势</code> 检查；确认在绑定姿势下调的关节</td></tr><tr><td>刷权重时出现负权重（数值条跑到负值）</td><td>归一化设成了”无”</td><td>改成”交互式”</td></tr></tbody></table><hr><h2 id="第-3-章-原生方案：锁定分组法（无插件）"><a href="#第-3-章-原生方案：锁定分组法（无插件）" class="headerlink" title="第 3 章 原生方案：锁定分组法（无插件）"></a>第 3 章 原生方案：锁定分组法（无插件）</h2><blockquote><p><strong>本章是整篇教程里收益最大的部分。</strong> 它用 Maya 自带功能实现了插件里”图层隔离”的核心价值。<br>比赛、考试、以及客户禁止第三方工具的项目，都用这一章。</p></blockquote><h3 id="3-1-先想清楚：真正让你返工的是什么"><a href="#3-1-先想清楚：真正让你返工的是什么" class="headerlink" title="3.1 先想清楚：真正让你返工的是什么"></a>3.1 先想清楚：真正让你返工的是什么</h3><p>新手刷权重的痛苦，表面上来自”刷得慢”，实际来自<strong>改坏了别的地方</strong>：</p><ul><li>你调上臂的权重，结果肩膀塌了</li><li>你回头修肩膀，结果胸口跳了</li><li>你回头修胸口，发现上臂又不对了</li></ul><p><strong>所以第一步不是提高刷的速度，而是先建立安全边界</strong>——让你当前的每一笔操作，绝对不会影响边界之外的任何东西。有了边界，每一笔都是净收益，不需要回头返工。</p><h3 id="3-2-核心武器：锁定权重"><a href="#3-2-核心武器：锁定权重" class="headerlink" title="3.2 核心武器：锁定权重"></a>3.2 核心武器：锁定权重</h3><p><code>蒙皮 &gt; 锁定权重</code> &#x2F; <code>蒙皮 &gt; 解锁权重</code></p><p>这是原生 Maya 里唯一能提供”作用域隔离”的功能：</p><ul><li>被锁定的骨骼权重，在<strong>绘制、平滑、归一化</strong>时都不会被改动</li><li>锁定支持两种粒度：</li></ul><table><thead><tr><th>粒度</th><th>怎么用</th><th>典型场景</th></tr></thead><tbody><tr><td><strong>按关节锁定</strong></td><td>选中要保护的关节 → <code>蒙皮 &gt; 锁定权重</code>（选项里选”锁定选定关节的权重”）</td><td><strong>做隔离</strong>：处理肩膀时锁住整个下半身</td></tr><tr><td><strong>按顶点锁定</strong></td><td>选中要保护的顶点 → <code>蒙皮 &gt; 锁定权重</code>（选项里选”锁定选定顶点的权重”）</td><td><strong>做保护</strong>：某一片已经刷得很准，不想再被动到</td></tr></tbody></table><p><strong>验证锁定是否生效</strong>：在绘制蒙皮权重工具里，对锁定的骨骼点一次 <code>Flood</code>，权重应该纹丝不动。如果变了，说明没锁上。</p><blockquote><p><strong>和插件的差距在哪</strong>：锁定只能表达”改 &#x2F; 不改”，而插件图层能表达”相加 &#x2F; 相减 &#x2F; 覆盖 &#x2F; 相乘”。但实际工作中，你要的 95% 就是”改 &#x2F; 不改”——所以这个差距远比想象中小。</p></blockquote><h3 id="3-3-把骨骼分成-7-组"><a href="#3-3-把骨骼分成-7-组" class="headerlink" title="3.3 把骨骼分成 7 组"></a>3.3 把骨骼分成 7 组</h3><p><strong>花 10 分钟做这件事，后面全程受益。</strong> 按”从独立到牵连”的顺序分组：</p><table><thead><tr><th>顺序</th><th>组名</th><th>组内骨骼（按你自己的命名替换）</th><th>备注</th></tr></thead><tbody><tr><td>1</td><td>手指</td><td><code>finger*</code> <code>thumb*</code> <code>index*</code> <code>middle*</code> <code>ring*</code> <code>pinky*</code></td><td>建议每根手指再单独成组</td></tr><tr><td>2</td><td>手部</td><td><code>hand*</code> <code>wrist*</code></td><td></td></tr><tr><td>3</td><td>前臂</td><td><code>forearm*</code> <code>lowerarm*</code> <code>elbow*</code></td><td>需要扭转骨，见 6.3 节</td></tr><tr><td>4</td><td>上臂</td><td><code>upperarm*</code> <code>shoulder*</code> <code>clavicle*</code></td><td><strong>难点</strong>，留足时间</td></tr><tr><td>5</td><td>躯干</td><td><code>spine*</code> <code>chest*</code> <code>hip*</code> <code>pelvis*</code></td><td></td></tr><tr><td>6</td><td>腿部</td><td><code>thigh*</code> <code>calf*</code> <code>knee*</code> <code>foot*</code> <code>toe*</code></td><td></td></tr><tr><td>7</td><td>头颈</td><td><code>neck*</code> <code>head*</code> <code>jaw*</code></td><td></td></tr></tbody></table><p><strong>把每一组存成”快速选择集”</strong>，这样一句话就能选中整组：</p><ol><li>在场景里选中该组的所有骨骼</li><li><code>创建 &gt; 集 &gt; 快速选择集</code>，命名例如 <code>SS_上臂</code></li><li>之后在大纲视图底部的集面板里点一下，就选中了整组</li></ol><p>这是原生版的”图层面板”，非常值得建。</p><h3 id="3-4-一次完整的作业循环"><a href="#3-4-一次完整的作业循环" class="headerlink" title="3.4 一次完整的作业循环"></a>3.4 一次完整的作业循环</h3><p>以”上臂 + 肩膀”为例，<strong>每换一组就重复这套动作</strong>：</p><ol><li><strong>先解锁全部</strong> —— <code>蒙皮 &gt; 解锁权重</code>，确保没有残留的锁定状态（保险做法：全选所有关节再解锁）</li><li><strong>选中当前组</strong> —— 点快速选择集 <code>SS_上臂</code></li><li><strong>反选</strong> —— <code>选择 &gt; 反转选择</code>，此时选中的就是”除了上臂之外的所有骨骼”</li><li><strong>锁定</strong> —— <code>蒙皮 &gt; 锁定权重</code>（按关节粒度）</li><li><strong>开始刷</strong> —— 现在随便怎么刷，都只影响上臂这一组。肩膀塌了？胸口跳了？不可能，它们被锁死了</li><li><strong>局部柔化</strong> —— 需要平滑时走 3.5 节的原生遮罩流程</li><li><strong>切姿势验证</strong> —— 用 5.1 节的姿势库，抬臂 90°、前伸 90° 逐个看</li><li><strong>满意后解锁</strong> —— <code>蒙皮 &gt; 解锁权重</code>，切下一组</li></ol><blockquote><p><strong>顺序很重要</strong>：一定要从”手指”往”头颈”走。手指最独立，刷好了不会被后面改坏；头颈和躯干牵连最多，放最后。</p><p><strong>别忘了体力活可以脚本化</strong>：第 3.8 节的脚本能一键完成”选中当前组 + 锁定其余骨骼”，7 组循环下来能省不少时间。</p></blockquote><h3 id="3-5-原生”遮罩”：只平滑你选中的部分"><a href="#3-5-原生”遮罩”：只平滑你选中的部分" class="headerlink" title="3.5 原生”遮罩”：只平滑你选中的部分"></a>3.5 原生”遮罩”：只平滑你选中的部分</h3><p>插件图层的第二重价值是”只在我圈定的范围内操作”。原生 Maya 用**平滑蒙皮权重的”权重固定”**来实现：</p><ol><li>框选你要平滑的那片顶点（<code>Ctrl + 右键</code> 圈选，<strong>不需要动的区域就不要选</strong>）</li><li><code>蒙皮 &gt; 平滑蒙皮权重 &gt; 选项</code></li><li>参数建议：</li></ol><table><thead><tr><th>参数</th><th>建议值</th></tr></thead><tbody><tr><td>平滑迭代次数</td><td><code>2 ~ 3</code></td></tr><tr><td>扩展比例</td><td>保持默认</td></tr><tr><td><strong>权重固定</strong></td><td>选与”仅处理选定顶点”对应的那一项（不同版本可能写作 <code>未选定顶点</code> &#x2F; <code>Unselected Vertices</code>）</td></tr></tbody></table><ol start="4"><li>点 <code>应用</code>。</li></ol><p>效果是：<strong>只有你框选的顶点被平滑，其余顶点连数值都不动。</strong> 这是原生方案里最接近”图层遮罩”的操作，值得单独练熟。</p><blockquote><p>另外，多数版本的绘制蒙皮权重工具会<strong>优先只作用在已选中的组件上</strong>——先框选顶点再刷，画笔就只影响这些顶点。如果你的版本试了不生效，就用上面的平滑固定法，或者配合 3.2 节的按顶点锁定保护其他区域。</p></blockquote><h3 id="3-6-数值级精修：组件编辑器"><a href="#3-6-数值级精修：组件编辑器" class="headerlink" title="3.6 数值级精修：组件编辑器"></a>3.6 数值级精修：组件编辑器</h3><p>画笔刷完之后，总会有几个顶点”就是不对”。这时候别再刷了，直接用数值改：</p><ol><li>选中问题顶点（<code>Ctrl + 右键</code> 圈选）</li><li>打开 <code>窗口 &gt; 常规编辑器 &gt; 组件编辑器</code></li><li>切到 <strong><code>蒙皮</code> 标签页</strong>，勾上”显示所有影响”</li><li>这里会列出每根骨骼在这些顶点上的<strong>精确权重值</strong>，可以直接输入数字</li><li>改完点右上角的 <code>重新归一化</code> 自动配平</li></ol><p><strong>典型用法</strong>：</p><ul><li>某顶点权重是 <code>0.4999</code>，想改成 <code>0.5</code> → 直接输入</li><li>某顶点同时被 6 根骨头影响 → 把权重最小的两个清零，再归一化</li><li>一整片顶点的某根骨骼权重都偏高 → 输入一个正确值，整列粘贴</li></ul><blockquote><p>组件编辑器的 <code>复制</code> &#x2F; <code>粘贴</code> 按钮，是原生方案里批量改数值的唯一途径，用熟了效率很高。</p></blockquote><h3 id="3-7-存档与回滚：原生版版本管理"><a href="#3-7-存档与回滚：原生版版本管理" class="headerlink" title="3.7 存档与回滚：原生版版本管理"></a>3.7 存档与回滚：原生版版本管理</h3><ul><li><strong>存档</strong>：每完成一组 → <code>蒙皮 &gt; 导出蒙皮权重 &gt; 选项</code> → 选 <code>XML</code> → 命名例如 <code>char01_upperarm_v03.xml</code></li><li><strong>回滚</strong>：刷崩了 → <code>蒙皮 &gt; 导入蒙皮权重</code> → 选对应的 XML</li><li><strong>注意</strong>：XML 是<strong>全量快照</strong>，不是差异图层，所以命名一定要带部位和版本号</li><li><strong>拓扑必须完全一致</strong>才能导入成功（同一版模型、同一套骨架）</li></ul><p>养成”每完成一组存一份”的习惯，比赛现场能救命。</p><h3 id="3-8-一键分组锁定脚本"><a href="#3-8-一键分组锁定脚本" class="headerlink" title="3.8 一键分组锁定脚本"></a>3.8 一键分组锁定脚本</h3><p>手动反选再锁定，做 7 遍也烦。用下面这段脚本，输入组名就自动锁好其余骨骼：</p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">蒙皮权重分组锁定小工具（纯原生，无插件）</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">作用：处理某一组骨骼时，把其余骨骼全部锁定，防止刷坏别处。</span></span><br><span class="line"><span class="string">用法：按自己的骨架命名改好下面的 GROUPS，在脚本编辑器里执行，按提示输入组名。</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">注意：本脚本使用 skinCluster 的 lockWeights 参数。</span></span><br><span class="line"><span class="string">      若你的 Maya 版本对该参数报错，脚本仍然会帮你选中正确的关节，</span></span><br><span class="line"><span class="string">      手动点一次「蒙皮 &gt; 锁定权重」即可。</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> maya.cmds <span class="keyword">as</span> cmds</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============ 分组定义：组名 -&gt; 关节名里出现的关键字 ============</span></span><br><span class="line">GROUPS = [</span><br><span class="line">    (<span class="string">&quot;1_手指&quot;</span>, [<span class="string">&quot;finger&quot;</span>, <span class="string">&quot;thumb&quot;</span>, <span class="string">&quot;index&quot;</span>, <span class="string">&quot;middle&quot;</span>, <span class="string">&quot;ring&quot;</span>, <span class="string">&quot;pinky&quot;</span>]),</span><br><span class="line">    (<span class="string">&quot;2_手部&quot;</span>, [<span class="string">&quot;hand&quot;</span>, <span class="string">&quot;wrist&quot;</span>]),</span><br><span class="line">    (<span class="string">&quot;3_前臂&quot;</span>, [<span class="string">&quot;forearm&quot;</span>, <span class="string">&quot;lowerarm&quot;</span>, <span class="string">&quot;elbow&quot;</span>]),</span><br><span class="line">    (<span class="string">&quot;4_上臂&quot;</span>, [<span class="string">&quot;upperarm&quot;</span>, <span class="string">&quot;shoulder&quot;</span>, <span class="string">&quot;clavicle&quot;</span>]),</span><br><span class="line">    (<span class="string">&quot;5_躯干&quot;</span>, [<span class="string">&quot;spine&quot;</span>, <span class="string">&quot;chest&quot;</span>, <span class="string">&quot;hip&quot;</span>, <span class="string">&quot;pelvis&quot;</span>, <span class="string">&quot;torso&quot;</span>]),</span><br><span class="line">    (<span class="string">&quot;6_腿部&quot;</span>, [<span class="string">&quot;thigh&quot;</span>, <span class="string">&quot;calf&quot;</span>, <span class="string">&quot;knee&quot;</span>, <span class="string">&quot;foot&quot;</span>, <span class="string">&quot;toe&quot;</span>]),</span><br><span class="line">    (<span class="string">&quot;7_头颈&quot;</span>, [<span class="string">&quot;neck&quot;</span>, <span class="string">&quot;head&quot;</span>, <span class="string">&quot;jaw&quot;</span>]),</span><br><span class="line">]</span><br><span class="line"><span class="comment"># ==============================================================</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">skin_joints</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;收集场景里所有参与蒙皮的关节&quot;&quot;&quot;</span></span><br><span class="line">    result = []</span><br><span class="line">    <span class="keyword">for</span> mesh <span class="keyword">in</span> cmds.ls(<span class="built_in">type</span>=<span class="string">&quot;mesh&quot;</span>, noIntermediate=<span class="literal">True</span>, long=<span class="literal">True</span>) <span class="keyword">or</span> []:</span><br><span class="line">        <span class="keyword">for</span> skin <span class="keyword">in</span> cmds.listConnections(mesh, <span class="built_in">type</span>=<span class="string">&quot;skinCluster&quot;</span>) <span class="keyword">or</span> []:</span><br><span class="line">            <span class="keyword">for</span> j <span class="keyword">in</span> cmds.skinCluster(skin, query=<span class="literal">True</span>, influence=<span class="literal">True</span>) <span class="keyword">or</span> []:</span><br><span class="line">                <span class="keyword">if</span> j <span class="keyword">not</span> <span class="keyword">in</span> result:</span><br><span class="line">                    result.append(j)</span><br><span class="line">    <span class="keyword">return</span> result</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">match</span>(<span class="params">joints, keywords</span>):</span><br><span class="line">    <span class="keyword">return</span> [j <span class="keyword">for</span> j <span class="keyword">in</span> joints</span><br><span class="line">            <span class="keyword">if</span> <span class="built_in">any</span>(k.lower() <span class="keyword">in</span> j.lower() <span class="keyword">for</span> k <span class="keyword">in</span> keywords)]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">set_lock</span>(<span class="params">joints, lock</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;逐根设置锁定状态，返回成功数量&quot;&quot;&quot;</span></span><br><span class="line">    ok = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> j <span class="keyword">in</span> joints:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            cmds.skinCluster(j, edit=<span class="literal">True</span>, lockWeights=lock)</span><br><span class="line">            ok += <span class="number">1</span></span><br><span class="line">        <span class="keyword">except</span> Exception:</span><br><span class="line">            <span class="keyword">pass</span></span><br><span class="line">    <span class="keyword">return</span> ok</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    joints = skin_joints()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> joints:</span><br><span class="line">        cmds.warning(<span class="string">&quot;场景里没有找到蒙皮关节。&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;---- 可用分组 ----&quot;</span>)</span><br><span class="line">    <span class="keyword">for</span> name, keys <span class="keyword">in</span> GROUPS:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;  %-8s %d 根&quot;</span> % (name, <span class="built_in">len</span>(<span class="keyword">match</span>(joints, keys))))</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;  all      解锁全部&quot;</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;------------------&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> cmds.promptDialog(</span><br><span class="line">        title=<span class="string">&quot;分组锁定&quot;</span>,</span><br><span class="line">        message=<span class="string">&quot;输入组名（如 4_上臂），或输入 all 解锁全部：&quot;</span>,</span><br><span class="line">        button=[<span class="string">&quot;执行&quot;</span>, <span class="string">&quot;取消&quot;</span>],</span><br><span class="line">        defaultButton=<span class="string">&quot;执行&quot;</span>,</span><br><span class="line">        cancelButton=<span class="string">&quot;取消&quot;</span>,</span><br><span class="line">        dismissString=<span class="string">&quot;取消&quot;</span>,</span><br><span class="line">    ) != <span class="string">&quot;执行&quot;</span>:</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    key = cmds.promptDialog(query=<span class="literal">True</span>, text=<span class="literal">True</span>).strip()</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> key.lower() == <span class="string">&quot;all&quot;</span>:</span><br><span class="line">        n = set_lock(joints, <span class="literal">False</span>)</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;已解锁 %d 根关节&quot;</span> % n)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    target = <span class="literal">None</span></span><br><span class="line">    <span class="keyword">for</span> name, keys <span class="keyword">in</span> GROUPS:</span><br><span class="line">        <span class="keyword">if</span> key == name <span class="keyword">or</span> key <span class="keyword">in</span> name:</span><br><span class="line">            target = <span class="keyword">match</span>(joints, keys)</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> target:</span><br><span class="line">        cmds.warning(<span class="string">&quot;没有匹配到分组：%s&quot;</span> % key)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    others = [j <span class="keyword">for</span> j <span class="keyword">in</span> joints <span class="keyword">if</span> j <span class="keyword">not</span> <span class="keyword">in</span> target]</span><br><span class="line">    n = set_lock(others, <span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    cmds.select(target, replace=<span class="literal">True</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;已锁定其余 %d 根骨骼；当前可操作：%s&quot;</span> % (n, <span class="string">&quot;, &quot;</span>.join(target)))</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;如果锁定没有生效，请手动执行：蒙皮 &gt; 锁定权重&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><h3 id="3-9-这套方案和插件的差距到底有多大"><a href="#3-9-这套方案和插件的差距到底有多大" class="headerlink" title="3.9 这套方案和插件的差距到底有多大"></a>3.9 这套方案和插件的差距到底有多大</h3><table><thead><tr><th>插件能力</th><th>原生替代</th><th>差距有多大</th></tr></thead><tbody><tr><td>图层叠加 &#x2F; 混合模式</td><td>按关节锁定 + 分组作业</td><td>只能”改 &#x2F; 不改”，没有相加相乘。实际影响很小</td></tr><tr><td>每层遮罩</td><td>平滑蒙皮权重的”权重固定” + 框选顶点后再刷</td><td>遮罩不能保存复用，每次要重选</td></tr><tr><td>图层版本管理</td><td>导出 &#x2F; 导入蒙皮权重 XML</td><td>只有全量快照，不能对比差异</td></tr><tr><td>批量镜像</td><td><code>蒙皮 &gt; 镜像蒙皮权重</code></td><td>基本等价</td></tr><tr><td>批量操作 &#x2F; 脚本化</td><td>3.8 节脚本 + 第 7 章脚本</td><td>自己写，投入换自由度</td></tr><tr><td>Delta Mush &#x2F; 平滑 &#x2F; 归一化</td><td>全是原生功能</td><td>无差别</td></tr></tbody></table><p><strong>结论：原生方案能拿回插件约八成的效率。</strong> 失去的主要是”混合模式”和”图层版本对比”这两项，而它们在比赛评分标准里几乎不会被考察。</p><hr><h2 id="第-4-章-批量复用：不要重刷第二遍"><a href="#第-4-章-批量复用：不要重刷第二遍" class="headerlink" title="第 4 章 批量复用：不要重刷第二遍"></a>第 4 章 批量复用：不要重刷第二遍</h2><h3 id="4-1-复制蒙皮权重（Copy-Skin-Weights）"><a href="#4-1-复制蒙皮权重（Copy-Skin-Weights）" class="headerlink" title="4.1 复制蒙皮权重（Copy Skin Weights）"></a>4.1 复制蒙皮权重（Copy Skin Weights）</h3><p>用于：<strong>同一个角色的不同部位</strong>、<strong>对称部位</strong>、<strong>拓扑相近的两个网格</strong>。</p><p><strong>操作步骤：</strong></p><ol><li>先选中<strong>源对象</strong>（已经刷好权重的），按住 <code>Shift</code> 再选<strong>目标对象</strong>。</li><li>菜单：<code>蒙皮 &gt; 复制蒙皮权重 &gt; 选项</code></li><li>参数建议：</li></ol><table><thead><tr><th>参数</th><th>建议值</th><th>说明</th></tr></thead><tbody><tr><td><strong>曲面关联</strong><br/>Surface Association</td><td><code>最近点</code> Closest Point</td><td>拓扑一致时用；拓扑差异大改 <code>光线投射</code></td></tr><tr><td><strong>影响关联</strong><br/>Influence Association</td><td><code>名称</code> Name &#x2F; <code>一对一</code> One to One</td><td>靠关节名匹配，所以命名必须规范</td></tr><tr><td><strong>镜像行为</strong></td><td><code>无</code></td><td>除非你要跨左右复制</td></tr><tr><td><strong>归一化</strong></td><td>勾选</td><td>保证复制过去权重和仍为 1</td></tr><tr><td><strong>平滑</strong></td><td>视情况</td><td>两个网格拓扑不一致时勾上</td></tr></tbody></table><ol start="4"><li>点 <code>应用</code>。</li></ol><blockquote><p><strong>常见坑</strong>：复制过去的权重是”按空间位置找最近点”映射的。如果两个网格的形状差异很大（比如给胖子模型复制瘦子的权重），结果会歪。这种情况不如重新绑定。</p></blockquote><h3 id="4-2-镜像蒙皮权重（Mirror-Skin-Weights）"><a href="#4-2-镜像蒙皮权重（Mirror-Skin-Weights）" class="headerlink" title="4.2 镜像蒙皮权重（Mirror Skin Weights）"></a>4.2 镜像蒙皮权重（Mirror Skin Weights）</h3><p>用于：<strong>左右对称的四肢、手脚</strong>。这是最容易省下 50% 工作量的操作。</p><p><strong>操作步骤：</strong></p><ol><li>选中已经刷好左侧的网格。</li><li>菜单：<code>蒙皮 &gt; 镜像蒙皮权重 &gt; 选项</code></li><li>参数：</li></ol><table><thead><tr><th>参数</th><th>建议值</th></tr></thead><tbody><tr><td><strong>镜像方向（Mirror Across）</strong></td><td>一般选 <code>YZ</code> 平面（取决于你的角色朝向）</td></tr><tr><td><strong>镜像空间（Mirror Space）</strong></td><td><code>世界</code> World 或 <code>对象</code> Object，取决于骨架位置</td></tr><tr><td><strong>镜像侧（Direction）</strong></td><td>从 <code>正 → 负</code> 或 <code>负 → 正</code>，看你刷好的是哪边</td></tr></tbody></table><ol start="4"><li>点 <code>应用</code>。</li></ol><p><strong>前提条件（很重要）：</strong></p><ul><li>关节必须有正确的 <code>_L</code> &#x2F; <code>_R</code> 后缀，或者有正确的<strong>关节标签</strong>。</li><li>模型本身要真正左右对称。</li><li><strong>先刷好左边，再镜像到右边</strong>，不要两边都刷一半然后镜像。</li></ul><h3 id="4-3-把权重传递到其他网格（衣服-配件-替换件）"><a href="#4-3-把权重传递到其他网格（衣服-配件-替换件）" class="headerlink" title="4.3 把权重传递到其他网格（衣服 &#x2F; 配件 &#x2F; 替换件）"></a>4.3 把权重传递到其他网格（衣服 &#x2F; 配件 &#x2F; 替换件）</h3><p>一个角色往往有：身体、内衣、外衣、护甲、头发、武器挂件……<strong>所有这些都绑在同一套骨架上，但只有身体需要你手工刷。</strong></p><p><strong>做法：把身体当源，其他网格当目标，用 4.1 的”复制蒙皮权重”。</strong></p><p>要点：</p><ol><li>先把衣服等网格用<strong>同一套骨架</strong>普通绑定（算法打底即可，不用管质量）。</li><li>选身体（源）→ 选衣服（目标）→ <code>蒙皮 &gt; 复制蒙皮权重</code>。</li><li><strong>曲面关联</strong> 用 <code>最近点</code>，<strong>影响关联</strong> 用 <code>名称</code>。</li><li>对厚外套、裙摆这类离身体较远的部位，复制完再局部修一下。</li></ol><blockquote><p>这是实际项目里最大的时间黑洞。一套资产如果有 8 件衣服，不传递的话你要刷 9 遍。</p></blockquote><h3 id="4-4-导出-导入蒙皮权重（存档与回滚）"><a href="#4-4-导出-导入蒙皮权重（存档与回滚）" class="headerlink" title="4.4 导出 &#x2F; 导入蒙皮权重（存档与回滚）"></a>4.4 导出 &#x2F; 导入蒙皮权重（存档与回滚）</h3><ul><li><strong>导出</strong>：<code>蒙皮 &gt; 导出蒙皮权重 &gt; 选项</code>。可选 <code>XML</code> 或 <code>权重贴图</code>。<ul><li><code>XML</code> 精度高、文件小、<strong>要求拓扑完全一致</strong>，适合存档。</li><li><code>权重贴图</code> 存成图片，可跨拓扑，但精度受分辨率影响。</li></ul></li><li><strong>导入</strong>：<code>蒙皮 &gt; 导入蒙皮权重</code>，选同名关节的目标骨架。</li><li><strong>用途</strong>：<ul><li>大改动前的存档</li><li>版本之间对比回滚</li><li>把权重从 A 版骨架搬到 B 版骨架（前提是关节名一致）</li></ul></li></ul><hr><h2 id="第-5-章-极限姿势精修"><a href="#第-5-章-极限姿势精修" class="headerlink" title="第 5 章 极限姿势精修"></a>第 5 章 极限姿势精修</h2><h3 id="5-1-先建测试姿势库（别对着-T-Pose-刷权重）"><a href="#5-1-先建测试姿势库（别对着-T-Pose-刷权重）" class="headerlink" title="5.1 先建测试姿势库（别对着 T-Pose 刷权重）"></a>5.1 先建测试姿势库（别对着 T-Pose 刷权重）</h3><p><strong>这是新手最致命的错误</strong>：T-Pose 下看着完美的权重，一动起来全是糖纸扭曲。</p><p><strong>用时间轴搭一个姿势库（纯原生做法）：</strong></p><ol><li>把时间轴范围设到 200 帧以上（<code>窗口 &gt; 设置/首选项 &gt; 首选项 &gt; 时间滑块</code>，或直接在时间轴上拖）。</li><li>每隔 10 帧放一个姿势：第 10 帧摆”抬臂 90°”→ 按 <code>S</code> 打关键帧；第 20 帧摆”前伸 90°”→ <code>S</code>；依次类推。</li><li><strong>把关键帧切线设成”台阶”，避免姿势之间出现插值过渡</strong>：全选关键帧 → <code>窗口 &gt; 动画编辑器 &gt; 曲线图编辑器</code> → <code>切线 &gt; 台阶</code>。</li><li>建议至少存这几个：</li></ol><table><thead><tr><th>部位</th><th>测试姿势</th></tr></thead><tbody><tr><td>手臂</td><td>上举 90°、前伸 90°、后摆 60°、肘弯 120°</td></tr><tr><td>手腕</td><td>上下各 60°、左右各 45°、扭转 90°</td></tr><tr><td>腿</td><td>抬腿 90°、屈膝 120°、外展 45°</td></tr><tr><td>躯干</td><td>前弯 45°、侧弯 30°、扭转 60°</td></tr><tr><td>头颈</td><td>低头 45°、仰头 30°、转头 75°、侧倾 45°</td></tr><tr><td>手指</td><td>每根手指逐个屈伸、握拳</td></tr></tbody></table><ol start="5"><li>刷权重时，<strong>直接拖时间滑块切换姿势</strong>，一边切一边刷。给”上一帧 &#x2F; 下一帧”设个顺手的快捷键（<code>窗口 &gt; 设置/首选项 &gt; 快捷键编辑器</code>），点一下就能换姿势。</li></ol><blockquote><p>为什么不用姿势库插件？因为比赛环境装不了。而时间轴姿势库的体验其实差不了多少——你本来就是在连续切姿势看变形，一键换帧比打开面板翻姿势还快。</p></blockquote><h3 id="5-2-分区作业顺序"><a href="#5-2-分区作业顺序" class="headerlink" title="5.2 分区作业顺序"></a>5.2 分区作业顺序</h3><p><strong>不要从躯干开始。</strong> 推荐这个顺序（从”影响范围小、确定性高”到”影响范围大”）：</p><ol><li><strong>手指</strong> —— 最独立，刷好了不会被后面改坏</li><li><strong>手掌 &#x2F; 手腕</strong></li><li><strong>前臂 &#x2F; 手肘</strong></li><li><strong>上臂 &#x2F; 肩膀</strong>（难点）</li><li><strong>腿 &#x2F; 膝 &#x2F; 脚</strong></li><li><strong>胯 &#x2F; 髋</strong>（难点）</li><li><strong>脊柱 &#x2F; 胸腔 &#x2F; 腹部</strong></li><li><strong>脖子 &#x2F; 头 &#x2F; 下颌</strong></li></ol><p>每完成一个部位，用 4.2 节镜像到另一侧（对称部位）。</p><h3 id="5-3-画笔参数怎么设"><a href="#5-3-画笔参数怎么设" class="headerlink" title="5.3 画笔参数怎么设"></a>5.3 画笔参数怎么设</h3><p><code>蒙皮 &gt; 绘制蒙皮权重工具 &gt; 工具设置</code>：</p><table><thead><tr><th>参数</th><th>建议</th><th>说明</th></tr></thead><tbody><tr><td><strong>画笔模式</strong></td><td>先用 <code>替换</code>，接缝处用 <code>平滑</code></td><td><code>相加</code> 用在从零加权重时，<code>缩放</code> 用在整体加减强度</td></tr><tr><td><strong>值（Value）</strong></td><td><code>0.9 ~ 1.0</code></td><td>只在”相加”模式下有意义；不用调太小，靠不透明度控制</td></tr><tr><td><strong>不透明度</strong></td><td><code>0.2 ~ 0.4</code></td><td>宁小勿大。透明度大了刷出来的边是硬的</td></tr><tr><td><strong>笔刷半径</strong></td><td>用 <code>B + 拖动</code> 实时调</td><td>越大越平滑，越小越精确</td></tr><tr><td><strong>轮廓（Profile）</strong></td><td>默认</td><td>软笔刷，别用硬边</td></tr><tr><td><strong>影响</strong> 列表</td><td>只勾选当前要调的 2~4 根骨骼</td><td><strong>这是新手最常忽略的</strong>。同时只调少几根，结果才可控</td></tr><tr><td><strong>切换显示影响</strong></td><td>打开</td><td>让当前骨骼的权重以颜色显示在模型上</td></tr></tbody></table><blockquote><p><strong>色卡记忆法</strong>：Maya 权重显示中，<strong>白色 &#x3D; 权重 1（完全受该骨骼控制），黑色 &#x3D; 权重 0（完全不受控制）</strong>，红色&#x2F;蓝色是过渡区。刷的时候你追求的是<strong>平滑的灰阶过渡</strong>，任何突变的白&#x2F;黑边界都会导致折断。</p></blockquote><h3 id="5-4-组件编辑器精修（数值级微调）"><a href="#5-4-组件编辑器精修（数值级微调）" class="headerlink" title="5.4 组件编辑器精修（数值级微调）"></a>5.4 组件编辑器精修（数值级微调）</h3><p>画笔刷完之后，总会有几个顶点”就是不对”。这时候别再刷了，直接改数值——具体操作见 <a href="#36-%E6%95%B0%E5%80%BC%E7%BA%A7%E7%B2%BE%E4%BF%AE%E7%BB%84%E4%BB%B6%E7%BC%96%E8%BE%91%E5%99%A8">3.6 节</a>。</p><p><strong>在精修阶段特别有用的两个用法：</strong></p><ul><li><strong>成片拉平</strong>：某根骨骼在一片区域上的权重忽高忽低 → 在组件编辑器里框选整片，输入一个统一值，再单独柔化边缘</li><li><strong>清掉多余影响</strong>：某顶点同时被 6 根骨骼影响（会拖慢引擎、也容易出现抖动）→ 把权重最小的两根清零，再点 <code>重新归一化</code></li></ul><blockquote><p>组件编辑器是原生方案里批量改数值的唯一途径，值得在练手模型上专门熟悉一遍。</p></blockquote><h3 id="5-5-各部位高频问题对照表"><a href="#5-5-各部位高频问题对照表" class="headerlink" title="5.5 各部位高频问题对照表"></a>5.5 各部位高频问题对照表</h3><table><thead><tr><th>部位</th><th>现象</th><th>原因</th><th>解法</th></tr></thead><tbody><tr><td>上臂 &#x2F; 前臂</td><td><strong>糖纸扭曲</strong>（扭转时中间变细成麻花）</td><td>只有一根骨骼控制整个圆柱段</td><td>加 twist 扭转骨，把扭转均匀分摊；或让上臂&#x2F;前臂权重沿长度线性过渡</td></tr><tr><td>手肘</td><td>内侧夹面、外侧鼓包</td><td>权重过渡太陡 &#x2F; 边环不够</td><td>平滑过渡带拉宽；补 1~2 圈边环；用修正形态兜</td></tr><tr><td>肩膀</td><td>抬臂时腋下穿模</td><td>肩胛&#x2F;锁骨骨骼权重不足</td><td>加权重给 <code>clavicle</code> 和 <code>shoulder</code>；腋下用修正形态</td></tr><tr><td>肩膀</td><td>抬臂时肩部体积塌陷</td><td>上臂权重过早覆盖了肩膀</td><td>把 <code>upperarm</code> 的权重起点往手臂方向推</td></tr><tr><td>胯 &#x2F; 大腿</td><td>抬腿时裆部拉伸</td><td>大腿权重越过了中线</td><td>把 <code>thigh</code> 权重严格限制在同侧；中线交给 <code>hip</code>&#x2F;<code>pelvis</code></td></tr><tr><td>膝盖</td><td>弯曲时膝盖变成尖角</td><td>权重过渡太陡</td><td>拉宽膝部过渡带，让 <code>thigh</code> 和 <code>calf</code> 在膝关节两侧各延伸一段</td></tr><tr><td>手指</td><td>弯曲时指节鼓成球</td><td>指根权重给太多</td><td>指节处减小权重、增加下一节指骨的权重</td></tr><tr><td>脖子</td><td>转头时脖子下半段跟着拧</td><td>脖子骨骼权重过高延伸到了胸腔</td><td>把 <code>neck</code> 权重上限压在颈椎范围内</td></tr><tr><td>下颌</td><td>张嘴时下巴变形</td><td>下颌骨权重分布不均</td><td>只让 <code>jaw</code> 控制下巴和嘴唇下部，别越界到脸颊</td></tr><tr><td>全模型</td><td>权重显示正常但一动就破</td><td>归一化没开</td><td>检查 skinCluster 的归一化权重设置</td></tr></tbody></table><hr><h2 id="第-6-章-后处理与导出"><a href="#第-6-章-后处理与导出" class="headerlink" title="第 6 章 后处理与导出"></a>第 6 章 后处理与导出</h2><h3 id="6-1-Delta-Mush（必用）"><a href="#6-1-Delta-Mush（必用）" class="headerlink" title="6.1 Delta Mush（必用）"></a>6.1 Delta Mush（必用）</h3><p><strong>这是”省力神器”。</strong> 它会在蒙皮变形之后再跑一次平滑，把糖纸扭曲、尖角、边缘锯齿一类的瑕疵整个抹掉，等于把”为了平滑而疯狂补权重”这一步删除了。</p><p><strong>操作步骤：</strong></p><ol><li>选中要处理的蒙皮网格（skinCluster 已经在上面了）。</li><li>菜单：<code>变形 &gt; Delta Mush</code>。</li><li>在属性编辑器里调参数：</li></ol><table><thead><tr><th>参数</th><th>起始建议</th><th>说明</th></tr></thead><tbody><tr><td><strong>平滑迭代次数</strong><br/>Smoothing Iterations</td><td><code>5 ~ 15</code></td><td>越大越平滑，也越损失细节。从 5 开始往上加</td></tr><tr><td><strong>平滑步长</strong><br/>Smoothing Step</td><td><code>0.5</code></td><td>每次迭代移动多少，一般不动</td></tr><tr><td><strong>权重</strong><br/>Weight</td><td><code>1.0</code></td><td>混合原始变形和 Delta Mush 结果</td></tr><tr><td><strong>固定边界顶点</strong></td><td>视情况</td><td>有开口的面片（如裙子）勾上，防止边缘被拉进来</td></tr></tbody></table><p><strong>代价与取舍</strong>：Delta Mush 会轻微损失体积感（关节处的”肌肉鼓起”会变平）。所以：</p><ul><li><strong>日常姿势</strong>：权重刷得差不多就行，Delta Mush 迭代次数开大，让后处理帮你平滑。</li><li><strong>需要保持体积的部位</strong>（胸、臀、二头肌）：Delta Mush 权重调低，或者配合修正形态。</li></ul><h3 id="6-2-修正形态（Corrective-Shape）"><a href="#6-2-修正形态（Corrective-Shape）" class="headerlink" title="6.2 修正形态（Corrective Shape）"></a>6.2 修正形态（Corrective Shape）</h3><p>用于：<strong>Delta Mush 也救不了的局部问题</strong>。典型场景是肩膀、腋下、髋部。</p><p><strong>思路</strong>：把模型转到那个”破掉”的姿势，用建模手段（雕刻、晶格、位移）手动把模型修回正确形状，然后把这步操作记录下来，让它只在那个姿势下生效。</p><p><strong>两种做法：</strong></p><table><thead><tr><th>做法</th><th>怎么操作</th><th>优点</th></tr></thead><tbody><tr><td><strong>混合变形 + 姿势驱动</strong></td><td>1. 复制一个模型，转到问题姿势，修好形状<br/>2. 用 <code>变形 &gt; 混合变形</code> 建立目标<br/>3. 用 <code>动画 &gt; 创建动画层</code> 或 <code>设置受驱动关键帧</code>，让骨架旋转角度驱动混合变形的权重</td><td>直观，容易控制</td></tr><tr><td><strong>姿势空间变形</strong></td><td>用 <code>变形 &gt; 创建姿势空间变形器</code>，让骨架在指定姿势时自动叠加修正形态</td><td>更适合量产、可以脚本化</td></tr></tbody></table><p><strong>判断标准</strong>：如果某个部位你已经刷了 3 遍还是不对，<strong>停下来用修正形态</strong>。继续刷是沉没成本。</p><h3 id="6-3-辅助扭转骨"><a href="#6-3-辅助扭转骨" class="headerlink" title="6.3 辅助扭转骨"></a>6.3 辅助扭转骨</h3><p>前臂和小臂在旋转 90°~180° 时，单靠权重必然糖纸扭曲。正确解法是加<strong>扭转骨</strong>：</p><ol><li>在前臂上按一定间距复制 2~3 根关节，命名 <code>forearm_twist_01</code> 等。</li><li>用 <code>设置受驱动关键帧</code> 或直接连接属性，让扭转骨跟随手腕的旋转按比例旋转（比如每根转 1&#x2F;3）。</li><li>把前臂的权重按长度均匀分配给这些扭转骨。</li></ol><blockquote><p>同样适用于大腿、上臂。这是”治本”的手段，比加多少平滑都有效。</p></blockquote><h3 id="6-4-导出前最终检查清单"><a href="#6-4-导出前最终检查清单" class="headerlink" title="6.4 导出前最终检查清单"></a>6.4 导出前最终检查清单</h3><p><strong>逐项过一遍，全部打勾再导出：</strong></p><ul><li><input disabled="" type="checkbox"> <strong>限制影响数为 4</strong> —— 在皮肤簇属性里把 <code>最大影响数</code> 改成 4，勾选 <code>遵守最大影响数</code></li><li><input disabled="" type="checkbox"> <strong>移除微小权重</strong> —— <code>蒙皮 &gt; 移除小权重</code>，阈值设 <code>0.001</code>（UE 默认是 0.01，可以按引擎要求调）</li><li><input disabled="" type="checkbox"> <strong>归一化权重</strong> —— <code>蒙皮 &gt; 绘制蒙皮权重工具</code> → 点一次 <code>Flood</code> 并在归一化模式下重新归一；或直接把 skinCluster 的归一化权重设成”后处理”再切回”交互式”</li><li><input disabled="" type="checkbox"> <strong>验证左右对称</strong> —— 把姿态设成左右对称的极限姿势，看两边表现是否一致</li><li><input disabled="" type="checkbox"> <strong>检查所有极限姿势</strong> —— 用 5.1 节的姿势库逐个过一遍，没有明显穿模&#x2F;塌陷</li><li><input disabled="" type="checkbox"> <strong>检查所有服装&#x2F;配件</strong> —— 别只检查身体，衣服也要过姿势</li><li><input disabled="" type="checkbox"> <strong>清理无用节点</strong> —— <code>编辑 &gt; 按类型删除 &gt; 未使用节点</code></li><li><input disabled="" type="checkbox"> <strong>骨架和模型命名规范</strong> —— 导出到引擎后改名的成本很高</li><li><input disabled="" type="checkbox"> <strong>导出测试</strong> —— 先导一份 FBX 到引擎里，把动画跑一遍看有没有异常</li></ul><blockquote><p><strong>关于 FBX 导出的一个坑</strong>：如果 Maya 里皮肤簇的影响数是 5，即使导出前在 FBX 选项里找不到相关设置，权重也会原样带过去，UE 会在导入时按自己的规则截断，导致结果和 Maya 里看着不一样。<strong>所以必须在 Maya 里先限制成 4。</strong></p></blockquote><hr><h2 id="第-7-章-一键收尾脚本"><a href="#第-7-章-一键收尾脚本" class="headerlink" title="第 7 章 一键收尾脚本"></a>第 7 章 一键收尾脚本</h2><p>把下面这段存成 <code>.py</code> 文件，在 Maya 的脚本编辑器里执行。<strong>注意：先看代码里的参数区，按你的项目改。</strong></p><figure class="highlight python"><table><tr><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">Maya 蒙皮收尾一键脚本</span></span><br><span class="line"><span class="string">功能：限制影响数 -&gt; 移除未使用影响 -&gt; 归一化 -&gt; 给所有蒙皮网格加 Delta Mush</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">用法：</span></span><br><span class="line"><span class="string">  1. 打开 Maya 脚本编辑器，切到 Python 标签</span></span><br><span class="line"><span class="string">  2. 粘贴本段代码，或点&quot;打开脚本&quot;载入本文件</span></span><br><span class="line"><span class="string">  3. 选中要处理的网格（不选则处理场景里所有蒙皮网格）</span></span><br><span class="line"><span class="string">  4. 执行</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">建议：执行前先做一次 蒙皮 &gt; 导出蒙皮权重 存档，方便回滚。</span></span><br><span class="line"><span class="string">&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> maya.cmds <span class="keyword">as</span> cmds</span><br><span class="line"></span><br><span class="line"><span class="comment"># ============ 参数区（按项目改这里） ============</span></span><br><span class="line">MAX_INFLUENCES = <span class="number">4</span>        <span class="comment"># 最大影响骨骼数：UE / Unity 用 4</span></span><br><span class="line">NORMALIZE = <span class="number">1</span>             <span class="comment"># 1 = 交互式归一化，2 = 后处理，0 = 无</span></span><br><span class="line">ADD_DELTA_MUSH = <span class="literal">True</span>     <span class="comment"># 是否自动添加 Delta Mush</span></span><br><span class="line">DM_ITERATIONS = <span class="number">8</span>         <span class="comment"># Delta Mush 平滑迭代次数</span></span><br><span class="line">DM_STEP = <span class="number">0.5</span>             <span class="comment"># Delta Mush 平滑步长</span></span><br><span class="line">DM_WEIGHT = <span class="number">1.0</span>           <span class="comment"># Delta Mush 混合权重</span></span><br><span class="line"><span class="comment"># ================================================</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">log</span>(<span class="params">msg</span>):</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[蒙皮收尾] %s&quot;</span> % msg)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pick_meshes</span>():</span><br><span class="line">    <span class="string">&quot;&quot;&quot;返回要处理的蒙皮网格列表&quot;&quot;&quot;</span></span><br><span class="line">    sel = cmds.ls(selection=<span class="literal">True</span>, long=<span class="literal">True</span>) <span class="keyword">or</span> []</span><br><span class="line">    <span class="keyword">if</span> sel:</span><br><span class="line">        shapes = cmds.listRelatives(sel, shapes=<span class="literal">True</span>, noIntermediate=<span class="literal">True</span>, <span class="built_in">type</span>=<span class="string">&quot;mesh&quot;</span>) <span class="keyword">or</span> []</span><br><span class="line">        <span class="comment"># 用户可能选的是 shape 或 transform，这里统一回推到 transform</span></span><br><span class="line">        meshes = []</span><br><span class="line">        <span class="keyword">for</span> node <span class="keyword">in</span> shapes:</span><br><span class="line">            parent = cmds.listRelatives(node, parent=<span class="literal">True</span>, fullPath=<span class="literal">True</span>)</span><br><span class="line">            meshes.append(parent[<span class="number">0</span>] <span class="keyword">if</span> parent <span class="keyword">else</span> node)</span><br><span class="line">        <span class="keyword">if</span> meshes:</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">sorted</span>(<span class="built_in">set</span>(meshes))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 没选任何东西 -&gt; 找场景里所有带 skinCluster 的网格</span></span><br><span class="line">    all_shapes = cmds.ls(<span class="built_in">type</span>=<span class="string">&quot;mesh&quot;</span>, noIntermediate=<span class="literal">True</span>, long=<span class="literal">True</span>) <span class="keyword">or</span> []</span><br><span class="line">    meshes = []</span><br><span class="line">    <span class="keyword">for</span> shape <span class="keyword">in</span> all_shapes:</span><br><span class="line">        <span class="keyword">if</span> cmds.listConnections(shape, <span class="built_in">type</span>=<span class="string">&quot;skinCluster&quot;</span>):</span><br><span class="line">            parent = cmds.listRelatives(shape, parent=<span class="literal">True</span>, fullPath=<span class="literal">True</span>)</span><br><span class="line">            meshes.append(parent[<span class="number">0</span>] <span class="keyword">if</span> parent <span class="keyword">else</span> shape)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">sorted</span>(<span class="built_in">set</span>(meshes))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_skin_cluster</span>(<span class="params">mesh</span>):</span><br><span class="line">    clusters = cmds.listConnections(mesh, <span class="built_in">type</span>=<span class="string">&quot;skinCluster&quot;</span>) <span class="keyword">or</span> []</span><br><span class="line">    <span class="comment"># 只保留真正挂在这个网格上的簇</span></span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> clusters:</span><br><span class="line">        geo = cmds.skinCluster(c, query=<span class="literal">True</span>, geometry=<span class="literal">True</span>) <span class="keyword">or</span> []</span><br><span class="line">        <span class="keyword">if</span> mesh <span class="keyword">in</span> geo <span class="keyword">or</span> mesh.split(<span class="string">&quot;|&quot;</span>)[-<span class="number">1</span>] <span class="keyword">in</span> geo:</span><br><span class="line">            <span class="keyword">return</span> c</span><br><span class="line">    <span class="keyword">return</span> clusters[<span class="number">0</span>] <span class="keyword">if</span> clusters <span class="keyword">else</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">process_skin</span>(<span class="params">mesh</span>):</span><br><span class="line">    skin = get_skin_cluster(mesh)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> skin:</span><br><span class="line">        log(<span class="string">&quot;跳过 %s：没有找到蒙皮簇&quot;</span> % mesh)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">    short = mesh.split(<span class="string">&quot;|&quot;</span>)[-<span class="number">1</span>]</span><br><span class="line">    n_inf = <span class="built_in">len</span>(cmds.skinCluster(skin, query=<span class="literal">True</span>, influence=<span class="literal">True</span>) <span class="keyword">or</span> [])</span><br><span class="line">    log(<span class="string">&quot;处理 %s（皮肤簇 %s，绑定 %d 根骨骼）&quot;</span> % (short, skin, n_inf))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 1) 限制影响数 + 移除未使用影响</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        cmds.skinCluster(</span><br><span class="line">            skin,</span><br><span class="line">            edit=<span class="literal">True</span>,</span><br><span class="line">            maximumInfluences=MAX_INFLUENCES,</span><br><span class="line">            obeyMaxInfluences=<span class="literal">True</span>,</span><br><span class="line">            removeUnusedInfluences=<span class="literal">True</span>,</span><br><span class="line">        )</span><br><span class="line">        log(<span class="string">&quot;  · 影响数已限制为 %d&quot;</span> % MAX_INFLUENCES)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">        log(<span class="string">&quot;  ! 限制影响数失败：%s&quot;</span> % err)</span><br><span class="line">        log(<span class="string">&quot;    请手动执行：蒙皮 &gt; 限制总数（选 %d）&quot;</span> % MAX_INFLUENCES)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 2) 归一化</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        cmds.skinCluster(skin, edit=<span class="literal">True</span>, normalizeWeights=NORMALIZE,</span><br><span class="line">                         forceNormalize=<span class="literal">True</span>)</span><br><span class="line">        log(<span class="string">&quot;  · 权重已归一化&quot;</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">        log(<span class="string">&quot;  ! 归一化失败：%s&quot;</span> % err)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 3) 可选的 Delta Mush</span></span><br><span class="line">    <span class="keyword">if</span> ADD_DELTA_MUSH:</span><br><span class="line">        existing = cmds.listConnections(mesh, <span class="built_in">type</span>=<span class="string">&quot;deltaMush&quot;</span>) <span class="keyword">or</span> []</span><br><span class="line">        <span class="keyword">if</span> existing:</span><br><span class="line">            log(<span class="string">&quot;  · 已存在 Delta Mush，跳过&quot;</span>)</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                node = cmds.deltaMush(</span><br><span class="line">                    mesh,</span><br><span class="line">                    smoothingIterations=DM_ITERATIONS,</span><br><span class="line">                    smoothingStep=DM_STEP,</span><br><span class="line">                    weight=DM_WEIGHT,</span><br><span class="line">                )</span><br><span class="line">                log(<span class="string">&quot;  · 已添加 Delta Mush：%s&quot;</span> % node[<span class="number">0</span>])</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> err:</span><br><span class="line">                log(<span class="string">&quot;  ! 添加 Delta Mush 失败：%s&quot;</span> % err)</span><br><span class="line">                log(<span class="string">&quot;    请手动执行：选择网格 &gt; 变形 &gt; Delta Mush&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    meshes = pick_meshes()</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> meshes:</span><br><span class="line">        log(<span class="string">&quot;没有找到可处理的蒙皮网格。请先绑定蒙皮，或手动选中网格。&quot;</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    log(<span class="string">&quot;共 %d 个网格待处理&quot;</span> % <span class="built_in">len</span>(meshes))</span><br><span class="line">    done = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> mesh <span class="keyword">in</span> meshes:</span><br><span class="line">        <span class="keyword">if</span> process_skin(mesh):</span><br><span class="line">            done += <span class="number">1</span></span><br><span class="line"></span><br><span class="line">    log(<span class="string">&quot;完成：成功处理 %d / %d 个网格&quot;</span> % (done, <span class="built_in">len</span>(meshes)))</span><br><span class="line">    log(<span class="string">&quot;下一步手动收尾建议：&quot;</span>)</span><br><span class="line">    log(<span class="string">&quot;  1) 蒙皮 &gt; 移除小权重（阈值 0.001）&quot;</span>)</span><br><span class="line">    log(<span class="string">&quot;  2) 用极限姿势逐个验证，再看是否需要修正形态&quot;</span>)</span><br><span class="line">    log(<span class="string">&quot;  3) 导出前导出一份蒙皮权重 XML 存档&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><blockquote><p><strong>脚本里没有做的两件事，需要你手动补上：</strong></p><ul><li><strong>镜像权重</strong>：<code>蒙皮 &gt; 镜像蒙皮权重</code>。镜像依赖关节命名&#x2F;标签，不同项目规则不一样，脚本硬编码容易出错，建议用 UI 操作。</li><li><strong>移除小权重</strong>：<code>蒙皮 &gt; 移除小权重</code>，阈值按引擎要求设（UE 常用 0.01，Maya 默认视图常用 0.001）。</li></ul></blockquote><hr><h2 id="第-8-章-故障排查速查表"><a href="#第-8-章-故障排查速查表" class="headerlink" title="第 8 章 故障排查速查表"></a>第 8 章 故障排查速查表</h2><table><thead><tr><th>现象</th><th>最可能的原因</th><th>第一步该做什么</th></tr></thead><tbody><tr><td>怎么刷都不顺，总觉得别扭</td><td>关节没落在网格体积中心</td><td>回到 2.1 节，重新对关节</td></tr><tr><td>关节处永远是一条硬折线</td><td>拓扑缺边环</td><td><code>编辑网格 &gt; 插入循环边</code>，至少 3 圈</td></tr><tr><td>热力图绑定直接报错</td><td>网格有开放边&#x2F;未焊接</td><td>换测地体素，或焊接顶点</td></tr><tr><td>刷权重时权重值跑到负数</td><td>归一化设成了”无”</td><td>改成”交互式”</td></tr><tr><td>一动就破面、出现尖锐突起</td><td>权重过渡区太窄</td><td>用 <code>平滑</code> 模式 Flood 几次，拉宽过渡</td></tr><tr><td>某一组骨骼怎么刷都没反应</td><td>忘了解锁，或切换分组时锁定状态残留</td><td><code>蒙皮 &gt; 解锁权重</code>，全选关节后解锁一次</td></tr><tr><td>想做局部平滑，结果整条腿都被抹平了</td><td>平滑的「权重固定」选项没设成”仅选定顶点”</td><td>回到 3.5 节，先框选顶点再平滑</td></tr><tr><td>一组刷完切下一组，发现上一组变了</td><td>切组时没有重新锁定</td><td>严格执行 3.4 节的 8 步循环，每次从”解锁全部”开始</td></tr><tr><td>组件编辑器里数值改了但模型没变</td><td>改了没做归一化，或该骨骼被锁定</td><td>点 <code>重新归一化</code>；检查是否有锁定残留</td></tr><tr><td>扭转时模型变麻花（糖纸）</td><td>缺少扭转骨</td><td>加 2~3 根 twist 骨</td></tr><tr><td>抬臂时腋下穿模</td><td>锁骨&#x2F;肩胛权重不足</td><td>加权重给 <code>clavicle</code>，配合修正形态</td></tr><tr><td>抬腿时裆部被拉长</td><td>大腿权重越过了中线</td><td>严格限制 <code>thigh</code> 在同侧</td></tr><tr><td>复制权重后目标网格变形怪</td><td>两网格形状差异过大</td><td>重新绑定，别指望复制</td></tr><tr><td>镜像权重没反应</td><td>关节没有 <code>_L</code>&#x2F;<code>_R</code> 命名或标签</td><td>补关节标签或改名后重新绑定</td></tr><tr><td>衣服跟着身体走但穿插严重</td><td>只做了复制没有局部修</td><td>复制后在腋下、胯部、肘部补刷</td></tr><tr><td>引擎里看着和 Maya 里不一样</td><td>影响数超过 4，被引擎截断</td><td>在 Maya 里先限制成 4 再导出</td></tr><tr><td>Delta Mush 后模型变”软趴趴”</td><td>平滑迭代次数过大</td><td>降到 3~5，或把权重参数调到 0.5 左右</td></tr><tr><td>导出 FBX 后权重全丢了</td><td>场景里存在多个骨架&#x2F;命名冲突</td><td>检查大纲视图，确保只有一个 skinCluster 和一个骨架</td></tr></tbody></table><hr><h2 id="第-9-章-提速路线怎么选"><a href="#第-9-章-提速路线怎么选" class="headerlink" title="第 9 章 提速路线怎么选"></a>第 9 章 提速路线怎么选</h2><table><thead><tr><th>路线</th><th>成本</th><th>提速幅度</th><th>适合谁</th></tr></thead><tbody><tr><td><strong>裸刷</strong>（只靠画笔逐根骨骼刷）</td><td>零</td><td>基准</td><td>谁都不适合——本教程存在的意义就是让你别这么干</td></tr><tr><td><strong>原生全套</strong><br/>（第 2 + 4 + 5 + 6 章：测地体素 + 镜像&#x2F;复制 + Delta Mush）</td><td>零成本，看完本教程就能用</td><td>约 2 倍</td><td>所有人，尤其是比赛 &#x2F; 考试环境</td></tr><tr><td><strong>原生 + 锁定分组法</strong><br/>（第 3 章）</td><td>花 10 分钟划分组，或跑一次 3.8 节脚本</td><td><strong>约 3~4 倍</strong></td><td><strong>比赛 &#x2F; 考试的唯一正解</strong></td></tr><tr><td><strong>插件图层化</strong><br/>（ngSkinTools 之类）</td><td>装插件，学 1~2 天</td><td>约 4~5 倍</td><td>日常项目里不受插件限制的人</td></tr><tr><td><strong>引擎端自动蒙皮</strong><br/>（UE 的 ML Deformer、MetaHuman 类标准化资产）</td><td>需要搭管线，可控性差</td><td>视资产标准化程度而定</td><td>有流水线、资产高度规范化的团队</td></tr></tbody></table><p><strong>给你的具体建议（按顺序做，不要跳步）：</strong></p><ol><li><strong>第 2 章 2.1 节</strong>：把关节对到网格体积里。这 10 分钟能顶掉后面两小时的无用功。</li><li><strong>第 3 章</strong>：把骨骼分成 7 组，用锁定权重建立安全边界。这是原生方案里收益最大的一步。</li><li><strong>第 4 章</strong>：镜像 + 复制权重，直接省掉一半工作量。</li><li><strong>第 5 章</strong>：搭好时间轴姿势库再动手刷，别对着 T-Pose 刷。</li><li><strong>第 6 章</strong>：Delta Mush 收尾，把剩余瑕疵一次抹平。</li><li><strong>养成三个习惯</strong>：<strong>先对关节再绑定</strong>、<strong>先刷左边再镜像</strong>、<strong>每组完成导出一份权重存档</strong>。</li></ol><hr><h2 id="附录-A-菜单路径速查"><a href="#附录-A-菜单路径速查" class="headerlink" title="附录 A 菜单路径速查"></a>附录 A 菜单路径速查</h2><table><thead><tr><th>功能</th><th>菜单路径</th></tr></thead><tbody><tr><td>交互式蒙皮绑定</td><td><code>蒙皮 &gt; 交互式蒙皮绑定</code></td></tr><tr><td>绑定蒙皮</td><td><code>蒙皮 &gt; 绑定蒙皮 &gt; 选项</code></td></tr><tr><td>分离蒙皮</td><td><code>蒙皮 &gt; 分离蒙皮</code></td></tr><tr><td>转到绑定姿势</td><td><code>蒙皮 &gt; 转到绑定姿势</code></td></tr><tr><td>绘制蒙皮权重</td><td><code>蒙皮 &gt; 绘制蒙皮权重工具</code></td></tr><tr><td>平滑蒙皮权重</td><td><code>蒙皮 &gt; 平滑蒙皮权重</code></td></tr><tr><td>镜像蒙皮权重</td><td><code>蒙皮 &gt; 镜像蒙皮权重</code></td></tr><tr><td>复制蒙皮权重</td><td><code>蒙皮 &gt; 复制蒙皮权重</code></td></tr><tr><td>导出蒙皮权重</td><td><code>蒙皮 &gt; 导出蒙皮权重</code></td></tr><tr><td>导入蒙皮权重</td><td><code>蒙皮 &gt; 导入蒙皮权重</code></td></tr><tr><td>限制总数（影响数）</td><td><code>蒙皮 &gt; 限制总数</code></td></tr><tr><td>移除小权重</td><td><code>蒙皮 &gt; 移除小权重</code></td></tr><tr><td>锁定 &#x2F; 解锁权重</td><td><code>蒙皮 &gt; 锁定权重</code> &#x2F; <code>解锁权重</code></td></tr><tr><td>反转选择</td><td><code>选择 &gt; 反转选择</code></td></tr><tr><td>创建快速选择集</td><td><code>创建 &gt; 集 &gt; 快速选择集</code></td></tr><tr><td>曲线图编辑器（设台阶切线）</td><td><code>窗口 &gt; 动画编辑器 &gt; 曲线图编辑器</code></td></tr><tr><td>添加关节标签</td><td><code>骨架 &gt; 关节标签 &gt; 添加关节标签</code></td></tr><tr><td>定向关节</td><td><code>骨架 &gt; 定向关节</code></td></tr><tr><td>Delta Mush</td><td><code>变形 &gt; Delta Mush</code></td></tr><tr><td>混合变形</td><td><code>变形 &gt; 混合变形</code></td></tr><tr><td>组件编辑器</td><td><code>窗口 &gt; 常规编辑器 &gt; 组件编辑器</code></td></tr><tr><td>删除历史</td><td><code>编辑 &gt; 按类型删除 &gt; 历史</code></td></tr><tr><td>冻结变换</td><td><code>修改 &gt; 冻结变换</code></td></tr><tr><td>显示边界边</td><td><code>显示 &gt; 多边形 &gt; 边界边</code></td></tr><tr><td>网格清理</td><td><code>网格 &gt; 清理</code></td></tr><tr><td>合并顶点</td><td><code>编辑网格 &gt; 合并</code></td></tr><tr><td>插入循环边</td><td><code>编辑网格 &gt; 插入循环边</code></td></tr></tbody></table><hr><h2 id="附录-B-术语中英对照"><a href="#附录-B-术语中英对照" class="headerlink" title="附录 B 术语中英对照"></a>附录 B 术语中英对照</h2><table><thead><tr><th>中文</th><th>英文</th><th>备注</th></tr></thead><tbody><tr><td>蒙皮 &#x2F; 蒙皮簇</td><td>Skin &#x2F; skinCluster</td><td>权重的容器节点</td></tr><tr><td>权重</td><td>Weight</td><td>0~1，表示该骨骼对顶点的影响程度</td></tr><tr><td>绑定姿势</td><td>Bind Pose</td><td>静止姿势，调关节必须在此时</td></tr><tr><td>测地体素</td><td>Geodesic Voxel</td><td>推荐的绑定方法</td></tr><tr><td>热力图</td><td>Heat Map</td><td>对封闭网格好，对破面敏感</td></tr><tr><td>最近距离</td><td>Closest Distance</td><td>已基本淘汰</td></tr><tr><td>影响数</td><td>Influences</td><td>每个顶点受几根骨骼影响</td></tr><tr><td>归一化</td><td>Normalize</td><td>保证权重和为 1</td></tr><tr><td>糖纸扭曲</td><td>Candy Wrapper</td><td>扭转时的典型瑕疵</td></tr><tr><td>修正形态</td><td>Corrective Shape</td><td>姿势驱动的形状修正</td></tr><tr><td>混合变形</td><td>Blend Shape</td><td>形态过渡</td></tr><tr><td>传递蒙皮权重</td><td>Copy &#x2F; Transfer Skin Weights</td><td>跨网格复制</td></tr><tr><td>关节标签</td><td>Joint Label</td><td>镜像和引擎识别的依据</td></tr></tbody></table><hr><h2 id="最后三句话"><a href="#最后三句话" class="headerlink" title="最后三句话"></a>最后三句话</h2><ol><li><strong>权重是算出来的，不是刷出来的。</strong> 算法打底、批量复用，你只做最后那 30 分的精修。</li><li><strong>管理比刷更重要。</strong> 锁定、分组、遮罩、存档，这四样让你不做无用功。</li><li><strong>够用就好。</strong> 剩下的瑕疵交给 Delta Mush 和修正形态，别在画笔上死磕。</li></ol><p><strong>而且这三条一分钱不花——不用装任何插件。</strong></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;适用版本&lt;/strong&gt;：Maya 2016.5+（部分功能需</summary>
        
      
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Maya" scheme="https://www.xmdblog.com/tags/Maya/"/>
    
  </entry>
  
  <entry>
    <title>🤖 用 GitHub / GitLab CI/CD 部署 Hexo 到宝塔服务器</title>
    <link href="https://www.xmdblog.com/posts/2cd5d824.html"/>
    <id>https://www.xmdblog.com/posts/2cd5d824.html</id>
    <published>2025-09-04T12:25:48.000Z</published>
    <updated>2026-10-10T08:29:42.779Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>相比直接部署到服务器，使用 GitHub&#x2F;GitLab CI&#x2F;CD 的方案更现代化、更安全：源码托管在云端，服务器只接收构建产物，支持团队协作、版本控制、自动化测试等。</p><blockquote><p>[!TIP]<br>适合人群：希望源码云端托管、自动化构建部署、支持团队协作的 Hexo 用户。</p></blockquote><hr><h2 id="🔧-一、准备与目标"><a href="#🔧-一、准备与目标" class="headerlink" title="🔧 一、准备与目标"></a>🔧 一、准备与目标</h2><h3 id="🔧-1-前置条件"><a href="#🔧-1-前置条件" class="headerlink" title="🔧 1. 前置条件"></a>🔧 1. 前置条件</h3><ul><li>已有一台可外网访问的服务器（推荐 Ubuntu 22.04&#x2F;24.04 或 CentOS 7&#x2F;8 Stream）</li><li>已有域名，并能在域名服务商处设置解析</li><li>GitHub 或 GitLab 账号</li><li>本地已安装 Node.js、Git、Hexo 开发环境（若未搭好，可参考<a href="https://www.xmdblog.com/posts/70db7d7c.html">《Hexo博客搭建教程》</a>）</li></ul><h3 id="🚀-2-部署目标与架构"><a href="#🚀-2-部署目标与架构" class="headerlink" title="🚀 2. 部署目标与架构"></a>🚀 2. 部署目标与架构</h3><ol><li><p><strong>源码托管</strong>：Hexo 源码推送到 GitHub&#x2F;GitLab 仓库</p></li><li><p><strong>自动构建</strong>：GitHub Actions 或 GitLab CI 自动构建 Hexo 静态文件</p></li><li><p><strong>自动部署</strong>：构建完成后自动推送到宝塔服务器站点目录</p></li><li><p><strong>Web 服务</strong>：Nginx 提供 Web 访问，开启 HTTPS 并强制跳转</p></li></ol><blockquote><p>[!NOTE]<br>我们采用”源码云端托管 → CI&#x2F;CD 自动构建 → 自动部署到服务器”的方案。更安全、更稳定、支持团队协作。</p></blockquote><hr><h2 id="💡-二、安装宝塔与-Nginx"><a href="#💡-二、安装宝塔与-Nginx" class="headerlink" title="💡 二、安装宝塔与 Nginx"></a>💡 二、安装宝塔与 Nginx</h2><h3 id="🔧-1-安装宝塔面板"><a href="#🔧-1-安装宝塔面板" class="headerlink" title="🔧 1. 安装宝塔面板"></a>🔧 1. 安装宝塔面板</h3><p>前往官网获取安装脚本：<a href="https://www.bt.cn/new/download.html">宝塔面板下载，免费全能的服务器运维软件</a></p><p>在服务器上以 <code>root</code> 执行对应系统脚本。安装完成后，按提示登录面板。</p><h3 id="🔧-2-在宝塔安装-Nginx-与创建站点"><a href="#🔧-2-在宝塔安装-Nginx-与创建站点" class="headerlink" title="🔧 2. 在宝塔安装 Nginx 与创建站点"></a>🔧 2. 在宝塔安装 Nginx 与创建站点</h3><ol><li><p>打开”软件商店”仅安装 Nginx（暂不装 PHP&#x2F;MySQL）</p></li><li><p>“网站”→”添加站点”，填入你的域名，如 <code>xmdblog.com</code>（会自动创建站点目录 <code>/www/wwwroot/xmdblog.com</code>）</p></li><li><p>稍后 CI&#x2F;CD 会将构建产物部署到此目录</p></li></ol><hr><h2 id="🔐-三、创建部署用户与配置-SSH（服务器）"><a href="#🔐-三、创建部署用户与配置-SSH（服务器）" class="headerlink" title="🔐 三、创建部署用户与配置 SSH（服务器）"></a>🔐 三、创建部署用户与配置 SSH（服务器）</h2><p>以下以 Ubuntu 为例，CentOS 在命令后附等价命令。</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Debian</span></span><br><span class="line"><span class="built_in">sudo</span> adduser deploy</span><br><span class="line"></span><br><span class="line"><span class="comment"># CentOS/RHEL（等价创建）</span></span><br><span class="line"><span class="comment"># sudo adduser deploy</span></span><br></pre></td></tr></table></figure><p>为 <code>deploy</code> 用户配置 SSH：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">sudo</span> -u deploy <span class="built_in">mkdir</span> -p /home/deploy/.ssh</span><br><span class="line"><span class="built_in">sudo</span> -u deploy <span class="built_in">touch</span> /home/deploy/.ssh/authorized_keys</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chmod</span> 700 /home/deploy/.ssh</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chmod</span> 600 /home/deploy/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>我们使用 <code>deploy</code> 用户而不是 <code>git</code>，更符合 CI&#x2F;CD 部署的语义。</p></blockquote><p>授予站点目录权限：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R deploy:deploy /www/wwwroot/xmdblog.com</span><br></pre></td></tr></table></figure><blockquote><p>[!NOTE]<br>若宝塔在站点目录生成 <code>.user.ini</code> 导致权限操作受限，可先暂时删除此文件；或在”网站 → 设置 → 伪静态&#x2F;配置文件”里关闭相关限制后，或删除这个文件再设置权限。</p></blockquote><hr><h2 id="🔑-四、生成-SSH-密钥并配置到-CI-CD"><a href="#🔑-四、生成-SSH-密钥并配置到-CI-CD" class="headerlink" title="🔑 四、生成 SSH 密钥并配置到 CI&#x2F;CD"></a>🔑 四、生成 SSH 密钥并配置到 CI&#x2F;CD</h2><h3 id="🚀-1-生成部署密钥"><a href="#🚀-1-生成部署密钥" class="headerlink" title="🚀 1. 生成部署密钥"></a>🚀 1. 生成部署密钥</h3><p>在本地生成专门用于 CI&#x2F;CD 部署的密钥：</p><blockquote><p>[!NOTE]</p><p>这一步在你的电脑上使用Git Bash运行，不是服务器。</p></blockquote><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh-keygen -t ed25519 -C <span class="string">&quot;ci-deploy@xmdblog&quot;</span> -f ~/.ssh/ci_deploy_key</span><br><span class="line"><span class="comment"># 一路回车。会生成 ci_deploy_key（私钥）和 ci_deploy_key.pub（公钥）</span></span><br></pre></td></tr></table></figure><h3 id="🔧-2-配置服务器公钥"><a href="#🔧-2-配置服务器公钥" class="headerlink" title="🔧 2. 配置服务器公钥"></a>🔧 2. 配置服务器公钥</h3><p>将公钥内容添加到服务器：</p><p>打开你电脑的<code>C:\Users\您的用户名\.ssh</code>目录，用记事本打开<code>ci_deploy_key.pub</code>复制里面的全部内容。</p><p>登录你服务器的宝塔面板，打开”文件”找到<code>/home/deploy/.ssh</code>目录，双击<code>authorized_keys</code>这个文件名，将复制的内容粘贴进去，注意点击对话框左上角的保存！</p><h3 id="✅-3-测试连接"><a href="#✅-3-测试连接" class="headerlink" title="✅ 3. 测试连接"></a>✅ 3. 测试连接</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh -i ~/.ssh/ci_deploy_key deploy@你的服务器IP</span><br><span class="line"><span class="built_in">exit</span></span><br></pre></td></tr></table></figure><p>若能登录&#x2F;退出，说明密钥配置正常。</p><hr><h2 id="🧩-五、配置-Nginx-与-HTTPS（宝塔）"><a href="#🧩-五、配置-Nginx-与-HTTPS（宝塔）" class="headerlink" title="🧩 五、配置 Nginx 与 HTTPS（宝塔）"></a>🧩 五、配置 Nginx 与 HTTPS（宝塔）</h2><ol><li>在宝塔”网站 → 你的域名 → SSL”，申请&#x2F;安装 Let’s Encrypt，建议勾选”强制 HTTPS”</li><li>Nginx 站点根目录保持为 <code>/www/wwwroot/xmdblog.com</code></li></ol><hr><h2 id="🚀-六、配置-GitHub-Actions-自动部署"><a href="#🚀-六、配置-GitHub-Actions-自动部署" class="headerlink" title="🚀 六、配置 GitHub Actions 自动部署"></a>🚀 六、配置 GitHub Actions 自动部署</h2><h3 id="💡-1-推送源码到-GitHub"><a href="#💡-1-推送源码到-GitHub" class="headerlink" title="💡 1. 推送源码到 GitHub"></a>💡 1. 推送源码到 GitHub</h3><p>首先将你的 Hexo 源码推送到 GitHub 仓库（提前在GitHub创建好仓库，在你本地的博客目录运行以下命令）：</p><blockquote><p>[!WARNING]</p><p>一定要创建私人库！一定要创建私人库！一定要创建私人库！不要公开！</p></blockquote><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 在 Hexo 根目录</span></span><br><span class="line">git init</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;Initial commit&quot;</span></span><br><span class="line">git branch -M main</span><br><span class="line">git remote add origin https://github.com/你的用户名/你的仓库名.git</span><br><span class="line">git push -u origin main</span><br></pre></td></tr></table></figure><blockquote><p>[!NOTE]</p><p>如果你使用了第三方主题且运行过<code>hexo generate</code>，运行<code>git add .</code>时报错，那么请根据情况使用Git Bash运行以下代码：</p></blockquote><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 在仓库根目录执行</span></span><br><span class="line">git <span class="built_in">rm</span> --cached .deploy_git</span><br><span class="line">git <span class="built_in">rm</span> --cached themes/anzhiyu</span><br><span class="line"><span class="built_in">rm</span> -rf .deploy_git</span><br><span class="line"><span class="built_in">rm</span> -rf .gitmodules</span><br><span class="line">git commit -m <span class="string">&quot;chore: remove invalid submodule config&quot;</span></span><br><span class="line">git push    <span class="comment">#重新上传</span></span><br></pre></td></tr></table></figure><h3 id="🔧-2-配置-GitHub-Secrets"><a href="#🔧-2-配置-GitHub-Secrets" class="headerlink" title="🔧 2. 配置 GitHub Secrets"></a>🔧 2. 配置 GitHub Secrets</h3><p>在 GitHub 仓库页面，进入 <code>Settings</code> → <code>Secrets and variables</code> → <code>Actions</code> → <code>Manage environment secrets</code>→ <code>New environment</code>→<code>Name*</code>输入<code>secrets</code>→ <code>Configure environment</code>→ <code>Add environment secret</code>添加以下 secrets：</p><ul><li><code>SERVER_HOST</code>: 你的服务器 IP 或域名</li><li><code>SERVER_USER</code>: <code>deploy</code></li><li><code>SSH_PRIVATE_KEY</code>: 私钥内容（<code>ci_deploy_key</code> 文件的完整内容）</li></ul><h3 id="💡-3-创建-GitHub-Actions-工作流"><a href="#💡-3-创建-GitHub-Actions-工作流" class="headerlink" title="💡 3. 创建 GitHub Actions 工作流"></a>💡 3. 创建 GitHub Actions 工作流</h3><p>在 Hexo 根目录创建 <code>.github/workflows/deploy.yml</code>：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">Hexo</span> <span class="string">to</span> <span class="string">Server</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span> [ <span class="string">main</span> ]</span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">    <span class="attr">branches:</span> [ <span class="string">main</span> ]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build-and-deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">environment:</span> <span class="string">secrets</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&#x27;18&#x27;</span></span><br><span class="line">          <span class="attr">cache:</span> <span class="string">&#x27;npm&#x27;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">install</span> <span class="string">hexo-cli</span> <span class="string">-g</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">Hexo</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          hexo clean</span></span><br><span class="line"><span class="string">          hexo generate</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">Server</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">appleboy/ssh-action@v1.0.3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">host:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_HOST</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">username:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_USER</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SSH_PRIVATE_KEY</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line"><span class="string">            # 清空站点目录</span></span><br><span class="line"><span class="string">            rm -rf /www/wwwroot/xmdblog.com/*</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">files</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">appleboy/scp-action@v0.1.7</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">host:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_HOST</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">username:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_USER</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SSH_PRIVATE_KEY</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">source:</span> <span class="string">&quot;public/*&quot;</span></span><br><span class="line">          <span class="attr">target:</span> <span class="string">&quot;/www/wwwroot/xmdblog.com/&quot;</span></span><br><span class="line">          <span class="attr">strip_components:</span> <span class="number">1</span></span><br></pre></td></tr></table></figure><h3 id="🚀-4-推送并触发部署"><a href="#🚀-4-推送并触发部署" class="headerlink" title="🚀 4. 推送并触发部署"></a>🚀 4. 推送并触发部署</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git add .github/workflows/deploy.yml</span><br><span class="line">git commit -m <span class="string">&quot;Add GitHub Actions workflow&quot;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>此时访问 GitHub 仓库的 <code>Actions</code> 页面，应该能看到构建和部署过程。</p><hr><h2 id="🦊-七、配置-GitLab-CI-CD（替代方案）"><a href="#🦊-七、配置-GitLab-CI-CD（替代方案）" class="headerlink" title="🦊 七、配置 GitLab CI&#x2F;CD（替代方案）"></a>🦊 七、配置 GitLab CI&#x2F;CD（替代方案）</h2><p>如果你更喜欢 GitLab，可以创建 <code>.gitlab-ci.yml</code>：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">stages:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">build</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">deploy</span></span><br><span class="line"></span><br><span class="line"><span class="attr">variables:</span></span><br><span class="line">  <span class="attr">NODE_VERSION:</span> <span class="string">&quot;18&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">build:</span></span><br><span class="line">  <span class="attr">stage:</span> <span class="string">build</span></span><br><span class="line">  <span class="attr">image:</span> <span class="string">node:18-alpine</span></span><br><span class="line">  <span class="attr">cache:</span></span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">node_modules/</span></span><br><span class="line">  <span class="attr">before_script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">clean</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">hexo</span> <span class="string">generate</span></span><br><span class="line">  <span class="attr">artifacts:</span></span><br><span class="line">    <span class="attr">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">public/</span></span><br><span class="line">    <span class="attr">expire_in:</span> <span class="number">1</span> <span class="string">hour</span></span><br><span class="line"></span><br><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">stage:</span> <span class="string">deploy</span></span><br><span class="line">  <span class="attr">image:</span> <span class="string">alpine:latest</span></span><br><span class="line">  <span class="attr">before_script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">apk</span> <span class="string">add</span> <span class="string">--no-cache</span> <span class="string">openssh-client</span> <span class="string">rsync</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">eval</span> <span class="string">$(ssh-agent</span> <span class="string">-s)</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">echo</span> <span class="string">&quot;$SSH_PRIVATE_KEY&quot;</span> <span class="string">|</span> <span class="string">tr</span> <span class="string">-d</span> <span class="string">&#x27;\r&#x27;</span> <span class="string">|</span> <span class="string">ssh-add</span> <span class="bullet">-</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">mkdir</span> <span class="string">-p</span> <span class="string">~/.ssh</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">chmod</span> <span class="number">700</span> <span class="string">~/.ssh</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">ssh-keyscan</span> <span class="string">-H</span> <span class="string">$SERVER_HOST</span> <span class="string">&gt;&gt;</span> <span class="string">~/.ssh/known_hosts</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">rsync</span> <span class="string">-avz</span> <span class="string">--delete</span> <span class="string">public/</span> <span class="string">$SERVER_USER@$SERVER_HOST:/www/wwwroot/xmdblog.com/</span></span><br><span class="line">  <span class="attr">only:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">main</span></span><br><span class="line">  <span class="attr">dependencies:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">build</span></span><br></pre></td></tr></table></figure><p>在 GitLab 项目设置中添加以下变量：</p><ul><li><code>SERVER_HOST</code>: 服务器地址</li><li><code>SERVER_USER</code>: <code>deploy</code></li><li><code>SSH_PRIVATE_KEY</code>: 私钥内容</li></ul><hr><h2 id="🧱-八、安全与权限最佳实践"><a href="#🧱-八、安全与权限最佳实践" class="headerlink" title="🧱 八、安全与权限最佳实践"></a>🧱 八、安全与权限最佳实践</h2><ul><li>仅用于部署的 <code>deploy</code> 用户，禁止密码登录（仅允许密钥）</li><li>站点目录属主设为 <code>deploy:deploy</code>，避免权限错乱</li><li>定期备份站点目录：<code>/www/wwwroot/xmdblog.com</code></li><li>建议将服务器 <code>22</code> 端口改为高位端口并在防火墙中放行；或使用宝塔安全组放行所需端口</li><li>GitHub Secrets 中的私钥要妥善保管，不要泄露</li></ul><hr><h2 id="🛠️-九、常见问题排查（精选）"><a href="#🛠️-九、常见问题排查（精选）" class="headerlink" title="🛠️ 九、常见问题排查（精选）"></a>🛠️ 九、常见问题排查（精选）</h2><h3 id="💡-1-GitHub-Actions-构建失败"><a href="#💡-1-GitHub-Actions-构建失败" class="headerlink" title="💡 1) GitHub Actions 构建失败"></a>💡 1) GitHub Actions 构建失败</h3><ul><li>检查 <code>package.json</code> 中是否有正确的依赖</li><li>确认 Node.js 版本是否匹配（推荐 18.x）</li><li>查看 Actions 日志中的具体错误信息</li></ul><h3 id="🚀-2-部署失败：SSH-连接问题"><a href="#🚀-2-部署失败：SSH-连接问题" class="headerlink" title="🚀 2) 部署失败：SSH 连接问题"></a>🚀 2) 部署失败：SSH 连接问题</h3><ul><li>确认 GitHub Secrets 中的 <code>SSH_PRIVATE_KEY</code> 格式正确（包含完整的私钥内容）</li><li>检查服务器 SSH 服务是否正常运行：<code>systemctl status ssh</code></li><li>确认防火墙是否放行了 SSH 端口</li></ul><h3 id="🚀-3-文件上传失败：权限问题"><a href="#🚀-3-文件上传失败：权限问题" class="headerlink" title="🚀 3) 文件上传失败：权限问题"></a>🚀 3) 文件上传失败：权限问题</h3><ul><li>检查站点目录权限：<code>ls -al /www/wwwroot/xmdblog.com</code></li><li>确认 <code>deploy</code> 用户对目录有写权限：<code>sudo chown -R deploy:deploy /www/wwwroot/xmdblog.com</code></li></ul><h3 id="💡-4-域名能访问但样式-404"><a href="#💡-4-域名能访问但样式-404" class="headerlink" title="💡 4) 域名能访问但样式 404"></a>💡 4) 域名能访问但样式 404</h3><ul><li>检查 Nginx 站点根是否正确</li><li>确认静态资源是否已正确上传到站点目录</li><li>检查主题配置是否有绝对路径问题</li></ul><h3 id="🆕-5-想回滚到上一个版本"><a href="#🆕-5-想回滚到上一个版本" class="headerlink" title="🆕 5) 想回滚到上一个版本"></a>🆕 5) 想回滚到上一个版本</h3><p>在 GitHub 仓库中：</p><ol><li>进入 <code>Actions</code> 页面</li><li>找到想要回滚的提交</li><li>点击 “Re-run jobs” 重新部署</li></ol><p>或手动回滚：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 在服务器上</span></span><br><span class="line"><span class="built_in">cd</span> /www/wwwroot/xmdblog.com</span><br><span class="line">git <span class="built_in">log</span> --oneline  <span class="comment"># 查看提交历史</span></span><br><span class="line">git checkout &lt;commit-hash&gt;  <span class="comment"># 回滚到指定提交</span></span><br></pre></td></tr></table></figure><hr><h2 id="📌-十、进阶优化"><a href="#📌-十、进阶优化" class="headerlink" title="📌 十、进阶优化"></a>📌 十、进阶优化</h2><h3 id="🔧-1-多环境部署"><a href="#🔧-1-多环境部署" class="headerlink" title="🔧 1. 多环境部署"></a>🔧 1. 多环境部署</h3><p>可以配置不同的分支部署到不同环境：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># .github/workflows/deploy.yml</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span> [ <span class="string">main</span>, <span class="string">develop</span> ]</span><br><span class="line">    </span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build-and-deploy:</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">github.ref</span> <span class="string">==</span> <span class="string">&#x27;refs/heads/main&#x27;</span></span><br><span class="line">    <span class="comment"># 生产环境部署逻辑</span></span><br></pre></td></tr></table></figure><h3 id="💡-2-自动备份"><a href="#💡-2-自动备份" class="headerlink" title="💡 2. 自动备份"></a>💡 2. 自动备份</h3><p>在 GitHub Actions 中添加备份步骤：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Backup</span> <span class="string">current</span> <span class="string">site</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">appleboy/ssh-action@v1.0.3</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">host:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_HOST</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">username:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_USER</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SSH_PRIVATE_KEY</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line">      <span class="string">tar</span> <span class="string">-czf</span> <span class="string">/tmp/backup-$(date</span> <span class="string">+%Y%m%d-%H%M%S).tar.gz</span> <span class="string">/www/wwwroot/xmdblog.com</span></span><br></pre></td></tr></table></figure><h3 id="💡-3-通知集成"><a href="#💡-3-通知集成" class="headerlink" title="💡 3. 通知集成"></a>💡 3. 通知集成</h3><p>部署完成后发送通知：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Notify</span> <span class="string">deployment</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">8398a7/action-slack@v3</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">status:</span> <span class="string">$&#123;&#123;</span> <span class="string">job.status</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">channel:</span> <span class="string">&#x27;#deployments&#x27;</span></span><br><span class="line">    <span class="attr">webhook_url:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SLACK_WEBHOOK</span> <span class="string">&#125;&#125;</span></span><br></pre></td></tr></table></figure><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>通过本教程，你获得了一套现代化的 Hexo 部署方案：</p><ul><li><strong>源码云端托管</strong>：GitHub&#x2F;GitLab 管理源码，支持版本控制和团队协作</li><li><strong>自动化构建</strong>：CI&#x2F;CD 自动构建 Hexo 静态文件，无需本地环境</li><li><strong>安全部署</strong>：专用部署用户 + SSH 密钥，最小权限原则</li><li><strong>宝塔管理</strong>：Nginx&#x2F;HTTPS 配置，简单易用的服务器管理</li><li><strong>可回滚</strong>：Git 历史记录支持快速回滚到任意版本</li></ul><h3 id="💡-相比传统方案的优势"><a href="#💡-相比传统方案的优势" class="headerlink" title="💡 相比传统方案的优势"></a>💡 相比传统方案的优势</h3><ol><li><strong>更安全</strong>：服务器只接收构建产物，不暴露源码</li><li><strong>更稳定</strong>：云端构建环境一致，避免本地环境差异</li><li><strong>更高效</strong>：支持并行构建，构建缓存加速</li><li><strong>更灵活</strong>：支持多环境部署、自动备份、通知集成</li></ol><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区分享：</p><ol><li>你使用哪种 CI&#x2F;CD 平台？GitHub Actions 还是 GitLab CI？</li><li>在部署过程中遇到过哪些问题？如何解决的？</li><li>有没有其他自动化部署的最佳实践？</li></ol>]]></content>
    
    
    <summary type="html">使用 GitHub Actions 或 GitLab CI/CD 自动构建 Hexo 并部署到宝塔服务器。 源码托管在云端，服务器只接收构建产物，更安全、更稳定、支持团队协作。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hexo教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Hexo%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="Hexo" scheme="https://www.xmdblog.com/tags/Hexo/"/>
    
    <category term="宝塔面板" scheme="https://www.xmdblog.com/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"/>
    
    <category term="CI/CD" scheme="https://www.xmdblog.com/tags/CI-CD/"/>
    
  </entry>
  
  <entry>
    <title>🛍️ 非个人版 Windows 安装微软商店教程</title>
    <link href="https://www.xmdblog.com/posts/3e57d0c3.html"/>
    <id>https://www.xmdblog.com/posts/3e57d0c3.html</id>
    <published>2025-05-27T11:30:49.000Z</published>
    <updated>2026-10-10T08:29:42.779Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>Windows Server、LTSC等非个人版本默认是没有微软商店的，这给需要使用UWP应用的用户带来了不便。本文将介绍如何在这些版本中安装微软商店，让您也能使用UWP应用。</p><blockquote><p>[!NOTE]<br>本教程适用于Windows Server 2016&#x2F;2019&#x2F;2022&#x2F;2025、Windows 10&#x2F;11 LTSC等版本。</p></blockquote><hr><h2 id="💡-一、准备工作"><a href="#💡-一、准备工作" class="headerlink" title="💡 一、准备工作"></a>💡 一、准备工作</h2><h3 id="💡-1-系统要求"><a href="#💡-1-系统要求" class="headerlink" title="💡 1. 系统要求"></a>💡 1. 系统要求</h3><ul><li>Windows Server 2016&#x2F;2019&#x2F;2022&#x2F;2025</li><li>Windows 10&#x2F;11 LTSC</li><li>管理员权限</li><li>网络连接</li></ul><h3 id="📥-2-下载必要文件"><a href="#📥-2-下载必要文件" class="headerlink" title="📥 2. 下载必要文件"></a>📥 2. 下载必要文件</h3><p><a href="https://www.xbox.com/en-US/apps/xbox-app-on-pc">点这里打开Xbox官网</a></p><p>点击<code>DOWNLOAD THE APP</code>下载并安装Xbox</p><p><img src="https://imgbed.xmdblog.com/file/aYV9iAeJ.png" alt="image.png"></p><p><img src="https://imgbed.xmdblog.com/file/WavMLOiI.jpg" alt="1725505546.jpg"></p><blockquote><p>[!TIP]<br>如果官网你无法下载，建议从可靠的来源下载文件，避免使用未知来源的文件。</p></blockquote><hr><h2 id="💡-二、安装步骤"><a href="#💡-二、安装步骤" class="headerlink" title="💡 二、安装步骤"></a>💡 二、安装步骤</h2><ol><li>打开Xbox APP后会弹出提示，点击<code>立即审核</code></li></ol><p><img src="https://imgbed.xmdblog.com/file/VutbTvHM.png" alt="1725505634.png"></p><ol start="2"><li>把这些缺失的全部安装即可</li></ol><p><img src="https://imgbed.xmdblog.com/file/DlOkdAmn.png" alt="1725505804.png"></p><hr><h2 id="💡-三、验证安装"><a href="#💡-三、验证安装" class="headerlink" title="💡 三、验证安装"></a>💡 三、验证安装</h2><ol><li>打开开始菜单</li><li>搜索”Microsoft Store”</li><li>如果能看到商店图标，说明安装成功</li></ol><h3 id="🛠️-常见问题解决"><a href="#🛠️-常见问题解决" class="headerlink" title="🛠️ 常见问题解决"></a>🛠️ 常见问题解决</h3><ol><li><p>如果商店无法打开：</p><ul><li>检查Windows Store服务是否运行</li><li>运行Windows Store应用故障排除程序</li></ul></li><li><p>如果应用无法下载：</p><ul><li>检查网络连接</li><li>确保系统时间正确</li><li>检查Windows Update服务是否正常运行</li></ul></li></ol><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>通过以上步骤，您可以在非个人版本的Windows系统中安装并使用微软商店。主要实现了：</p><ul><li>安装依赖包</li><li>安装微软商店</li><li>解决常见问题</li></ul><blockquote><p>[!TIP]<br>建议定期更新系统，以确保商店功能正常运行。</p></blockquote><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论：</p><ol><li>您在安装过程中遇到了什么问题？</li><li>您最常用的UWP应用是什么？</li><li>对教程还有什么疑问？</li></ol>]]></content>
    
    
    <summary type="html">详细介绍如何在Windows Server、LTSC等非个人版本Windows系统中安装微软商店，让您也能使用UWP应用。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Windows教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Windows%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="LTSC" scheme="https://www.xmdblog.com/tags/LTSC/"/>
    
    <category term="Windows" scheme="https://www.xmdblog.com/tags/Windows/"/>
    
    <category term="Microsoft Store" scheme="https://www.xmdblog.com/tags/Microsoft-Store/"/>
    
  </entry>
  
  <entry>
    <title>✨ Markdown 写作进阶技巧</title>
    <link href="https://www.xmdblog.com/posts/c6c552a4.html"/>
    <id>https://www.xmdblog.com/posts/c6c552a4.html</id>
    <published>2025-04-10T02:00:00.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>在掌握了Markdown基础语法后，如何让文章更加美观、专业？本文将为您介绍一系列Markdown写作的进阶技巧，帮助您提升写作效率和文章质量。</p><blockquote><p>[!NOTE]<br>本文介绍的技巧适用于所有Markdown编辑器，但部分功能可能需要特定编辑器支持。</p></blockquote><hr><h2 id="✨-一、高级排版技巧"><a href="#✨-一、高级排版技巧" class="headerlink" title="✨ 一、高级排版技巧"></a>✨ 一、高级排版技巧</h2><h3 id="💡-1-文本强调与引用"><a href="#💡-1-文本强调与引用" class="headerlink" title="💡 1. 文本强调与引用"></a>💡 1. 文本强调与引用</h3><p>文本强调</p><p><strong>加粗文本</strong> 或 <strong>加粗文本</strong><br><em>斜体文本</em> 或 <em>斜体文本</em><br><del>删除线文本</del></p><p>引用嵌套</p><blockquote><p>一级引用</p><blockquote><p>二级引用</p><blockquote><p>三级引用</p></blockquote></blockquote></blockquote><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line"><span class="section"># 文本强调</span></span><br><span class="line"><span class="strong">**加粗文本**</span> 或 <span class="strong">__加粗文本__</span></span><br><span class="line"><span class="emphasis">*斜体文本*</span> 或 <span class="emphasis">_斜体文本_</span></span><br><span class="line">~~删除线文本~~</span><br><span class="line"></span><br><span class="line"><span class="section"># 引用嵌套</span></span><br><span class="line"><span class="quote">&gt; 一级引用</span></span><br><span class="line">&gt;&gt; 二级引用</span><br><span class="line">&gt;&gt;&gt; 三级引用</span><br></pre></td></tr></table></figure><h3 id="💡-2-列表进阶"><a href="#💡-2-列表进阶" class="headerlink" title="💡 2. 列表进阶"></a>💡 2. 列表进阶</h3><p>任务列表</p><ul><li><input disabled="" type="checkbox"> 待办事项</li><li><input checked="" disabled="" type="checkbox"> 已完成事项</li></ul><p>自定义列表</p><ol><li>第一项<ul><li>子项1</li><li>子项2</li></ul></li><li>第二项</li></ol><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line"><span class="section"># 任务列表</span></span><br><span class="line"><span class="bullet">-</span> [ ] 待办事项</span><br><span class="line"><span class="bullet">-</span> [x] 已完成事项</span><br><span class="line"></span><br><span class="line"><span class="section"># 自定义列表</span></span><br><span class="line"><span class="bullet">1.</span> 第一项</span><br><span class="line"><span class="bullet">    -</span> 子项1</span><br><span class="line"><span class="bullet">    -</span> 子项2</span><br><span class="line"><span class="bullet">2.</span> 第二项</span><br></pre></td></tr></table></figure><h3 id="💡-3-表格优化"><a href="#💡-3-表格优化" class="headerlink" title="💡 3. 表格优化"></a>💡 3. 表格优化</h3><table><thead><tr><th align="left">左对齐</th><th align="center">居中</th><th align="right">右对齐</th></tr></thead><tbody><tr><td align="left">内容</td><td align="center">内容</td><td align="right">内容</td></tr></tbody></table><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">| 左对齐 | 居中 | 右对齐 |</span><br><span class="line">|:-------|:----:|-------:|</span><br><span class="line">| 内容   | 内容 | 内容   |</span><br></pre></td></tr></table></figure><hr><h2 id="🎨-二、美化技巧"><a href="#🎨-二、美化技巧" class="headerlink" title="🎨 二、美化技巧"></a>🎨 二、美化技巧</h2><h3 id="💡-1-分割线样式"><a href="#💡-1-分割线样式" class="headerlink" title="💡 1. 分割线样式"></a>💡 1. 分割线样式</h3><hr><hr><hr><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">---</span><br><span class="line"><span class="strong">***</span></span><br><span class="line"><span class="strong">__<span class="emphasis">_</span></span></span><br></pre></td></tr></table></figure><h3 id="💻-2-代码块美化"><a href="#💻-2-代码块美化" class="headerlink" title="💻 2. 代码块美化"></a>💻 2. 代码块美化</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">代码内容</span><br></pre></td></tr></table></figure><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line"><span class="code">```语言</span></span><br><span class="line"><span class="code">代码内容</span></span><br><span class="line"><span class="code">```</span></span><br></pre></td></tr></table></figure><h3 id="💡-3-图片排版"><a href="#💡-3-图片排版" class="headerlink" title="💡 3. 图片排版"></a>💡 3. 图片排版</h3><p>图片居中</p><div align="center">  <img src="图片地址" alt="描述"></div><p>图片大小调整</p><img src="图片地址" width="300" height="200"><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line"><span class="section"># 图片居中</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">div</span> <span class="attr">align</span>=<span class="string">&quot;center&quot;</span>&gt;</span></span></span><br><span class="line">  <span class="language-xml"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;图片地址&quot;</span> <span class="attr">alt</span>=<span class="string">&quot;描述&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="section"># 图片大小调整</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">img</span> <span class="attr">src</span>=<span class="string">&quot;图片地址&quot;</span> <span class="attr">width</span>=<span class="string">&quot;300&quot;</span> <span class="attr">height</span>=<span class="string">&quot;200&quot;</span>&gt;</span></span></span><br></pre></td></tr></table></figure><hr><h2 id="⚡-三、效率提升技巧"><a href="#⚡-三、效率提升技巧" class="headerlink" title="⚡ 三、效率提升技巧"></a>⚡ 三、效率提升技巧</h2><h3 id="💡-1-快捷键设置"><a href="#💡-1-快捷键设置" class="headerlink" title="💡 1. 快捷键设置"></a>💡 1. 快捷键设置</h3><p>常用快捷键：</p><ul><li><code>Ctrl + B</code>: 加粗</li><li><code>Ctrl + I</code>: 斜体</li><li><code>Ctrl + K</code>: 插入链接</li><li><code>Ctrl + Shift + I</code>: 插入图片</li></ul><h3 id="💡-2-自定义样式"><a href="#💡-2-自定义样式" class="headerlink" title="💡 2. 自定义样式"></a>💡 2. 自定义样式</h3><ol><li>创建自定义CSS文件</li><li>在Markdown文件头部引入：</li></ol><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">style</span>&gt;</span></span></span><br><span class="line">.custom-style &#123;</span><br><span class="line"><span class="code">    color: #333;</span></span><br><span class="line"><span class="code">    font-size: 16px;</span></span><br><span class="line"><span class="code">&#125;</span></span><br><span class="line"><span class="code">&lt;/style&gt;</span></span><br></pre></td></tr></table></figure><h3 id="💡-3-模板使用"><a href="#💡-3-模板使用" class="headerlink" title="💡 3. 模板使用"></a>💡 3. 模板使用</h3><p>创建常用模板：</p><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">---</span><br><span class="line">title: &#123;&#123;title&#125;&#125;</span><br><span class="line">date: &#123;&#123;date&#125;&#125;</span><br><span class="line">tags: []</span><br><span class="line"><span class="section">categories: []</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 前言</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 正文</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 总结</span></span><br></pre></td></tr></table></figure><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>掌握这些进阶技巧后，您的Markdown写作将更加高效和专业。建议：</p><ol><li>根据个人需求选择合适的技巧</li><li>建立自己的写作模板</li><li>持续学习和实践</li></ol><blockquote><p>[!TIP]<br>建议保存常用的Markdown片段，建立个人代码库。</p></blockquote><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论：</p><ol><li>您最常用的Markdown技巧是什么？</li><li>在写作过程中遇到过哪些问题？</li><li>您希望了解哪些方面的Markdown知识？</li></ol>]]></content>
    
    
    <summary type="html">详细介绍Markdown写作的进阶技巧，包括高级语法、排版优化、效率提升等内容。</summary>
    
    
    
    <category term="软件分享" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/"/>
    
    <category term="写作工具" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/%E5%86%99%E4%BD%9C%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="写作技巧" scheme="https://www.xmdblog.com/tags/%E5%86%99%E4%BD%9C%E6%8A%80%E5%B7%A7/"/>
    
    <category term="Markdown" scheme="https://www.xmdblog.com/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>💿 Windows 7 纯净终极版镜像下载</title>
    <link href="https://www.xmdblog.com/posts/5eec6cc5.html"/>
    <id>https://www.xmdblog.com/posts/5eec6cc5.html</id>
    <published>2025-01-07T06:54:20.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>🎈经过一段时间的努力，我根据<a href="https://www.yrxitong.com/h-nd-1329.html">这篇文章</a>的指导，精心定制并封装了一个 Windows 7 精简系统镜像。本文会集中介绍这套镜像的优化内容、预装软件、下载方式与安装说明，方便需要老系统装机的朋友快速了解。</p><hr><h2 id="💡-一、系统简介"><a href="#💡-一、系统简介" class="headerlink" title="💡 一、系统简介"></a>💡 一、系统简介</h2><p>本次封装的Windows 7镜像基于原版系统，针对现代硬件需求进行了优化，同时精简了不必要的组件，增强了系统的兼容性、性能和稳定性。本系统支持 <strong>UEFI</strong> 和 <strong>安全启动</strong>，适用于主流硬件平台。</p><hr><h2 id="🔧-二、更新与优化"><a href="#🔧-二、更新与优化" class="headerlink" title="🔧 二、更新与优化"></a>🔧 二、更新与优化</h2><p>在制作本镜像过程中，我进行了以下主要更改：</p><h3 id="1-🛠️-集成更新与补丁"><a href="#1-🛠️-集成更新与补丁" class="headerlink" title="1. 🛠️ 集成更新与补丁"></a>1. 🛠️ 集成更新与补丁</h3><ul><li>✅ 集成 <strong>IE11浏览器</strong> 和 <strong>.NET Framework 4.8</strong>，满足运行现代软件的需求。</li><li>✅ 整合了 <strong>2019年11月之前的156个必要补丁</strong>，确保系统安全稳定。</li><li>✅ 应用 <strong>2022年9月的累积更新补丁 (KB5017361)</strong>，支持 UEFI 和安全启动功能。</li></ul><h3 id="2-✂️-精简系统组件"><a href="#2-✂️-精简系统组件" class="headerlink" title="2. ✂️ 精简系统组件"></a>2. ✂️ 精简系统组件</h3><ul><li>🚮 移除了一些无用的系统组件和服务（例如系统帮助文件、语言包等），减小系统体积。</li><li>⚡ 精简了不必要的服务和功能，使系统运行更轻量、更高效。</li><li>🛑 删除了 <strong>Windows 7 服务结束通知功能</strong>，避免弹出相关提示。</li></ul><h3 id="3-🔒-修复已知问题"><a href="#3-🔒-修复已知问题" class="headerlink" title="3. 🔒 修复已知问题"></a>3. 🔒 修复已知问题</h3><ul><li>🖨️ 集成了 <strong>防止共享打印机报错b11</strong> 的注册表文件，解决网络打印机共享问题。</li><li>🛡️ 替换了 <strong>防止A5蓝屏的补丁</strong>，增强系统稳定性。</li></ul><h3 id="4-🔓-启用扩展安全支持（ESU）"><a href="#4-🔓-启用扩展安全支持（ESU）" class="headerlink" title="4. 🔓 启用扩展安全支持（ESU）"></a>4. 🔓 启用扩展安全支持（ESU）</h3><ul><li>🛠️ 使用 <strong>BypassESU-v11 工具</strong>，突破微软对Windows 7停止支持的限制，继续接收最新安全更新。</li></ul><hr><h2 id="📦-三、集成-IT天空万能驱动包"><a href="#📦-三、集成-IT天空万能驱动包" class="headerlink" title="📦 三、集成 IT天空万能驱动包"></a>📦 三、集成 IT天空万能驱动包</h2><p>为实现安装过程中的自动驱动安装，我在镜像中集成了 <strong>IT天空的万能驱动包</strong>。<br>该驱动包支持市面上绝大多数主流硬件，同时兼容大多数旧硬件，确保系统在各种硬件环境下的兼容性和稳定性。</p><blockquote><p>⚠️ <strong>注意</strong>：由于驱动包的体积较大，使得镜像文件总大小约为 <strong>10GB</strong>。</p></blockquote><hr><h2 id="✨-四、预装常用软件"><a href="#✨-四、预装常用软件" class="headerlink" title="✨ 四、预装常用软件"></a>✨ 四、预装常用软件</h2><p>为了方便用户使用，我在镜像中预装了以下常用软件：</p><ul><li><strong>Bandizip</strong>：🗂️ 一款免费且快速地压缩解压工具，支持多种格式，界面简洁，操作方便。</li><li><strong>PotPlayer</strong>：🎥 功能强大的多媒体播放器，支持多种视频和音频格式，提供丰富的解码器和插件，播放流畅。</li><li><strong>火绒安全</strong>：🛡️ 轻量级的安全防护软件，提供实时病毒查杀、网络防护和系统优化功能，占用资源少，保护效果佳。</li><li><strong>360驱动大师</strong>：🔧 专业的驱动管理工具，提供驱动检测、下载和安装功能，确保系统硬件驱动的及时更新和兼容。</li><li><strong>Geek Uninstaller</strong>：🗑️ 轻量级的软件卸载工具，支持强力卸载和残留清理，帮助用户彻底移除不需要的软件。</li><li><strong>Microsoft Office 2016</strong>：📄 包含 Word、Excel、PowerPoint 等办公应用，满足日常文档编辑、数据处理和演示制作需求。</li><li><strong>Adobe Acrobat DC</strong>：📘 专业的 PDF 阅读和编辑工具，支持创建、编辑、转换和签署 PDF 文档，功能全面。</li><li><strong>Google Chrome 109</strong>：🌐 最后一个支持win7的版本，快速、安全的网页浏览器，提供流畅的浏览体验和丰富的扩展支持。</li></ul><p>这些预装软件能够满足大部分用户的日常需求，提供开箱即用的便利体验！🎉</p><hr><h2 id="📥-五、下载链接"><a href="#📥-五、下载链接" class="headerlink" title="📥 五、下载链接"></a>📥 五、下载链接</h2><p>镜像文件已上传至可靠的网盘，请通过以下链接下载：</p><ul><li>👉 <a href="https://pan.xmdblog.com/alipan/cn_windows_7_ultimate_sp1_x64_dvd_fz.iso"><strong>点击下载精简版Windows 7系统镜像</strong></a></li></ul><blockquote><p>💡 提示：下载完成后，请使用专业工具（如<a href="https://rufus.ie/">Rufus</a>）制作U盘启动盘，进行系统安装。</p></blockquote><hr><h2 id="🛠️-六、安装说明"><a href="#🛠️-六、安装说明" class="headerlink" title="🛠️ 六、安装说明"></a>🛠️ 六、安装说明</h2><ol><li>🔌 准备一个11GB以上容量的U盘。</li><li>⚙️ 使用<a href="https://rufus.ie/">Rufus</a>将镜像写入U盘，选择UEFI模式。</li><li>🔄 进入BIOS设置为UEFI启动，插入U盘并重启电脑。</li><li>🖱️ 按提示完成系统安装。</li></ol><blockquote><p>📝 <strong>注</strong>：安装完成后，请运行火绒安全检查更新并安装病毒库。</p></blockquote><hr><h2 id="⚠️-七、注意事项"><a href="#⚠️-七、注意事项" class="headerlink" title="⚠️ 七、注意事项"></a>⚠️ 七、注意事项</h2><ul><li>📜 本系统仅供学习和研究使用，请勿用于商业用途。</li><li>💬 如果有任何问题或建议，请在评论区留言，我会尽快解答！</li></ul><hr><p>希望本次封装的系统能为大家带来更好的使用体验，感谢支持！❤️</p><h2 id="📌-总结"><a href="#📌-总结" class="headerlink" title="📌 总结"></a>📌 总结</h2><p>如果你正需要一套适合老机器、兼顾兼容性与实用性的 Windows 7 镜像，这个版本会是一个比较省心的选择。它已经完成常见补丁、驱动和常用软件的整合，适合装机、测试或备用环境使用。</p><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区交流：</p><ol><li>你更偏向纯净原版还是适度优化版系统？</li><li>你还希望镜像内集成哪些常用工具？</li><li>安装过程中如果遇到问题，也可以留言一起排查。</li></ol>]]></content>
    
    
    <summary type="html">这是一款基于Windows 7精简封装的系统镜像，集成IT天空万能驱动包及多款常用软件，支持自动驱动安装，优化轻量化，开箱即用，满足日常使用需求。</summary>
    
    
    
    <category term="软件分享" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="下载" scheme="https://www.xmdblog.com/tags/%E4%B8%8B%E8%BD%BD/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="装机" scheme="https://www.xmdblog.com/tags/%E8%A3%85%E6%9C%BA/"/>
    
    <category term="系统镜像" scheme="https://www.xmdblog.com/tags/%E7%B3%BB%E7%BB%9F%E9%95%9C%E5%83%8F/"/>
    
    <category term="Windows 7" scheme="https://www.xmdblog.com/tags/Windows-7/"/>
    
  </entry>
  
  <entry>
    <title>🎨 Alist 美化魔改教程和源码分享</title>
    <link href="https://www.xmdblog.com/posts/d7d7e48c.html"/>
    <id>https://www.xmdblog.com/posts/d7d7e48c.html</id>
    <published>2025-01-04T12:25:48.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>Alist 默认界面并不难用，但如果你希望它更有个人风格、更贴近自己的站点气质，就可以通过自定义头部代码、自定义内容代码和一些前端样式进行美化。</p><p>这篇文章会围绕“效果展示 → 配置位置 → 可直接使用的代码 → 修改建议”这条路线来整理，让你不只是复制代码，还能大概看懂每一部分在做什么。</p><blockquote><p>[!NOTE]<br>本文以我的网盘 <a href="https://pan.xmdblog.com/">pan.xmdblog.com</a> 为例演示，适合已经安装好 Alist 的用户继续美化界面。</p></blockquote><hr><h2 id="✨-一、效果展示"><a href="#✨-一、效果展示" class="headerlink" title="✨ 一、效果展示"></a>✨ 一、效果展示</h2><h3 id="1-首页效果"><a href="#1-首页效果" class="headerlink" title="1. 首页效果"></a>1. 首页效果</h3><p><img src="/img/posts/d7d7e48c/image-20241210223838575.png" alt="首页效果图"></p><h3 id="2-列表页效果"><a href="#2-列表页效果" class="headerlink" title="2. 列表页效果"></a>2. 列表页效果</h3><p><img src="/img/posts/d7d7e48c/image-20241210224043543.png" alt="列表页效果图"></p><p>从效果上看，这套方案主要实现了这些变化：</p><ul><li>页面背景更有氛围感</li><li>主列表与导航区域带有毛玻璃效果</li><li>全站统一字体风格</li><li>底部增加自定义链接与备案信息</li><li>增加一言内容，页面更灵动</li></ul><hr><h2 id="🛠️-二、进入后台配置位置"><a href="#🛠️-二、进入后台配置位置" class="headerlink" title="🛠️ 二、进入后台配置位置"></a>🛠️ 二、进入后台配置位置</h2><h3 id="1-找到配置入口"><a href="#1-找到配置入口" class="headerlink" title="1. 找到配置入口"></a>1. 找到配置入口</h3><p>登录 Alist 后台后，按下面路径进入：</p><ol><li>点击“管理”</li><li>找到“其他设置”</li><li>找到“自定义头部”与“自定义内容”</li></ol><p><img src="/img/posts/d7d7e48c/image-20241210224614668.png" alt="后台配置"></p><blockquote><p>[!TIP]<br>一般来说，样式类代码放进“自定义头部”，页面底部补充内容、脚本内容放进“自定义内容”，会更清晰。</p></blockquote><hr><h2 id="🧩-三、这套美化方案包含哪些部分"><a href="#🧩-三、这套美化方案包含哪些部分" class="headerlink" title="🧩 三、这套美化方案包含哪些部分"></a>🧩 三、这套美化方案包含哪些部分</h2><p>为了方便理解，你可以把本文的代码拆成 4 个模块：</p><h3 id="1-基础兼容与字体资源"><a href="#1-基础兼容与字体资源" class="headerlink" title="1. 基础兼容与字体资源"></a>1. 基础兼容与字体资源</h3><p>负责：</p><ul><li>引入 <code>replaceAll</code> 兼容脚本</li><li>引入网页字体</li></ul><h3 id="2-页面视觉样式"><a href="#2-页面视觉样式" class="headerlink" title="2. 页面视觉样式"></a>2. 页面视觉样式</h3><p>负责：</p><ul><li>背景图</li><li>毛玻璃卡片</li><li>顶部栏透明效果</li><li>白天&#x2F;夜间模式适配</li></ul><h3 id="3-底部自定义内容"><a href="#3-底部自定义内容" class="headerlink" title="3. 底部自定义内容"></a>3. 底部自定义内容</h3><p>负责：</p><ul><li>邮箱、博客、云盘、后台入口等链接</li><li>备案信息展示</li><li>页面底部结构补充</li></ul><h3 id="4-动态增强脚本"><a href="#4-动态增强脚本" class="headerlink" title="4. 动态增强脚本"></a>4. 动态增强脚本</h3><p>负责：</p><ul><li>延迟插入底部内容</li><li>一言内容加载</li></ul><p>当你知道这些模块分别是干什么的，后面二次修改就不会太痛苦。</p><hr><h2 id="💻-四、自定义头部代码"><a href="#💻-四、自定义头部代码" class="headerlink" title="💻 四、自定义头部代码"></a>💻 四、自定义头部代码</h2><p>把下面代码粘贴到 Alist 的“自定义头部”中：</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 引入 polyfill --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://polyfill.alicdn.com/v3/polyfill.min.js?features=String.prototype.replaceAll&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 引入字体 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;stylesheet&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://npm.elemecdn.com/lxgw-wenkai-webfont@1.1.0/lxgwwenkai-regular.css&quot;</span> /&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="comment">/* 隐藏底部 */</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.footer</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">display</span>: none <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="comment">/* 背景设置 */</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-dark</span>, <span class="selector-class">.hope-ui-light</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;https://www.xmdblog.com/img/backgroud.jpeg&#x27;</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-size</span>: cover;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-attachment</span>: fixed;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-position</span>: center;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    </span></span><br><span class="line"><span class="language-css">    <span class="comment">/*主列表白天模式透明*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.obj-box</span><span class="selector-class">.hope-stack</span><span class="selector-class">.hope-c-dhzjXW</span><span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-igScBhH-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.3</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="comment">/*主列表夜间模式透明*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.obj-box</span><span class="selector-class">.hope-stack</span><span class="selector-class">.hope-c-dhzjXW</span><span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-iigjoxS-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.3</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="comment">/*readme白天模式透明*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-ikSuVsl-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.3</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="comment">/*readme夜间模式透明*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-c-PJLV</span><span class="selector-class">.hope-c-PJLV-iiuDLME-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.3</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="comment">/*顶部*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-id">#root</span> &gt; <span class="selector-class">.header</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="comment">/*导航条*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.body</span> &gt; <span class="selector-class">.nav</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.3</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.body</span> &gt; <span class="selector-class">.nav</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.3</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">   </span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.body</span> &gt; <span class="selector-class">.nav</span><span class="selector-pseudo">::after</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">display</span>: none;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="comment">/*右上视图切换菜单*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-iSMXDf-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.3</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-radius</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-iSMXDf-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.3</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-radius</span>: <span class="built_in">var</span>(--hope-radii-xl);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">4px</span> <span class="number">6px</span> <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.1</span>);</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="comment">/*右下角按钮透明*/</span></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-light</span> <span class="selector-class">.hope-c-PJLV-ijgzmFG-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.3</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-dark</span> <span class="selector-class">.hope-c-PJLV-ijgzmFG-css</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        -webkit-<span class="attribute">backdrop-filter</span>: <span class="built_in">blur</span>(<span class="number">10px</span>);</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.5</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-light</span> pre &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0.1</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.hope-ui-dark</span> pre &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, <span class="number">0</span>) <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    dibu &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">border-top</span>: <span class="number">0px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">bottom</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">margin</span>: <span class="number">0px</span>;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">padding</span>: <span class="number">0px</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.App</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">min-height</span>: <span class="number">85vh</span>;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-class">.table</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">margin</span>: auto;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">    * &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-family</span>: LXGW WenKai;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-weight</span>: bold;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css">    <span class="selector-tag">body</span> &#123;</span></span><br><span class="line"><span class="language-css">        <span class="attribute">font-family</span>: LXGW WenKai;</span></span><br><span class="line"><span class="language-css">    &#125;</span></span><br><span class="line"><span class="language-css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="这段代码主要做了什么"><a href="#这段代码主要做了什么" class="headerlink" title="这段代码主要做了什么"></a>这段代码主要做了什么</h3><p>可以简单理解为：</p><ul><li>先把原始底部隐藏</li><li>给页面铺上背景图</li><li>给内容卡片和导航区域加透明与模糊效果</li><li>调整白天 &#x2F; 夜间模式下的显示</li><li>全站切换到 <code>LXGW WenKai</code> 字体</li></ul><blockquote><p>[!WARNING]<br>这类基于类名的样式选择器，可能会随着 Alist 前端版本更新而失效，后续升级后如果样式不生效，需要重新检查选择器。</p></blockquote><hr><h2 id="📄-五、自定义内容代码"><a href="#📄-五、自定义内容代码" class="headerlink" title="📄 五、自定义内容代码"></a>📄 五、自定义内容代码</h2><p>把下面代码粘贴到“自定义内容”中：</p><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 延迟加载 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;customize&quot;</span> <span class="attr">style</span>=<span class="string">&quot;display: none;&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">center</span> <span class="attr">class</span>=<span class="string">&quot;dibu&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot; line-height: 20px;font-size: 9pt;font-weight: bold;&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span>&gt;</span></span><br><span class="line">                    &quot;</span><br><span class="line">                    <span class="tag">&lt;<span class="name">span</span> <span class="attr">style</span>=<span class="string">&quot;color: rgb(154, 216, 166); font-weight: bold;&quot;</span> <span class="attr">id</span>=<span class="string">&quot;hitokoto&quot;</span>&gt;</span></span><br><span class="line">                        <span class="tag">&lt;<span class="name">a</span> <span class="attr">href</span>=<span class="string">&quot;#&quot;</span> <span class="attr">id</span>=<span class="string">&quot;hitokoto_text&quot;</span>&gt;</span></span><br><span class="line">                            &quot;探索科技，启迪技能&quot;</span><br><span class="line">                        <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;/<span class="name">span</span>&gt;</span> &quot;</span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">&lt;!-- 底部链接 --&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">style</span>=<span class="string">&quot;font-size: 13px; font-weight: bold;&quot;</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;mailto:xiaoming@xmdblog.com&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>邮箱 |<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;www.xmdblog.com&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>博客 |<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;pan.xmdblog.com&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>云盘 |<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;/@manage&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>管理 |<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://github.com/Xhofe/alist&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span>Alist<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">span</span> <span class="attr">class</span>=<span class="string">&quot;nav-item&quot;</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">a</span> <span class="attr">class</span>=<span class="string">&quot;nav-link&quot;</span> <span class="attr">href</span>=<span class="string">&quot;https://beian.miit.gov.cn/#/Integrated/index&quot;</span> <span class="attr">target</span>=<span class="string">&quot;_blank&quot;</span>&gt;</span></span><br><span class="line">                        沪ICP备2024050492号-1</span><br><span class="line">                    <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">center</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">br</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://v1.hitokoto.cn/?encode=js&amp;select=%23hitokoto&quot;</span> <span class="attr">defer</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">    <span class="keyword">let</span> interval = <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;.footer&quot;</span>)) &#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&quot;#customize&quot;</span>).<span class="property">style</span>.<span class="property">display</span> = <span class="string">&quot;&quot;</span>;</span></span><br><span class="line"><span class="language-javascript">            <span class="built_in">clearInterval</span>(interval);</span></span><br><span class="line"><span class="language-javascript">        &#125;</span></span><br><span class="line"><span class="language-javascript">    &#125;, <span class="number">200</span>);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="这段代码负责什么"><a href="#这段代码负责什么" class="headerlink" title="这段代码负责什么"></a>这段代码负责什么</h3><p>它主要做了 3 件事：</p><ol><li>在底部插入自定义链接</li><li>显示备案信息</li><li>加载一言内容，让页面更生动</li></ol><hr><h2 id="🎨-六、你最值得优先改的内容"><a href="#🎨-六、你最值得优先改的内容" class="headerlink" title="🎨 六、你最值得优先改的内容"></a>🎨 六、你最值得优先改的内容</h2><p>如果你想把这套代码真正改成“自己的版本”，建议优先改下面这些地方：</p><h3 id="1-背景图片地址"><a href="#1-背景图片地址" class="headerlink" title="1. 背景图片地址"></a>1. 背景图片地址</h3><p>把：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">https://www.xmdblog.com/img/backgroud.jpeg</span><br></pre></td></tr></table></figure><p>替换成你自己的图片地址。</p><h3 id="2-邮箱、博客、云盘链接"><a href="#2-邮箱、博客、云盘链接" class="headerlink" title="2. 邮箱、博客、云盘链接"></a>2. 邮箱、博客、云盘链接</h3><p>把文中的示例链接改成你自己的：</p><ul><li>邮箱地址</li><li>博客首页地址</li><li>云盘地址</li><li>后台入口</li></ul><h3 id="3-备案号"><a href="#3-备案号" class="headerlink" title="3. 备案号"></a>3. 备案号</h3><p>如果你没有备案，可以删除备案部分；如果你有备案，请改成自己的备案号。</p><h3 id="4-一言内容风格"><a href="#4-一言内容风格" class="headerlink" title="4. 一言内容风格"></a>4. 一言内容风格</h3><p>如果你不喜欢随机句子，也可以把一言 API 去掉，换成固定文案。</p><hr><h2 id="🛠️-七、常见问题"><a href="#🛠️-七、常见问题" class="headerlink" title="🛠️ 七、常见问题"></a>🛠️ 七、常见问题</h2><h3 id="1-样式没生效"><a href="#1-样式没生效" class="headerlink" title="1. 样式没生效"></a>1. 样式没生效</h3><p>优先检查：</p><ul><li>代码是否放错位置</li><li>是否保存成功</li><li>浏览器缓存是否未刷新</li><li>Alist 版本更新后类名是否发生变化</li></ul><h3 id="2-背景图不显示"><a href="#2-背景图不显示" class="headerlink" title="2. 背景图不显示"></a>2. 背景图不显示</h3><p>优先检查：</p><ul><li>图片链接是否能直接访问</li><li>是否开启了防盗链</li><li>地址是否拼写错误</li></ul><h3 id="3-底部内容不显示"><a href="#3-底部内容不显示" class="headerlink" title="3. 底部内容不显示"></a>3. 底部内容不显示</h3><p>优先检查：</p><ul><li>自定义内容代码是否完整复制</li><li>页面是否成功找到 <code>.footer</code></li><li>是否有其他脚本冲突</li></ul><h3 id="4-夜间模式显示怪异"><a href="#4-夜间模式显示怪异" class="headerlink" title="4. 夜间模式显示怪异"></a>4. 夜间模式显示怪异</h3><p>说明部分颜色或透明度不够协调，可以单独调整：</p><ul><li><code>background-color</code></li><li><code>box-shadow</code></li><li><code>backdrop-filter</code></li></ul><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>这套 Alist 美化方案的重点不是“代码多”，而是思路清晰：</p><ol><li>用头部代码控制整体视觉</li><li>用自定义内容补充底部结构</li><li>用字体、背景、透明效果塑造统一风格</li><li>用一言和链接让页面更完整</li></ol><p>如果你只是想快速提升默认界面的观感，这一套已经够用；如果你还想继续深入，下一步可以进一步做：</p><ul><li>登录页单独美化</li><li>图标与配色统一</li><li>移动端细节适配</li><li>更精简、更稳的选择器重写</li></ul><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区交流：</p><ol><li>你更喜欢简洁风，还是这种毛玻璃氛围风？</li><li>你还想给 Alist 增加哪些视觉效果？</li><li>如果你愿意，我也可以继续帮你把这套代码再精简成更稳定、可维护的版本。</li></ol>]]></content>
    
    
    <summary type="html">详细介绍 Alist 网盘程序的美化和魔改方法，包括界面美化、功能增强等内容，并提供完整源码。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="网站建设" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/%E7%BD%91%E7%AB%99%E5%BB%BA%E8%AE%BE/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="美化" scheme="https://www.xmdblog.com/tags/%E7%BE%8E%E5%8C%96/"/>
    
    <category term="CSS" scheme="https://www.xmdblog.com/tags/CSS/"/>
    
    <category term="Alist" scheme="https://www.xmdblog.com/tags/Alist/"/>
    
  </entry>
  
  <entry>
    <title>⌨️ Windows 运行框有大作用</title>
    <link href="https://www.xmdblog.com/posts/99a46679.html"/>
    <id>https://www.xmdblog.com/posts/99a46679.html</id>
    <published>2024-11-05T09:10:40.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>Windows 运行框(Win+R)是一个强大的系统工具，通过它可以快速启动系统程序、打开系统设置等。本文将介绍一些常用的运行命令，帮助您提高工作效率。</p><blockquote><p>[!NOTE]<br>运行框可以通过快捷键 <code>Win + R</code> 快速打开。</p></blockquote><h2 id="✨-一、实际应用案例"><a href="#✨-一、实际应用案例" class="headerlink" title="✨ 一、实际应用案例"></a>✨ 一、实际应用案例</h2><p>最近遇到一个案例：一台电脑开机后黑屏，重启也一样，只有 Edge 搜索框和 360 还在桌面上。通过以下步骤成功解决：</p><ol><li>按 <code>Win + Shift + Esc</code> 打开任务管理器</li><li>发现找不到资源管理器进程</li><li>按 <code>Win + R</code> 打开运行框</li><li>输入 <code>explorer.exe</code> 并回车</li><li>成功恢复桌面显示</li></ol><h2 id="💻-二、常用运行命令"><a href="#💻-二、常用运行命令" class="headerlink" title="💻 二、常用运行命令"></a>💻 二、常用运行命令</h2><p>下面是一些常用的系统程序运行命令：</p><table><thead><tr><th>功能</th><th>命令</th><th>说明</th></tr></thead><tbody><tr><td>资源管理器</td><td>explorer.exe</td><td>系统文件管理器</td></tr><tr><td>任务管理器</td><td>taskmgr.exe</td><td>查看系统进程和性能</td></tr><tr><td>注册表编辑器</td><td>regedit.exe</td><td>修改系统注册表</td></tr><tr><td>本地安全策略</td><td>secpol.exe</td><td>管理系统安全策略</td></tr><tr><td>设备管理器</td><td>devmgmt.msc</td><td>管理硬件设备</td></tr><tr><td>控制面板</td><td>control.exe</td><td>系统设置中心</td></tr><tr><td>显示设置</td><td>desk.cpl</td><td>调整显示器和分辨率设置</td></tr><tr><td>磁盘管理</td><td>diskmgmt.msc</td><td>管理硬盘分区</td></tr><tr><td>系统服务</td><td>services.msc</td><td>管理系统服务</td></tr></tbody></table><blockquote><p>[!TIP]<br>这些命令都可以通过运行框快速访问，无需在系统中查找对应程序。</p></blockquote><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>Windows 运行框不仅可以快速启动程序，还能在系统出现问题时帮助我们快速定位和解决问题。建议记住常用的命令，可以大大提高工作效率。</p><blockquote><p>[!WARNING]<br>修改系统设置时请谨慎操作，建议提前备份重要数据。</p></blockquote><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论：</p><ol><li>您知道其他实用的运行命令吗？</li><li>您是否用运行框解决过系统问题？</li></ol>]]></content>
    
    
    <summary type="html">介绍 Windows 运行框(Win+R)的实用命令，帮助用户快速启动系统程序和解决常见问题。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Windows技巧" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Windows%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="系统技巧" scheme="https://www.xmdblog.com/tags/%E7%B3%BB%E7%BB%9F%E6%8A%80%E5%B7%A7/"/>
    
    <category term="Win+R" scheme="https://www.xmdblog.com/tags/Win-R/"/>
    
    <category term="Windows" scheme="https://www.xmdblog.com/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>🛠️ VSCode 报错“此系统上禁止运行脚本”</title>
    <link href="https://www.xmdblog.com/posts/c743088a.html"/>
    <id>https://www.xmdblog.com/posts/c743088a.html</id>
    <published>2024-09-12T12:22:44.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>在使用 VSCode 时可能会遇到”此系统上禁止运行脚本”的错误提示，这是由于 Windows 默认的 PowerShell 执行策略限制导致的。</p><h2 id="🛠️-解决方法"><a href="#🛠️-解决方法" class="headerlink" title="🛠️ 解决方法"></a>🛠️ 解决方法</h2><h3 id="💡-1-打开-Windows-设置"><a href="#💡-1-打开-Windows-设置" class="headerlink" title="💡 1. 打开 Windows 设置"></a>💡 1. 打开 Windows 设置</h3><p>使用快捷键 <code>WIN + I</code> 打开 Windows 设置。</p><h3 id="💡-2-修改执行策略"><a href="#💡-2-修改执行策略" class="headerlink" title="💡 2. 修改执行策略"></a>💡 2. 修改执行策略</h3><p><img src="/img/posts/c743088a/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE2024-09-12.png" alt="Windows PowerShell 执行策略设置"></p><blockquote><p>[!TIP]<br>也可以通过 PowerShell 命令修改执行策略:</p><figure class="highlight powershell"><table><tr><td class="code"><pre><span class="line"><span class="built_in">Set-ExecutionPolicy</span> RemoteSigned</span><br></pre></td></tr></table></figure></blockquote><h3 id="✅-3-验证设置"><a href="#✅-3-验证设置" class="headerlink" title="✅ 3. 验证设置"></a>✅ 3. 验证设置</h3><p>设置完成后，重启 VSCode 验证问题是否解决。</p><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>通过修改 Windows PowerShell 的执行策略，我们解决了 VSCode 无法运行脚本的问题。这个设置不会影响系统安全性，但可以让开发工作更顺畅。</p><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论:</p><ol><li>您是否遇到过类似问题？</li><li>还有什么 VSCode 使用问题需要解决？</li></ol>]]></content>
    
    
    <summary type="html">解决 VSCode 在 Windows 系统上提示&quot;此系统上禁止运行脚本&quot;的问题。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="问题解决" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="VSCode" scheme="https://www.xmdblog.com/tags/VSCode/"/>
    
    <category term="Windows" scheme="https://www.xmdblog.com/tags/Windows/"/>
    
    <category term="PowerShell" scheme="https://www.xmdblog.com/tags/PowerShell/"/>
    
  </entry>
  
  <entry>
    <title>🧩 front-matter 介绍与写法说明</title>
    <link href="https://www.xmdblog.com/posts/2ebce51e.html"/>
    <id>https://www.xmdblog.com/posts/2ebce51e.html</id>
    <published>2024-06-18T08:42:24.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>Front-matter 是 Markdown 文件最上方以 <code>---</code> 分隔的配置区域，用于给页面或文章声明标题、时间、标签、封面、描述等元信息。掌握它之后，你会更容易把 Hexo 文章写得更规范，也更利于 SEO 与主题展示。</p><ul><li>Page Front-matter 用于配置页面</li><li>Post Front-matter 用于配置文章</li></ul><blockquote><p>[!NOTE]</p><p>如果标注的参数，可根据自己需要添加，不用全部都写在 markdown 里</p></blockquote><h2 id="📄-一、Page-Front-matter-字段说明"><a href="#📄-一、Page-Front-matter-字段说明" class="headerlink" title="📄 一、Page Front-matter 字段说明"></a>📄 一、Page Front-matter 字段说明</h2><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">---</span><br><span class="line">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">type:</span><br><span class="line">comments:</span><br><span class="line">description:</span><br><span class="line">keywords:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aside:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line"><span class="section">random:</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>写法</th><th align="left">解释</th></tr></thead><tbody><tr><td>title</td><td align="left">【必需】页面标题</td></tr><tr><td>date</td><td align="left">【必需】页面创建日期</td></tr><tr><td>type</td><td align="left">【必需】标签、分类和友情链接三个页面需要配置</td></tr><tr><td>updated</td><td align="left">【可选】页面更新日期</td></tr><tr><td>description</td><td align="left">【可选】页面描述</td></tr><tr><td>keywords</td><td align="left">【可选】页面关键词</td></tr><tr><td>comments</td><td align="left">【可选】显示页面评论模块 （默认 true）</td></tr><tr><td>top_img</td><td align="left">【可选】页面顶部图片</td></tr><tr><td>mathjax</td><td align="left">【可选】显示mathjax （当设置mathjax的per_page： false时，才需要配置，默认 false）</td></tr><tr><td>katex</td><td align="left">【可选】显示katex （当设置katex的per_page： false时，才需要配置，默认 false）</td></tr><tr><td>aside</td><td align="left">【可选】显示侧边栏 （默认 true）</td></tr><tr><td>aplayer</td><td align="left">【可选】在需要的页面加载aplayer的js和css，请参考文章下面的 配置音乐</td></tr><tr><td>highlight_shrink</td><td align="left">【可选】配置代码框是否展开 （true&#x2F;false） （默认为设置中highlight_shrink的配置）</td></tr><tr><td>random</td><td align="left">【可选】配置友情链接是否随机排序（默认为 false）</td></tr></tbody></table><h2 id="🧩-二、Post-Front-matter-字段说明"><a href="#🧩-二、Post-Front-matter-字段说明" class="headerlink" title="🧩 二、Post Front-matter 字段说明"></a>🧩 二、Post Front-matter 字段说明</h2><figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">---</span><br><span class="line">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">tags:</span><br><span class="line">categories:</span><br><span class="line">keywords:</span><br><span class="line">description:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">comments:</span></span><br><span class="line"><span class="emphasis">cover:</span></span><br><span class="line"><span class="emphasis">toc:</span></span><br><span class="line"><span class="emphasis">toc_</span>number:</span><br><span class="line">toc<span class="emphasis">_style_</span>simple:</span><br><span class="line">copyright:</span><br><span class="line">copyright<span class="emphasis">_author:</span></span><br><span class="line"><span class="emphasis">copyright_</span>author<span class="emphasis">_href:</span></span><br><span class="line"><span class="emphasis">copyright_</span>url:</span><br><span class="line">copyright<span class="emphasis">_info:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line">aside:</span><br><span class="line"><span class="section">abcjs:</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>写法</th><th>解释</th></tr></thead><tbody><tr><td>title</td><td>【必需】文章标题</td></tr><tr><td>date</td><td>【必需】文章创建日期</td></tr><tr><td>updated</td><td>【可选】文章更新日期</td></tr><tr><td>tags</td><td>【可选】文章标签</td></tr><tr><td>categories</td><td>【可选】文章分类</td></tr><tr><td>keywords</td><td>【可选】文章关键词</td></tr><tr><td>description</td><td>【可选】文章描述</td></tr><tr><td>top_img</td><td>【可选】文章顶部图片</td></tr><tr><td>cover</td><td>【可选】文章缩略图（如果没有设置top_img，文章页顶部将显示缩略图，可设为false&#x2F;图片地址&#x2F;留空）</td></tr><tr><td>comments</td><td>【可选】显示文章评论模块（默认 true）</td></tr><tr><td>toc</td><td>【可选】显示文章TOC（默认为设置中toc的enable配置）</td></tr><tr><td>toc_number</td><td>【可选】显示toc_number（默认为设置中toc的number配置）</td></tr><tr><td>toc_style_simple</td><td>【可选】显示 toc 简洁模式</td></tr><tr><td>copyright</td><td>【可选】显示文章版权模块（默认为设置中post_copyright的enable配置）</td></tr><tr><td>copyright_author</td><td>【可选】文章版权模块的文章作者</td></tr><tr><td>copyright_author_href</td><td>【可选】文章版权模块的链接文章作者</td></tr><tr><td>copyright_url</td><td>【可选】文章版权模块的链接文章链接</td></tr><tr><td>copyright_info</td><td>【可选】文章版权模块的文字版权声明</td></tr><tr><td>mathjax</td><td>【可选】显示mathjax（当设置 mathjax 的 per_page： false 时，才需要配置，默认 false ）</td></tr><tr><td>katex</td><td>【可选】显示 katex （当设置 katex 的 per_page： false 时，才需要配置，默认 false ）</td></tr><tr><td>aplayer</td><td>【可选】在需要的页面加载 aplayer 的 js 和 css</td></tr><tr><td>highlight_shrink</td><td>【可选】配置代码框是否展开（true&#x2F;false）（默认为设置中 highlight_shrink 的配置）</td></tr><tr><td>aside</td><td>【可选】显示侧边栏 （默认 true）</td></tr><tr><td>abcjs</td><td>【可选】加载 abcjs （当设置 abcjs 的 per_page： false 时，才需要配置，默认 false ）</td></tr></tbody></table><h2 id="📌-总结"><a href="#📌-总结" class="headerlink" title="📌 总结"></a>📌 总结</h2><p>Front-matter 可以理解为 Hexo 文章与页面的“配置入口”。只要掌握常用字段的用途，你就能更轻松地管理文章标题、分类、标签、封面、描述与显示效果。建议平时整理一份自己的 Front-matter 模板，后续写作会高效很多。</p><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区交流：</p><ol><li>你最常用的 Front-matter 字段有哪些？</li><li>你更想了解页面配置还是文章配置？</li><li>还想看哪些 Hexo 写作规范相关内容？</li></ol>]]></content>
    
    
    <summary type="html">详细介绍Hexo博客front-matter的配置和使用方法。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hexo教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Hexo%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="Hexo" scheme="https://www.xmdblog.com/tags/Hexo/"/>
    
    <category term="Markdown" scheme="https://www.xmdblog.com/tags/Markdown/"/>
    
    <category term="front-matter" scheme="https://www.xmdblog.com/tags/front-matter/"/>
    
  </entry>
  
  <entry>
    <title>✍️ Typora：超好用的 Markdown 编辑器</title>
    <link href="https://www.xmdblog.com/posts/c6c552a3.html"/>
    <id>https://www.xmdblog.com/posts/c6c552a3.html</id>
    <published>2024-06-18T08:42:24.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>接触前端的人一定知道 Markdown，这是一种轻量级标记语言，被广泛用于撰写帮助文档、论坛消息和博客文章。Typora 让 Markdown 写作变得简单优雅。</p><blockquote><p>[!NOTE]<br>Markdown 已成为 GitHub、SourceForge 等平台的标准写作格式。</p></blockquote><hr><h2 id="✨-一、为什么选择-Typora"><a href="#✨-一、为什么选择-Typora" class="headerlink" title="✨ 一、为什么选择 Typora"></a>✨ 一、为什么选择 Typora</h2><h3 id="💡-1-简单易用"><a href="#💡-1-简单易用" class="headerlink" title="💡 1. 简单易用"></a>💡 1. 简单易用</h3><p><img src="/img/posts/c6c552a3/image-20240618110650379.png" alt="Typora界面"></p><p>特点：</p><ul><li>所见即所写(WYSIWYG)编辑模式</li><li>清爽的界面设计</li><li>无需记忆复杂语法</li></ul><h3 id="✨-2-强大的功能"><a href="#✨-2-强大的功能" class="headerlink" title="✨ 2. 强大的功能"></a>✨ 2. 强大的功能</h3><p>以表格为例，无需手动编写复杂的语法：</p><p><img src="/img/posts/c6c552a3/image-20240618111208684.png" alt="表格编辑"></p><p>支持的功能：</p><ul><li>表格编辑</li><li>图片插入</li><li>数学公式</li><li>代码高亮</li><li>目录生成</li><li>多种导出格式</li></ul><hr><h2 id="🛠️-二、如何用-Typora-写-Hexo-文章"><a href="#🛠️-二、如何用-Typora-写-Hexo-文章" class="headerlink" title="🛠️ 二、如何用 Typora 写 Hexo 文章"></a>🛠️ 二、如何用 Typora 写 Hexo 文章</h2><h3 id="💡-1-创建文章"><a href="#💡-1-创建文章" class="headerlink" title="💡 1. 创建文章"></a>💡 1. 创建文章</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 在博客根目录运行</span></span><br><span class="line">hexo new &lt;文章标题&gt;</span><br></pre></td></tr></table></figure><h3 id="💡-2-编辑文章"><a href="#💡-2-编辑文章" class="headerlink" title="💡 2. 编辑文章"></a>💡 2. 编辑文章</h3><ol><li>打开 Typora</li><li>编辑 front-matter</li><li>撰写文章内容</li><li>复制到 Hexo 文章中</li></ol><p><img src="/img/posts/c6c552a3/image-20240618163200746.png" alt="编辑示例"></p><blockquote><p>[!TIP]<br>关于 front-matter 的详细说明，可以参考<a href="/posts/2ebce51e.html">这篇文章</a></p></blockquote><hr><h2 id="🛒-三、关于购买"><a href="#🛒-三、关于购买" class="headerlink" title="🛒 三、关于购买"></a>🛒 三、关于购买</h2><h3 id="🛒-官方购买"><a href="#🛒-官方购买" class="headerlink" title="🛒 官方购买"></a>🛒 官方购买</h3><ul><li>官网：<a href="https://typoraio.cn/">Typora 官方中文站</a></li><li>价格：80 RMB (荔枝软件商店)</li></ul><h3 id="💡-免费替代方案"><a href="#💡-免费替代方案" class="headerlink" title="💡 免费替代方案"></a>💡 免费替代方案</h3><p>如果预算有限，可以考虑：</p><ul><li><a href="https://www.marktext.cc/">MarkText</a>：开源免费</li><li><a href="https://code.visualstudio.com/">VSCode + Markdown 插件</a>：功能丰富</li></ul><blockquote><p>[!NOTE]<br>个人建议支持正版 Typora，物有所值。</p></blockquote><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>Typora 是一款优秀的 Markdown 编辑器：</p><ul><li>界面简洁优雅</li><li>功能强大实用</li><li>适合写作分享</li><li>值得投资购买</li></ul><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论：</p><ol><li>您使用过哪些 Markdown 编辑器？</li><li>对 Typora 有什么使用建议？</li></ol>]]></content>
    
    
    <summary type="html">介绍 Typora 这款优秀的 Markdown 编辑器，包括其特点、使用方法和购买建议。</summary>
    
    
    
    <category term="软件分享" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/"/>
    
    <category term="写作工具" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/%E5%86%99%E4%BD%9C%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="写作工具" scheme="https://www.xmdblog.com/tags/%E5%86%99%E4%BD%9C%E5%B7%A5%E5%85%B7/"/>
    
    <category term="Typora" scheme="https://www.xmdblog.com/tags/Typora/"/>
    
    <category term="Markdown" scheme="https://www.xmdblog.com/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>🪄 Windows 11 跳过 OOBE（联网激活）</title>
    <link href="https://www.xmdblog.com/posts/1fcd9f39.html"/>
    <id>https://www.xmdblog.com/posts/1fcd9f39.html</id>
    <published>2024-06-11T14:38:24.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>在安装 Windows 11 时，系统会要求完成 OOBE（开箱体验）设置并联网激活。本文介绍一个简单有效的方法来跳过这些步骤，特别适合虚拟机安装场景。</p><blockquote><p>[!NOTE]<br>OOBE (Out-Of-Box Experience) 是微软为新用户设计的初始化设置向导。</p></blockquote><hr><h2 id="🛠️-一、解决方法"><a href="#🛠️-一、解决方法" class="headerlink" title="🛠️ 一、解决方法"></a>🛠️ 一、解决方法</h2><blockquote><p>[!IMPORTANT]<br>请注意：在 Windows 11 最新版本中，部分旧方法可能已不再适用。建议优先尝试以下最新方法。</p></blockquote><h3 id="💻-1-打开命令提示符"><a href="#💻-1-打开命令提示符" class="headerlink" title="💻 1. 打开命令提示符"></a>💻 1. 打开命令提示符</h3><p>在 OOBE 界面按下快捷键:</p><ul><li>普通键盘: <code>Shift + F10</code></li><li>笔记本键盘: <code>Shift + Fn + F10</code></li></ul><h3 id="💻-2-执行跳过命令"><a href="#💻-2-执行跳过命令" class="headerlink" title="💻 2. 执行跳过命令"></a>💻 2. 执行跳过命令</h3><p>在打开的命令提示符(CMD)窗口中输入:</p><figure class="highlight cmd"><table><tr><td class="code"><pre><span class="line">OOBE\BYPASSNRO</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>执行命令后系统会自动重启并跳过 OOBE 设置。</p></blockquote><h3 id="🛠️-3-通过注册表修改（究极方法）"><a href="#🛠️-3-通过注册表修改（究极方法）" class="headerlink" title="🛠️ 3. 通过注册表修改（究极方法）"></a>🛠️ 3. 通过注册表修改（究极方法）</h3><p>如果上述方法无效，可以尝试通过修改注册表的方式：</p><ol><li><p>在 OOBE 界面按下快捷键打开命令提示符：</p><ul><li>普通键盘: <code>Shift + F10</code></li><li>笔记本键盘: <code>Shift + Fn + F10</code></li></ul></li><li><p>在命令提示符窗口中输入：</p></li></ol><figure class="highlight cmd"><table><tr><td class="code"><pre><span class="line">regedit</span><br></pre></td></tr></table></figure><ol start="3"><li>在注册表编辑器中依次导航到：</li></ol><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE</span><br></pre></td></tr></table></figure><ol start="4"><li>在右侧空白处右键，选择：<ul><li>新建 -&gt; DWORD (32 位)值(D)</li><li>将新建的值命名为：<code>BypassNRO</code></li><li>双击该值，将数值数据修改为 <code>1</code></li></ul></li></ol><p><img src="https://imgbed.xmdblog.com/file/lItgq0Ze.png" alt="image.png"></p><ol start="5"><li>完成后在命令提示符窗口输入：</li></ol><figure class="highlight cmd"><table><tr><td class="code"><pre><span class="line">logoff</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>执行完这些步骤后，系统将跳过联网登录账号提示。</p></blockquote><h3 id="🛠️-4-脚本自动化方法（推荐批量使用）"><a href="#🛠️-4-脚本自动化方法（推荐批量使用）" class="headerlink" title="🛠️ 4. 脚本自动化方法（推荐批量使用）"></a>🛠️ 4. 脚本自动化方法（推荐批量使用）</h3><p>如果您经常需要安装系统并跳过 OOBE，可以准备一个自动化脚本：</p><ol><li>在 U 盘根目录创建文件 <code>SkipOOBE.bat</code>，写入以下内容：</li></ol><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">@echo off</span><br><span class="line">reg add &quot;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\OOBE&quot; /v &quot;BypassNRO&quot; /t REG_DWORD /d &quot;1&quot; /f</span><br><span class="line">logoff</span><br></pre></td></tr></table></figure><ol start="2"><li>使用方法：<ul><li>在 OOBE 界面按下 <code>Shift + F10</code>（笔记本可能需要 <code>Shift + Fn + F10</code>）打开命令提示符</li><li>确认 U 盘盘符（例如输入 <code>dir d:</code> 查看是否是 D 盘）</li><li>执行脚本（假设 U 盘是 D 盘）：</li></ul></li></ol><figure class="highlight cmd"><table><tr><td class="code"><pre><span class="line"><span class="function">d:</span></span><br><span class="line"><span class="function"><span class="title">SkipOOBE.bat</span></span></span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]</p><ul><li>将脚本保存在 U 盘中，可以随时携带使用</li><li>建议将 U 盘格式化为 FAT32 格式，确保最大兼容性</li><li>如果找不到 U 盘盘符，可以用 <code>diskpart</code> 命令查看：输入 <code>diskpart</code> 回车，然后输入 <code>list volume</code> 即可查看所有盘符</li></ul></blockquote><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>这个方法具有以下优点:</p><ul><li>操作简单快捷</li><li>无需第三方工具</li><li>适用于所有 Windows 11 版本</li><li>不会影响系统功能</li></ul><blockquote><p>[!WARNING]<br>跳过 OOBE 后，您可能需要手动配置一些系统设置。</p></blockquote><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论:</p><ol><li>您在安装 Windows 11 时遇到过什么问题？</li><li>还有什么 Windows 11 使用技巧想了解？</li></ol>]]></content>
    
    
    <summary type="html">介绍如何在 Windows 11 安装过程中跳过 OOBE（开箱体验）和联网激活步骤的方法。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Windows技巧" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Windows%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="OOBE" scheme="https://www.xmdblog.com/tags/OOBE/"/>
    
    <category term="系统安装" scheme="https://www.xmdblog.com/tags/%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85/"/>
    
    <category term="Windows 11" scheme="https://www.xmdblog.com/tags/Windows-11/"/>
    
  </entry>
  
  <entry>
    <title>🌐 Hexo 博客搭建教程</title>
    <link href="https://www.xmdblog.com/posts/70db7d7c.html"/>
    <id>https://www.xmdblog.com/posts/70db7d7c.html</id>
    <published>2024-03-21T14:11:06.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>如果你想快速拥有一个属于自己的博客，但又不想折腾传统动态网站，那么 Hexo 会是非常适合入门的选择。它是一个轻量、速度快、生态成熟的静态博客框架，配合 GitHub Pages、Vercel 等平台，可以低成本完成发布。</p><blockquote><p>[!TIP]<br>如果你还想把博客部署到服务器，可以继续阅读站内另一篇教程：<a href="/posts/e039465e.html"><code>/posts/e039465e.html</code></a>。</p></blockquote><hr><h2 id="🎯-一、这篇教程你将完成什么"><a href="#🎯-一、这篇教程你将完成什么" class="headerlink" title="🎯 一、这篇教程你将完成什么"></a>🎯 一、这篇教程你将完成什么</h2><p>学完这篇文章后，你可以完成以下事情：</p><ol><li>安装 Hexo 所需环境</li><li>初始化一个全新的博客项目</li><li>本地预览博客效果</li><li>安装并配置主题</li><li>部署到 GitHub Pages</li><li>可选部署到 Vercel</li></ol><blockquote><p>[!NOTE]<br>本文更适合第一次接触 Hexo 的新手，尽量按顺序操作，不建议跳步。</p></blockquote><hr><h2 id="🔧-二、环境准备"><a href="#🔧-二、环境准备" class="headerlink" title="🔧 二、环境准备"></a>🔧 二、环境准备</h2><h3 id="1-安装-Node-js"><a href="#1-安装-Node-js" class="headerlink" title="1. 安装 Node.js"></a>1. 安装 Node.js</h3><p>Node.js 是 Hexo 的运行环境，必须先安装。</p><p>操作步骤：</p><ol><li>打开 <a href="https://nodejs.org/en">Node.js 官网</a></li><li>下载 LTS 稳定版</li><li>按默认选项完成安装</li><li>打开命令提示符验证版本</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">node -v</span><br></pre></td></tr></table></figure><p>如果能正常输出版本号，就说明安装成功。</p><p>为了提升依赖安装速度，建议顺手切换 npm 镜像源：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmmirror.com</span><br></pre></td></tr></table></figure><h3 id="2-安装-Git"><a href="#2-安装-Git" class="headerlink" title="2. 安装 Git"></a>2. 安装 Git</h3><p>Git 用于管理博客源码，也用于后续部署。</p><p>操作步骤：</p><ol><li>打开 <a href="https://git-scm.com/downloads">Git 官网下载页</a></li><li>按默认选项完成安装</li><li>安装后执行以下命令确认是否正常</li></ol><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git --version</span><br></pre></td></tr></table></figure><h3 id="3-安装-Hexo-CLI"><a href="#3-安装-Hexo-CLI" class="headerlink" title="3. 安装 Hexo CLI"></a>3. 安装 Hexo CLI</h3><p>环境准备完成后，安装 Hexo 命令行工具：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br></pre></td></tr></table></figure><p>安装完成后，检查版本：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo -v</span><br></pre></td></tr></table></figure><h3 id="4-配置-GitHub-账号信息"><a href="#4-配置-GitHub-账号信息" class="headerlink" title="4. 配置 GitHub 账号信息"></a>4. 配置 GitHub 账号信息</h3><p>如果你打算部署到 GitHub Pages，建议先配置全局 Git 用户信息：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git config --global user.name &lt;你的用户名&gt;</span><br><span class="line">git config --global user.email &lt;你的邮箱&gt;</span><br></pre></td></tr></table></figure><p>查看是否配置成功：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">git config -l</span><br></pre></td></tr></table></figure><h3 id="5-配置-SSH-连接-GitHub"><a href="#5-配置-SSH-连接-GitHub" class="headerlink" title="5. 配置 SSH 连接 GitHub"></a>5. 配置 SSH 连接 GitHub</h3><p>为了后续推送代码更方便，建议配置 SSH：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh-keygen -t rsa -C &lt;你的邮箱&gt;</span><br></pre></td></tr></table></figure><p>一路回车后，打开用户目录下的 <code>.ssh</code> 文件夹，复制 <code>id_rsa.pub</code> 内容，添加到 GitHub：</p><p><code>头像 → Settings → SSH and GPG keys → New SSH key</code></p><p>添加完成后测试连接：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>首次连接时看到确认提示，输入 <code>yes</code> 即可。</p></blockquote><hr><h2 id="🚀-三、新建-Hexo-项目"><a href="#🚀-三、新建-Hexo-项目" class="headerlink" title="🚀 三、新建 Hexo 项目"></a>🚀 三、新建 Hexo 项目</h2><p>环境安装完成后，就可以正式创建博客了。</p><h3 id="1-初始化项目"><a href="#1-初始化项目" class="headerlink" title="1. 初始化项目"></a>1. 初始化项目</h3><p>在你想放置博客的位置打开终端，执行：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo init &lt;项目名&gt;</span><br><span class="line"><span class="built_in">cd</span> &lt;项目名&gt;</span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo init my-blog</span><br><span class="line"><span class="built_in">cd</span> my-blog</span><br></pre></td></tr></table></figure><h3 id="2-安装依赖"><a href="#2-安装依赖" class="headerlink" title="2. 安装依赖"></a>2. 安装依赖</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm i</span><br></pre></td></tr></table></figure><p>安装完成后，一个基础的 Hexo 博客就已经创建好了。</p><hr><h2 id="👀-四、本地预览博客"><a href="#👀-四、本地预览博客" class="headerlink" title="👀 四、本地预览博客"></a>👀 四、本地预览博客</h2><p>为了先确认博客能正常运行，建议先进行本地预览。</p><h3 id="1-生成静态文件"><a href="#1-生成静态文件" class="headerlink" title="1. 生成静态文件"></a>1. 生成静态文件</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo generate</span><br></pre></td></tr></table></figure><h3 id="2-启动本地服务"><a href="#2-启动本地服务" class="headerlink" title="2. 启动本地服务"></a>2. 启动本地服务</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo server</span><br></pre></td></tr></table></figure><p>浏览器打开：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">http://localhost:4000/</span><br></pre></td></tr></table></figure><p>如果页面能正常打开，就说明博客已经运行成功。</p><blockquote><p>[!NOTE]<br>常用缩写命令也可以记一下：<code>hexo cl</code>、<code>hexo g</code>、<code>hexo s</code>。</p></blockquote><hr><h2 id="⚙️-五、了解基础目录结构"><a href="#⚙️-五、了解基础目录结构" class="headerlink" title="⚙️ 五、了解基础目录结构"></a>⚙️ 五、了解基础目录结构</h2><p>新手最容易迷糊的就是项目目录，下面这几个位置最常用：</p><ul><li><code>_config.yml</code>：Hexo 全局配置文件</li><li><code>source/_posts/</code>：文章存放目录</li><li><code>themes/</code>：主题目录</li><li><code>public/</code>：生成后的静态文件目录</li><li><code>scaffolds/</code>：文章模板目录</li></ul><p>其中你最常接触的通常是：</p><ol><li>写文章：<code>source/_posts/</code></li><li>改站点信息：<code>_config.yml</code></li><li>改主题样式：主题目录</li></ol><hr><h2 id="🎨-六、安装与配置主题"><a href="#🎨-六、安装与配置主题" class="headerlink" title="🎨 六、安装与配置主题"></a>🎨 六、安装与配置主题</h2><p>默认主题能用，但不够好看。大多数人都会换成更适合博客展示的主题。</p><h3 id="1-选择主题"><a href="#1-选择主题" class="headerlink" title="1. 选择主题"></a>1. 选择主题</h3><p>如果你想快速做出更完整的个人博客，推荐优先看成熟主题文档，例如：</p><ul><li><a href="https://butterfly.js.org/posts/21cfbf15/">Butterfly 主题</a></li></ul><h3 id="2-安装主题"><a href="#2-安装主题" class="headerlink" title="2. 安装主题"></a>2. 安装主题</h3><p>不同主题安装方式略有不同，一定要以该主题官方文档为准。</p><h3 id="3-修改主题配置"><a href="#3-修改主题配置" class="headerlink" title="3. 修改主题配置"></a>3. 修改主题配置</h3><p>一般会涉及两个部分：</p><ul><li>Hexo 全局配置 <code>_config.yml</code></li><li>主题自己的配置文件</li></ul><blockquote><p>[!WARNING]<br>主题文档一定要认真看，很多“页面空白”“样式错乱”“文章不显示”问题，往往都是配置漏改导致的。</p></blockquote><hr><h2 id="🌐-七、部署到-GitHub-Pages"><a href="#🌐-七、部署到-GitHub-Pages" class="headerlink" title="🌐 七、部署到 GitHub Pages"></a>🌐 七、部署到 GitHub Pages</h2><p>如果你希望博客免费上线，GitHub Pages 是非常常见的方案。</p><h3 id="1-创建仓库"><a href="#1-创建仓库" class="headerlink" title="1. 创建仓库"></a>1. 创建仓库</h3><p>在 GitHub 创建一个仓库，仓库名格式必须为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">&lt;用户名&gt;.github.io</span><br></pre></td></tr></table></figure><p>例如你的用户名是 <code>xiaoming</code>，仓库名就必须叫：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">xiaoming.github.io</span><br></pre></td></tr></table></figure><h3 id="2-安装部署插件"><a href="#2-安装部署插件" class="headerlink" title="2. 安装部署插件"></a>2. 安装部署插件</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><h3 id="3-修改部署配置"><a href="#3-修改部署配置" class="headerlink" title="3. 修改部署配置"></a>3. 修改部署配置</h3><p>打开根目录下的 <code>_config.yml</code>，添加或修改 <code>deploy</code>：</p><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repository:</span> <span class="string">git@github.com:&lt;用户名&gt;/&lt;用户名&gt;.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">main</span></span><br></pre></td></tr></table></figure><h3 id="4-执行部署"><a href="#4-执行部署" class="headerlink" title="4. 执行部署"></a>4. 执行部署</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo clean</span><br><span class="line">hexo generate</span><br><span class="line">hexo deploy</span><br></pre></td></tr></table></figure><p>如果终端出现 <code>Deploy done</code>，说明部署成功。</p><p>稍等一会儿后，访问：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">https://&lt;用户名&gt;.github.io</span><br></pre></td></tr></table></figure><p>就可以看到你的博客了。</p><hr><h2 id="☁️-八、可选部署到-Vercel"><a href="#☁️-八、可选部署到-Vercel" class="headerlink" title="☁️ 八、可选部署到 Vercel"></a>☁️ 八、可选部署到 Vercel</h2><p>除了 GitHub Pages，也可以把 Hexo 部署到 Vercel。</p><h3 id="适合人群"><a href="#适合人群" class="headerlink" title="适合人群"></a>适合人群</h3><ul><li>想要更简单的可视化部署</li><li>想绑定自己的域名</li><li>想后续继续扩展更多项目</li></ul><h3 id="大致流程"><a href="#大致流程" class="headerlink" title="大致流程"></a>大致流程</h3><ol><li>登录 <a href="https://vercel.com/">Vercel 官网</a></li><li>使用 GitHub 账号授权登录</li><li>导入你的 Hexo 仓库</li><li>点击部署</li><li>在后台绑定域名</li></ol><blockquote><p>[!TIP]<br>如果你的博客源码已经放在 GitHub，Vercel 的接入通常会非常顺手。</p></blockquote><hr><h2 id="🧩-九、常见问题"><a href="#🧩-九、常见问题" class="headerlink" title="🧩 九、常见问题"></a>🧩 九、常见问题</h2><h3 id="1-运行命令提示找不到-hexo"><a href="#1-运行命令提示找不到-hexo" class="headerlink" title="1. 运行命令提示找不到 hexo"></a>1. 运行命令提示找不到 <code>hexo</code></h3><p>通常是 <code>hexo-cli</code> 没安装成功，重新执行：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br></pre></td></tr></table></figure><h3 id="2-本地能看，部署后样式丢失"><a href="#2-本地能看，部署后样式丢失" class="headerlink" title="2. 本地能看，部署后样式丢失"></a>2. 本地能看，部署后样式丢失</h3><p>优先检查：</p><ul><li><code>_config.yml</code> 中的 <code>url</code></li><li><code>root</code> 配置</li><li>主题静态资源路径</li></ul><h3 id="3-推送-GitHub-失败"><a href="#3-推送-GitHub-失败" class="headerlink" title="3. 推送 GitHub 失败"></a>3. 推送 GitHub 失败</h3><p>优先检查：</p><ul><li>SSH 是否配置成功</li><li>仓库地址是否写对</li><li>GitHub 仓库分支是否为 <code>main</code></li></ul><h3 id="4-端口被占用"><a href="#4-端口被占用" class="headerlink" title="4. 端口被占用"></a>4. 端口被占用</h3><p>如果 <code>4000</code> 端口被占用，可以换端口启动：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo server -p 4001</span><br></pre></td></tr></table></figure><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>Hexo 的建站流程并不复杂，你只需要记住这条主线：</p><ol><li>安装 Node.js、Git、Hexo</li><li>初始化博客项目</li><li>本地预览</li><li>安装主题</li><li>部署到 GitHub Pages 或 Vercel</li></ol><p>等你把这套流程跑通后，后面要做的更多是内容建设、页面美化和 SEO 优化，而不是反复折腾环境。</p><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区交流：</p><ol><li>你是准备用 Hexo 做个人博客，还是知识记录站？</li><li>你更喜欢部署到 GitHub Pages，还是 Vercel？</li><li>如果你卡在某一步，也可以留言，我再帮你继续拆解。</li></ol>]]></content>
    
    
    <summary type="html">详细介绍如何搭建 Hexo 博客，包括环境配置、主题安装、部署等完整步骤。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hexo教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Hexo%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="Hexo" scheme="https://www.xmdblog.com/tags/Hexo/"/>
    
    <category term="博客搭建" scheme="https://www.xmdblog.com/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
  </entry>
  
  <entry>
    <title>🐧 Linux 常用命令汇总</title>
    <link href="https://www.xmdblog.com/posts/758d5779.html"/>
    <id>https://www.xmdblog.com/posts/758d5779.html</id>
    <published>2024-02-23T17:35:38.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>Linux 命令很多，但真正高频使用的通常集中在关机重启、权限设置、文件目录管理、用户管理、磁盘操作与软件管理这些场景。与其一次性死记硬背所有命令，不如先把最常用、最容易碰到的那批掌握下来。</p><p>这篇文章整理成一份偏“速查 + 入门说明”的结构，适合：</p><ul><li>刚接触 Linux 的新手</li><li>需要临时查命令的用户</li><li>想建立基础命令体系的人</li></ul><blockquote><p>[!TIP]<br>建议把这篇文章先收藏，平时遇到命令不熟的时候回来查，比硬背更有效。</p></blockquote><hr><h2 id="🔌-一、关机与重启命令"><a href="#🔌-一、关机与重启命令" class="headerlink" title="🔌 一、关机与重启命令"></a>🔌 一、关机与重启命令</h2><p>在服务器环境里，关机和重启都属于需要谨慎执行的操作。因为一旦执行，可能直接影响线上服务。</p><h3 id="1-常见命令"><a href="#1-常见命令" class="headerlink" title="1. 常见命令"></a>1. 常见命令</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">shutdown -h now</span><br><span class="line">shutdown -r now</span><br><span class="line">reboot</span><br><span class="line">halt</span><br><span class="line">poweroff</span><br></pre></td></tr></table></figure><h3 id="2-这些命令分别是什么意思"><a href="#2-这些命令分别是什么意思" class="headerlink" title="2. 这些命令分别是什么意思"></a>2. 这些命令分别是什么意思</h3><ul><li><code>shutdown -h now</code>：立即关机</li><li><code>shutdown -r now</code>：立即重启</li><li><code>reboot</code>：重启系统</li><li><code>halt</code>：停止系统</li><li><code>poweroff</code>：关闭电源</li></ul><h3 id="3-延时执行示例"><a href="#3-延时执行示例" class="headerlink" title="3. 延时执行示例"></a>3. 延时执行示例</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">shutdown -h +10</span><br><span class="line">shutdown -r +10</span><br><span class="line">shutdown -h 20:25</span><br></pre></td></tr></table></figure><p>它们分别表示：</p><ul><li>10 分钟后关机</li><li>10 分钟后重启</li><li>当天 <code>20:25</code> 关机</li></ul><h3 id="4-为什么常提到-sync"><a href="#4-为什么常提到-sync" class="headerlink" title="4. 为什么常提到 sync"></a>4. 为什么常提到 <code>sync</code></h3><p>在一些资料中，你会看到先执行：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sync</span><br></pre></td></tr></table></figure><p>它的作用是把内存中的数据同步到磁盘，避免还没写盘的数据丢失。</p><blockquote><p>[!NOTE]<br>在现代系统里很多情况下内核会自行处理，但理解这个命令的意义仍然很有帮助。</p></blockquote><hr><h2 id="🔐-二、文件权限与属主命令"><a href="#🔐-二、文件权限与属主命令" class="headerlink" title="🔐 二、文件权限与属主命令"></a>🔐 二、文件权限与属主命令</h2><p>Linux 权限体系是新手最容易卡住的地方。只要理解“属主、属组、其他人”这三层关系，很多命令就会清晰很多。</p><h3 id="1-chgrp：修改文件所属组"><a href="#1-chgrp：修改文件所属组" class="headerlink" title="1. chgrp：修改文件所属组"></a>1. <code>chgrp</code>：修改文件所属组</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chgrp [-R] 属组名 文件名</span><br></pre></td></tr></table></figure><p>常见用法：</p><ul><li><code>-R</code>：递归修改目录及内部所有文件</li></ul><h3 id="2-chown：修改文件拥有者"><a href="#2-chown：修改文件拥有者" class="headerlink" title="2. chown：修改文件拥有者"></a>2. <code>chown</code>：修改文件拥有者</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chown [–R] 所有者 文件名</span><br><span class="line">chown [-R] 所有者:属组名 文件名</span><br></pre></td></tr></table></figure><p>示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chown root:root install.log</span><br></pre></td></tr></table></figure><p>这表示把 <code>install.log</code> 的属主和属组都改回 <code>root</code>。</p><h3 id="3-chmod：修改权限"><a href="#3-chmod：修改权限" class="headerlink" title="3. chmod：修改权限"></a>3. <code>chmod</code>：修改权限</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chmod [-R] xyz 文件或目录</span><br></pre></td></tr></table></figure><p>Linux 的权限通常分成：</p><ul><li><code>r</code>：读，值为 <code>4</code></li><li><code>w</code>：写，值为 <code>2</code></li><li><code>x</code>：执行，值为 <code>1</code></li></ul><p>例如：</p><ul><li><code>777</code> &#x3D; <code>rwxrwxrwx</code></li><li><code>754</code> &#x3D; <code>rwxr-xr--</code></li></ul><p>示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chmod 777 .bashrc</span><br><span class="line">chmod 754 test1</span><br></pre></td></tr></table></figure><h3 id="4-符号写法"><a href="#4-符号写法" class="headerlink" title="4. 符号写法"></a>4. 符号写法</h3><p>除了数字方式，也可以用符号写法：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chmod u=rwx,g=rx,o=r test1</span><br><span class="line">chmod a-x test1</span><br></pre></td></tr></table></figure><p>常见字母含义：</p><ul><li><code>u</code>：user</li><li><code>g</code>：group</li><li><code>o</code>：others</li><li><code>a</code>：all</li></ul><blockquote><p>[!WARNING]<br><code>chmod 777</code> 虽然看起来方便，但权限过大，生产环境通常不推荐随便使用。</p></blockquote><hr><h2 id="📁-三、文件与目录管理"><a href="#📁-三、文件与目录管理" class="headerlink" title="📁 三、文件与目录管理"></a>📁 三、文件与目录管理</h2><p>这一部分是日常使用最频繁的内容，建议优先掌握。</p><h3 id="1-常见目录命令速览"><a href="#1-常见目录命令速览" class="headerlink" title="1. 常见目录命令速览"></a>1. 常见目录命令速览</h3><ul><li><code>ls</code>：列出文件</li><li><code>cd</code>：切换目录</li><li><code>pwd</code>：显示当前路径</li><li><code>mkdir</code>：创建目录</li><li><code>rmdir</code>：删除空目录</li><li><code>cp</code>：复制文件或目录</li><li><code>rm</code>：删除文件或目录</li><li><code>mv</code>：移动文件或重命名</li></ul><hr><h3 id="2-ls：列出目录内容"><a href="#2-ls：列出目录内容" class="headerlink" title="2. ls：列出目录内容"></a>2. <code>ls</code>：列出目录内容</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">ls -al</span><br></pre></td></tr></table></figure><p>常见参数：</p><ul><li><code>-a</code>：显示隐藏文件</li><li><code>-l</code>：以详细列表形式显示</li><li><code>-d</code>：只显示目录本身</li></ul><h3 id="3-cd：切换目录"><a href="#3-cd：切换目录" class="headerlink" title="3. cd：切换目录"></a>3. <code>cd</code>：切换目录</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cd /root/runoob/</span><br><span class="line">cd ./runoob/</span><br><span class="line">cd ~</span><br><span class="line">cd ..</span><br></pre></td></tr></table></figure><p>常见用法：</p><ul><li><code>cd ~</code>：回到家目录</li><li><code>cd ..</code>：回到上一级目录</li></ul><h3 id="4-pwd：显示当前工作目录"><a href="#4-pwd：显示当前工作目录" class="headerlink" title="4. pwd：显示当前工作目录"></a>4. <code>pwd</code>：显示当前工作目录</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pwd</span><br><span class="line">pwd -P</span><br></pre></td></tr></table></figure><p>其中 <code>-P</code> 会显示真实路径，而不是符号链接路径。</p><h3 id="5-mkdir：创建目录"><a href="#5-mkdir：创建目录" class="headerlink" title="5. mkdir：创建目录"></a>5. <code>mkdir</code>：创建目录</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mkdir test</span><br><span class="line">mkdir -p test1/test2/test3/test4</span><br><span class="line">mkdir -m 711 test2</span><br></pre></td></tr></table></figure><p>常见参数：</p><ul><li><code>-p</code>：递归创建多级目录</li><li><code>-m</code>：创建时直接指定权限</li></ul><h3 id="6-rmdir：删除空目录"><a href="#6-rmdir：删除空目录" class="headerlink" title="6. rmdir：删除空目录"></a>6. <code>rmdir</code>：删除空目录</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">rmdir runoob/</span><br><span class="line">rmdir -p test1/test2/test3/test4</span><br></pre></td></tr></table></figure><blockquote><p>[!NOTE]<br><code>rmdir</code> 只能删除空目录，非空目录通常改用 <code>rm -r</code>。</p></blockquote><h3 id="7-cp：复制文件或目录"><a href="#7-cp：复制文件或目录" class="headerlink" title="7. cp：复制文件或目录"></a>7. <code>cp</code>：复制文件或目录</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cp ~/.bashrc /tmp/bashrc</span><br><span class="line">cp -i ~/.bashrc /tmp/bashrc</span><br><span class="line">cp -r dir1 dir2</span><br></pre></td></tr></table></figure><p>常见参数：</p><ul><li><code>-i</code>：覆盖前询问</li><li><code>-r</code>：递归复制目录</li><li><code>-p</code>：保留文件属性</li></ul><h3 id="8-rm：删除文件或目录"><a href="#8-rm：删除文件或目录" class="headerlink" title="8. rm：删除文件或目录"></a>8. <code>rm</code>：删除文件或目录</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">rm -i bashrc</span><br><span class="line">rm -rf testdir</span><br></pre></td></tr></table></figure><p>常见参数：</p><ul><li><code>-i</code>：删除前询问</li><li><code>-f</code>：强制删除</li><li><code>-r</code>：递归删除目录</li></ul><blockquote><p>[!WARNING]<br><code>rm -rf</code> 是 Linux 最危险的高频命令之一，路径一定要确认清楚再执行。</p></blockquote><h3 id="9-mv：移动文件或重命名"><a href="#9-mv：移动文件或重命名" class="headerlink" title="9. mv：移动文件或重命名"></a>9. <code>mv</code>：移动文件或重命名</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mv bashrc mvtest</span><br><span class="line">mv mvtest mvtest2</span><br></pre></td></tr></table></figure><p>它既可以：</p><ul><li>把文件移动到别的目录</li><li>也可以直接给文件&#x2F;目录改名</li></ul><hr><h2 id="👤-四、用户与用户组管理"><a href="#👤-四、用户与用户组管理" class="headerlink" title="👤 四、用户与用户组管理"></a>👤 四、用户与用户组管理</h2><p>在服务器管理中，用户与权限是非常核心的部分。很多系统问题，最后都能追溯到“谁能访问、谁能执行、谁能写入”。</p><h3 id="1-添加用户：useradd"><a href="#1-添加用户：useradd" class="headerlink" title="1. 添加用户：useradd"></a>1. 添加用户：<code>useradd</code></h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">useradd 选项 用户名</span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">useradd -d /home/sam -m sam</span><br></pre></td></tr></table></figure><p>这个命令会创建用户 <code>sam</code>，并创建主目录 <code>/home/sam</code>。</p><h3 id="2-删除用户：userdel"><a href="#2-删除用户：userdel" class="headerlink" title="2. 删除用户：userdel"></a>2. 删除用户：<code>userdel</code></h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">userdel -r sam</span><br></pre></td></tr></table></figure><p>这里的 <code>-r</code> 表示连主目录一起删除。</p><h3 id="3-修改用户：usermod"><a href="#3-修改用户：usermod" class="headerlink" title="3. 修改用户：usermod"></a>3. 修改用户：<code>usermod</code></h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">usermod -s /bin/ksh -d /home/z -g developer sam</span><br></pre></td></tr></table></figure><p>这个命令可以修改：</p><ul><li>登录 Shell</li><li>主目录</li><li>用户组</li></ul><h3 id="4-修改密码：passwd"><a href="#4-修改密码：passwd" class="headerlink" title="4. 修改密码：passwd"></a>4. 修改密码：<code>passwd</code></h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">passwd sam</span><br><span class="line">passwd -d sam</span><br><span class="line">passwd -l sam</span><br></pre></td></tr></table></figure><p>常见含义：</p><ul><li><code>passwd sam</code>：给用户设置密码</li><li><code>passwd -d sam</code>：删除密码</li><li><code>passwd -l sam</code>：锁定账号</li></ul><hr><h3 id="5-用户组管理命令"><a href="#5-用户组管理命令" class="headerlink" title="5. 用户组管理命令"></a>5. 用户组管理命令</h3><h4 id="新建用户组"><a href="#新建用户组" class="headerlink" title="新建用户组"></a>新建用户组</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">groupadd group1</span><br><span class="line">groupadd -g 101 group2</span><br></pre></td></tr></table></figure><h4 id="删除用户组"><a href="#删除用户组" class="headerlink" title="删除用户组"></a>删除用户组</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">groupdel group1</span><br></pre></td></tr></table></figure><h4 id="修改用户组"><a href="#修改用户组" class="headerlink" title="修改用户组"></a>修改用户组</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">groupmod -g 102 group2</span><br><span class="line">groupmod -g 10000 -n group3 group2</span><br></pre></td></tr></table></figure><h4 id="切换用户组"><a href="#切换用户组" class="headerlink" title="切换用户组"></a>切换用户组</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">newgrp root</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>当你遇到“明明有权限却访问不了”的情况，记得检查当前用户到底属于哪个组。</p></blockquote><hr><h2 id="🧾-五、与用户相关的重要系统文件"><a href="#🧾-五、与用户相关的重要系统文件" class="headerlink" title="🧾 五、与用户相关的重要系统文件"></a>🧾 五、与用户相关的重要系统文件</h2><p>Linux 中很多用户与权限信息，实际上都保存在系统文件里。</p><h3 id="1-etc-passwd"><a href="#1-etc-passwd" class="headerlink" title="1. /etc/passwd"></a>1. <code>/etc/passwd</code></h3><p>这个文件记录用户的基本信息。</p><p>格式如下：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell</span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">sam:x:200:50:Sam san:/home/sam:/bin/sh</span><br></pre></td></tr></table></figure><h3 id="2-etc-shadow"><a href="#2-etc-shadow" class="headerlink" title="2. /etc/shadow"></a>2. <code>/etc/shadow</code></h3><p>这个文件存放加密后的密码信息，权限更严格，一般只有超级用户能读。</p><h3 id="3-etc-group"><a href="#3-etc-group" class="headerlink" title="3. /etc/group"></a>3. <code>/etc/group</code></h3><p>这个文件记录用户组信息。</p><p>格式如下：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">组名:口令:组标识号:组内用户列表</span><br></pre></td></tr></table></figure><p>理解这三个文件后，很多用户管理相关问题会更容易排查。</p><hr><h2 id="👥-六、批量创建用户"><a href="#👥-六、批量创建用户" class="headerlink" title="👥 六、批量创建用户"></a>👥 六、批量创建用户</h2><p>如果你只是偶尔加一个用户，用 <code>useradd</code> 就够了；但如果要一次创建几十个甚至几百个用户，就需要批量方式。</p><h3 id="1-准备用户文件"><a href="#1-准备用户文件" class="headerlink" title="1. 准备用户文件"></a>1. 准备用户文件</h3><p>例如 <code>user.txt</code>：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">user001::600:100:user:/home/user001:/bin/bash</span><br><span class="line">user002::601:100:user:/home/user002:/bin/bash</span><br><span class="line">user003::602:100:user:/home/user003:/bin/bash</span><br></pre></td></tr></table></figure><h3 id="2-批量导入用户"><a href="#2-批量导入用户" class="headerlink" title="2. 批量导入用户"></a>2. 批量导入用户</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">newusers &lt; user.txt</span><br></pre></td></tr></table></figure><h3 id="3-准备密码文件"><a href="#3-准备密码文件" class="headerlink" title="3. 准备密码文件"></a>3. 准备密码文件</h3><p>例如 <code>passwd.txt</code>：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">user001:123456</span><br><span class="line">user002:123456</span><br><span class="line">user003:123456</span><br></pre></td></tr></table></figure><h3 id="4-批量设置密码"><a href="#4-批量设置密码" class="headerlink" title="4. 批量设置密码"></a>4. 批量设置密码</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">chpasswd &lt; passwd.txt</span><br></pre></td></tr></table></figure><p>如果涉及 <code>shadow</code> 转换，也可能会配合：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">pwunconv</span><br><span class="line">pwconv</span><br></pre></td></tr></table></figure><blockquote><p>[!WARNING]<br>批量创建用户前，一定要仔细检查 UID、主目录和用户名是否冲突。</p></blockquote><hr><h2 id="💽-七、磁盘管理常用命令"><a href="#💽-七、磁盘管理常用命令" class="headerlink" title="💽 七、磁盘管理常用命令"></a>💽 七、磁盘管理常用命令</h2><p>磁盘管理直接关系到系统容量、挂载、格式化与健康状态。</p><p>常见命令有：</p><ul><li><code>df</code>：查看磁盘整体使用情况</li><li><code>du</code>：查看目录占用情况</li><li><code>fdisk</code>：磁盘分区</li><li><code>mkfs</code>：格式化文件系统</li><li><code>fsck</code>：文件系统检查</li><li><code>mount</code> &#x2F; <code>umount</code>：挂载与卸载</li></ul><h3 id="1-df：查看磁盘空间"><a href="#1-df：查看磁盘空间" class="headerlink" title="1. df：查看磁盘空间"></a>1. <code>df</code>：查看磁盘空间</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">df -h</span><br></pre></td></tr></table></figure><p>适合快速看：</p><ul><li>哪个分区快满了</li><li>挂载情况是否正常</li></ul><h3 id="2-du：查看目录体积"><a href="#2-du：查看目录体积" class="headerlink" title="2. du：查看目录体积"></a>2. <code>du</code>：查看目录体积</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">du -sh /var/log</span><br><span class="line">du -sh *</span><br></pre></td></tr></table></figure><p>适合查“哪个目录最占空间”。</p><h3 id="3-fdisk：磁盘分区"><a href="#3-fdisk：磁盘分区" class="headerlink" title="3. fdisk：磁盘分区"></a>3. <code>fdisk</code>：磁盘分区</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">fdisk -l</span><br></pre></td></tr></table></figure><p>用于查看当前系统磁盘与分区情况。</p><h3 id="4-mkfs：格式化文件系统"><a href="#4-mkfs：格式化文件系统" class="headerlink" title="4. mkfs：格式化文件系统"></a>4. <code>mkfs</code>：格式化文件系统</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mkfs -t ext3 /dev/hdc6</span><br></pre></td></tr></table></figure><h3 id="5-fsck：文件系统检查"><a href="#5-fsck：文件系统检查" class="headerlink" title="5. fsck：文件系统检查"></a>5. <code>fsck</code>：文件系统检查</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">fsck -C -f -t ext3 /dev/hdc6</span><br></pre></td></tr></table></figure><h3 id="6-mount：挂载分区"><a href="#6-mount：挂载分区" class="headerlink" title="6. mount：挂载分区"></a>6. <code>mount</code>：挂载分区</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mount /dev/hdc6 /mnt/hdc6</span><br></pre></td></tr></table></figure><h3 id="7-umount：卸载分区"><a href="#7-umount：卸载分区" class="headerlink" title="7. umount：卸载分区"></a>7. <code>umount</code>：卸载分区</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">umount /dev/hdc6</span><br></pre></td></tr></table></figure><blockquote><p>[!WARNING]<br>格式化和分区命令有不可逆风险，执行前一定确认设备名是否正确。</p></blockquote><hr><h2 id="✍️-八、vi-vim-基础使用"><a href="#✍️-八、vi-vim-基础使用" class="headerlink" title="✍️ 八、vi &#x2F; vim 基础使用"></a>✍️ 八、vi &#x2F; vim 基础使用</h2><p>在 Linux 世界里，<code>vi</code> &#x2F; <code>vim</code> 是绕不过去的编辑器。</p><h3 id="1-什么是-vim"><a href="#1-什么是-vim" class="headerlink" title="1. 什么是 vim"></a>1. 什么是 vim</h3><p>Vim 是从 <code>vi</code> 发展而来的文本编辑器，功能比传统 <code>vi</code> 更丰富，在服务器环境和开发场景中都非常常见。</p><h3 id="2-三种模式"><a href="#2-三种模式" class="headerlink" title="2. 三种模式"></a>2. 三种模式</h3><p>Vim 最核心的是 3 种模式：</p><ul><li>命令模式</li><li>输入模式</li><li>底线命令模式</li></ul><h3 id="3-高频操作"><a href="#3-高频操作" class="headerlink" title="3. 高频操作"></a>3. 高频操作</h3><h4 id="进入输入模式"><a href="#进入输入模式" class="headerlink" title="进入输入模式"></a>进入输入模式</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">i</span><br></pre></td></tr></table></figure><h4 id="保存退出"><a href="#保存退出" class="headerlink" title="保存退出"></a>保存退出</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">:wq</span><br></pre></td></tr></table></figure><h4 id="不保存强退"><a href="#不保存强退" class="headerlink" title="不保存强退"></a>不保存强退</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">:q!</span><br></pre></td></tr></table></figure><h4 id="复制-删除当前行"><a href="#复制-删除当前行" class="headerlink" title="复制 &#x2F; 删除当前行"></a>复制 &#x2F; 删除当前行</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">yy</span><br><span class="line">dd</span><br></pre></td></tr></table></figure><h4 id="撤销-重做"><a href="#撤销-重做" class="headerlink" title="撤销 &#x2F; 重做"></a>撤销 &#x2F; 重做</h4><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">u</span><br><span class="line">Ctrl + r</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>新手最先记住 <code>i</code>、<code>Esc</code>、<code>:wq</code>、<code>:q!</code> 这几个命令，就够应付大多数情况了。</p></blockquote><hr><h2 id="📦-九、yum-包管理命令"><a href="#📦-九、yum-包管理命令" class="headerlink" title="📦 九、yum 包管理命令"></a>📦 九、yum 包管理命令</h2><p>在基于 RPM 的系统里，<code>yum</code> 是非常常见的软件包管理工具。</p><h3 id="1-常见用途"><a href="#1-常见用途" class="headerlink" title="1. 常见用途"></a>1. 常见用途</h3><ul><li>安装软件</li><li>更新软件</li><li>搜索软件包</li><li>删除软件</li><li>清理缓存</li></ul><h3 id="2-常见命令示例"><a href="#2-常见命令示例" class="headerlink" title="2. 常见命令示例"></a>2. 常见命令示例</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum install nginx</span><br><span class="line">yum update</span><br><span class="line">yum remove nginx</span><br><span class="line">yum search php</span><br><span class="line">yum clean all</span><br></pre></td></tr></table></figure><h3 id="3-使用场景理解"><a href="#3-使用场景理解" class="headerlink" title="3. 使用场景理解"></a>3. 使用场景理解</h3><ul><li>装软件：<code>yum install</code></li><li>升级系统或软件：<code>yum update</code></li><li>删除软件：<code>yum remove</code></li><li>搜索包名：<code>yum search</code></li><li>清缓存：<code>yum clean all</code></li></ul><hr><h2 id="📥-十、apt-命令汇总与使用教学"><a href="#📥-十、apt-命令汇总与使用教学" class="headerlink" title="📥 十、apt 命令汇总与使用教学"></a>📥 十、apt 命令汇总与使用教学</h2><p>如果你使用的是 Debian、Ubuntu、Linux Mint 等发行版，那么最常接触的软件包管理工具通常不是 <code>yum</code>，而是 <code>apt</code>。它主要负责软件包索引更新、软件安装、升级、卸载和依赖管理。</p><h3 id="1-先理解-apt-是做什么的"><a href="#1-先理解-apt-是做什么的" class="headerlink" title="1. 先理解 apt 是做什么的"></a>1. 先理解 <code>apt</code> 是做什么的</h3><p>你可以把 <code>apt</code> 理解成“系统应用商店的命令行版本”，它能帮你：</p><ul><li>从软件源获取软件包信息</li><li>安装或卸载软件</li><li>自动处理依赖关系</li><li>更新系统中的软件版本</li><li>清理不再需要的软件缓存</li></ul><blockquote><p>[!NOTE]<br>在较新的 Debian &#x2F; Ubuntu 系统中，日常操作一般直接用 <code>apt</code> 即可；而脚本场景中也常见 <code>apt-get</code>。</p></blockquote><h3 id="2-最常用的-apt-命令速查"><a href="#2-最常用的-apt-命令速查" class="headerlink" title="2. 最常用的 apt 命令速查"></a>2. 最常用的 apt 命令速查</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt update</span><br><span class="line">apt upgrade</span><br><span class="line">apt install nginx</span><br><span class="line">apt remove nginx</span><br><span class="line">apt purge nginx</span><br><span class="line">apt autoremove</span><br><span class="line">apt search nginx</span><br><span class="line">apt show nginx</span><br><span class="line">apt list --upgradable</span><br><span class="line">apt clean</span><br></pre></td></tr></table></figure><h3 id="3-这些命令分别是什么意思"><a href="#3-这些命令分别是什么意思" class="headerlink" title="3. 这些命令分别是什么意思"></a>3. 这些命令分别是什么意思</h3><ul><li><code>apt update</code>：更新软件源索引</li><li><code>apt upgrade</code>：升级已安装的软件</li><li><code>apt install nginx</code>：安装指定软件</li><li><code>apt remove nginx</code>：卸载软件，但通常保留配置文件</li><li><code>apt purge nginx</code>：彻底卸载软件及其配置文件</li><li><code>apt autoremove</code>：删除不再需要的依赖包</li><li><code>apt search nginx</code>：搜索软件包</li><li><code>apt show nginx</code>：查看软件包详情</li><li><code>apt list --upgradable</code>：查看可升级的软件</li><li><code>apt clean</code>：清理已下载的软件缓存</li></ul><hr><h3 id="4-新手最常见的正确使用顺序"><a href="#4-新手最常见的正确使用顺序" class="headerlink" title="4. 新手最常见的正确使用顺序"></a>4. 新手最常见的正确使用顺序</h3><p>如果你准备在 Ubuntu 服务器上安装一个软件，最常见流程通常是：</p><h4 id="第一步：更新软件源索引"><a href="#第一步：更新软件源索引" class="headerlink" title="第一步：更新软件源索引"></a>第一步：更新软件源索引</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt update</span><br></pre></td></tr></table></figure><p>这一步不是升级软件，而是先让系统知道“现在仓库里有哪些可用包、最新版本是多少”。</p><h4 id="第二步：安装软件"><a href="#第二步：安装软件" class="headerlink" title="第二步：安装软件"></a>第二步：安装软件</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt install nginx</span><br></pre></td></tr></table></figure><p>系统会自动解析并安装依赖。</p><h4 id="第三步：确认软件是否安装成功"><a href="#第三步：确认软件是否安装成功" class="headerlink" title="第三步：确认软件是否安装成功"></a>第三步：确认软件是否安装成功</h4><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">nginx -v</span><br></pre></td></tr></table></figure><p>或者查看软件包信息：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt show nginx</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>很多人一上来直接 <code>apt install</code>，虽然有时也能装，但更推荐先执行 <code>apt update</code>，这样更稳妥。</p></blockquote><hr><h3 id="5-升级系统时怎么用"><a href="#5-升级系统时怎么用" class="headerlink" title="5. 升级系统时怎么用"></a>5. 升级系统时怎么用</h3><p>如果你只是想更新软件列表：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt update</span><br></pre></td></tr></table></figure><p>如果你要把已安装的软件升级到仓库里的新版本：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt upgrade</span><br></pre></td></tr></table></figure><p>如果想先看有哪些包可升级：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt list --upgradable</span><br></pre></td></tr></table></figure><blockquote><p>[!WARNING]<br>在生产服务器上执行升级前，建议先确认是否会影响运行中的业务服务，尤其是 Nginx、MySQL、Docker 一类关键组件。</p></blockquote><hr><h3 id="6-删除软件时要注意什么"><a href="#6-删除软件时要注意什么" class="headerlink" title="6. 删除软件时要注意什么"></a>6. 删除软件时要注意什么</h3><p>普通卸载：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt remove nginx</span><br></pre></td></tr></table></figure><p>彻底卸载并删除配置：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt purge nginx</span><br></pre></td></tr></table></figure><p>清理无用依赖：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt autoremove</span><br></pre></td></tr></table></figure><p>这 3 个命令常常配合使用。例如：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt remove nginx</span><br><span class="line">sudo apt autoremove</span><br></pre></td></tr></table></figure><p>如果你想删得更干净：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt purge nginx</span><br><span class="line">sudo apt autoremove</span><br></pre></td></tr></table></figure><hr><h3 id="7-搜索与查看软件包信息"><a href="#7-搜索与查看软件包信息" class="headerlink" title="7. 搜索与查看软件包信息"></a>7. 搜索与查看软件包信息</h3><p>当你不确定包名时，可以先搜索：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt search php</span><br><span class="line">apt search docker</span><br></pre></td></tr></table></figure><p>如果你已经知道包名，想看详细信息：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt show php</span><br><span class="line">apt show docker.io</span><br></pre></td></tr></table></figure><p>你通常能看到：</p><ul><li>软件版本</li><li>依赖信息</li><li>软件说明</li><li>仓库来源</li></ul><hr><h3 id="8-缓存清理与系统整理"><a href="#8-缓存清理与系统整理" class="headerlink" title="8. 缓存清理与系统整理"></a>8. 缓存清理与系统整理</h3><p>安装软件后，系统会保留下载缓存。常见清理命令：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt clean</span><br><span class="line">sudo apt autoremove</span><br></pre></td></tr></table></figure><p>它们的作用分别是：</p><ul><li><code>apt clean</code>：清空本地下载的软件包缓存</li><li><code>apt autoremove</code>：清除已不再需要的依赖包</li></ul><p>如果服务器磁盘比较紧张，这两个命令会很实用。</p><hr><h3 id="9-apt-和-apt-get-有什么区别"><a href="#9-apt-和-apt-get-有什么区别" class="headerlink" title="9. apt 和 apt-get 有什么区别"></a>9. <code>apt</code> 和 <code>apt-get</code> 有什么区别</h3><p>很多旧教程里会写：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt-get update</span><br><span class="line">apt-get install nginx</span><br></pre></td></tr></table></figure><p>而现在常见写法是：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">apt update</span><br><span class="line">apt install nginx</span><br></pre></td></tr></table></figure><p>简单理解：</p><ul><li><code>apt</code>：更适合人工在终端里直接使用，输出更友好</li><li><code>apt-get</code>：更传统，也常见于脚本和老教程</li></ul><p>对于新手来说，日常记住 <code>apt</code> 就够用了。</p><hr><h3 id="10-apt-使用示例：在-Ubuntu-上安装-Nginx"><a href="#10-apt-使用示例：在-Ubuntu-上安装-Nginx" class="headerlink" title="10. apt 使用示例：在 Ubuntu 上安装 Nginx"></a>10. apt 使用示例：在 Ubuntu 上安装 Nginx</h3><p>下面给你一个完整示例：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install nginx</span><br><span class="line">nginx -v</span><br><span class="line">systemctl status nginx</span><br></pre></td></tr></table></figure><p>如果后续不想用了，可以这样卸载：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt remove nginx</span><br><span class="line">sudo apt autoremove</span><br></pre></td></tr></table></figure><p>如果你要彻底清理：</p><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo apt purge nginx</span><br><span class="line">sudo apt autoremove</span><br></pre></td></tr></table></figure><p>这个流程基本能覆盖大多数新手的实际使用场景。</p><hr><h2 id="📌-总结"><a href="#📌-总结" class="headerlink" title="📌 总结"></a>📌 总结</h2><p>Linux 命令学习最怕的不是多，而是没有主线。你可以先按下面这条顺序掌握：</p><ol><li>文件和目录操作</li><li>权限和属主修改</li><li>用户与用户组管理</li><li>磁盘与挂载管理</li><li>Vim 基本编辑</li><li>软件包安装与更新</li></ol><p>把这些高频内容先掌握之后，你再接触服务管理、网络排查、Shell 脚本时会轻松很多。</p><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区交流：</p><ol><li>你目前最常用的 Linux 命令是哪几个？</li><li>你更想继续看服务器运维命令，还是日常桌面命令整理？</li><li>如果你愿意，我也可以继续帮你整理一版“Linux 新手必背 30 条命令”的精简版。</li></ol>]]></content>
    
    
    <summary type="html">全面介绍 Linux 系统常用命令,包括系统管理、文件操作、权限设置、yum 与 apt 包管理等实用内容,适合 Linux 初学者查阅参考。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Linux教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Linux%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="命令行" scheme="https://www.xmdblog.com/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
    <category term="Linux" scheme="https://www.xmdblog.com/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>🚀 用宝塔面板把 Hexo 部署到服务器</title>
    <link href="https://www.xmdblog.com/posts/e039465e.html"/>
    <id>https://www.xmdblog.com/posts/e039465e.html</id>
    <published>2024-02-22T09:14:45.000Z</published>
    <updated>2026-10-10T08:29:42.779Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>[!WARNING]<br>本教程属于较早期方案，部分细节可能已经落后。如果你想用更现代、更稳定的自动化流程，建议优先阅读站内新教程：<a href="/posts/2cd5d824.html">&#x2F;posts&#x2F;2cd5d824.html</a></p></blockquote><h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>如果你已经把 Hexo 博客写起来了，但觉得 GitHub Pages 访问速度不理想，或者你希望把网站真正部署到自己的服务器上，那么“宝塔面板 + Nginx + Git 自动部署”是一条很经典的路线。</p><p>这篇文章会带你完成一套传统但实用的服务器部署方案：本地写文章，执行部署命令后，服务器自动更新站点内容。</p><hr><h2 id="🎯-一、部署思路与流程"><a href="#🎯-一、部署思路与流程" class="headerlink" title="🎯 一、部署思路与流程"></a>🎯 一、部署思路与流程</h2><p>整个流程可以理解为下面这条链路：</p><ol><li>服务器安装宝塔面板与 Nginx</li><li>服务器创建专门用于接收代码的 Git 仓库</li><li>本地 Hexo 将生成后的内容推送到服务器仓库</li><li>服务器通过 Git Hooks 自动把内容发布到网站目录</li><li>由 Nginx 对外提供访问</li></ol><blockquote><p>[!TIP]<br>这类方案的核心重点不在“装软件”，而在“权限、路径、仓库、钩子”四件事是否都配置正确。</p></blockquote><hr><h2 id="🔧-二、前置准备"><a href="#🔧-二、前置准备" class="headerlink" title="🔧 二、前置准备"></a>🔧 二、前置准备</h2><p>在开始之前，建议你先准备好：</p><ul><li>一台可远程连接的 Linux 服务器</li><li>已解析到服务器的域名（可选，但强烈推荐）</li><li>本地已经安装好 Hexo、Node.js、Git</li><li>能正常使用 SSH 连接服务器</li></ul><p>如果你的 Hexo 还没搭好，可以先看站内基础教程：<a href="/posts/70db7d7c.html">&#x2F;posts&#x2F;70db7d7c.html</a></p><hr><h2 id="🏗️-三、安装宝塔与-Nginx"><a href="#🏗️-三、安装宝塔与-Nginx" class="headerlink" title="🏗️ 三、安装宝塔与 Nginx"></a>🏗️ 三、安装宝塔与 Nginx</h2><h3 id="1-安装宝塔面板"><a href="#1-安装宝塔面板" class="headerlink" title="1. 安装宝塔面板"></a>1. 安装宝塔面板</h3><p>前往宝塔官网下载对应系统的安装脚本：</p><ul><li><a href="https://www.bt.cn/new/download.html">宝塔面板官网</a></li></ul><p>连接服务器后，以 <code>root</code> 身份执行对应命令，安装完成后根据提示登录面板后台。</p><h3 id="2-安装-Nginx"><a href="#2-安装-Nginx" class="headerlink" title="2. 安装 Nginx"></a>2. 安装 Nginx</h3><p>进入宝塔面板后：</p><ol><li>打开“软件商店”</li><li>安装 <code>Nginx</code></li><li>暂时不需要先装 PHP、MySQL</li></ol><h3 id="3-创建站点"><a href="#3-创建站点" class="headerlink" title="3. 创建站点"></a>3. 创建站点</h3><p>在宝塔中创建你的网站：</p><ol><li>打开“网站”</li><li>点击“添加站点”</li><li>填入你的域名</li><li>记住站点目录名称，例如：<code>xmdblog.com</code></li></ol><p><img src="/img/posts/e039465e/%E6%B7%BB%E5%8A%A0%E7%AB%99%E7%82%B9.png" alt="添加站点"></p><blockquote><p>[!NOTE]<br>后续自动部署时，生成的站点文件就会发布到这个目录。</p></blockquote><hr><h2 id="🔐-四、服务器端-Git-仓库配置"><a href="#🔐-四、服务器端-Git-仓库配置" class="headerlink" title="🔐 四、服务器端 Git 仓库配置"></a>🔐 四、服务器端 Git 仓库配置</h2><h3 id="1-创建-git-用户"><a href="#1-创建-git-用户" class="headerlink" title="1. 创建 git 用户"></a>1. 创建 <code>git</code> 用户</h3><p>先在服务器中创建专门用于部署的用户：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">adduser git</span><br></pre></td></tr></table></figure><p>如果你需要给这个用户更高权限，可以临时调整 <code>sudoers</code>：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">chmod</span> 740 /etc/sudoers</span><br><span class="line">vim /etc/sudoers</span><br><span class="line"><span class="comment"># 在 root ALL=(ALL) ALL 下方添加</span></span><br><span class="line"><span class="comment"># git ALL=(ALL) ALL</span></span><br><span class="line"><span class="built_in">chmod</span> 400 /etc/sudoers</span><br></pre></td></tr></table></figure><blockquote><p>[!WARNING]<br>修改 <code>sudoers</code> 要格外小心，写错会影响系统 sudo 功能。不会改的话建议先备份。</p></blockquote><h3 id="2-配置-SSH-公钥登录"><a href="#2-配置-SSH-公钥登录" class="headerlink" title="2. 配置 SSH 公钥登录"></a>2. 配置 SSH 公钥登录</h3><p>在本地电脑生成 SSH 密钥：</p><figure class="highlight powershell"><table><tr><td class="code"><pre><span class="line">ssh<span class="literal">-keygen</span> <span class="literal">-t</span> rsa <span class="literal">-C</span> <span class="string">&quot;网站目录名&quot;</span></span><br></pre></td></tr></table></figure><p>如果你已经有密钥，可以直接复用。</p><p>然后在服务器中切换到 <code>git</code> 用户并创建 <code>.ssh</code> 目录：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">su git</span><br><span class="line"><span class="built_in">cd</span></span><br><span class="line"><span class="built_in">mkdir</span> -p ~/.ssh</span><br><span class="line"><span class="built_in">touch</span> ~/.ssh/authorized_keys</span><br><span class="line"><span class="built_in">chmod</span> 600 ~/.ssh/authorized_keys</span><br><span class="line"><span class="built_in">chmod</span> 700 ~/.ssh</span><br></pre></td></tr></table></figure><p>接着把你本地的 <code>id_rsa.pub</code> 内容复制到服务器的：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">/home/git/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><p>保存后，在本地测试：</p><figure class="highlight powershell"><table><tr><td class="code"><pre><span class="line">ssh git<span class="selector-tag">@</span>服务器IP</span><br></pre></td></tr></table></figure><p>如果能正常连接，就说明密钥配置成功。</p><hr><h2 id="📦-五、创建裸仓库并配置自动部署"><a href="#📦-五、创建裸仓库并配置自动部署" class="headerlink" title="📦 五、创建裸仓库并配置自动部署"></a>📦 五、创建裸仓库并配置自动部署</h2><h3 id="1-创建-Git-仓库目录"><a href="#1-创建-Git-仓库目录" class="headerlink" title="1. 创建 Git 仓库目录"></a>1. 创建 Git 仓库目录</h3><p>在服务器上执行：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">mkdir</span> /home/git/repos</span><br><span class="line"><span class="built_in">cd</span> /home/git/repos</span><br><span class="line"><span class="built_in">sudo</span> git init --bare xmdblog.git</span><br></pre></td></tr></table></figure><p>这一步创建的是一个“裸仓库”，它专门用来接收推送，不直接作为工作目录编辑。</p><h3 id="2-配置-Git-Hooks-自动发布"><a href="#2-配置-Git-Hooks-自动发布" class="headerlink" title="2. 配置 Git Hooks 自动发布"></a>2. 配置 Git Hooks 自动发布</h3><p>找到：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">/home/git/repos/xmdblog.git/hooks/post-update.sample</span><br></pre></td></tr></table></figure><p>把它改名为：</p><figure class="highlight text"><table><tr><td class="code"><pre><span class="line">post-update</span><br></pre></td></tr></table></figure><p>并将内容改成：</p><figure class="highlight sh"><table><tr><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line">git --work-tree=/www/wwwroot/网站目录名 --git-dir=/home/git/repos/仓库名.git checkout -f</span><br></pre></td></tr></table></figure><p>它的作用是：每次你把内容推送到仓库后，自动把内容签出到网站目录。</p><h3 id="3-赋予权限"><a href="#3-赋予权限" class="headerlink" title="3. 赋予权限"></a>3. 赋予权限</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">cd</span> /home/git/repos/xmdblog.git/hooks</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chmod</span> +x post-update</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R git:git /home/git/repos/</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R git:git /www/wwwroot/网站目录名/</span><br></pre></td></tr></table></figure><blockquote><p>[!TIP]<br>如果你在宝塔里看到 <code>.user.ini</code> 导致无法操作网站目录，可以先临时删除它再继续。</p></blockquote><hr><h2 id="⚙️-六、本地-Hexo-配置"><a href="#⚙️-六、本地-Hexo-配置" class="headerlink" title="⚙️ 六、本地 Hexo 配置"></a>⚙️ 六、本地 Hexo 配置</h2><p>接下来回到你自己的 Hexo 项目，修改根目录下的 <code>_config.yml</code>。</p><h3 id="1-安装-Git-部署插件"><a href="#1-安装-Git-部署插件" class="headerlink" title="1. 安装 Git 部署插件"></a>1. 安装 Git 部署插件</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><h3 id="2-修改部署配置"><a href="#2-修改部署配置" class="headerlink" title="2. 修改部署配置"></a>2. 修改部署配置</h3><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">git@服务器IP:/home/git/repos/仓库名.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p>如果你的域名已经解析到服务器，也可以把 <code>服务器IP</code> 换成域名。</p><hr><h2 id="🚀-七、执行部署"><a href="#🚀-七、执行部署" class="headerlink" title="🚀 七、执行部署"></a>🚀 七、执行部署</h2><p>全部配置完成后，本地执行：</p><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo clean</span><br><span class="line">hexo generate</span><br><span class="line">hexo deploy</span><br></pre></td></tr></table></figure><p>如果一切正常，推送完成后服务器端会自动把内容同步到网站目录。</p><p>此时再访问你的域名，就应该能看到已经上线的博客了。</p><blockquote><p>[!NOTE]<br>原文里写成了 <code>hexo delopy</code>，这里要注意正确命令是 <code>hexo deploy</code>。</p></blockquote><hr><h2 id="🌐-八、配置-HTTPS-与访问优化"><a href="#🌐-八、配置-HTTPS-与访问优化" class="headerlink" title="🌐 八、配置 HTTPS 与访问优化"></a>🌐 八、配置 HTTPS 与访问优化</h2><p>博客能访问后，建议你继续做两件事：</p><h3 id="1-配置-SSL-证书"><a href="#1-配置-SSL-证书" class="headerlink" title="1. 配置 SSL 证书"></a>1. 配置 SSL 证书</h3><p>在宝塔站点设置里申请 Let’s Encrypt 证书，开启 HTTPS。</p><h3 id="2-配置重定向"><a href="#2-配置重定向" class="headerlink" title="2. 配置重定向"></a>2. 配置重定向</h3><p>建议把访问统一到你最终使用的域名版本，例如：</p><ul><li>强制跳转到 <code>https</code></li><li>统一跳转到 <code>www</code> 或非 <code>www</code></li></ul><p>这样对 SEO 和访问体验都更友好。</p><hr><h2 id="🛠️-九、常见问题排查"><a href="#🛠️-九、常见问题排查" class="headerlink" title="🛠️ 九、常见问题排查"></a>🛠️ 九、常见问题排查</h2><h3 id="1-推送成功但网站没更新"><a href="#1-推送成功但网站没更新" class="headerlink" title="1. 推送成功但网站没更新"></a>1. 推送成功但网站没更新</h3><p>优先检查：</p><ul><li><code>post-update</code> 是否有执行权限</li><li>仓库路径和站点路径是否写对</li><li>网站目录权限是否属于 <code>git</code> 用户</li></ul><h3 id="2-SSH-连接失败"><a href="#2-SSH-连接失败" class="headerlink" title="2. SSH 连接失败"></a>2. SSH 连接失败</h3><p>优先检查：</p><ul><li>本地公钥是否正确添加到 <code>authorized_keys</code></li><li><code>.ssh</code> 目录权限是否正确</li><li>服务器防火墙是否放行 SSH 端口</li></ul><h3 id="3-页面能打开但样式丢失"><a href="#3-页面能打开但样式丢失" class="headerlink" title="3. 页面能打开但样式丢失"></a>3. 页面能打开但样式丢失</h3><p>优先检查：</p><ul><li>Hexo 的 <code>url</code> 和 <code>root</code> 配置</li><li>静态资源是否完整上传</li><li>Nginx 站点根目录是否正确</li></ul><h3 id="4-网站目录无法写入"><a href="#4-网站目录无法写入" class="headerlink" title="4. 网站目录无法写入"></a>4. 网站目录无法写入</h3><p>优先检查：</p><ul><li>网站目录归属用户</li><li>是否存在 <code>.user.ini</code> 限制</li><li>宝塔是否开启了额外防护策略</li></ul><hr><h2 id="📚-总结"><a href="#📚-总结" class="headerlink" title="📚 总结"></a>📚 总结</h2><p>这套“宝塔面板 + Git Hooks + Nginx”的方案虽然不如 CI&#x2F;CD 现代，但对于很多个人站长来说依然足够实用。它的优点是：</p><ul><li>思路直观</li><li>部署链路清晰</li><li>适合自己掌控服务器环境</li><li>能帮助理解静态站点部署原理</li></ul><p>如果你更看重自动化、可维护性和安全性，下一步建议升级到 GitHub Actions 或 GitLab CI 的方案。</p><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区交流：</p><ol><li>你更喜欢传统 Git Hooks 部署，还是 CI&#x2F;CD 自动部署？</li><li>你在服务器部署过程中，最容易卡在哪一步？</li><li>如果你愿意，我也可以继续帮你把这套方案改造成更现代的部署流程。</li></ol>]]></content>
    
    
    <summary type="html">详细介绍如何使用宝塔面板将 Hexo 博客部署到服务器,包括环境配置、Git仓库搭建、自动部署等完整步骤。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hexo教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Hexo%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="部署" scheme="https://www.xmdblog.com/tags/%E9%83%A8%E7%BD%B2/"/>
    
    <category term="服务器" scheme="https://www.xmdblog.com/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="Hexo" scheme="https://www.xmdblog.com/tags/Hexo/"/>
    
    <category term="宝塔面板" scheme="https://www.xmdblog.com/tags/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>🎬 After Motion Z 下载</title>
    <link href="https://www.xmdblog.com/posts/c6ea8308.html"/>
    <id>https://www.xmdblog.com/posts/c6ea8308.html</id>
    <published>2024-02-21T14:57:20.000Z</published>
    <updated>2026-10-10T08:29:42.777Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>After Motion Z 是一款面向移动端的动画制作工具，适合做短视频特效、文字动画、图层合成与简单剪辑。如果你正想找一个上手门槛不高、功能又比较全面的安卓动画工具，这个版本值得试试。</p><h3 id="✨-版本信息"><a href="#✨-版本信息" class="headerlink" title="✨ 版本信息"></a>✨ 版本信息</h3><blockquote><p>[!NOTE]</p><ul><li>最后更新：2026年7月12日</li><li>版本号：5.0.273.1028421</li><li>系统要求：Android 6及以上</li><li>架构支持：通用</li></ul></blockquote><hr><h2 id="✨-一、更新内容"><a href="#✨-一、更新内容" class="headerlink" title="✨ 一、更新内容"></a>✨ 一、更新内容</h2><h3 id="✨-新增功能"><a href="#✨-新增功能" class="headerlink" title="✨ 新增功能"></a>✨ 新增功能</h3><ul><li>新增45+种3D特效（懒得写名字，自己去看看吧）</li></ul><h3 id="📥-下载地址"><a href="#📥-下载地址" class="headerlink" title="📥 下载地址"></a>📥 下载地址</h3><p><a href="https://pan.xmdblog.com/AMZ/AMZ_ORI_12JUL.apk">原包下载</a></p><hr><h2 id="✨-二、功能特点"><a href="#✨-二、功能特点" class="headerlink" title="✨ 二、功能特点"></a>✨ 二、功能特点</h2><h3 id="✨-1-解锁高级功能"><a href="#✨-1-解锁高级功能" class="headerlink" title="✨ 1. 解锁高级功能"></a>✨ 1. 解锁高级功能</h3><ul><li>完整功能解锁</li><li>无广告和水印</li><li>支持高达 4K 分辨率</li><li>支持 999 层编辑</li><li>项目包导出功能</li></ul><blockquote><p>[!WARNING]<br>导入 Alightlink 项目超过 5Mb 的功能暂不支持</p></blockquote><h3 id="💡-2-优化改进"><a href="#💡-2-优化改进" class="headerlink" title="💡 2. 优化改进"></a>💡 2. 优化改进</h3><ul><li>移除支付页面</li><li>修复导入 XML 文件问题</li><li>修复 Google 登录功能</li><li>启用匿名登录</li><li>启用秘密菜单(三指同时按下触发)</li></ul><h3 id="💡-3-其他优化"><a href="#💡-3-其他优化" class="headerlink" title="💡 3. 其他优化"></a>💡 3. 其他优化</h3><ul><li>禁用错误代码提示</li><li>禁用应用验证</li><li>禁用 SurveyActivity</li><li>禁用篡改检测弹窗</li><li>资源文件优化</li></ul><h3 id="💡-4-支持与帮助"><a href="#💡-4-支持与帮助" class="headerlink" title="💡 4. 支持与帮助"></a>💡 4. 支持与帮助</h3><p>如果您遇到问题，可以在 After Motion Group 官方电报上提问</p><p>加入电报频道<a href="https://t.me/satriyaid">@satriyaid</a></p><h2 id="📌-总结"><a href="#📌-总结" class="headerlink" title="📌 总结"></a>📌 总结</h2><p>整体来看，After Motion Z 适合想在手机上快速完成动画制作与特效编辑的用户。本文提供了当前版本信息、下载地址与主要功能说明，建议下载后先在常用机型上测试兼容性，再作为长期创作工具使用。</p><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区讨论：</p><ol><li>你平时更常用手机做动画，还是电脑做动画？</li><li>你觉得这款软件最实用的功能是什么？</li><li>还想看哪些安卓创作工具推荐？</li></ol>]]></content>
    
    
    <summary type="html">Alight Motion 是一款强大的动画制作软件,本文提供最新版本下载及详细介绍。</summary>
    
    
    
    <category term="软件分享" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/"/>
    
    <category term="安卓软件" scheme="https://www.xmdblog.com/categories/%E8%BD%AF%E4%BB%B6%E5%88%86%E4%BA%AB/%E5%AE%89%E5%8D%93%E8%BD%AF%E4%BB%B6/"/>
    
    
    <category term="下载" scheme="https://www.xmdblog.com/tags/%E4%B8%8B%E8%BD%BD/"/>
    
    <category term="热门" scheme="https://www.xmdblog.com/tags/%E7%83%AD%E9%97%A8/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="安卓应用" scheme="https://www.xmdblog.com/tags/%E5%AE%89%E5%8D%93%E5%BA%94%E7%94%A8/"/>
    
    <category term="After Motion Z" scheme="https://www.xmdblog.com/tags/After-Motion-Z/"/>
    
  </entry>
  
  <entry>
    <title>👋 Hello World 与 Hexo 入门</title>
    <link href="https://www.xmdblog.com/posts/4a17b156.html"/>
    <id>https://www.xmdblog.com/posts/4a17b156.html</id>
    <published>2024-02-21T12:57:20.000Z</published>
    <updated>2026-10-10T08:29:42.778Z</updated>
    
    <content type="html"><![CDATA[<h2 id="📝-前言"><a href="#📝-前言" class="headerlink" title="📝 前言"></a>📝 前言</h2><p>如果你刚安装好 Hexo，系统通常会自动生成一篇默认的 Hello World。与其保留原始的英文示例，不如把它改造成一篇真正实用的入门说明，方便后续快速熟悉 Hexo 的基本工作流。</p><blockquote><p>[!TIP]<br>这篇文章也很适合作为你建站完成后的第一篇测试文章，用来确认文章发布、样式渲染与部署流程是否正常。</p></blockquote><hr><h2 id="🚀-快速开始"><a href="#🚀-快速开始" class="headerlink" title="🚀 快速开始"></a>🚀 快速开始</h2><h3 id="📝-新建一篇文章"><a href="#📝-新建一篇文章" class="headerlink" title="📝 新建一篇文章"></a>📝 新建一篇文章</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo new <span class="string">&quot;我的第一篇文章&quot;</span></span><br></pre></td></tr></table></figure><p>执行后，Hexo 会在 <code>source/_posts</code> 目录下生成对应的 Markdown 文件。</p><h3 id="▶️-启动本地预览"><a href="#▶️-启动本地预览" class="headerlink" title="▶️ 启动本地预览"></a>▶️ 启动本地预览</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo server</span><br></pre></td></tr></table></figure><p>默认访问地址为 <code>http://localhost:4000/</code>，可以实时查看修改效果。</p><h3 id="⚙️-生成静态文件"><a href="#⚙️-生成静态文件" class="headerlink" title="⚙️ 生成静态文件"></a>⚙️ 生成静态文件</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo generate</span><br></pre></td></tr></table></figure><p>这条命令会把文章、页面、样式等内容生成到 <code>public</code> 目录中，方便部署到服务器或静态托管平台。</p><h3 id="🌐-部署到远程站点"><a href="#🌐-部署到远程站点" class="headerlink" title="🌐 部署到远程站点"></a>🌐 部署到远程站点</h3><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">hexo deploy</span><br></pre></td></tr></table></figure><p>执行部署前，请先在 <code>_config.yml</code> 中正确配置 <code>deploy</code> 相关参数。</p><hr><h2 id="✨-建站建议"><a href="#✨-建站建议" class="headerlink" title="✨ 建站建议"></a>✨ 建站建议</h2><h3 id="📁-养成良好的文章结构"><a href="#📁-养成良好的文章结构" class="headerlink" title="📁 养成良好的文章结构"></a>📁 养成良好的文章结构</h3><p>建议每篇文章尽量包含以下几个部分：</p><ul><li>前言</li><li>正文步骤</li><li>总结</li><li>讨论或补充说明</li></ul><p>这样不仅更利于阅读，也更方便搜索引擎理解内容结构。</p><h3 id="🖼️-统一图片与资源管理"><a href="#🖼️-统一图片与资源管理" class="headerlink" title="🖼️ 统一图片与资源管理"></a>🖼️ 统一图片与资源管理</h3><p>文章中的图片、封面和引用资源建议按固定规则整理，后续维护会轻松很多。</p><h3 id="🏷️-保持标签精简"><a href="#🏷️-保持标签精简" class="headerlink" title="🏷️ 保持标签精简"></a>🏷️ 保持标签精简</h3><p>标签不宜过多，优先保留最能代表主题、且便于检索的关键词即可。</p><hr><h2 id="📌-总结"><a href="#📌-总结" class="headerlink" title="📌 总结"></a>📌 总结</h2><p>Hexo 的核心流程并不复杂，记住下面这几步基本就够用了：</p><ol><li>新建文章</li><li>本地预览</li><li>生成静态文件</li><li>部署到站点</li></ol><p>当你熟悉这些基础命令后，就可以继续完善主题、优化 SEO、整理文章结构，慢慢搭建出属于自己的博客。</p><hr><h2 id="💬-讨论"><a href="#💬-讨论" class="headerlink" title="💬 讨论"></a>💬 讨论</h2><p>欢迎在评论区留言分享：</p><ol><li>你使用 Hexo 的第一感受如何？</li><li>你更想优先优化主题、内容还是部署流程？</li><li>还想看哪些 Hexo 入门或进阶教程？</li></ol>]]></content>
    
    
    <summary type="html">适合 Hexo 新手阅读的入门文章，介绍建站后的基础命令、发布流程与写作建议。</summary>
    
    
    
    <category term="教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hexo教程" scheme="https://www.xmdblog.com/categories/%E6%95%99%E7%A8%8B/Hexo%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="入门" scheme="https://www.xmdblog.com/tags/%E5%85%A5%E9%97%A8/"/>
    
    <category term="建站" scheme="https://www.xmdblog.com/tags/%E5%BB%BA%E7%AB%99/"/>
    
    <category term="教程" scheme="https://www.xmdblog.com/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="精选" scheme="https://www.xmdblog.com/tags/%E7%B2%BE%E9%80%89/"/>
    
    <category term="Hexo" scheme="https://www.xmdblog.com/tags/Hexo/"/>
    
  </entry>
  
</feed>
