<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>CaoZH的笔记</title>
  
  <subtitle>个人技术笔记与经验分享</subtitle>
  <link href="https://www.geniux.top/atom.xml" rel="self"/>
  
  <link href="https://www.geniux.top/"/>
  <updated>2026-06-02T07:18:59.323Z</updated>
  <id>https://www.geniux.top/</id>
  
  <author>
    <name>CaoZH</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>推荐 MCP 服务器及安装使用手册——2026 必装工具</title>
    <link href="https://www.geniux.top/article/4223e05e80fb/"/>
    <id>https://www.geniux.top/article/4223e05e80fb/</id>
    <published>2026-06-02T04:30:00.000Z</published>
    <updated>2026-06-02T07:18:59.323Z</updated>
    
    <content type="html"><![CDATA[<h1 id="推荐-MCP-服务器及安装使用手册——2026-必装工具"><a href="#推荐-MCP-服务器及安装使用手册——2026-必装工具" class="headerlink" title="推荐 MCP 服务器及安装使用手册——2026 必装工具"></a>推荐 MCP 服务器及安装使用手册——2026 必装工具</h1><blockquote><p>截至 2026 年，MCP 服务器生态已超过 1200+ 个。本文精选了 9 个<strong>开发日常最高频使用</strong>的 MCP 服务器，每个都附带安装命令、配置说明和上手示例。</p></blockquote><span id="more"></span><h2 id="一、GitHub-MCP-——-官方版"><a href="#一、GitHub-MCP-——-官方版" class="headerlink" title="一、GitHub MCP —— 官方版"></a>一、GitHub MCP —— 官方版</h2><p><strong>官方仓库</strong>：<a href="https://github.com/github/github-mcp-server">https://github.com/github/github-mcp-server</a></p><p>GitHub MCP 是 GitHub 官方维护的 MCP 服务器，提供了对 GitHub API 的完整访问能力。它可以创建 Issue、管理 PR、搜索代码、查看仓库信息等——是<strong>最值得安装</strong>的 MCP 服务器之一。</p><h3 id="功能介绍"><a href="#功能介绍" class="headerlink" title="功能介绍"></a>功能介绍</h3><p>安装后 Claude Code 可以直接：</p><ul><li>搜索代码仓库</li><li>创建和管理 Issue</li><li>创建、审查和合并 PR</li><li>列出文件、查看文件内容</li><li>搜索用户和仓库</li><li>读取 PR 评论和讨论</li></ul><h3 id="安装方式"><a href="#安装方式" class="headerlink" title="安装方式"></a>安装方式</h3><p><strong>方式一：远程服务器（推荐，最简单）</strong></p><p>GitHub 官方提供了托管的远程 MCP 服务器，无需本地安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add github -s user \</span><br><span class="line">  --transport http \</span><br><span class="line">  -e GITHUB_TOKEN=ghp_your_token_here \</span><br><span class="line">  -- https://api.githubcopilot.com/mcp</span><br></pre></td></tr></table></figure><p><strong>方式二：本地 Docker</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add github -s user \</span><br><span class="line">  -e GITHUB_TOKEN=ghp_your_token_here \</span><br><span class="line">  -- docker run -i --rm \</span><br><span class="line">    -e GITHUB_TOKEN \</span><br><span class="line">    ghcr.io/github/github-mcp-server</span><br></pre></td></tr></table></figure><h3 id="获取-GITHUB-TOKEN"><a href="#获取-GITHUB-TOKEN" class="headerlink" title="获取 GITHUB_TOKEN"></a>获取 GITHUB_TOKEN</h3><ol><li>访问 <a href="https://github.com/settings/tokens">https://github.com/settings/tokens</a></li><li>点击 <strong>Generate new token (classic)</strong></li><li>勾选以下权限：<ul><li><code>repo</code>（私有仓库需要）</li><li><code>read:org</code></li><li><code>read:user</code></li><li><code>read:project</code></li></ul></li><li>生成后复制 token 粘贴到上述命令中</li></ol><h3 id="试用示例"><a href="#试用示例" class="headerlink" title="试用示例"></a>试用示例</h3><p>添加成功后，在 Claude Code 中尝试：</p><blockquote><p>“显示这个仓库的所有 open issues”<br>“帮我创建一个 Issue，标题为 ‘优化登录页面性能’”<br>“搜索代码中所有 import requests 的位置”<br>“列出最新的 5 个 PR”</p></blockquote><hr><h2 id="二、Playwright-MCP-——-浏览器自动化"><a href="#二、Playwright-MCP-——-浏览器自动化" class="headerlink" title="二、Playwright MCP —— 浏览器自动化"></a>二、Playwright MCP —— 浏览器自动化</h2><p><strong>官方仓库</strong>：<a href="https://github.com/microsoft/playwright-mcp">https://github.com/microsoft/playwright-mcp</a></p><p>由 <strong>Microsoft 官方</strong>维护的 Playwright MCP 服务器，让 Claude Code 能够启动和控制真实浏览器——导航页面、点击元素、填写表单、截图、提取数据、处理登录会话等。</p><h3 id="功能介绍-1"><a href="#功能介绍-1" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>启动 Chromium/Firefox/WebKit 浏览器</li><li>导航到任意 URL</li><li>点击按钮、链接、输入文本</li><li>截图和 PDF 导出</li><li>提取页面数据</li><li>处理 Cookie 和认证状态</li><li>跟踪网络请求</li></ul><h3 id="安装方式-1"><a href="#安装方式-1" class="headerlink" title="安装方式"></a>安装方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 npx 安装（推荐）</span></span><br><span class="line">claude mcp add playwright -s user -- npx @playwright/mcp@latest</span><br></pre></td></tr></table></figure><p>如果需要指定浏览器路径或其他配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add playwright -s user \</span><br><span class="line">  -e PLAYWRIGHT_BROWSERS_PATH=/path/to/browsers \</span><br><span class="line">  -- npx @playwright/mcp@latest</span><br></pre></td></tr></table></figure><p>首次运行会自动下载浏览器二进制文件。</p><h3 id="试用示例-1"><a href="#试用示例-1" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“打开 <a href="https://example.com/">https://example.com</a> 并截图”<br>“搜索 ‘Claude Code MCP’ 并将搜索结果保存到文件”<br>“帮我登录到 <a href="https://myapp.com/login%EF%BC%88%E7%94%A8%E6%88%B7%E5%90%8D%EF%BC%9Aadmin%EF%BC%8C%E5%AF%86%E7%A0%81%EF%BC%9A****%EF%BC%89&quot;">https://myapp.com/login（用户名：admin，密码：****）&quot;</a><br>“检查这个页面的所有链接是否有效”</p></blockquote><hr><h2 id="三、Filesystem-MCP-——-文件系统"><a href="#三、Filesystem-MCP-——-文件系统" class="headerlink" title="三、Filesystem MCP —— 文件系统"></a>三、Filesystem MCP —— 文件系统</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>Filesystem 是 Anthropic 官方提供的 MCP 参考服务器，让 Claude Code 获得受限的文件系统访问能力。</p><h3 id="功能介绍-2"><a href="#功能介绍-2" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>读取文件内容</li><li>写入和编辑文件</li><li>创建目录</li><li>搜索文件</li><li>获取文件信息</li><li>移动和复制文件</li></ul><h3 id="安装方式-2"><a href="#安装方式-2" class="headerlink" title="安装方式"></a>安装方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 注意：最后一个参数是允许访问的目录路径</span></span><br><span class="line">claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem /home/user/projects</span><br></pre></td></tr></table></figure><p>可以指定多个目录：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add filesystem -s user \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-filesystem \</span><br><span class="line">    /home/user/projects \</span><br><span class="line">    /home/user/documents</span><br></pre></td></tr></table></figure><h3 id="试用示例-2"><a href="#试用示例-2" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“读取 src/main.py 的内容”<br>“在 docs/ 目录下创建一个 README.md”<br>“搜索所有包含 ‘TODO’ 的 Python 文件”</p></blockquote><h3 id="安全提示"><a href="#安全提示" class="headerlink" title="安全提示"></a>安全提示</h3><p>Filesystem MCP <strong>只能访问配置时指定的目录</strong>，超出范围的路径会拒绝访问。这是重要的安全设计。</p><hr><h2 id="四、Brave-Search-MCP-——-网页搜索"><a href="#四、Brave-Search-MCP-——-网页搜索" class="headerlink" title="四、Brave Search MCP —— 网页搜索"></a>四、Brave Search MCP —— 网页搜索</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>由 Brave 提供的官方 MCP 服务器，让 Claude Code 能够搜索互联网。</p><h3 id="功能介绍-3"><a href="#功能介绍-3" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>互联网搜索</li><li>获取搜索结果的标题、URL、摘要</li><li>支持本地化搜索</li></ul><h3 id="安装方式-3"><a href="#安装方式-3" class="headerlink" title="安装方式"></a>安装方式</h3><p>需要先获取 Brave Search API Key：</p><ol><li>访问 <a href="https://brave.com/search/api/">https://brave.com/search/api/</a></li><li>注册免费账户，获取 API Key（免费套餐每月 2000 次查询）</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add brave-search -s user \</span><br><span class="line">  -e BRAVE_API_KEY=your_api_key_here \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-brave-search</span><br></pre></td></tr></table></figure><h3 id="试用示例-3"><a href="#试用示例-3" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“搜索最新的 Python 3.13 新特性”<br>“查找关于 Rust 异步编程的最佳实践”<br>“搜索今天的热门技术新闻”</p></blockquote><hr><h2 id="五、PostgreSQL-MCP-——-数据库查询"><a href="#五、PostgreSQL-MCP-——-数据库查询" class="headerlink" title="五、PostgreSQL MCP —— 数据库查询"></a>五、PostgreSQL MCP —— 数据库查询</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>让 Claude Code 直接连接到 PostgreSQL 数据库，执行查询、查看表结构、分析数据。</p><h3 id="功能介绍-4"><a href="#功能介绍-4" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>执行只读 SQL 查询</li><li>列出所有表</li><li>查看表结构（schema）</li><li>描述数据库整体架构</li></ul><h3 id="安装方式-4"><a href="#安装方式-4" class="headerlink" title="安装方式"></a>安装方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add postgres -s user \</span><br><span class="line">  -e DATABASE_URL=postgresql://user:password@localhost:5432/mydb \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-postgres</span><br></pre></td></tr></table></figure><p><code>DATABASE_URL</code> 格式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">postgresql://用户名:密码@主机:端口/数据库名</span><br></pre></td></tr></table></figure><h3 id="试用示例-4"><a href="#试用示例-4" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“列出数据库中的所有表”<br>“显示 users 表的表结构”<br>“查询最近的 10 条订单记录”<br>“分析 orders 表的索引情况”</p></blockquote><h3 id="安全提示-1"><a href="#安全提示-1" class="headerlink" title="安全提示"></a>安全提示</h3><p>PostgreSQL MCP <strong>默认只允许执行 SELECT 查询</strong>，禁止写入操作。这是出于安全考虑的设计——你可以放心让 AI 查询生产数据库。</p><hr><h2 id="六、Memory-MCP-——-持久化记忆"><a href="#六、Memory-MCP-——-持久化记忆" class="headerlink" title="六、Memory MCP —— 持久化记忆"></a>六、Memory MCP —— 持久化记忆</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>Memory MCP 为 Claude 提供基于知识图谱的持久化记忆能力。它可以在对话之间保存实体关系和事实信息。</p><h3 id="功能介绍-5"><a href="#功能介绍-5" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>创建和读取实体</li><li>建立实体之间的关系</li><li>搜索记忆</li><li>持久化存储对话中的重要信息</li></ul><h3 id="安装方式-5"><a href="#安装方式-5" class="headerlink" title="安装方式"></a>安装方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add memory -s user \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-memory</span><br></pre></td></tr></table></figure><p>默认数据存储在本地 JSON 文件中。你也可以指定存储路径：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add memory -s user \</span><br><span class="line">  -e MEMORY_FILE_PATH=/home/user/.claude-memory.json \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-memory</span><br></pre></td></tr></table></figure><h3 id="试用示例-5"><a href="#试用示例-5" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“记住我的项目叫 ProjectX，使用 FastAPI 框架”<br>“我的 API Key 保存在 ~/.env 中”<br>“ProjectX 的数据库是 PostgreSQL 15”</p></blockquote><hr><h2 id="七、Slack-MCP-——-团队协作"><a href="#七、Slack-MCP-——-团队协作" class="headerlink" title="七、Slack MCP —— 团队协作"></a>七、Slack MCP —— 团队协作</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>让 Claude Code 与 Slack 工作区交互——发送消息、查看频道历史、搜索对话。</p><h3 id="功能介绍-6"><a href="#功能介绍-6" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>发送消息到频道</li><li>读取频道历史</li><li>搜索消息</li><li>列出频道和成员</li></ul><h3 id="安装方式-6"><a href="#安装方式-6" class="headerlink" title="安装方式"></a>安装方式</h3><p>需要创建 Slack App 并获取 Token：</p><ol><li>访问 <a href="https://api.slack.com/apps">https://api.slack.com/apps</a></li><li>创建新 App → “From scratch”</li><li>添加 OAuth Scopes：<code>channels:history</code>、<code>channels:read</code>、<code>channels:write</code>、<code>chat:write</code></li><li>安装 App 到工作区，获取 Bot Token</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add slack -s user \</span><br><span class="line">  -e SLACK_BOT_TOKEN=xoxb-your-token-here \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-slack</span><br></pre></td></tr></table></figure><h3 id="试用示例-6"><a href="#试用示例-6" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“在 #general 频道发送一条 Hello”<br>“显示 #engineering 频道最近的 5 条消息”<br>“搜索关于 ‘deploy’ 的最近消息”</p></blockquote><hr><h2 id="八、Sequential-Thinking-MCP-——-结构化推理"><a href="#八、Sequential-Thinking-MCP-——-结构化推理" class="headerlink" title="八、Sequential Thinking MCP —— 结构化推理"></a>八、Sequential Thinking MCP —— 结构化推理</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>Sequential Thinking MCP 提供了一个结构化的思维方式，帮助 Claude Code 在复杂问题上进行深度推理。它通过”思维链”的方式分解问题。</p><h3 id="功能介绍-7"><a href="#功能介绍-7" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>分步骤结构化推理</li><li>记录和回溯思考过程</li><li>支持分支探索</li><li>适用于复杂问题分析</li></ul><h3 id="安装方式-7"><a href="#安装方式-7" class="headerlink" title="安装方式"></a>安装方式</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add sequential-thinking -s user \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-sequential-thinking</span><br></pre></td></tr></table></figure><h3 id="试用示例-7"><a href="#试用示例-7" class="headerlink" title="试用示例"></a>试用示例</h3><p>当处理复杂问题时，Claude Code 会自动启用 Sequential Thinking。你可以主动要求：</p><blockquote><p>“请使用 Sequential Thinking 分析这个数据库迁移方案的风险”</p></blockquote><hr><h2 id="九、Sentry-MCP-——-错误监控"><a href="#九、Sentry-MCP-——-错误监控" class="headerlink" title="九、Sentry MCP —— 错误监控"></a>九、Sentry MCP —— 错误监控</h2><p><strong>官方仓库</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></p><p>让 Claude Code 直接访问 Sentry 错误监控平台的数据。</p><h3 id="功能介绍-8"><a href="#功能介绍-8" class="headerlink" title="功能介绍"></a>功能介绍</h3><ul><li>查看最近的错误事件</li><li>获取错误详情和堆栈跟踪</li><li>查询 Issue 列表和统计</li><li>获取性能数据</li></ul><h3 id="安装方式-8"><a href="#安装方式-8" class="headerlink" title="安装方式"></a>安装方式</h3><p>需要 Sentry Auth Token：</p><ol><li>访问 <a href="https://sentry.io/settings/account/api/auth-tokens/">https://sentry.io/settings/account/api/auth-tokens/</a></li><li>创建 Token，勾选 <code>event:read</code> 和 <code>issue:read</code> 权限</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add sentry -s user \</span><br><span class="line">  -e SENTRY_AUTH_TOKEN=your_token_here \</span><br><span class="line">  -e SENTRY_ORG=your_org_slug \</span><br><span class="line">  -- npx -y @modelcontextprotocol/server-sentry</span><br></pre></td></tr></table></figure><h3 id="试用示例-8"><a href="#试用示例-8" class="headerlink" title="试用示例"></a>试用示例</h3><blockquote><p>“显示最近 24 小时的错误事件”<br>“查看 Issue ID 12345 的详细堆栈信息”<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="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. GitHub（远程推荐）</span></span><br><span class="line">claude mcp add github -s user --transport http -e GITHUB_TOKEN=ghp_xxx -- https://api.githubcopilot.com/mcp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. Playwright（浏览器自动化）</span></span><br><span class="line">claude mcp add playwright -s user -- npx @playwright/mcp@latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. Filesystem（文件系统）</span></span><br><span class="line">claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem /path/to/projects</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. Brave Search（网页搜索）</span></span><br><span class="line">claude mcp add brave-search -s user -e BRAVE_API_KEY=xxx -- npx -y @modelcontextprotocol/server-brave-search</span><br><span class="line"></span><br><span class="line"><span class="comment"># 5. PostgreSQL（数据库）</span></span><br><span class="line">claude mcp add postgres -s user -e DATABASE_URL=postgresql://user:pass@localhost:5432/db -- npx -y @modelcontextprotocol/server-postgres</span><br><span class="line"></span><br><span class="line"><span class="comment"># 6. Memory（持久记忆）</span></span><br><span class="line">claude mcp add memory -s user -- npx -y @modelcontextprotocol/server-memory</span><br><span class="line"></span><br><span class="line"><span class="comment"># 7. Sequential Thinking（结构化推理）</span></span><br><span class="line">claude mcp add sequential-thinking -s user -- npx -y @modelcontextprotocol/server-sequential-thinking</span><br></pre></td></tr></table></figure><h3 id="验证安装"><a href="#验证安装" class="headerlink" title="验证安装"></a>验证安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 列出所有已安装的 MCP 服务器</span></span><br><span class="line">claude mcp list</span><br></pre></td></tr></table></figure><h3 id="移除不需要的服务器"><a href="#移除不需要的服务器" class="headerlink" title="移除不需要的服务器"></a>移除不需要的服务器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude mcp remove &lt;服务器名称&gt;</span><br></pre></td></tr></table></figure><hr><h2 id="十一、选型建议"><a href="#十一、选型建议" class="headerlink" title="十一、选型建议"></a>十一、选型建议</h2><table><thead><tr><th>使用场景</th><th>必装推荐</th><th>备注</th></tr></thead><tbody><tr><td>日常开发</td><td>GitHub + Filesystem</td><td>核心组合</td></tr><tr><td>Web 开发</td><td>+ Playwright + Brave Search</td><td>浏览器测试和搜索</td></tr><tr><td>后端/数据</td><td>+ PostgreSQL</td><td>数据库查询</td></tr><tr><td>团队协作</td><td>+ Slack</td><td>沟通协作</td></tr><tr><td>错误排查</td><td>+ Sentry</td><td>错误监控</td></tr><tr><td>复杂项目</td><td>+ Memory + Sequential Thinking</td><td>记忆和深度推理</td></tr></tbody></table><p><strong>新手入门建议</strong>：先安装 <strong>GitHub</strong> 和 <strong>Filesystem</strong> 这两个最基础的，用熟了再逐步添加。不要一次加太多，以免增加 Claude Code 的上下文负担。</p><hr><h2 id="十二、常见问题"><a href="#十二、常见问题" class="headerlink" title="十二、常见问题"></a>十二、常见问题</h2><h3 id="Q-MCP-服务器需要-Node-js-吗？"><a href="#Q-MCP-服务器需要-Node-js-吗？" class="headerlink" title="Q: MCP 服务器需要 Node.js 吗？"></a>Q: MCP 服务器需要 Node.js 吗？</h3><p>很多基于 npx 安装的 MCP 服务器需要 Node.js 18+。通过 Docker 运行的则不需要。</p><h3 id="Q-安装后-Claude-Code-不调用工具怎么办？"><a href="#Q-安装后-Claude-Code-不调用工具怎么办？" class="headerlink" title="Q: 安装后 Claude Code 不调用工具怎么办？"></a>Q: 安装后 Claude Code 不调用工具怎么办？</h3><p>确保用 <code>claude mcp list</code> 确认状态为 <code>connected</code>。如果是 <code>disconnected</code>，重启 Claude Code 或检查环境变量是否正确。</p><h3 id="Q-不同项目可以用不同的-MCP-配置吗？"><a href="#Q-不同项目可以用不同的-MCP-配置吗？" class="headerlink" title="Q: 不同项目可以用不同的 MCP 配置吗？"></a>Q: 不同项目可以用不同的 MCP 配置吗？</h3><p>可以。项目级配置（<code>-s project</code>）会创建 <code>.mcp.json</code> 文件，不同项目可以有各自独立的 MCP 配置。</p><h3 id="Q-MCP-服务器会占用大量资源吗？"><a href="#Q-MCP-服务器会占用大量资源吗？" class="headerlink" title="Q: MCP 服务器会占用大量资源吗？"></a>Q: MCP 服务器会占用大量资源吗？</h3><p>大部分 MCP 服务器按需启动，空闲时不占用资源。Playwright（浏览器自动化）会比较耗资源，建议按需使用。</p><h3 id="Q-在哪里可以找到更多-MCP-服务器？"><a href="#Q-在哪里可以找到更多-MCP-服务器？" class="headerlink" title="Q: 在哪里可以找到更多 MCP 服务器？"></a>Q: 在哪里可以找到更多 MCP 服务器？</h3><ul><li><strong>官方参考</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></li><li><strong>MCP 注册中心</strong>：<a href="https://mcp.so/">https://mcp.so</a></li><li><strong>Awesome MCP</strong>：<a href="https://mcpservers.org/">https://mcpservers.org</a></li><li><strong>Smithery</strong>：<a href="https://smithery.ai/">https://smithery.ai</a></li></ul><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>本文精选了 9 个在 2026 年最值得安装的 MCP 服务器，覆盖了日常开发的各个方面。从 GitHub 代码管理到 Playwright 浏览器自动化，从文件系统到数据库查询——每个工具都配有完整的安装命令和上手示例。</p><p>记住：<strong>先装最需要的，用熟了再扩展</strong>。GitHub + Filesystem 的组合已经能覆盖大部分日常开发场景。随着你对 Claude Code 的使用深入，再逐步探索更多 MCP 服务器带来的可能性。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;推荐-MCP-服务器及安装使用手册——2026-必装工具&quot;&gt;&lt;a href=&quot;#推荐-MCP-服务器及安装使用手册——2026-必装工具&quot; class=&quot;headerlink&quot; title=&quot;推荐 MCP 服务器及安装使用手册——2026 必装工具&quot;&gt;&lt;/a&gt;推荐 MCP 服务器及安装使用手册——2026 必装工具&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;截至 2026 年，MCP 服务器生态已超过 1200+ 个。本文精选了 9 个&lt;strong&gt;开发日常最高频使用&lt;/strong&gt;的 MCP 服务器，每个都附带安装命令、配置说明和上手示例。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="AI 工具" scheme="https://www.geniux.top/categories/AI-%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="工具推荐" scheme="https://www.geniux.top/tags/%E5%B7%A5%E5%85%B7%E6%8E%A8%E8%8D%90/"/>
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Claude Code" scheme="https://www.geniux.top/tags/Claude-Code/"/>
    
    <category term="MCP" scheme="https://www.geniux.top/tags/MCP/"/>
    
  </entry>
  
  <entry>
    <title>Claude Code MCP 使用教程——从入门到精通</title>
    <link href="https://www.geniux.top/article/93c0a3a9f288/"/>
    <id>https://www.geniux.top/article/93c0a3a9f288/</id>
    <published>2026-06-02T04:00:00.000Z</published>
    <updated>2026-06-02T07:18:59.319Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Claude-Code-MCP-使用教程——从入门到精通"><a href="#Claude-Code-MCP-使用教程——从入门到精通" class="headerlink" title="Claude Code MCP 使用教程——从入门到精通"></a>Claude Code MCP 使用教程——从入门到精通</h1><h2 id="一、什么是-MCP？"><a href="#一、什么是-MCP？" class="headerlink" title="一、什么是 MCP？"></a>一、什么是 MCP？</h2><p>MCP（Model Context Protocol，模型上下文协议）是 Anthropic 于 2024 年 11 月推出的<strong>开源标准协议</strong>，旨在统一 AI 大模型与外部工具、数据源之间的通信方式。你可以把 MCP 理解为 <strong>AI 世界的 USB-C 接口</strong>——通过一个标准化的协议，让 AI 助手能够直接访问文件系统、数据库、API、浏览器等各种外部资源。</p><p>在 Claude Code 中，MCP 是其<strong>扩展能力的核心机制</strong>。通过连接 MCP 服务器，Claude Code 可以：</p><ul><li>读取和写入本地文件</li><li>操作 GitHub 仓库（创建 Issue、PR、代码搜索）</li><li>查询数据库</li><li>控制浏览器进行自动化操作</li><li>调用各种 Web API</li></ul><blockquote><p>MCP 分为三个角色：<strong>MCP 主机</strong>（如 Claude Code、Claude Desktop）、<strong>MCP 客户端</strong>（协议客户端）、<strong>MCP 服务器</strong>（提供具体工具和资源的中间件）。</p></blockquote><span id="more"></span><h2 id="二、Claude-Code-中的-MCP-配置方式"><a href="#二、Claude-Code-中的-MCP-配置方式" class="headerlink" title="二、Claude Code 中的 MCP 配置方式"></a>二、Claude Code 中的 MCP 配置方式</h2><p>Claude Code 支持多种配置 MCP 服务器的方式，从简单到高级，满足不同场景需求。</p><h3 id="2-1-使用-claude-mcp-命令（推荐）"><a href="#2-1-使用-claude-mcp-命令（推荐）" class="headerlink" title="2.1 使用 claude mcp 命令（推荐）"></a>2.1 使用 claude mcp 命令（推荐）</h3><p>这是最简单、最推荐的方式。Claude Code 提供了专门的交互式 CLI 命令来管理 MCP：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看所有已配置的 MCP 服务器</span></span><br><span class="line">claude mcp list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加一个新的 MCP 服务器</span></span><br><span class="line">claude mcp add &lt;服务器名称&gt; [选项] -- &lt;启动命令&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 移除一个 MCP 服务器</span></span><br><span class="line">claude mcp remove &lt;服务器名称&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 交互式 MCP 配置界面</span></span><br><span class="line">claude mcp</span><br></pre></td></tr></table></figure><h4 id="作用域（Scope）选项"><a href="#作用域（Scope）选项" class="headerlink" title="作用域（Scope）选项"></a>作用域（Scope）选项</h4><p>MCP 配置有三个作用域层级：</p><table><thead><tr><th>作用域</th><th>命令参数</th><th>配置文件位置</th><th>适用场景</th></tr></thead><tbody><tr><td>项目级</td><td><code>-s project</code> （默认）</td><td>项目根目录的 <code>.mcp.json</code></td><td>团队共享的工具</td></tr><tr><td>用户级</td><td><code>-s user</code></td><td><code>~/.claude/settings.json</code></td><td>个人常用工具</td></tr><tr><td>全局级</td><td><code>-s global</code></td><td>Claude Code 全局配置</td><td>所有项目都可用</td></tr></tbody></table><p>示例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 项目级：仅供当前项目使用</span></span><br><span class="line">claude mcp add filesystem -s project -- npx -y @modelcontextprotocol/server-filesystem /path/to/project</span><br><span class="line"></span><br><span class="line"><span class="comment"># 用户级：当前用户的所有项目都可用</span></span><br><span class="line">claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem /path/to/project</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局级：所有用户和项目都可用</span></span><br><span class="line">claude mcp add filesystem -s global -- npx -y @modelcontextprotocol/server-filesystem /path</span><br></pre></td></tr></table></figure><h3 id="2-2-两种传输方式（Transport）"><a href="#2-2-两种传输方式（Transport）" class="headerlink" title="2.2 两种传输方式（Transport）"></a>2.2 两种传输方式（Transport）</h3><p>MCP 服务器可以通过两种方式与 Claude Code 通信：</p><h4 id="stdio-传输（本地服务器）"><a href="#stdio-传输（本地服务器）" class="headerlink" title="stdio 传输（本地服务器）"></a>stdio 传输（本地服务器）</h4><p>服务器作为子进程运行，通过标准输入/输出通信。适用于运行在本地机器上的工具。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add myserver -- npx -y @modelcontextprotocol/server-filesystem /path</span><br></pre></td></tr></table></figure><h4 id="HTTP-传输（远程服务器）"><a href="#HTTP-传输（远程服务器）" class="headerlink" title="HTTP 传输（远程服务器）"></a>HTTP 传输（远程服务器）</h4><p>服务器运行在远程，通过 HTTP/SSE 通信。适用于云服务。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add myserver --transport http -- https://api.example.com/mcp</span><br></pre></td></tr></table></figure><h3 id="2-3-手动编辑配置文件"><a href="#2-3-手动编辑配置文件" class="headerlink" title="2.3 手动编辑配置文件"></a>2.3 手动编辑配置文件</h3><p>如果你更喜欢手动编辑，也可以直接修改配置文件。</p><p><strong>项目级配置</strong>（<code>.mcp.json</code>，放在项目根目录）：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;mcpServers&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;filesystem&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;npx&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;args&quot;</span>: [<span class="string">&quot;-y&quot;</span>, <span class="string">&quot;@modelcontextprotocol/server-filesystem&quot;</span>, <span class="string">&quot;/path/to/project&quot;</span>]</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;github&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;npx&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;args&quot;</span>: [<span class="string">&quot;-y&quot;</span>, <span class="string">&quot;@modelcontextprotocol/server-github&quot;</span>],</span><br><span class="line">      <span class="attr">&quot;env&quot;</span>: &#123;</span><br><span class="line">        <span class="attr">&quot;GITHUB_TOKEN&quot;</span>: <span class="string">&quot;ghp_your_token_here&quot;</span></span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>用户级配置</strong>（<code>~/.claude/settings.json</code>）：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;mcpServers&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;filesystem&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;npx&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;args&quot;</span>: [<span class="string">&quot;-y&quot;</span>, <span class="string">&quot;@modelcontextprotocol/server-filesystem&quot;</span>, <span class="string">&quot;/path/to/project&quot;</span>]</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="三、添加-MCP-服务器的完整流程"><a href="#三、添加-MCP-服务器的完整流程" class="headerlink" title="三、添加 MCP 服务器的完整流程"></a>三、添加 MCP 服务器的完整流程</h2><h3 id="3-1-查找可用的-MCP-服务器"><a href="#3-1-查找可用的-MCP-服务器" class="headerlink" title="3.1 查找可用的 MCP 服务器"></a>3.1 查找可用的 MCP 服务器</h3><ul><li><strong>官方参考服务器</strong>：<a href="https://github.com/modelcontextprotocol/servers">https://github.com/modelcontextprotocol/servers</a></li><li><strong>MCP 注册中心</strong>：<a href="https://mcp.so/">https://mcp.so</a></li><li><strong>Awesome MCP Servers</strong>：<a href="https://mcpservers.org/">https://mcpservers.org</a></li></ul><h3 id="3-2-添加一个-MCP-服务器"><a href="#3-2-添加一个-MCP-服务器" class="headerlink" title="3.2 添加一个 MCP 服务器"></a>3.2 添加一个 MCP 服务器</h3><p>以添加文件系统服务器为例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Step 1: 确认 Node.js 已安装</span></span><br><span class="line">node --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># Step 2: 使用 claude mcp add 命令添加</span></span><br><span class="line">claude mcp add filesystem -s user -- npx -y @modelcontextprotocol/server-filesystem /home/user/projects</span><br><span class="line"></span><br><span class="line"><span class="comment"># Step 3: 验证是否成功</span></span><br><span class="line">claude mcp list</span><br></pre></td></tr></table></figure><h3 id="3-3-添加需要环境变量的服务器"><a href="#3-3-添加需要环境变量的服务器" class="headerlink" title="3.3 添加需要环境变量的服务器"></a>3.3 添加需要环境变量的服务器</h3><p>有些 MCP 服务器需要 API Key 等敏感信息，可以通过 <code>-e</code> 或 <code>--env</code> 参数传入：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add github -s project -e GITHUB_TOKEN=ghp_your_token_here -- npx -y @modelcontextprotocol/server-github</span><br></pre></td></tr></table></figure><p>你也可以指定多个环境变量：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add myserver \</span><br><span class="line">  -e API_KEY=abc123 \</span><br><span class="line">  -e API_BASE=https://api.example.com \</span><br><span class="line">  -- npx -y my-mcp-server</span><br></pre></td></tr></table></figure><h3 id="3-4-在对话中使用-MCP-工具"><a href="#3-4-在对话中使用-MCP-工具" class="headerlink" title="3.4 在对话中使用 MCP 工具"></a>3.4 在对话中使用 MCP 工具</h3><p>添加成功后，在 Claude Code 的对话中直接描述你的需求即可——Claude Code 会自动调用已安装的 MCP 工具。</p><p>例如添加了 GitHub MCP 后，你可以说：</p><blockquote><p>“列出这个仓库最近的 issues”<br>“帮我创建一个 PR”<br>“搜索代码中包含 ‘auth’ 的所有文件”</p></blockquote><p>Claude Code 会识别你的意图，自动选择合适的 MCP 工具来执行。</p><h3 id="3-5-查看当前连接的-MCP-服务器"><a href="#3-5-查看当前连接的-MCP-服务器" class="headerlink" title="3.5 查看当前连接的 MCP 服务器"></a>3.5 查看当前连接的 MCP 服务器</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude mcp list</span><br></pre></td></tr></table></figure><p>这会显示所有已配置的 MCP 服务器及其连接状态。</p><h2 id="四、MCP-配置详解"><a href="#四、MCP-配置详解" class="headerlink" title="四、MCP 配置详解"></a>四、MCP 配置详解</h2><h3 id="4-1-配置文件结构"><a href="#4-1-配置文件结构" class="headerlink" title="4.1 配置文件结构"></a>4.1 配置文件结构</h3><p><code>.mcp.json</code> 或 <code>settings.json</code> 中的 MCP 配置结构如下：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;mcpServers&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;server-name&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;npx&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;args&quot;</span>: [<span class="string">&quot;-y&quot;</span>, <span class="string">&quot;package-name&quot;</span>, <span class="string">&quot;arg1&quot;</span>, <span class="string">&quot;arg2&quot;</span>],</span><br><span class="line">      <span class="attr">&quot;env&quot;</span>: &#123;</span><br><span class="line">        <span class="attr">&quot;KEY&quot;</span>: <span class="string">&quot;value&quot;</span></span><br><span class="line">      &#125;,</span><br><span class="line">      <span class="attr">&quot;transport&quot;</span>: <span class="string">&quot;stdio&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><table><thead><tr><th>字段</th><th>说明</th><th>必填</th></tr></thead><tbody><tr><td><code>command</code></td><td>要执行的命令</td><td>是</td></tr><tr><td><code>args</code></td><td>命令参数数组</td><td>否</td></tr><tr><td><code>env</code></td><td>环境变量对象</td><td>否</td></tr><tr><td><code>transport</code></td><td>传输方式（<code>stdio</code> 或 <code>http</code>）</td><td>否，默认 <code>stdio</code></td></tr></tbody></table><h3 id="4-2-配置文件优先级"><a href="#4-2-配置文件优先级" class="headerlink" title="4.2 配置文件优先级"></a>4.2 配置文件优先级</h3><p>Claude Code 按照以下顺序合并配置（后面的覆盖前面的）：</p><ol><li>全局配置</li><li>用户级配置（<code>~/.claude/settings.json</code>）</li><li>项目级配置（<code>./.mcp.json</code>）</li></ol><h2 id="五、高级用法"><a href="#五、高级用法" class="headerlink" title="五、高级用法"></a>五、高级用法</h2><h3 id="5-1-使用-Docker-运行-MCP-服务器"><a href="#5-1-使用-Docker-运行-MCP-服务器" class="headerlink" title="5.1 使用 Docker 运行 MCP 服务器"></a>5.1 使用 Docker 运行 MCP 服务器</h3><p>有些 MCP 服务器推荐使用 Docker 运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">claude mcp add github-mcp \</span><br><span class="line">  -e GITHUB_TOKEN=ghp_your_token_here \</span><br><span class="line">  -- docker run -i --rm \</span><br><span class="line">    -e GITHUB_TOKEN \</span><br><span class="line">    ghcr.io/github/github-mcp-server</span><br></pre></td></tr></table></figure><h3 id="5-2-通过插件安装-MCP"><a href="#5-2-通过插件安装-MCP" class="headerlink" title="5.2 通过插件安装 MCP"></a>5.2 通过插件安装 MCP</h3><p>Claude Code 的插件（plugin）可以自动捆绑 MCP 服务器配置。安装插件后，MCP 服务器会自动配置好，无需手动操作：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 Figma 插件（自动配置 Figma MCP）</span></span><br><span class="line">claude plugins install figma</span><br></pre></td></tr></table></figure><h3 id="5-3-修改-MCP-输出-Token-限制"><a href="#5-3-修改-MCP-输出-Token-限制" class="headerlink" title="5.3 修改 MCP 输出 Token 限制"></a>5.3 修改 MCP 输出 Token 限制</h3><p>Claude Code 默认在 MCP 工具输出超过 10,000 tokens 时会显示警告。如果需要，可以通过环境变量增加限制：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> MAX_MCP_OUTPUT_TOKENS=50000</span><br></pre></td></tr></table></figure><h3 id="5-4-动态工具更新"><a href="#5-4-动态工具更新" class="headerlink" title="5.4 动态工具更新"></a>5.4 动态工具更新</h3><p>Claude Code 支持 MCP 的 <code>list_changed</code> 通知——MCP 服务器可以动态更新其可用工具、提示和资源，无需你断开重连。</p><h3 id="5-5-排查-MCP-连接问题"><a href="#5-5-排查-MCP-连接问题" class="headerlink" title="5.5 排查 MCP 连接问题"></a>5.5 排查 MCP 连接问题</h3><p>如果 MCP 服务器连接失败，可以按以下步骤排查：</p><ol><li><p><strong>检查服务器是否安装正确</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude mcp list</span><br></pre></td></tr></table></figure></li><li><p><strong>检查环境变量是否正确</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 手动运行命令测试</span></span><br><span class="line">npx -y @modelcontextprotocol/server-github</span><br></pre></td></tr></table></figure></li><li><p><strong>重新启动 Claude Code</strong><br>有时需要重启会话才能加载新配置。</p></li><li><p><strong>检查配置文件语法</strong><br>确保 JSON 格式正确，没有多余的逗号。</p></li><li><p><strong>查看 Node.js 版本</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node --version  <span class="comment"># 需要 Node.js 18+</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="六、安全和最佳实践"><a href="#六、安全和最佳实践" class="headerlink" title="六、安全和最佳实践"></a>六、安全和最佳实践</h2><h3 id="6-1-安全注意事项"><a href="#6-1-安全注意事项" class="headerlink" title="6.1 安全注意事项"></a>6.1 安全注意事项</h3><ul><li><strong>只添加可信的 MCP 服务器</strong>——特别是那些需要网络访问或文件系统权限的服务器</li><li><strong>谨慎使用全局作用域</strong>——只需要在多个项目中使用的工具才设为 global</li><li><strong>定期审计配置</strong>——运行 <code>claude mcp list</code> 检查当前启用了哪些 MCP 服务器</li><li><strong>API Key 安全</strong>——使用 <code>-e</code> 参数而不是在配置文件中硬编码密钥</li></ul><h3 id="6-2-最佳实践"><a href="#6-2-最佳实践" class="headerlink" title="6.2 最佳实践"></a>6.2 最佳实践</h3><ul><li><strong>项目级 vs 用户级</strong>：团队共享的工具用 project 作用域，个人工具用 user 作用域</li><li><strong>按需添加</strong>：不要一次性添加太多 MCP 服务器，以免增加上下文负担</li><li><strong>验证可用性</strong>：添加后立即测试，确保服务器正常工作</li><li><strong>定期更新</strong>：MCP 服务器生态发展很快，定期检查更新</li><li><strong>利用 Tool Search</strong>：Claude Code 的 Tool Search 功能会自动从已配置的 MCP 服务器中搜索最相关的工具，保持上下文高效</li></ul><h2 id="七、总结"><a href="#七、总结" class="headerlink" title="七、总结"></a>七、总结</h2><p>MCP 是 Claude Code 扩展能力的关键。通过本文介绍的 <code>claude mcp add</code> 命令和配置文件方式，你可以轻松地将 Claude Code 连接到文件系统、GitHub、数据库、浏览器等各种外部工具。</p><p>核心记忆口诀：</p><ul><li><strong>添加</strong>：<code>claude mcp add &lt;名称&gt; [选项] -- &lt;启动命令&gt;</code></li><li><strong>查看</strong>：<code>claude mcp list</code></li><li><strong>移除</strong>：<code>claude mcp remove &lt;名称&gt;</code></li><li><strong>作用域</strong>：project（默认）、user、global</li><li><strong>传输</strong>：stdio（本地）、http（远程）</li></ul><p>下一篇文章我将介绍<strong>最推荐的 MCP 服务器</strong>及其详细的安装步骤和使用手册。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;Claude-Code-MCP-使用教程——从入门到精通&quot;&gt;&lt;a href=&quot;#Claude-Code-MCP-使用教程——从入门到精通&quot; class=&quot;headerlink&quot; title=&quot;Claude Code MCP 使用教程——从入门到精通&quot;&gt;&lt;/a&gt;Claude Code MCP 使用教程——从入门到精通&lt;/h1&gt;&lt;h2 id=&quot;一、什么是-MCP？&quot;&gt;&lt;a href=&quot;#一、什么是-MCP？&quot; class=&quot;headerlink&quot; title=&quot;一、什么是 MCP？&quot;&gt;&lt;/a&gt;一、什么是 MCP？&lt;/h2&gt;&lt;p&gt;MCP（Model Context Protocol，模型上下文协议）是 Anthropic 于 2024 年 11 月推出的&lt;strong&gt;开源标准协议&lt;/strong&gt;，旨在统一 AI 大模型与外部工具、数据源之间的通信方式。你可以把 MCP 理解为 &lt;strong&gt;AI 世界的 USB-C 接口&lt;/strong&gt;——通过一个标准化的协议，让 AI 助手能够直接访问文件系统、数据库、API、浏览器等各种外部资源。&lt;/p&gt;
&lt;p&gt;在 Claude Code 中，MCP 是其&lt;strong&gt;扩展能力的核心机制&lt;/strong&gt;。通过连接 MCP 服务器，Claude Code 可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读取和写入本地文件&lt;/li&gt;
&lt;li&gt;操作 GitHub 仓库（创建 Issue、PR、代码搜索）&lt;/li&gt;
&lt;li&gt;查询数据库&lt;/li&gt;
&lt;li&gt;控制浏览器进行自动化操作&lt;/li&gt;
&lt;li&gt;调用各种 Web API&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;MCP 分为三个角色：&lt;strong&gt;MCP 主机&lt;/strong&gt;（如 Claude Code、Claude Desktop）、&lt;strong&gt;MCP 客户端&lt;/strong&gt;（协议客户端）、&lt;strong&gt;MCP 服务器&lt;/strong&gt;（提供具体工具和资源的中间件）。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="AI 工具" scheme="https://www.geniux.top/categories/AI-%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Claude Code" scheme="https://www.geniux.top/tags/Claude-Code/"/>
    
    <category term="MCP" scheme="https://www.geniux.top/tags/MCP/"/>
    
    <category term="AI 编程" scheme="https://www.geniux.top/tags/AI-%E7%BC%96%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>Claude Code Agents 多代理协作实战——并行任务自动化</title>
    <link href="https://www.geniux.top/article/a87f11d9789c/"/>
    <id>https://www.geniux.top/article/a87f11d9789c/</id>
    <published>2026-06-02T02:00:00.000Z</published>
    <updated>2026-06-02T03:27:07.558Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Claude-Code-Agents-多代理协作实战——并行任务自动化"><a href="#Claude-Code-Agents-多代理协作实战——并行任务自动化" class="headerlink" title="Claude Code Agents 多代理协作实战——并行任务自动化"></a>Claude Code Agents 多代理协作实战——并行任务自动化</h1><p>Claude Code Agents（子代理系统）是 Claude Code 的高级特性，允许你定义专用子代理来并行执行子任务。本文从基础概念到高级实战，带你全面掌握多代理协作技术。</p><hr><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ol><li><a href="#%E4%B8%80%E4%BB%80%E4%B9%88%E6%98%AF-agents">什么是 Agents？</a></li><li><a href="#%E4%BA%8Cagents-%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86">Agents 的工作原理</a></li><li><a href="#%E4%B8%89%E5%89%8D%E7%BD%AE%E8%A6%81%E6%B1%82%E4%B8%8E%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87">前置要求与环境准备</a></li><li><a href="#%E5%9B%9B%E5%88%9B%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA-agent">创建你的第一个 Agent</a></li><li><a href="#%E4%BA%94agent-%E5%AE%9A%E4%B9%89%E8%AF%A6%E8%A7%A3">Agent 定义详解</a></li><li><a href="#%E5%85%AD%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE%E7%BA%A7-agent-%E4%BD%93%E7%B3%BB%E6%90%AD%E5%BB%BA">实战：项目级 Agent 体系搭建</a></li><li><a href="#%E4%B8%83%E5%B9%B6%E8%A1%8C%E4%BB%BB%E5%8A%A1%E7%BC%96%E6%8E%92%E6%8A%80%E5%B7%A7">并行任务编排技巧</a></li><li><a href="#%E5%85%AB%E8%B0%83%E8%AF%95%E4%B8%8E%E4%BC%98%E5%8C%96">调试与优化</a></li><li><a href="#%E4%B9%9D%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">常见问题</a></li></ol><hr><h2 id="一、什么是-Agents？"><a href="#一、什么是-Agents？" class="headerlink" title="一、什么是 Agents？"></a>一、什么是 Agents？</h2><p>Agents（子代理）是 Claude Code 中的<strong>专用子代理系统</strong>。你可以为特定任务类型（如代码审查、测试编写、文档生成）定义专门的子代理，每个子代理拥有<strong>独立的指令、工具权限和上下文窗口</strong>。</p><h3 id="核心优势"><a href="#核心优势" class="headerlink" title="核心优势"></a>核心优势</h3><table><thead><tr><th>特性</th><th>说明</th></tr></thead><tbody><tr><td><strong>并行执行</strong></td><td>多个 Agent 可以同时处理不同任务</td></tr><tr><td><strong>专用指令</strong></td><td>每个 Agent 有自己的行为规范</td></tr><tr><td><strong>隔离上下文</strong></td><td>Agent 之间的上下文互不干扰</td></tr><tr><td><strong>任务分派</strong></td><td>用 <code>@agent-name</code> 语法分配任务</td></tr><tr><td><strong>结果汇总</strong></td><td>所有 Agent 结果会回到主会话</td></tr></tbody></table><h3 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</h3><ul><li><strong>大型重构</strong>：将代码拆分为多个独立模块并行修改</li><li><strong>多文件测试</strong>：同时为多个组件编写单元测试</li><li><strong>全栈开发</strong>：前端/后端/数据库工作并行进行</li><li><strong>代码审查</strong>：多个 PR 同时审查</li><li><strong>文档生成</strong>：为多个模块同时生成文档</li></ul><h3 id="Agents-vs-Skills-vs-Hooks"><a href="#Agents-vs-Skills-vs-Hooks" class="headerlink" title="Agents vs Skills vs Hooks"></a>Agents vs Skills vs Hooks</h3><table><thead><tr><th>特性</th><th>Agents</th><th>Skills</th><th>Hooks</th></tr></thead><tbody><tr><td><strong>执行方式</strong></td><td>手动触发 <code>@agent-name</code></td><td>自动匹配自然语言</td><td>自动触发事件</td></tr><tr><td><strong>是否独立</strong></td><td>✅ 独立会话</td><td>❌ 当前会话内</td><td>❌ 当前会话内</td></tr><tr><td><strong>并行能力</strong></td><td>✅ 支持</td><td>❌ 不支持</td><td>❌ 串行</td></tr><tr><td><strong>指令定制</strong></td><td>✅ 详细定义</td><td>✅ 详细定义</td><td>❌ 简单脚本</td></tr><tr><td><strong>上下文隔离</strong></td><td>✅ 完全隔离</td><td>❌ 共享</td><td>❌ 共享</td></tr></tbody></table><hr><h2 id="二、Agents-的工作原理"><a href="#二、Agents-的工作原理" class="headerlink" title="二、Agents 的工作原理"></a>二、Agents 的工作原理</h2><h3 id="执行流程"><a href="#执行流程" class="headerlink" title="执行流程"></a>执行流程</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">主会话</span><br><span class="line">  │</span><br><span class="line">  ├── @agent-1 &quot;为 UserService 写测试&quot;  ──→ 子代理 1（测试编写）</span><br><span class="line">  │                                          ├─ 读取 UserService 源码</span><br><span class="line">  │                                          ├─ 编写测试用例</span><br><span class="line">  │                                          └─ 返回：已创建 5 个测试文件</span><br><span class="line">  │</span><br><span class="line">  ├── @agent-2 &quot;重构 ProductService&quot;    ──→ 子代理 2（代码重构）</span><br><span class="line">  │                                          ├─ 分析 ProductService</span><br><span class="line">  │                                          ├─ 执行重构</span><br><span class="line">  │                                          └─ 返回：重构完成，通过测试</span><br><span class="line">  │</span><br><span class="line">  └── @agent-3 &quot;更新 API 文档&quot;          ──→ 子代理 3（文档编写）</span><br><span class="line">                                             ├─ 扫描路由定义</span><br><span class="line">                                             ├─ 生成 OpenAPI 文档</span><br><span class="line">                                             └─ 返回：API 文档已更新</span><br></pre></td></tr></table></figure><h3 id="通信模型"><a href="#通信模型" class="headerlink" title="通信模型"></a>通信模型</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">主会话 ←→ Agent 1    （并行）</span><br><span class="line">主会话 ←→ Agent 2    （并行）</span><br><span class="line">主会话 ←→ Agent 3    （并行）</span><br></pre></td></tr></table></figure><p>Agent 之间<strong>不直接通信</strong>，所有结果汇总到主会话。主会话负责协调和整合。</p><h3 id="关键限制"><a href="#关键限制" class="headerlink" title="关键限制"></a>关键限制</h3><ul><li>Agent 数量限制：同时运行的 Agent 数量受 Claude Code 计划限制（通常 3-5 个）</li><li>Agent 无法创建子 Agent（不支持嵌套）</li><li>Agent 的上下文限制是独立的，不计入主会话</li></ul><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="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查 Claude Code 版本（确保 &gt;= 0.2.0）</span></span><br><span class="line">claude --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果版本过低，更新</span></span><br><span class="line">npm update -g @anthropic-ai/claude-code</span><br></pre></td></tr></table></figure><h3 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h3><p>Agents 定义存储在 <code>.claude/agents/</code> 目录下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">项目根目录/</span><br><span class="line">├── .claude/</span><br><span class="line">│   ├── agents/           ← Agents 定义文件夹</span><br><span class="line">│   │   ├── tester.md       ── 测试编写 Agent</span><br><span class="line">│   │   ├── reviewer.md     ── 代码审查 Agent</span><br><span class="line">│   │   ├── refactorer.md   ── 重构 Agent</span><br><span class="line">│   │   └── documenter.md   ── 文档编写 Agent</span><br><span class="line">│   ├── skills/           ← Skills 定义</span><br><span class="line">│   ├── commands/         ← 自定义命令</span><br><span class="line">│   └── rules/            ← 项目规则</span><br><span class="line">└── ...</span><br></pre></td></tr></table></figure><hr><h2 id="四、创建你的第一个-Agent"><a href="#四、创建你的第一个-Agent" class="headerlink" title="四、创建你的第一个 Agent"></a>四、创建你的第一个 Agent</h2><h3 id="步骤-1：创建-Agents-目录"><a href="#步骤-1：创建-Agents-目录" class="headerlink" title="步骤 1：创建 Agents 目录"></a>步骤 1：创建 Agents 目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p .claude/agents</span><br></pre></td></tr></table></figure><h3 id="步骤-2：编写-Agent-定义文件"><a href="#步骤-2：编写-Agent-定义文件" class="headerlink" title="步骤 2：编写 Agent 定义文件"></a>步骤 2：编写 Agent 定义文件</h3><p>创建一个代码审查 Agent：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">cat &gt; .claude/agents/reviewer.md &lt;&lt; <span class="string">&#x27;EOF&#x27;</span></span><br><span class="line">---</span><br><span class="line">name: Reviewer</span><br><span class="line">description: 专业的代码审查员，擅长发现 bug、安全漏洞和性能问题</span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"><span class="comment"># Reviewer Agent</span></span><br><span class="line"></span><br><span class="line">你是代码审查专家。你的职责是对代码进行彻底审查。</span><br><span class="line"></span><br><span class="line"><span class="comment">## 审查流程</span></span><br><span class="line"></span><br><span class="line">1. **理解代码**：先阅读完整文件，理解业务逻辑</span><br><span class="line">2. **逐行检查**：逐行审查代码，关注以下方面：</span><br><span class="line">   - 逻辑错误和边界条件</span><br><span class="line">   - 安全漏洞（SQL 注入、XSS、权限问题等）</span><br><span class="line">   - 性能问题（不必要的循环、内存泄漏等）</span><br><span class="line">   - 代码风格和可读性</span><br><span class="line">   - 测试覆盖度</span><br><span class="line">3. **提供反馈**：按优先级分类输出：</span><br><span class="line"></span><br><span class="line">   <span class="comment">### 🔴 严重问题（必须修复）</span></span><br><span class="line">   <span class="comment">### 🟡 建议优化</span></span><br><span class="line">   <span class="comment">### ⚪ 次要问题（风格相关）</span></span><br><span class="line">   <span class="comment">### ✅ 好的实践</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">使用 Markdown 列表，每个问题附带：</span><br><span class="line">- 文件路径和行号</span><br><span class="line">- 问题描述</span><br><span class="line">- 修复建议（含代码示例）</span><br><span class="line">- 优先级标签</span><br><span class="line"></span><br><span class="line"><span class="comment">## 禁止行为</span></span><br><span class="line"></span><br><span class="line">- 不要修改代码（只审查）</span><br><span class="line">- 不要添加自己的风格偏好（除非项目规范要求）</span><br><span class="line">- 不要过度审查（只关注实际问题）</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><h3 id="步骤-3：使用-Agent"><a href="#步骤-3：使用-Agent" class="headerlink" title="步骤 3：使用 Agent"></a>步骤 3：使用 Agent</h3><p>在主会话中调用：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># 让审查 Agent 审查某个文件</span><br><span class="line">@reviewer 请审查 src/user-service.ts</span><br><span class="line"></span><br><span class="line"># 也可以传递多个文件</span><br><span class="line">@reviewer 请审查 API 层的所有文件</span><br></pre></td></tr></table></figure><hr><h2 id="五、Agent-定义详解"><a href="#五、Agent-定义详解" class="headerlink" title="五、Agent 定义详解"></a>五、Agent 定义详解</h2><h3 id="完整的-Agent-定义文件结构"><a href="#完整的-Agent-定义文件结构" class="headerlink" title="完整的 Agent 定义文件结构"></a>完整的 Agent 定义文件结构</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: Agent名称            # 必填，唯一标识，用于 @引用</span><br><span class="line">description: 简短描述      # 必填，帮助 Claude 理解何时使用</span><br><span class="line">model: sonnet             # 可选，指定模型（默认继承主会话）</span><br><span class="line">temperature: 0.3          # 可选，温度参数（0-1）</span><br><span class="line">max<span class="emphasis">_tokens: 4096          # 可选，最大输出 tokens</span></span><br><span class="line"><span class="emphasis">tools:                    # 可选，限制可用工具</span></span><br><span class="line"><span class="emphasis">  - Read                # 只读工具（推荐用于审查类 Agent）</span></span><br><span class="line"><span class="emphasis">  # 完整工具列表见下文</span></span><br><span class="line"><span class="emphasis">---</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis"># Agent 名称</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">完整的指令内容...</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 行为规范</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">定义 Agent 的行为准则...</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 输出格式</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">定义 Agent 的输出规范...</span></span><br></pre></td></tr></table></figure><h3 id="工具权限配置"><a href="#工具权限配置" class="headerlink" title="工具权限配置"></a>工具权限配置</h3><p>Agent 的 <code>tools</code> 字段可以限制其可用的工具集：</p><table><thead><tr><th>工具</th><th>说明</th><th>适用于</th></tr></thead><tbody><tr><td><code>Read</code></td><td>读取文件</td><td>审查、分析类 Agent</td></tr><tr><td><code>Edit</code></td><td>创建和编辑文件</td><td>开发、重构类 Agent</td></tr><tr><td><code>Command</code></td><td>执行 shell 命令</td><td>测试、构建类 Agent</td></tr><tr><td><code>Search</code></td><td>搜索文件和内容</td><td>分析类 Agent</td></tr><tr><td><code>Browser</code></td><td>访问网页</td><td>文档、调研类 Agent</td></tr></tbody></table><h3 id="工具权限组合示例"><a href="#工具权限组合示例" class="headerlink" title="工具权限组合示例"></a>工具权限组合示例</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 只读 Agent（审查员）</span></span><br><span class="line"><span class="attr">tools:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Read</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Search</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 全功能 Agent（开发者）</span></span><br><span class="line"><span class="attr">tools:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Read</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Edit</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Command</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Search</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试 Agent</span></span><br><span class="line"><span class="attr">tools:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Read</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Edit</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">Command</span></span><br></pre></td></tr></table></figure><h3 id="完整的-Agent-示例合集"><a href="#完整的-Agent-示例合集" class="headerlink" title="完整的 Agent 示例合集"></a>完整的 Agent 示例合集</h3><p><strong>测试编写 Agent：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: Tester</span><br><span class="line">description: 专业测试工程师，擅长编写单元测试和集成测试</span><br><span class="line">tools:</span><br><span class="line"><span class="bullet">  -</span> Read</span><br><span class="line"><span class="bullet">  -</span> Edit</span><br><span class="line"><span class="section">  - Command</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Tester Agent</span></span><br><span class="line"></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><br><span class="line"><span class="bullet">1.</span> 阅读目标文件，理解其功能和接口</span><br><span class="line"><span class="bullet">2.</span> 检查已有测试文件，避免重复</span><br><span class="line"><span class="bullet">3.</span> 编写测试用例，覆盖以下场景：</span><br><span class="line"><span class="bullet">   -</span> 正常路径（Happy Path）</span><br><span class="line"><span class="bullet">   -</span> 边界条件（Edge Cases）</span><br><span class="line"><span class="bullet">   -</span> 错误处理（Error Cases）</span><br><span class="line"><span class="bullet">4.</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="bullet">-</span> 使用项目已有的测试框架（Jest/Vitest/Pytest）</span><br><span class="line"><span class="bullet">-</span> 遵循项目的测试命名规范</span><br><span class="line"><span class="bullet">-</span> 每个测试函数只测试一个行为</span><br><span class="line"><span class="bullet">-</span> 使用 Arrange-Act-Assert 模式</span><br><span class="line"><span class="bullet">-</span> 避免测试实现细节</span><br></pre></td></tr></table></figure><p><strong>重构 Agent：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: Refactorer</span><br><span class="line">description: 代码重构专家，擅长提取函数、优化结构和消除重复</span><br><span class="line">tools:</span><br><span class="line"><span class="bullet">  -</span> Read</span><br><span class="line"><span class="bullet">  -</span> Edit</span><br><span class="line"><span class="bullet">  -</span> Search</span><br><span class="line"><span class="section">  - Command</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Refactorer Agent</span></span><br><span class="line"></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><br><span class="line"><span class="bullet">1.</span> <span class="strong">**不改变功能**</span>：重构前后功能必须完全一致</span><br><span class="line"><span class="bullet">2.</span> <span class="strong">**小步提交**</span>：每次只做一种重构操作</span><br><span class="line"><span class="bullet">3.</span> <span class="strong">**测试保障**</span>：重构前确保有测试覆盖</span><br><span class="line"><span class="bullet">4.</span> <span class="strong">**可逆操作**</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="bullet">1.</span> 分析代码结构，识别重构机会</span><br><span class="line"><span class="bullet">2.</span> 运行现有测试，确保 baseline</span><br><span class="line"><span class="bullet">3.</span> 执行重构（每次一步）</span><br><span class="line"><span class="bullet">4.</span> 运行测试验证</span><br><span class="line"><span class="bullet">5.</span> 重复直到完成</span><br></pre></td></tr></table></figure><hr><h2 id="六、实战：项目级-Agent-体系搭建"><a href="#六、实战：项目级-Agent-体系搭建" class="headerlink" title="六、实战：项目级 Agent 体系搭建"></a>六、实战：项目级 Agent 体系搭建</h2><h3 id="场景：全栈-Web-应用功能开发"><a href="#场景：全栈-Web-应用功能开发" class="headerlink" title="场景：全栈 Web 应用功能开发"></a>场景：全栈 Web 应用功能开发</h3><p>假设你要实现一个”用户管理”模块的前后端功能。传统方式需要一步步执行，使用 Agents 可以并行加速。</p><h4 id="步骤-1：准备-Agent-定义"><a href="#步骤-1：准备-Agent-定义" class="headerlink" title="步骤 1：准备 Agent 定义"></a>步骤 1：准备 Agent 定义</h4><p>创建 <code>.claude/agents/</code> 目录下的 3 个 Agent：</p><p><strong>frontend.md：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: Frontend</span><br><span class="line">description: 前端开发工程师，擅长 React/Vue 组件开发</span><br><span class="line">tools:</span><br><span class="line"><span class="bullet">  -</span> Read</span><br><span class="line"><span class="bullet">  -</span> Edit</span><br><span class="line"><span class="bullet">  -</span> Search</span><br><span class="line"><span class="section">  - Command</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Frontend Agent</span></span><br><span class="line"></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><br><span class="line"><span class="bullet">-</span> 使用项目已有的组件库和样式系统</span><br><span class="line"><span class="bullet">-</span> 遵循项目的目录结构约定</span><br><span class="line"><span class="bullet">-</span> 使用 TypeScript 类型定义</span><br><span class="line"><span class="bullet">-</span> 添加错误边界和加载状态</span><br><span class="line"><span class="bullet">-</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="bullet">1.</span> 阅读后端 API 定义</span><br><span class="line"><span class="bullet">2.</span> 创建类型定义文件</span><br><span class="line"><span class="bullet">3.</span> 实现业务逻辑 hooks/utilities</span><br><span class="line"><span class="bullet">4.</span> 编写 UI 组件</span><br><span class="line"><span class="bullet">5.</span> 添加单元测试</span><br><span class="line"><span class="bullet">6.</span> 确保 TypeScript 编译通过</span><br></pre></td></tr></table></figure><p><strong>backend.md：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: Backend</span><br><span class="line">description: 后端开发工程师，擅长 API 设计和数据库操作</span><br><span class="line">tools:</span><br><span class="line"><span class="bullet">  -</span> Read</span><br><span class="line"><span class="bullet">  -</span> Edit</span><br><span class="line"><span class="bullet">  -</span> Search</span><br><span class="line"><span class="section">  - Command</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Backend Agent</span></span><br><span class="line"></span><br><span class="line">你是资深后端工程师。项目使用 Express.js + Prisma ORM。</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="bullet">-</span> 遵循 RESTful API 设计原则</span><br><span class="line"><span class="bullet">-</span> 所有路由使用 try-catch 错误处理</span><br><span class="line"><span class="bullet">-</span> 使用 Zod 进行请求体验证</span><br><span class="line"><span class="bullet">-</span> 数据库迁移使用 Prisma Migrate</span><br><span class="line"><span class="bullet">-</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="bullet">1.</span> 定义数据模型和数据库迁移</span><br><span class="line"><span class="bullet">2.</span> 实现数据访问层（Repository）</span><br><span class="line"><span class="bullet">3.</span> 实现业务逻辑层（Service）</span><br><span class="line"><span class="bullet">4.</span> 实现 API 路由（Controller）</span><br><span class="line"><span class="bullet">5.</span> 添加请求体验证</span><br><span class="line"><span class="bullet">6.</span> 编写测试</span><br></pre></td></tr></table></figure><p><strong>database.md：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: Database</span><br><span class="line">description: 数据库管理员，擅长 Schema 设计和数据迁移</span><br><span class="line">tools:</span><br><span class="line"><span class="bullet">  -</span> Read</span><br><span class="line"><span class="bullet">  -</span> Edit</span><br><span class="line"><span class="section">  - Command</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Database Agent</span></span><br><span class="line"></span><br><span class="line">你是数据库专家。项目使用 PostgreSQL + Prisma。</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="bullet">-</span> 所有数据模型需要考虑索引优化</span><br><span class="line"><span class="bullet">-</span> 大表需要设计合适的索引</span><br><span class="line"><span class="bullet">-</span> 外键关系必须明确定义</span><br><span class="line"><span class="bullet">-</span> 考虑数据增长和查询性能</span><br><span class="line"><span class="bullet">-</span> 软删除实现使用 deletedAt 字段</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="bullet">1.</span> 分析业务需求的数据模型</span><br><span class="line"><span class="bullet">2.</span> 更新 Prisma Schema</span><br><span class="line"><span class="bullet">3.</span> 生成迁移文件</span><br><span class="line"><span class="bullet">4.</span> 编写种子数据</span><br><span class="line"><span class="bullet">5.</span> 验证迁移可以正常执行</span><br></pre></td></tr></table></figure><h4 id="步骤-2：在主会话中并行调度"><a href="#步骤-2：在主会话中并行调度" class="headerlink" title="步骤 2：在主会话中并行调度"></a>步骤 2：在主会话中并行调度</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">我在项目中需要实现&quot;用户管理&quot;模块，包含基本的 CRUD 功能。</span><br><span class="line"></span><br><span class="line">@Database 请定义 User 模型，包含：id、name、email、role（枚举：ADMIN/USER）、status、createdAt、updatedAt、deletedAt。以及角色相关的 Role 模型。</span><br><span class="line"></span><br><span class="line">@Backend 请实现用户管理的完整 API：GET /users（分页）、GET /users/:id、POST /users、PUT /users/:id、DELETE /users/:id（软删除）。使用 Express + Prisma，参考 database 的 schema。</span><br><span class="line"></span><br><span class="line">@Frontend 请实现用户管理页面：用户列表表格（分页、搜索）、创建用户表单、编辑用户表单、删除确认对话框。等待 backend API 就绪后对接。</span><br></pre></td></tr></table></figure><h4 id="步骤-3：整合结果"><a href="#步骤-3：整合结果" class="headerlink" title="步骤 3：整合结果"></a>步骤 3：整合结果</h4><p>三个 Agent 并行工作，完成后主会话汇总结果：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">✅ @Database 完成：创建了 User 模型，生成了迁移文件</span><br><span class="line">✅ @Backend 完成：实现了 5 个 API 端点，所有测试通过</span><br><span class="line">✅ @Frontend 完成：创建了 4 个组件，TypeScript 编译通过</span><br><span class="line"></span><br><span class="line">下一步：运行端到端测试验证完整功能。</span><br></pre></td></tr></table></figure><h3 id="场景：大型代码库重构"><a href="#场景：大型代码库重构" class="headerlink" title="场景：大型代码库重构"></a>场景：大型代码库重构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">@Refactorer 请将 utils/helpers.ts 中的工具函数按职责拆分到 utils/ 目录下：</span><br><span class="line">- string-helpers.ts（字符串处理）</span><br><span class="line">- array-helpers.ts（数组处理）</span><br><span class="line">- date-helpers.ts（日期处理）</span><br><span class="line">- validation.ts（验证逻辑）</span><br><span class="line">保留原来的 helpers.ts 作为入口重新导出。</span><br><span class="line"></span><br><span class="line">@Tester 请为 utils/ 目录下的所有工具函数编写单元测试。</span><br><span class="line"></span><br><span class="line">@Reviewer 重构完成后，审查新的目录结构。完成后运行 `npm test`。</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 plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># 第一步：并行执行独立任务</span><br><span class="line">@Database 定义数据模型</span><br><span class="line">@Backend 准备基础框架</span><br><span class="line"></span><br><span class="line"># 第二步（等待第一步完成）：执行依赖任务</span><br><span class="line">@Backend 实现 API（使用已定义的数据模型）</span><br><span class="line"></span><br><span class="line"># 第三步（等待第二步完成）：执行依赖任务</span><br><span class="line">@Frontend 实现页面（对接 backend API）</span><br></pre></td></tr></table></figure><h3 id="2-分治法"><a href="#2-分治法" class="headerlink" title="2. 分治法"></a>2. 分治法</h3><p>将大型任务拆分为可并行的小任务：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 不推荐：一个大任务</span></span><br><span class="line">@Agent 请重构整个项目</span><br><span class="line"></span><br><span class="line"><span class="section"># 推荐：拆分为多个并行子任务</span></span><br><span class="line">@Refactorer 请重构 auth 模块</span><br><span class="line">@Refactorer 请重构 user 模块</span><br><span class="line">@Refactorer 请重构 payment 模块</span><br></pre></td></tr></table></figure><h3 id="3-结果验证"><a href="#3-结果验证" class="headerlink" title="3. 结果验证"></a>3. 结果验证</h3><p>Agent 返回结果后，验证其工作质量：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@Reviewer 请审查 @Refactorer 对 auth 模块的重构结果</span><br></pre></td></tr></table></figure><h3 id="4-批量处理模式"><a href="#4-批量处理模式" class="headerlink" title="4. 批量处理模式"></a>4. 批量处理模式</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 为 5 个组件并行编写测试</span></span><br><span class="line">@Tester 为 components/Button 编写单元测试</span><br><span class="line">@Tester 为 components/Modal 编写单元测试</span><br><span class="line">@Tester 为 components/Table 编写单元测试</span><br></pre></td></tr></table></figure><hr><h2 id="八、调试与优化"><a href="#八、调试与优化" class="headerlink" title="八、调试与优化"></a>八、调试与优化</h2><h3 id="监控-Agent-运行状态"><a href="#监控-Agent-运行状态" class="headerlink" title="监控 Agent 运行状态"></a>监控 Agent 运行状态</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 Claude Code 会话中使用</span></span><br><span class="line">/agents</span><br><span class="line"><span class="comment"># 显示所有 Agent 的运行状态和结果</span></span><br></pre></td></tr></table></figure><h3 id="常见问题排查"><a href="#常见问题排查" class="headerlink" title="常见问题排查"></a>常见问题排查</h3><table><thead><tr><th>问题</th><th>可能原因</th><th>解决方案</th></tr></thead><tbody><tr><td>Agent 不响应</td><td>Agent 名称拼写错误</td><td>检查 @ 后的名称是否与 Agent 定义的 name 一致</td></tr><tr><td>Agent 权限不足</td><td>tools 配置限制</td><td>检查 Agent 的 tools 字段是否包含所需工具</td></tr><tr><td>Agent 结果不理想</td><td>指令不够明确</td><td>细化 Agent 定义中的行为规范和输出格式</td></tr><tr><td>Agent 运行超时</td><td>任务过于复杂</td><td>拆分为更小的子任务</td></tr><tr><td>并行数受限</td><td>计划限制</td><td>减少同时运行的 Agent 数量</td></tr></tbody></table><h3 id="优化技巧"><a href="#优化技巧" class="headerlink" title="优化技巧"></a>优化技巧</h3><ol><li><strong>精确定义描述</strong>：<code>description</code> 字段帮助 Claude 判断何时调用 Agent</li><li><strong>限制工具集</strong>：只读 Agent 不要给 Edit 权限，降低风险</li><li><strong>指定输出格式</strong>：结构化输出（JSON/YAML）方便主会话处理</li><li><strong>设置合理温度</strong>：代码任务用 <code>temperature: 0.2-0.3</code>，创意任务用 <code>0.5-0.7</code></li></ol><hr><h2 id="九、常见问题"><a href="#九、常见问题" class="headerlink" title="九、常见问题"></a>九、常见问题</h2><h3 id="Q1：Agent-可以调用其他-Agent-吗？"><a href="#Q1：Agent-可以调用其他-Agent-吗？" class="headerlink" title="Q1：Agent 可以调用其他 Agent 吗？"></a>Q1：Agent 可以调用其他 Agent 吗？</h3><p>不可以。Agent 不能创建或调用其他 Agent（不支持嵌套）。所有并行 Agent 从主会话触发。</p><h3 id="Q2：Agent-运行期间主会话可以做什么？"><a href="#Q2：Agent-运行期间主会话可以做什么？" class="headerlink" title="Q2：Agent 运行期间主会话可以做什么？"></a>Q2：Agent 运行期间主会话可以做什么？</h3><p>Agent 在后台异步运行，主会话可以继续工作或发出更多 Agent 请求。所有 Agent 的结果最终回到主会话。</p><h3 id="Q3：Agent-之间的上下文会互相干扰吗？"><a href="#Q3：Agent-之间的上下文会互相干扰吗？" class="headerlink" title="Q3：Agent 之间的上下文会互相干扰吗？"></a>Q3：Agent 之间的上下文会互相干扰吗？</h3><p>不会。每个 Agent 拥有独立的会话和上下文窗口。一个 Agent 的操作不会影响另一个 Agent 的状态。</p><h3 id="Q4：Agent-超出上下文限制怎么办？"><a href="#Q4：Agent-超出上下文限制怎么办？" class="headerlink" title="Q4：Agent 超出上下文限制怎么办？"></a>Q4：Agent 超出上下文限制怎么办？</h3><p>每个 Agent 有自己的上下文限制（取决于模型和计划）。如果超出，可以：</p><ul><li>缩短 Agent 的指令</li><li>减少 Agent 一次处理的文件数</li><li>使用更高效的提示词</li></ul><h3 id="Q5：如何确保-Agent-的工作一致性？"><a href="#Q5：如何确保-Agent-的工作一致性？" class="headerlink" title="Q5：如何确保 Agent 的工作一致性？"></a>Q5：如何确保 Agent 的工作一致性？</h3><p>建立统一的项目规范和约束文件：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># .claude/rules/project-standards.md</span></span><br><span class="line"><span class="section"># 项目级规则，所有 Agent 都会遵循</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 前端规范</span></span><br><span class="line"><span class="bullet">-</span> 使用 Tailwind CSS，不使用内联样式</span><br><span class="line"><span class="bullet">-</span> 所有组件使用 TypeScript</span><br><span class="line"><span class="bullet">-</span> 使用 React Query 管理服务端状态</span><br><span class="line"></span><br><span class="line"><span class="section">## 后端规范</span></span><br><span class="line"><span class="bullet">-</span> 使用 Zod 进行输入验证</span><br><span class="line"><span class="bullet">-</span> 所有 API 响应统一格式 &#123; success, data, error &#125;</span><br><span class="line"><span class="bullet">-</span> 使用 Prisma 作为 ORM</span><br></pre></td></tr></table></figure><h3 id="Q6：Agent-的-token-消耗如何计算？"><a href="#Q6：Agent-的-token-消耗如何计算？" class="headerlink" title="Q6：Agent 的 token 消耗如何计算？"></a>Q6：Agent 的 token 消耗如何计算？</h3><p>Agent 的 token 消耗<strong>独立于主会话</strong>。每个 Agent 有独立的输入/输出计数。批量使用 Agent 时要注意总 token 消耗。</p><h3 id="Q7：如何为不同项目共享-Agent-定义？"><a href="#Q7：如何为不同项目共享-Agent-定义？" class="headerlink" title="Q7：如何为不同项目共享 Agent 定义？"></a>Q7：如何为不同项目共享 Agent 定义？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建全局 Agent（所有项目可用）</span></span><br><span class="line">mkdir -p ~/.claude/agents/</span><br><span class="line">ln -s ~/.claude/agents/tester.md .claude/agents/tester.md</span><br></pre></td></tr></table></figure><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Claude Code Agents 是实现<strong>并行开发工作流</strong>的核心工具。合理运用多代理协作可以显著提升开发效率：</p><ul><li><strong>单 Agent 模式</strong>：适合明确的专业化任务（审查、测试）</li><li><strong>多 Agent 并行</strong>：适合大型功能的模块化开发</li><li><strong>Agent + 主会话编排</strong>：适合包含依赖链路的复杂项目</li></ul><p>记住最佳实践：精确定义 → 合理拆分 → 验证结果，逐步将你的开发工作流推向新高度。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Claude-Code-Agents-多代理协作实战——并行任务自动化&quot;&gt;&lt;a href=&quot;#Claude-Code-Agents-多代理协作实战——并行任务自动化&quot; class=&quot;headerlink&quot; title=&quot;Claude Code Agents 多代理</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="agent" scheme="https://www.geniux.top/tags/agent/"/>
    
    <category term="claude" scheme="https://www.geniux.top/tags/claude/"/>
    
    <category term="skills" scheme="https://www.geniux.top/tags/skills/"/>
    
    <category term="tutorial" scheme="https://www.geniux.top/tags/tutorial/"/>
    
    <category term="workflow" scheme="https://www.geniux.top/tags/workflow/"/>
    
  </entry>
  
  <entry>
    <title>Claude Code Hooks 完全指南——自动化你的开发工作流</title>
    <link href="https://www.geniux.top/article/519e0e384be2/"/>
    <id>https://www.geniux.top/article/519e0e384be2/</id>
    <published>2026-06-02T02:00:00.000Z</published>
    <updated>2026-06-02T03:27:07.639Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Claude-Code-Hooks-完全指南——自动化你的开发工作流"><a href="#Claude-Code-Hooks-完全指南——自动化你的开发工作流" class="headerlink" title="Claude Code Hooks 完全指南——自动化你的开发工作流"></a>Claude Code Hooks 完全指南——自动化你的开发工作流</h1><p>Claude Code Hooks 是 Claude Code 提供的<strong>生命周期脚本机制</strong>，允许你在特定时机自动执行自定义脚本。通过 Hooks，你可以实现代码保存时自动格式化、运行前自动检查、任务完成后自动通知等场景，将重复性工作完全自动化。</p><hr><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ol><li><a href="#%E4%B8%80%E4%BB%80%E4%B9%88%E6%98%AF-hooks">什么是 Hooks？</a></li><li><a href="#%E4%BA%8Chooks-%E7%9A%84%E7%B1%BB%E5%9E%8B%E4%B8%8E%E8%A7%A6%E5%8F%91%E6%97%B6%E6%9C%BA">Hooks 的类型与触发时机</a></li><li><a href="#%E4%B8%89%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E4%B8%8E%E5%89%8D%E7%BD%AE%E8%A6%81%E6%B1%82">环境配置与前置要求</a></li><li><a href="#%E5%9B%9B%E5%88%9B%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA-hook">创建你的第一个 Hook</a></li><li><a href="#%E4%BA%94hook-%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99%E6%8C%87%E5%8D%97">Hook 脚本编写指南</a></li><li><a href="#%E5%85%AD%E5%AE%9E%E6%88%98%E6%A1%88%E4%BE%8B">实战案例</a></li><li><a href="#%E4%B8%83%E8%B0%83%E8%AF%95%E4%B8%8E%E6%8E%92%E6%9F%A5">调试与排查</a></li><li><a href="#%E5%85%AB%E5%AE%89%E5%85%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9">安全注意事项</a></li><li><a href="#%E4%B9%9D%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">常见问题</a></li></ol><hr><h2 id="一、什么是-Hooks？"><a href="#一、什么是-Hooks？" class="headerlink" title="一、什么是 Hooks？"></a>一、什么是 Hooks？</h2><p>Hooks 是 Claude Code 的<strong>生命周期回调系统</strong>。你可以为特定事件（如文件保存前、任务完成后）注册自定义脚本，Claude Code 会在对应时机自动调用这些脚本。</p><h3 id="Hooks-vs-Skills-vs-Commands"><a href="#Hooks-vs-Skills-vs-Commands" class="headerlink" title="Hooks vs Skills vs Commands"></a>Hooks vs Skills vs Commands</h3><table><thead><tr><th>概念</th><th>触发方式</th><th>用途</th></tr></thead><tbody><tr><td><strong>Hooks</strong></td><td>自动触发（事件驱动）</td><td>自动化流程、格式化、检查</td></tr><tr><td><strong>Skills</strong></td><td>自动匹配（自然语言触发）</td><td>教会 Claude 怎么做某事</td></tr><tr><td><strong>Commands</strong></td><td>手动调用（斜杠命令）</td><td>用户主动执行的流程</td></tr><tr><td><strong>Agents</strong></td><td>手动调用（@引用）</td><td>专用子代理完成子任务</td></tr></tbody></table><h3 id="工作流程示意"><a href="#工作流程示意" class="headerlink" title="工作流程示意"></a>工作流程示意</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">用户编辑代码 → 文件保存 → [before_write Hook 触发]</span><br><span class="line">                              ↓ 自动格式化/检查</span><br><span class="line">                 文件写入磁盘 → [after_write Hook 触发]</span><br><span class="line">                              ↓ 自动编译/lint</span><br><span class="line">                 任务完成 → [after_task Hook 触发]</span><br><span class="line">                            ↓ 自动总结/通知</span><br></pre></td></tr></table></figure><hr><h2 id="二、Hooks-的类型与触发时机"><a href="#二、Hooks-的类型与触发时机" class="headerlink" title="二、Hooks 的类型与触发时机"></a>二、Hooks 的类型与触发时机</h2><p>Claude Code 支持以下 7 种 Hook 类型：</p><table><thead><tr><th>Hook 名称</th><th>触发时机</th><th>典型用途</th></tr></thead><tbody><tr><td><code>before_read</code></td><td>读取文件之前</td><td>文件解密、权限验证</td></tr><tr><td><code>after_read</code></td><td>读取文件之后</td><td>内容过滤、日志记录</td></tr><tr><td><code>before_write</code></td><td>写入文件之前（可修改内容）</td><td>格式化代码、注入版权头</td></tr><tr><td><code>after_write</code></td><td>写入文件之后</td><td>运行 linter、编译检查</td></tr><tr><td><code>before_command</code></td><td>执行 shell 命令之前</td><td>安全检查、环境验证</td></tr><tr><td><code>after_command</code></td><td>执行 shell 命令之后</td><td>结果分析、日志记录</td></tr><tr><td><code>after_task</code></td><td>整个任务完成之后</td><td>生成报告、发送通知</td></tr></tbody></table><h3 id="重要：Hook-的执行顺序"><a href="#重要：Hook-的执行顺序" class="headerlink" title="重要：Hook 的执行顺序"></a>重要：Hook 的执行顺序</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">任务开始 → before_read → after_read → ... → before_write → 写入</span><br><span class="line">→ after_write → ... → before_command → 执行命令</span><br><span class="line">→ after_command → ... → after_task → 任务完成</span><br></pre></td></tr></table></figure><hr><h2 id="三、环境配置与前置要求"><a href="#三、环境配置与前置要求" class="headerlink" title="三、环境配置与前置要求"></a>三、环境配置与前置要求</h2><h3 id="系统要求"><a href="#系统要求" class="headerlink" title="系统要求"></a>系统要求</h3><ul><li>Claude Code CLI 已安装（<code>npm install -g @anthropic-ai/claude-code</code>）</li><li>Node.js 18+（部分 Hook 需要）</li><li>Bash/Zsh shell 环境</li></ul><h3 id="配置位置"><a href="#配置位置" class="headerlink" title="配置位置"></a>配置位置</h3><p>Hooks 配置在 Claude Code 的 <code>settings.local.json</code> 文件中：</p><ul><li><strong>项目级</strong>：<code>&lt;项目根目录&gt;/.claude/settings.local.json</code></li><li><strong>全局级</strong>：<code>~/.claude/settings.local.json</code></li></ul><blockquote><p>⚠️ <strong>优先级</strong>：项目级配置覆盖全局级配置。<code>settings.local.json</code> 不会被提交到 Git（已添加到 <code>.gitignore</code>），适合存放个人配置。</p></blockquote><h3 id="配置文件结构"><a href="#配置文件结构" class="headerlink" title="配置文件结构"></a>配置文件结构</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;before_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;node scripts/pre-format.js&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">5000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;files&quot;</span>: [<span class="string">&quot;*.ts&quot;</span>, <span class="string">&quot;*.tsx&quot;</span>, <span class="string">&quot;*.js&quot;</span>, <span class="string">&quot;*.jsx&quot;</span>]</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;after_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;./scripts/lint-check.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">10000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">false</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;before_command&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash scripts/command-guard.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">3000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;exclude_commands&quot;</span>: [<span class="string">&quot;git*&quot;</span>, <span class="string">&quot;npm*&quot;</span>, <span class="string">&quot;pnpm*&quot;</span>]</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;after_task&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;node scripts/task-summary.js&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">15000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">false</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="配置字段说明"><a href="#配置字段说明" class="headerlink" title="配置字段说明"></a>配置字段说明</h3><table><thead><tr><th>字段</th><th>类型</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>command</code></td><td>string</td><td><strong>必填</strong></td><td>要执行的命令或脚本路径</td></tr><tr><td><code>timeout</code></td><td>number</td><td>10000</td><td>超时时间（毫秒），超过此时间 Hook 会被终止</td></tr><tr><td><code>blocking</code></td><td>boolean</td><td>true</td><td>是否阻塞主流程（false 表示异步执行，不等待结果）</td></tr><tr><td><code>files</code></td><td>string[]</td><td>全部</td><td>文件匹配模式（仅对 before_write/after_write 有效）</td></tr><tr><td><code>exclude_commands</code></td><td>string[]</td><td>无</td><td>排除的命令匹配模式（仅对 before_command 有效）</td></tr></tbody></table><hr><h2 id="四、创建你的第一个-Hook"><a href="#四、创建你的第一个-Hook" class="headerlink" title="四、创建你的第一个 Hook"></a>四、创建你的第一个 Hook</h2><h3 id="步骤-1：创建配置目录"><a href="#步骤-1：创建配置目录" class="headerlink" title="步骤 1：创建配置目录"></a>步骤 1：创建配置目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在项目根目录下创建 .claude 目录</span></span><br><span class="line">mkdir -p .claude/hooks</span><br></pre></td></tr></table></figure><h3 id="步骤-2：编写-Hook-脚本"><a href="#步骤-2：编写-Hook-脚本" class="headerlink" title="步骤 2：编写 Hook 脚本"></a>步骤 2：编写 Hook 脚本</h3><p>创建一个通用的格式化 Hook 脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">cat &gt; .claude/hooks/format-code.sh &lt;&lt; <span class="string">&#x27;SCRIPT&#x27;</span></span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"><span class="comment"># Claude Code Hook: 在写入文件前自动格式化代码</span></span><br><span class="line"><span class="comment"># 用途：保证所有写入代码的格式一致性</span></span><br><span class="line"></span><br><span class="line">FILE_PATH=<span class="string">&quot;<span class="variable">$1</span>&quot;</span></span><br><span class="line">FILE_EXT=<span class="string">&quot;<span class="variable">$&#123;FILE_PATH##*.&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="string">&quot;<span class="variable">$FILE_EXT</span>&quot;</span> <span class="keyword">in</span></span><br><span class="line">  js|jsx|ts|tsx)</span><br><span class="line">    npx prettier --write <span class="string">&quot;<span class="variable">$FILE_PATH</span>&quot;</span> 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">    ;;</span><br><span class="line">  py)</span><br><span class="line">    python -m black --quiet <span class="string">&quot;<span class="variable">$FILE_PATH</span>&quot;</span> 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">    ;;</span><br><span class="line">  go)</span><br><span class="line">    gofmt -w <span class="string">&quot;<span class="variable">$FILE_PATH</span>&quot;</span> 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">    ;;</span><br><span class="line">  rs)</span><br><span class="line">    rustfmt <span class="string">&quot;<span class="variable">$FILE_PATH</span>&quot;</span> 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">    ;;</span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Hook] 已格式化: <span class="variable">$FILE_PATH</span>&quot;</span></span><br><span class="line">SCRIPT</span><br><span class="line"></span><br><span class="line">chmod +x .claude/hooks/format-code.sh</span><br></pre></td></tr></table></figure><h3 id="步骤-3：注册-Hook"><a href="#步骤-3：注册-Hook" class="headerlink" title="步骤 3：注册 Hook"></a>步骤 3：注册 Hook</h3><p>创建或编辑 <code>.claude/settings.local.json</code>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;before_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/format-code.sh \&quot;$CLAUDE_HOOK_FILE\&quot;&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">5000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;files&quot;</span>: [<span class="string">&quot;*.js&quot;</span>, <span class="string">&quot;*.ts&quot;</span>, <span class="string">&quot;*.tsx&quot;</span>, <span class="string">&quot;*.py&quot;</span>, <span class="string">&quot;*.go&quot;</span>, <span class="string">&quot;*.rs&quot;</span>]</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="步骤-4：验证-Hook-生效"><a href="#步骤-4：验证-Hook-生效" class="headerlink" title="步骤 4：验证 Hook 生效"></a>步骤 4：验证 Hook 生效</h3><p>在 Claude Code 中让 Claude 修改一个代码文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Claude Code 会自动调用 before_write Hook</span></span><br><span class="line"><span class="comment"># 你应该在终端中看到类似输出：</span></span><br><span class="line"><span class="comment"># [Hook] 已格式化: src/app.ts</span></span><br></pre></td></tr></table></figure><hr><h2 id="五、Hook-脚本编写指南"><a href="#五、Hook-脚本编写指南" class="headerlink" title="五、Hook 脚本编写指南"></a>五、Hook 脚本编写指南</h2><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><p>Hook 脚本可以访问以下环境变量：</p><table><thead><tr><th>变量名</th><th>说明</th><th>适用 Hook</th></tr></thead><tbody><tr><td><code>CLAUDE_HOOK_FILE</code></td><td>当前操作的文件路径</td><td>before_write, after_write, before_read, after_read</td></tr><tr><td><code>CLAUDE_HOOK_TYPE</code></td><td>Hook 类型名称</td><td>全部</td></tr><tr><td><code>CLAUDE_HOOK_COMMAND</code></td><td>即将执行的命令</td><td>before_command, after_command</td></tr><tr><td><code>CLAUDE_PROJECT_ROOT</code></td><td>项目根目录路径</td><td>全部</td></tr></tbody></table><h3 id="脚本签名规范"><a href="#脚本签名规范" class="headerlink" title="脚本签名规范"></a>脚本签名规范</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment"># 对于 before_write / after_write：</span></span><br><span class="line"><span class="comment"># 第一个参数通常是文件路径，也可以通过 $CLAUDE_HOOK_FILE 获取</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">set</span> -euo pipefail  <span class="comment"># 推荐：严格模式</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 日志输出（会显示在 Claude Code 终端中）</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Hook:<span class="variable">$CLAUDE_HOOK_TYPE</span>] 开始处理 <span class="variable">$CLAUDE_HOOK_FILE</span>&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 class="built_in">echo</span> <span class="string">&quot;[Hook:<span class="variable">$CLAUDE_HOOK_TYPE</span>] 处理完成&quot;</span></span><br></pre></td></tr></table></figure><h3 id="返回值约定"><a href="#返回值约定" class="headerlink" title="返回值约定"></a>返回值约定</h3><ul><li><strong>退出码 0</strong>：Hook 执行成功，主流程继续</li><li><strong>退出码非 0</strong>（仅在 blocking=true 时）：Hook 执行失败，主流程<strong>停止</strong>并报错</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># before_write Hook 返回非 0 会阻止文件写入！</span></span><br><span class="line"><span class="comment"># 适用于：检查到安全问题、格式校验失败等场景</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> ! npx eslint <span class="string">&quot;<span class="variable">$CLAUDE_HOOK_FILE</span>&quot;</span>; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;[Hook] ESLint 检查失败，阻止写入&quot;</span></span><br><span class="line">  <span class="built_in">exit</span> 1  <span class="comment"># ❌ 这会阻止文件保存</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="超时处理"><a href="#超时处理" class="headerlink" title="超时处理"></a>超时处理</h3><p>为所有 Hook 设置合理的超时时间：</p><table><thead><tr><th>Hook 类型</th><th>建议超时</th><th>原因</th></tr></thead><tbody><tr><td>before_write</td><td>3-10 秒</td><td>格式化应该很快</td></tr><tr><td>after_write</td><td>5-15 秒</td><td>Lint/编译可能需要更多时间</td></tr><tr><td>before_command</td><td>3-5 秒</td><td>安全检查应迅速</td></tr><tr><td>after_task</td><td>10-30 秒</td><td>报告生成可能稍慢</td></tr></tbody></table><hr><h2 id="六、实战案例"><a href="#六、实战案例" class="headerlink" title="六、实战案例"></a>六、实战案例</h2><h3 id="案例-1：Python-项目自动格式化-类型检查"><a href="#案例-1：Python-项目自动格式化-类型检查" class="headerlink" title="案例 1：Python 项目自动格式化 + 类型检查"></a>案例 1：Python 项目自动格式化 + 类型检查</h3><p><strong>.claude/hooks/python-check.sh：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -euo pipefail</span><br><span class="line"></span><br><span class="line">FILE=<span class="string">&quot;<span class="variable">$CLAUDE_HOOK_FILE</span>&quot;</span></span><br><span class="line"><span class="keyword">if</span> [[ ! <span class="string">&quot;<span class="variable">$FILE</span>&quot;</span> =~ \.py$ ]]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">exit</span> 0</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Hook] Python 格式化检查: <span class="variable">$FILE</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第一步：自动格式化</span></span><br><span class="line">black --quiet <span class="string">&quot;<span class="variable">$FILE</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第二步：排序 import</span></span><br><span class="line">isort --quiet <span class="string">&quot;<span class="variable">$FILE</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第三步：类型检查（非阻塞，仅提示）</span></span><br><span class="line">mypy <span class="string">&quot;<span class="variable">$FILE</span>&quot;</span> --show-error-codes 2&gt;&amp;1 | head -5 || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Hook] Python 文件处理完成&quot;</span></span><br></pre></td></tr></table></figure><p><strong>注册配置：</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;before_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/python-check.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">10000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;files&quot;</span>: [<span class="string">&quot;*.py&quot;</span>]</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="案例-2：安全命令守卫"><a href="#案例-2：安全命令守卫" class="headerlink" title="案例 2：安全命令守卫"></a>案例 2：安全命令守卫</h3><p><strong>.claude/hooks/command-guard.sh：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -euo pipefail</span><br><span class="line"></span><br><span class="line">COMMAND=<span class="string">&quot;<span class="variable">$CLAUDE_HOOK_COMMAND</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 危险命令列表</span></span><br><span class="line">DANGEROUS_COMMANDS=(</span><br><span class="line">  <span class="string">&quot;rm -rf /&quot;</span></span><br><span class="line">  <span class="string">&quot;sudo rm&quot;</span></span><br><span class="line">  <span class="string">&quot;dd if=/dev/zero&quot;</span></span><br><span class="line">  <span class="string">&quot;chmod -R 777&quot;</span></span><br><span class="line">  <span class="string">&quot;&gt;.*/dev/&quot;</span></span><br><span class="line">  <span class="string">&quot;DROP DATABASE&quot;</span></span><br><span class="line">  <span class="string">&quot;TRUNCATE TABLE&quot;</span></span><br><span class="line">  <span class="string">&quot;git push --force&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[安全卫士] 检查命令: <span class="variable">$&#123;COMMAND:0:100&#125;</span>...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> pattern <span class="keyword">in</span> <span class="string">&quot;<span class="variable">$&#123;DANGEROUS_COMMANDS[@]&#125;</span>&quot;</span>; <span class="keyword">do</span></span><br><span class="line">  <span class="keyword">if</span> <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$COMMAND</span>&quot;</span> | grep -iqE <span class="string">&quot;<span class="variable">$pattern</span>&quot;</span>; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;[安全卫士] ⚠️  检测到危险命令: <span class="variable">$pattern</span>&quot;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;[安全卫士] 操作已阻止！如需执行，请在 Claude Code 中手动确认。&quot;</span></span><br><span class="line">    <span class="built_in">exit</span> 1</span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[安全卫士] 命令安全检查通过 ✓&quot;</span></span><br></pre></td></tr></table></figure><h3 id="案例-3：任务完成自动生成摘要"><a href="#案例-3：任务完成自动生成摘要" class="headerlink" title="案例 3：任务完成自动生成摘要"></a>案例 3：任务完成自动生成摘要</h3><p><strong>.claude/hooks/task-summary.sh：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -euo pipefail</span><br><span class="line"></span><br><span class="line">SUMMARY_FILE=<span class="string">&quot;<span class="variable">$CLAUDE_PROJECT_ROOT</span>/.claude/task-summary.md&quot;</span></span><br><span class="line">TIMESTAMP=$(date <span class="string">&quot;+%Y-%m-%d %H:%M:%S&quot;</span>)</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;## 任务完成报告 — <span class="variable">$TIMESTAMP</span>&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;**项目**: <span class="variable">$CLAUDE_PROJECT_ROOT</span>&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;**Hook 类型**: <span class="variable">$CLAUDE_HOOK_TYPE</span>&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;### 修改的文件&quot;</span></span><br><span class="line">  git diff --name-only 2&gt;/dev/null || <span class="built_in">echo</span> <span class="string">&quot;(未检测到 Git 仓库)&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;---&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;&quot;</span></span><br><span class="line">&#125; &gt;&gt; <span class="string">&quot;<span class="variable">$SUMMARY_FILE</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Hook] 任务摘要已追加到 <span class="variable">$SUMMARY_FILE</span>&quot;</span></span><br></pre></td></tr></table></figure><h3 id="案例-4：TypeScript-React-项目全流程自动化"><a href="#案例-4：TypeScript-React-项目全流程自动化" class="headerlink" title="案例 4：TypeScript/React 项目全流程自动化"></a>案例 4：TypeScript/React 项目全流程自动化</h3><p>完整的 <code>.claude/settings.local.json</code>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;before_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/pre-write.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">8000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;files&quot;</span>: [<span class="string">&quot;*.ts&quot;</span>, <span class="string">&quot;*.tsx&quot;</span>, <span class="string">&quot;*.js&quot;</span>, <span class="string">&quot;*.jsx&quot;</span>, <span class="string">&quot;*.css&quot;</span>, <span class="string">&quot;*.json&quot;</span>]</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;after_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/post-write.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">15000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">false</span>,</span><br><span class="line">      <span class="attr">&quot;files&quot;</span>: [<span class="string">&quot;*.ts&quot;</span>, <span class="string">&quot;*.tsx&quot;</span>]</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;before_command&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/command-guard.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">3000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;exclude_commands&quot;</span>: [<span class="string">&quot;npm*&quot;</span>, <span class="string">&quot;pnpm*&quot;</span>, <span class="string">&quot;yarn*&quot;</span>, <span class="string">&quot;git status*&quot;</span>, <span class="string">&quot;ls*&quot;</span>, <span class="string">&quot;cat*&quot;</span>]</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;after_task&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/task-summary.sh&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">5000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">false</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h2 id="七、调试与排查"><a href="#七、调试与排查" class="headerlink" title="七、调试与排查"></a>七、调试与排查</h2><h3 id="检查-Hook-是否生效"><a href="#检查-Hook-是否生效" class="headerlink" title="检查 Hook 是否生效"></a>检查 Hook 是否生效</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看当前 Claude Code 配置</span></span><br><span class="line">claude config list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看 settings.local.json 内容</span></span><br><span class="line">cat .claude/settings.local.json</span><br></pre></td></tr></table></figure><h3 id="查看-Hook-执行日志"><a href="#查看-Hook-执行日志" class="headerlink" title="查看 Hook 执行日志"></a>查看 Hook 执行日志</h3><p>Claude Code 会在终端输出 Hook 的执行信息。如果 Hook 出错，你会看到类似：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[Hook] before_write: ❌ 退出码 1</span><br><span class="line">[Hook] 错误: ESLint 检查失败</span><br></pre></td></tr></table></figure><h3 id="常用调试技巧"><a href="#常用调试技巧" class="headerlink" title="常用调试技巧"></a>常用调试技巧</h3><ol><li><strong>先跑脚本本身</strong>：在终端直接运行 Hook 脚本，确保它独立工作正常</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 模拟 Hook 环境变量</span></span><br><span class="line">CLAUDE_HOOK_FILE=<span class="string">&quot;src/app.ts&quot;</span> bash .claude/hooks/format-code.sh</span><br></pre></td></tr></table></figure><ol start="2"><li><p><strong>逐步减少复杂性</strong>：先用一个简单的 <code>echo &quot;Hello&quot;</code> 脚本确认 Hook 机制工作，再替换为真实逻辑</p></li><li><p><strong>检查路径</strong>：Hook 脚本的工作目录是<strong>项目根目录</strong>，不是脚本所在目录。使用绝对路径或 <code>$CLAUDE_PROJECT_ROOT</code></p></li><li><p><strong>日志重定向</strong>：将日志写入文件而非仅输出到终端</p></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 Hook 脚本中</span></span><br><span class="line"><span class="built_in">exec</span> &gt;&gt; <span class="string">&quot;<span class="variable">$CLAUDE_PROJECT_ROOT</span>/.claude/hooks.log&quot;</span> 2&gt;&amp;1</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[<span class="subst">$(date)</span>] Hook 开始: <span class="variable">$CLAUDE_HOOK_TYPE</span>&quot;</span></span><br></pre></td></tr></table></figure><h3 id="常见错误与解决方案"><a href="#常见错误与解决方案" class="headerlink" title="常见错误与解决方案"></a>常见错误与解决方案</h3><table><thead><tr><th>错误现象</th><th>可能原因</th><th>解决方案</th></tr></thead><tbody><tr><td>Hook 不执行</td><td>配置文件语法错误</td><td>检查 JSON 格式，用 <code>jsonlint</code> 验证</td></tr><tr><td>Hook 超时</td><td>脚本执行时间过长</td><td>增大 timeout 值或优化脚本</td></tr><tr><td>文件写入被阻止</td><td>blocking=true 的 Hook 返回非 0</td><td>检查 Hook 脚本逻辑</td></tr><tr><td>环境变量为空</td><td>使用方式不正确</td><td>使用 <code>$CLAUDE_HOOK_FILE</code> 而非参数传递</td></tr><tr><td>脚本路径错误</td><td>相对路径问题</td><td>使用脚本所在目录的完整路径</td></tr></tbody></table><hr><h2 id="八、安全注意事项"><a href="#八、安全注意事项" class="headerlink" title="八、安全注意事项"></a>八、安全注意事项</h2><h3 id="正确做法"><a href="#正确做法" class="headerlink" title="正确做法"></a>正确做法</h3><ul><li>✅ 使用 <code>files</code> 字段限制 Hook 只作用于特定文件类型</li><li>✅ 使用 <code>exclude_commands</code> 跳过已知安全的命令</li><li>✅ 在开发和测试阶段使用 <code>blocking: false</code></li><li>✅ 为脚本设置合理的 timeout 值</li><li>✅ 定期审查 Hook 脚本的内容</li></ul><h3 id="错误做法"><a href="#错误做法" class="headerlink" title="错误做法"></a>错误做法</h3><ul><li>❌ 在 Hook 中执行 <code>rm -rf</code> 等破坏性操作</li><li>❌ Hook 脚本读取敏感信息（密码、密钥）</li><li>❌ 设置过长（&gt; 60 秒）的 blocking 超时</li><li>❌ 跳过错误处理（不使用 <code>set -e</code>）</li><li>❌ 在生产环境中调试未测试的 Hook</li></ul><hr><h2 id="九、常见问题"><a href="#九、常见问题" class="headerlink" title="九、常见问题"></a>九、常见问题</h2><h3 id="Q1：Hook-脚本可以访问网络吗？"><a href="#Q1：Hook-脚本可以访问网络吗？" class="headerlink" title="Q1：Hook 脚本可以访问网络吗？"></a>Q1：Hook 脚本可以访问网络吗？</h3><p>可以。Hook 脚本可以执行任何 shell 命令，包括网络请求。但建议将网络操作放在 <code>blocking: false</code> 的 Hook 中，避免阻塞主流程。</p><h3 id="Q2：多个-Hook-可以同时注册吗？"><a href="#Q2：多个-Hook-可以同时注册吗？" class="headerlink" title="Q2：多个 Hook 可以同时注册吗？"></a>Q2：多个 Hook 可以同时注册吗？</h3><p>是的。可以为同一个事件注册多个 Hook，但每个事件只能有一个 <code>command</code> 配置。如果需要执行多个操作，请在脚本内部串联：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment"># 在单个 Hook 脚本中执行多个操作</span></span><br><span class="line">npm run format</span><br><span class="line">npm run lint</span><br><span class="line">npm run <span class="built_in">test</span>:quick</span><br></pre></td></tr></table></figure><h3 id="Q3：如何在不同项目间共享-Hook？"><a href="#Q3：如何在不同项目间共享-Hook？" class="headerlink" title="Q3：如何在不同项目间共享 Hook？"></a>Q3：如何在不同项目间共享 Hook？</h3><p>你可以将 Hook 脚本放在 Git 仓库中共享，或者创建一个模板项目：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建 Hook 模板</span></span><br><span class="line">mkdir -p ~/.claude-templates/hooks/</span><br><span class="line">cp my-hooks/* ~/.claude-templates/hooks/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在新项目中引用</span></span><br><span class="line">ln -s ~/.claude-templates/hooks/ .claude/hooks/</span><br></pre></td></tr></table></figure><h3 id="Q4：before-write-Hook-修改了文件内容会怎样？"><a href="#Q4：before-write-Hook-修改了文件内容会怎样？" class="headerlink" title="Q4：before_write Hook 修改了文件内容会怎样？"></a>Q4：before_write Hook 修改了文件内容会怎样？</h3><p>Claude Code 会将你修改后的内容写入磁盘。这意味着 Hook 可以<strong>修改即将写入的内容</strong>——这是格式化和代码注入的基础机制。</p><h3 id="Q5：生产环境-vs-开发环境需要不同的-Hook-配置？"><a href="#Q5：生产环境-vs-开发环境需要不同的-Hook-配置？" class="headerlink" title="Q5：生产环境 vs 开发环境需要不同的 Hook 配置？"></a>Q5：生产环境 vs 开发环境需要不同的 Hook 配置？</h3><p>推荐使用 Git 分支或环境变量区分：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;hooks&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;before_write&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;bash .claude/hooks/pre-write.sh --env $&#123;NODE_ENV:-development&#125;&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;timeout&quot;</span>: <span class="number">10000</span>,</span><br><span class="line">      <span class="attr">&quot;blocking&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;files&quot;</span>: [<span class="string">&quot;*.ts&quot;</span>, <span class="string">&quot;*.tsx&quot;</span>]</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后在脚本内根据 <code>$NODE_ENV</code> 执行不同的逻辑。</p><h3 id="Q6：Hook-执行失败会影响我正在编辑的代码吗？"><a href="#Q6：Hook-执行失败会影响我正在编辑的代码吗？" class="headerlink" title="Q6：Hook 执行失败会影响我正在编辑的代码吗？"></a>Q6：Hook 执行失败会影响我正在编辑的代码吗？</h3><ul><li><strong>blocking: true</strong>：如果 Hook 返回非 0 退出码，<strong>会阻止操作进行</strong>（如阻止文件写入）。你的代码不会被修改。</li><li><strong>blocking: false</strong>：Hook 异步执行，即使失败也不影响主流程。</li></ul><hr><p><strong>总结</strong>：Hooks 是 Claude Code 中极具威力的自动化工具。通过合理配置 before_write 实现格式化自动化、before_command 提供安全防护、after_task 生成报告总结，你可以大幅减少重复性工作，将精力集中在真正需要创造力的编码任务上。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Claude-Code-Hooks-完全指南——自动化你的开发工作流&quot;&gt;&lt;a href=&quot;#Claude-Code-Hooks-完全指南——自动化你的开发工作流&quot; class=&quot;headerlink&quot; title=&quot;Claude Code Hooks 完全指南——</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="agent" scheme="https://www.geniux.top/tags/agent/"/>
    
    <category term="claude" scheme="https://www.geniux.top/tags/claude/"/>
    
    <category term="tutorial" scheme="https://www.geniux.top/tags/tutorial/"/>
    
    <category term="hooks" scheme="https://www.geniux.top/tags/hooks/"/>
    
  </entry>
  
  <entry>
    <title>Claude Code 安装教程——从零开始配置你的 AI 编程助手</title>
    <link href="https://www.geniux.top/article/5121d5d2dfb3/"/>
    <id>https://www.geniux.top/article/5121d5d2dfb3/</id>
    <published>2026-06-01T02:00:00.000Z</published>
    <updated>2026-06-01T08:00:39.341Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Claude-Code-安装教程——从零开始配置你的-AI-编程助手"><a href="#Claude-Code-安装教程——从零开始配置你的-AI-编程助手" class="headerlink" title="Claude Code 安装教程——从零开始配置你的 AI 编程助手"></a>Claude Code 安装教程——从零开始配置你的 AI 编程助手</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>版本：</strong> 2026-06-01<br><strong>适用平台：</strong> macOS / Windows / Linux</p></blockquote><hr><p>Claude Code 是 Anthropic 推出的 AI 编程助手 CLI（命令行界面），它可以直接在你的终端中理解代码、修改文件、运行命令、管理 Git 仓库。本文将详细介绍在 <strong>macOS</strong> 和 <strong>Windows</strong> 上安装 Claude Code 的四种方式，以及如何通过 CC Switch 工具管理多套环境配置。</p><hr><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ol><li><a href="#%E4%B8%80%E5%AE%89%E8%A3%85%E5%89%8D%E5%87%86%E5%A4%87">安装前准备</a></li><li><a href="#%E4%BA%8C%E6%96%B9%E6%B3%95%E4%B8%80cli-%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%AE%89%E8%A3%85">方法一：CLI 命令行安装</a></li><li><a href="#%E4%B8%89%E6%96%B9%E6%B3%95%E4%BA%8Cvscode-%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85">方法二：VSCode 插件安装</a></li><li><a href="#%E5%9B%9B%E6%96%B9%E6%B3%95%E4%B8%89jetbrains-idea-%E6%8F%92%E4%BB%B6%E5%AE%89%E8%A3%85">方法三：JetBrains IDEA 插件安装</a></li><li><a href="#%E4%BA%94%E6%96%B9%E6%B3%95%E5%9B%9Bdesktop-%E6%A1%8C%E9%9D%A2%E7%89%88">方法四：Desktop 桌面版</a></li><li><a href="#%E5%85%ADcc-switch%E4%B8%80%E9%94%AE%E5%88%87%E6%8D%A2%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F">CC Switch：一键切换环境变量</a></li><li><a href="#%E4%B8%83%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">常见问题</a></li></ol><hr><h2 id="一、安装前准备"><a href="#一、安装前准备" class="headerlink" title="一、安装前准备"></a>一、安装前准备</h2><h3 id="系统要求"><a href="#系统要求" class="headerlink" title="系统要求"></a>系统要求</h3><table><thead><tr><th>平台</th><th>最低版本</th></tr></thead><tbody><tr><td>macOS</td><td>macOS 12+ (Monterey)</td></tr><tr><td>Windows</td><td>Windows 10+ (Build 19041+)</td></tr><tr><td>Linux</td><td>任意现代发行版</td></tr></tbody></table><h3 id="通用前置依赖"><a href="#通用前置依赖" class="headerlink" title="通用前置依赖"></a>通用前置依赖</h3><p>无论哪种安装方式，Claude Code 都需要 **Node.js 18+**：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># macOS — 使用 Homebrew</span></span><br><span class="line">brew install node</span><br><span class="line"></span><br><span class="line"><span class="comment"># macOS — 使用 nvm（推荐，方便版本管理）</span></span><br><span class="line">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash</span><br><span class="line">nvm install 22</span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows — 使用 winget</span></span><br><span class="line">winget install OpenJS.NodeJS.LTS</span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows — 或下载安装包</span></span><br><span class="line"><span class="comment"># 访问 https://nodejs.org/ 下载 LTS 版本</span></span><br></pre></td></tr></table></figure><p>验证安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">node --version   <span class="comment"># 应输出 v18.x.x 或更高</span></span><br><span class="line">npm --version</span><br></pre></td></tr></table></figure><hr><h2 id="二、方法一：CLI-命令行安装"><a href="#二、方法一：CLI-命令行安装" class="headerlink" title="二、方法一：CLI 命令行安装"></a>二、方法一：CLI 命令行安装</h2><p>这是最核心的安装方式。CLI 安装后，其他 IDE 插件都以此为基础运行。</p><h3 id="2-1-npm-全局安装（所有平台通用）"><a href="#2-1-npm-全局安装（所有平台通用）" class="headerlink" title="2.1 npm 全局安装（所有平台通用）"></a>2.1 npm 全局安装（所有平台通用）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g @anthropic-ai/claude-code</span><br></pre></td></tr></table></figure><p>安装完成后验证：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude --version</span><br></pre></td></tr></table></figure><h3 id="2-2-macOS-专用安装方式"><a href="#2-2-macOS-专用安装方式" class="headerlink" title="2.2 macOS 专用安装方式"></a>2.2 macOS 专用安装方式</h3><p><strong>方式 A：npm（推荐）</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g @anthropic-ai/claude-code</span><br></pre></td></tr></table></figure><p><strong>方式 B：Homebrew</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">brew install anthropic/claude-code/claude</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或通过新式 tap</span></span><br><span class="line">brew tap anthropic/claude-code</span><br><span class="line">brew install claude-code</span><br></pre></td></tr></table></figure><p><strong>方式 C：从官网下载原生安装包</strong><br>访问 <a href="https://code.claude.com/download">code.claude.com</a> 下载 macOS 的 <code>.dmg</code> 或 <code>.pkg</code> 安装包。</p><h3 id="2-3-Windows-专用安装方式"><a href="#2-3-Windows-专用安装方式" class="headerlink" title="2.3 Windows 专用安装方式"></a>2.3 Windows 专用安装方式</h3><p><strong>方式 A：npm（推荐）</strong></p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install <span class="literal">-g</span> @anthropic<span class="literal">-ai</span>/claude<span class="literal">-code</span></span><br></pre></td></tr></table></figure><blockquote><p>⚠️ <strong>Windows 注意事项</strong>：</p><ul><li>建议以 <strong>管理员身份</strong> 运行 PowerShell 或 CMD</li><li>如遇到执行策略限制，先运行：<code>Set-ExecutionPolicy RemoteSigned -Scope CurrentUser</code></li><li>npm 全局包安装后，确保 npm 全局 <code>node_modules</code> 目录在 <code>PATH</code> 中</li></ul></blockquote><p><strong>方式 B：winget（Windows 包管理器）</strong></p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">winget install Anthropic.ClaudeCode</span><br></pre></td></tr></table></figure><p><strong>方式 C：原生安装包</strong><br>从 <a href="https://code.claude.com/download">code.claude.com</a> 下载 Windows 安装程序（<code>.exe</code> / <code>.msi</code>），双击安装即可。</p><h3 id="2-4-验证安装"><a href="#2-4-验证安装" class="headerlink" title="2.4 验证安装"></a>2.4 验证安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">claude --version</span><br></pre></td></tr></table></figure><h3 id="2-5-更新与卸载"><a href="#2-5-更新与卸载" class="headerlink" title="2.5 更新与卸载"></a>2.5 更新与卸载</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新 Claude Code</span></span><br><span class="line">claude update</span><br><span class="line"><span class="comment"># 或</span></span><br><span class="line">claude upgrade</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看健康状态</span></span><br><span class="line">claude doctor</span><br><span class="line"></span><br><span class="line"><span class="comment"># 卸载（npm 安装方式）</span></span><br><span class="line">npm uninstall -g @anthropic-ai/claude-code</span><br></pre></td></tr></table></figure><hr><h2 id="三、方法二：VSCode-插件安装"><a href="#三、方法二：VSCode-插件安装" class="headerlink" title="三、方法二：VSCode 插件安装"></a>三、方法二：VSCode 插件安装</h2><h3 id="3-1-安装步骤"><a href="#3-1-安装步骤" class="headerlink" title="3.1 安装步骤"></a>3.1 安装步骤</h3><ol><li>打开 <strong>Visual Studio Code</strong></li><li>点击左侧活动栏的 <strong>扩展</strong> 图标（<code>Ctrl+Shift+X</code> / <code>Cmd+Shift+X</code>）</li><li>搜索 <strong>“Claude Code”</strong></li><li>找到官方 Anthropic 发布的扩展（图标为紫色火花 <code>✨</code> 或 Anthropic 标志，已发布者验证）</li><li>点击 <strong>Install</strong></li></ol><blockquote><p>也可以直接访问 VSCode Marketplace：<br><a href="https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code">https://marketplace.visualstudio.com/items?itemName=anthropic.claude-code</a></p></blockquote><h3 id="3-2-使用方式"><a href="#3-2-使用方式" class="headerlink" title="3.2 使用方式"></a>3.2 使用方式</h3><p>安装后，侧边栏会出现一个 <strong>火花图标（Spark）</strong>，点击即可打开 Claude Code 面板：</p><ul><li><strong>Prompt Box</strong>（提示框）— 直接在 VSCode 内输入你的需求</li><li><strong>Terminal Mode</strong>（终端模式）— 切换到完整终端 REPL</li><li><strong>参考文件</strong> — 可以 <code>@</code> 引用当前打开的文件</li></ul><h3 id="3-3-VSCode-插件-vs-CLI-的切换"><a href="#3-3-VSCode-插件-vs-CLI-的切换" class="headerlink" title="3.3 VSCode 插件 vs CLI 的切换"></a>3.3 VSCode 插件 vs CLI 的切换</h3><p>你可以在 VSCode 中使用 <strong><code>--code</code></strong> 参数在不同模式间切换：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 从 CLI 切换到 VSCode 扩展模式</span></span><br><span class="line">claude --code</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在 VSCode 终端中打开 Claude Code</span></span><br><span class="line"><span class="comment"># 直接用 VSCode 内置终端运行 claude 即可</span></span><br></pre></td></tr></table></figure><h3 id="3-4-设置项"><a href="#3-4-设置项" class="headerlink" title="3.4 设置项"></a>3.4 设置项</h3><p>VSCode 扩展支持在 <code>settings.json</code> 中配置：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;claude-code.theme&quot;</span>: <span class="string">&quot;dark&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;claude-code.language&quot;</span>: <span class="string">&quot;zh-CN&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;claude-code.autoOpenTerminal&quot;</span>: <span class="literal">true</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-5-前置条件"><a href="#3-5-前置条件" class="headerlink" title="3.5 前置条件"></a>3.5 前置条件</h3><p>VSCode 插件需要系统已安装 Claude Code CLI。如果未安装，插件会提示你先运行 <code>npm install -g @anthropic-ai/claude-code</code>。</p><hr><h2 id="四、方法三：JetBrains-IDEA-插件安装"><a href="#四、方法三：JetBrains-IDEA-插件安装" class="headerlink" title="四、方法三：JetBrains IDEA 插件安装"></a>四、方法三：JetBrains IDEA 插件安装</h2><p>Claude Code 官方提供了 JetBrains 系列 IDE 的插件，支持 <strong>IntelliJ IDEA</strong>、<strong>PyCharm</strong>、<strong>WebStorm</strong>、<strong>GoLand</strong> 等所有 JetBrains IDE。</p><h3 id="4-1-安装步骤"><a href="#4-1-安装步骤" class="headerlink" title="4.1 安装步骤"></a>4.1 安装步骤</h3><p><strong>方式 A：从 IDE 内安装</strong></p><ol><li>打开 IntelliJ IDEA（或其他 JetBrains IDE）</li><li>进入 <strong>File → Settings → Plugins</strong>（Windows/Linux）或 <strong>IntelliJ IDEA → Settings → Plugins</strong>（macOS）</li><li>切换到 <strong>Marketplace</strong> 标签</li><li>搜索 <strong>“Claude Code”</strong></li><li>找到官方插件「Claude Code [Beta]」，点击 <strong>Install</strong></li><li>重启 IDE</li></ol><p><strong>方式 B：从 JetBrains Marketplace 安装</strong><br>访问 <a href="https://plugins.jetbrains.com/plugin/27310-claude-code-beta-">plugins.jetbrains.com/plugin/27310-claude-code-beta-</a> 在线安装。</p><h3 id="4-2-前置条件"><a href="#4-2-前置条件" class="headerlink" title="4.2 前置条件"></a>4.2 前置条件</h3><blockquote><p>⚠️ <strong>重要</strong>：JetBrains 插件 <strong>仅是一个集成界面</strong>，它要求 Claude Code CLI <strong>已单独安装</strong>。请先完成第二章的 CLI 安装。</p></blockquote><h3 id="4-3-配置-Claude-命令路径"><a href="#4-3-配置-Claude-命令路径" class="headerlink" title="4.3 配置 Claude 命令路径"></a>4.3 配置 Claude 命令路径</h3><p>安装插件后，进入 <strong>Settings → Tools → Claude Code</strong> 配置 CLI 路径：</p><ul><li><strong>macOS</strong>：默认自动识别 <code>/usr/local/bin/claude</code> 或 <code>~/.npm-global/bin/claude</code></li><li><strong>Windows</strong>：默认自动识别 <code>%APPDATA%\npm\claude</code> 或 <code>%USERPROFILE%\AppData\Roaming\npm\claude</code></li><li><strong>WSL 用户</strong>：需设置为 <code>wsl -d Ubuntu -- bash -lic &quot;claude&quot;</code>（将 Ubuntu 替换为你的 WSL 发行版名称）</li></ul><h3 id="4-4-使用方式"><a href="#4-4-使用方式" class="headerlink" title="4.4 使用方式"></a>4.4 使用方式</h3><ul><li><strong>快捷键</strong>：<code>Ctrl+Shift+C</code>（Windows/Linux）或 <code>Cmd+Shift+C</code>（macOS）打开 Claude Code 面板</li><li>在 JetBrains 内置终端中直接输入 <code>claude</code> 使用</li><li><strong>ESC 键问题</strong>：如果 ESC 无法中断 Claude Code 操作，请在插件设置中检查终端兼容性</li></ul><h3 id="4-5-自动更新"><a href="#4-5-自动更新" class="headerlink" title="4.5 自动更新"></a>4.5 自动更新</h3><p>插件默认启用自动更新，设置路径：<strong>Settings → Tools → Claude Code → Enable automatic updates</strong></p><hr><h2 id="五、方法四：Desktop-桌面版"><a href="#五、方法四：Desktop-桌面版" class="headerlink" title="五、方法四：Desktop 桌面版"></a>五、方法四：Desktop 桌面版</h2><p>Claude Code 也提供了独立的桌面应用程序，适合不想使用终端或 IDE 的用户。</p><h3 id="下载方式"><a href="#下载方式" class="headerlink" title="下载方式"></a>下载方式</h3><p>访问 <a href="https://code.claude.com/download">code.claude.com</a>：</p><ul><li><strong>macOS</strong>：下载 <code>.dmg</code> 安装包</li><li><strong>Windows</strong>：下载 <code>.exe</code> 安装程序</li></ul><p>桌面版内置了完整的 Claude Code 功能，并提供图形化界面。不过对于编程任务，CLI 和 IDE 插件仍然是更主流的选择。</p><hr><h2 id="六、CC-Switch：一键切换环境变量"><a href="#六、CC-Switch：一键切换环境变量" class="headerlink" title="六、CC Switch：一键切换环境变量"></a>六、CC Switch：一键切换环境变量</h2><p>CC Switch 是一个开源的跨平台环境管理工具，专门用于 <strong>管理 Claude Code、Codex、Gemini CLI 等多个 AI 编程工具的环境配置</strong>。当你需要使用不同的 API 提供商（如官方 API、中转 API、企业代理等）时，不需要手动修改配置文件，一键即可切换。</p><p>CC Switch 有两个版本：</p><h3 id="6-1-CC-Switch-Desktop（桌面版）"><a href="#6-1-CC-Switch-Desktop（桌面版）" class="headerlink" title="6.1 CC Switch Desktop（桌面版）"></a>6.1 CC Switch Desktop（桌面版）</h3><p>支持 Windows / macOS / Linux，提供图形化界面。</p><p><strong>安装方式：</strong></p><ul><li><strong>macOS</strong>：从 <a href="https://github.com/farion1231/cc-switch/releases">GitHub Releases</a> 下载 <code>.dmg</code>，拖入 Applications</li><li><strong>Windows</strong>：下载 <code>.exe</code> 或 <code>.msi</code> 安装包，双击安装</li><li><strong>Linux</strong>：下载 <code>.AppImage</code> 或 <code>.deb</code> 包</li></ul><p><strong>核心功能：</strong></p><table><thead><tr><th>功能</th><th>说明</th></tr></thead><tbody><tr><td><strong>一键切换提供商</strong></td><td>50+ 内置预设，支持官方 API、AWS Bedrock、社区中转等</td></tr><tr><td><strong>统一管理 MCP</strong></td><td>一个面板管理多个 AI 工具的 MCP 服务器</td></tr><tr><td><strong>用量统计</strong></td><td>跟踪花费、请求数和 Token 消耗</td></tr><tr><td><strong>系统托盘快速切换</strong></td><td>从托盘菜单即时切换，无需打开完整应用</td></tr><tr><td><strong>云同步</strong></td><td>通过 Dropbox、OneDrive、iCloud 或 WebDAV 同步配置</td></tr><tr><td><strong>会话管理</strong></td><td>浏览、搜索和恢复历史对话</td></tr></tbody></table><h3 id="6-2-使用场景示例"><a href="#6-2-使用场景示例" class="headerlink" title="6.2 使用场景示例"></a>6.2 使用场景示例</h3><p><strong>场景：在官方 API 和中转 API 之间切换</strong></p><p>打开 CC Switch 桌面版，在提供商管理界面中添加你的 API Key 和端点地址，然后一键切换即可。切换后 Claude Code 会自动生效，无需重启。</p><hr><h2 id="七、常见问题"><a href="#七、常见问题" class="headerlink" title="七、常见问题"></a>七、常见问题</h2><h3 id="Q1：安装后命令行找不到-claude-命令？"><a href="#Q1：安装后命令行找不到-claude-命令？" class="headerlink" title="Q1：安装后命令行找不到 claude 命令？"></a>Q1：安装后命令行找不到 <code>claude</code> 命令？</h3><p><strong>macOS：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查 npm 全局安装路径是否在 PATH 中</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">&quot;<span class="variable">$PATH</span>:<span class="subst">$(npm config get prefix)</span>/bin&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export PATH=&quot;$PATH:$(npm config get prefix)/bin&quot;&#x27;</span> &gt;&gt; ~/.zshrc</span><br></pre></td></tr></table></figure><p><strong>Windows：</strong></p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将 npm 全局路径添加到 PATH</span></span><br><span class="line"><span class="variable">$npmPath</span> = <span class="string">&quot;<span class="variable">$</span>(npm config get prefix)&quot;</span></span><br><span class="line">[<span class="type">Environment</span>]::SetEnvironmentVariable(<span class="string">&quot;Path&quot;</span>, <span class="string">&quot;<span class="variable">$env:Path</span>;<span class="variable">$npmPath</span>&quot;</span>, <span class="string">&quot;User&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="Q2：Windows-上使用-WSL-如何安装？"><a href="#Q2：Windows-上使用-WSL-如何安装？" class="headerlink" title="Q2：Windows 上使用 WSL 如何安装？"></a>Q2：Windows 上使用 WSL 如何安装？</h3><p>如果你使用 WSL（Windows Subsystem for Linux），直接在 WSL 终端中按 Linux 方式安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 WSL 中安装 Node.js</span></span><br><span class="line">curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -</span><br><span class="line">sudo apt-get install -y nodejs</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 Claude Code</span></span><br><span class="line">npm install -g @anthropic-ai/claude-code</span><br><span class="line"></span><br><span class="line"><span class="comment"># JetBrains 用户需要在插件设置中指定 WSL 命令路径</span></span><br><span class="line"><span class="comment"># 设置为: wsl -d Ubuntu -- bash -lic &quot;claude&quot;</span></span><br></pre></td></tr></table></figure><h3 id="Q3：VSCode-插件安装后看不到火花图标？"><a href="#Q3：VSCode-插件安装后看不到火花图标？" class="headerlink" title="Q3：VSCode 插件安装后看不到火花图标？"></a>Q3：VSCode 插件安装后看不到火花图标？</h3><ul><li>确保已安装 Claude Code CLI（第二章）</li><li>重启 VSCode</li><li>检查 VSCode 版本是否 ≥ 1.85.0</li><li>在扩展管理器中确认 Claude Code 扩展已启用</li></ul><h3 id="Q4：JetBrains-插件提示找不到-claude？"><a href="#Q4：JetBrains-插件提示找不到-claude？" class="headerlink" title="Q4：JetBrains 插件提示找不到 claude？"></a>Q4：JetBrains 插件提示找不到 <code>claude</code>？</h3><ul><li>确认 CLI 已安装：在终端运行 <code>claude --version</code></li><li>检查插件设置中的 Claude 命令路径是否正确</li><li>WSL 用户按 4.3 节配置 <code>wsl -d ...</code> 格式</li></ul><h3 id="Q5：CC-Switch-切换后没有生效？"><a href="#Q5：CC-Switch-切换后没有生效？" class="headerlink" title="Q5：CC Switch 切换后没有生效？"></a>Q5：CC Switch 切换后没有生效？</h3><ul><li>切换后需要在新终端会话中启动 Claude Code</li><li>在 CC Switch 桌面版中确认当前激活的提供商</li><li>检查提供商 API Key 是否有效</li></ul><h3 id="Q6：如何同时使用多个-Claude-Code-配置？"><a href="#Q6：如何同时使用多个-Claude-Code-配置？" class="headerlink" title="Q6：如何同时使用多个 Claude Code 配置？"></a>Q6：如何同时使用多个 Claude Code 配置？</h3><ul><li>使用 <strong>CC Switch</strong> 在不同的提供商之间快速切换</li><li>直接设置环境变量 <code>ANTHROPIC_API_KEY</code> 手动切换</li><li>在 CI/CD 环境中，通过设置环境变量来指定不同的 API Key</li></ul><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><table><thead><tr><th>安装方式</th><th>难度</th><th>适用场景</th></tr></thead><tbody><tr><td>CLI（npm）</td><td>⭐</td><td>所有用户，基础必备</td></tr><tr><td>macOS Homebrew</td><td>⭐</td><td>macOS 用户</td></tr><tr><td>Windows 原生安装包</td><td>⭐</td><td>Windows 用户</td></tr><tr><td>VSCode 插件</td><td>⭐</td><td>VSCode 用户</td></tr><tr><td>JetBrains 插件</td><td>⭐⭐</td><td>IntelliJ/PyCharm/WebStorm 用户</td></tr><tr><td>Desktop 桌面版</td><td>⭐</td><td>偏好 GUI 的用户</td></tr><tr><td>CC Switch</td><td>⭐⭐</td><td>需要管理多环境/多 API 提供商</td></tr></tbody></table><p><strong>推荐安装流程：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 第 1 步：确保有 Node.js</span></span><br><span class="line">node --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 2 步：安装 Claude Code CLI</span></span><br><span class="line">npm install -g @anthropic-ai/claude-code</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 3 步：验证</span></span><br><span class="line">claude --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 4 步（可选）：安装 IDE 插件</span></span><br><span class="line"><span class="comment"># VSCode: 扩展市场搜索 &quot;Claude Code&quot;</span></span><br><span class="line"><span class="comment"># JetBrains: Settings → Plugins → 搜索 &quot;Claude Code&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 第 5 步（可选）：安装 CC Switch 桌面版管理多环境</span></span><br><span class="line"><span class="comment"># 访问 https://ccswitch.io 下载桌面版</span></span><br></pre></td></tr></table></figure><p>安装完成后，就可以开始体验 AI 编程助手的强大功能了！建议继续阅读 <a href="/article/a97807874968/">《Claude Code Skills 使用教程——从入门到进阶》</a> 来进一步了解如何通过技能系统提升效率。</p><hr><p><em>本文首发于 <a href="https://geniux.top/">CaoZH 的笔记</a></em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Claude-Code-安装教程——从零开始配置你的-AI-编程助手&quot;&gt;&lt;a href=&quot;#Claude-Code-安装教程——从零开始配置你的-AI-编程助手&quot; class=&quot;headerlink&quot; title=&quot;Claude Code 安装教程——从零开始配置</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="agent" scheme="https://www.geniux.top/tags/agent/"/>
    
    <category term="claude" scheme="https://www.geniux.top/tags/claude/"/>
    
    <category term="tutorial" scheme="https://www.geniux.top/tags/tutorial/"/>
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="install" scheme="https://www.geniux.top/tags/install/"/>
    
    <category term="入门" scheme="https://www.geniux.top/tags/%E5%85%A5%E9%97%A8/"/>
    
  </entry>
  
  <entry>
    <title>Claude Code Skills 使用教程——从入门到进阶</title>
    <link href="https://www.geniux.top/article/16d7f427a34a/"/>
    <id>https://www.geniux.top/article/16d7f427a34a/</id>
    <published>2026-05-31T02:30:00.000Z</published>
    <updated>2026-06-01T05:53:49.271Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Claude-Code-Skills-使用教程——从入门到进阶"><a href="#Claude-Code-Skills-使用教程——从入门到进阶" class="headerlink" title="Claude Code Skills 使用教程——从入门到进阶"></a>Claude Code Skills 使用教程——从入门到进阶</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>版本：</strong> 2026-05-31<br><strong>适用平台：</strong> Claude Code CLI / Claude Desktop</p></blockquote><hr><h2 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h2><ol><li><a href="#%E4%B8%80%E4%BB%80%E4%B9%88%E6%98%AF-skills">什么是 Skills？</a></li><li><a href="#%E4%BA%8C%E5%86%85%E7%BD%AE%E5%91%BD%E4%BB%A4%E5%BC%80%E7%AE%B1%E5%8D%B3%E7%94%A8">内置命令：开箱即用</a></li><li><a href="#%E4%B8%89%E5%AE%89%E8%A3%85%E7%A4%BE%E5%8C%BA%E6%8A%80%E8%83%BD">安装社区技能</a></li><li><a href="#%E5%9B%9B%E7%BC%96%E5%86%99%E8%87%AA%E5%B7%B1%E7%9A%84%E6%8A%80%E8%83%BD">编写自己的技能</a></li><li><a href="#%E4%BA%94skillmd-%E5%89%8D%E7%AB%AF%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3">SKILL.md 前端配置详解</a></li><li><a href="#%E5%85%AD%E6%8A%80%E8%83%BD%E7%B1%BB%E5%9E%8B%E4%B8%8E%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F">技能类型与设计模式</a></li><li><a href="#%E4%B8%83%E6%8A%80%E8%83%BD%E5%AD%98%E6%94%BE%E4%BD%8D%E7%BD%AE%E4%B8%8E%E4%BD%9C%E7%94%A8%E5%9F%9F">技能存放位置与作用域</a></li><li><a href="#%E5%85%AB%E5%AE%9E%E6%88%98%E4%B8%80%E6%AD%A5%E6%AD%A5%E5%88%9B%E5%BB%BA%E6%8A%80%E8%83%BD">实战：一步步创建技能</a></li><li><a href="#%E4%B9%9D%E8%B0%83%E8%AF%95%E4%B8%8E%E4%BC%98%E5%8C%96%E6%8A%80%E8%83%BD">调试与优化技能</a></li><li><a href="#%E5%8D%81%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98">常见问题</a></li></ol><hr><h2 id="一、什么是-Skills？"><a href="#一、什么是-Skills？" class="headerlink" title="一、什么是 Skills？"></a>一、什么是 Skills？</h2><p>Skills（技能）是 Claude Code 的<strong>能力扩展系统</strong>。本质上，它是一个包含 <code>SKILL.md</code> 文件的目录，该文件使用 <strong>YAML 前端配置 + Markdown 指令</strong> 告诉 Claude 如何完成特定任务。</p><h3 id="Skills-vs-其他概念"><a href="#Skills-vs-其他概念" class="headerlink" title="Skills vs 其他概念"></a>Skills vs 其他概念</h3><table><thead><tr><th>概念</th><th>是什么</th><th>区别</th></tr></thead><tbody><tr><td><strong>Skills</strong></td><td>SKILL.md 指令文件</td><td>教会 Claude 怎么做某事（流程、规范、知识）</td></tr><tr><td><strong>CLAUDE.md</strong></td><td>项目级记忆文件</td><td>告诉 Claude 项目的背景信息（不涉及流程）</td></tr><tr><td><strong>MCP 服务器</strong></td><td>外部服务连接器</td><td>给 Claude 新增能力（访问 API、数据库等）</td></tr><tr><td><strong>Plugins</strong></td><td>技能的打包单元</td><td>一个插件可以包含多个 Skills + MCP + Hooks</td></tr><tr><td><strong>Hooks</strong></td><td>生命周期脚本</td><td>在特定时机自动运行脚本（如保存时格式化）</td></tr></tbody></table><h3 id="两种技能来源"><a href="#两种技能来源" class="headerlink" title="两种技能来源"></a>两种技能来源</h3><p>Skills 有两种来源：</p><ol><li><strong>社区安装的技能</strong>——通过插件市场安装（如 Superpowers、webapp-testing 等），详见第三章</li><li><strong>自己编写的技能</strong>——手动创建 SKILL.md 文件放在 <code>~/.claude/skills/</code> 下，详见第四章</li></ol><blockquote><p>⚠️ <strong>注意</strong>：Claude Code 的 <code>/review</code>、<code>/plan</code>、<code>/compact</code> 等斜杠命令是 <strong>CLI 内置功能</strong>，不属于 Skills 系统。Slash Commands 是手动调用的，Skills 是基于自然语言自动触发的，两者是不同的机制。</p></blockquote><h3 id="技能的工作机制"><a href="#技能的工作机制" class="headerlink" title="技能的工作机制"></a>技能的工作机制</h3><p>当你与 Claude 对话时，它会扫描所有已安装技能的 <code>name</code> 和 <code>description</code>（仅消耗约 <strong>100 tokens/技能</strong> 的上下文）。当对话内容匹配某个技能的描述时，Claude 会<strong>按需加载</strong>该技能的完整 SKILL.md 内容。</p><p>这意味着：</p><ul><li>✅ 装几十个技能也几乎不占上下文</li><li>✅ 只有触发时才加载完整指令</li><li>✅ 技能之间可以联动和组合</li></ul><hr><h2 id="二、内置命令：开箱即用"><a href="#二、内置命令：开箱即用" class="headerlink" title="二、内置命令：开箱即用"></a>二、内置命令：开箱即用</h2><p>Claude Code 自带了一套内置的斜杠命令（Slash Commands），安装后直接通过 <code>/</code> 前缀访问。这些是 <strong>CLI 内置功能</strong>，与 Skills（技能系统）是不同的概念——Skills 是 SKILL.md 文件驱动的自动触发工作流，而这里是手动调用的命令。</p><h3 id="内置命令列表"><a href="#内置命令列表" class="headerlink" title="内置命令列表"></a>内置命令列表</h3><h4 id="会话与上下文管理"><a href="#会话与上下文管理" class="headerlink" title="会话与上下文管理"></a>会话与上下文管理</h4><table><thead><tr><th>命令</th><th>功能</th><th>适用场景</th></tr></thead><tbody><tr><td><code>/help</code></td><td>查看所有可用命令</td><td>首次使用、查找命令</td></tr><tr><td><code>/compact [焦点]</code></td><td>压缩上下文节省 token</td><td>上下文占用超过 70% 时</td></tr><tr><td><code>/clear</code></td><td>清空对话历史，重新开始</td><td>对话偏离主题</td></tr><tr><td><code>/context</code></td><td>可视化查看上下文使用情况</td><td>检查 token 消耗</td></tr><tr><td><code>/cost</code></td><td>查看 token 用量及费用明细</td><td>费用监控</td></tr><tr><td><code>/status</code></td><td>显示版本、连接状态和会话信息</td><td>检查环境</td></tr><tr><td><code>/resume</code></td><td>切换或恢复历史会话</td><td>继续上次工作</td></tr><tr><td><code>/rewind</code></td><td>回退到之前的检查点</td><td>纠正 AI 错误走向</td></tr><tr><td><code>/btw &lt;问题&gt;</code></td><td>提出旁侧问题，不增加主对话上下文</td><td>查文档、快速查询</td></tr><tr><td><code>/todos</code></td><td>列出当前对话中的待办事项</td><td>跟踪进度</td></tr><tr><td><code>/exit</code> / <code>Ctrl+D</code></td><td>结束会话</td><td>退出</td></tr></tbody></table><h4 id="开发与审查"><a href="#开发与审查" class="headerlink" title="开发与审查"></a>开发与审查</h4><table><thead><tr><th>命令</th><th>功能</th><th>适用场景</th></tr></thead><tbody><tr><td><code>/review</code></td><td>自动代码审查</td><td>提交 PR 前、合并分支前</td></tr><tr><td><code>/security-review</code></td><td>安全审计</td><td>检查安全漏洞</td></tr><tr><td><code>/plan [描述]</code></td><td>进入 Plan 模式制定实施计划</td><td>复杂任务先规划再写代码</td></tr><tr><td><code>/loop [间隔]</code></td><td>在会话中设置循环任务</td><td>重复性操作</td></tr><tr><td><code>/batch</code></td><td>自动创建工作树进行大规模并行修改</td><td>同时改 5-30 个文件</td></tr></tbody></table><h4 id="配置与工具"><a href="#配置与工具" class="headerlink" title="配置与工具"></a>配置与工具</h4><table><thead><tr><th>命令</th><th>功能</th><th>适用场景</th></tr></thead><tbody><tr><td><code>/model [模型]</code></td><td>切换模型（如 <code>/model haiku</code>）</td><td>根据任务复杂度选模型</td></tr><tr><td><code>/effort [等级]</code></td><td>设置推理深度：low/medium/high/max/auto</td><td>控制思考深度和成本</td></tr><tr><td><code>/init</code></td><td>创建项目 CLAUDE.md 记忆文件</td><td>新项目初始化</td></tr><tr><td><code>/memory</code></td><td>编辑 CLAUDE.md</td><td>更新项目背景</td></tr><tr><td><code>/config</code></td><td>交互式配置设置</td><td>调整 Claude Code 行为</td></tr><tr><td><code>/permissions</code></td><td>查看/更新工具权限</td><td>安全检查</td></tr><tr><td><code>/agents</code></td><td>管理自定义子代理</td><td>编排多代理工作流</td></tr><tr><td><code>/mcp</code></td><td>管理 MCP 服务器</td><td>添加数据库、API 等外部连接</td></tr><tr><td><code>/add-dir</code></td><td>添加额外工作目录</td><td>monorepo 多目录项目</td></tr><tr><td><code>/voice</code></td><td>语音模式（长按空格录音）</td><td>语音输入</td></tr></tbody></table><h3 id="用法示例"><a href="#用法示例" class="headerlink" title="用法示例"></a>用法示例</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 Claude Code 终端中直接输入</span></span><br><span class="line">/review              <span class="comment"># 审查当前更改（注意是 /review 不是 /code-review）</span></span><br><span class="line">/security-review     <span class="comment"># 安全审计</span></span><br><span class="line">/plan <span class="string">&quot;重构用户模块&quot;</span>  <span class="comment"># 先规划再执行</span></span><br><span class="line">/compact focus on auth  <span class="comment"># 压缩上下文，聚焦认证模块</span></span><br><span class="line">/rewind              <span class="comment"># 回退到之前的状态</span></span><br></pre></td></tr></table></figure><p>内置命令无需安装，开箱即用，但注意它们<strong>不是 Skills（技能系统）</strong>——你不能像覆盖自定义技能那样覆盖它们。想要扩展 Claude Code 的行为，应该通过编写自定义 Skills（见第四章）或自定义 Slash 命令（见第四章）来实现。</p><hr><h2 id="三、安装社区技能"><a href="#三、安装社区技能" class="headerlink" title="三、安装社区技能"></a>三、安装社区技能</h2><p>Claude Code 使用 <strong>Plugin（插件）系统</strong> 来分发技能。社区技能托管在 GitHub 仓库中，可以被添加为”市场”（Marketplace）。</p><h3 id="3-1-从官方市场安装"><a href="#3-1-从官方市场安装" class="headerlink" title="3.1 从官方市场安装"></a>3.1 从官方市场安装</h3><p>Anthropic 官方维护了一个技能市场：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 第一步：添加市场源</span></span><br><span class="line">/plugin marketplace add anthropics/skills</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第二步：安装技能</span></span><br><span class="line">/plugin install webapp-testing@anthropics-skills</span><br><span class="line">/plugin install frontend-design@anthropics-skills</span><br></pre></td></tr></table></figure><h3 id="3-2-从社区仓库安装"><a href="#3-2-从社区仓库安装" class="headerlink" title="3.2 从社区仓库安装"></a>3.2 从社区仓库安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加 Superpowers 市场</span></span><br><span class="line">/plugin marketplace add obra/superpowers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装技能</span></span><br><span class="line">/plugin install superpowers</span><br><span class="line">/plugin install writing-plans@obra-superpowers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加 Addy Osmani 的工程技能</span></span><br><span class="line">/plugin marketplace add addyosmani/agent-skills</span><br><span class="line">/plugin install spec-driven-development@addy-agent-skills</span><br><span class="line">/plugin install code-review-and-quality@addy-agent-skills</span><br><span class="line">/plugin install security-hardening@addy-agent-skills</span><br></pre></td></tr></table></figure><h3 id="3-3-常用社区市场"><a href="#3-3-常用社区市场" class="headerlink" title="3.3 常用社区市场"></a>3.3 常用社区市场</h3><table><thead><tr><th>市场</th><th>来源</th><th>推荐技能</th></tr></thead><tbody><tr><td><code>anthropics/skills</code></td><td>官方</td><td>webapp-testing, frontend-design, skill-creator</td></tr><tr><td><code>obra/superpowers</code></td><td>社区最热</td><td>brainstorming, writing-plans, execute-plan, TDD</td></tr><tr><td><code>addyosmani/agent-skills</code></td><td>Google 工程师出品</td><td>spec-driven, code-review, security, performance</td></tr><tr><td><code>firecrawl/firecrawl-claude-plugin</code></td><td>网页抓取</td><td>firecrawl-build</td></tr><tr><td><code>composiohq/composio</code></td><td>应用集成</td><td>composio-connect</td></tr></tbody></table><h3 id="3-4-管理已安装的技能"><a href="#3-4-管理已安装的技能" class="headerlink" title="3.4 管理已安装的技能"></a>3.4 管理已安装的技能</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看所有已安装的插件</span></span><br><span class="line">/plugin list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看所有可用技能</span></span><br><span class="line">/skills</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启用/禁用某个技能</span></span><br><span class="line">/plugin <span class="built_in">enable</span> superpowers</span><br><span class="line">/plugin <span class="built_in">disable</span> superpowers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 移除技能</span></span><br><span class="line">/plugin remove superpowers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 移除市场源</span></span><br><span class="line">/plugin marketplace remove obra/superpowers</span><br></pre></td></tr></table></figure><h3 id="3-5-直接从-GitHub-手动安装"><a href="#3-5-直接从-GitHub-手动安装" class="headerlink" title="3.5 直接从 GitHub 手动安装"></a>3.5 直接从 GitHub 手动安装</h3><p>你也可以从 GitHub 直接下载技能：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆技能仓库</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/obra/superpowers.git ~/.claude/skills/superpowers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或只安装其中某个子技能</span></span><br><span class="line">mkdir -p ~/.claude/skills/my-tdd</span><br><span class="line">cp superpowers/skills/test-driven-development/SKILL.md ~/.claude/skills/my-tdd/</span><br></pre></td></tr></table></figure><hr><h2 id="四、编写自己的技能"><a href="#四、编写自己的技能" class="headerlink" title="四、编写自己的技能"></a>四、编写自己的技能</h2><p>这是最强大的部分——为你的团队或项目定制专属技能。</p><h3 id="4-1-最简单的技能"><a href="#4-1-最简单的技能" class="headerlink" title="4.1 最简单的技能"></a>4.1 最简单的技能</h3><p>创建一个文件 <code>~/.claude/skills/hello/SKILL.md</code>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: hello</span><br><span class="line">description: |</span><br><span class="line">  一个测试技能。当用户说&quot;你好&quot;或&quot;hello&quot;时触发。</span><br><span class="line"><span class="section">  打印欢迎信息并询问今天的工作内容。</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Hello Skill</span></span><br><span class="line"></span><br><span class="line">当用户问候时，热情回应，并询问今天需要做什么。</span><br></pre></td></tr></table></figure><p>重启 Claude Code 后，说”你好”就会触发这个技能。</p><h3 id="4-2-实用技能示例：Git-提交规范"><a href="#4-2-实用技能示例：Git-提交规范" class="headerlink" title="4.2 实用技能示例：Git 提交规范"></a>4.2 实用技能示例：Git 提交规范</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: git-commit-convention</span><br><span class="line">description: |</span><br><span class="line">  当用户要求提交 Git commit 时使用。</span><br><span class="line">  检查暂存区更改，生成符合 Conventional Commits 格式的提交信息。</span><br><span class="line"><span class="section">  格式: type(scope): description</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Git Commit Convention</span></span><br><span class="line"></span><br><span class="line">当需要提交代码时，遵循以下步骤：</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> 运行 <span class="code">`git diff --cached`</span> 查看暂存区更改</span><br><span class="line"><span class="bullet">2.</span> 根据更改类型确定 commit type：</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`feat`</span>: 新功能</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`fix`</span>: Bug 修复</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`docs`</span>: 文档更改</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`style`</span>: 代码格式（不影响功能）</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`refactor`</span>: 重构</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`test`</span>: 测试相关</span><br><span class="line"><span class="bullet">   -</span> <span class="code">`chore`</span>: 构建/工具</span><br><span class="line"><span class="bullet">3.</span> 生成格式: <span class="code">`type(scope): description`</span></span><br><span class="line"></span><br><span class="line">示例：</span><br></pre></td></tr></table></figure><p>feat(auth): add OAuth2 login support<br>fix(parser): handle null input in JSON parser<br>docs(readme): update installation instructions</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">```</span><br><span class="line"></span><br><span class="line">### 4.3 更复杂的技能：带脚本和引用文件</span><br><span class="line"></span><br><span class="line">技能目录可以包含多个文件：</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>~/.claude/skills/deploy-check/<br>├── SKILL.md           # 核心指令<br>├── scripts/<br>│   └── check-health.sh  # 健康检查脚本<br>└── references/<br>    └── deployment-checklist.md  # 部署检查清单</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">在 `SKILL.md` 中引用这些文件：</span><br><span class="line"></span><br><span class="line">```markdown</span><br><span class="line">---</span><br><span class="line">name: deploy-check</span><br><span class="line">description: |</span><br><span class="line">  部署前的全面检查。当用户要求&quot;部署&quot;、&quot;发布&quot;或&quot;deploy&quot;时触发。</span><br><span class="line">  运行健康检查脚本并核对部署清单。</span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"># Deployment Pre-flight Check</span><br><span class="line"></span><br><span class="line">部署前执行以下步骤：</span><br><span class="line"></span><br><span class="line">## 1. 运行健康检查</span><br><span class="line">执行脚本 `&#123;skilldir&#125;/scripts/check-health.sh` 并分析输出。</span><br><span class="line"></span><br><span class="line">## 2. 核对部署清单</span><br><span class="line">阅读 `&#123;skilldir&#125;/references/deployment-checklist.md`</span><br><span class="line">逐项确认每个检查点。</span><br><span class="line"></span><br><span class="line">## 3. 生成部署报告</span><br><span class="line">汇总检查结果，标记通过/失败的项。</span><br></pre></td></tr></table></figure><p><strong>注意：</strong> <code>&#123;skilldir&#125;</code> 是 Claude Code 自动注入的变量，指向技能目录的路径。</p><hr><h2 id="五、SKILL-md-前端配置详解"><a href="#五、SKILL-md-前端配置详解" class="headerlink" title="五、SKILL.md 前端配置详解"></a>五、SKILL.md 前端配置详解</h2><p>YAML 前端配置（Frontmatter）是 SKILL.md 的核心控制区域，位于文件开头的 <code>---</code> 之间。</p><h3 id="全部前端字段"><a href="#全部前端字段" class="headerlink" title="全部前端字段"></a>全部前端字段</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># === 必需字段 ===</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">my-awesome-skill</span></span><br><span class="line"><span class="attr">description:</span> <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"></span></span><br><span class="line"><span class="comment"># === 触发控制 ===</span></span><br><span class="line"><span class="attr">when_to_use:</span> <span class="string">|</span></span><br><span class="line"><span class="string">  额外的触发条件说明，补充 description。</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="attr">disable-model-invocation:</span> <span class="literal">true</span></span><br><span class="line"><span class="comment"># true: Claude 不会自动触发，只能用户手动 /command 调用</span></span><br><span class="line"><span class="comment"># 适用于破坏性操作或需要用户确认的技能</span></span><br><span class="line"></span><br><span class="line"><span class="attr">user-invocable:</span> <span class="literal">false</span></span><br><span class="line"><span class="comment"># false: 隐藏斜杠命令，只有 Claude 可以自动触发</span></span><br><span class="line"><span class="comment"># 适用于后台工作流，不需要用户主动调用的技能</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># === 权限控制 ===</span></span><br><span class="line"><span class="attr">allowed-tools:</span> <span class="string">&quot;Read, Grep, Bash, Glob&quot;</span></span><br><span class="line"><span class="comment"># 限制技能可使用的工具，用逗号分隔</span></span><br><span class="line"><span class="comment"># 常见值: Read, Grep, Glob, Bash, Write, Edit, Execute</span></span><br><span class="line"><span class="comment"># 默认为全部工具（不设置此字段时）</span></span><br><span class="line"><span class="comment"># 可细化: &quot;Bash(python:*)&quot; 表示只能运行 Python</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># === 执行模式 ===</span></span><br><span class="line"><span class="attr">context:</span> <span class="string">fork</span></span><br><span class="line"><span class="comment"># 不设置: 在主线对话中执行（默认）</span></span><br><span class="line"><span class="comment"># fork: 在独立的子代理中执行，隔离上下文</span></span><br><span class="line"><span class="comment"># 适用于长时间运行的任务，不影响主线对话</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># === 生命周期钩子 ===</span></span><br><span class="line"><span class="attr">hooks:</span></span><br><span class="line">  <span class="attr">on_skill_start:</span> <span class="string">echo</span> <span class="string">&quot;技能开始执行&quot;</span></span><br><span class="line">  <span class="attr">on_skill_end:</span> <span class="string">echo</span> <span class="string">&quot;技能执行完毕&quot;</span></span><br><span class="line">  <span class="attr">on_error:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    echo &quot;出错时间: $(date)&quot; &gt;&gt; /tmp/skill-errors.log</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="comment"># === 其他 ===</span></span><br><span class="line"><span class="attr">model:</span> <span class="string">claude-sonnet-4</span></span><br><span class="line"><span class="comment"># 覆盖当前使用的模型，特定技能用更合适的模型</span></span><br><span class="line"></span><br><span class="line"><span class="attr">argument-hint:</span> <span class="string">&quot;&lt;文件名&gt; [选项]&quot;</span></span><br><span class="line"><span class="comment"># 为斜杠命令显示参数提示</span></span><br><span class="line"></span><br><span class="line"><span class="attr">version:</span> <span class="number">1.0</span><span class="number">.0</span></span><br><span class="line"><span class="attr">author:</span> <span class="string">CaoZH</span></span><br><span class="line"><span class="attr">license:</span> <span class="string">MIT</span></span><br><span class="line"><span class="attr">compatible-with:</span> <span class="string">claude-code,</span> <span class="string">codex,</span> <span class="string">openclaw</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><h3 id="关键字段详解"><a href="#关键字段详解" class="headerlink" title="关键字段详解"></a>关键字段详解</h3><h4 id="description-——-决定技能是否被触发"><a href="#description-——-决定技能是否被触发" class="headerlink" title="description —— 决定技能是否被触发"></a><code>description</code> —— 决定技能是否被触发</h4><p>这是最重要的字段。Claude 在每次对话中只读 name 和 description，如果描述不够精准，技能永远不会被激活。</p><p><strong>好的描述：</strong></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">description:</span> <span class="string">|</span></span><br><span class="line"><span class="string">  处理 PDF 发票：解析发票 PDF，提取行项目，生成对账报告。</span></span><br><span class="line"><span class="string">  在处理供应商发票或月度结算时使用。</span></span><br><span class="line"><span class="string">  触发词：&#x27;process invoices&#x27;、&#x27;reconciliation&#x27;、&#x27;invoice PDF&#x27;</span></span><br></pre></td></tr></table></figure><p><strong>差的描述：</strong></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">description:</span> <span class="string">处理文件</span></span><br></pre></td></tr></table></figure><h4 id="allowed-tools-——-安全沙箱"><a href="#allowed-tools-——-安全沙箱" class="headerlink" title="allowed-tools —— 安全沙箱"></a><code>allowed-tools</code> —— 安全沙箱</h4><p>通过限制工具来防止误操作：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 只读模式：查看文件，不能修改</span></span><br><span class="line"><span class="attr">allowed-tools:</span> <span class="string">&quot;Read, Grep, Glob&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 只允许执行特定命令</span></span><br><span class="line"><span class="attr">allowed-tools:</span> <span class="string">&quot;Read, Bash(python:*,node:*)&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 完全开放（不设置此字段即为默认）</span></span><br></pre></td></tr></table></figure><h4 id="context-fork-——-隔离执行"><a href="#context-fork-——-隔离执行" class="headerlink" title="context: fork —— 隔离执行"></a><code>context: fork</code> —— 隔离执行</h4><p>适合以下场景：</p><ul><li><strong>长时间运行的批量操作</strong>：不阻塞主线对话</li><li><strong>高风险操作</strong>：即使子代理崩溃，主线对话不受影响</li><li><strong>并行任务</strong>：多个 skill 可以 fork 后并行执行</li></ul><h4 id="hooks-——-自动化钩子"><a href="#hooks-——-自动化钩子" class="headerlink" title="hooks —— 自动化钩子"></a><code>hooks</code> —— 自动化钩子</h4><p>支持三个生命周期事件：</p><table><thead><tr><th>钩子</th><th>触发时机</th><th>典型用途</th></tr></thead><tbody><tr><td><code>on_skill_start</code></td><td>技能开始前</td><td>日志记录、环境准备</td></tr><tr><td><code>on_skill_end</code></td><td>技能完成后</td><td>清理、通知、统计</td></tr><tr><td><code>on_error</code></td><td>技能出错时</td><td>错误记录、告警</td></tr></tbody></table><hr><h2 id="六、技能类型与设计模式"><a href="#六、技能类型与设计模式" class="headerlink" title="六、技能类型与设计模式"></a>六、技能类型与设计模式</h2><p>根据功能分类，Claude Code 技能通常有四种设计模式：</p><h3 id="6-1-参考型（Reference-Skill）"><a href="#6-1-参考型（Reference-Skill）" class="headerlink" title="6.1 参考型（Reference Skill）"></a>6.1 参考型（Reference Skill）</h3><p><strong>目的</strong>：提供知识背景，让 Claude 按特定风格工作。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">react-best-practices</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">|</span></span><br><span class="line"><span class="string">  React 开发最佳实践。当项目包含 React 代码时自动生效。</span></span><br><span class="line"><span class="string"></span><span class="meta">---</span></span><br><span class="line"><span class="comment"># React 编码规范</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="string">使用函数组件和</span> <span class="string">Hooks，避免</span> <span class="string">class</span> <span class="string">组件</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">使用</span> <span class="string">TypeScript</span> <span class="string">定义</span> <span class="string">Props</span> <span class="string">接口</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">组件文件命名:</span> <span class="string">PascalCase.tsx</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">优先使用</span> <span class="string">React</span> <span class="string">Query</span> <span class="string">管理服务端状态</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">...</span></span><br></pre></td></tr></table></figure><p><strong>特点</strong>：</p><ul><li>通常设置 <code>disable-model-invocation: false</code>（自动触发）</li><li>不定义具体流程，只提供规范</li><li>触发后 Claude 会自动按规范行事</li></ul><h3 id="6-2-工作流型（Workflow-Skill）"><a href="#6-2-工作流型（Workflow-Skill）" class="headerlink" title="6.2 工作流型（Workflow Skill）"></a>6.2 工作流型（Workflow Skill）</h3><p><strong>目的</strong>：定义多步骤的执行流程。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">api-endpoint-workflow</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">当用户要求创建新的</span> <span class="string">API</span> <span class="string">端点时使用。</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># 创建 API 端点流程</span></span><br><span class="line"></span><br><span class="line"><span class="number">1</span><span class="string">.</span> <span class="string">定义请求/响应类型（DTO）</span></span><br><span class="line"><span class="number">2</span><span class="string">.</span> <span class="string">编写</span> <span class="string">Controller/Handler</span></span><br><span class="line"><span class="number">3</span><span class="string">.</span> <span class="string">编写</span> <span class="string">Service</span> <span class="string">层逻辑</span></span><br><span class="line"><span class="number">4</span><span class="string">.</span> <span class="string">添加参数验证</span></span><br><span class="line"><span class="number">5</span><span class="string">.</span> <span class="string">编写单元测试</span></span><br><span class="line"><span class="number">6</span><span class="string">.</span> <span class="string">注册路由</span></span><br></pre></td></tr></table></figure><p><strong>特点</strong>：</p><ul><li>步骤明确、顺序执行</li><li>每个步骤可能有验证条件</li><li>适合重复性开发任务</li></ul><h3 id="6-3-斜杠命令型（Slash-Command）"><a href="#6-3-斜杠命令型（Slash-Command）" class="headerlink" title="6.3 斜杠命令型（Slash Command）"></a>6.3 斜杠命令型（Slash Command）</h3><p><strong>目的</strong>：用户主动触发，通常带有参数。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">generate-component</span></span><br><span class="line"><span class="attr">user-invocable:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">disable-model-invocation:</span> <span class="literal">true</span></span><br><span class="line"><span class="attr">argument-hint:</span> <span class="string">&quot;&lt;组件名&gt; [选项]&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># 生成 React 组件</span></span><br><span class="line"></span><br><span class="line"><span class="string">根据参数创建新的</span> <span class="string">React</span> <span class="string">组件，包含：</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">组件文件</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">样式文件（CSS</span> <span class="string">Module）</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">测试文件</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">Storybook</span> <span class="string">stories</span></span><br></pre></td></tr></table></figure><p><strong>特点</strong>：</p><ul><li><code>disable-model-invocation: true</code> 防止自动触发</li><li><code>argument-hint</code> 提示用户输入参数</li><li>适合用户主动调用的工具</li></ul><h3 id="6-4-代理型（Agent-Skill）"><a href="#6-4-代理型（Agent-Skill）" class="headerlink" title="6.4 代理型（Agent Skill）"></a>6.4 代理型（Agent Skill）</h3><p><strong>目的</strong>：在独立子代理中执行复杂任务。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">dependency-audit</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">依赖安全检查。当项目有</span> <span class="string">package.json</span> <span class="string">时周期性检查。</span></span><br><span class="line"><span class="attr">context:</span> <span class="string">fork</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="comment"># 依赖审计</span></span><br><span class="line"></span><br><span class="line"><span class="string">在子代理中独立运行：</span></span><br><span class="line"><span class="number">1</span><span class="string">.</span> <span class="string">运行</span> <span class="string">`npm</span> <span class="string">audit`</span> <span class="string">或</span> <span class="string">`pip</span> <span class="string">audit`</span></span><br><span class="line"><span class="number">2</span><span class="string">.</span> <span class="string">分析报告，标记严重漏洞</span></span><br><span class="line"><span class="number">3</span><span class="string">.</span> <span class="string">生成修复建议</span></span><br></pre></td></tr></table></figure><p><strong>特点</strong>：</p><ul><li><code>context: fork</code> 隔离执行</li><li>适合耗时或计算密集的任务</li><li>不干扰主对话</li></ul><hr><h2 id="七、技能存放位置与作用域"><a href="#七、技能存放位置与作用域" class="headerlink" title="七、技能存放位置与作用域"></a>七、技能存放位置与作用域</h2><p>技能可以放在不同的位置，决定其作用范围：</p><h3 id="7-1-用户级（全局生效）"><a href="#7-1-用户级（全局生效）" class="headerlink" title="7.1 用户级（全局生效）"></a>7.1 用户级（全局生效）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~/.claude/skills/&lt;skill-name&gt;/SKILL.md</span><br></pre></td></tr></table></figure><p>放在此处的技能在所有项目中都可用。</p><h3 id="7-2-项目级"><a href="#7-2-项目级" class="headerlink" title="7.2 项目级"></a>7.2 项目级</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;project-root&gt;/.claude/skills/&lt;skill-name&gt;/SKILL.md</span><br></pre></td></tr></table></figure><p>仅在该项目目录下生效。项目级技能优先级高于用户级。</p><h3 id="7-3-团队级（通过-Git-共享）"><a href="#7-3-团队级（通过-Git-共享）" class="headerlink" title="7.3 团队级（通过 Git 共享）"></a>7.3 团队级（通过 Git 共享）</h3><p>将技能放在项目仓库中：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">my-project/</span><br><span class="line">├── .claude/</span><br><span class="line">│   ├── skills/</span><br><span class="line">│   │   ├── deploy-flow/SKILL.md</span><br><span class="line">│   │   └── code-style/SKILL.md</span><br><span class="line">│   └── CLAUDE.md</span><br><span class="line">├── src/</span><br><span class="line">└── package.json</span><br></pre></td></tr></table></figure><p>提交到 Git 后，所有克隆该项目的人自动获得这些技能。</p><h3 id="7-4-作用域优先级"><a href="#7-4-作用域优先级" class="headerlink" title="7.4 作用域优先级"></a>7.4 作用域优先级</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">项目级 &gt; 用户级</span><br></pre></td></tr></table></figure><p>同名技能，项目级覆盖用户级。</p><hr><h2 id="八、实战：一步步创建技能"><a href="#八、实战：一步步创建技能" class="headerlink" title="八、实战：一步步创建技能"></a>八、实战：一步步创建技能</h2><p>我们来创建一个实用的 <strong>Python 项目初始化技能</strong>。</p><h3 id="步骤-1：创建目录"><a href="#步骤-1：创建目录" class="headerlink" title="步骤 1：创建目录"></a>步骤 1：创建目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p ~/.claude/skills/init-python-project</span><br></pre></td></tr></table></figure><h3 id="步骤-2：编写-SKILL-md"><a href="#步骤-2：编写-SKILL-md" class="headerlink" title="步骤 2：编写 SKILL.md"></a>步骤 2：编写 SKILL.md</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim ~/.claude/skills/init-python-project/SKILL.md</span><br></pre></td></tr></table></figure><p>内容如下：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: init-python-project</span><br><span class="line">description: |</span><br><span class="line">  初始化 Python 项目结构。当用户说&quot;创建 Python 项目&quot;、&quot;初始化项目&quot;</span><br><span class="line">  或 &quot;new python project&quot; 时触发。</span><br><span class="line"><span class="section">  创建标准目录结构、虚拟环境、配置文件。</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Python 项目初始化</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">### 1. 询问项目信息</span></span><br><span class="line"><span class="bullet">-</span> 项目名称</span><br><span class="line"><span class="bullet">-</span> 项目描述</span><br><span class="line"><span class="bullet">-</span> Python 版本要求（默认 3.11+）</span><br><span class="line"></span><br><span class="line"><span class="section">### 2. 创建目录结构</span></span><br></pre></td></tr></table></figure><p>project-name/<br>├── src/<br>│   └── project_name/<br>│       ├── <strong>init</strong>.py<br>│       └── main.py<br>├── tests/<br>│   ├── <strong>init</strong>.py<br>│   └── test_main.py<br>├── docs/<br>├── scripts/<br>├── .env.example<br>├── .gitignore<br>├── README.md<br>├── pyproject.toml<br>└── requirements.txt</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">### 3. 生成配置文件</span><br><span class="line"></span><br><span class="line">**pyproject.toml** 包含：</span><br><span class="line">- 项目元数据</span><br><span class="line">- 依赖管理（使用 pip 或 uv）</span><br><span class="line">- 工具配置（ruff, mypy, pytest）</span><br><span class="line"></span><br><span class="line">**.gitignore** 包含 Python 标准忽略规则</span><br><span class="line"></span><br><span class="line">### 4. 初始化虚拟环境</span><br><span class="line">```bash</span><br><span class="line">python -m venv .venv</span><br></pre></td></tr></table></figure><h3 id="5-创建初始-Git-仓库"><a href="#5-创建初始-Git-仓库" class="headerlink" title="5. 创建初始 Git 仓库"></a>5. 创建初始 Git 仓库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;chore: initial project structure&quot;</span></span><br></pre></td></tr></table></figure><h2 id="输出"><a href="#输出" class="headerlink" title="输出"></a>输出</h2><p>完成后打印项目结构和下一步建议。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">### 步骤 3：验证技能是否加载</span><br><span class="line"></span><br><span class="line">在 Claude Code 中运行：</span><br><span class="line"></span><br><span class="line">```bash</span><br><span class="line">/skills</span><br></pre></td></tr></table></figure><p>如果看到 <code>init-python-project</code> 出现在列表中，说明加载成功。</p><h3 id="步骤-4：测试使用"><a href="#步骤-4：测试使用" class="headerlink" title="步骤 4：测试使用"></a>步骤 4：测试使用</h3><p>在 Claude Code 中说出：</p><blockquote><p>“帮我创建一个新的 Python 项目”</p></blockquote><p>此时 Claude 会匹配到 <code>init-python-project</code> 技能描述，加载完整指令并执行。</p><hr><h2 id="九、调试与优化技能"><a href="#九、调试与优化技能" class="headerlink" title="九、调试与优化技能"></a>九、调试与优化技能</h2><h3 id="9-1-检查技能加载状态"><a href="#9-1-检查技能加载状态" class="headerlink" title="9.1 检查技能加载状态"></a>9.1 检查技能加载状态</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/skills              <span class="comment"># 列出所有已加载的技能</span></span><br><span class="line">/plugin list         <span class="comment"># 列出所有已安装的插件</span></span><br></pre></td></tr></table></figure><h3 id="9-2-强制触发技能"><a href="#9-2-强制触发技能" class="headerlink" title="9.2 强制触发技能"></a>9.2 强制触发技能</h3><p>如果技能没有被自动触发，可以用斜杠命令方式：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/init-python-project <span class="string">&quot;创建一个名为 my-app 的 Python 项目&quot;</span></span><br></pre></td></tr></table></figure><h3 id="9-3-技能未触发的常见原因"><a href="#9-3-技能未触发的常见原因" class="headerlink" title="9.3 技能未触发的常见原因"></a>9.3 技能未触发的常见原因</h3><table><thead><tr><th>问题</th><th>原因</th><th>修复</th></tr></thead><tbody><tr><td>技能列表看不到</td><td>目录或文件名不对</td><td>检查 <code>SKILL.md</code>（大小写敏感）</td></tr><tr><td>描述匹配了但不触发</td><td>description 不够精准</td><td>增加触发词，参考已有技能</td></tr><tr><td>执行效果不符合预期</td><td>指令不够明确</td><td>增加具体步骤和代码示例</td></tr><tr><td>技能太多影响性能</td><td>description 太泛导致频繁误匹配</td><td>缩小触发范围，增加 <code>when_to_use</code></td></tr></tbody></table><h3 id="9-4-优化建议"><a href="#9-4-优化建议" class="headerlink" title="9.4 优化建议"></a>9.4 优化建议</h3><ol><li><strong>描述要精确</strong>：用触发词列表收窄匹配范围</li><li><strong>步骤要具体</strong>：模糊的指令导致模糊的执行</li><li><strong>提供示例</strong>：代码示例比文字描述更有效</li><li><strong>使用脚本</strong>：复杂逻辑放到脚本中，SKILL.md 保持简洁</li><li><strong>迭代改进</strong>：用 2-3 次真实使用来打磨内容</li></ol><h3 id="9-5-测试新技能的方法"><a href="#9-5-测试新技能的方法" class="headerlink" title="9.5 测试新技能的方法"></a>9.5 测试新技能的方法</h3><p>装完后用实际场景测试：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 场景 1：自然语言触发</span></span><br><span class="line"><span class="string">&quot;帮我审查一下最近的代码变更&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 场景 2：斜杠命令触发</span></span><br><span class="line">/code-review</span><br><span class="line"></span><br><span class="line"><span class="comment"># 场景 3：修改后重载</span></span><br><span class="line"><span class="comment"># 修改 SKILL.md 后保存，新会话自动生效</span></span><br><span class="line"><span class="comment"># 当前会话可以用 /plugin disable 再 /plugin enable 重载</span></span><br></pre></td></tr></table></figure><hr><h2 id="十、常见问题"><a href="#十、常见问题" class="headerlink" title="十、常见问题"></a>十、常见问题</h2><h3 id="Q1：Skills-和-CLAUDE-md-有什么区别？"><a href="#Q1：Skills-和-CLAUDE-md-有什么区别？" class="headerlink" title="Q1：Skills 和 CLAUDE.md 有什么区别？"></a>Q1：Skills 和 CLAUDE.md 有什么区别？</h3><p>CLAUDE.md 是<strong>项目的背景知识</strong>（技术栈、架构、命名约定），Skills 是<strong>可执行的工作流程</strong>（怎么做某事）。两者互补。</p><h3 id="Q2：装太多技能会影响性能吗？"><a href="#Q2：装太多技能会影响性能吗？" class="headerlink" title="Q2：装太多技能会影响性能吗？"></a>Q2：装太多技能会影响性能吗？</h3><p><strong>不会</strong>。Claude 仅在启动时加载技能的 <code>name</code> 和 <code>description</code>（约 100 tokens/技能），完整内容只有在触发时才加载。装 50-100 个技能对性能影响微乎其微。</p><h3 id="Q3：技能文件写得不好，Claude-会跳过吗？"><a href="#Q3：技能文件写得不好，Claude-会跳过吗？" class="headerlink" title="Q3：技能文件写得不好，Claude 会跳过吗？"></a>Q3：技能文件写得不好，Claude 会跳过吗？</h3><p>会。如果技能指令模糊或前后矛盾，Claude 可能部分忽略或执行不到位。建议参考社区优秀技能（如 Superpowers）的写法。</p><h3 id="Q4：如何共享我写的技能？"><a href="#Q4：如何共享我写的技能？" class="headerlink" title="Q4：如何共享我写的技能？"></a>Q4：如何共享我写的技能？</h3><ul><li>上传到 GitHub 仓库</li><li>分享给他人直接复制到 <code>~/.claude/skills/</code></li><li>打包为 Plugin 发布到社区市场</li></ul><h3 id="Q5：技能可以在不同-AI-工具间通用吗？"><a href="#Q5：技能可以在不同-AI-工具间通用吗？" class="headerlink" title="Q5：技能可以在不同 AI 工具间通用吗？"></a>Q5：技能可以在不同 AI 工具间通用吗？</h3><p>可以！SKILL.md 是<strong>开放标准</strong>（Agent Skills open standard），兼容 Claude Code、Codex CLI、Cursor、OpenCode、Gemini CLI 等 30+ 工具。</p><h3 id="Q6：技能的执行顺序可以控制吗？"><a href="#Q6：技能的执行顺序可以控制吗？" class="headerlink" title="Q6：技能的执行顺序可以控制吗？"></a>Q6：技能的执行顺序可以控制吗？</h3><p>不能直接控制顺序，但可以通过以下方式实现：</p><ul><li>在技能指令中引用其他技能的名称</li><li>使用 <code>context: fork</code> 让子代理串行执行</li><li>用钩子触发后续操作</li></ul><hr><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>Claude Code 的技能系统是 <strong>2026 年 AI 编程领域最重要的进化之一</strong>。它的核心价值不在于安装了多少社区技能，而在于：</p><ol><li><strong>将最佳实践固化</strong>——不再依赖”记住要这样做”，而是让 AI 自动执行</li><li><strong>定制化工作流</strong>——团队规范、个人习惯、项目约束都可以编码为技能</li><li><strong>开放生态</strong>——SKILL.md 标准让技能跨平台通用</li></ol><p><strong>入门三步走：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 第一步：熟悉内置命令</span></span><br><span class="line">/review &amp;&amp; /plan &amp;&amp; /compact</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第二步：安装核心社区技能</span></span><br><span class="line">/plugin marketplace add obra/superpowers</span><br><span class="line">/plugin install superpowers</span><br><span class="line"></span><br><span class="line"><span class="comment"># 第三步：为自己写第一个自定义技能</span></span><br><span class="line">mkdir -p ~/.claude/skills/my-first-skill</span><br><span class="line">vim ~/.claude/skills/my-first-skill/SKILL.md</span><br></pre></td></tr></table></figure><p>从今天开始，每次你发现 Claude “总是做错”某件事时，与其手动纠正，不如花 15 分钟写一个技能——它在未来会为你省下无数个 15 分钟。</p><hr><p><em>本文首发于 <a href="https://geniux.top/">CaoZH 的笔记</a></em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Claude-Code-Skills-使用教程——从入门到进阶&quot;&gt;&lt;a href=&quot;#Claude-Code-Skills-使用教程——从入门到进阶&quot; class=&quot;headerlink&quot; title=&quot;Claude Code Skills 使用教程——从入门到进</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="agent" scheme="https://www.geniux.top/tags/agent/"/>
    
    <category term="claude" scheme="https://www.geniux.top/tags/claude/"/>
    
    <category term="skills" scheme="https://www.geniux.top/tags/skills/"/>
    
    <category term="tutorial" scheme="https://www.geniux.top/tags/tutorial/"/>
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>Claude Code 最推荐的 10 个技能</title>
    <link href="https://www.geniux.top/article/1575d0b9037d/"/>
    <id>https://www.geniux.top/article/1575d0b9037d/</id>
    <published>2026-05-31T02:00:00.000Z</published>
    <updated>2026-06-01T03:01:03.328Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Claude-Code-最推荐的-10-个技能（2026-版）"><a href="#Claude-Code-最推荐的-10-个技能（2026-版）" class="headerlink" title="Claude Code 最推荐的 10 个技能（2026 版）"></a>Claude Code 最推荐的 10 个技能（2026 版）</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>版本：</strong> 2026-05-31<br><strong>适用平台：</strong> Claude Code CLI / Claude Desktop</p></blockquote><hr><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>如果说 2025 年是 AI 编程助手的「觉醒之年」，那么 2026 年就是「技能爆发之年」。Claude Code 的技能（Skills）系统自 Anthropic 开放以来，生态呈爆炸式增长——仅 SkillsMP 平台就收录了超过 120 万个技能，GitHub 上的 <code>awesome-claude-skills</code> 仓库每天都有新面孔加入。</p><p>但数量多不等于质量好。本文筛选出 <strong>社区公认、经过生产验证</strong> 的 10 个 Claude Code 技能，覆盖从规划到测试、从安全到部署的全流程。无论你是刚接触 Claude Code 的新手，还是已经深度使用的老手，这份清单都能帮你提升 AI 编程效率。</p><h3 id="如何安装技能？"><a href="#如何安装技能？" class="headerlink" title="如何安装技能？"></a>如何安装技能？</h3><p>在 Claude Code 终端中运行以下命令即可安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 从 marketplace 安装</span></span><br><span class="line">/plugin marketplace add &lt;作者/仓库&gt;</span><br><span class="line">/plugin install &lt;技能名称&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或直接添加技能源</span></span><br><span class="line">/plugin add &lt;作者/仓库&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看已安装技能</span></span><br><span class="line">/plugin list</span><br></pre></td></tr></table></figure><hr><h2 id="1-🦸-Superpowers（超能力）"><a href="#1-🦸-Superpowers（超能力）" class="headerlink" title="1. 🦸 Superpowers（超能力）"></a>1. 🦸 Superpowers（超能力）</h2><p><strong>作者：</strong> obra<br><strong>安装量：</strong> 124K+ stars（GitHub）<br><strong>仓库：</strong> <code>obra/superpowers</code></p><p>如果只能推荐一个技能，一定是 <strong>Superpowers</strong>。这是目前最流行的 Claude Code 技能框架，内含 20+ 生产级子技能，把「先规划再写代码」的工作流固化成了一套系统。</p><h3 id="核心子技能"><a href="#核心子技能" class="headerlink" title="核心子技能"></a>核心子技能</h3><table><thead><tr><th>子技能</th><th>作用</th></tr></thead><tbody><tr><td><code>/superpowers:brainstorm</code></td><td>头脑风暴，输出结构化设计文档</td></tr><tr><td><code>/superpowers:write-plan</code></td><td>将设计文档拆解为可执行任务计划</td></tr><tr><td><code>/superpowers:execute-plan</code></td><td>使用子代理并行执行任务</td></tr><tr><td>TDD</td><td>强制 RED-GREEN-REFACTOR 流程</td></tr><tr><td>Debugging</td><td>系统化根因分析，3次失败触发架构审查</td></tr><tr><td>Code Review</td><td>自动代码审查与质量把关</td></tr></tbody></table><h3 id="为什么推荐？"><a href="#为什么推荐？" class="headerlink" title="为什么推荐？"></a>为什么推荐？</h3><p>Superpowers 最大的价值在于 <strong>行为约束</strong>。没有它时，Claude 可能会直接开写代码——跳过设计、跳过测试、直接跳到实现。有了 Superpowers，Claude 会先问清楚需求、写设计文档、拆任务、写测试、再实现。一个完整的脑暴→规划→执行流程下来，代码质量有质的飞跃。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装</span></span><br><span class="line">/plugin marketplace add obra/superpowers</span><br><span class="line">/plugin install superpowers</span><br></pre></td></tr></table></figure><hr><h2 id="2-🧪-Test-Driven-Development（测试驱动开发）"><a href="#2-🧪-Test-Driven-Development（测试驱动开发）" class="headerlink" title="2. 🧪 Test-Driven Development（测试驱动开发）"></a>2. 🧪 Test-Driven Development（测试驱动开发）</h2><p><strong>作者：</strong> Community（Anthropic 官方推荐）<br><strong>安装量：</strong> 87K+</p><p>TDD 单独拿出来说，是因为它在社区中的认可度极高。这个技能强制 Claude 遵循严格的红-绿-重构流程：</p><ol><li><strong>RED</strong>：先写一个会失败的测试</li><li><strong>GREEN</strong>：写出让测试通过的最简实现</li><li><strong>REFACTOR</strong>：在测试保护下重构代码</li></ol><p>没有这个技能时，Claude 默认会「先写代码、后补测试」——甚至可能完全不写测试。TDD 技能从根本上改变了这个行为模式。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add anthropics/skills</span><br><span class="line">/plugin install test-driven-development</span><br></pre></td></tr></table></figure><hr><h2 id="3-📋-Spec-Driven-Development（规格驱动开发）"><a href="#3-📋-Spec-Driven-Development（规格驱动开发）" class="headerlink" title="3. 📋 Spec-Driven Development（规格驱动开发）"></a>3. 📋 Spec-Driven Development（规格驱动开发）</h2><p><strong>作者：</strong> Community<br><strong>仓库：</strong> 含于 <code>addyosmani/agent-skills</code></p><p>「写代码之前先写规格说明」——这是资深工程师的直觉，但 Claude 不会自动这样做。Spec-Driven Development 技能要求 Claude 在动手前先撰写一份完整的规格文档（<code>SPEC.md</code>），涵盖：</p><ul><li><strong>功能描述</strong>：要做什么，不做什么</li><li><strong>技术方案</strong>：架构选型、数据流、组件树</li><li><strong>约束条件</strong>：性能、安全、兼容性要求</li><li><strong>验收标准</strong>：如何判断做完了</li></ul><p>规格文档由用户审核通过后，才进入开发阶段。这听起来多了一步，但对于中大型功能来说，<strong>节省的重构时间远超写规格的时间</strong>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add addyosmani/agent-skills</span><br><span class="line">/plugin install spec-driven-development</span><br></pre></td></tr></table></figure><hr><h2 id="4-🔍-Systematic-Debugging（系统化调试）"><a href="#4-🔍-Systematic-Debugging（系统化调试）" class="headerlink" title="4. 🔍 Systematic Debugging（系统化调试）"></a>4. 🔍 Systematic Debugging（系统化调试）</h2><p><strong>作者：</strong> Community<br><strong>包含于：</strong> Superpowers 和 addyosmani/agent-skills</p><p>Claude 默认的调试行为是「猜错→改→再猜」的循环，效率极低。Systematic Debugging 技能将它改造成 4 阶段流程：</p><table><thead><tr><th>阶段</th><th>做什么</th></tr></thead><tbody><tr><td>1. 理解 Bug</td><td>复现 → 缩小范围 → 确定触发条件</td></tr><tr><td>2. 根因分析</td><td>检查相关代码 → 分析数据流 → 提出假设</td></tr><tr><td>3. 验证假设</td><td>用最小测试验证根因</td></tr><tr><td>4. 修复</td><td>实现修复 → 确认修复 → 防止回归</td></tr></tbody></table><p><strong>关键特性</strong>：如果连续 3 次修复尝试都失败，技能会触发「架构审查」——Claude 会意识到问题可能不在这一层，而是需要重新审视整体架构设计。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 此技能已包含在 superpowers 中</span></span><br><span class="line"><span class="comment"># 单独安装：</span></span><br><span class="line">/plugin install debugging-and-error-recovery</span><br></pre></td></tr></table></figure><hr><h2 id="5-👁️-Code-Review-amp-Quality（代码审查与质量）"><a href="#5-👁️-Code-Review-amp-Quality（代码审查与质量）" class="headerlink" title="5. 👁️ Code Review &amp; Quality（代码审查与质量）"></a>5. 👁️ Code Review &amp; Quality（代码审查与质量）</h2><p><strong>作者：</strong> Addy Osmani（Google Chrome 前工程师 / 现 Anthropic）<br><strong>仓库：</strong> <code>addyosmani/agent-skills</code></p><p>Addy Osmani 将 Google 级别的工程文化编码成了 19 个技能，其中代码审查技能最为亮眼。它采用 <strong>五维审查模型</strong>：</p><ol><li><strong>正确性</strong>：逻辑是否有漏洞？边界情况是否覆盖？</li><li><strong>可维护性</strong>：是否遵循单一职责？命名是否清晰？圈复杂度是否合理？</li><li><strong>安全性</strong>：是否存在 OWASP Top 10 漏洞？（SQL 注入、XSS、CSRF 等）</li><li><strong>性能</strong>：是否有不必要的计算、内存泄漏、N+1 查询？</li><li><strong>可测试性</strong>：是否有利于单元测试？依赖是否可注入？</li></ol><p>每次代码审查后，Claude 会输出一个 <strong>Change Size 评估</strong>（约 ±100 行的小变更还是 500+ 行的大变更），并据此调整审查深度。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add addyosmani/agent-skills</span><br><span class="line">/plugin install code-review-and-quality</span><br></pre></td></tr></table></figure><hr><h2 id="6-🛡️-Security-Hardening（安全加固）"><a href="#6-🛡️-Security-Hardening（安全加固）" class="headerlink" title="6. 🛡️ Security Hardening（安全加固）"></a>6. 🛡️ Security Hardening（安全加固）</h2><p><strong>作者：</strong> Addy Osmani<br><strong>仓库：</strong> <code>addyosmani/agent-skills</code></p><p>安全是一个「平时觉得没必要，出事才后悔」的领域。Security Hardening 技能让 Claude 每次提交代码前自动检查：</p><ul><li><strong>OWASP Top 10</strong> 预防：注入攻击、身份验证缺陷、敏感数据泄露等</li><li><strong>密钥管理</strong>：检查代码中是否硬编码了 API Key、密码、Token</li><li><strong>依赖安全</strong>：扫描 package.json / requirements.txt 中的已知漏洞</li><li><strong>输入验证</strong>：用户输入是否经过消毒？</li><li><strong>权限模型</strong>：最小权限原则是否落实？</li></ul><p>更棒的是，这个技能会生成一个 <code>SECURITY.md</code> 文件跟踪发现的问题和修复进度。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add addyosmani/agent-skills</span><br><span class="line">/plugin install security-and-hardening</span><br></pre></td></tr></table></figure><hr><h2 id="7-🌐-Web-App-Testing（Web-应用测试）"><a href="#7-🌐-Web-App-Testing（Web-应用测试）" class="headerlink" title="7. 🌐 Web App Testing（Web 应用测试）"></a>7. 🌐 Web App Testing（Web 应用测试）</h2><p><strong>作者：</strong> Anthropic（官方）<br><strong>仓库：</strong> <code>anthropics/skills</code></p><p>这是 Anthropic 官方发布的技能之一，让你可以在 Claude Code 内<strong>直接用 Playwright 浏览器测试本地 Web 应用</strong>。</p><h3 id="能力"><a href="#能力" class="headerlink" title="能力"></a>能力</h3><ul><li>启动本地开发服务器</li><li>用 Playwright 打开浏览器导航到页面</li><li>模拟用户交互（点击、输入、滚动、导航）</li><li>截图并对比预期效果</li><li>检查控制台错误、网络请求、DOM 状态</li></ul><h3 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</h3><ul><li>前端组件渲染是否正确？</li><li>表单提交和验证是否工作？</li><li>响应式布局在不同视口下是否正常？</li><li>用户流程（注册→登录→使用功能）是否完整？</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add anthropics/skills</span><br><span class="line">/plugin install webapp-testing</span><br></pre></td></tr></table></figure><hr><h2 id="8-🔥-Firecrawl-Build（网页抓取与搜索）"><a href="#8-🔥-Firecrawl-Build（网页抓取与搜索）" class="headerlink" title="8. 🔥 Firecrawl Build（网页抓取与搜索）"></a>8. 🔥 Firecrawl Build（网页抓取与搜索）</h2><p><strong>作者：</strong> Firecrawl Team<br><strong>仓库：</strong> <code>firecrawl/firecrawl-build</code></p><p>如果你想给 Claude 加上「上网能力」，Firecrawl 是最佳选择。这个技能让 Claude 可以：</p><ul><li><strong>网页抓取</strong>：输入 URL，获取结构化 Markdown 内容</li><li><strong>网页搜索</strong>：基于关键词搜索并整理结果</li><li><strong>网站爬取</strong>：递归抓取整个网站的页面</li><li><strong>内容提取</strong>：从复杂页面中提取特定数据（表格、列表、文章等）</li></ul><p>对于需要 Claude 帮你做竞品分析、文档整理、数据采集的场景，这个技能是神器。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add firecrawl/firecrawl-claude-plugin</span><br><span class="line">/plugin install firecrawl-build</span><br></pre></td></tr></table></figure><hr><h2 id="9-🔗-Composio-Connect（1000-应用集成）"><a href="#9-🔗-Composio-Connect（1000-应用集成）" class="headerlink" title="9. 🔗 Composio Connect（1000+ 应用集成）"></a>9. 🔗 Composio Connect（1000+ 应用集成）</h2><p><strong>作者：</strong> Composio<br><strong>仓库：</strong> <code>composiohq/composio</code></p><p>Composio 是 Claude Code 的「万能连接器」，支持接入 <strong>1000+ 外部应用和服务</strong>：</p><ul><li><strong>开发工具</strong>：GitHub、GitLab、Jira、Linear、Notion</li><li><strong>通讯工具</strong>：Gmail、Slack、Discord、Telegram</li><li><strong>云服务</strong>：AWS、GCP、Azure、Cloudflare</li><li><strong>数据库</strong>：PostgreSQL、MySQL、MongoDB、Redis</li><li><strong>AI 服务</strong>：OpenAI、Anthropic、HuggingFace</li></ul><p>有了 Composio，Claude 不再只是一个「写代码的」——它可以读取你的 Jira 工单、查看 Slack 消息、管理 GitHub Issue、操作数据库，真正成为开发工作流的中心节点。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add composiohq/composio</span><br><span class="line">/plugin install composio-connect</span><br></pre></td></tr></table></figure><hr><h2 id="10-🎨-Frontend-Design（前端设计）"><a href="#10-🎨-Frontend-Design（前端设计）" class="headerlink" title="10. 🎨 Frontend Design（前端设计）"></a>10. 🎨 Frontend Design（前端设计）</h2><p><strong>作者：</strong> Anthropic（官方）<br><strong>仓库：</strong> <code>anthropics/skills</code></p><p>如果你让 Claude 写前端，这个技能是必装的。没有它，Claude 可能用 2022 年的设计风格给你生成页面。有了它，Claude 会：</p><ul><li>参照 <strong>Linear、Stripe、Vercel、Notion</strong> 等现代设计系统的风格</li><li>使用合理的间距、排版、色彩系统</li><li>遵循 <strong>Figma 级的设计规范</strong>（8px 网格、可访问对比度、响应式断点）</li><li>生成 <strong>深色模式 / 浅色模式</strong> 两套方案</li><li>添加合理的动画和过渡效果（而不是生硬的闪现）</li></ul><p>对于独立开发者和小团队来说，这个技能相当于请了一个前端设计师。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/plugin marketplace add anthropics/skills</span><br><span class="line">/plugin install frontend-design</span><br></pre></td></tr></table></figure><hr><h2 id="🏆-最终推荐组合"><a href="#🏆-最终推荐组合" class="headerlink" title="🏆 最终推荐组合"></a>🏆 最终推荐组合</h2><p>不是每个项目都需要装全部 10 个技能。根据项目类型推荐以下组合：</p><h3 id="🚀-新项目起步"><a href="#🚀-新项目起步" class="headerlink" title="🚀 新项目起步"></a>🚀 新项目起步</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Superpowers + Frontend Design + TDD + Firecrawl</span><br></pre></td></tr></table></figure><h3 id="🛠️-现有项目维护"><a href="#🛠️-现有项目维护" class="headerlink" title="🛠️ 现有项目维护"></a>🛠️ 现有项目维护</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Systematic Debugging + Code Review &amp; Quality + Security Hardening + Web App Testing</span><br></pre></td></tr></table></figure><h3 id="🤖-AI-Agent-开发"><a href="#🤖-AI-Agent-开发" class="headerlink" title="🤖 AI Agent 开发"></a>🤖 AI Agent 开发</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Composio Connect + Superpowers + Spec-Driven Development + Code Review &amp; Quality</span><br></pre></td></tr></table></figure><h3 id="🎯-全栈开发"><a href="#🎯-全栈开发" class="headerlink" title="🎯 全栈开发"></a>🎯 全栈开发</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Superpowers + TDD + Frontend Design + Firecrawl + Web App Testing + Composio Connect</span><br></pre></td></tr></table></figure><hr><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>Claude Code 的技能系统是 2026 年 AI 编程领域最重要的进化之一。它把「好的编程习惯」从抽象的原则变成了可执行的、自动触发的工作流。</p><p>上面这份清单是我综合了 Reddit、GitHub、多个技术博客和社区推荐后整理出来的。当然，最好的技能可能不是列在这里的任何一个——而是 <strong>你自己写的那个</strong>。当你发现 Claude 反复犯同一个错误、或者在某个场景下总是不够好，不妨花 15 分钟写一个自己的 <code>SKILL.md</code>，那才是最能提升你个人效率的技能。</p><p>如果你有发现其他好用的 Claude Code 技能，欢迎在评论区分享！</p><hr><p><em>本文首发于 <a href="https://geniux.top/">CaoZH 的笔记</a></em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Claude-Code-最推荐的-10-个技能（2026-版）&quot;&gt;&lt;a href=&quot;#Claude-Code-最推荐的-10-个技能（2026-版）&quot; class=&quot;headerlink&quot; title=&quot;Claude Code 最推荐的 10 个技能（2026 版</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="agent" scheme="https://www.geniux.top/tags/agent/"/>
    
    <category term="claude" scheme="https://www.geniux.top/tags/claude/"/>
    
    <category term="skills" scheme="https://www.geniux.top/tags/skills/"/>
    
    <category term="工具推荐" scheme="https://www.geniux.top/tags/%E5%B7%A5%E5%85%B7%E6%8E%A8%E8%8D%90/"/>
    
  </entry>
  
  <entry>
    <title>Hermes Agent 从零开始使用指南</title>
    <link href="https://www.geniux.top/article/486a1f96a050/"/>
    <id>https://www.geniux.top/article/486a1f96a050/</id>
    <published>2026-05-28T16:00:00.000Z</published>
    <updated>2026-05-29T06:59:51.591Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Hermes-Agent-从零开始使用指南"><a href="#Hermes-Agent-从零开始使用指南" class="headerlink" title="Hermes Agent 从零开始使用指南"></a>Hermes Agent 从零开始使用指南</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>版本：</strong> 2026-05-29<br><strong>适用平台：</strong> Linux / macOS / WSL2</p></blockquote><hr><h2 id="一、什么是-Hermes-Agent？"><a href="#一、什么是-Hermes-Agent？" class="headerlink" title="一、什么是 Hermes Agent？"></a>一、什么是 Hermes Agent？</h2><p><strong>Hermes Agent</strong> 是由 Nous Research 开发的开源 AI 智能体框架。它不仅仅是一个聊天机器人，而是一个能够<strong>自主执行任务</strong>的 AI 助手——可以在终端执行命令、编写代码、管理文件、搜索网页、发送消息，并且能记住你和它的每次对话。</p><h3 id="与其他-AI-工具的区别"><a href="#与其他-AI-工具的区别" class="headerlink" title="与其他 AI 工具的区别"></a>与其他 AI 工具的区别</h3><table><thead><tr><th>对比</th><th>Hermes Agent</th><th>Claude Code</th><th>ChatGPT</th></tr></thead><tbody><tr><td>开源</td><td>✅ 完全开源</td><td>❌ 闭源</td><td>❌ 闭源</td></tr><tr><td>本地运行</td><td>✅ 可在自己服务器运行</td><td>❌ 云端</td><td>❌ 云端</td></tr><tr><td>多平台接入</td><td>✅ Telegram/Discord/QQ等10+平台</td><td>❌ 仅终端</td><td>✅ Web/App</td></tr><tr><td>技能记忆</td><td>✅ 自动学习、跨会话积累</td><td>❌ 有限</td><td>❌ 有限</td></tr><tr><td>模型自由</td><td>✅ 支持20+提供商,可随时切换</td><td>❌ 仅Claude</td><td>❌ 仅GPT系列</td></tr><tr><td>定时任务</td><td>✅ 支持 cron 调度</td><td>❌ 不支持</td><td>❌ 不支持</td></tr></tbody></table><h3 id="核心特性"><a href="#核心特性" class="headerlink" title="核心特性"></a>核心特性</h3><ul><li><strong>🛠️ 自主工具调用</strong> — 读文件、写代码、搜索网页、执行命令</li><li><strong>🧠 持久记忆</strong> — 跨会话记住你的偏好和项目上下文</li><li><strong>💡 技能系统</strong> — 从经验中学习，自动积累可复用的工作流</li><li><strong>🌐 多平台网关</strong> — 同一智能体同时运行在 QQ、Telegram、Discord 等平台</li><li><strong>🎛️ 模型无关</strong> — 随时切换 GPT、Claude、DeepSeek 等模型</li><li><strong>📅 定时任务</strong> — 像 cron 一样自动执行任务</li><li><strong>📦 MCP 协议</strong> — 支持 Model Context Protocol 扩展</li><li><strong>👤 多配置文件</strong> — 工作/个人分不同的配置文件</li></ul><span id="more"></span><hr><h2 id="二、环境要求"><a href="#二、环境要求" class="headerlink" title="二、环境要求"></a>二、环境要求</h2><h3 id="系统要求"><a href="#系统要求" class="headerlink" title="系统要求"></a>系统要求</h3><table><thead><tr><th>项目</th><th>要求</th></tr></thead><tbody><tr><td>操作系统</td><td>Ubuntu 22.04+ / macOS 13+ / WSL2</td></tr><tr><td>Python</td><td>3.11 或更高版本</td></tr><tr><td>内存</td><td>至少 512MB（建议 2GB+）</td></tr><tr><td>磁盘</td><td>至少 500MB 可用空间</td></tr><tr><td>网络</td><td>需要访问 LLM API（OpenRouter、OpenAI 等）</td></tr></tbody></table><h3 id="终端依赖"><a href="#终端依赖" class="headerlink" title="终端依赖"></a>终端依赖</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu / Debian</span></span><br><span class="line">sudo apt update &amp;&amp; sudo apt install -y curl git python3 python3-pip python3-venv</span><br><span class="line"></span><br><span class="line"><span class="comment"># macOS (需安装 Homebrew)</span></span><br><span class="line">brew install python git curl</span><br></pre></td></tr></table></figure><hr><h2 id="三、安装"><a href="#三、安装" class="headerlink" title="三、安装"></a>三、安装</h2><h3 id="3-1-一键安装"><a href="#3-1-一键安装" class="headerlink" title="3.1 一键安装"></a>3.1 一键安装</h3><p>Hermes 提供一键安装脚本，兼容 Linux 和 macOS：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash</span><br></pre></td></tr></table></figure><p>安装过程会自动：</p><ol><li>检测系统环境</li><li>创建 Python 虚拟环境</li><li>安装 Python 依赖</li><li>创建配置文件模板</li><li>添加到 PATH</li></ol><h3 id="3-2-验证安装"><a href="#3-2-验证安装" class="headerlink" title="3.2 验证安装"></a>3.2 验证安装</h3><p>安装完成后，重新加载 shell 并验证：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line">hermes doctor</span><br></pre></td></tr></table></figure><p>如果一切正常，会显示类似输出：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[✓] Python 3.12.3 found</span><br><span class="line">[✓] Config exists</span><br><span class="line">[✓] .env exists</span><br><span class="line">[✓] All required tools available</span><br></pre></td></tr></table></figure><h3 id="3-3-常用命令提示"><a href="#3-3-常用命令提示" class="headerlink" title="3.3 常用命令提示"></a>3.3 常用命令提示</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hermes           <span class="comment"># 启动交互式聊天（默认命令）</span></span><br><span class="line">hermes --<span class="built_in">help</span>    <span class="comment"># 查看所有命令</span></span><br></pre></td></tr></table></figure><h3 id="3-4-文件结构"><a href="#3-4-文件结构" class="headerlink" title="3.4 文件结构"></a>3.4 文件结构</h3><p>安装后会在 <code>~/.hermes/</code> 下创建以下目录结构：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">~/.hermes/</span><br><span class="line">├── config.yaml            # 主配置文件</span><br><span class="line">├── .env                   # API 密钥（切勿提交到 git）</span><br><span class="line">├── state.db               # 会话数据库（SQLite）</span><br><span class="line">├── skills/                # 技能目录</span><br><span class="line">├── logs/                  # 日志目录</span><br><span class="line">│   ├── agent.log</span><br><span class="line">│   ├── errors.log</span><br><span class="line">│   └── gateway.log</span><br><span class="line">├── sessions/              # 会话导出文件</span><br><span class="line">└── hermes-agent/          # 源代码（仅 git 安装方式）</span><br></pre></td></tr></table></figure><hr><h2 id="四、初始配置"><a href="#四、初始配置" class="headerlink" title="四、初始配置"></a>四、初始配置</h2><h3 id="4-1-运行设置向导"><a href="#4-1-运行设置向导" class="headerlink" title="4.1 运行设置向导"></a>4.1 运行设置向导</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes setup</span><br></pre></td></tr></table></figure><p>设置向导会带你一步步完成以下配置：</p><ol><li><strong>模型选择</strong> — 选择 LLM 提供商和模型</li><li><strong>终端设置</strong> — 配置终端后端（本地、Docker、SSH）</li><li><strong>网关设置</strong> — 配置消息平台（可选）</li><li><strong>工具设置</strong> — 启用/禁用工具集</li><li><strong>Agent 设置</strong> — 配置最大对话轮次等</li></ol><h3 id="4-2-选择模型提供商"><a href="#4-2-选择模型提供商" class="headerlink" title="4.2 选择模型提供商"></a>4.2 选择模型提供商</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes model</span><br></pre></td></tr></table></figure><p>这个交互式命令会列出所有支持的模型提供商，按类别分组。常用提供商：</p><table><thead><tr><th>提供商</th><th>API 密钥环境变量</th><th>推荐模型</th><th>费用</th></tr></thead><tbody><tr><td><strong>OpenRouter</strong></td><td><code>OPENROUTER_API_KEY</code></td><td>任意模型</td><td>按量付费</td></tr><tr><td><strong>Anthropic</strong></td><td><code>ANTHROPIC_API_KEY</code></td><td>claude-sonnet-4</td><td>按量付费</td></tr><tr><td><strong>DeepSeek</strong></td><td><code>DEEPSEEK_API_KEY</code></td><td>deepseek-chat</td><td>极低价</td></tr><tr><td><strong>Google Gemini</strong></td><td><code>GOOGLE_API_KEY</code></td><td>gemini-2.5-flash</td><td>免费额度</td></tr><tr><td><strong>OpenAI</strong></td><td><code>OPENAI_API_KEY</code></td><td>gpt-4o</td><td>按量付费</td></tr><tr><td><strong>xAI Grok</strong></td><td><code>XAI_API_KEY</code></td><td>grok-3</td><td>需订阅</td></tr></tbody></table><blockquote><p>💡 <strong>新手推荐：</strong> 先注册 OpenRouter（<a href="https://openrouter.ai),充值少量金额即可使用几乎所有主流模型,无需为每个提供商单独注册./">https://openrouter.ai），充值少量金额即可使用几乎所有主流模型，无需为每个提供商单独注册。</a></p></blockquote><h4 id="配置-API-密钥"><a href="#配置-API-密钥" class="headerlink" title="配置 API 密钥"></a>配置 API 密钥</h4><p>安装脚本已在 <code>~/.hermes/.env</code> 中创建了模板，编辑该文件填入你的密钥：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编辑 .env 文件</span></span><br><span class="line">hermes config env-path  <span class="comment"># 查看 .env 文件路径</span></span><br><span class="line">nano ~/.hermes/.env     <span class="comment"># 或用你喜欢的编辑器</span></span><br></pre></td></tr></table></figure><p>填入密钥后，保存即可生效：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">OPENROUTER_API_KEY=sk-or-...</span><br></pre></td></tr></table></figure><h3 id="4-3-验证配置"><a href="#4-3-验证配置" class="headerlink" title="4.3 验证配置"></a>4.3 验证配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hermes doctor</span><br><span class="line">hermes chat -q <span class="string">&quot;你好，请确认工作正常&quot;</span></span><br></pre></td></tr></table></figure><hr><h2 id="五、基本使用"><a href="#五、基本使用" class="headerlink" title="五、基本使用"></a>五、基本使用</h2><h3 id="5-1-交互式聊天"><a href="#5-1-交互式聊天" class="headerlink" title="5.1 交互式聊天"></a>5.1 交互式聊天</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes</span><br></pre></td></tr></table></figure><p>这是最常用的模式。启动后进入交互式终端，你可以：</p><ul><li>直接输入文字提问或下达任务</li><li>使用 <code>/</code> 开头的斜杠命令控制会话</li><li>按 <code>Ctrl+C</code> 中断当前操作</li><li>输入 <code>/quit</code> 退出</li></ul><p>示例对话：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ hermes</span><br><span class="line">━━━ Hermes Agent ━━━</span><br><span class="line">Models: openrouter/anthropic/claude-sonnet-4</span><br><span class="line"></span><br><span class="line">&gt; 帮我统计当前目录下的文件数量</span><br><span class="line">[执行 ls -la | wc -l]</span><br><span class="line">当前目录共有 42 个文件和目录。</span><br><span class="line"></span><br><span class="line">&gt; /model deepseek/deepseek-chat</span><br><span class="line">[已切换模型]</span><br></pre></td></tr></table></figure><h3 id="5-2-单次查询模式"><a href="#5-2-单次查询模式" class="headerlink" title="5.2 单次查询模式"></a>5.2 单次查询模式</h3><p>适合脚本调用或快速提问：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hermes chat -q <span class="string">&quot;Python 中如何读取 JSON 文件？&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 带模型指定</span></span><br><span class="line">hermes chat -q <span class="string">&quot;解释 Kubernetes 的 Pod 概念&quot;</span> -m deepseek/deepseek-chat</span><br></pre></td></tr></table></figure><h3 id="5-3-恢复上次会话"><a href="#5-3-恢复上次会话" class="headerlink" title="5.3 恢复上次会话"></a>5.3 恢复上次会话</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hermes --<span class="built_in">continue</span>        <span class="comment"># 恢复最近一次会话</span></span><br><span class="line">hermes --<span class="built_in">continue</span> work   <span class="comment"># 恢复名为 &quot;work&quot; 的会话</span></span><br><span class="line">hermes -r SESSION_ID     <span class="comment"># 按 ID 恢复指定会话</span></span><br></pre></td></tr></table></figure><h3 id="5-4-查看历史会话"><a href="#5-4-查看历史会话" class="headerlink" title="5.4 查看历史会话"></a>5.4 查看历史会话</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hermes sessions list     <span class="comment"># 列出近期会话</span></span><br><span class="line">hermes sessions browse   <span class="comment"># 交互式会话浏览器</span></span><br></pre></td></tr></table></figure><hr><h2 id="六、斜杠命令速查"><a href="#六、斜杠命令速查" class="headerlink" title="六、斜杠命令速查"></a>六、斜杠命令速查</h2><p>在交互式聊天中输入 <code>/</code> 开头的命令控制会话。以下是常用命令：</p><h3 id="会话控制"><a href="#会话控制" class="headerlink" title="会话控制"></a>会话控制</h3><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>/new</code> 或 <code>/reset</code></td><td>开始新会话</td></tr><tr><td><code>/retry</code></td><td>重新发送上一条消息</td></tr><tr><td><code>/undo</code></td><td>撤销上一轮对话</td></tr><tr><td><code>/title 名称</code></td><td>给会话命名</td></tr><tr><td><code>/compress</code></td><td>手动压缩上下文</td></tr><tr><td><code>/stop</code></td><td>终止后台进程</td></tr></tbody></table><h3 id="模型和配置"><a href="#模型和配置" class="headerlink" title="模型和配置"></a>模型和配置</h3><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>/model 模型名</code></td><td>切换模型</td></tr><tr><td><code>/verbose</code></td><td>切换详细输出模式</td></tr><tr><td><code>/yolo</code></td><td>跳过危险命令确认</td></tr><tr><td><code>/voice on/off</code></td><td>语音模式开关</td></tr></tbody></table><h3 id="技能和工具"><a href="#技能和工具" class="headerlink" title="技能和工具"></a>技能和工具</h3><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>/skills</code></td><td>搜索和安装技能</td></tr><tr><td><code>/skill 名称</code></td><td>加载技能到当前会话</td></tr><tr><td><code>/tools</code></td><td>管理工具（CLI 模式）</td></tr><tr><td><code>/reload</code></td><td>重新加载环境变量</td></tr></tbody></table><h3 id="信息查询"><a href="#信息查询" class="headerlink" title="信息查询"></a>信息查询</h3><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>/help</code></td><td>查看所有命令</td></tr><tr><td><code>/usage</code></td><td>查看 Token 用量</td></tr><tr><td><code>/status</code></td><td>会话状态信息</td></tr><tr><td><code>/profile</code></td><td>当前配置文件信息</td></tr></tbody></table><hr><h2 id="七、核心功能详解"><a href="#七、核心功能详解" class="headerlink" title="七、核心功能详解"></a>七、核心功能详解</h2><h3 id="7-1-🛠️-工具系统"><a href="#7-1-🛠️-工具系统" class="headerlink" title="7.1 🛠️ 工具系统"></a>7.1 🛠️ 工具系统</h3><p>Hermes 可以调用各种工具来完成任务。每个工具集可以单独启用或禁用。</p><p><strong>查看可用工具：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes tools list</span><br></pre></td></tr></table></figure><p><strong>常用工具集：</strong></p><table><thead><tr><th>工具集</th><th>作用</th></tr></thead><tbody><tr><td><code>web</code></td><td>网页搜索和内容提取</td></tr><tr><td><code>terminal</code></td><td>执行 Shell 命令</td></tr><tr><td><code>file</code></td><td>读、写、编辑文件</td></tr><tr><td><code>vision</code></td><td>图片分析和识别</td></tr><tr><td><code>memory</code></td><td>跨会话记忆存储</td></tr><tr><td><code>session_search</code></td><td>搜索历史对话</td></tr><tr><td><code>delegation</code></td><td>任务委派给子代理</td></tr><tr><td><code>cronjob</code></td><td>定时任务管理</td></tr><tr><td><code>browser</code></td><td>浏览器自动化</td></tr></tbody></table><p><strong>启用/禁用工具：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hermes tools           <span class="comment"># 交互式管理界面</span></span><br><span class="line">hermes tools <span class="built_in">enable</span> web    <span class="comment"># 启用网页工具</span></span><br><span class="line">hermes tools <span class="built_in">disable</span> terminal  <span class="comment"># 禁用终端工具</span></span><br></pre></td></tr></table></figure><blockquote><p>⚠️ 工具变更需要新会话才能生效：输入 <code>/reset</code> 或重新启动 Hermes。</p></blockquote><h3 id="7-2-🧠-记忆系统"><a href="#7-2-🧠-记忆系统" class="headerlink" title="7.2 🧠 记忆系统"></a>7.2 🧠 记忆系统</h3><p>记忆是 Hermes 区别于普通聊天机器人的核心功能。它能在<strong>跨会话之间</strong>记住关于你的信息。</p><p><strong>工作原理：</strong></p><ul><li><strong>用户档案（User Profile）</strong> — 记录你是谁、你的偏好、习惯</li><li><strong>环境记忆（Memory）</strong> — 记录项目结构、环境配置、使用技巧</li></ul><p><strong>查看和管理记忆：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看记忆状态</span></span><br><span class="line">hermes memory status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 记忆在对话中会自动保存</span></span><br><span class="line"><span class="comment"># 当你告诉 Hermes &quot;记住这个&quot; 或主动纠正它时</span></span><br></pre></td></tr></table></figure><p><strong>记忆的保存原则：</strong></p><ul><li>✅ 用户偏好、环境事实、项目约定</li><li>✅ API 用法、工具技巧、常见错误</li><li>❌ 临时任务状态、已完成的日志</li><li>❌ 会话中已解决的问题细节</li></ul><h3 id="7-3-💡-技能系统"><a href="#7-3-💡-技能系统" class="headerlink" title="7.3 💡 技能系统"></a>7.3 💡 技能系统</h3><p>技能是 Hermes 的<strong>程序性记忆</strong>——记录特定任务的完整工作流。</p><p><strong>技能解决什么问题：</strong></p><p>当你让 Hermes 完成一个复杂的任务（例如部署博客、设置 CI/CD），它会记录下成功的步骤。下次遇到相同类型的任务，它可以直接加载之前的经验，不需要从头摸索。</p><p><strong>管理技能：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hermes skills list               <span class="comment"># 查看已安装技能</span></span><br><span class="line">hermes skills browse             <span class="comment"># 浏览在线技能库</span></span><br><span class="line">hermes skills search <span class="string">&quot;hexo&quot;</span>      <span class="comment"># 搜索技能</span></span><br><span class="line">hermes skills install 技能ID      <span class="comment"># 安装技能</span></span><br></pre></td></tr></table></figure><p><strong>在对话中使用技能：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&gt; /skill hexo-blog-workflow</span><br><span class="line">[已加载技能 hexo-blog-workflow]</span><br><span class="line"></span><br><span class="line">&gt; 帮我发布一篇新博客文章</span><br><span class="line">[使用技能中的工作流开始操作]</span><br></pre></td></tr></table></figure><blockquote><p>💡 <strong>最佳实践：</strong> 让 Hermes 帮你解决一个复杂问题后，可以问它”要不要把这个过程保存为技能”，方便以后重复使用。</p></blockquote><h3 id="7-4-🎯-任务委派"><a href="#7-4-🎯-任务委派" class="headerlink" title="7.4 🎯 任务委派"></a>7.4 🎯 任务委派</h3><p>Hermes 可以将子任务委派给独立的子代理并行执行，每个子代理有自己的对话环境和工具。</p><p><strong>使用场景：</strong></p><ul><li>同时调研多个技术方案</li><li>并行修复多个 Bug</li><li>独立编写多个模块的代码</li></ul><p><strong>委派方式：</strong></p><p>在对话中直接描述需要并行完成的任务即可，Hermes 会自动判断是否需要委派。例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&gt; 同时做三件事：</span><br><span class="line">&gt; 1. 调研 Vue 3 和 React 的优缺点</span><br><span class="line">&gt; 2. 检查当前项目的 package.json 依赖版本</span><br><span class="line">&gt; 3. 在 README.md 中添加安装说明</span><br></pre></td></tr></table></figure><h3 id="7-5-📅-定时任务（Cron）"><a href="#7-5-📅-定时任务（Cron）" class="headerlink" title="7.5 📅 定时任务（Cron）"></a>7.5 📅 定时任务（Cron）</h3><p>Hermes 可以定时执行任务，就像 Linux 的 cron 一样。</p><p><strong>常用定时任务命令：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建定时任务</span></span><br><span class="line">hermes cron create <span class="string">&quot;每天上午9点查看服务器状态&quot;</span> --schedule <span class="string">&quot;0 9 * * *&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 每30分钟检查一次</span></span><br><span class="line">hermes cron create <span class="string">&quot;每30分钟&quot;</span> --schedule <span class="string">&quot;30m&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出所有任务</span></span><br><span class="line">hermes cron list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 暂停/恢复</span></span><br><span class="line">hermes cron pause 任务ID</span><br><span class="line">hermes cron resume 任务ID</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除任务</span></span><br><span class="line">hermes cron remove 任务ID</span><br></pre></td></tr></table></figure><blockquote><p>💡 定时任务会在后台运行，完成后主动向你汇报结果。</p></blockquote><h3 id="7-6-🔌-MCP（Model-Context-Protocol）"><a href="#7-6-🔌-MCP（Model-Context-Protocol）" class="headerlink" title="7.6 🔌 MCP（Model Context Protocol）"></a>7.6 🔌 MCP（Model Context Protocol）</h3><p>Hermes 支持 MCP 协议，可以连接外部 MCP 服务器扩展能力。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加 MCP 服务器</span></span><br><span class="line">hermes mcp add my-server --<span class="built_in">command</span> <span class="string">&quot;python mcp-server.py&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出已配置的服务器</span></span><br><span class="line">hermes mcp list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试连接</span></span><br><span class="line">hermes mcp <span class="built_in">test</span> my-server</span><br></pre></td></tr></table></figure><hr><h2 id="八、多平台网关"><a href="#八、多平台网关" class="headerlink" title="八、多平台网关"></a>八、多平台网关</h2><h3 id="8-1-什么是网关"><a href="#8-1-什么是网关" class="headerlink" title="8.1 什么是网关"></a>8.1 什么是网关</h3><p>网关是 Hermes 连接到消息平台（QQ、Telegram、Discord 等）的桥梁。配置后，你可以通过日常使用的聊天软件与 Hermes 交互，而不仅仅是终端。</p><h3 id="8-2-支持的平台"><a href="#8-2-支持的平台" class="headerlink" title="8.2 支持的平台"></a>8.2 支持的平台</h3><table><thead><tr><th>平台</th><th>配置难度</th><th>功能</th></tr></thead><tbody><tr><td><strong>Telegram</strong></td><td>⭐ 简单</td><td>文字/图片/语音/文件</td></tr><tr><td><strong>Discord</strong></td><td>⭐ 简单</td><td>文字/图片</td></tr><tr><td><strong>QQ</strong></td><td>⭐⭐ 中等</td><td>文字/图片</td></tr><tr><td><strong>Slack</strong></td><td>⭐ 简单</td><td>文字</td></tr><tr><td><strong>WhatsApp</strong></td><td>⭐⭐ 中等</td><td>文字/图片</td></tr><tr><td><strong>Signal</strong></td><td>⭐⭐ 中等</td><td>文字</td></tr><tr><td><strong>邮件 (Email)</strong></td><td>⭐ 简单</td><td>文字</td></tr><tr><td><strong>钉钉 / 飞书</strong></td><td>⭐⭐ 中等</td><td>文字/图片</td></tr><tr><td><strong>企业微信</strong></td><td>⭐⭐ 中等</td><td>文字</td></tr></tbody></table><h3 id="8-3-配置步骤"><a href="#8-3-配置步骤" class="headerlink" title="8.3 配置步骤"></a>8.3 配置步骤</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 运行网关设置向导</span></span><br><span class="line">hermes gateway setup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 选择要配置的平台</span></span><br><span class="line"><span class="comment"># 3. 按照提示输入 Bot Token 等凭据</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 启动网关</span></span><br><span class="line">hermes gateway start</span><br><span class="line"></span><br><span class="line"><span class="comment"># 5. 查看状态</span></span><br><span class="line">hermes gateway status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 6. 查看日志排查问题</span></span><br><span class="line">cat ~/.hermes/logs/gateway.log | tail -50</span><br></pre></td></tr></table></figure><h3 id="8-4-Telegram-配置示例"><a href="#8-4-Telegram-配置示例" class="headerlink" title="8.4 Telegram 配置示例"></a>8.4 Telegram 配置示例</h3><ol><li>在 Telegram 中搜索 <code>@BotFather</code>，创建新 Bot，获取 Token</li><li>运行 <code>hermes gateway setup</code>，选择 Telegram</li><li>输入 Token，保存配置</li><li>启动网关：<code>hermes gateway start</code></li><li>在 Telegram 中向你的 Bot 发送 <code>/start</code></li></ol><blockquote><p>⚠️ <strong>重要：</strong> Telegram Bot 必须启用 <strong>Inline Mode</strong> 和 <strong>Message Content Intent</strong> 才能正常工作。</p></blockquote><hr><h2 id="九、配置文件详解"><a href="#九、配置文件详解" class="headerlink" title="九、配置文件详解"></a>九、配置文件详解</h2><h3 id="9-1-config-yaml-核心配置"><a href="#9-1-config-yaml-核心配置" class="headerlink" title="9.1 config.yaml 核心配置"></a>9.1 config.yaml 核心配置</h3><p>主配置文件位于 <code>~/.hermes/config.yaml</code>，用 YAML 格式编写。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编辑配置</span></span><br><span class="line">hermes config edit</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看配置</span></span><br><span class="line">hermes config</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置特定值</span></span><br><span class="line">hermes config <span class="built_in">set</span> model.default <span class="string">&quot;anthropic/claude-sonnet-4&quot;</span></span><br><span class="line">hermes config <span class="built_in">set</span> agent.max_turns 120</span><br></pre></td></tr></table></figure><p><strong>配置文件主要段落：</strong></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 模型配置</span></span><br><span class="line"><span class="attr">model:</span></span><br><span class="line">  <span class="attr">default:</span> <span class="string">&quot;anthropic/claude-sonnet-4&quot;</span></span><br><span class="line">  <span class="attr">provider:</span> <span class="string">&quot;openrouter&quot;</span></span><br><span class="line">  <span class="attr">base_url:</span> <span class="string">&quot;&quot;</span>  <span class="comment"># 自定义 API 地址</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 智能体行为</span></span><br><span class="line"><span class="attr">agent:</span></span><br><span class="line">  <span class="attr">max_turns:</span> <span class="number">90</span>             <span class="comment"># 最大对话轮次</span></span><br><span class="line">  <span class="attr">tool_use_enforcement:</span> <span class="literal">true</span>  <span class="comment"># 强制使用工具</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 终端</span></span><br><span class="line"><span class="attr">terminal:</span></span><br><span class="line">  <span class="attr">backend:</span> <span class="string">&quot;local&quot;</span>          <span class="comment"># local / docker / ssh</span></span><br><span class="line">  <span class="attr">timeout:</span> <span class="number">180</span>              <span class="comment"># 命令超时（秒）</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 记忆</span></span><br><span class="line"><span class="attr">memory:</span></span><br><span class="line">  <span class="attr">memory_enabled:</span> <span class="literal">true</span>      <span class="comment"># 启用记忆</span></span><br><span class="line">  <span class="attr">user_profile_enabled:</span> <span class="literal">true</span> <span class="comment"># 启用用户档案</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安全</span></span><br><span class="line"><span class="attr">security:</span></span><br><span class="line">  <span class="attr">tirith_enabled:</span> <span class="literal">true</span>      <span class="comment"># 启用安全检查</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 任务委派</span></span><br><span class="line"><span class="attr">delegation:</span></span><br><span class="line">  <span class="attr">model:</span> <span class="string">&quot;&quot;</span>                 <span class="comment"># 委派使用的模型</span></span><br><span class="line">  <span class="attr">max_iterations:</span> <span class="number">50</span>        <span class="comment"># 最大迭代次数</span></span><br></pre></td></tr></table></figure><h3 id="9-2-env-环境变量"><a href="#9-2-env-环境变量" class="headerlink" title="9.2 .env 环境变量"></a>9.2 .env 环境变量</h3><p>敏感信息（API 密钥）放在 <code>~/.hermes/.env</code>，<strong>不应提交到版本控制</strong>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"># LLM 提供商 API 密钥</span><br><span class="line">OPENROUTER_API_KEY=sk-or-...</span><br><span class="line"></span><br><span class="line"># 消息平台凭据</span><br><span class="line">TELEGRAM_BOT_TOKEN=123456:ABC...</span><br><span class="line"></span><br><span class="line"># 其他服务</span><br><span class="line">GROQ_API_KEY=gsk_...   # 语音转录</span><br></pre></td></tr></table></figure><h3 id="9-3-关键路径速查"><a href="#9-3-关键路径速查" class="headerlink" title="9.3 关键路径速查"></a>9.3 关键路径速查</h3><table><thead><tr><th>内容</th><th>路径</th></tr></thead><tbody><tr><td>主配置</td><td><code>~/.hermes/config.yaml</code></td></tr><tr><td>API 密钥</td><td><code>~/.hermes/.env</code></td></tr><tr><td>技能目录</td><td><code>~/.hermes/skills/</code></td></tr><tr><td>日志</td><td><code>~/.hermes/logs/</code></td></tr><tr><td>会话数据库</td><td><code>~/.hermes/state.db</code></td></tr><tr><td>认证凭据</td><td><code>~/.hermes/auth.json</code></td></tr><tr><td>网关服务</td><td><code>systemctl --user ... hermes-gateway</code></td></tr><tr><td>安装目录</td><td><code>~/.hermes/hermes-agent/</code></td></tr></tbody></table><hr><h2 id="十、高级功能"><a href="#十、高级功能" class="headerlink" title="十、高级功能"></a>十、高级功能</h2><h3 id="10-1-多配置文件（Profiles）"><a href="#10-1-多配置文件（Profiles）" class="headerlink" title="10.1 多配置文件（Profiles）"></a>10.1 多配置文件（Profiles）</h3><p>使用 profiles 可以运行多个完全独立的 Hermes 实例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建工作 profile</span></span><br><span class="line">hermes profile create work</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建个人 profile</span></span><br><span class="line">hermes profile create personal</span><br><span class="line"></span><br><span class="line"><span class="comment"># 以指定 profile 启动</span></span><br><span class="line">hermes --profile work</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出所有 profile</span></span><br><span class="line">hermes profile list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 切换默认 profile</span></span><br><span class="line">hermes profile use work</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除 profile</span></span><br><span class="line">hermes profile delete personal</span><br></pre></td></tr></table></figure><p>不同 profiles 拥有独立的：</p><ul><li>配置文件（<code>config.yaml</code>）</li><li>密钥（<code>.env</code>）</li><li>会话记录</li><li>技能和记忆</li><li>模型设置</li></ul><blockquote><p>💡 <strong>使用场景：</strong> 工作 profile 使用 Claude，接入公司 Slack；个人 profile 使用 DeepSeek，接入 Telegram。</p></blockquote><h3 id="10-2-工作树模式（Worktree）"><a href="#10-2-工作树模式（Worktree）" class="headerlink" title="10.2 工作树模式（Worktree）"></a>10.2 工作树模式（Worktree）</h3><p>使用 <code>-w</code> 或 <code>--worktree</code> 标志可以启动独立的 git 工作树，避免多智能体并行工作时发生 git 冲突：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes -w     <span class="comment"># 在隔离的 git worktree 中启动</span></span><br></pre></td></tr></table></figure><h3 id="10-3-技能维护（Curator）"><a href="#10-3-技能维护（Curator）" class="headerlink" title="10.3 技能维护（Curator）"></a>10.3 技能维护（Curator）</h3><p>Curator 是 Hermes 的<strong>技能自动维护系统</strong>。它会自动跟踪技能的使用情况，将长期未用的技能归档，保持技能目录整洁。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看 curator 状态</span></span><br><span class="line">hermes curator status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 手动运行一次维护</span></span><br><span class="line">hermes curator run</span><br><span class="line"></span><br><span class="line"><span class="comment"># 暂停自动维护</span></span><br><span class="line">hermes curator pause</span><br><span class="line"></span><br><span class="line"><span class="comment"># 恢复自动维护</span></span><br><span class="line">hermes curator resume</span><br></pre></td></tr></table></figure><h3 id="10-4-任务看板（Kanban）"><a href="#10-4-任务看板（Kanban）" class="headerlink" title="10.4 任务看板（Kanban）"></a>10.4 任务看板（Kanban）</h3><p>Kanban 是 Hermes 的多智能体任务协作看板，用于在多配置文件之间分配和跟踪任务。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hermes kanban init       <span class="comment"># 初始化看板</span></span><br><span class="line">hermes kanban list       <span class="comment"># 查看任务列表</span></span><br><span class="line">hermes kanban create <span class="string">&quot;任务描述&quot;</span>  <span class="comment"># 创建新任务</span></span><br></pre></td></tr></table></figure><hr><h2 id="十一、安全与隐私"><a href="#十一、安全与隐私" class="headerlink" title="十一、安全与隐私"></a>十一、安全与隐私</h2><h3 id="11-1-命令审批"><a href="#11-1-命令审批" class="headerlink" title="11.1 命令审批"></a>11.1 命令审批</h3><p>默认情况下，Hermes 在执行危险命令前会请求你的批准：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 默认模式 — 每条危险命令都询问</span></span><br><span class="line"><span class="comment"># 智能模式 — 自动批准低风险命令</span></span><br><span class="line">hermes config <span class="built_in">set</span> approvals.mode smart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 完全跳过审批（不推荐）</span></span><br><span class="line">hermes config <span class="built_in">set</span> approvals.mode off</span><br><span class="line"><span class="comment"># 或使用 --yolo 标志临时跳过</span></span><br><span class="line">hermes --yolo</span><br></pre></td></tr></table></figure><h3 id="11-2-密钥脱敏"><a href="#11-2-密钥脱敏" class="headerlink" title="11.2 密钥脱敏"></a>11.2 密钥脱敏</h3><p>启用在工具输出中自动脱敏 API 密钥和令牌：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes config <span class="built_in">set</span> security.redact_secrets <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="11-3-隐私保护"><a href="#11-3-隐私保护" class="headerlink" title="11.3 隐私保护"></a>11.3 隐私保护</h3><p>网关消息中的个人信息脱敏：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes config <span class="built_in">set</span> privacy.redact_pii <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="11-4-禁用特定工具"><a href="#11-4-禁用特定工具" class="headerlink" title="11.4 禁用特定工具"></a>11.4 禁用特定工具</h3><p>如果需要限制 Hermes 的能力范围（例如禁止访问网络），可以禁用相关工具：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hermes tools <span class="built_in">disable</span> web      <span class="comment"># 禁用网页工具</span></span><br><span class="line">hermes tools <span class="built_in">disable</span> browser  <span class="comment"># 禁用浏览器</span></span><br><span class="line">hermes tools <span class="built_in">disable</span> image_gen <span class="comment"># 禁用图片生成</span></span><br></pre></td></tr></table></figure><blockquote><p>记得输入 <code>/reset</code> 重启会话使工具变更生效。</p></blockquote><hr><h2 id="十二、常见问题"><a href="#十二、常见问题" class="headerlink" title="十二、常见问题"></a>十二、常见问题</h2><h3 id="Q1-安装后-hermes-命令找不到？"><a href="#Q1-安装后-hermes-命令找不到？" class="headerlink" title="Q1: 安装后 hermes 命令找不到？"></a>Q1: 安装后 <code>hermes</code> 命令找不到？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 重新加载 shell 配置</span></span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或手动添加到 PATH</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">&quot;<span class="variable">$HOME</span>/.hermes/hermes-agent/venv/bin:<span class="variable">$PATH</span>&quot;</span></span><br></pre></td></tr></table></figure><h3 id="Q2-模型调用报错-“Unauthorized”？"><a href="#Q2-模型调用报错-“Unauthorized”？" class="headerlink" title="Q2: 模型调用报错 “Unauthorized”？"></a>Q2: 模型调用报错 “Unauthorized”？</h3><p>检查 API 密钥是否正确设置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hermes config env-path   <span class="comment"># 确认 .env 文件路径</span></span><br><span class="line">cat ~/.hermes/.env       <span class="comment"># 检查密钥是否正确</span></span><br><span class="line">hermes auth              <span class="comment"># 重新配置认证</span></span><br></pre></td></tr></table></figure><h3 id="Q3-如何切换模型？"><a href="#Q3-如何切换模型？" class="headerlink" title="Q3: 如何切换模型？"></a>Q3: 如何切换模型？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hermes model                      <span class="comment"># 交互式选择</span></span><br><span class="line"><span class="comment"># 或在对话中直接：</span></span><br><span class="line">/model deepseek/deepseek-chat     <span class="comment"># 切换为 DeepSeek</span></span><br></pre></td></tr></table></figure><h3 id="Q4-技能和工具变更不生效？"><a href="#Q4-技能和工具变更不生效？" class="headerlink" title="Q4: 技能和工具变更不生效？"></a>Q4: 技能和工具变更不生效？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/reset          <span class="comment"># 在对话中输入 /reset 开始新会话</span></span><br><span class="line"><span class="comment"># 或退出后重新启动 hermes</span></span><br></pre></td></tr></table></figure><h3 id="Q5-网关无法启动？"><a href="#Q5-网关无法启动？" class="headerlink" title="Q5: 网关无法启动？"></a>Q5: 网关无法启动？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看日志</span></span><br><span class="line">cat ~/.hermes/logs/gateway.log | tail -50</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查依赖</span></span><br><span class="line">hermes doctor</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启网关</span></span><br><span class="line">hermes gateway restart</span><br></pre></td></tr></table></figure><h3 id="Q6-SSH-退出后网关被杀死？"><a href="#Q6-SSH-退出后网关被杀死？" class="headerlink" title="Q6: SSH 退出后网关被杀死？"></a>Q6: SSH 退出后网关被杀死？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启用 linger，防止用户服务在 SSH 断开后被终止</span></span><br><span class="line">sudo loginctl enable-linger <span class="variable">$USER</span></span><br></pre></td></tr></table></figure><h3 id="Q7-WSL2-用户注意事项？"><a href="#Q7-WSL2-用户注意事项？" class="headerlink" title="Q7: WSL2 用户注意事项？"></a>Q7: WSL2 用户注意事项？</h3><p>在 <code>/etc/wsl.conf</code> 中启用 systemd，然后重启 WSL：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[boot]</span></span><br><span class="line"><span class="attr">systemd</span>=<span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="Q8-如何更新-Hermes？"><a href="#Q8-如何更新-Hermes？" class="headerlink" title="Q8: 如何更新 Hermes？"></a>Q8: 如何更新 Hermes？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes update</span><br></pre></td></tr></table></figure><hr><h2 id="十三、完整工作流示例"><a href="#十三、完整工作流示例" class="headerlink" title="十三、完整工作流示例"></a>十三、完整工作流示例</h2><p>以下是一个完整的使用流程，从安装到完成第一个任务：</p><h3 id="场景：部署一篇博客文章"><a href="#场景：部署一篇博客文章" class="headerlink" title="场景：部署一篇博客文章"></a>场景：部署一篇博客文章</h3><p><strong>步骤 1 — 安装 Hermes</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash</span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure><p><strong>步骤 2 — 配置</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置向导</span></span><br><span class="line">hermes setup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 选择模型（如 OpenRouter + Claude）</span></span><br><span class="line">hermes model</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">hermes doctor</span><br></pre></td></tr></table></figure><p><strong>步骤 3 — 启动聊天</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes</span><br></pre></td></tr></table></figure><p><strong>步骤 4 — 下达任务</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt; 帮我写一篇关于 Hermes Agent 的博客文章，保存在 ~/blog-draft.md</span><br></pre></td></tr></table></figure><p><strong>步骤 5 — Hermes 会向你展示它的操作</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[读文件] 读取博客配置</span><br><span class="line">[写文件] 创建草稿文件 ~/blog-draft.md</span><br><span class="line">[终端] hexo generate</span><br><span class="line">[终端] rsync ... (部署到服务器)</span><br><span class="line">[终端] git add &amp;&amp; git commit &amp;&amp; git push</span><br></pre></td></tr></table></figure><p><strong>步骤 6 — 查看结果</strong></p><p>文章已经发布成功，并且代码已推送到远程仓库。</p><hr><h2 id="十四、总结"><a href="#十四、总结" class="headerlink" title="十四、总结"></a>十四、总结</h2><h3 id="适合这样的你"><a href="#适合这样的你" class="headerlink" title="适合这样的你"></a>适合这样的你</h3><ul><li><strong>开发者：</strong> 需要一个能理解代码、操作终端的 AI 助手</li><li><strong>运维人员：</strong> 需要定时执行任务、监控服务器状态</li><li><strong>内容创作者：</strong> 需要自动发布博客、管理内容</li><li><strong>效率追求者：</strong> 想把重复工作自动化</li></ul><h3 id="不适合这样的你"><a href="#不适合这样的你" class="headerlink" title="不适合这样的你"></a>不适合这样的你</h3><ul><li>❌ 只需简单问答 ➜ 直接使用 ChatGPT 网页版更简单</li><li>❌ 没有自己的服务器 ➜ 云端服务可能更适合</li><li>❌ 不习惯命令行的新手 ➜ 建议先熟悉 Linux 基础</li></ul><h3 id="下一步"><a href="#下一步" class="headerlink" title="下一步"></a>下一步</h3><ul><li>📖 <a href="https://hermes-agent.nousresearch.com/docs/">官方文档</a></li><li>🌐 <a href="https://github.com/NousResearch/hermes-agent">GitHub 仓库</a></li><li>💬 加入社区 Discord 获取帮助</li><li>🔧 尝试为 Hermes 贡献代码或编写技能</li></ul><hr><blockquote><p>📚 <strong>参考资料：</strong></p><ul><li><a href="https://hermes-agent.nousresearch.com/docs/">Hermes Agent 官方文档</a></li><li><a href="https://github.com/NousResearch/hermes-agent">Hermes Agent GitHub</a></li><li><a href="https://openrouter.ai/">OpenRouter</a> — 多模型 API 聚合</li><li><a href="https://hexo.io/">Hexo 博客框架</a> — 静态博客生成器</li></ul></blockquote>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;Hermes-Agent-从零开始使用指南&quot;&gt;&lt;a href=&quot;#Hermes-Agent-从零开始使用指南&quot; class=&quot;headerlink&quot; title=&quot;Hermes Agent 从零开始使用指南&quot;&gt;&lt;/a&gt;Hermes Agent 从零开始使用指南&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;作者：&lt;/strong&gt; CaoZH&lt;br&gt;&lt;strong&gt;版本：&lt;/strong&gt; 2026-05-29&lt;br&gt;&lt;strong&gt;适用平台：&lt;/strong&gt; Linux / macOS / WSL2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;一、什么是-Hermes-Agent？&quot;&gt;&lt;a href=&quot;#一、什么是-Hermes-Agent？&quot; class=&quot;headerlink&quot; title=&quot;一、什么是 Hermes Agent？&quot;&gt;&lt;/a&gt;一、什么是 Hermes Agent？&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Hermes Agent&lt;/strong&gt; 是由 Nous Research 开发的开源 AI 智能体框架。它不仅仅是一个聊天机器人，而是一个能够&lt;strong&gt;自主执行任务&lt;/strong&gt;的 AI 助手——可以在终端执行命令、编写代码、管理文件、搜索网页、发送消息，并且能记住你和它的每次对话。&lt;/p&gt;
&lt;h3 id=&quot;与其他-AI-工具的区别&quot;&gt;&lt;a href=&quot;#与其他-AI-工具的区别&quot; class=&quot;headerlink&quot; title=&quot;与其他 AI 工具的区别&quot;&gt;&lt;/a&gt;与其他 AI 工具的区别&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比&lt;/th&gt;
&lt;th&gt;Hermes Agent&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;th&gt;ChatGPT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;开源&lt;/td&gt;
&lt;td&gt;✅ 完全开源&lt;/td&gt;
&lt;td&gt;❌ 闭源&lt;/td&gt;
&lt;td&gt;❌ 闭源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地运行&lt;/td&gt;
&lt;td&gt;✅ 可在自己服务器运行&lt;/td&gt;
&lt;td&gt;❌ 云端&lt;/td&gt;
&lt;td&gt;❌ 云端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多平台接入&lt;/td&gt;
&lt;td&gt;✅ Telegram/Discord/QQ等10+平台&lt;/td&gt;
&lt;td&gt;❌ 仅终端&lt;/td&gt;
&lt;td&gt;✅ Web/App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技能记忆&lt;/td&gt;
&lt;td&gt;✅ 自动学习、跨会话积累&lt;/td&gt;
&lt;td&gt;❌ 有限&lt;/td&gt;
&lt;td&gt;❌ 有限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模型自由&lt;/td&gt;
&lt;td&gt;✅ 支持20+提供商,可随时切换&lt;/td&gt;
&lt;td&gt;❌ 仅Claude&lt;/td&gt;
&lt;td&gt;❌ 仅GPT系列&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;定时任务&lt;/td&gt;
&lt;td&gt;✅ 支持 cron 调度&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;td&gt;❌ 不支持&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;核心特性&quot;&gt;&lt;a href=&quot;#核心特性&quot; class=&quot;headerlink&quot; title=&quot;核心特性&quot;&gt;&lt;/a&gt;核心特性&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;🛠️ 自主工具调用&lt;/strong&gt; — 读文件、写代码、搜索网页、执行命令&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🧠 持久记忆&lt;/strong&gt; — 跨会话记住你的偏好和项目上下文&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;💡 技能系统&lt;/strong&gt; — 从经验中学习，自动积累可复用的工作流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🌐 多平台网关&lt;/strong&gt; — 同一智能体同时运行在 QQ、Telegram、Discord 等平台&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;🎛️ 模型无关&lt;/strong&gt; — 随时切换 GPT、Claude、DeepSeek 等模型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;📅 定时任务&lt;/strong&gt; — 像 cron 一样自动执行任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;📦 MCP 协议&lt;/strong&gt; — 支持 Model Context Protocol 扩展&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;👤 多配置文件&lt;/strong&gt; — 工作/个人分不同的配置文件&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    
    <category term="hermes" scheme="https://www.geniux.top/tags/hermes/"/>
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="agent" scheme="https://www.geniux.top/tags/agent/"/>
    
    <category term="guide" scheme="https://www.geniux.top/tags/guide/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu同时部署OpenClaw和Hermes Agent</title>
    <link href="https://www.geniux.top/article/bd3d22048f4c/"/>
    <id>https://www.geniux.top/article/bd3d22048f4c/</id>
    <published>2026-05-27T16:00:00.000Z</published>
    <updated>2026-05-29T06:10:31.484Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>适用系统：</strong> Ubuntu 22.04 / 24.04<br><strong>最后更新：</strong> 2026-05-28</p></blockquote><hr><h2 id="一、概述"><a href="#一、概述" class="headerlink" title="一、概述"></a>一、概述</h2><p><strong>OpenClaw</strong> 和 <strong>Hermes Agent</strong> 都是开源的个人 AI 助手框架，可以在你的服务器或个人电脑上运行，通过 Telegram、Discord、WhatsApp、QQ 等消息平台进行交互。两者可以<strong>同时部署在同一台 Ubuntu 机器上</strong>，互不冲突。</p><table><thead><tr><th>对比维度</th><th>OpenClaw 🦞</th><th>Hermes Agent</th></tr></thead><tbody><tr><td>语言/运行时</td><td>TypeScript, <strong>Node.js 24</strong></td><td>Python 3.11+</td></tr><tr><td>安装方式</td><td><code>npm install -g openclaw@latest</code></td><td><code>curl ... | bash</code> 一键脚本</td></tr><tr><td>配置目录</td><td><code>~/.openclaw/</code></td><td><code>~/.hermes/</code></td></tr><tr><td>配置文件</td><td><code>openclaw.json</code> (JSON)</td><td><code>config.yaml</code> (YAML) + <code>.env</code></td></tr><tr><td>网关守护</td><td>systemd user service</td><td>systemd user service</td></tr><tr><td>官方文档</td><td><a href="https://docs.openclaw.ai/">https://docs.openclaw.ai</a></td><td><a href="https://hermes-agent.nousresearch.com/docs/">https://hermes-agent.nousresearch.com/docs/</a></td></tr><tr><td>GitHub</td><td><a href="https://github.com/openclaw/openclaw">https://github.com/openclaw/openclaw</a></td><td><a href="https://github.com/NousResearch/hermes-agent">https://github.com/NousResearch/hermes-agent</a></td></tr></tbody></table><span id="more"></span><hr><h2 id="二、环境准备"><a href="#二、环境准备" class="headerlink" title="二、环境准备"></a>二、环境准备</h2><h3 id="2-1-系统依赖"><a href="#2-1-系统依赖" class="headerlink" title="2.1 系统依赖"></a>2.1 系统依赖</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新系统</span></span><br><span class="line">sudo apt update &amp;&amp; sudo apt upgrade -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装基础依赖</span></span><br><span class="line">sudo apt install -y curl git build-essential python3 python3-pip python3-venv</span><br></pre></td></tr></table></figure><h3 id="2-2-安装-Node-js（OpenClaw-需要）"><a href="#2-2-安装-Node-js（OpenClaw-需要）" class="headerlink" title="2.2 安装 Node.js（OpenClaw 需要）"></a>2.2 安装 Node.js（OpenClaw 需要）</h3><p>OpenClaw 推荐 <strong>Node 24</strong> 或 **Node 22.19+**。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 方法一：使用 NodeSource 安装 Node.js 22 LTS</span></span><br><span class="line">curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -</span><br><span class="line">sudo apt install -y nodejs</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">node --version   <span class="comment"># 应显示 v22.x.x</span></span><br><span class="line">npm --version</span><br></pre></td></tr></table></figure><blockquote><p>💡 如果需要 Node 24，可使用 <a href="https://github.com/nvm-sh/nvm">nvm</a> 管理多版本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash</span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line">nvm install 24</span><br><span class="line">nvm use 24</span><br></pre></td></tr></table></figure></blockquote><h3 id="2-3-验证-Python（Hermes-需要）"><a href="#2-3-验证-Python（Hermes-需要）" class="headerlink" title="2.3 验证 Python（Hermes 需要）"></a>2.3 验证 Python（Hermes 需要）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">python3 --version   <span class="comment"># 应显示 3.11+</span></span><br><span class="line">pip3 --version</span><br></pre></td></tr></table></figure><hr><h2 id="三、安装-OpenClaw"><a href="#三、安装-OpenClaw" class="headerlink" title="三、安装 OpenClaw"></a>三、安装 OpenClaw</h2><h3 id="3-1-全局安装"><a href="#3-1-全局安装" class="headerlink" title="3.1 全局安装"></a>3.1 全局安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm install -g openclaw@latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">openclaw --version</span><br></pre></td></tr></table></figure><h3 id="3-2-初始化配置"><a href="#3-2-初始化配置" class="headerlink" title="3.2 初始化配置"></a>3.2 初始化配置</h3><p>运行引导向导，会一步步配置网关、工作区、消息渠道和技能：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openclaw onboard --install-daemon</span><br></pre></td></tr></table></figure><p><code>--install-daemon</code> 会自动安装 systemd 用户服务，让网关开机自启并在后台持续运行。</p><h3 id="3-3-配置文件位置"><a href="#3-3-配置文件位置" class="headerlink" title="3.3 配置文件位置"></a>3.3 配置文件位置</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">~/.openclaw/</span><br><span class="line">├── openclaw.json          # 主配置（模型、渠道、行为等）</span><br><span class="line">├── .env                   # 环境变量 / API密钥</span><br><span class="line">└── workspace/             # 工作区</span><br><span class="line">    ├── SOUL.md            # 人格定义</span><br><span class="line">    ├── MEMORY.md          # 长期记忆</span><br><span class="line">    ├── AGENTS.md          # 项目级指令</span><br><span class="line">    └── skills/            # 自定义技能</span><br></pre></td></tr></table></figure><h3 id="3-4-网关管理"><a href="#3-4-网关管理" class="headerlink" title="3.4 网关管理"></a>3.4 网关管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">openclaw gateway status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动（守护模式）</span></span><br><span class="line">openclaw gateway start</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止</span></span><br><span class="line">openclaw gateway stop</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看日志</span></span><br><span class="line">journalctl --user -u openclaw-gateway -f</span><br><span class="line"></span><br><span class="line"><span class="comment"># 前台调试模式</span></span><br><span class="line">openclaw gateway --port 18789 --verbose</span><br></pre></td></tr></table></figure><hr><h2 id="四、安装-Hermes-Agent"><a href="#四、安装-Hermes-Agent" class="headerlink" title="四、安装 Hermes Agent"></a>四、安装 Hermes Agent</h2><h3 id="4-1-一键安装"><a href="#4-1-一键安装" class="headerlink" title="4.1 一键安装"></a>4.1 一键安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash</span><br></pre></td></tr></table></figure><p>安装完成后，激活虚拟环境或重新加载 shell：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line"><span class="comment"># 或</span></span><br><span class="line"><span class="built_in">export</span> PATH=<span class="string">&quot;<span class="variable">$HOME</span>/.hermes/hermes-agent/venv/bin:<span class="variable">$PATH</span>&quot;</span></span><br></pre></td></tr></table></figure><h3 id="4-2-初始化配置"><a href="#4-2-初始化配置" class="headerlink" title="4.2 初始化配置"></a>4.2 初始化配置</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 运行设置向导（检测到 ~/.openclaw 时还会提示是否迁移）</span></span><br><span class="line">hermes setup</span><br><span class="line"></span><br><span class="line"><span class="comment"># 快速选择模型</span></span><br><span class="line">hermes model</span><br></pre></td></tr></table></figure><h3 id="4-3-配置文件位置"><a href="#4-3-配置文件位置" class="headerlink" title="4.3 配置文件位置"></a>4.3 配置文件位置</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">~/.hermes/</span><br><span class="line">├── config.yaml            # 主配置</span><br><span class="line">├── .env                   # API 密钥（独立文件，不提交到 git）</span><br><span class="line">├── state.db               # 会话存储（SQLite）</span><br><span class="line">├── skills/                # 已安装技能</span><br><span class="line">├── logs/                  # 日志</span><br><span class="line">│   ├── agent.log</span><br><span class="line">│   ├── errors.log</span><br><span class="line">│   └── gateway.log</span><br><span class="line">└── hermes-agent/          # 源代码（git 安装方式）</span><br></pre></td></tr></table></figure><h3 id="4-4-网关管理"><a href="#4-4-网关管理" class="headerlink" title="4.4 网关管理"></a>4.4 网关管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装为系统服务</span></span><br><span class="line">hermes gateway install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">hermes gateway status</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 / 停止 / 重启</span></span><br><span class="line">hermes gateway start</span><br><span class="line">hermes gateway stop</span><br><span class="line">hermes gateway restart</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看日志</span></span><br><span class="line">journalctl --user -u hermes-gateway -f</span><br></pre></td></tr></table></figure><h3 id="4-5-常用命令速查"><a href="#4-5-常用命令速查" class="headerlink" title="4.5 常用命令速查"></a>4.5 常用命令速查</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">hermes                        <span class="comment"># 交互式聊天</span></span><br><span class="line">hermes chat -q <span class="string">&quot;问题&quot;</span>         <span class="comment"># 单次查询</span></span><br><span class="line">hermes model                  <span class="comment"># 切换模型</span></span><br><span class="line">hermes config edit            <span class="comment"># 编辑配置</span></span><br><span class="line">hermes tools                  <span class="comment"># 管理工具集</span></span><br><span class="line">hermes skills list            <span class="comment"># 列出技能</span></span><br><span class="line">hermes sessions list          <span class="comment"># 查看历史会话</span></span><br><span class="line">hermes cron list              <span class="comment"># 定时任务</span></span><br><span class="line">hermes doctor                 <span class="comment"># 诊断检查</span></span><br><span class="line">hermes update                 <span class="comment"># 更新到最新版</span></span><br></pre></td></tr></table></figure><hr><h2 id="五、从-OpenClaw-迁移到-Hermes"><a href="#五、从-OpenClaw-迁移到-Hermes" class="headerlink" title="五、从 OpenClaw 迁移到 Hermes"></a>五、从 OpenClaw 迁移到 Hermes</h2><p>如果你已在用 OpenClaw，Hermes 提供了一键迁移：</p><h3 id="5-1-预览（推荐先预览）"><a href="#5-1-预览（推荐先预览）" class="headerlink" title="5.1 预览（推荐先预览）"></a>5.1 预览（推荐先预览）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hermes claw migrate --dry-run</span><br></pre></td></tr></table></figure><p>这会显示哪些内容可以迁移、哪些会跳过、哪些会冲突。</p><h3 id="5-2-执行迁移"><a href="#5-2-执行迁移" class="headerlink" title="5.2 执行迁移"></a>5.2 执行迁移</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 仅迁移用户数据（不含 API 密钥）</span></span><br><span class="line">hermes claw migrate --preset user-data</span><br><span class="line"></span><br><span class="line"><span class="comment"># 完整迁移（含 API 密钥）</span></span><br><span class="line">hermes claw migrate --preset full --migrate-secrets</span><br></pre></td></tr></table></figure><h3 id="5-3-迁移内容包括"><a href="#5-3-迁移内容包括" class="headerlink" title="5.3 迁移内容包括"></a>5.3 迁移内容包括</h3><table><thead><tr><th>内容</th><th>OpenClaw 来源</th><th>Hermes 目标</th></tr></thead><tbody><tr><td>人格定义</td><td><code>workspace/SOUL.md</code></td><td><code>~/.hermes/SOUL.md</code></td></tr><tr><td>长期记忆</td><td><code>workspace/MEMORY.md</code></td><td><code>~/.hermes/memories/MEMORY.md</code></td></tr><tr><td>用户档案</td><td><code>workspace/USER.md</code></td><td><code>~/.hermes/memories/USER.md</code></td></tr><tr><td>自定义技能</td><td><code>workspace/skills/</code></td><td><code>~/.hermes/skills/openclaw-imports/</code></td></tr><tr><td>模型/提供商</td><td><code>openclaw.json</code> → models.providers</td><td><code>config.yaml</code> → custom_providers</td></tr><tr><td>消息平台令牌</td><td><code>openclaw.json</code> → channels</td><td><code>.env</code> → 对应变量</td></tr><tr><td>命令审批</td><td><code>exec-approvals.json</code></td><td><code>config.yaml</code> → command_allowlist</td></tr></tbody></table><h3 id="5-4-迁移后清理"><a href="#5-4-迁移后清理" class="headerlink" title="5.4 迁移后清理"></a>5.4 迁移后清理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 确认一切正常后，归档旧的 OpenClaw 目录</span></span><br><span class="line">hermes claw cleanup</span><br></pre></td></tr></table></figure><hr><h2 id="六、同时运行两个-Agent"><a href="#六、同时运行两个-Agent" class="headerlink" title="六、同时运行两个 Agent"></a>六、同时运行两个 Agent</h2><p>两个 Agent <strong>互不冲突</strong>，因为它们使用完全独立的数据目录和服务名：</p><h3 id="6-1-服务隔离"><a href="#6-1-服务隔离" class="headerlink" title="6.1 服务隔离"></a>6.1 服务隔离</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># OpenClaw 网关服务</span></span><br><span class="line">systemctl --user status openclaw-gateway</span><br><span class="line"></span><br><span class="line"><span class="comment"># Hermes 网关服务</span></span><br><span class="line">systemctl --user status hermes-gateway</span><br></pre></td></tr></table></figure><h3 id="6-2-利用-Hermes-的-profiles-隔离"><a href="#6-2-利用-Hermes-的-profiles-隔离" class="headerlink" title="6.2 利用 Hermes 的 profiles 隔离"></a>6.2 利用 Hermes 的 profiles 隔离</h3><p>如果你想让 Hermes 有多个独立实例（例如一个用于工作，一个用于个人），可以用 profiles：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">hermes profile create work</span><br><span class="line">hermes profile create personal</span><br><span class="line"></span><br><span class="line"><span class="comment"># 以指定 profile 启动</span></span><br><span class="line">hermes --profile work</span><br></pre></td></tr></table></figure><h3 id="6-3-频道分配策略"><a href="#6-3-频道分配策略" class="headerlink" title="6.3 频道分配策略"></a>6.3 频道分配策略</h3><p>如果你在不同平台上使用不同 Agent，可以在各自的配置中指定不同的 token：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">OpenClaw → Telegram Bot A, Discord Server A</span><br><span class="line">Hermes   → Telegram Bot B, Discord Server B, QQ</span><br></pre></td></tr></table></figure><p>也可以让两者共用同一个平台的不同 Bot/账号。</p><h3 id="6-4-资源占用参考"><a href="#6-4-资源占用参考" class="headerlink" title="6.4 资源占用参考"></a>6.4 资源占用参考</h3><table><thead><tr><th>组件</th><th>内存占用（大致）</th><th>说明</th></tr></thead><tbody><tr><td>OpenClaw Gateway</td><td>~200-400 MB</td><td>Node.js 进程</td></tr><tr><td>Hermes Gateway</td><td>~100-300 MB</td><td>Python 进程</td></tr><tr><td>模型调用</td><td>外部 API（无本地开销）</td><td>除非使用本地模型</td></tr></tbody></table><blockquote><p>💡 <strong>建议</strong>：至少 2GB 可用内存。如果使用本地模型（vLLM / llama.cpp），需要额外的 GPU 或内存。</p></blockquote><hr><h2 id="七、systemd-开机自启"><a href="#七、systemd-开机自启" class="headerlink" title="七、systemd 开机自启"></a>七、systemd 开机自启</h2><p>确保两个网关都在用户级 systemd 下运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启用 linger（防止 SSH 退出后用户服务被杀死）</span></span><br><span class="line">sudo loginctl enable-linger <span class="variable">$USER</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查两者都在运行</span></span><br><span class="line">systemctl --user is-active openclaw-gateway</span><br><span class="line">systemctl --user is-active hermes-gateway</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置开机自启</span></span><br><span class="line">systemctl --user <span class="built_in">enable</span> openclaw-gateway</span><br><span class="line">systemctl --user <span class="built_in">enable</span> hermes-gateway</span><br></pre></td></tr></table></figure><hr><h2 id="八、常见问题"><a href="#八、常见问题" class="headerlink" title="八、常见问题"></a>八、常见问题</h2><h3 id="Q1-两个-Agent-能否绑定同一个-Telegram-Bot？"><a href="#Q1-两个-Agent-能否绑定同一个-Telegram-Bot？" class="headerlink" title="Q1: 两个 Agent 能否绑定同一个 Telegram Bot？"></a>Q1: 两个 Agent 能否绑定同一个 Telegram Bot？</h3><p><strong>不能</strong>。Telegram Bot Token 只能被一个服务使用。需要创建两个不同的 Bot。</p><h3 id="Q2-端口冲突怎么办？"><a href="#Q2-端口冲突怎么办？" class="headerlink" title="Q2: 端口冲突怎么办？"></a>Q2: 端口冲突怎么办？</h3><p>OpenClaw 默认使用 <strong>18789</strong> 端口，Hermes 默认使用随机端口（由 systemd socket activation 管理）。一般不会冲突。如需自定义：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># OpenClaw</span></span><br><span class="line">openclaw gateway --port 18888</span><br><span class="line"></span><br><span class="line"><span class="comment"># Hermes</span></span><br><span class="line">hermes config <span class="built_in">set</span> gateway.port 18999</span><br></pre></td></tr></table></figure><h3 id="Q3-如何查看日志排查问题？"><a href="#Q3-如何查看日志排查问题？" class="headerlink" title="Q3: 如何查看日志排查问题？"></a>Q3: 如何查看日志排查问题？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># OpenClaw</span></span><br><span class="line">journalctl --user -u openclaw-gateway -f --since <span class="string">&quot;10 min ago&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Hermes</span></span><br><span class="line">journalctl --user -u hermes-gateway -f</span><br><span class="line">cat ~/.hermes/logs/gateway.log | tail -100</span><br></pre></td></tr></table></figure><h3 id="Q4-系统更新后网关挂了？"><a href="#Q4-系统更新后网关挂了？" class="headerlink" title="Q4: 系统更新后网关挂了？"></a>Q4: 系统更新后网关挂了？</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 重新加载 systemd 并重启</span></span><br><span class="line">systemctl --user daemon-reload</span><br><span class="line">systemctl --user restart openclaw-gateway</span><br><span class="line">systemctl --user restart hermes-gateway</span><br></pre></td></tr></table></figure><h3 id="Q5-WSL2-用户注意"><a href="#Q5-WSL2-用户注意" class="headerlink" title="Q5: WSL2 用户注意"></a>Q5: WSL2 用户注意</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 需要在 /etc/wsl.conf 中启用 systemd</span></span><br><span class="line"><span class="comment"># 编辑 /etc/wsl.conf，添加：</span></span><br><span class="line">[boot]</span><br><span class="line">systemd=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 然后在 Windows 终端运行 wsl --shutdown 再重启</span></span><br></pre></td></tr></table></figure><h3 id="Q6-OpenClaw-迁移后技能不生效？"><a href="#Q6-OpenClaw-迁移后技能不生效？" class="headerlink" title="Q6: OpenClaw 迁移后技能不生效？"></a>Q6: OpenClaw 迁移后技能不生效？</h3><p>迁移后的技能在 <code>~/.hermes/skills/openclaw-imports/</code>，启动新会话后才会加载。使用 <code>/reset</code> 或开启新对话即可。</p><hr><h2 id="九、端口与路径速查表"><a href="#九、端口与路径速查表" class="headerlink" title="九、端口与路径速查表"></a>九、端口与路径速查表</h2><table><thead><tr><th>项目</th><th>路径/值</th></tr></thead><tbody><tr><td>OpenClaw 配置</td><td><code>~/.openclaw/openclaw.json</code></td></tr><tr><td>OpenClaw 工作区</td><td><code>~/.openclaw/workspace/</code></td></tr><tr><td>OpenClaw 守护服务</td><td><code>systemctl --user ... openclaw-gateway</code></td></tr><tr><td>OpenClaw 默认端口</td><td>18789</td></tr><tr><td>Hermes 配置</td><td><code>~/.hermes/config.yaml</code></td></tr><tr><td>Hermes 密钥</td><td><code>~/.hermes/.env</code></td></tr><tr><td>Hermes 技能</td><td><code>~/.hermes/skills/</code></td></tr><tr><td>Hermes 守护服务</td><td><code>systemctl --user ... hermes-gateway</code></td></tr><tr><td>Hermes 安装目录</td><td><code>~/.hermes/hermes-agent/</code></td></tr><tr><td>Hermes 日志</td><td><code>~/.hermes/logs/</code></td></tr></tbody></table><hr><h2 id="十、总结"><a href="#十、总结" class="headerlink" title="十、总结"></a>十、总结</h2><p>在 Ubuntu 上同时运行 OpenClaw 和 Hermes Agent 是<strong>完全可行</strong>的：</p><ol><li>✅ 数据目录独立（<code>~/.openclaw/</code> vs <code>~/.hermes/</code>）</li><li>✅ 服务名独立（两个 systemd user service）</li><li>✅ 运行时无冲突（Node.js vs Python）</li><li>✅ Hermes 提供一键迁移，可无缝过渡</li><li>✅ 可通过 profiles 进一步隔离不同的 Hermes 实例</li></ol><p>两个 Agent 各有所长，可以同时运行、互补使用。迁移路径也很顺畅，随时可以逐步将 OpenClaw 的配置和记忆迁移到 Hermes。</p><hr><blockquote><p>📚 <strong>参考资料：</strong></p><ul><li><a href="https://docs.openclaw.ai/">OpenClaw 文档</a></li><li><a href="https://hermes-agent.nousresearch.com/docs/">Hermes Agent 文档</a></li><li><a href="https://hermes-agent.nousresearch.com/docs/guides/migrate-from-openclaw">Hermes 从 OpenClaw 迁移指南</a></li></ul></blockquote>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;适用系统：&lt;/strong&gt; Ubuntu 22.04 / 24.04&lt;br&gt;&lt;strong&gt;最后更新：&lt;/strong&gt; 2026-05-28&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;一、概述&quot;&gt;&lt;a href=&quot;#一、概述&quot; class=&quot;headerlink&quot; title=&quot;一、概述&quot;&gt;&lt;/a&gt;一、概述&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; 和 &lt;strong&gt;Hermes Agent&lt;/strong&gt; 都是开源的个人 AI 助手框架，可以在你的服务器或个人电脑上运行，通过 Telegram、Discord、WhatsApp、QQ 等消息平台进行交互。两者可以&lt;strong&gt;同时部署在同一台 Ubuntu 机器上&lt;/strong&gt;，互不冲突。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比维度&lt;/th&gt;
&lt;th&gt;OpenClaw 🦞&lt;/th&gt;
&lt;th&gt;Hermes Agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;语言/运行时&lt;/td&gt;
&lt;td&gt;TypeScript, &lt;strong&gt;Node.js 24&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python 3.11+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;安装方式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install -g openclaw@latest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;curl ... | bash&lt;/code&gt; 一键脚本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置目录&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.openclaw/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.hermes/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;配置文件&lt;/td&gt;
&lt;td&gt;&lt;code&gt;openclaw.json&lt;/code&gt; (JSON)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;config.yaml&lt;/code&gt; (YAML) + &lt;code&gt;.env&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网关守护&lt;/td&gt;
&lt;td&gt;systemd user service&lt;/td&gt;
&lt;td&gt;systemd user service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;官方文档&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.openclaw.ai/&quot;&gt;https://docs.openclaw.ai&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://hermes-agent.nousresearch.com/docs/&quot;&gt;https://hermes-agent.nousresearch.com/docs/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/openclaw/openclaw&quot;&gt;https://github.com/openclaw/openclaw&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/NousResearch/hermes-agent&quot;&gt;https://github.com/NousResearch/hermes-agent&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</summary>
    
    
    
    
    <category term="ubuntu" scheme="https://www.geniux.top/tags/ubuntu/"/>
    
    <category term="openclaw" scheme="https://www.geniux.top/tags/openclaw/"/>
    
    <category term="hermes" scheme="https://www.geniux.top/tags/hermes/"/>
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
  </entry>
  
  <entry>
    <title>SQL 优化实战——从慢查询到秒级响应</title>
    <link href="https://www.geniux.top/article/bcc85457ed71/"/>
    <id>https://www.geniux.top/article/bcc85457ed71/</id>
    <published>2026-05-20T02:00:00.000Z</published>
    <updated>2026-06-01T03:47:48.068Z</updated>
    
    <content type="html"><![CDATA[<h1 id="SQL-优化实战——从慢查询到秒级响应"><a href="#SQL-优化实战——从慢查询到秒级响应" class="headerlink" title="SQL 优化实战——从慢查询到秒级响应"></a>SQL 优化实战——从慢查询到秒级响应</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-05-20<br><strong>本文为原创教程</strong></p></blockquote><hr><p>数据库性能优化是后端开发的核心技能之一。一条慢 SQL 可能拖垮整个系统。本文通过真实案例，系统性地介绍 SQL 优化的思路和技巧。</p><h2 id="一、找到慢查询"><a href="#一、找到慢查询" class="headerlink" title="一、找到慢查询"></a>一、找到慢查询</h2><h3 id="开启慢查询日志"><a href="#开启慢查询日志" class="headerlink" title="开启慢查询日志"></a>开启慢查询日志</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 查看慢查询配置</span></span><br><span class="line"><span class="keyword">SHOW</span> VARIABLES <span class="keyword">LIKE</span> <span class="string">&#x27;slow_query%&#x27;</span>;</span><br><span class="line"><span class="keyword">SHOW</span> VARIABLES <span class="keyword">LIKE</span> <span class="string">&#x27;long_query_time&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 开启慢查询日志（MySQL）</span></span><br><span class="line"><span class="keyword">SET</span> <span class="keyword">GLOBAL</span> slow_query_log <span class="operator">=</span> <span class="keyword">ON</span>;</span><br><span class="line"><span class="keyword">SET</span> <span class="keyword">GLOBAL</span> long_query_time <span class="operator">=</span> <span class="number">1</span>;  <span class="comment">-- 超过 1 秒的查询</span></span><br><span class="line"><span class="keyword">SET</span> <span class="keyword">GLOBAL</span> log_queries_not_using_indexes <span class="operator">=</span> <span class="keyword">ON</span>;</span><br></pre></td></tr></table></figure><h3 id="使用-EXPLAIN"><a href="#使用-EXPLAIN" class="headerlink" title="使用 EXPLAIN"></a>使用 EXPLAIN</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">EXPLAIN <span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders <span class="keyword">WHERE</span> status <span class="operator">=</span> <span class="string">&#x27;pending&#x27;</span> <span class="keyword">ORDER</span> <span class="keyword">BY</span> created_at <span class="keyword">DESC</span> LIMIT <span class="number">20</span>;</span><br></pre></td></tr></table></figure><p><strong>EXPLAIN 输出解读：</strong></p><table><thead><tr><th>列</th><th>值</th><th>含义</th></tr></thead><tbody><tr><td>type</td><td>ALL</td><td>全表扫描 ❌</td></tr><tr><td>type</td><td>ref / range</td><td>走索引 ✅</td></tr><tr><td>rows</td><td>50000</td><td>扫描行数</td></tr><tr><td>Extra</td><td>Using filesort</td><td>需要额外排序 ❌</td></tr><tr><td>Extra</td><td>Using index</td><td>索引覆盖 ✅</td></tr><tr><td>possible_keys</td><td>idx_status</td><td>可用的索引</td></tr><tr><td>key</td><td>NULL</td><td>实际没走索引 ❌</td></tr></tbody></table><h2 id="二、索引优化"><a href="#二、索引优化" class="headerlink" title="二、索引优化"></a>二、索引优化</h2><h3 id="最左前缀原则"><a href="#最左前缀原则" class="headerlink" title="最左前缀原则"></a>最左前缀原则</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 联合索引</span></span><br><span class="line"><span class="keyword">CREATE</span> INDEX idx_user_status_time <span class="keyword">ON</span> orders(user_id, status, created_at);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 走索引 ✅</span></span><br><span class="line"><span class="keyword">WHERE</span> user_id <span class="operator">=</span> <span class="number">1</span> <span class="keyword">AND</span> status <span class="operator">=</span> <span class="string">&#x27;paid&#x27;</span>;</span><br><span class="line"><span class="keyword">WHERE</span> user_id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">WHERE</span> user_id <span class="operator">=</span> <span class="number">1</span> <span class="keyword">AND</span> created_at <span class="operator">&gt;</span> <span class="string">&#x27;2025-01-01&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 不走索引 ❌</span></span><br><span class="line"><span class="keyword">WHERE</span> status <span class="operator">=</span> <span class="string">&#x27;paid&#x27;</span>;               <span class="comment">-- 跳过了 user_id</span></span><br><span class="line"><span class="keyword">WHERE</span> created_at <span class="operator">&gt;</span> <span class="string">&#x27;2025-01-01&#x27;</span>;     <span class="comment">-- 跳过了前两列</span></span><br></pre></td></tr></table></figure><h3 id="索引设计要点"><a href="#索引设计要点" class="headerlink" title="索引设计要点"></a>索引设计要点</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ✅ 高区分度字段放前面</span></span><br><span class="line"><span class="keyword">CREATE</span> INDEX idx_email <span class="keyword">ON</span> users(email);  <span class="comment">-- email 区分度极高</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 覆盖索引（查询的字段都在索引中）</span></span><br><span class="line"><span class="keyword">CREATE</span> INDEX idx_user_status <span class="keyword">ON</span> orders(user_id, status, amount);</span><br><span class="line"><span class="keyword">SELECT</span> user_id, status, amount <span class="keyword">FROM</span> orders <span class="keyword">WHERE</span> user_id <span class="operator">=</span> <span class="number">1</span>;  <span class="comment">-- Using index</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ❌ 低区分度字段不适合单独索引</span></span><br><span class="line"><span class="comment">-- status 只有 &#x27;pending&#x27;,&#x27;paid&#x27;,&#x27;shipped&#x27; 三种值</span></span><br></pre></td></tr></table></figure><h2 id="三、常见慢查询案例"><a href="#三、常见慢查询案例" class="headerlink" title="三、常见慢查询案例"></a>三、常见慢查询案例</h2><h3 id="案例-1：分页查询越来越慢"><a href="#案例-1：分页查询越来越慢" class="headerlink" title="案例 1：分页查询越来越慢"></a>案例 1：分页查询越来越慢</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ❌ 大偏移量分页</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders <span class="keyword">ORDER</span> <span class="keyword">BY</span> id LIMIT <span class="number">100000</span>, <span class="number">20</span>;</span><br><span class="line"><span class="comment">-- 扫描 100020 行，只取 20 行</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 基于游标的分页</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders <span class="keyword">WHERE</span> id <span class="operator">&gt;</span> <span class="number">100000</span> <span class="keyword">ORDER</span> <span class="keyword">BY</span> id LIMIT <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 子查询优化</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders </span><br><span class="line"><span class="keyword">WHERE</span> id <span class="operator">&gt;=</span> (<span class="keyword">SELECT</span> id <span class="keyword">FROM</span> orders <span class="keyword">ORDER</span> <span class="keyword">BY</span> id LIMIT <span class="number">100000</span>, <span class="number">1</span>)</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> id LIMIT <span class="number">20</span>;</span><br></pre></td></tr></table></figure><h3 id="案例-2：N-1-查询"><a href="#案例-2：N-1-查询" class="headerlink" title="案例 2：N+1 查询"></a>案例 2：N+1 查询</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ❌ N+1：循环查数据库</span></span><br><span class="line">List&lt;Order&gt; orders = orderMapper.selectList();</span><br><span class="line"><span class="keyword">for</span> (Order order : orders) &#123;</span><br><span class="line">    User user = userMapper.selectById(order.getUserId());  <span class="comment">// N 次查询</span></span><br><span class="line">    order.setUserName(user.getName());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ✅ JOIN 一次查出</span></span><br><span class="line"><span class="keyword">SELECT</span> o.<span class="operator">*</span>, u.name <span class="keyword">as</span> user_name</span><br><span class="line"><span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> users u <span class="keyword">ON</span> o.user_id <span class="operator">=</span> u.id</span><br><span class="line"><span class="keyword">WHERE</span> o.status <span class="operator">=</span> <span class="string">&#x27;paid&#x27;</span></span><br><span class="line">LIMIT <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 批量查询</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> users <span class="keyword">WHERE</span> id <span class="keyword">IN</span> (<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, ..., <span class="number">20</span>);</span><br></pre></td></tr></table></figure><h3 id="案例-3：SELECT-问题"><a href="#案例-3：SELECT-问题" class="headerlink" title="案例 3：SELECT * 问题"></a>案例 3：SELECT * 问题</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ❌ 查询所有字段</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> users <span class="keyword">WHERE</span> email <span class="operator">=</span> <span class="string">&#x27;test@test.com&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 只查需要的字段</span></span><br><span class="line"><span class="keyword">SELECT</span> id, name, email <span class="keyword">FROM</span> users <span class="keyword">WHERE</span> email <span class="operator">=</span> <span class="string">&#x27;test@test.com&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 如果所有查询字段都在索引中 → 覆盖索引，不回表查询</span></span><br></pre></td></tr></table></figure><h3 id="案例-4：函数导致索引失效"><a href="#案例-4：函数导致索引失效" class="headerlink" title="案例 4：函数导致索引失效"></a>案例 4：函数导致索引失效</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ❌ 对索引列使用函数</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders <span class="keyword">WHERE</span> <span class="type">DATE</span>(created_at) <span class="operator">=</span> <span class="string">&#x27;2025-01-15&#x27;</span>;</span><br><span class="line"><span class="comment">-- 不走索引</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 使用范围查询</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders </span><br><span class="line"><span class="keyword">WHERE</span> created_at <span class="operator">&gt;=</span> <span class="string">&#x27;2025-01-15 00:00:00&#x27;</span> </span><br><span class="line">  <span class="keyword">AND</span> created_at <span class="operator">&lt;</span> <span class="string">&#x27;2025-01-16 00:00:00&#x27;</span>;</span><br><span class="line"><span class="comment">-- 走索引</span></span><br></pre></td></tr></table></figure><h2 id="四、表结构优化"><a href="#四、表结构优化" class="headerlink" title="四、表结构优化"></a>四、表结构优化</h2><h3 id="字段类型优化"><a href="#字段类型优化" class="headerlink" title="字段类型优化"></a>字段类型优化</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ❌ 能用更小的类型</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> users (</span><br><span class="line">    id <span class="type">BIGINT</span>,           <span class="comment">-- 实际不会超过 1000 万用户</span></span><br><span class="line">    status <span class="type">VARCHAR</span>(<span class="number">10</span>),  <span class="comment">-- 只有 0 和 1</span></span><br><span class="line">    created_at <span class="type">VARCHAR</span>(<span class="number">20</span>)  <span class="comment">-- 应该用 DATETIME</span></span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 选择合适的类型</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> users (</span><br><span class="line">    id <span class="type">INT</span> UNSIGNED,         <span class="comment">-- 最大 42 亿</span></span><br><span class="line">    status TINYINT,          <span class="comment">-- 0/1</span></span><br><span class="line">    created_at DATETIME      <span class="comment">-- 占用更少，支持日期函数</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h3 id="反范式优化"><a href="#反范式优化" class="headerlink" title="反范式优化"></a>反范式优化</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- ❌ 每次查询都需要计算</span></span><br><span class="line"><span class="keyword">SELECT</span> o.<span class="operator">*</span>, </span><br><span class="line">    (<span class="keyword">SELECT</span> <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">FROM</span> order_items <span class="keyword">WHERE</span> order_id <span class="operator">=</span> o.id) <span class="keyword">as</span> item_count,</span><br><span class="line">    (<span class="keyword">SELECT</span> <span class="built_in">SUM</span>(price <span class="operator">*</span> quantity) <span class="keyword">FROM</span> order_items <span class="keyword">WHERE</span> order_id <span class="operator">=</span> o.id) <span class="keyword">as</span> total</span><br><span class="line"><span class="keyword">FROM</span> orders o;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ✅ 冗余字段，写入时维护</span></span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> orders <span class="keyword">ADD</span> <span class="keyword">COLUMN</span> item_count <span class="type">INT</span> <span class="keyword">DEFAULT</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> orders <span class="keyword">ADD</span> <span class="keyword">COLUMN</span> total_amount <span class="type">DECIMAL</span>(<span class="number">10</span>,<span class="number">2</span>) <span class="keyword">DEFAULT</span> <span class="number">0.00</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 插入订单项时同步更新</span></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> order_items (order_id, price, quantity) <span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="number">99.9</span>, <span class="number">2</span>);</span><br><span class="line">UPDATE orders <span class="keyword">SET</span> </span><br><span class="line">    item_count <span class="operator">=</span> item_count <span class="operator">+</span> <span class="number">1</span>,</span><br><span class="line">    total_amount <span class="operator">=</span> total_amount <span class="operator">+</span> <span class="number">99.9</span> <span class="operator">*</span> <span class="number">2</span></span><br><span class="line"><span class="keyword">WHERE</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br></pre></td></tr></table></figure><h2 id="五、大表分页优化方案"><a href="#五、大表分页优化方案" class="headerlink" title="五、大表分页优化方案"></a>五、大表分页优化方案</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 方案一：标签记录法（推荐）</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders </span><br><span class="line"><span class="keyword">WHERE</span> id <span class="operator">&gt;</span> #&#123;lastId&#125;     <span class="comment">-- 记录上一页最后一条的 ID</span></span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> id </span><br><span class="line">LIMIT <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 方案二：子查询优化</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders </span><br><span class="line"><span class="keyword">WHERE</span> id <span class="operator">&gt;=</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> id <span class="keyword">FROM</span> orders </span><br><span class="line">    <span class="keyword">ORDER</span> <span class="keyword">BY</span> id </span><br><span class="line">    LIMIT <span class="number">100000</span>, <span class="number">1</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> id </span><br><span class="line">LIMIT <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 方案三：延迟关联</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">INNER</span> <span class="keyword">JOIN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> id <span class="keyword">FROM</span> orders </span><br><span class="line">    <span class="keyword">ORDER</span> <span class="keyword">BY</span> id </span><br><span class="line">    LIMIT <span class="number">100000</span>, <span class="number">20</span></span><br><span class="line">) tmp <span class="keyword">ON</span> o.id <span class="operator">=</span> tmp.id;</span><br></pre></td></tr></table></figure><h2 id="六、监控与巡检"><a href="#六、监控与巡检" class="headerlink" title="六、监控与巡检"></a>六、监控与巡检</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 查看当前正在运行的查询</span></span><br><span class="line"><span class="keyword">SHOW</span> <span class="keyword">FULL</span> PROCESSLIST;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看锁等待</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> information_schema.INNODB_LOCKS;</span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> information_schema.INNODB_LOCK_WAITS;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看表大小</span></span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">    table_name,</span><br><span class="line">    ROUND(((data_length <span class="operator">+</span> index_length) <span class="operator">/</span> <span class="number">1024</span> <span class="operator">/</span> <span class="number">1024</span>), <span class="number">2</span>) <span class="keyword">AS</span> <span class="string">&#x27;size_mb&#x27;</span></span><br><span class="line"><span class="keyword">FROM</span> information_schema.tables</span><br><span class="line"><span class="keyword">WHERE</span> table_schema <span class="operator">=</span> <span class="string">&#x27;myapp&#x27;</span></span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> size_mb <span class="keyword">DESC</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看索引使用率</span></span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">    index_name,</span><br><span class="line">    <span class="keyword">cardinality</span>,</span><br><span class="line">    (<span class="keyword">cardinality</span> <span class="operator">/</span> GREATEST(</span><br><span class="line">        (<span class="keyword">SELECT</span> <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">FROM</span> information_schema.statistics </span><br><span class="line">         <span class="keyword">WHERE</span> table_name <span class="operator">=</span> <span class="string">&#x27;orders&#x27;</span>), <span class="number">1</span></span><br><span class="line">    )) <span class="operator">*</span> <span class="number">100</span> <span class="keyword">as</span> selectivity</span><br><span class="line"><span class="keyword">FROM</span> information_schema.statistics </span><br><span class="line"><span class="keyword">WHERE</span> table_name <span class="operator">=</span> <span class="string">&#x27;orders&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="七、总结"><a href="#七、总结" class="headerlink" title="七、总结"></a>七、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## SQL 优化检查清单</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 查询优化</span></span><br><span class="line">□ 是否全表扫描？（EXPLAIN type != ALL）</span><br><span class="line">□ 是否走了正确的索引？（EXPLAIN key）</span><br><span class="line">□ 是否使用了文件排序？（Extra != Using filesort）</span><br><span class="line">□ 是否使用了临时表？（Extra != Using temporary）</span><br><span class="line">□ 是否 SELECT <span class="emphasis">*？（只查需要的字段）</span></span><br><span class="line"><span class="emphasis">□ 是否对索引列使用了函数？</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 索引优化</span></span><br><span class="line"><span class="emphasis">□ 区分度高的字段在前</span></span><br><span class="line"><span class="emphasis">□ 避免冗余索引</span></span><br><span class="line"><span class="emphasis">□ 覆盖索引</span></span><br><span class="line"><span class="emphasis">□ 联合索引遵循最左前缀</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 架构优化</span></span><br><span class="line"><span class="emphasis">□ 读写分离</span></span><br><span class="line"><span class="emphasis">□ 分表分库</span></span><br><span class="line"><span class="emphasis">□ 引入缓存（Redis）</span></span><br><span class="line"><span class="emphasis">□ 定期分析慢查询</span></span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;SQL-优化实战——从慢查询到秒级响应&quot;&gt;&lt;a href=&quot;#SQL-优化实战——从慢查询到秒级响应&quot; class=&quot;headerlink&quot; title=&quot;SQL 优化实战——从慢查询到秒级响应&quot;&gt;&lt;/a&gt;SQL 优化实战——从慢查询到秒级响应&lt;/h1&gt;&lt;bloc</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="mysql" scheme="https://www.geniux.top/tags/mysql/"/>
    
    <category term="数据库" scheme="https://www.geniux.top/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    <category term="sql" scheme="https://www.geniux.top/tags/sql/"/>
    
    <category term="性能优化" scheme="https://www.geniux.top/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>AI 编程完整工作流程 v2.0</title>
    <link href="https://www.geniux.top/article/2342e29fe2d5/"/>
    <id>https://www.geniux.top/article/2342e29fe2d5/</id>
    <published>2026-05-19T16:00:00.000Z</published>
    <updated>2026-06-01T03:15:03.040Z</updated>
    
    <content type="html"><![CDATA[<h1 id="AI-编程完整工作流程"><a href="#AI-编程完整工作流程" class="headerlink" title="AI 编程完整工作流程"></a>AI 编程完整工作流程</h1><blockquote><p>版本：v2.0 | 日期：2026-05-20</p></blockquote><hr><h2 id="📋-目录"><a href="#📋-目录" class="headerlink" title="📋 目录"></a>📋 目录</h2><ol><li><a href="#%E4%B8%80%E5%86%85%E5%AE%B9%E6%A6%82%E8%BF%B0">内容概述</a></li><li><a href="#%E4%BA%8C%E6%8A%80%E6%9C%AF%E6%A0%88">技术栈</a></li><li><a href="#%E4%B8%89%E9%A1%B9%E7%9B%AE%E6%9E%B6%E6%9E%84">项目架构</a></li><li><a href="#%E5%9B%9B%E5%85%A8%E5%B1%80-skills-%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C">全局 Skills 使用手册</a></li><li><a href="#%E4%BA%94%E9%A1%B9%E7%9B%AE-skills-%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C">项目 Skills 使用手册</a></li><li><a href="#%E5%85%AD%E5%AE%8C%E6%95%B4%E5%BC%80%E5%8F%91%E6%B5%81%E7%A8%8B">完整开发流程</a></li><li><a href="#%E4%B8%83%E8%B4%A8%E9%87%8F%E4%BF%9D%E8%AF%81%E4%BD%93%E7%B3%BB">质量保证体系</a></li><li><a href="#%E5%85%AB%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B%E6%8C%87%E5%8D%97">快速开始指南</a></li></ol><hr><h2 id="一、内容概述"><a href="#一、内容概述" class="headerlink" title="一、内容概述"></a>一、内容概述</h2><h3 id="1-1-文档目的"><a href="#1-1-文档目的" class="headerlink" title="1.1 文档目的"></a>1.1 文档目的</h3><p>本工作流程面向<strong>Java 后端 + Vue3 前端</strong>的全栈开发团队，基于 <strong>RuoYi（后端）+ VBen Admin（前端）</strong> 技术栈，结合 <strong>Claude Code + Agent Skills</strong> 工具链，实现从需求到交付的完整 AI 辅助开发闭环。</p><h3 id="1-2-核心工具链"><a href="#1-2-核心工具链" class="headerlink" title="1.2 核心工具链"></a>1.2 核心工具链</h3><table><thead><tr><th>类别</th><th>工具</th><th>定位</th></tr></thead><tbody><tr><td><strong>AI 编程框架</strong></td><td>Superpowers</td><td>强制 TDD + 工程流程</td></tr><tr><td><strong>需求规格</strong></td><td>OpenSpec</td><td>需求澄清 + 规格文档</td></tr><tr><td><strong>后端技能</strong></td><td>gstack</td><td>模块化 API 生成</td></tr><tr><td><strong>代码审查</strong></td><td>code-review</td><td>安全性 + 可维护性审计</td></tr><tr><td><strong>文档处理</strong></td><td>pdf / word / pptx / excel</td><td>办公文档自动化</td></tr><tr><td><strong>前端 UI</strong></td><td>ui-ux-pro-max</td><td>AI 原生 UI 设计</td></tr><tr><td><strong>自动化测试</strong></td><td>webapp-testing</td><td>Playwright UI 测试</td></tr><tr><td><strong>自定义构建</strong></td><td>skill-creator / mcp-builder</td><td>团队技能扩展</td></tr></tbody></table><h3 id="1-3-核心理念"><a href="#1-3-核心理念" class="headerlink" title="1.3 核心理念"></a>1.3 核心理念</h3><blockquote><p><strong>好的流程比更强的模型更重要。人类掌舵，智能体执行。</strong></p></blockquote><p>AI 编程的核心不是让 AI 随意生成代码，而是通过<strong>结构化的流程约束</strong>和<strong>强制性的质量门禁</strong>，让 AI 的输出可控、可维护、可信赖。</p><hr><h2 id="二、技术栈"><a href="#二、技术栈" class="headerlink" title="二、技术栈"></a>二、技术栈</h2><h3 id="2-1-后端技术栈"><a href="#2-1-后端技术栈" class="headerlink" title="2.1 后端技术栈"></a>2.1 后端技术栈</h3><table><thead><tr><th>类别</th><th>技术</th><th>版本</th><th>说明</th></tr></thead><tbody><tr><td><strong>基础框架</strong></td><td>Spring Boot</td><td>2.5.x</td><td>Web 基础框架</td></tr><tr><td><strong>持久层</strong></td><td>MyBatis-Plus</td><td>3.5.x</td><td>ORM 框架</td></tr><tr><td><strong>数据库</strong></td><td>MySQL</td><td>5.7 / 8.0</td><td>关系型数据库</td></tr><tr><td><strong>缓存</strong></td><td>Redis</td><td>6.x</td><td>缓存层</td></tr><tr><td><strong>工具库</strong></td><td>Hutool / Lombok</td><td>最新稳定版</td><td>工具类</td></tr><tr><td><strong>API 文档</strong></td><td>Swagger (Knife4j)</td><td>4.x</td><td>接口文档</td></tr><tr><td><strong>构建工具</strong></td><td>Maven</td><td>3.8.x</td><td>项目构建</td></tr><tr><td><strong>JDK</strong></td><td>JDK</td><td>8</td><td>Java 运行时</td></tr></tbody></table><blockquote><p>⚠️ <strong>注意</strong>：本项目使用 <strong>JDK 8</strong>，部分 JDK 17+ 特性（如 record、sealed class）不可使用。</p></blockquote><h3 id="2-2-前端技术栈"><a href="#2-2-前端技术栈" class="headerlink" title="2.2 前端技术栈"></a>2.2 前端技术栈</h3><table><thead><tr><th>类别</th><th>技术</th><th>版本</th><th>说明</th></tr></thead><tbody><tr><td><strong>基础框架</strong></td><td>Vue</td><td>3.4+</td><td>前端框架</td></tr><tr><td><strong>UI 组件库</strong></td><td>Ant Design Vue</td><td>4.x</td><td>企业级 UI</td></tr><tr><td><strong>构建工具</strong></td><td>Vite</td><td>5.x</td><td>新一代构建工具</td></tr><tr><td><strong>路由</strong></td><td>Vue Router</td><td>4.x</td><td>前端路由</td></tr><tr><td><strong>状态管理</strong></td><td>Pinia</td><td>2.x</td><td>状态管理</td></tr><tr><td><strong>类型系统</strong></td><td>TypeScript</td><td>5.x</td><td>JavaScript 超集</td></tr><tr><td><strong>HTTP 客户端</strong></td><td>Axios</td><td>1.x</td><td>HTTP 请求</td></tr><tr><td><strong>图表</strong></td><td>ECharts</td><td>5.x</td><td>数据可视化</td></tr></tbody></table><h3 id="2-3-开发工具"><a href="#2-3-开发工具" class="headerlink" title="2.3 开发工具"></a>2.3 开发工具</h3><table><thead><tr><th>类别</th><th>工具</th><th>说明</th></tr></thead><tbody><tr><td><strong>AI 编程工具</strong></td><td>Claude Code</td><td>Anthropic 终端 AI 编程工具</td></tr><tr><td><strong>版本控制</strong></td><td>Git</td><td>代码版本管理</td></tr><tr><td><strong>后端 IDE</strong></td><td>IDEA / Eclipse</td><td>Java 开发 IDE</td></tr><tr><td><strong>前端 IDE</strong></td><td>VS Code</td><td>前端开发 IDE</td></tr><tr><td><strong>接口测试</strong></td><td>Apifox / Postman</td><td>API 测试工具</td></tr></tbody></table><hr><h2 id="三、项目架构"><a href="#三、项目架构" class="headerlink" title="三、项目架构"></a>三、项目架构</h2><h3 id="3-1-整体架构"><a href="#3-1-整体架构" class="headerlink" title="3.1 整体架构"></a>3.1 整体架构</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────────────────────────────────────────────────┐</span><br><span class="line">│                         用户层                               │</span><br><span class="line">│                   Web Browser / PC Client                    │</span><br><span class="line">└─────────────────────────┬───────────────────────────────────┘</span><br><span class="line">                          │ HTTPS</span><br><span class="line">┌─────────────────────────▼───────────────────────────────────┐</span><br><span class="line">│                        VBen Admin                          │</span><br><span class="line">│                    (Vue3 + Ant Design Vue)                  │</span><br><span class="line">│                                                            │</span><br><span class="line">│   ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │</span><br><span class="line">│   │  路由     │  │  状态     │  │  API     │  │  页面    │ │</span><br><span class="line">│   │ Router   │  │  Store   │  │  Service │  │ Views    │ │</span><br><span class="line">│   └──────────┘  └──────────┘  └──────────┘  └──────────┘ │</span><br><span class="line">└─────────────────────────┬───────────────────────────────────┘</span><br><span class="line">                          │ REST API / WebSocket</span><br><span class="line">┌─────────────────────────▼───────────────────────────────────┐</span><br><span class="line">│                       RuoYi 后端                           │</span><br><span class="line">│                   (Spring Boot 2.5 + JDK8)                  │</span><br><span class="line">│                                                            │</span><br><span class="line">│   ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │</span><br><span class="line">│   │Controller│  │ Service  │  │  Mapper  │  │  Domain  │ │</span><br><span class="line">│   └──────────┘  └──────────┘  └──────────┘  └──────────┘ │</span><br><span class="line">└─────────────────────────┬───────────────────────────────────┘</span><br><span class="line">                          │ JDBC</span><br><span class="line">┌─────────────────────────▼───────────────────────────────────┐</span><br><span class="line">│                      MySQL + Redis                         │</span><br><span class="line">│                  (数据库 + 缓存双层存储)                     │</span><br><span class="line">└─────────────────────────────────────────────────────────────┘</span><br></pre></td></tr></table></figure><h3 id="3-2-后端项目结构（RuoYi）"><a href="#3-2-后端项目结构（RuoYi）" class="headerlink" title="3.2 后端项目结构（RuoYi）"></a>3.2 后端项目结构（RuoYi）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">ruoyi/</span><br><span class="line">├── pom.xml                          # Maven 父 POM</span><br><span class="line">├── sql/                             # SQL 脚本</span><br><span class="line">│   ├── quartz.sql                   # 定时任务表</span><br><span class="line">│   └── ruoyi.sql                    # 核心业务表</span><br><span class="line">├── ruoyi-admin/                     # 管理后台模块</span><br><span class="line">│   └── src/main/java/</span><br><span class="line">│       └── com/ruoyi/</span><br><span class="line">│           ├── RuoYiApplication.java</span><br><span class="line">│           ├── config/              # 配置类</span><br><span class="line">│           │   ├── CorsConfig.java  # 跨域配置</span><br><span class="line">│           │   ├── WebConfig.java   # Web 配置</span><br><span class="line">│           │   └── RedisConfig.java # Redis 配置</span><br><span class="line">│           └── controller/          # 控制器层</span><br><span class="line">├── ruoyi-system/                    # 系统模块</span><br><span class="line">│   └── src/main/java/</span><br><span class="line">│       └── com/ruoyi/</span><br><span class="line">│           ├── entity/              # 实体类</span><br><span class="line">│           ├── service/             # 服务层</span><br><span class="line">│           ├── mapper/              # 持久层</span><br><span class="line">│           └── domain/              # 领域模型</span><br><span class="line">├── ruoyi-common/                   # 通用模块</span><br><span class="line">│   └── src/main/java/</span><br><span class="line">│       └── com/ruoyi/common/</span><br><span class="line">│           ├── core/                # 核心类（Result、AjaxResult）</span><br><span class="line">│           ├── exception/           # 异常处理</span><br><span class="line">│           ├── utils/              # 工具类</span><br><span class="line">│           ├── enums/              # 枚举类</span><br><span class="line">│           └── constant/            # 常量类</span><br><span class="line">├── ruoyi-framework/                 # 框架模块</span><br><span class="line">│   └── src/main/java/</span><br><span class="line">│       └── com/ruoyi/framework/</span><br><span class="line">│           ├── aspectj/             # 切面（日志、事务）</span><br><span class="line">│           ├── interceptor/         # 拦截器</span><br><span class="line">│           ├── security/            # 安全认证</span><br><span class="line">│           └── config/             # 框架配置</span><br><span class="line">└── ruoyi-quartz/                   # 定时任务模块</span><br></pre></td></tr></table></figure><p><strong>各模块职责说明</strong>：</p><table><thead><tr><th>模块</th><th>职责</th></tr></thead><tbody><tr><td>ruoyi-admin</td><td>提供 REST API 接口，接收前端请求</td></tr><tr><td>ruoyi-system</td><td>实现业务逻辑，包含 entity/mapper/service/controller</td></tr><tr><td>ruoyi-common</td><td>通用工具类、响应封装、异常处理</td></tr><tr><td>ruoyi-framework</td><td>框架级能力：认证、授权、日志、事务</td></tr><tr><td>ruoyi-quartz</td><td>定时任务调度</td></tr></tbody></table><h3 id="3-3-前端项目结构（VBen-Admin）"><a href="#3-3-前端项目结构（VBen-Admin）" class="headerlink" title="3.3 前端项目结构（VBen Admin）"></a>3.3 前端项目结构（VBen Admin）</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">vben-admin/</span><br><span class="line">├── src/</span><br><span class="line">│   ├── api/                         # API 接口层</span><br><span class="line">│   │   └── system/                  # 系统模块接口</span><br><span class="line">│   │       ├── user.ts              # 用户接口</span><br><span class="line">│   │       ├── role.ts              # 角色接口</span><br><span class="line">│   │       └── menu.ts               # 菜单接口</span><br><span class="line">│   │</span><br><span class="line">│   ├── components/                  # 组件层</span><br><span class="line">│   │   ├── Table/                   # 通用表格组件</span><br><span class="line">│   │   ├── Form/                    # 通用表单组件</span><br><span class="line">│   │   ├── Modal/                   # 通用弹窗组件</span><br><span class="line">│   │   └── Tree/                   # 通用树形组件</span><br><span class="line">│   │</span><br><span class="line">│   ├── enums/                       # 枚举定义</span><br><span class="line">│   │   └── index.ts</span><br><span class="line">│   │</span><br><span class="line">│   ├── hooks/                       # 业务 Hooks</span><br><span class="line">│   │   ├── useUser.ts              # 用户信息 Hook</span><br><span class="line">│   │   ├── usePermissions.ts       # 权限 Hook</span><br><span class="line">│   │   └── useDict.ts              # 字典 Hook</span><br><span class="line">│   │</span><br><span class="line">│   ├── layouts/                     # 布局组件</span><br><span class="line">│   │   ├── default/index.vue        # 默认布局</span><br><span class="line">│   │   └── blank/index.vue          # 空白布局</span><br><span class="line">│   │</span><br><span class="line">│   ├── locales/                    # 国际化</span><br><span class="line">│   │   ├── zh-CN.ts</span><br><span class="line">│   │   └── en-US.ts</span><br><span class="line">│   │</span><br><span class="line">│   ├── router/                      # 路由</span><br><span class="line">│   │   ├── index.ts                 # 路由入口</span><br><span class="line">│   │   └── routes/                  # 路由配置</span><br><span class="line">│   │       ├── modules/</span><br><span class="line">│   │       │   ├── system.ts       # 系统模块路由</span><br><span class="line">│   │       │   └── monitor.ts      # 监控模块路由</span><br><span class="line">│   │       └── index.ts</span><br><span class="line">│   │</span><br><span class="line">│   ├── store/                       # 状态管理</span><br><span class="line">│   │   └── modules/</span><br><span class="line">│   │       ├── user.ts             # 用户状态</span><br><span class="line">│   │       ├── router.ts           # 路由缓存</span><br><span class="line">│   │       └── lockscreen.ts       # 锁屏状态</span><br><span class="line">│   │</span><br><span class="line">│   ├── utils/                       # 工具函数</span><br><span class="line">│   │   ├── request.ts              # Axios 封装</span><br><span class="line">│   │   ├── dict.ts                # 字典工具</span><br><span class="line">│   │   └── routeHelpers.ts        # 路由助手</span><br><span class="line">│   │</span><br><span class="line">│   ├── views/                       # 页面层</span><br><span class="line">│   │   └── system/                  # 系统模块</span><br><span class="line">│   │       ├── user/</span><br><span class="line">│   │       │   ├── index.vue       # 用户列表页</span><br><span class="line">│   │       │   └── components/    # 用户模块专属组件</span><br><span class="line">│   │       │       ├── UserForm.vue</span><br><span class="line">│   │       │       └── UserDetail.vue</span><br><span class="line">│   │       └── role/</span><br><span class="line">│   │           ├── index.vue</span><br><span class="line">│   │           └── components/</span><br><span class="line">│   │</span><br><span class="line">│   ├── App.vue</span><br><span class="line">│   └── main.ts</span><br><span class="line">│</span><br><span class="line">├── types/                          # 全局类型定义</span><br><span class="line">│   ├── index.d.ts</span><br><span class="line">│   └── shims-vue.d.ts</span><br><span class="line">│</span><br><span class="line">├── vite.config.ts                  # Vite 配置</span><br><span class="line">├── tsconfig.json                   # TypeScript 配置</span><br><span class="line">└── package.json</span><br></pre></td></tr></table></figure><h3 id="3-4-前后端协作规范"><a href="#3-4-前后端协作规范" class="headerlink" title="3.4 前后端协作规范"></a>3.4 前后端协作规范</h3><h4 id="接口规范"><a href="#接口规范" class="headerlink" title="接口规范"></a>接口规范</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">基础路径：http://&#123;host&#125;:&#123;port&#125;/prod-api</span><br><span class="line"></span><br><span class="line">响应格式：</span><br><span class="line">&#123;</span><br><span class="line">  &quot;code&quot;: 200,        // 业务状态码（200=成功）</span><br><span class="line">  &quot;msg&quot;: &quot;操作成功&quot;,   // 消息</span><br><span class="line">  &quot;data&quot;: &#123; ... &#125;      // 数据体</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">分页响应：</span><br><span class="line">&#123;</span><br><span class="line">  &quot;code&quot;: 200,</span><br><span class="line">  &quot;msg&quot;: &quot;查询成功&quot;,</span><br><span class="line">  &quot;data&quot;: &#123;</span><br><span class="line">    &quot;rows&quot;: [...],     // 数据列表</span><br><span class="line">    &quot;total&quot;: 100,     // 总记录数</span><br><span class="line">    &quot;pageNum&quot;: 1,     // 页码</span><br><span class="line">    &quot;pageSize&quot;: 10    // 每页条数</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="目录对应关系"><a href="#目录对应关系" class="headerlink" title="目录对应关系"></a>目录对应关系</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">前端 views          对应后端 Controller</span><br><span class="line">api/xxx.ts          →    xxxController</span><br><span class="line">                      ↓</span><br><span class="line">components/xxx     对应后端 Service</span><br><span class="line">                      ↓</span><br><span class="line">hooks/useXxx       对应后端 Mapper</span><br><span class="line">                      ↓</span><br><span class="line">utils/xxx          对应后端 Domain/Entity</span><br></pre></td></tr></table></figure><hr><h2 id="四、全局-Skills-使用手册"><a href="#四、全局-Skills-使用手册" class="headerlink" title="四、全局 Skills 使用手册"></a>四、全局 Skills 使用手册</h2><h3 id="4-1-概述"><a href="#4-1-概述" class="headerlink" title="4.1 概述"></a>4.1 概述</h3><p><strong>全局 Skills</strong> 安装在 <code>~/.claude/skills/</code>，所有项目共享。适用于通用流程、团队规范、文档处理等跨项目能力。</p><p><strong>安装模式</strong>：</p><table><thead><tr><th>模式</th><th>命令</th><th>说明</th></tr></thead><tbody><tr><td><strong>市场安装</strong></td><td><code>claude /plugin marketplace add &lt;marketplace&gt;</code></td><td>添加市场源</td></tr><tr><td><strong>技能安装</strong></td><td><code>claude /plugin install &lt;skill&gt;@&lt;marketplace&gt;</code></td><td>从市场安装技能</td></tr></tbody></table><p><strong>常用市场源</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Anthropic 官方市场</span></span><br><span class="line">claude /plugin marketplace add anthropic/skills</span><br><span class="line"></span><br><span class="line"><span class="comment"># Superpowers 市场</span></span><br><span class="line">claude /plugin marketplace add obra/superpowers-marketplace</span><br><span class="line"></span><br><span class="line"><span class="comment"># Vercel Labs 市场</span></span><br><span class="line">claude /plugin marketplace add vercel-labs/agent-skills</span><br><span class="line"></span><br><span class="line"><span class="comment"># daymade 工具集市场</span></span><br><span class="line">claude /plugin marketplace add daymade/claude-code-skills</span><br><span class="line"></span><br><span class="line"><span class="comment"># Trail of Bits 安全市场</span></span><br><span class="line">claude /plugin marketplace add trailofbits/claude-skills</span><br></pre></td></tr></table></figure><h3 id="4-2-核心流程类-Skills"><a href="#4-2-核心流程类-Skills" class="headerlink" title="4.2 核心流程类 Skills"></a>4.2 核心流程类 Skills</h3><h4 id="4-2-1-superpowers-—-AI-编程框架（强制-TDD-工程流程）"><a href="#4-2-1-superpowers-—-AI-编程框架（强制-TDD-工程流程）" class="headerlink" title="4.2.1 superpowers — AI 编程框架（强制 TDD + 工程流程）"></a>4.2.1 superpowers — AI 编程框架（强制 TDD + 工程流程）</h4><p><strong>来源</strong>：obra/superpowers-marketplace</p><p><strong>核心定位</strong>：将 Claude Code 从”代码生成器”升级为”遵循最佳实践的软件工程伙伴”。</p><p><strong>强制流程</strong>：<code>Brainstorm → Write Plan → Execute Plan → Review → Archive</code></p><p><strong>TDD 铁律</strong>：不写测试不执行。先写 RED（失败测试）→ GREEN（最小代码通过）→ REFACTOR（重构）。</p><p><strong>Skills 列表</strong>：</p><table><thead><tr><th>Skill</th><th>命令</th><th>功能</th></tr></thead><tbody><tr><td>superpower:init</td><td><code>/superpower:init</code></td><td>创建 Git Worktree + 新分支</td></tr><tr><td>superpower:write-plan</td><td><code>/superpower:write-plan</code></td><td>拆解任务为 2-5 分钟粒度</td></tr><tr><td>superpower:execute-plan</td><td><code>/superpower:execute-plan</code></td><td>强制 TDD 执行</td></tr><tr><td>superpower:review</td><td><code>/superpower:review</code></td><td>代码审查（安全性/性能/可维护性）</td></tr><tr><td>superpower:archive</td><td><code>/superpower:archive</code></td><td>合并 Worktree，清理分支</td></tr></tbody></table><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">用户：帮我实现用户管理模块的删除功能</span><br><span class="line"></span><br><span class="line">/superpower:write-plan</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## 用户删除功能执行计划</span><br><span class="line"></span><br><span class="line">  任务分解（每任务 2-5min）：</span><br><span class="line">  1. [x] 创建删除接口 DELETE /api/user/&#123;id&#125; (3min)</span><br><span class="line">  2. [x] 实现逻辑删除（status=2） (3min)</span><br><span class="line">  3. [x] 编写单元测试（正常删除、ID不存在）(5min)</span><br><span class="line">  4. [x] 编写集成测试（关联数据检查）(5min)</span><br><span class="line">  5. [x] Code Review (5min)</span><br><span class="line"></span><br><span class="line">  依赖关系：</span><br><span class="line">  - 任务1 → 任务2（依赖接口定义）</span><br><span class="line">  - 任务3 → 任务4（依赖 Service 实现）</span><br><span class="line"></span><br><span class="line">  请确认计划，我将按 TDD 流程执行。</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">/superpower:execute-plan</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ❌ 拒绝执行 — 未遵循 TDD</span><br><span class="line"></span><br><span class="line">  请按以下顺序执行：</span><br><span class="line">  1. 先写单元测试（RED）</span><br><span class="line">  2. 运行测试确认失败</span><br><span class="line">  3. 我将编写最小实现（GREEN）</span><br><span class="line">  4. 重构代码（REFACTOR）</span><br><span class="line"></span><br><span class="line">  请继续，先写测试。</span><br></pre></td></tr></table></figure><hr><h4 id="4-2-2-openspec-—-需求澄清与规格文档"><a href="#4-2-2-openspec-—-需求澄清与规格文档" class="headerlink" title="4.2.2 openspec — 需求澄清与规格文档"></a>4.2.2 openspec — 需求澄清与规格文档</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>核心定位</strong>：在写代码之前先理解”要做什么”。</p><p><strong>Skills 列表</strong>：</p><table><thead><tr><th>Skill</th><th>命令</th><th>功能</th></tr></thead><tbody><tr><td>openspec:brainstorm</td><td><code>/openspec:brainstorm</code></td><td>苏格拉底式需求澄清</td></tr><tr><td>openspec:write-spec</td><td><code>/openspec:write-spec</code></td><td>生成 SPEC.md 规格文档</td></tr></tbody></table><p><strong>openspec:brainstorm 使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">用户：实现一个订单模块</span><br><span class="line"></span><br><span class="line">/openspec:brainstorm</span><br><span class="line"></span><br><span class="line">Claude（提问式澄清）：</span><br><span class="line">  我需要澄清几个问题：</span><br><span class="line"></span><br><span class="line">  1. 订单来源：是内部系统下单还是对外开放？</span><br><span class="line">  2. 支付流程：是否需要对接支付网关？支持哪些支付方式？</span><br><span class="line">  3. 库存扣减：下单即扣库存还是付款后扣库存？</span><br><span class="line">  4. 优惠叠加：是否支持优惠券、满减、折扣叠加？</span><br><span class="line">  5. 订单状态：有哪些状态？状态流转规则？</span><br><span class="line">  6. 售后规则：支持多久内退款？是否支持部分退款？</span><br><span class="line">  7. 履约方式：快递配送 / 到店自提 / 同城配送？</span><br><span class="line"></span><br><span class="line">  请明确以上需求，我将整理成规格文档。</span><br></pre></td></tr></table></figure><p><strong>openspec:write-spec 输出格式</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 订单模块规格文档</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 1. 需求澄清</span></span><br><span class="line"><span class="bullet">-</span> [x] 支持微信/支付宝支付</span><br><span class="line"><span class="bullet">-</span> [x] 下单即扣库存</span><br><span class="line"><span class="bullet">-</span> [x] 订单状态：待支付→已支付→已发货→已完成/已取消</span><br><span class="line"></span><br><span class="line"><span class="section">## 2. API 接口</span></span><br><span class="line">| 方法 | 路径                   | 说明         |</span><br><span class="line">| ---- | ---------------------- | ------------ |</span><br><span class="line">| POST | /api/order/create      | 创建订单     |</span><br><span class="line">| GET  | /api/order/&#123;id&#125;        | 查询订单详情 |</span><br><span class="line">| PUT  | /api/order/cancel/&#123;id&#125; | 取消订单     |</span><br><span class="line">| POST | /api/order/pay         | 支付订单     |</span><br><span class="line"></span><br><span class="line"><span class="section">## 3. 前端页面</span></span><br><span class="line"><span class="bullet">-</span> /views/order/index.vue — 订单列表</span><br><span class="line"><span class="bullet">-</span> /views/order/detail.vue — 订单详情</span><br><span class="line"></span><br><span class="line"><span class="section">## 4. 数据库设计</span></span><br><span class="line"><span class="bullet">-</span> 表：ord<span class="emphasis">_order（订单主表）</span></span><br><span class="line"><span class="emphasis">- 表：ord_</span>order<span class="emphasis">_item（订单明细表）</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 5. 测试用例</span></span><br><span class="line"><span class="emphasis">- [ ] 正常创建订单</span></span><br><span class="line"><span class="emphasis">- [ ] 库存不足</span></span><br><span class="line"><span class="emphasis">- [ ] 订单超时自动取消</span></span><br><span class="line"><span class="emphasis">- [ ] 支付回调</span></span><br></pre></td></tr></table></figure><hr><h4 id="4-2-3-planning-with-files-—-基于项目文件的结构化规划"><a href="#4-2-3-planning-with-files-—-基于项目文件的结构化规划" class="headerlink" title="4.2.3 planning-with-files — 基于项目文件的结构化规划"></a>4.2.3 planning-with-files — 基于项目文件的结构化规划</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>核心定位</strong>：读取项目现有代码结构，基于真实上下文规划，避免 AI 凭空生成与现有架构冲突的代码。</p><p><strong>命令</strong>：<code>/planning-with-files</code> 或 <code>/plan-with-files</code></p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">用户：帮我规划一个新的商品分类模块</span><br><span class="line"></span><br><span class="line">/planning-with-files</span><br><span class="line"></span><br><span class="line">Claude（读取项目结构后）：</span><br><span class="line">  检测到现有模块：user, role, menu, order</span><br><span class="line">  检测到现有架构：Controller-Service-Mapper 三层</span><br><span class="line"></span><br><span class="line">  ## 商品分类模块规划</span><br><span class="line"></span><br><span class="line">  ### 文件结构（遵循现有架构）</span><br><span class="line">  src/main/java/com.ruoyi/product/</span><br><span class="line">  ├── controller/CategoryController.java</span><br><span class="line">  ├── service/ICategoryService.java</span><br><span class="line">  ├── service/impl/CategoryServiceImpl.java</span><br><span class="line">  ├── mapper/CategoryMapper.java</span><br><span class="line">  └── domain/Category.java</span><br><span class="line"></span><br><span class="line">  ### 树形结构设计</span><br><span class="line">  - 自关联：parent_id 指向自身</span><br><span class="line">  - 支持无限层级</span><br><span class="line">  - 按层级排序（sort 字段）</span><br><span class="line"></span><br><span class="line">  ### 任务分解</span><br><span class="line">  1. 创建分类实体（含树形结构字段）(3min)</span><br><span class="line">  2. 创建 Mapper（支持树形查询）(5min)</span><br><span class="line">  3. 创建 Service（递归查询实现）(5min)</span><br><span class="line">  4. 创建 Controller（CRUD + 树形接口）(5min)</span><br><span class="line">  5. 前端：分类树组件 + API (10min)</span><br><span class="line">  6. 单元测试 (5min)</span><br><span class="line"></span><br><span class="line">  ### 注意事项</span><br><span class="line">  - 删除分类需检查是否有子分类或关联商品</span><br><span class="line">  - 树形查询使用 MyBatis-Plus 的 tree 语法</span><br></pre></td></tr></table></figure><hr><h3 id="4-3-质量保障类-Skills"><a href="#4-3-质量保障类-Skills" class="headerlink" title="4.3 质量保障类 Skills"></a>4.3 质量保障类 Skills</h3><h4 id="4-3-1-code-review-—-代码审查"><a href="#4-3-1-code-review-—-代码审查" class="headerlink" title="4.3.1 code-review — 代码审查"></a>4.3.1 code-review — 代码审查</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/code-review</code> 或 <code>/review-code</code></p><p><strong>审查维度</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## code-review 审查清单</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 安全性（Security）</span></span><br><span class="line"><span class="bullet">-</span> [ ] SQL 注入：是否使用 #&#123;&#125; 而非 $&#123;&#125;？</span><br><span class="line"><span class="bullet">-</span> [ ] XSS：用户输入是否转义？</span><br><span class="line"><span class="bullet">-</span> [ ] 权限校验：是否有 @RequiresPermissions？</span><br><span class="line"><span class="bullet">-</span> [ ] 敏感信息：是否硬编码密码/密钥？</span><br><span class="line"><span class="bullet">-</span> [ ] 越权访问：是否校验数据归属？</span><br><span class="line"></span><br><span class="line"><span class="section">### 性能（Performance）</span></span><br><span class="line"><span class="bullet">-</span> [ ] N+1 查询：是否使用联表或批量查询？</span><br><span class="line"><span class="bullet">-</span> [ ] 索引：查询字段是否有索引覆盖？</span><br><span class="line"><span class="bullet">-</span> [ ] 大数据：是否使用分页？</span><br><span class="line"><span class="bullet">-</span> [ ] 缓存：热点数据是否缓存？</span><br><span class="line"></span><br><span class="line"><span class="section">### 可维护性（Maintainability）</span></span><br><span class="line"><span class="bullet">-</span> [ ] 命名规范：是否符合团队命名约定？</span><br><span class="line"><span class="bullet">-</span> [ ] 方法长度：是否过长（&gt;80行）？</span><br><span class="line"><span class="bullet">-</span> [ ] 重复代码：是否提取公共方法？</span><br><span class="line"><span class="bullet">-</span> [ ] 注释完整：复杂逻辑是否注释？</span><br><span class="line"></span><br><span class="line"><span class="section">### 可测试性（Testability）</span></span><br><span class="line"><span class="bullet">-</span> [ ] 单元测试：是否有覆盖？</span><br><span class="line"><span class="bullet">-</span> [ ] 依赖注入：是否违反 DI 原则？</span><br><span class="line"><span class="bullet">-</span> [ ] 硬编码：配置是否外置？</span><br></pre></td></tr></table></figure><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">用户：Review 一下这个方法</span><br><span class="line"></span><br><span class="line">/code-review</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## 代码审查报告</span><br><span class="line"></span><br><span class="line">  文件：OrderServiceImpl.java:45-86</span><br><span class="line"></span><br><span class="line">  ⚠️ SQL 注入风险</span><br><span class="line">  [Line 52] 发现 $&#123;status&#125; 直接拼接</span><br><span class="line">  建议：改为 #&#123;status&#125;</span><br><span class="line"></span><br><span class="line">  ⚠️ N+1 查询</span><br><span class="line">  [Line 68] 循环内查询用户信息</span><br><span class="line">  建议：批量查询后 Map 缓存</span><br><span class="line"></span><br><span class="line">  ⚠️ 方法过长</span><br><span class="line">  [Line 45-86] 方法 86 行，建议拆分为：</span><br><span class="line">  - validateOrder() 校验</span><br><span class="line">  - calculatePrice() 计算价格</span><br><span class="line">  - createOrder() 创建订单</span><br><span class="line"></span><br><span class="line">  ⚠️ 缺少日志</span><br><span class="line">  [Line 75] 关键操作未记录日志</span><br><span class="line">  建议：添加 log.info(&quot;创建订单: &#123;&#125;&quot;, orderId)</span><br><span class="line"></span><br><span class="line">  ✅ 优点</span><br><span class="line">  - 使用了 @Transactional 事务控制</span><br><span class="line">  - 异常处理规范</span><br></pre></td></tr></table></figure><hr><h4 id="4-3-2-web-design-guidelines-—-Web-设计规范检查"><a href="#4-3-2-web-design-guidelines-—-Web-设计规范检查" class="headerlink" title="4.3.2 web-design-guidelines — Web 设计规范检查"></a>4.3.2 web-design-guidelines — Web 设计规范检查</h4><p><strong>来源</strong>：vercel-labs/agent-skills</p><p><strong>命令</strong>：<code>/web-design-guidelines</code> 或 <code>/audit-design</code></p><p><strong>功能</strong>：根据 Vercel Web Interface Guidelines 检查 HTML/CSS/组件的可用性、可访问性、UI 一致性。</p><p><strong>安装</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx skills add https://github.com/vercel-labs/agent-skills --skill web-design-guidelines</span><br></pre></td></tr></table></figure><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">用户：检查登录页面的设计规范</span><br><span class="line"></span><br><span class="line">/web-design-guidelines</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## 设计规范审查报告</span><br><span class="line"></span><br><span class="line">  ❌ 可访问性</span><br><span class="line">  - [Line 15] 按钮缺少 aria-label</span><br><span class="line">  - [Line 23] 输入框缺少 id/for 关联</span><br><span class="line">  - [Line 45] 图片缺少 alt 属性</span><br><span class="line"></span><br><span class="line">  ❌ UI 一致性</span><br><span class="line">  - [Line 30] 输入框高度 40px，设计稿 36px</span><br><span class="line">  - [Line 55] 按钮圆角 8px，其他 4px</span><br><span class="line"></span><br><span class="line">  ✅ 符合规范</span><br><span class="line">  - 颜色对比度 4.5:1 ✓</span><br><span class="line">  - 焦点样式可见 ✓</span><br><span class="line">  - 响应式断点正确 ✓</span><br></pre></td></tr></table></figure><hr><h3 id="4-4-前端开发类-Skills"><a href="#4-4-前端开发类-Skills" class="headerlink" title="4.4 前端开发类 Skills"></a>4.4 前端开发类 Skills</h3><h4 id="4-4-1-ui-ux-pro-max-—-AI-原生-UI-设计"><a href="#4-4-1-ui-ux-pro-max-—-AI-原生-UI-设计" class="headerlink" title="4.4.1 ui-ux-pro-max — AI 原生 UI 设计"></a>4.4.1 ui-ux-pro-max — AI 原生 UI 设计</h4><p><strong>来源</strong>：NextLevelBuilder/ui-ux-pro-max-skill</p><p><strong>命令</strong>：<code>/ui-ux-pro-max</code> 或 <code>/design-ui</code></p><p><strong>功能</strong>：生成 AI 原生风格的 UI 组件设计，支持 Ant Design Vue / Element Plus / Tailwind CSS。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">用户：设计一个数据统计仪表盘页面</span><br><span class="line"></span><br><span class="line">/ui-ux-pro-max</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## 仪表盘设计方案</span><br><span class="line"></span><br><span class="line">  布局结构：</span><br><span class="line">  ┌────────────────────────────────────────┐</span><br><span class="line">  │  标题栏  时间筛选  刷新按钮              │</span><br><span class="line">  ├───────┬───────┬───────┬────────────────┤</span><br><span class="line">  │ 今日订单│ 今日收入│ 新增用户│ 访问量        │</span><br><span class="line">  │ 1,234  │ ¥56,780│  89    │  98%          │</span><br><span class="line">  ├───────┴───────┴───────┴────────────────┤</span><br><span class="line">  │           趋势图表（ECharts）            │</span><br><span class="line">  ├─────────────────────┬──────────────────┤</span><br><span class="line">  │     TOP商品排行      │    用户分布       │</span><br><span class="line">  └─────────────────────┴──────────────────┘</span><br><span class="line"></span><br><span class="line">  技术选型：</span><br><span class="line">  - Vue 3 Composition API</span><br><span class="line">  - Ant Design Vue 组件（a-card, a-statistic）</span><br><span class="line">  - ECharts 图表（line + bar）</span><br><span class="line">  - CSS Grid 布局</span><br><span class="line"></span><br><span class="line">  是否需要生成代码？</span><br></pre></td></tr></table></figure><hr><h4 id="4-4-2-frontend-design-—-前端最佳实践"><a href="#4-4-2-frontend-design-—-前端最佳实践" class="headerlink" title="4.4.2 frontend-design — 前端最佳实践"></a>4.4.2 frontend-design — 前端最佳实践</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/frontend-design</code> 或 <code>/fe-design</code></p><p><strong>功能</strong>：Vue/React 前端开发最佳实践指导、组件审查、TypeScript 类型建议。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">用户：帮我审查这个 Vue 组件</span><br><span class="line"></span><br><span class="line">/frontend-design</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## Vue 组件审查</span><br><span class="line"></span><br><span class="line">  ⚠️ 问题</span><br><span class="line">  1. props 缺少 TypeScript 类型定义</span><br><span class="line">  2. 未使用 defineModel（Vue 3.4+）</span><br><span class="line">  3. 存在重复计算未缓存（未用 computed）</span><br><span class="line">  4. 缺少 ErrorBoundary</span><br><span class="line"></span><br><span class="line">  ✅ 符合最佳实践</span><br><span class="line">  - 使用了 Composition API ✓</span><br><span class="line">  - 样式 scoped 隔离 ✓</span><br><span class="line">  - 组件单一职责 ✓</span><br><span class="line"></span><br><span class="line">  优化建议：</span><br><span class="line">  - 使用 shallowRef 优化大数组性能</span><br><span class="line">  - 添加 defineEmits 替代 $emit</span><br><span class="line">  - 使用 useVirtualList 处理长列表</span><br></pre></td></tr></table></figure><hr><h4 id="4-4-3-webapp-testing-—-Playwright-自动化测试"><a href="#4-4-3-webapp-testing-—-Playwright-自动化测试" class="headerlink" title="4.4.3 webapp-testing — Playwright 自动化测试"></a>4.4.3 webapp-testing — Playwright 自动化测试</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/webapp-testing</code> 或 <code>/test-webapp</code></p><p><strong>功能</strong>：基于 Playwright 的 Web 应用 UI 自动化测试，支持截图对比、日志捕获、服务器生命周期管理。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">用户：测试登录功能</span><br><span class="line"></span><br><span class="line">/webapp-testing</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## 测试计划</span><br><span class="line"></span><br><span class="line">  场景1：正常登录</span><br><span class="line">  1. 访问 /login</span><br><span class="line">  2. 输入用户名 admin</span><br><span class="line">  3. 输入密码 admin123</span><br><span class="line">  4. 点击登录</span><br><span class="line">  5. 验证跳转 /dashboard</span><br><span class="line">  6. 截图</span><br><span class="line"></span><br><span class="line">  场景2：密码错误</span><br><span class="line">  1. 输入错误密码</span><br><span class="line">  2. 验证错误提示</span><br><span class="line">  3. 截图</span><br><span class="line"></span><br><span class="line">  执行中...</span><br><span class="line">  ✅ 场景1 通过</span><br><span class="line">  ✅ 场景2 通过</span><br><span class="line"></span><br><span class="line">  报告：/tmp/webapp-testing-report.html</span><br></pre></td></tr></table></figure><hr><h3 id="4-5-文档处理类-Skills"><a href="#4-5-文档处理类-Skills" class="headerlink" title="4.5 文档处理类 Skills"></a>4.5 文档处理类 Skills</h3><h4 id="4-5-1-pdf-—-PDF-处理"><a href="#4-5-1-pdf-—-PDF-处理" class="headerlink" title="4.5.1 pdf — PDF 处理"></a>4.5.1 pdf — PDF 处理</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/pdf</code></p><p><strong>功能</strong>：读取 PDF 内容、提取文本、生成 PDF。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">用户：从需求文档 PDF 中提取第 3-5 章内容</span><br><span class="line"></span><br><span class="line">/pdf extract --pages 3-5</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  已读取 3 页内容：</span><br><span class="line"></span><br><span class="line">  ## 第三章 功能需求</span><br><span class="line">  3.1 用户管理模块...</span><br><span class="line">  3.2 订单管理模块...</span><br><span class="line"></span><br><span class="line">  是否需要我基于此生成开发文档？</span><br></pre></td></tr></table></figure><hr><h4 id="4-5-2-word-docx-—-Word-文档处理"><a href="#4-5-2-word-docx-—-Word-文档处理" class="headerlink" title="4.5.2 word / docx — Word 文档处理"></a>4.5.2 word / docx — Word 文档处理</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/docx</code> 或 <code>/word</code></p><p><strong>功能</strong>：创建、编辑 Word 文档，支持跟踪修订、批注、格式化。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">用户：创建一个技术设计文档，包含项目概述、技术架构、接口设计三个章节</span><br><span class="line"></span><br><span class="line">/docx create</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  正在生成文档...</span><br><span class="line">  ✅ 技术设计文档.docx</span><br><span class="line"></span><br><span class="line">  结构：</span><br><span class="line">  1. 项目概述</span><br><span class="line">  2. 技术架构</span><br><span class="line">     2.1 系统架构图</span><br><span class="line">     2.2 技术选型</span><br><span class="line">  3. 接口设计</span><br><span class="line">     3.1 REST API 规范</span><br><span class="line">     3.2 接口列表</span><br></pre></td></tr></table></figure><hr><h4 id="4-5-3-pptx-—-PowerPoint-处理"><a href="#4-5-3-pptx-—-PowerPoint-处理" class="headerlink" title="4.5.3 pptx — PowerPoint 处理"></a>4.5.3 pptx — PowerPoint 处理</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/pptx</code> 或 <code>/powerpoint</code></p><p><strong>功能</strong>：创建、编辑 PPT，支持布局、母版、图表、动画。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">用户：创建项目周报 PPT，包含项目背景、进度、问题、下周计划</span><br><span class="line"></span><br><span class="line">/pptx create</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  正在创建演示文稿...</span><br><span class="line">  ✅ 项目周报.pptx</span><br><span class="line"></span><br><span class="line">  幻灯片结构：</span><br><span class="line">  Slide 1：封面（标题 + 日期 + 汇报人）</span><br><span class="line">  Slide 2：项目背景（目标 + 里程碑）</span><br><span class="line">  Slide 3：本周进度（60%，进度条）</span><br><span class="line">  Slide 4：存在问题（问题 1、问题 2）</span><br><span class="line">  Slide 5：下周计划（目标 + 风险提示）</span><br></pre></td></tr></table></figure><hr><h4 id="4-5-4-excel-xlsx-—-Excel-处理"><a href="#4-5-4-excel-xlsx-—-Excel-处理" class="headerlink" title="4.5.4 excel / xlsx — Excel 处理"></a>4.5.4 excel / xlsx — Excel 处理</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/xlsx</code> 或 <code>/excel</code></p><p><strong>功能</strong>：创建、编辑 Excel，支持公式、数据透视、图表可视化。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">用户：创建 Sprint 燃尽图，跟踪剩余任务点数</span><br><span class="line"></span><br><span class="line">/xlsx create</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  正在生成表格...</span><br><span class="line">  ✅ Sprint燃尽图.xlsx</span><br><span class="line"></span><br><span class="line">  包含：</span><br><span class="line">  - 原始数据表</span><br><span class="line">  - 理想曲线 vs 实际曲线</span><br><span class="line">  - 偏差分析</span><br><span class="line">  - 燃尽图图表</span><br></pre></td></tr></table></figure><hr><h3 id="4-6-工具扩展类-Skills"><a href="#4-6-工具扩展类-Skills" class="headerlink" title="4.6 工具扩展类 Skills"></a>4.6 工具扩展类 Skills</h3><h4 id="4-6-1-mcp-builder-—-构建-MCP-服务器"><a href="#4-6-1-mcp-builder-—-构建-MCP-服务器" class="headerlink" title="4.6.1 mcp-builder — 构建 MCP 服务器"></a>4.6.1 mcp-builder — 构建 MCP 服务器</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/mcp-builder</code> 或 <code>/build-mcp</code></p><p><strong>功能</strong>：构建 MCP（Model Context Protocol）服务器，扩展 Claude 的工具能力，对接内部系统 API。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">用户：构建一个 MCP 服务器连接内部订单系统</span><br><span class="line"></span><br><span class="line">/mcp-builder</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  第一步：确定用途</span><br><span class="line">  - 连接内部订单 API？✓</span><br><span class="line"></span><br><span class="line">  第二步：定义工具</span><br><span class="line">  请列出需要暴露的工具：</span><br><span class="line">  1. getOrder - 查询订单</span><br><span class="line">  2. createOrder - 创建订单</span><br><span class="line">  3. cancelOrder - 取消订单</span><br><span class="line"></span><br><span class="line">  正在生成 MCP 服务器...</span><br><span class="line">  ✅ 已生成：</span><br><span class="line">  - src/mcp-server.ts</span><br><span class="line">  - src/tools/order-tools.ts</span><br><span class="line">  - package.json</span><br><span class="line"></span><br><span class="line">  启动：npx @anthropic-ai/mcp-server run</span><br></pre></td></tr></table></figure><hr><h4 id="4-6-2-skill-creator-—-构建自定义-Skills"><a href="#4-6-2-skill-creator-—-构建自定义-Skills" class="headerlink" title="4.6.2 skill-creator — 构建自定义 Skills"></a>4.6.2 skill-creator — 构建自定义 Skills</h4><p><strong>来源</strong>：daymade/claude-code-skills</p><p><strong>命令</strong>：<code>/skill-creator</code> 或 <code>/create-skill</code></p><p><strong>功能</strong>：元技能，引导你完成自定义 Skill 的构建、验证和打包。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">用户：创建一个 RuoYi 专用的 gen-crud skill</span><br><span class="line"></span><br><span class="line">/skill-creator</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  欢迎使用 Skill Creator！</span><br><span class="line"></span><br><span class="line">  第一步：明确需求</span><br><span class="line">  描述你的 Skill 要解决什么问题？</span><br><span class="line"></span><br><span class="line">  用户：根据表结构生成 RuoYi CRUD 代码</span><br><span class="line"></span><br><span class="line">  第二步：定义输入输出</span><br><span class="line">  输入：表名 + 字段列表</span><br><span class="line">  输出：Controller + Service + Mapper + XML + 前端 API</span><br><span class="line"></span><br><span class="line">  第三步：生成 SKILL.md</span><br><span class="line">  ✅ 已生成</span><br><span class="line"></span><br><span class="line">  第四步：验证</span><br><span class="line">  请测试：/ruoyi:gen-crud</span><br><span class="line"></span><br><span class="line">  Skill 创建完成！</span><br></pre></td></tr></table></figure><hr><h4 id="4-6-3-ralph-loop-—-自主迭代循环"><a href="#4-6-3-ralph-loop-—-自主迭代循环" class="headerlink" title="4.6.3 ralph-loop — 自主迭代循环"></a>4.6.3 ralph-loop — 自主迭代循环</h4><p><strong>来源</strong>：社区（ralph 工具集）</p><p><strong>命令</strong>：<code>/ralph-loop</code> 或 <code>/loop</code></p><p><strong>功能</strong>：让 Claude 进入自主迭代循环，自动分解并执行任务，定期汇报，随时可中断。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">用户：用 ralph-loop 完成用户模块测试</span><br><span class="line"></span><br><span class="line">/ralph-loop</span><br><span class="line"></span><br><span class="line">Claude（自主模式）：</span><br><span class="line">  任务分解：</span><br><span class="line">  1. UserService 单元测试</span><br><span class="line">  2. UserService 集成测试</span><br><span class="line">  3. UserController API 测试</span><br><span class="line">  4. 生成测试报告</span><br><span class="line"></span><br><span class="line">  [执行中]</span><br><span class="line">  ✅ 任务1 - 15个用例</span><br><span class="line">  ✅ 任务2 - 8个用例</span><br><span class="line">  正在执行任务3...</span><br><span class="line">  [中断 - 等待确认]</span><br><span class="line"></span><br><span class="line">  用户：继续</span><br><span class="line">  ✅ 任务3 - 12个用例</span><br><span class="line">  ✅ 任务4 - 覆盖率85%</span><br><span class="line"></span><br><span class="line">  总计：35个测试，全部通过</span><br></pre></td></tr></table></figure><hr><h4 id="4-6-4-summarize-changes-—-代码变更总结"><a href="#4-6-4-summarize-changes-—-代码变更总结" class="headerlink" title="4.6.4 summarize-changes — 代码变更总结"></a>4.6.4 summarize-changes — 代码变更总结</h4><p><strong>来源</strong>：Anthropic 官方市场</p><p><strong>命令</strong>：<code>/summarize-changes</code></p><p><strong>功能</strong>：自动总结 Git 提交/分支/PR 的代码变更。</p><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">用户：总结这个 PR 的变更</span><br><span class="line"></span><br><span class="line">/summarize-changes</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ## PR #123: 用户认证模块重构</span><br><span class="line"></span><br><span class="line">  ### 变更概述</span><br><span class="line">  从 Session 迁移到 JWT，优化权限控制逻辑。</span><br><span class="line"></span><br><span class="line">  ### 主要变更</span><br><span class="line">  1. 新增 JwtService（Token 生成/验证）</span><br><span class="line">  2. 重构 SecurityFilter</span><br><span class="line">  3. 新增 RefreshToken 机制</span><br><span class="line">  4. 移除旧 Session 代码</span><br><span class="line"></span><br><span class="line">  ### 统计</span><br><span class="line">  +486 / -213 行</span><br><span class="line">  新增文件：5 | 修改：12 | 删除：3</span><br><span class="line"></span><br><span class="line">  ### 风险</span><br><span class="line">  中等 — 建议回归测试登录流程</span><br></pre></td></tr></table></figure><hr><h3 id="4-7-全局-Skills-速查表"><a href="#4-7-全局-Skills-速查表" class="headerlink" title="4.7 全局 Skills 速查表"></a>4.7 全局 Skills 速查表</h3><table><thead><tr><th>Skill</th><th>命令</th><th>分类</th><th>功能</th></tr></thead><tbody><tr><td>superpowers</td><td><code>/superpower:xxx</code></td><td>核心流程</td><td>TDD + 工程流程框架</td></tr><tr><td>openspec</td><td><code>/openspec:xxx</code></td><td>核心流程</td><td>需求澄清 + 规格文档</td></tr><tr><td>planning-with-files</td><td><code>/plan-with-files</code></td><td>核心流程</td><td>基于文件的结构化规划</td></tr><tr><td>code-review</td><td><code>/code-review</code></td><td>质量保障</td><td>代码审查</td></tr><tr><td>web-design-guidelines</td><td><code>/web-design-guidelines</code></td><td>质量保障</td><td>UI 规范检查</td></tr><tr><td>ui-ux-pro-max</td><td><code>/ui-ux-pro-max</code></td><td>前端开发</td><td>AI UI 设计</td></tr><tr><td>frontend-design</td><td><code>/frontend-design</code></td><td>前端开发</td><td>前端最佳实践</td></tr><tr><td>webapp-testing</td><td><code>/webapp-testing</code></td><td>前端开发</td><td>Playwright UI 测试</td></tr><tr><td>pdf</td><td><code>/pdf</code></td><td>文档处理</td><td>PDF 读写</td></tr><tr><td>word</td><td><code>/docx</code></td><td>文档处理</td><td>Word 文档</td></tr><tr><td>pptx</td><td><code>/pptx</code></td><td>文档处理</td><td>PowerPoint</td></tr><tr><td>excel</td><td><code>/xlsx</code></td><td>文档处理</td><td>Excel 表格</td></tr><tr><td>mcp-builder</td><td><code>/mcp-builder</code></td><td>工具扩展</td><td>MCP 服务器构建</td></tr><tr><td>skill-creator</td><td><code>/skill-creator</code></td><td>工具扩展</td><td>自定义 Skill</td></tr><tr><td>ralph-loop</td><td><code>/ralph-loop</code></td><td>工具扩展</td><td>自主迭代循环</td></tr><tr><td>summarize-changes</td><td><code>/summarize-changes</code></td><td>工具扩展</td><td>变更总结</td></tr></tbody></table><hr><h2 id="五、项目-Skills-使用手册"><a href="#五、项目-Skills-使用手册" class="headerlink" title="五、项目 Skills 使用手册"></a>五、项目 Skills 使用手册</h2><h3 id="5-1-概述"><a href="#5-1-概述" class="headerlink" title="5.1 概述"></a>5.1 概述</h3><p><strong>项目 Skills</strong> 安装在 <code>&#123;项目根目录&#125;/.claude/skills/</code>，仅对当前项目生效。适用于业务定制代码生成、测试辅助、部署脚本等项目特定能力。</p><p><strong>目录结构</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">.claude/                        # 项目 Claude 配置根目录</span><br><span class="line">├── CLAUDE.md                  # 项目说明文档（重要！）</span><br><span class="line">├── skills/                    # 项目特定 Skills</span><br><span class="line">│   ├── ruoyi-gen-crud/        # RuoYi CRUD 生成</span><br><span class="line">│   ├── api-test-helper/        # API 测试辅助</span><br><span class="line">│   └── custom-workflows/       # 自定义工作流</span><br><span class="line">└── commands/                  # 自定义命令</span><br><span class="line">    └── gen-crud.sh</span><br></pre></td></tr></table></figure><blockquote><p>⚠️ <strong>CLAUDE.md 是核心</strong>：Claude Code 每次会话开始时会自动读取 CLAUDE.md，这是向 AI 传递项目上下文的关键文件。</p></blockquote><h3 id="5-2-RuoYi-CRUD-生成-Skill"><a href="#5-2-RuoYi-CRUD-生成-Skill" class="headerlink" title="5.2 RuoYi CRUD 生成 Skill"></a>5.2 RuoYi CRUD 生成 Skill</h3><h4 id="5-2-1-ruoyi-gen-crud"><a href="#5-2-1-ruoyi-gen-crud" class="headerlink" title="5.2.1 ruoyi-gen-crud"></a>5.2.1 ruoyi-gen-crud</h4><p><strong>安装位置</strong>：<code>.claude/skills/ruoyi-gen-crud/SKILL.md</code></p><p><strong>功能</strong>：根据数据库表结构，生成完整的 RuoYi 四层架构代码。</p><p><strong>输入</strong>：表名 + 字段列表</p><p><strong>输出</strong>：</p><ul><li><code>domain/xxx.java</code> — 实体类</li><li><code>mapper/xxxMapper.java</code> — Mapper 接口</li><li><code>mapper/xxxMapper.xml</code> — MyBatis XML</li><li><code>service/IxxxService.java</code> — Service 接口</li><li><code>service/impl/xxxServiceImpl.java</code> — Service 实现</li><li><code>controller/xxxController.java</code> — Controller</li><li><code>vue/api/xxx.ts</code> — 前端 API 调用</li><li><code>vue/views/xxx/index.vue</code> — 前端列表页</li><li><code>vue/views/xxx/components/xxxForm.vue</code> — 前端表单</li></ul><p><strong>SKILL.md 示例</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: ruoyi-gen-crud</span><br><span class="line"><span class="section">description: RuoYi 框架专用 CRUD 代码生成 — 输入表名和字段列表，生成完整四层架构代码</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># RuoYi CRUD 生成助手</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 class="bullet">-</span> 实体类：&#123;ModuleName&#125;.java（例：SysUser.java）</span><br><span class="line"><span class="bullet">-</span> Mapper：&#123;ModuleName&#125;Mapper.java</span><br><span class="line"><span class="bullet">-</span> Service 接口：I&#123;ModuleName&#125;Service.java</span><br><span class="line"><span class="bullet">-</span> Service 实现：&#123;ModuleName&#125;ServiceImpl.java</span><br><span class="line"><span class="bullet">-</span> Controller：&#123;ModuleName&#125;Controller.java</span><br><span class="line"><span class="bullet">-</span> 表名：sys<span class="emphasis">_&#123;module_</span>name&#125;（小写下划线）</span><br><span class="line"></span><br><span class="line"><span class="section">### 包结构</span></span><br><span class="line"><span class="bullet">-</span> com.ruoyi.&#123;module&#125;.domain</span><br><span class="line"><span class="bullet">-</span> com.ruoyi.&#123;module&#125;.mapper</span><br><span class="line"><span class="bullet">-</span> com.ruoyi.&#123;module&#125;.service</span><br><span class="line"><span class="bullet">-</span> com.ruoyi.&#123;module&#125;.service.impl</span><br><span class="line"><span class="bullet">-</span> com.ruoyi.&#123;module&#125;.controller</span><br><span class="line"></span><br><span class="line"><span class="section">### 注解使用</span></span><br><span class="line"><span class="bullet">-</span> @TableName(&quot;sys<span class="emphasis">_xxx&quot;) — 实体类映射表</span></span><br><span class="line"><span class="emphasis">- @TableId — 主键（type = IdType.AUTO 自动增长）</span></span><br><span class="line"><span class="emphasis">- @TableLogic — 逻辑删除</span></span><br><span class="line"><span class="emphasis">- @RequiresPermissions — 权限校验</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 前端规范</span></span><br><span class="line"><span class="emphasis">- API：src/api/&#123;module&#125;/xxx.ts</span></span><br><span class="line"><span class="emphasis">- 页面：src/views/&#123;module&#125;/xxx/index.vue</span></span><br><span class="line"><span class="emphasis">- 组件：src/views/&#123;module&#125;/xxx/components/xxxForm.vue</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 使用方式</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">输入格式：</span></span><br></pre></td></tr></table></figure><p>表名：sys_user<br>模块：system<br>说明：用户管理</p><p>字段：<br>id, bigint, 主键, 自增<br>username, varchar(30), 用户名, not null<br>password, varchar(100), 密码, not null<br>email, varchar(50), 邮箱, null<br>phone, varchar(11), 手机号, null<br>status, char(1), 状态(0正常 2停用), not null<br>create_time, datetime, 创建时间, not null</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">我将生成完整 CRUD 代码。</span><br></pre></td></tr></table></figure><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">用户：生成角色管理模块</span><br><span class="line"></span><br><span class="line">/ruoyi:gen-crud</span><br><span class="line"></span><br><span class="line">输入：</span><br><span class="line">表名：sys_role</span><br><span class="line">模块：system</span><br><span class="line">说明：角色管理</span><br><span class="line"></span><br><span class="line">字段：</span><br><span class="line">id, bigint, 主键, 自增</span><br><span class="line">role_name, varchar(30), 角色名称</span><br><span class="line">role_key, varchar(100), 权限字符</span><br><span class="line">role_sort, int, 显示顺序</span><br><span class="line">status, char(1), 状态</span><br><span class="line">create_time, datetime, 创建时间</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ✅ 正在生成角色管理模块 CRUD...</span><br><span class="line"></span><br><span class="line">  生成文件列表：</span><br><span class="line">  ✅ domain/SysRole.java</span><br><span class="line">  ✅ mapper/SysRoleMapper.java</span><br><span class="line">  ✅ mapper/SysRoleMapper.xml</span><br><span class="line">  ✅ service/ISysRoleService.java</span><br><span class="line">  ✅ service/impl/SysRoleServiceImpl.java</span><br><span class="line">  ✅ controller/SysRoleController.java</span><br><span class="line">  ✅ vue/api/system/role.ts</span><br><span class="line">  ✅ vue/views/system/role/index.vue</span><br><span class="line">  ✅ vue/views/system/role/components/RoleForm.vue</span><br><span class="line"></span><br><span class="line">  ⚠️ 注意事项：</span><br><span class="line">  - 角色权限字符 role_key 唯一性已校验</span><br><span class="line">  - 状态使用 char(1)：0=正常，1=停用</span><br><span class="line">  - 删除角色时检查是否关联用户</span><br></pre></td></tr></table></figure><hr><h3 id="5-3-API-测试辅助-Skill"><a href="#5-3-API-测试辅助-Skill" class="headerlink" title="5.3 API 测试辅助 Skill"></a>5.3 API 测试辅助 Skill</h3><h4 id="5-3-1-api-test-helper"><a href="#5-3-1-api-test-helper" class="headerlink" title="5.3.1 api-test-helper"></a>5.3.1 api-test-helper</h4><p><strong>安装位置</strong>：<code>.claude/skills/api-test-helper/SKILL.md</code></p><p><strong>功能</strong>：帮助编写和执行 API 测试用例，自动生成 JUnit 测试和 cURL 命令。</p><p><strong>SKILL.md 示例</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: api-test-helper</span><br><span class="line"><span class="section">description: API 测试辅助 — 生成 JUnit MockMvc 测试用例和 cURL 测试命令</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># API 测试助手</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 功能</span></span><br><span class="line"><span class="bullet">-</span> 根据 Controller 生成 MockMvc 测试用例</span><br><span class="line"><span class="bullet">-</span> 生成 cURL 测试命令</span><br><span class="line"><span class="bullet">-</span> 生成 Apifox/Postman 导入 JSON</span><br><span class="line"></span><br><span class="line"><span class="section">## 使用方式</span></span><br><span class="line">输入 Controller 名称或接口路径</span><br><span class="line"></span><br><span class="line">示例：</span><br><span class="line">/api-test generate --controller UserController</span><br><span class="line">/api-test curl --path POST /api/user/create</span><br><span class="line">/api-test apifox --module system</span><br></pre></td></tr></table></figure><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">用户：为 UserController 生成测试用例</span><br><span class="line"></span><br><span class="line">/api-test generate --controller UserController</span><br><span class="line"></span><br><span class="line">Claude：</span><br><span class="line">  ✅ 已生成测试用例</span><br><span class="line"></span><br><span class="line">  测试文件：test/java/com/ruoyi/system/controller/SysUserControllerTest.java</span><br><span class="line"></span><br><span class="line">  包含测试方法：</span><br><span class="line">  - testListUser() — 分页查询</span><br><span class="line">  - testGetUser() — 查询单个</span><br><span class="line">  - testCreateUser() — 创建用户</span><br><span class="line">  - testUpdateUser() — 更新用户</span><br><span class="line">  - testDeleteUser() — 删除用户</span><br><span class="line">  - testResetPassword() — 重置密码</span><br><span class="line">  - testChangeStatus() — 修改状态</span><br><span class="line"></span><br><span class="line">  cURL 命令示例：</span><br><span class="line">  curl -X POST &#x27;http://localhost:8080/api/user/create&#x27; \</span><br><span class="line">    -H &#x27;Content-Type: application/json&#x27; \</span><br><span class="line">    -d &#x27;&#123;&quot;username&quot;:&quot;test&quot;,&quot;password&quot;:&quot;123456&quot;&#125;&#x27;</span><br></pre></td></tr></table></figure><hr><h3 id="5-4-自定义工作流-Skill"><a href="#5-4-自定义工作流-Skill" class="headerlink" title="5.4 自定义工作流 Skill"></a>5.4 自定义工作流 Skill</h3><h4 id="5-4-1-工作流封装示例"><a href="#5-4-1-工作流封装示例" class="headerlink" title="5.4.1 工作流封装示例"></a>5.4.1 工作流封装示例</h4><p>根据团队实践，可将常用工作流封装为项目级 Skill：</p><p><strong>示例：bugfix-workflow（Bug 修复工作流）</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">name: bugfix-workflow</span><br><span class="line"><span class="section">description: 标准化 Bug 修复工作流 — 重现→定位→修复→验证→CodeReview</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line"><span class="section"># Bug 修复工作流</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">### 第一步：复现 Bug</span></span><br><span class="line"><span class="bullet">1.</span> 获取 Bug 复现步骤</span><br><span class="line"><span class="bullet">2.</span> 在本地环境复现</span><br><span class="line"><span class="bullet">3.</span> 记录错误日志和堆栈</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">2.</span> 查找相关代码</span><br><span class="line"><span class="bullet">3.</span> 确定根本原因</span><br><span class="line"></span><br><span class="line"><span class="section">### 第三步：修复代码</span></span><br><span class="line"><span class="bullet">1.</span> 创建修复分支：fix/bug-&#123;id&#125;</span><br><span class="line"><span class="bullet">2.</span> 编写失败的单元测试（RED）</span><br><span class="line"><span class="bullet">3.</span> 编写最小修复代码（GREEN）</span><br><span class="line"><span class="bullet">4.</span> 重构优化（REFACTOR）</span><br><span class="line"><span class="bullet">5.</span> 运行测试确认通过</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">2.</span> 集成测试通过</span><br><span class="line"><span class="bullet">3.</span> 本地功能验证通过</span><br><span class="line"></span><br><span class="line"><span class="section">### 第五步：Code Review</span></span><br><span class="line"><span class="bullet">1.</span> 提交代码</span><br><span class="line"><span class="bullet">2.</span> 发起 Code Review</span><br><span class="line"><span class="bullet">3.</span> 根据反馈修复</span><br><span class="line"><span class="bullet">4.</span> 合并到主分支</span><br></pre></td></tr></table></figure><hr><h3 id="5-5-CLAUDE-md-项目说明模板"><a href="#5-5-CLAUDE-md-项目说明模板" class="headerlink" title="5.5 CLAUDE.md 项目说明模板"></a>5.5 CLAUDE.md 项目说明模板</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># &#123;项目名称&#125; — Claude Code 项目说明</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 项目概述</span></span><br><span class="line">&#123;description&#125;</span><br><span class="line"></span><br><span class="line"><span class="section">## 技术栈</span></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**后端**</span>：Spring Boot 2.5 + JDK8 + MyBatis-Plus + MySQL + Redis</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**前端**</span>：Vue 3.4 + Ant Design Vue 4.x + Vite 5 + TypeScript</span><br><span class="line"><span class="bullet">-</span> <span class="strong">**框架**</span>：RuoYi（后端）+ VBen Admin（前端）</span><br><span class="line"></span><br><span class="line"><span class="section">## 项目结构</span></span><br><span class="line">&#123;项目目录结构说明&#125;</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 class="bullet">-</span> 分支命名：<span class="code">`feature/功能名`</span> / <span class="code">`fix/bug编号`</span> / <span class="code">`chore/任务名`</span></span><br><span class="line"><span class="bullet">-</span> Commit 格式：<span class="code">`[模块] 描述 (#issue)`</span></span><br><span class="line"><span class="bullet">-</span> Code Review 通过后才能合并</span><br><span class="line"></span><br><span class="line"><span class="section">### API 规范</span></span><br><span class="line"><span class="bullet">-</span> RESTful 风格</span><br><span class="line"><span class="bullet">-</span> 统一响应：<span class="code">`&#123; code: 200, msg: string, data: any &#125;`</span></span><br><span class="line"><span class="bullet">-</span> 分页响应：<span class="code">`&#123; code: 200, data: &#123; rows: [], total: number &#125; &#125;`</span></span><br><span class="line"><span class="bullet">-</span> 错误码规范：见 <span class="code">`docs/api/error-codes.md`</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 前端规范</span></span><br><span class="line"><span class="bullet">-</span> 组件：PascalCase（例：UserList.vue）</span><br><span class="line"><span class="bullet">-</span> 工具函数：camelCase（例：formatDate.ts）</span><br><span class="line"><span class="bullet">-</span> API 调用：统一使用 <span class="code">`src/api/`</span> 下的封装</span><br><span class="line"></span><br><span class="line"><span class="section">## 常用命令</span></span><br><span class="line"><span class="code">```bash</span></span><br><span class="line"><span class="code"># 后端启动</span></span><br><span class="line"><span class="code">mvn spring-boot:run -pl ruoyi-admin</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="code"># 前端启动</span></span><br><span class="line"><span class="code">cd ruoyi-ui &amp;&amp; npm run dev</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="code"># 代码生成</span></span><br><span class="line"><span class="code">./scripts/gen-crud.sh --module user</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="code"># 运行测试</span></span><br><span class="line"><span class="code">mvn test / npm run test</span></span><br><span class="line"><span class="code">```</span></span><br><span class="line"></span><br><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> 数据库变更记录在 <span class="code">`docs/database/changelog.md`</span></span><br><span class="line"><span class="bullet">-</span> 所有新增接口必须更新 Swagger 文档</span><br></pre></td></tr></table></figure><hr><h3 id="5-6-项目-Skills-速查表"><a href="#5-6-项目-Skills-速查表" class="headerlink" title="5.6 项目 Skills 速查表"></a>5.6 项目 Skills 速查表</h3><table><thead><tr><th>Skill</th><th>用途</th><th>安装位置</th></tr></thead><tbody><tr><td>ruoyi-gen-crud</td><td>根据表结构生成 RuoYi CRUD</td><td><code>.claude/skills/ruoyi-gen-crud/</code></td></tr><tr><td>api-test-helper</td><td>API 测试用例生成</td><td><code>.claude/skills/api-test-helper/</code></td></tr><tr><td>bugfix-workflow</td><td>Bug 修复标准化流程</td><td><code>.claude/skills/bugfix-workflow/</code></td></tr></tbody></table><hr><h2 id="六、完整开发流程"><a href="#六、完整开发流程" class="headerlink" title="六、完整开发流程"></a>六、完整开发流程</h2><h3 id="6-1-阶段总览"><a href="#6-1-阶段总览" class="headerlink" title="6.1 阶段总览"></a>6.1 阶段总览</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">┌─────────────────────────────────────────────────────────────────┐</span><br><span class="line">│                        完整开发流程                               │</span><br><span class="line">├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤</span><br><span class="line">│ 需求阶段  │ 规划阶段  │ 开发阶段  │ 测试阶段  │ 审查阶段  │ 交付阶段  │</span><br><span class="line">└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘</span><br><span class="line">     │           │           │           │           │           │</span><br><span class="line">     ▼           ▼           ▼           ▼           ▼           ▼</span><br><span class="line">┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐</span><br><span class="line">│需求澄清   │ │Git初始化  │ │TDD循环    │ │API自动化  │ │Code Review│ │功能验证  │</span><br><span class="line">│规格生成   │ │任务分解   │ │代码生成   │ │UI测试    │ │人工确认   │ │合并发布  │</span><br><span class="line">│           │ │          │ │联调自测   │ │报告生成   │ │归档      │ │文档更新  │</span><br><span class="line">└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘</span><br></pre></td></tr></table></figure><hr><h3 id="6-2-阶段一：需求阶段"><a href="#6-2-阶段一：需求阶段" class="headerlink" title="6.2 阶段一：需求阶段"></a>6.2 阶段一：需求阶段</h3><p><strong>目标</strong>：将模糊需求转化为清晰的规格文档</p><p><strong>输入</strong>：</p><ul><li>项目需求说明书（PRD）</li><li>详细设计文档</li><li>原型文件（Axure / Figma 导出）</li></ul><p><strong>流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">1. 输入需求文档</span><br><span class="line">   ↓</span><br><span class="line">2. AI 读取并理解（/openspec:brainstorm）</span><br><span class="line">   ↓</span><br><span class="line">3. 苏格拉底式提问澄清模糊点</span><br><span class="line">   ↓</span><br><span class="line">4. 生成 SPEC.md 规格文档（/openspec:write-spec）</span><br><span class="line">   ↓</span><br><span class="line">5. 评审确认（产品 + 架构）</span><br></pre></td></tr></table></figure><p><strong>输出</strong>：<code>SPEC.md</code> — 规格文档</p><p><strong>规格文档内容</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># &#123;功能名称&#125; 规格文档</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 1. 需求澄清结果</span></span><br><span class="line"><span class="bullet">-</span> [x] 明确的需求点1</span><br><span class="line"><span class="bullet">-</span> [x] 明确的需求点2</span><br><span class="line"></span><br><span class="line"><span class="section">## 2. API 接口定义</span></span><br><span class="line">| 方法   | 路径            | 说明 | 权限       |</span><br><span class="line">| ------ | --------------- | ---- | ---------- |</span><br><span class="line">| POST   | /api/xxx/create | 创建 | xxx:add    |</span><br><span class="line">| GET    | /api/xxx/&#123;id&#125;   | 详情 | xxx:query  |</span><br><span class="line">| PUT    | /api/xxx/update | 修改 | xxx:edit   |</span><br><span class="line">| DELETE | /api/xxx/&#123;id&#125;   | 删除 | xxx:remove |</span><br><span class="line"></span><br><span class="line"><span class="section">## 3. 数据模型</span></span><br><span class="line"><span class="bullet">-</span> 表名：sys<span class="emphasis">_xxx</span></span><br><span class="line"><span class="emphasis">- 字段定义</span></span><br><span class="line"><span class="emphasis">- 索引设计</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 4. 前端页面</span></span><br><span class="line"><span class="emphasis">- 路由：/views/xxx/index.vue</span></span><br><span class="line"><span class="emphasis">- 组件：/views/xxx/components/xxxForm.vue</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">## 5. 测试用例清单</span></span><br><span class="line"><span class="emphasis">- [ ] 正常创建</span></span><br><span class="line"><span class="emphasis">- [ ] 参数校验失败</span></span><br><span class="line"><span class="emphasis">- [ ] 权限不足</span></span><br><span class="line"><span class="emphasis">- [ ] 重复数据</span></span><br></pre></td></tr></table></figure><hr><h3 id="6-3-阶段二：规划阶段"><a href="#6-3-阶段二：规划阶段" class="headerlink" title="6.3 阶段二：规划阶段"></a>6.3 阶段二：规划阶段</h3><p><strong>目标</strong>：将规格文档拆解为可执行的任务计划</p><p><strong>输入</strong>：<code>SPEC.md</code> 规格文档</p><p><strong>流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">1. 初始化 Git Worktree（/superpower:init）</span><br><span class="line">   ↓</span><br><span class="line">2. 分析功能依赖关系（/planning-with-files）</span><br><span class="line">   ↓</span><br><span class="line">3. 拆解任务为 2-5 分钟粒度（/superpower:write-plan）</span><br><span class="line">   ↓</span><br><span class="line">4. 识别前后端并行任务</span><br><span class="line">   ↓</span><br><span class="line">5. 确定任务依赖顺序</span><br><span class="line">   ↓</span><br><span class="line">6. 输出 PLAN.md 执行计划</span><br></pre></td></tr></table></figure><p><strong>输出</strong>：<code>PLAN.md</code> — 执行计划</p><p><strong>执行计划格式</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># &#123;功能名称&#125; 执行计划</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><br><span class="line">| --- | ------------------ | ------ | -------- | ---- |</span><br><span class="line">| 1   | 创建数据库表       | 后端   | 3min     | -    |</span><br><span class="line">| 2   | 生成后端 CRUD 代码 | 后端   | 5min     | 1    |</span><br><span class="line">| 3   | 后端单元测试       | 后端   | 5min     | 2    |</span><br><span class="line">| 4   | 前端 API 接口      | 前端   | 3min     | 2    |</span><br><span class="line">| 5   | 前端列表页面       | 前端   | 5min     | 4    |</span><br><span class="line">| 6   | 前端表单弹窗       | 前端   | 5min     | 5    |</span><br><span class="line">| 7   | 前后端联调         | 前后端 | 5min     | 3,6  |</span><br><span class="line">| 8   | Code Review        | 后端   | 5min     | 7    |</span><br><span class="line"></span><br><span class="line"><span class="section">## 前后端并行分析</span></span><br><span class="line"><span class="bullet">-</span> 后端任务：1, 2, 3, 7, 8</span><br><span class="line"><span class="bullet">-</span> 前端任务：4, 5, 6, 7</span><br><span class="line"><span class="bullet">-</span> 可并行阶段：后端2完成后前端4可开始</span><br><span class="line"></span><br><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> 前端表单需要联动校验</span><br></pre></td></tr></table></figure><hr><h3 id="6-4-阶段三：开发阶段"><a href="#6-4-阶段三：开发阶段" class="headerlink" title="6.4 阶段三：开发阶段"></a>6.4 阶段三：开发阶段</h3><p><strong>目标</strong>：按照 TDD 流程完成代码实现</p><p><strong>输入</strong>：<code>PLAN.md</code> + <code>SPEC.md</code></p><p><strong>流程</strong>：</p><h4 id="后端开发流程（RuoYi）"><a href="#后端开发流程（RuoYi）" class="headerlink" title="后端开发流程（RuoYi）"></a>后端开发流程（RuoYi）</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">1. 生成 CRUD 代码（/ruoyi:gen-crud）</span><br><span class="line">   ↓</span><br><span class="line">2. TDD 循环：</span><br><span class="line">   ├─ RED：编写单元测试（Assert 失败）</span><br><span class="line">   ├─ GREEN：编写最小实现（Assert 通过）</span><br><span class="line">   └─ REFACTOR：重构优化代码</span><br><span class="line">   ↓</span><br><span class="line">3. 编写业务逻辑（补充 CRUD 之外的逻辑）</span><br><span class="line">   ↓</span><br><span class="line">4. 自测验证（Postman/Apifox）</span><br><span class="line">   ↓</span><br><span class="line">5. 提交代码</span><br></pre></td></tr></table></figure><h4 id="前端开发流程（Vue3-VBen-Admin-Ant-Design-Vue）"><a href="#前端开发流程（Vue3-VBen-Admin-Ant-Design-Vue）" class="headerlink" title="前端开发流程（Vue3 + VBen Admin + Ant Design Vue）"></a>前端开发流程（Vue3 + VBen Admin + Ant Design Vue）</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">1. 创建 API 接口文件（src/api/xxx.ts）</span><br><span class="line">   ↓</span><br><span class="line">2. 创建页面（src/views/xxx/index.vue）</span><br><span class="line">   ├─ 使用 VBen 表格组件（VbenTable）</span><br><span class="line">   ├─ 使用 Ant Design Vue 组件</span><br><span class="line">   └─ 编写查询表单</span><br><span class="line">   ↓</span><br><span class="line">3. 创建表单弹窗（src/views/xxx/components/xxxForm.vue）</span><br><span class="line">   ├─ 新增表单</span><br><span class="line">   └─ 编辑表单（回显数据）</span><br><span class="line">   ↓</span><br><span class="line">4. 前后端联调</span><br><span class="line">   ↓</span><br><span class="line">5. 自测验证</span><br><span class="line">   ↓</span><br><span class="line">6. 提交代码</span><br></pre></td></tr></table></figure><p><strong>使用示例</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">用户：按 TDD 流程实现用户模块的更新功能</span><br><span class="line"></span><br><span class="line">/superpower:execute-plan</span><br><span class="line"></span><br><span class="line">Claude（TDD 模式）：</span><br><span class="line"></span><br><span class="line">  【RED 阶段】编写失败的测试</span><br><span class="line"></span><br><span class="line">  正在生成测试：UserServiceUpdateTest.java</span><br><span class="line"></span><br><span class="line">  @Test</span><br><span class="line">  public void testUpdateUser_Success() &#123;</span><br><span class="line">      SysUser user = new SysUser();</span><br><span class="line">      user.setUserId(1L);</span><br><span class="line">      user.setUsername(&quot;updated&quot;);</span><br><span class="line">      user.setEmail(&quot;updated@test.com&quot;);</span><br><span class="line"></span><br><span class="line">      when(userMapper.updateById(user)).thenReturn(1);</span><br><span class="line"></span><br><span class="line">      boolean result = userService.updateUser(user);</span><br><span class="line"></span><br><span class="line">      assertTrue(result);</span><br><span class="line">      verify(userMapper).updateById(user);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  运行测试... ❌ FAIL（Entity 缺少 setter）</span><br><span class="line"></span><br><span class="line">  【GREEN 阶段】编写最小实现</span><br><span class="line"></span><br><span class="line">  正在生成 UserServiceImpl.java</span><br><span class="line">  @Override</span><br><span class="line">  public boolean updateUser(SysUser user) &#123;</span><br><span class="line">      return userMapper.updateById(user) &gt; 0;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  运行测试... ✅ PASS</span><br><span class="line"></span><br><span class="line">  【REFACTOR 阶段】优化代码</span><br><span class="line"></span><br><span class="line">  优化内容：</span><br><span class="line">  - 添加参数校验</span><br><span class="line">  - 添加日志记录</span><br><span class="line">  - 添加更新前后数据对比</span><br><span class="line"></span><br><span class="line">  运行测试... ✅ PASS</span><br><span class="line"></span><br><span class="line">  ✅ TDD 循环完成</span><br></pre></td></tr></table></figure><hr><h3 id="6-5-阶段四：测试阶段"><a href="#6-5-阶段四：测试阶段" class="headerlink" title="6.5 阶段四：测试阶段"></a>6.5 阶段四：测试阶段</h3><p><strong>目标</strong>：自动化测试 + UI 验证</p><p><strong>输入</strong>：代码实现 + <code>SPEC.md</code></p><p><strong>流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">1. API 自动化测试（JUnit MockMvc）</span><br><span class="line">   ↓</span><br><span class="line">2. UI 自动化测试（/webapp-testing）</span><br><span class="line">   ↓</span><br><span class="line">3. 边界条件测试</span><br><span class="line">   ↓</span><br><span class="line">4. 异常场景测试</span><br><span class="line">   ↓</span><br><span class="line">5. 生成测试报告</span><br></pre></td></tr></table></figure><p><strong>测试用例清单</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 测试用例</span></span><br><span class="line"></span><br><span class="line"><span class="section">### API 测试</span></span><br><span class="line">| 用例       | 方法   | 路径            | 预期结果 |</span><br><span class="line">| ---------- | ------ | --------------- | -------- |</span><br><span class="line">| 正常创建   | POST   | /api/xxx/create | code=200 |</span><br><span class="line">| 参数缺失   | POST   | /api/xxx/create | code=500 |</span><br><span class="line">| 重复数据   | POST   | /api/xxx/create | code=500 |</span><br><span class="line">| 查询存在   | GET    | /api/xxx/1      | code=200 |</span><br><span class="line">| 查询不存在 | GET    | /api/xxx/999    | code=404 |</span><br><span class="line">| 修改成功   | PUT    | /api/xxx/update | code=200 |</span><br><span class="line">| 删除成功   | DELETE | /api/xxx/1      | code=200 |</span><br><span class="line"></span><br><span class="line"><span class="section">### UI 测试</span></span><br><span class="line">| 用例     | 操作                       | 预期结果               |</span><br><span class="line">| -------- | -------------------------- | ---------------------- |</span><br><span class="line">| 列表加载 | 访问页面                   | 表格正常显示数据       |</span><br><span class="line">| 新增     | 点击新增 → 填写表单 → 提交 | 弹窗关闭，列表刷新     |</span><br><span class="line">| 编辑     | 点击编辑 → 修改 → 保存     | 数据更新，列表同步     |</span><br><span class="line">| 删除     | 点击删除 → 确认            | 弹窗关闭，行从列表移除 |</span><br><span class="line">| 查询     | 输入条件 → 搜索            | 列表按条件过滤         |</span><br></pre></td></tr></table></figure><hr><h3 id="6-6-阶段五：审查阶段"><a href="#6-6-阶段五：审查阶段" class="headerlink" title="6.6 阶段五：审查阶段"></a>6.6 阶段五：审查阶段</h3><p><strong>目标</strong>：代码审查 + 质量门禁</p><p><strong>输入</strong>：代码实现 + 测试报告</p><p><strong>流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">1. AI 自动 Code Review（/code-review）</span><br><span class="line">   ↓</span><br><span class="line">2. 审查清单逐项检查</span><br><span class="line">   ↓</span><br><span class="line">3. 人工最终确认</span><br><span class="line">   ↓</span><br><span class="line">4. 修复审查问题（如有）</span><br><span class="line">   ↓</span><br><span class="line">5. 归档任务（/superpower:archive）</span><br></pre></td></tr></table></figure><p><strong>审查检查项</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 审查清单</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 代码规范</span></span><br><span class="line"><span class="bullet">-</span> [ ] 命名符合 RuoYi 规范</span><br><span class="line"><span class="bullet">-</span> [ ] 方法行数 &lt; 80 行</span><br><span class="line"><span class="bullet">-</span> [ ] 注释完整（关键逻辑）</span><br><span class="line"><span class="bullet">-</span> [ ] 无硬编码配置</span><br><span class="line"></span><br><span class="line"><span class="section">### 安全性</span></span><br><span class="line"><span class="bullet">-</span> [ ] SQL 参数化查询（#&#123;&#125;）</span><br><span class="line"><span class="bullet">-</span> [ ] @RequiresPermissions 权限注解</span><br><span class="line"><span class="bullet">-</span> [ ] 无敏感信息硬编码</span><br><span class="line"><span class="bullet">-</span> [ ] 输入参数校验</span><br><span class="line"></span><br><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> [ ] 无 N+1 查询</span><br><span class="line"><span class="bullet">-</span> [ ] 大数据分页</span><br><span class="line"><span class="bullet">-</span> [ ] 必要时有缓存</span><br><span class="line"></span><br><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> [ ] 日志记录</span><br><span class="line"><span class="bullet">-</span> [ ] 事务边界正确</span><br><span class="line"></span><br><span class="line"><span class="section">### 测试覆盖</span></span><br><span class="line"><span class="bullet">-</span> [ ] 单元测试覆盖率 &gt; 70%</span><br><span class="line"><span class="bullet">-</span> [ ] 边界条件覆盖</span><br><span class="line"><span class="bullet">-</span> [ ] 异常场景覆盖</span><br></pre></td></tr></table></figure><hr><h3 id="6-7-阶段六：交付阶段"><a href="#6-7-阶段六：交付阶段" class="headerlink" title="6.7 阶段六：交付阶段"></a>6.7 阶段六：交付阶段</h3><p><strong>目标</strong>：功能验证 + 合并发布 + 文档更新</p><p><strong>输入</strong>：审查通过的代码</p><p><strong>流程</strong>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">1. 功能验证（本地完整流程测试）</span><br><span class="line">   ↓</span><br><span class="line">2. 提交 Pull Request</span><br><span class="line">   ↓</span><br><span class="line">3. CI 检查（编译 + 测试）</span><br><span class="line">   ↓</span><br><span class="line">4. Code Review 审批</span><br><span class="line">   ↓</span><br><span class="line">5. 合并到主分支</span><br><span class="line">   ↓</span><br><span class="line">6. 更新相关文档</span><br><span class="line">   ↓</span><br><span class="line">7. 通知相关人员</span><br></pre></td></tr></table></figure><hr><h3 id="6-8-前后端协作时序"><a href="#6-8-前后端协作时序" class="headerlink" title="6.8 前后端协作时序"></a>6.8 前后端协作时序</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">前端                        后端                      数据库</span><br><span class="line"> │                           │                          │</span><br><span class="line"> │  1. 打开页面              │                          │</span><br><span class="line"> │──────────────────────────►│                          │</span><br><span class="line"> │                           │  2. GET /api/xxx/list   │</span><br><span class="line"> │                           │─────────────────────────►│</span><br><span class="line"> │                           │  3. 查询数据            │</span><br><span class="line"> │                           │◄─────────────────────────│</span><br><span class="line"> │  4. 渲染列表              │  5. 返回JSON             │</span><br><span class="line"> │◄──────────────────────────│                          │</span><br><span class="line"> │                           │                          │</span><br><span class="line"> │  6. 点击新增              │                          │</span><br><span class="line"> │  7. 填写表单              │                          │</span><br><span class="line"> │──────────────────────────►│                          │</span><br><span class="line"> │                           │  8. POST /api/xxx/create│</span><br><span class="line"> │                           │─────────────────────────►│</span><br><span class="line"> │                           │  9. 插入数据             │</span><br><span class="line"> │                           │◄─────────────────────────│</span><br><span class="line"> │ 10. 关闭弹窗，刷新列表    │ 10. 返回成功            │</span><br><span class="line"> │◄──────────────────────────│                          │</span><br></pre></td></tr></table></figure><hr><h2 id="七、质量保证体系"><a href="#七、质量保证体系" class="headerlink" title="七、质量保证体系"></a>七、质量保证体系</h2><h3 id="7-1-质量保障总览"><a href="#7-1-质量保障总览" class="headerlink" title="7.1 质量保障总览"></a>7.1 质量保障总览</h3><table><thead><tr><th>维度</th><th>工具/方法</th><th>目标</th></tr></thead><tbody><tr><td>需求质量</td><td>OpenSpec 需求澄清</td><td>需求澄清率 100%</td></tr><tr><td>代码质量</td><td>Superpowers TDD</td><td>测试覆盖率 &gt; 70%</td></tr><tr><td>架构质量</td><td>Superpowers Review</td><td>重大缺陷拦截率 100%</td></tr><tr><td>UI 质量</td><td>web-design-guidelines</td><td>设计规范符合率 &gt; 90%</td></tr></tbody></table><h3 id="7-2-各阶段质量检查点"><a href="#7-2-各阶段质量检查点" class="headerlink" title="7.2 各阶段质量检查点"></a>7.2 各阶段质量检查点</h3><h4 id="需求阶段检查点"><a href="#需求阶段检查点" class="headerlink" title="需求阶段检查点"></a>需求阶段检查点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">□ 需求文档已完整输入</span><br><span class="line">□ 模糊需求已通过 Brainstorm 澄清</span><br><span class="line">□ 规格文档（SPEC.md）已生成</span><br><span class="line">□ 技术选型已确认</span><br><span class="line">□ 风险点已识别</span><br><span class="line">□ 评审已通过（产品 + 架构）</span><br></pre></td></tr></table></figure><h4 id="规划阶段检查点"><a href="#规划阶段检查点" class="headerlink" title="规划阶段检查点"></a>规划阶段检查点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">□ Git Worktree 已创建</span><br><span class="line">□ 任务已拆解为 2-5 分钟粒度</span><br><span class="line">□ 前后端并行任务已识别</span><br><span class="line">□ 依赖关系已梳理</span><br><span class="line">□ 计划文档（PLAN.md）已生成</span><br><span class="line">□ 评审已通过（技术 + 产品）</span><br></pre></td></tr></table></figure><h4 id="开发阶段检查点"><a href="#开发阶段检查点" class="headerlink" title="开发阶段检查点"></a>开发阶段检查点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">□ TDD 循环已执行（RED → GREEN → REFACTOR）</span><br><span class="line">□ 单元测试已编写且通过</span><br><span class="line">□ 代码符合 RuoYi/VBen Admin 规范</span><br><span class="line">□ 前后端 API 接口已对齐</span><br><span class="line">□ 自测已通过</span><br><span class="line">□ Code Review 已提交</span><br></pre></td></tr></table></figure><h4 id="测试阶段检查点"><a href="#测试阶段检查点" class="headerlink" title="测试阶段检查点"></a>测试阶段检查点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">□ API 自动化测试用例 &gt; 20/接口</span><br><span class="line">□ 边界条件测试已覆盖</span><br><span class="line">□ 异常场景测试已覆盖</span><br><span class="line">□ UI 测试已通过（/webapp-testing）</span><br><span class="line">□ 集成测试已通过</span><br></pre></td></tr></table></figure><h4 id="审查阶段检查点"><a href="#审查阶段检查点" class="headerlink" title="审查阶段检查点"></a>审查阶段检查点</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">□ 安全性检查已通过（/code-review）</span><br><span class="line">□ 可维护性检查已通过</span><br><span class="line">□ 性能检查已通过</span><br><span class="line">□ 测试覆盖率检查已通过</span><br><span class="line">□ 代码规范检查已通过</span><br><span class="line">□ 人工确认已通过</span><br></pre></td></tr></table></figure><h3 id="7-3-RuoYi-专项代码规范"><a href="#7-3-RuoYi-专项代码规范" class="headerlink" title="7.3 RuoYi 专项代码规范"></a>7.3 RuoYi 专项代码规范</h3><h4 id="后端代码规范"><a href="#后端代码规范" class="headerlink" title="后端代码规范"></a>后端代码规范</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 命名规范</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SysUser</span> </span>&#123;&#125;           <span class="comment">// 实体类：模块+实体名</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">ISysUserService</span> </span>&#123;&#125; <span class="comment">// 业务接口：I+模块+实体名+Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SysUserServiceImpl</span> </span>&#123;&#125;  <span class="comment">// 业务实现：模块+实体名+ServiceImpl</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SysUserMapper</span> </span>&#123;&#125;       <span class="comment">// Mapper：模块+实体名+Mapper</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SysUserController</span> </span>&#123;&#125;    <span class="comment">// Controller：模块+实体名+Controller</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 包结构</span></span><br><span class="line">com.ruoyi.&#123;<span class="keyword">module</span>&#125;.domain       <span class="comment">// 实体和领域模型</span></span><br><span class="line">com.ruoyi.&#123;<span class="keyword">module</span>&#125;.mapper       <span class="comment">// 数据访问层</span></span><br><span class="line">com.ruoyi.&#123;<span class="keyword">module</span>&#125;.service      <span class="comment">// 业务接口</span></span><br><span class="line">com.ruoyi.&#123;<span class="keyword">module</span>&#125;.service.impl <span class="comment">// 业务实现</span></span><br><span class="line">com.ruoyi.&#123;<span class="keyword">module</span>&#125;.controller   <span class="comment">// 控制层</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 注解使用</span></span><br><span class="line"><span class="meta">@RestController</span>                  <span class="comment">// REST 控制器</span></span><br><span class="line"><span class="meta">@RequestMapping(&quot;/api/xxx&quot;)</span>      <span class="comment">// 请求映射</span></span><br><span class="line"><span class="meta">@RequiresPermissions(&quot;xxx:xxx&quot;)</span>  <span class="comment">// 权限校验</span></span><br><span class="line"><span class="meta">@Service</span>                         <span class="comment">// 业务层</span></span><br><span class="line"><span class="meta">@TableName(&quot;sys_xxx&quot;)</span>           <span class="comment">// 表映射</span></span><br><span class="line"><span class="meta">@TableId(type = IdType.AUTO)</span>    <span class="comment">// 主键策略</span></span><br><span class="line"><span class="meta">@TableLogic</span>                     <span class="comment">// 逻辑删除</span></span><br></pre></td></tr></table></figure><h4 id="前端代码规范（VBen-Admin-Ant-Design-Vue）"><a href="#前端代码规范（VBen-Admin-Ant-Design-Vue）" class="headerlink" title="前端代码规范（VBen Admin + Ant Design Vue）"></a>前端代码规范（VBen Admin + Ant Design Vue）</h4><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 命名规范</span></span><br><span class="line"><span class="comment">// 文件：kebab-case</span></span><br><span class="line">userList.vue        <span class="comment">// 页面组件</span></span><br><span class="line">useUserInfo.ts      <span class="comment">// Hook 函数</span></span><br><span class="line">formatDate.ts       <span class="comment">// 工具函数</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 组件：PascalCase</span></span><br><span class="line">UserList.vue        <span class="comment">// 页面组件</span></span><br><span class="line">UserForm.vue        <span class="comment">// 表单组件</span></span><br><span class="line">TableColumn.vue     <span class="comment">// 表格列配置</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 常量：UPPER_SNAKE_CASE</span></span><br><span class="line"><span class="keyword">const</span> API_BASE_URL = <span class="string">&#x27;/prod-api&#x27;</span></span><br><span class="line"><span class="keyword">const</span> PAGE_SIZE = <span class="number">10</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// API 封装</span></span><br><span class="line"><span class="comment">// src/api/system/user.ts</span></span><br><span class="line"><span class="keyword">import</span> &#123; request &#125; <span class="keyword">from</span> <span class="string">&#x27;@/utils/request&#x27;</span></span><br><span class="line"><span class="keyword">import</span> &#123; AxiosRequestConfig &#125; <span class="keyword">from</span> <span class="string">&#x27;axios&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> getUserList = <span class="function">(<span class="params">params: <span class="built_in">any</span></span>) =&gt;</span></span><br><span class="line">  request.get(<span class="string">&#x27;/system/user/list&#x27;</span>, &#123; params &#125;)</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> createUser = <span class="function">(<span class="params">data: <span class="built_in">any</span></span>) =&gt;</span></span><br><span class="line">  request.post(<span class="string">&#x27;/system/user/create&#x27;</span>, data)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 组件使用 Ant Design Vue</span></span><br><span class="line"><span class="comment">// &lt;a-table&gt;, &lt;a-form&gt;, &lt;a-modal&gt;, &lt;a-input&gt;, &lt;a-select&gt;</span></span><br></pre></td></tr></table></figure><h3 id="7-4-安全质量保障"><a href="#7-4-安全质量保障" class="headerlink" title="7.4 安全质量保障"></a>7.4 安全质量保障</h3><h4 id="安全检查清单"><a href="#安全检查清单" class="headerlink" title="安全检查清单"></a>安全检查清单</h4><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 安全检查清单</span></span><br><span class="line"></span><br><span class="line"><span class="section">### SQL 注入</span></span><br><span class="line"><span class="bullet">-</span> [ ] 所有 SQL 使用 #&#123;&#125; 参数化查询</span><br><span class="line"><span class="bullet">-</span> [ ] 禁止使用 $&#123;&#125; 字符串拼接</span><br><span class="line"><span class="bullet">-</span> [ ] LIKE 查询使用 $&#123;<span class="emphasis">_parameter&#125;%（需手动处理）</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### XSS 防护</span></span><br><span class="line"><span class="emphasis">- [ ] 用户输入内容在后端转义</span></span><br><span class="line"><span class="emphasis">- [ ] 富文本内容使用白名单过滤</span></span><br><span class="line"><span class="emphasis">- [ ] 前端使用 &#123;&#123; &#125;&#125; 而非 v-html</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 权限控制</span></span><br><span class="line"><span class="emphasis">- [ ] 每个接口都有 @RequiresPermissions</span></span><br><span class="line"><span class="emphasis">- [ ] 数据级别权限校验（只能操作自己的数据）</span></span><br><span class="line"><span class="emphasis">- [ ] 敏感操作有日志记录</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 敏感信息</span></span><br><span class="line"><span class="emphasis">- [ ] 密码使用 BCrypt 加密存储</span></span><br><span class="line"><span class="emphasis">- [ ] 数据库密码不在代码中硬编码</span></span><br><span class="line"><span class="emphasis">- [ ] Token/Key 不打印在日志中</span></span><br><span class="line"><span class="emphasis">- [ ] 错误信息不泄露系统路径</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 接口安全</span></span><br><span class="line"><span class="emphasis">- [ ] 接口有请求频率限制</span></span><br><span class="line"><span class="emphasis">- [ ] 重要接口有验证码/Token 校验</span></span><br><span class="line"><span class="emphasis">- [ ] CORS 配置正确</span></span><br></pre></td></tr></table></figure><h3 id="7-5-性能质量保障"><a href="#7-5-性能质量保障" class="headerlink" title="7.5 性能质量保障"></a>7.5 性能质量保障</h3><h4 id="性能检查清单"><a href="#性能检查清单" class="headerlink" title="性能检查清单"></a>性能检查清单</h4><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 性能检查清单</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 数据库</span></span><br><span class="line"><span class="bullet">-</span> [ ] WHERE 条件字段有索引</span><br><span class="line"><span class="bullet">-</span> [ ] 避免 SELECT <span class="emphasis">*，只查需要的字段</span></span><br><span class="line"><span class="emphasis">- [ ] 大数据量查询使用分页（PageHelper）</span></span><br><span class="line"><span class="emphasis">- [ ] 批量操作使用 batch</span></span><br><span class="line"><span class="emphasis">- [ ] 避免 N+1 查询（使用 JOIN 或批量查询）</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 缓存</span></span><br><span class="line"><span class="emphasis">- [ ] 热点数据使用 Redis 缓存</span></span><br><span class="line"><span class="emphasis">- [ ] 缓存设置过期时间</span></span><br><span class="line"><span class="emphasis">- [ ] 更新时清除缓存（CacheEvict）</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">### 前端</span></span><br><span class="line"><span class="emphasis">- [ ] 图片懒加载</span></span><br><span class="line"><span class="emphasis">- [ ] 路由懒加载（defineAsyncComponent）</span></span><br><span class="line"><span class="emphasis">- [ ] 大列表虚拟滚动</span></span><br><span class="line"><span class="emphasis">- [ ] 避免不必要的重渲染（computed + shallowRef）</span></span><br><span class="line"><span class="emphasis">- [ ] 打包优化（Tree Shaking, 代码分割）</span></span><br></pre></td></tr></table></figure><hr><h2 id="八、快速开始指南"><a href="#八、快速开始指南" class="headerlink" title="八、快速开始指南"></a>八、快速开始指南</h2><h3 id="8-1-环境准备"><a href="#8-1-环境准备" class="headerlink" title="8.1 环境准备"></a>8.1 环境准备</h3><h4 id="必需环境"><a href="#必需环境" class="headerlink" title="必需环境"></a>必需环境</h4><table><thead><tr><th>软件</th><th>版本</th><th>说明</th></tr></thead><tbody><tr><td>Node.js</td><td>&gt;= 18.x</td><td>前端运行</td></tr><tr><td>JDK</td><td>8</td><td>后端运行</td></tr><tr><td>Maven</td><td>3.8.x</td><td>后端构建</td></tr><tr><td>Git</td><td>2.30+</td><td>版本控制</td></tr><tr><td>MySQL</td><td>5.7 / 8.0</td><td>数据库</td></tr><tr><td>Redis</td><td>6.x</td><td>缓存</td></tr></tbody></table><h4 id="Claude-Code-安装"><a href="#Claude-Code-安装" class="headerlink" title="Claude Code 安装"></a>Claude Code 安装</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># macOS</span></span><br><span class="line">brew install anthropic/claude-code/claude</span><br><span class="line"></span><br><span class="line"><span class="comment"># Linux</span></span><br><span class="line">curl -s https://claudecode.com/install.sh | sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">claude --version</span><br></pre></td></tr></table></figure><h3 id="8-2-全局-Skills-一键安装"><a href="#8-2-全局-Skills-一键安装" class="headerlink" title="8.2 全局 Skills 一键安装"></a>8.2 全局 Skills 一键安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment"># setup-global-skills.sh</span></span><br><span class="line"><span class="comment"># 全局 Skills 一键安装脚本</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;开始安装全局 Skills...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加市场</span></span><br><span class="line">claude plugin marketplace add anthropic/skills 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin marketplace add obra/superpowers-marketplace 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin marketplace add daymade/claude-code-skills 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin marketplace add nextlevelbuilder/ui-ux-pro-max-skill 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装核心流程</span></span><br><span class="line">claude plugin install superpowers@superpowers-marketplace 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">claude plugin install code-review 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin install ui-ux-pro-max@ui-ux-pro-max-skill 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin install frontend-design 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin install example-skills@anthropic-agent-skills 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin install document-skills@anthropic-agent-skills 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin install skill-creator 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line">claude plugin install ralph-loop@claude-plugins-official 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 ummarize-changes（Node.js）</span></span><br><span class="line">npx skills add https://github.com/oimiragieo/agent-studio --skill summarize-changes 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 planning-with-files（Node.js）</span></span><br><span class="line">npx skills add OthmanAdi/planning-with-files --skill planning-with-files 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 web-design-guidelines（Node.js）</span></span><br><span class="line">npx skills add https://github.com/vercel-labs/agent-skills --skill web-design-guidelines 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 gstack（Node.js）</span></span><br><span class="line">npx skills add https://github.com/garrytan/gstack --skill gstack 2&gt;/dev/null || <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;✅ 全局 Skills 安装完成！&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;使用 /help 或 / 查看所有可用命令&quot;</span></span><br></pre></td></tr></table></figure><h3 id="8-3-项目初始化"><a href="#8-3-项目初始化" class="headerlink" title="8.3 项目初始化"></a>8.3 项目初始化</h3><h4 id="后端初始化（RuoYi）"><a href="#后端初始化（RuoYi）" class="headerlink" title="后端初始化（RuoYi）"></a>后端初始化（RuoYi）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆 RuoYi</span></span><br><span class="line">git <span class="built_in">clone</span> https://gitee.com/y_project/RuoYi-Vue.git</span><br><span class="line"><span class="built_in">cd</span> RuoYi-Vue</span><br><span class="line"></span><br><span class="line"><span class="comment"># 导入数据库</span></span><br><span class="line">mysql -u root -p &lt; sql/quartz.sql</span><br><span class="line">mysql -u root -p &lt; sql/ruoyi.sql</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改配置文件</span></span><br><span class="line">vim ruoyi-admin/src/main/resources/application-druid.yml</span><br><span class="line"><span class="comment"># 修改数据库连接信息</span></span><br><span class="line"><span class="comment"># 修改 Redis 连接信息</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动后端</span></span><br><span class="line">mvn spring-boot:run -pl ruoyi-admin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 访问 Swagger UI</span></span><br><span class="line"><span class="comment"># http://localhost:8080/swagger-ui/index.html</span></span><br><span class="line"><span class="comment"># 默认账号：admin / admin123</span></span><br></pre></td></tr></table></figure><h4 id="前端初始化（VBen-Admin）"><a href="#前端初始化（VBen-Admin）" class="headerlink" title="前端初始化（VBen Admin）"></a>前端初始化（VBen Admin）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆 VBen Admin</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/vbenjs/vue-vben-admin.git</span><br><span class="line"><span class="built_in">cd</span> vue-vben-admin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">npm install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改接口配置</span></span><br><span class="line"><span class="comment"># .env.development — 开发环境 API 地址</span></span><br><span class="line">VITE_APP_API_URL=http://localhost:8080/prod-api</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动前端</span></span><br><span class="line">npm run dev</span><br><span class="line"></span><br><span class="line"><span class="comment"># 访问</span></span><br><span class="line"><span class="comment"># http://localhost:5173</span></span><br></pre></td></tr></table></figure><h4 id="项目-Claude-Code-初始化"><a href="#项目-Claude-Code-初始化" class="headerlink" title="项目 Claude Code 初始化"></a>项目 Claude Code 初始化</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment"># setup-project.sh</span></span><br><span class="line"><span class="comment"># 项目 Claude Code 环境初始化</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;初始化项目 Claude Code 环境...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建目录结构</span></span><br><span class="line">mkdir -p .claude/&#123;skills,commands,hooks&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成 CLAUDE.md</span></span><br><span class="line">cat &gt; .claude/CLAUDE.md &lt;&lt; <span class="string">&#x27;EOF&#x27;</span></span><br><span class="line"><span class="comment"># &#123;项目名称&#125; — Claude Code 项目说明</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 项目概述</span></span><br><span class="line">基于 RuoYi + VBen Admin 的企业级后台管理系统。</span><br><span class="line"></span><br><span class="line"><span class="comment">## 技术栈</span></span><br><span class="line">- 后端：Spring Boot 2.5 + JDK8 + MyBatis-Plus + MySQL + Redis</span><br><span class="line">- 前端：Vue 3.4 + Ant Design Vue 4.x + Vite 5 + TypeScript</span><br><span class="line"></span><br><span class="line"><span class="comment">## 团队规范</span></span><br><span class="line">- 分支命名：feature/ | fix/ | chore/</span><br><span class="line">- Commit 格式：[模块] 描述</span><br><span class="line">- 所有接口必须更新 Swagger 文档</span><br><span class="line"></span><br><span class="line"><span class="comment">## 常用命令</span></span><br><span class="line"><span class="comment"># 后端启动</span></span><br><span class="line">mvn spring-boot:run -pl ruoyi-admin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 前端启动</span></span><br><span class="line"><span class="built_in">cd</span> ruoyi-ui &amp;&amp; npm run dev</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装项目级 Skills</span></span><br><span class="line">mkdir -p .claude/skills/ruoyi-gen-crud</span><br><span class="line">cat &gt; .claude/skills/ruoyi-gen-crud/SKILL.md &lt;&lt; <span class="string">&#x27;SKILL_EOF&#x27;</span></span><br><span class="line">---</span><br><span class="line">name: ruoyi-gen-crud</span><br><span class="line">description: RuoYi 框架专用 CRUD 代码生成</span><br><span class="line">---</span><br><span class="line"><span class="comment"># RuoYi CRUD 生成助手</span></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">SKILL_EOF</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;✅ 项目初始化完成！&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;下一步：&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;1. 编辑 .claude/CLAUDE.md 添加项目说明&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;2. 运行全局安装脚本&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;3. 开始开发！&quot;</span></span><br></pre></td></tr></table></figure><h3 id="8-4-第一个功能开发示例"><a href="#8-4-第一个功能开发示例" class="headerlink" title="8.4 第一个功能开发示例"></a>8.4 第一个功能开发示例</h3><p><strong>场景</strong>：实现商品管理模块的 CRUD</p><h4 id="步骤-1：需求澄清"><a href="#步骤-1：需求澄清" class="headerlink" title="步骤 1：需求澄清"></a>步骤 1：需求澄清</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">/openspec:brainstorm</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><br><span class="line">- 商品编辑</span><br><span class="line">- 商品删除（支持批量删除）</span><br><span class="line">- 商品详情查看</span><br></pre></td></tr></table></figure><h4 id="步骤-2：生成规格文档"><a href="#步骤-2：生成规格文档" class="headerlink" title="步骤 2：生成规格文档"></a>步骤 2：生成规格文档</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/openspec:write-spec</span><br><span class="line"></span><br><span class="line"><span class="comment"># AI 生成 SPEC.md</span></span><br></pre></td></tr></table></figure><h4 id="步骤-3：初始化-规划"><a href="#步骤-3：初始化-规划" class="headerlink" title="步骤 3：初始化 + 规划"></a>步骤 3：初始化 + 规划</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">/superpower:init</span><br><span class="line"><span class="comment"># 输入：product-management</span></span><br><span class="line"><span class="comment"># AI 创建 Git Worktree 和新分支</span></span><br><span class="line"></span><br><span class="line">/superpower:write-plan</span><br><span class="line"><span class="comment"># AI 生成 PLAN.md</span></span><br></pre></td></tr></table></figure><h4 id="步骤-4：开发（TDD-强制）"><a href="#步骤-4：开发（TDD-强制）" class="headerlink" title="步骤 4：开发（TDD 强制）"></a>步骤 4：开发（TDD 强制）</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 后端：生成 CRUD 代码</span></span><br><span class="line">/ruoyi:gen-crud</span><br><span class="line"><span class="comment"># 输入：表名 sys_product，字段列表</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># TDD 开发</span></span><br><span class="line">/superpower:execute-plan</span><br><span class="line"><span class="comment"># RED → GREEN → REFACTOR</span></span><br></pre></td></tr></table></figure><h4 id="步骤-5：测试"><a href="#步骤-5：测试" class="headerlink" title="步骤 5：测试"></a>步骤 5：测试</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># API 测试</span></span><br><span class="line">/api-test generate --controller ProductController</span><br><span class="line"></span><br><span class="line"><span class="comment"># UI 测试</span></span><br><span class="line">/webapp-testing</span><br><span class="line"><span class="comment"># 测试商品列表、新增、编辑、删除流程</span></span><br></pre></td></tr></table></figure><h4 id="步骤-6：审查"><a href="#步骤-6：审查" class="headerlink" title="步骤 6：审查"></a>步骤 6：审查</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/code-review</span><br><span class="line"><span class="comment"># AI 输出审查报告</span></span><br><span class="line"><span class="comment"># 修复问题</span></span><br></pre></td></tr></table></figure><h4 id="步骤-7：交付"><a href="#步骤-7：交付" class="headerlink" title="步骤 7：交付"></a>步骤 7：交付</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">/superpower:archive</span><br><span class="line"><span class="comment"># 合并 Worktree，清理分支</span></span><br><span class="line"><span class="comment"># 提交 PR，更新文档</span></span><br></pre></td></tr></table></figure><h3 id="8-5-常用命令速查"><a href="#8-5-常用命令速查" class="headerlink" title="8.5 常用命令速查"></a>8.5 常用命令速查</h3><table><thead><tr><th>命令</th><th>功能</th><th>场景</th></tr></thead><tbody><tr><td><code>/openspec:brainstorm</code></td><td>需求澄清</td><td>需求模糊时</td></tr><tr><td><code>/openspec:write-spec</code></td><td>生成规格文档</td><td>需求确定后</td></tr><tr><td><code>/planning-with-files</code></td><td>基于文件规划</td><td>规划任务时</td></tr><tr><td><code>/superpower:init</code></td><td>Git 初始化</td><td>开始新功能前</td></tr><tr><td><code>/superpower:write-plan</code></td><td>编写计划</td><td>需求明确后</td></tr><tr><td><code>/superpower:execute-plan</code></td><td>执行（TDD）</td><td>开发阶段</td></tr><tr><td><code>/superpower:review</code></td><td>代码审查</td><td>开发完成后</td></tr><tr><td><code>/superpower:archive</code></td><td>归档</td><td>功能完成确认后</td></tr><tr><td><code>/ruoyi:gen-crud</code></td><td>生成 CRUD</td><td>后端开发</td></tr><tr><td><code>/api-test generate</code></td><td>生成 API 测试</td><td>测试阶段</td></tr><tr><td><code>/webapp-testing</code></td><td>UI 测试</td><td>测试阶段</td></tr><tr><td><code>/code-review</code></td><td>代码审查</td><td>审查阶段</td></tr><tr><td><code>/frontend-design</code></td><td>前端最佳实践</td><td>前端开发</td></tr><tr><td><code>/ui-ux-pro-max</code></td><td>UI 设计</td><td>页面设计</td></tr><tr><td><code>/pdf</code> / <code>/word</code> / <code>/pptx</code> / <code>/xlsx</code></td><td>文档处理</td><td>文档生成</td></tr></tbody></table><hr><h2 id="附录"><a href="#附录" class="headerlink" title="附录"></a>附录</h2><h3 id="A-相关资源"><a href="#A-相关资源" class="headerlink" title="A. 相关资源"></a>A. 相关资源</h3><table><thead><tr><th>资源</th><th>链接</th></tr></thead><tbody><tr><td>Superpowers</td><td>github.com/obra/superpowers</td></tr><tr><td>RuoYi</td><td>ruoyi.vip</td></tr><tr><td>VBen Admin</td><td>github.com/vbenjs/vue-vben-admin</td></tr><tr><td>Ant Design Vue</td><td>antdv.com</td></tr><tr><td>Claude Code 官方文档</td><td>code.claude.com/docs</td></tr></tbody></table><h3 id="B-版本历史"><a href="#B-版本历史" class="headerlink" title="B. 版本历史"></a>B. 版本历史</h3><table><thead><tr><th>版本</th><th>日期</th><th>更新内容</th></tr></thead><tbody><tr><td>v1.0</td><td>2026-05-20</td><td>初始版本</td></tr><tr><td>v2.0</td><td>2026-05-20</td><td>结构重组，技术栈调整为 JDK8+RuoYi+VBen，移除 Docker 和部署内容</td></tr></tbody></table><hr><p><em>文档版本：v2.0</em><br><em>最后更新：2026-05-20</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;AI-编程完整工作流程&quot;&gt;&lt;a href=&quot;#AI-编程完整工作流程&quot; class=&quot;headerlink&quot; title=&quot;AI 编程完整工作流程&quot;&gt;&lt;/a&gt;AI 编程完整工作流程&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;版本：v2.0 | 日期：2026-05-</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="claude" scheme="https://www.geniux.top/tags/claude/"/>
    
    <category term="skills" scheme="https://www.geniux.top/tags/skills/"/>
    
    <category term="workflow" scheme="https://www.geniux.top/tags/workflow/"/>
    
    <category term="java" scheme="https://www.geniux.top/tags/java/"/>
    
    <category term="vue" scheme="https://www.geniux.top/tags/vue/"/>
    
    <category term="全栈开发" scheme="https://www.geniux.top/tags/%E5%85%A8%E6%A0%88%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>使用 Docker 部署 AI 模型——从模型到 API 服务</title>
    <link href="https://www.geniux.top/article/0b2aa907f45d/"/>
    <id>https://www.geniux.top/article/0b2aa907f45d/</id>
    <published>2026-05-15T02:00:00.000Z</published>
    <updated>2026-06-01T03:47:48.042Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用-Docker-部署-AI-模型——从模型到-API-服务"><a href="#使用-Docker-部署-AI-模型——从模型到-API-服务" class="headerlink" title="使用 Docker 部署 AI 模型——从模型到 API 服务"></a>使用 Docker 部署 AI 模型——从模型到 API 服务</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-05-15<br><strong>本文为原创教程</strong></p></blockquote><hr><p>2026 年，AI 模型部署已经是后端开发者的必备技能。无论是开源的 LLaMA、Stable Diffusion，还是微调的自定义模型，Docker 都是最标准、最可靠的部署方式。</p><p>本文以部署一个文本分类模型为例，带你走完”模型 → API → Docker → 部署”的完整流程。</p><h2 id="一、准备工作"><a href="#一、准备工作" class="headerlink" title="一、准备工作"></a>一、准备工作</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 Docker 和 NVIDIA Container Toolkit（如果使用 GPU）</span></span><br><span class="line">sudo apt install -y nvidia-container-toolkit</span><br><span class="line">sudo systemctl restart docker</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证 GPU 可用</span></span><br><span class="line">docker run --gpus all nvidia/cuda:12.0-base nvidia-smi</span><br></pre></td></tr></table></figure><h2 id="二、项目结构"><a href="#二、项目结构" class="headerlink" title="二、项目结构"></a>二、项目结构</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">ai-model-server/</span><br><span class="line">├── Dockerfile</span><br><span class="line">├── requirements.txt</span><br><span class="line">├── app.py              # FastAPI 服务</span><br><span class="line">├── model/              # 模型文件</span><br><span class="line">│   └── model.pt</span><br><span class="line">├── docker-compose.yml</span><br><span class="line">└── .env</span><br></pre></td></tr></table></figure><h2 id="三、编写-API-服务"><a href="#三、编写-API-服务" class="headerlink" title="三、编写 API 服务"></a>三、编写 API 服务</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> fastapi <span class="keyword">import</span> FastAPI, HTTPException</span><br><span class="line"><span class="keyword">from</span> pydantic <span class="keyword">import</span> BaseModel</span><br><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"><span class="keyword">from</span> transformers <span class="keyword">import</span> AutoTokenizer, AutoModelForSequenceClassification</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> logging</span><br><span class="line"></span><br><span class="line">logging.basicConfig(level=logging.INFO)</span><br><span class="line">logger = logging.getLogger(__name__)</span><br><span class="line"></span><br><span class="line">app = FastAPI(title=<span class="string">&quot;AI Model API&quot;</span>, version=<span class="string">&quot;1.0.0&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局加载模型（避免每次请求都加载）</span></span><br><span class="line">MODEL_PATH = <span class="string">&quot;/app/model&quot;</span></span><br><span class="line">device = torch.device(<span class="string">&quot;cuda&quot;</span> <span class="keyword">if</span> torch.cuda.is_available() <span class="keyword">else</span> <span class="string">&quot;cpu&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line">    tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)</span><br><span class="line">    model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH)</span><br><span class="line">    model.to(device)</span><br><span class="line">    model.<span class="built_in">eval</span>()</span><br><span class="line">    logger.info(<span class="string">f&quot;模型加载完成，使用设备: <span class="subst">&#123;device&#125;</span>&quot;</span>)</span><br><span class="line"><span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">    logger.error(<span class="string">f&quot;模型加载失败: <span class="subst">&#123;e&#125;</span>&quot;</span>)</span><br><span class="line">    model = <span class="literal">None</span></span><br><span class="line">    tokenizer = <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">PredictRequest</span>(<span class="params">BaseModel</span>):</span></span><br><span class="line">    text: <span class="built_in">str</span></span><br><span class="line">    max_length: <span class="built_in">int</span> = <span class="number">128</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">PredictResponse</span>(<span class="params">BaseModel</span>):</span></span><br><span class="line">    label: <span class="built_in">str</span></span><br><span class="line">    confidence: <span class="built_in">float</span></span><br><span class="line">    processing_time_ms: <span class="built_in">float</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@app.get(<span class="params"><span class="string">&quot;/health&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="function"><span class="keyword">def</span> <span class="title">health</span>():</span></span><br><span class="line">    <span class="keyword">return</span> &#123;</span><br><span class="line">        <span class="string">&quot;status&quot;</span>: <span class="string">&quot;ok&quot;</span>,</span><br><span class="line">        <span class="string">&quot;model_loaded&quot;</span>: model <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>,</span><br><span class="line">        <span class="string">&quot;device&quot;</span>: <span class="built_in">str</span>(device)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">@app.post(<span class="params"><span class="string">&quot;/predict&quot;</span>, response_model=PredictResponse</span>)</span></span><br><span class="line"><span class="keyword">async</span> <span class="function"><span class="keyword">def</span> <span class="title">predict</span>(<span class="params">request: PredictRequest</span>):</span></span><br><span class="line">    <span class="keyword">if</span> model <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">        <span class="keyword">raise</span> HTTPException(status_code=<span class="number">503</span>, detail=<span class="string">&quot;模型未加载&quot;</span>)</span><br><span class="line"></span><br><span class="line">    start = time.time()</span><br><span class="line"></span><br><span class="line">    inputs = tokenizer(</span><br><span class="line">        request.text,</span><br><span class="line">        return_tensors=<span class="string">&quot;pt&quot;</span>,</span><br><span class="line">        truncation=<span class="literal">True</span>,</span><br><span class="line">        max_length=request.max_length,</span><br><span class="line">        padding=<span class="literal">True</span></span><br><span class="line">    ).to(device)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">with</span> torch.no_grad():</span><br><span class="line">        outputs = model(**inputs)</span><br><span class="line">        probabilities = torch.nn.functional.softmax(outputs.logits, dim=-<span class="number">1</span>)</span><br><span class="line">        confidence, predicted = torch.<span class="built_in">max</span>(probabilities, dim=-<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 标签映射（根据你的模型调整）</span></span><br><span class="line">    labels = [<span class="string">&quot;negative&quot;</span>, <span class="string">&quot;neutral&quot;</span>, <span class="string">&quot;positive&quot;</span>]</span><br><span class="line"></span><br><span class="line">    processing_time = (time.time() - start) * <span class="number">1000</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> PredictResponse(</span><br><span class="line">        label=labels[predicted.item()],</span><br><span class="line">        confidence=confidence.item(),</span><br><span class="line">        processing_time_ms=<span class="built_in">round</span>(processing_time, <span class="number">2</span>)</span><br><span class="line">    )</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"># requirements.txt</span><br><span class="line">fastapi==0.110.0</span><br><span class="line">uvicorn[standard]==0.27.0</span><br><span class="line">torch&gt;=2.0.0</span><br><span class="line">transformers&gt;=4.35.0</span><br><span class="line">pydantic&gt;=2.0.0</span><br></pre></td></tr></table></figure><h2 id="四、编写-Dockerfile"><a href="#四、编写-Dockerfile" class="headerlink" title="四、编写 Dockerfile"></a>四、编写 Dockerfile</h2><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 多阶段构建</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 阶段一：安装依赖</span></span><br><span class="line"><span class="keyword">FROM</span> python:<span class="number">3.11</span>-slim AS builder</span><br><span class="line"></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /app</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> requirements.txt .</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> pip install --no-cache-dir -r requirements.txt</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 阶段二：运行</span></span><br><span class="line"><span class="keyword">FROM</span> python:<span class="number">3.11</span>-slim</span><br><span class="line"></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装运行时依赖</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update &amp;&amp; apt-get install -y \</span></span><br><span class="line"><span class="bash">    libgomp1 \</span></span><br><span class="line"><span class="bash">    &amp;&amp; rm -rf /var/lib/apt/lists/*</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 从构建阶段复制 Python 包</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> --from=builder /usr/<span class="built_in">local</span>/lib/python3.11/site-packages /usr/<span class="built_in">local</span>/lib/python3.11/site-packages</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> --from=builder /usr/<span class="built_in">local</span>/bin /usr/<span class="built_in">local</span>/bin</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制应用代码</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> app.py .</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> model/ ./model/</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建非 root 用户</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> useradd -m -u 1000 appuser &amp;&amp; chown -R appuser:appuser /app</span></span><br><span class="line"><span class="keyword">USER</span> appuser</span><br><span class="line"></span><br><span class="line"><span class="comment"># 健康检查</span></span><br><span class="line"><span class="keyword">HEALTHCHECK</span><span class="bash"> --interval=30s --timeout=5s --start-period=60s --retries=3 \</span></span><br><span class="line"><span class="bash">    CMD python -c <span class="string">&quot;import requests; requests.get(&#x27;http://localhost:8000/health&#x27;)&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">8000</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># GPU 版本</span></span><br><span class="line"><span class="comment"># CMD [&quot;uvicorn&quot;, &quot;app:app&quot;, &quot;--host&quot;, &quot;0.0.0.0&quot;, &quot;--port&quot;, &quot;8000&quot;]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># CPU 版本（生产推荐）</span></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [<span class="string">&quot;uvicorn&quot;</span>, <span class="string">&quot;app:app&quot;</span>, <span class="string">&quot;--host&quot;</span>, <span class="string">&quot;0.0.0.0&quot;</span>, <span class="string">&quot;--port&quot;</span>, <span class="string">&quot;8000&quot;</span>, <span class="string">&quot;--workers&quot;</span>, <span class="string">&quot;2&quot;</span>]</span></span><br></pre></td></tr></table></figure><h2 id="五、Docker-Compose-配置"><a href="#五、Docker-Compose-配置" class="headerlink" title="五、Docker Compose 配置"></a>五、Docker Compose 配置</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># docker-compose.yml</span></span><br><span class="line"><span class="attr">version:</span> <span class="string">&#x27;3.8&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="comment"># AI 模型服务</span></span><br><span class="line">  <span class="attr">ai-model:</span></span><br><span class="line">    <span class="attr">build:</span></span><br><span class="line">      <span class="attr">context:</span> <span class="string">.</span></span><br><span class="line">      <span class="attr">dockerfile:</span> <span class="string">Dockerfile</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ai-model-server:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">ai-model</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;8000:8000&quot;</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./model:/app/model:ro</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">model-cache:/root/.cache</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">PYTHONUNBUFFERED=1</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">CUDA_VISIBLE_DEVICES=0</span>    <span class="comment"># GPU 编号</span></span><br><span class="line">    <span class="attr">deploy:</span></span><br><span class="line">      <span class="attr">resources:</span></span><br><span class="line">        <span class="attr">reservations:</span></span><br><span class="line">          <span class="attr">devices:</span></span><br><span class="line">            <span class="bullet">-</span> <span class="attr">driver:</span> <span class="string">nvidia</span></span><br><span class="line">              <span class="attr">count:</span> <span class="number">1</span></span><br><span class="line">              <span class="attr">capabilities:</span> [<span class="string">gpu</span>]</span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">healthcheck:</span></span><br><span class="line">      <span class="attr">test:</span> [<span class="string">&quot;CMD&quot;</span>, <span class="string">&quot;curl&quot;</span>, <span class="string">&quot;-f&quot;</span>, <span class="string">&quot;http://localhost:8000/health&quot;</span>]</span><br><span class="line">      <span class="attr">interval:</span> <span class="string">30s</span></span><br><span class="line">      <span class="attr">timeout:</span> <span class="string">10s</span></span><br><span class="line">      <span class="attr">retries:</span> <span class="number">5</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Nginx 反向代理</span></span><br><span class="line">  <span class="attr">nginx:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">nginx:alpine</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">ai-nginx</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;80:80&quot;</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./nginx.conf:/etc/nginx/conf.d/default.conf:ro</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="attr">ai-model:</span></span><br><span class="line">        <span class="attr">condition:</span> <span class="string">service_healthy</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line"></span><br><span class="line"><span class="attr">volumes:</span></span><br><span class="line">  <span class="attr">model-cache:</span></span><br></pre></td></tr></table></figure><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># nginx.conf</span></span><br><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> _;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">client_max_body_size</span> <span class="number">10m</span>;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">location</span> / &#123;</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://ai-model:8000;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host $host;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Real-IP $remote_addr;</span><br><span class="line">        <span class="attribute">proxy_read_timeout</span> <span class="number">60s</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 限制请求速率</span></span><br><span class="line">    <span class="attribute">location</span> /predict &#123;</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://ai-model:8000;</span><br><span class="line">        <span class="attribute">limit_req</span> zone=api burst=<span class="number">10</span> nodelay;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="六、构建与部署"><a href="#六、构建与部署" class="headerlink" title="六、构建与部署"></a>六、构建与部署</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 构建镜像</span></span><br><span class="line">docker compose build</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动</span></span><br><span class="line">docker compose up -d</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看日志</span></span><br><span class="line">docker compose logs -f</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试</span></span><br><span class="line">curl http://localhost:8000/health</span><br><span class="line">curl -X POST http://localhost:8000/predict \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;&quot;text&quot;: &quot;这个产品非常好用，我很满意！&quot;&#125;&#x27;</span></span><br></pre></td></tr></table></figure><h2 id="七、性能优化"><a href="#七、性能优化" class="headerlink" title="七、性能优化"></a>七、性能优化</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启用批处理（提高吞吐量）</span></span><br><span class="line"><span class="keyword">from</span> fastapi.concurrency <span class="keyword">import</span> run_in_threadpool</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">PredictionService</span>:</span></span><br><span class="line">    <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self</span>):</span></span><br><span class="line">        self.batch_size = <span class="number">8</span></span><br><span class="line">        self.queue = []</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">async</span> <span class="function"><span class="keyword">def</span> <span class="title">predict_batch</span>(<span class="params">self, texts: <span class="built_in">list</span></span>):</span></span><br><span class="line">        <span class="comment"># 批量推理，GPU 利用率更高</span></span><br><span class="line">        inputs = tokenizer(texts, return_tensors=<span class="string">&quot;pt&quot;</span>, </span><br><span class="line">                          padding=<span class="literal">True</span>, truncation=<span class="literal">True</span>).to(device)</span><br><span class="line">        <span class="keyword">with</span> torch.no_grad():</span><br><span class="line">            outputs = model(**inputs)</span><br><span class="line">        <span class="keyword">return</span> outputs</span><br></pre></td></tr></table></figure><h2 id="八、总结"><a href="#八、总结" class="headerlink" title="八、总结"></a>八、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 部署 AI 模型的关键点</span></span><br><span class="line"></span><br><span class="line">✅ 多阶段 Docker 构建（减小镜像体积）</span><br><span class="line">✅ 非 root 用户运行</span><br><span class="line">✅ 健康检查</span><br><span class="line">✅ GPU 支持（nvidia-container-toolkit）</span><br><span class="line">✅ 批处理提高吞吐量</span><br><span class="line">✅ 反向代理 + 限流</span><br><span class="line">✅ 模型缓存卷</span><br><span class="line"></span><br><span class="line"><span class="section">## 推荐镜像优化</span></span><br><span class="line"><span class="bullet">-</span> 基础镜像：python:3.11-slim（~150MB）</span><br><span class="line"><span class="bullet">-</span> 使用 pip --no-cache-dir</span><br><span class="line"><span class="bullet">-</span> 多阶段构建分离依赖和代码</span><br><span class="line"><span class="bullet">-</span> 最终镜像：~500MB（含 PyTorch）</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;使用-Docker-部署-AI-模型——从模型到-API-服务&quot;&gt;&lt;a href=&quot;#使用-Docker-部署-AI-模型——从模型到-API-服务&quot; class=&quot;headerlink&quot; title=&quot;使用 Docker 部署 AI 模型——从模型到 API 服</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="docker" scheme="https://www.geniux.top/tags/docker/"/>
    
    <category term="模型部署" scheme="https://www.geniux.top/tags/%E6%A8%A1%E5%9E%8B%E9%83%A8%E7%BD%B2/"/>
    
  </entry>
  
  <entry>
    <title>Linux 服务器初始化与安全加固指南</title>
    <link href="https://www.geniux.top/article/3edd590689da/"/>
    <id>https://www.geniux.top/article/3edd590689da/</id>
    <published>2026-04-20T02:00:00.000Z</published>
    <updated>2026-06-01T03:47:48.013Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Linux-服务器初始化与安全加固指南"><a href="#Linux-服务器初始化与安全加固指南" class="headerlink" title="Linux 服务器初始化与安全加固指南"></a>Linux 服务器初始化与安全加固指南</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-04-20<br><strong>本文为原创教程</strong></p></blockquote><hr><p>拿到一台全新的 Linux 服务器后，直接部署应用是不安全的。本文整理了一套标准化的初始化流程，覆盖<strong>用户管理、SSH 加固、防火墙、Fail2Ban、自动更新</strong>等关键环节。</p><h2 id="一、初始登录"><a href="#一、初始登录" class="headerlink" title="一、初始登录"></a>一、初始登录</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 root 登录</span></span><br><span class="line">ssh root@your-server-ip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 立即更新系统</span></span><br><span class="line">apt update &amp;&amp; apt upgrade -y</span><br><span class="line"><span class="comment"># 或</span></span><br><span class="line">yum update -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看系统信息</span></span><br><span class="line">uname -a</span><br><span class="line">cat /etc/os-release</span><br><span class="line">free -h</span><br><span class="line">df -h</span><br></pre></td></tr></table></figure><h2 id="二、创建普通用户"><a href="#二、创建普通用户" class="headerlink" title="二、创建普通用户"></a>二、创建普通用户</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建部署用户</span></span><br><span class="line">adduser deploy</span><br><span class="line"><span class="comment"># 按提示设置密码和其他信息</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 授予 sudo 权限</span></span><br><span class="line">usermod -aG sudo deploy</span><br><span class="line"><span class="comment"># CentOS: usermod -aG wheel deploy</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">su - deploy</span><br><span class="line">sudo whoami</span><br><span class="line"><span class="comment"># 输出: root</span></span><br></pre></td></tr></table></figure><h2 id="三、SSH-安全加固"><a href="#三、SSH-安全加固" class="headerlink" title="三、SSH 安全加固"></a>三、SSH 安全加固</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编辑 SSH 配置</span></span><br><span class="line">sudo vim /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"># 修改以下配置</span><br><span class="line">Port 2222                           # 修改默认端口（22 → 自定义）</span><br><span class="line">PermitRootLogin no                  # 禁止 root 登录</span><br><span class="line">PasswordAuthentication no           # 禁止密码登录（使用密钥）</span><br><span class="line">PubkeyAuthentication yes            # 启用密钥认证</span><br><span class="line">AllowUsers deploy                   # 只允许指定用户登录</span><br><span class="line">MaxAuthTries 3                      # 最大认证尝试次数</span><br><span class="line">ClientAliveInterval 300             # 客户端超时（秒）</span><br><span class="line">ClientAliveCountMax 2               # 超时重试次数</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 复制本地公钥到服务器</span></span><br><span class="line">ssh-copy-id -p 2222 deploy@your-server-ip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启 SSH</span></span><br><span class="line">sudo systemctl restart sshd</span><br><span class="line"></span><br><span class="line"><span class="comment"># ⚠️ 重启前务必在另一个终端验证能登录！</span></span><br><span class="line">ssh -p 2222 deploy@your-server-ip</span><br></pre></td></tr></table></figure><h2 id="四、配置防火墙"><a href="#四、配置防火墙" class="headerlink" title="四、配置防火墙"></a>四、配置防火墙</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 UFW（Ubuntu）</span></span><br><span class="line">sudo apt install -y ufw</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置默认策略</span></span><br><span class="line">sudo ufw default deny incoming</span><br><span class="line">sudo ufw default allow outgoing</span><br><span class="line"></span><br><span class="line"><span class="comment"># 开放 SSH（使用修改后的端口）</span></span><br><span class="line">sudo ufw allow 2222/tcp comment <span class="string">&#x27;SSH&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 开放 Web 服务</span></span><br><span class="line">sudo ufw allow 80/tcp comment <span class="string">&#x27;HTTP&#x27;</span></span><br><span class="line">sudo ufw allow 443/tcp comment <span class="string">&#x27;HTTPS&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 其他服务按需开放</span></span><br><span class="line">sudo ufw allow 8080/tcp comment <span class="string">&#x27;API&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启用防火墙</span></span><br><span class="line">sudo ufw <span class="built_in">enable</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">sudo ufw status verbose</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># CentOS 使用 firewalld</span></span><br><span class="line">sudo firewall-cmd --permanent --add-port=2222/tcp</span><br><span class="line">sudo firewall-cmd --permanent --add-service=http</span><br><span class="line">sudo firewall-cmd --permanent --add-service=https</span><br><span class="line">sudo firewall-cmd --reload</span><br><span class="line">sudo firewall-cmd --list-all</span><br></pre></td></tr></table></figure><h2 id="五、安装-Fail2Ban"><a href="#五、安装-Fail2Ban" class="headerlink" title="五、安装 Fail2Ban"></a>五、安装 Fail2Ban</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装</span></span><br><span class="line">sudo apt install -y fail2ban</span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制配置</span></span><br><span class="line">sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</span><br></pre></td></tr></table></figure><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># /etc/fail2ban/jail.local</span></span><br><span class="line"><span class="section">[DEFAULT]</span></span><br><span class="line"><span class="attr">bantime</span> = <span class="number">3600</span>                <span class="comment"># 封禁时间（秒）</span></span><br><span class="line"><span class="attr">findtime</span> = <span class="number">600</span>                <span class="comment"># 检测窗口（秒）</span></span><br><span class="line"><span class="attr">maxretry</span> = <span class="number">5</span>                  <span class="comment"># 最大重试次数</span></span><br><span class="line"></span><br><span class="line"><span class="section">[sshd]</span></span><br><span class="line"><span class="attr">enabled</span> = <span class="literal">true</span></span><br><span class="line"><span class="attr">port</span> = <span class="number">2222</span>                   <span class="comment"># 改为你的 SSH 端口</span></span><br><span class="line"><span class="attr">logpath</span> = %(sshd_log)s</span><br><span class="line"><span class="attr">maxretry</span> = <span class="number">3</span></span><br><span class="line"><span class="attr">bantime</span> = <span class="number">86400</span>               <span class="comment"># SSH 暴力破解封禁 1 天</span></span><br><span class="line"></span><br><span class="line"><span class="section">[nginx-http-auth]</span></span><br><span class="line"><span class="attr">enabled</span> = <span class="literal">true</span></span><br><span class="line"><span class="attr">port</span> = http,https</span><br><span class="line"><span class="attr">logpath</span> = /var/log/nginx/error.log</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动</span></span><br><span class="line">sudo systemctl start fail2ban</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> fail2ban</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">sudo fail2ban-client status</span><br><span class="line">sudo fail2ban-client status sshd</span><br></pre></td></tr></table></figure><h2 id="六、自动安全更新"><a href="#六、自动安全更新" class="headerlink" title="六、自动安全更新"></a>六、自动安全更新</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu</span></span><br><span class="line">sudo apt install -y unattended-upgrades</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置自动更新</span></span><br><span class="line">sudo dpkg-reconfigure --priority=low unattended-upgrades</span><br><span class="line"><span class="comment"># 选择 Yes</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看配置</span></span><br><span class="line">sudo cat /etc/apt/apt.conf.d/20auto-upgrades</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># CentOS</span></span><br><span class="line">sudo yum install -y yum-cron</span><br><span class="line">sudo systemctl start yum-cron</span><br><span class="line">sudo systemctl <span class="built_in">enable</span> yum-cron</span><br></pre></td></tr></table></figure><h2 id="七、安装常用工具"><a href="#七、安装常用工具" class="headerlink" title="七、安装常用工具"></a>七、安装常用工具</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 监控</span></span><br><span class="line">sudo apt install -y htop iotop net-tools sysstat</span><br><span class="line"></span><br><span class="line"><span class="comment"># 网络</span></span><br><span class="line">sudo apt install -y curl wget netcat</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑器</span></span><br><span class="line">sudo apt install -y vim git</span><br><span class="line"></span><br><span class="line"><span class="comment"># Docker（如需要）</span></span><br><span class="line">curl -fsSL https://get.docker.com | sh</span><br><span class="line">sudo usermod -aG docker deploy</span><br></pre></td></tr></table></figure><h2 id="八、SWAP-配置"><a href="#八、SWAP-配置" class="headerlink" title="八、SWAP 配置"></a>八、SWAP 配置</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查是否有 SWAP</span></span><br><span class="line">swapon --show</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建 2GB SWAP</span></span><br><span class="line">sudo fallocate -l 2G /swapfile</span><br><span class="line">sudo chmod 600 /swapfile</span><br><span class="line">sudo mkswap /swapfile</span><br><span class="line">sudo swapon /swapfile</span><br><span class="line"></span><br><span class="line"><span class="comment"># 永久生效</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;/swapfile none swap sw 0 0&#x27;</span> | sudo tee -a /etc/fstab</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 SWAP 使用策略</span></span><br><span class="line"><span class="comment"># /etc/sysctl.conf</span></span><br><span class="line">vm.swappiness=10</span><br></pre></td></tr></table></figure><h2 id="九、日志与审计"><a href="#九、日志与审计" class="headerlink" title="九、日志与审计"></a>九、日志与审计</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看登录日志</span></span><br><span class="line">sudo last</span><br><span class="line">sudo lastb          <span class="comment"># 失败的登录尝试</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看系统日志</span></span><br><span class="line">sudo journalctl -xe</span><br><span class="line">sudo journalctl -u sshd -n 50</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看认证日志</span></span><br><span class="line">sudo tail -f /var/<span class="built_in">log</span>/auth.log</span><br></pre></td></tr></table></figure><h2 id="十、一键初始化脚本"><a href="#十、一键初始化脚本" class="headerlink" title="十、一键初始化脚本"></a>十、一键初始化脚本</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment"># server-init.sh — 一键初始化脚本</span></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line"></span><br><span class="line">SSH_PORT=<span class="variable">$&#123;1:-2222&#125;</span></span><br><span class="line">DEPLOY_USER=<span class="variable">$&#123;2:-deploy&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;🚀 开始服务器初始化...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 更新系统</span></span><br><span class="line">apt update &amp;&amp; apt upgrade -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 创建用户</span></span><br><span class="line">adduser --gecos <span class="string">&quot;&quot;</span> <span class="variable">$DEPLOY_USER</span></span><br><span class="line">usermod -aG sudo <span class="variable">$DEPLOY_USER</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. SSH 加固</span></span><br><span class="line">sed -i <span class="string">&quot;s/#Port 22/Port <span class="variable">$SSH_PORT</span>/&quot;</span> /etc/ssh/sshd_config</span><br><span class="line">sed -i <span class="string">&quot;s/PermitRootLogin yes/PermitRootLogin no/&quot;</span> /etc/ssh/sshd_config</span><br><span class="line">sed -i <span class="string">&quot;s/#PasswordAuthentication yes/PasswordAuthentication no/&quot;</span> /etc/ssh/sshd_config</span><br><span class="line">systemctl restart sshd</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 防火墙</span></span><br><span class="line">apt install -y ufw</span><br><span class="line">ufw default deny incoming</span><br><span class="line">ufw default allow outgoing</span><br><span class="line">ufw allow <span class="variable">$SSH_PORT</span>/tcp</span><br><span class="line">ufw allow 80/tcp</span><br><span class="line">ufw allow 443/tcp</span><br><span class="line">ufw --force <span class="built_in">enable</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 5. Fail2Ban</span></span><br><span class="line">apt install -y fail2ban</span><br><span class="line">systemctl <span class="built_in">enable</span> --now fail2ban</span><br><span class="line"></span><br><span class="line"><span class="comment"># 6. 常用工具</span></span><br><span class="line">apt install -y htop curl wget git vim unattended-upgrades</span><br><span class="line"></span><br><span class="line"><span class="comment"># 7. SWAP</span></span><br><span class="line">fallocate -l 2G /swapfile</span><br><span class="line">chmod 600 /swapfile</span><br><span class="line">mkswap /swapfile</span><br><span class="line">swapon /swapfile</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;/swapfile none swap sw 0 0&#x27;</span> &gt;&gt; /etc/fstab</span><br><span class="line"></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;✅ 初始化完成！&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;请使用新端口登录：ssh -p <span class="variable">$SSH_PORT</span> <span class="variable">$DEPLOY_USER</span>@&lt;服务器IP&gt;&quot;</span></span><br></pre></td></tr></table></figure><h2 id="十一、总结"><a href="#十一、总结" class="headerlink" title="十一、总结"></a>十一、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 安全加固清单</span></span><br><span class="line"></span><br><span class="line">□ 创建普通用户，禁止 root 登录</span><br><span class="line">□ 修改 SSH 端口（22 → 自定义）</span><br><span class="line">□ 仅允许密钥登录</span><br><span class="line">□ 配置防火墙（UFW / firewalld）</span><br><span class="line">□ 安装 Fail2Ban 防暴力破解</span><br><span class="line">□ 启用自动安全更新</span><br><span class="line">□ 配置 SWAP</span><br><span class="line">□ 安装监控工具</span><br><span class="line">□ 定期查看日志</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Linux-服务器初始化与安全加固指南&quot;&gt;&lt;a href=&quot;#Linux-服务器初始化与安全加固指南&quot; class=&quot;headerlink&quot; title=&quot;Linux 服务器初始化与安全加固指南&quot;&gt;&lt;/a&gt;Linux 服务器初始化与安全加固指南&lt;/h1&gt;&lt;bloc</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="运维" scheme="https://www.geniux.top/tags/%E8%BF%90%E7%BB%B4/"/>
    
    <category term="linux" scheme="https://www.geniux.top/tags/linux/"/>
    
    <category term="安全" scheme="https://www.geniux.top/tags/%E5%AE%89%E5%85%A8/"/>
    
    <category term="服务器" scheme="https://www.geniux.top/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>CI/CD 流水线优化指南——从入门到高效</title>
    <link href="https://www.geniux.top/article/4b30f0413cdc/"/>
    <id>https://www.geniux.top/article/4b30f0413cdc/</id>
    <published>2026-04-15T02:00:00.000Z</published>
    <updated>2026-06-01T03:47:48.035Z</updated>
    
    <content type="html"><![CDATA[<h1 id="CI-CD-流水线优化指南——从入门到高效"><a href="#CI-CD-流水线优化指南——从入门到高效" class="headerlink" title="CI/CD 流水线优化指南——从入门到高效"></a>CI/CD 流水线优化指南——从入门到高效</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-04-15<br><strong>本文为原创教程</strong></p></blockquote><hr><p>很多团队的 CI/CD 流水线一次构建要跑 30 分钟以上，严重拖慢开发效率。本文从实际优化经验出发，系统性地介绍如何让 CI/CD 流水线跑得更快更稳。</p><h2 id="一、测量现状"><a href="#一、测量现状" class="headerlink" title="一、测量现状"></a>一、测量现状</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">CI</span> <span class="string">Pipeline</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span> [<span class="string">push</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="comment"># 记录每个阶段的耗时，找到瓶颈</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;耗时分析&quot;</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">echo</span> <span class="string">&quot;依赖安装时间&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Lint</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;Lint 时间&quot;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Test</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;测试时间&quot;</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><br><span class="line">        <span class="attr">run:</span> <span class="string">echo</span> <span class="string">&quot;构建时间&quot;</span></span><br></pre></td></tr></table></figure><p>使用 GitHub Actions 的 <strong>Summary</strong> 页面查看每个步骤耗时，找到最慢的部分。</p><h2 id="二、缓存策略"><a href="#二、缓存策略" class="headerlink" title="二、缓存策略"></a>二、缓存策略</h2><h3 id="依赖缓存"><a href="#依赖缓存" class="headerlink" title="依赖缓存"></a>依赖缓存</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Cache</span> <span class="string">npm</span> <span class="string">dependencies</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">~/.npm</span></span><br><span class="line">    <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-npm-$&#123;&#123;</span> <span class="string">hashFiles(&#x27;**/package-lock.json&#x27;)</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">restore-keys:</span> <span class="string">|</span></span><br><span class="line">      <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-npm-</span></span><br></pre></td></tr></table></figure><h3 id="Maven-缓存"><a href="#Maven-缓存" class="headerlink" title="Maven 缓存"></a>Maven 缓存</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Cache</span> <span class="string">Maven</span> <span class="string">dependencies</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">~/.m2</span></span><br><span class="line">    <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-maven-$&#123;&#123;</span> <span class="string">hashFiles(&#x27;**/pom.xml&#x27;)</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">restore-keys:</span> <span class="string">|</span></span><br><span class="line">      <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-maven-</span></span><br></pre></td></tr></table></figure><h3 id="Docker-镜像缓存"><a href="#Docker-镜像缓存" class="headerlink" title="Docker 镜像缓存"></a>Docker 镜像缓存</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Cache</span> <span class="string">Docker</span> <span class="string">layers</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">actions/cache@v4</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">/tmp/.buildx-cache</span></span><br><span class="line">    <span class="attr">key:</span> <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-buildx-$&#123;&#123;</span> <span class="string">github.sha</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">restore-keys:</span> <span class="string">|</span></span><br><span class="line">      <span class="string">$&#123;&#123;</span> <span class="string">runner.os</span> <span class="string">&#125;&#125;-buildx-</span></span><br></pre></td></tr></table></figure><h2 id="三、并行化"><a href="#三、并行化" class="headerlink" title="三、并行化"></a>三、并行化</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="comment"># 并行运行 Lint 和 Test</span></span><br><span class="line">  <span class="attr">lint:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">lint</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 测试矩阵（多版本、多平台）</span></span><br><span class="line">  <span class="attr">test-matrix:</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">node-version:</span> [<span class="number">18</span>, <span class="number">20</span>, <span class="number">22</span>]</span><br><span class="line">        <span class="attr">os:</span> [<span class="string">ubuntu-latest</span>, <span class="string">windows-latest</span>]</span><br><span class="line"></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.os</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Use</span> <span class="string">Node.js</span> <span class="string">$&#123;&#123;</span> <span class="string">matrix.node-version</span> <span class="string">&#125;&#125;</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">$&#123;&#123;</span> <span class="string">matrix.node-version</span> <span class="string">&#125;&#125;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 测试通过后才构建和部署</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">needs:</span> [<span class="string">lint</span>, <span class="string">test</span>, <span class="string">test-matrix</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br></pre></td></tr></table></figure><h2 id="四、条件执行"><a href="#四、条件执行" class="headerlink" title="四、条件执行"></a>四、条件执行</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 只在特定路径变更时才运行</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">paths:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;src/**&#x27;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;package.json&#x27;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;.github/workflows/**&#x27;</span></span><br><span class="line">    <span class="attr">paths-ignore:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;docs/**&#x27;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;README.md&#x27;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&#x27;*.md&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">backend-test:</span></span><br><span class="line">    <span class="comment"># 只在后端代码变更时才运行</span></span><br><span class="line">    <span class="attr">if:</span> <span class="string">contains(join(github.event.commits.*.modified,</span> <span class="string">&#x27;,&#x27;</span><span class="string">),</span> <span class="string">&#x27;backend/&#x27;</span><span class="string">)</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="comment"># 只在 main 分支且测试通过后部署</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 class="string">&amp;&amp;</span> <span class="string">success()</span></span><br></pre></td></tr></table></figure><h2 id="五、分阶段流水线"><a href="#五、分阶段流水线" class="headerlink" title="五、分阶段流水线"></a>五、分阶段流水线</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Efficient</span> <span class="string">CI/CD</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 class="string">develop</span>]</span><br><span class="line">    <span class="attr">paths-ignore:</span> [<span class="string">&#x27;docs/**&#x27;</span>, <span class="string">&#x27;*.md&#x27;</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="comment"># 阶段一：快速检查</span></span><br><span class="line">  <span class="attr">quick-checks:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span> <span class="string">--prefer-offline</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">lint</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">type-check</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">test:unit</span> <span class="string">--</span> <span class="string">--changed</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 阶段二：全面测试</span></span><br><span class="line">  <span class="attr">full-tests:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">quick-checks</span></span><br><span class="line">    <span class="attr">strategy:</span></span><br><span class="line">      <span class="attr">matrix:</span></span><br><span class="line">        <span class="attr">shard:</span> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">test</span> <span class="string">--</span> <span class="string">--shard=$&#123;&#123;</span> <span class="string">matrix.shard</span> <span class="string">&#125;&#125;/4</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 阶段三：构建</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">full-tests</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">docker/setup-buildx-action@v3</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          docker build \</span></span><br><span class="line"><span class="string">            --cache-from=type=gha \</span></span><br><span class="line"><span class="string">            --cache-to=type=gha,mode=max \</span></span><br><span class="line"><span class="string">            -t myapp:$&#123;&#123; github.sha &#125;&#125; .</span></span><br><span class="line"><span class="string"></span>      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">docker</span> <span class="string">push</span> <span class="string">myapp:$&#123;&#123;</span> <span class="string">github.sha</span> <span class="string">&#125;&#125;</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># 阶段四：部署</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">needs:</span> <span class="string">build</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="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">          <span class="string">ssh</span> <span class="string">deploy@server</span> <span class="string">&quot;docker pull myapp:$<span class="template-variable">&#123;&#123; github.sha &#125;&#125;</span> &amp;&amp; docker compose up -d&quot;</span></span><br></pre></td></tr></table></figure><h2 id="六、优化效果对比"><a href="#六、优化效果对比" class="headerlink" title="六、优化效果对比"></a>六、优化效果对比</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 优化前（35分钟）</span></span><br><span class="line">检出 → 安装依赖 → Lint → 测试 → 构建 → Docker构建 → 部署</span><br><span class="line"><span class="code">       (5m)    (8m)  (3m)  (5m)  (8m)    (4m)     (2m)</span></span><br><span class="line"><span class="code">全部串行执行</span></span><br><span class="line"><span class="code"></span></span><br><span class="line"><span class="section">## 优化后（8分钟）</span></span><br><span class="line">┌── 检出（30s）</span><br><span class="line">├── 安装依赖并行 ↓</span><br><span class="line">│   ├── Lint（2m）     ← 并行</span><br><span class="line">│   ├── 单元测试（3m）  ← 并行</span><br><span class="line">│   └── 类型检查（1m） ← 并行</span><br><span class="line">├── 集成测试（3m，分片4×并行）</span><br><span class="line">├── Docker构建（2m，带缓存）</span><br><span class="line">└── 部署（1m，条件执行）</span><br></pre></td></tr></table></figure><h2 id="七、错误处理"><a href="#七、错误处理" class="headerlink" title="七、错误处理"></a>七、错误处理</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 失败时自动重试</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Flaky</span> <span class="string">test</span> <span class="string">retry</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">nick-fields/retry@v3</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">timeout_minutes:</span> <span class="number">10</span></span><br><span class="line">    <span class="attr">max_attempts:</span> <span class="number">3</span></span><br><span class="line">    <span class="attr">command:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">test:e2e</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 发送通知</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Notify</span> <span class="string">on</span> <span class="string">failure</span></span><br><span class="line">  <span class="attr">if:</span> <span class="string">failure()</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">slackapi/slack-github-action@v2</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">webhook:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SLACK_WEBHOOK</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">message:</span> <span class="string">&quot;CI 失败: $<span class="template-variable">&#123;&#123; github.repository &#125;&#125;</span>@$<span class="template-variable">&#123;&#123; github.ref &#125;&#125;</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 收集调试信息</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Upload</span> <span class="string">debug</span> <span class="string">info</span></span><br><span class="line">  <span class="attr">if:</span> <span class="string">failure()</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">actions/upload-artifact@v4</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">debug-info</span></span><br><span class="line">    <span class="attr">path:</span> <span class="string">|</span></span><br><span class="line"><span class="string">      test-results/</span></span><br><span class="line"><span class="string">      *.log</span></span><br></pre></td></tr></table></figure><h2 id="八、总结"><a href="#八、总结" class="headerlink" title="八、总结"></a>八、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## CI/CD 优化清单</span></span><br><span class="line"></span><br><span class="line">□ 启用依赖缓存（npm/Maven/Docker）</span><br><span class="line">□ 并行运行独立任务</span><br><span class="line">□ 使用测试分片加速大规模测试</span><br><span class="line">□ 只在需要时运行 CI（path filter）</span><br><span class="line">□ 使用条件执行（只部署 main 分支）</span><br><span class="line">□ Docker 构建缓存</span><br><span class="line">□ 失败时自动重试不稳定测试</span><br><span class="line">□ 分阶段流水线（快速失败）</span><br><span class="line"></span><br><span class="line"><span class="section">## 效果</span></span><br><span class="line">优化前：30-60 分钟</span><br><span class="line">优化后：5-15 分钟</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;CI-CD-流水线优化指南——从入门到高效&quot;&gt;&lt;a href=&quot;#CI-CD-流水线优化指南——从入门到高效&quot; class=&quot;headerlink&quot; title=&quot;CI/CD 流水线优化指南——从入门到高效&quot;&gt;&lt;/a&gt;CI/CD 流水线优化指南——从入门到高效&lt;/</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="cicd" scheme="https://www.geniux.top/tags/cicd/"/>
    
    <category term="devops" scheme="https://www.geniux.top/tags/devops/"/>
    
    <category term="github-actions" scheme="https://www.geniux.top/tags/github-actions/"/>
    
    <category term="优化" scheme="https://www.geniux.top/tags/%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>前端测试入门教程——从单元测试到 E2E 测试</title>
    <link href="https://www.geniux.top/article/92df3286ab67/"/>
    <id>https://www.geniux.top/article/92df3286ab67/</id>
    <published>2026-03-20T02:00:00.000Z</published>
    <updated>2026-06-01T03:47:48.077Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前端测试入门教程——从单元测试到-E2E-测试"><a href="#前端测试入门教程——从单元测试到-E2E-测试" class="headerlink" title="前端测试入门教程——从单元测试到 E2E 测试"></a>前端测试入门教程——从单元测试到 E2E 测试</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-03-20<br><strong>本文为原创教程</strong></p></blockquote><hr><p>前端测试是保证代码质量的关键手段。很多前端开发者不写测试的原因是”太麻烦”或”不知道怎么测”。本文从实用角度出发，用最小的成本覆盖三种测试类型：<strong>单元测试 → 组件测试 → E2E 测试</strong>。</p><h2 id="一、测试金字塔"><a href="#一、测试金字塔" class="headerlink" title="一、测试金字塔"></a>一、测试金字塔</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">        ╱╲</span><br><span class="line">       ╱  ╲          E2E 测试（少而精）</span><br><span class="line">      ╱    ╲         核心用户流程</span><br><span class="line">     ╱──────╲</span><br><span class="line">    ╱        ╲       集成/组件测试（适量）</span><br><span class="line">   ╱          ╲      组件交互、API 调用</span><br><span class="line">  ╱────────────╲</span><br><span class="line"> ╱              ╲    单元测试（多而快）</span><br><span class="line">╱                ╲   工具函数、业务逻辑</span><br><span class="line">╱──────────────────╲</span><br></pre></td></tr></table></figure><h2 id="二、单元测试（Vitest）"><a href="#二、单元测试（Vitest）" class="headerlink" title="二、单元测试（Vitest）"></a>二、单元测试（Vitest）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装</span></span><br><span class="line">npm install -D vitest</span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// package.json</span></span><br><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;scripts&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;test&quot;</span>: <span class="string">&quot;vitest&quot;</span>,</span><br><span class="line">    <span class="attr">&quot;test:coverage&quot;</span>: <span class="string">&quot;vitest --coverage&quot;</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="测试工具函数"><a href="#测试工具函数" class="headerlink" title="测试工具函数"></a>测试工具函数</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/utils/format.js</span></span><br><span class="line"><span class="keyword">export</span> <span class="function"><span class="keyword">function</span> <span class="title">formatPrice</span>(<span class="params">price</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="string">`¥<span class="subst">$&#123;<span class="built_in">Number</span>(price).toFixed(<span class="number">2</span>)&#125;</span>`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="function"><span class="keyword">function</span> <span class="title">truncate</span>(<span class="params">str, length = <span class="number">100</span></span>) </span>&#123;</span><br><span class="line">  <span class="keyword">if</span> (!str) <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">  <span class="keyword">return</span> str.length &gt; length ? str.slice(<span class="number">0</span>, length) + <span class="string">&#x27;...&#x27;</span> : str</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="function"><span class="keyword">function</span> <span class="title">validateEmail</span>(<span class="params">email</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="regexp">/^[^\s@]+@[^\s@]+\.[^\s@]+$/</span>.test(email)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/utils/__tests__/format.test.js</span></span><br><span class="line"><span class="keyword">import</span> &#123; describe, it, expect &#125; <span class="keyword">from</span> <span class="string">&#x27;vitest&#x27;</span></span><br><span class="line"><span class="keyword">import</span> &#123; formatPrice, truncate, validateEmail &#125; <span class="keyword">from</span> <span class="string">&#x27;../format&#x27;</span></span><br><span class="line"></span><br><span class="line">describe(<span class="string">&#x27;formatPrice&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  it(<span class="string">&#x27;格式化为人民币格式&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    expect(formatPrice(<span class="number">100</span>)).toBe(<span class="string">&#x27;¥100.00&#x27;</span>)</span><br><span class="line">    expect(formatPrice(<span class="number">99.9</span>)).toBe(<span class="string">&#x27;¥99.90&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  it(<span class="string">&#x27;处理零值&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    expect(formatPrice(<span class="number">0</span>)).toBe(<span class="string">&#x27;¥0.00&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  it(<span class="string">&#x27;处理字符串输入&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    expect(formatPrice(<span class="string">&#x27;50.5&#x27;</span>)).toBe(<span class="string">&#x27;¥50.50&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">describe(<span class="string">&#x27;validateEmail&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  it(<span class="string">&#x27;验证有效的邮箱&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    expect(validateEmail(<span class="string">&#x27;test@example.com&#x27;</span>)).toBe(<span class="literal">true</span>)</span><br><span class="line">    expect(validateEmail(<span class="string">&#x27;user.name+tag@domain.co&#x27;</span>)).toBe(<span class="literal">true</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  it(<span class="string">&#x27;验证无效的邮箱&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    expect(validateEmail(<span class="string">&#x27;&#x27;</span>)).toBe(<span class="literal">false</span>)</span><br><span class="line">    expect(validateEmail(<span class="string">&#x27;not-email&#x27;</span>)).toBe(<span class="literal">false</span>)</span><br><span class="line">    expect(validateEmail(<span class="string">&#x27;@domain.com&#x27;</span>)).toBe(<span class="literal">false</span>)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="三、组件测试（Vue-Test-Utils-Vitest）"><a href="#三、组件测试（Vue-Test-Utils-Vitest）" class="headerlink" title="三、组件测试（Vue Test Utils + Vitest）"></a>三、组件测试（Vue Test Utils + Vitest）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D @vue/test-utils jsdom</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// vitest.config.js</span></span><br><span class="line"><span class="keyword">import</span> &#123; defineConfig &#125; <span class="keyword">from</span> <span class="string">&#x27;vitest/config&#x27;</span></span><br><span class="line"><span class="keyword">import</span> vue <span class="keyword">from</span> <span class="string">&#x27;@vitejs/plugin-vue&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> defineConfig(&#123;</span><br><span class="line">  <span class="attr">plugins</span>: [vue()],</span><br><span class="line">  <span class="attr">test</span>: &#123;</span><br><span class="line">    <span class="attr">environment</span>: <span class="string">&#x27;jsdom&#x27;</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- src/components/UserCard.vue --&gt;</span><br><span class="line">&lt;script setup&gt;</span><br><span class="line">const props = defineProps(&#123;</span><br><span class="line">  user: &#123;</span><br><span class="line">    type: Object,</span><br><span class="line">    required: true,</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">const emit = defineEmits([&#x27;delete&#x27;])</span><br><span class="line"></span><br><span class="line">function getRoleLabel(role) &#123;</span><br><span class="line">  const map = &#123; admin: &#x27;管理员&#x27;, user: &#x27;普通用户&#x27;, guest: &#x27;访客&#x27; &#125;</span><br><span class="line">  return map[role] || &#x27;未知&#x27;</span><br><span class="line">&#125;</span><br><span class="line">&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div class=&quot;user-card&quot;&gt;</span><br><span class="line">    &lt;h3&gt;&#123;&#123; user.name &#125;&#125;&lt;/h3&gt;</span><br><span class="line">    &lt;p class=&quot;email&quot;&gt;&#123;&#123; user.email &#125;&#125;&lt;/p&gt;</span><br><span class="line">    &lt;span class=&quot;role&quot; :data-role=&quot;user.role&quot;&gt;&#123;&#123; getRoleLabel(user.role) &#125;&#125;&lt;/span&gt;</span><br><span class="line">    &lt;button @click=&quot;emit(&#x27;delete&#x27;, user.id)&quot; class=&quot;delete-btn&quot;&gt;删除&lt;/button&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/components/__tests__/UserCard.test.js</span></span><br><span class="line"><span class="keyword">import</span> &#123; mount &#125; <span class="keyword">from</span> <span class="string">&#x27;@vue/test-utils&#x27;</span></span><br><span class="line"><span class="keyword">import</span> &#123; describe, it, expect &#125; <span class="keyword">from</span> <span class="string">&#x27;vitest&#x27;</span></span><br><span class="line"><span class="keyword">import</span> UserCard <span class="keyword">from</span> <span class="string">&#x27;../UserCard.vue&#x27;</span></span><br><span class="line"></span><br><span class="line">describe(<span class="string">&#x27;UserCard&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> user = &#123;</span><br><span class="line">    <span class="attr">id</span>: <span class="number">1</span>,</span><br><span class="line">    <span class="attr">name</span>: <span class="string">&#x27;张三&#x27;</span>,</span><br><span class="line">    <span class="attr">email</span>: <span class="string">&#x27;zhangsan@test.com&#x27;</span>,</span><br><span class="line">    <span class="attr">role</span>: <span class="string">&#x27;admin&#x27;</span>,</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  it(<span class="string">&#x27;渲染用户信息&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> wrapper = mount(UserCard, &#123; <span class="attr">props</span>: &#123; user &#125; &#125;)</span><br><span class="line">    expect(wrapper.text()).toContain(<span class="string">&#x27;张三&#x27;</span>)</span><br><span class="line">    expect(wrapper.text()).toContain(<span class="string">&#x27;zhangsan@test.com&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  it(<span class="string">&#x27;角色标签显示正确&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> wrapper = mount(UserCard, &#123; <span class="attr">props</span>: &#123; user &#125; &#125;)</span><br><span class="line">    expect(wrapper.find(<span class="string">&#x27;.role&#x27;</span>).text()).toBe(<span class="string">&#x27;管理员&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  it(<span class="string">&#x27;点击删除按钮触发事件&#x27;</span>, <span class="keyword">async</span> () =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> wrapper = mount(UserCard, &#123; <span class="attr">props</span>: &#123; user &#125; &#125;)</span><br><span class="line">    <span class="keyword">await</span> wrapper.find(<span class="string">&#x27;.delete-btn&#x27;</span>).trigger(<span class="string">&#x27;click&#x27;</span>)</span><br><span class="line">    expect(wrapper.emitted(<span class="string">&#x27;delete&#x27;</span>)).toBeTruthy()</span><br><span class="line">    expect(wrapper.emitted(<span class="string">&#x27;delete&#x27;</span>)[<span class="number">0</span>]).toEqual([<span class="number">1</span>])</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="四、E2E-测试（Playwright）"><a href="#四、E2E-测试（Playwright）" class="headerlink" title="四、E2E 测试（Playwright）"></a>四、E2E 测试（Playwright）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -D @playwright/<span class="built_in">test</span></span><br><span class="line">npx playwright install</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// e2e/login.spec.js</span></span><br><span class="line"><span class="keyword">import</span> &#123; test, expect &#125; <span class="keyword">from</span> <span class="string">&#x27;@playwright/test&#x27;</span></span><br><span class="line"></span><br><span class="line">test.describe(<span class="string">&#x27;登录流程&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">  test.beforeEach(<span class="keyword">async</span> (&#123; page &#125;) =&gt; &#123;</span><br><span class="line">    <span class="keyword">await</span> page.goto(<span class="string">&#x27;http://localhost:5173/login&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  test(<span class="string">&#x27;正常登录&#x27;</span>, <span class="keyword">async</span> (&#123; page &#125;) =&gt; &#123;</span><br><span class="line">    <span class="keyword">await</span> page.fill(<span class="string">&#x27;[data-test=&quot;username&quot;]&#x27;</span>, <span class="string">&#x27;admin&#x27;</span>)</span><br><span class="line">    <span class="keyword">await</span> page.fill(<span class="string">&#x27;[data-test=&quot;password&quot;]&#x27;</span>, <span class="string">&#x27;admin123&#x27;</span>)</span><br><span class="line">    <span class="keyword">await</span> page.click(<span class="string">&#x27;[data-test=&quot;login-btn&quot;]&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 等待跳转到首页</span></span><br><span class="line">    <span class="keyword">await</span> expect(page).toHaveURL(<span class="regexp">/dashboard/</span>)</span><br><span class="line">    <span class="keyword">await</span> expect(page.locator(<span class="string">&#x27;[data-test=&quot;welcome&quot;]&#x27;</span>)).toContainText(<span class="string">&#x27;欢迎回来&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  test(<span class="string">&#x27;密码错误显示提示&#x27;</span>, <span class="keyword">async</span> (&#123; page &#125;) =&gt; &#123;</span><br><span class="line">    <span class="keyword">await</span> page.fill(<span class="string">&#x27;[data-test=&quot;username&quot;]&#x27;</span>, <span class="string">&#x27;admin&#x27;</span>)</span><br><span class="line">    <span class="keyword">await</span> page.fill(<span class="string">&#x27;[data-test=&quot;password&quot;]&#x27;</span>, <span class="string">&#x27;wrong&#x27;</span>)</span><br><span class="line">    <span class="keyword">await</span> page.click(<span class="string">&#x27;[data-test=&quot;login-btn&quot;]&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">await</span> expect(page.locator(<span class="string">&#x27;[data-test=&quot;error-msg&quot;]&#x27;</span>)).toBeVisible()</span><br><span class="line">    <span class="keyword">await</span> expect(page.locator(<span class="string">&#x27;[data-test=&quot;error-msg&quot;]&#x27;</span>)).toContainText(<span class="string">&#x27;用户名或密码错误&#x27;</span>)</span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  test(<span class="string">&#x27;空表单校验&#x27;</span>, <span class="keyword">async</span> (&#123; page &#125;) =&gt; &#123;</span><br><span class="line">    <span class="keyword">await</span> page.click(<span class="string">&#x27;[data-test=&quot;login-btn&quot;]&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">await</span> expect(page.locator(<span class="string">&#x27;[data-test=&quot;username-error&quot;]&#x27;</span>)).toBeVisible()</span><br><span class="line">    <span class="keyword">await</span> expect(page.locator(<span class="string">&#x27;[data-test=&quot;password-error&quot;]&#x27;</span>)).toBeVisible()</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// playwright.config.js</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  <span class="attr">testDir</span>: <span class="string">&#x27;./e2e&#x27;</span>,</span><br><span class="line">  <span class="attr">timeout</span>: <span class="number">30000</span>,</span><br><span class="line">  <span class="attr">use</span>: &#123;</span><br><span class="line">    <span class="attr">baseURL</span>: <span class="string">&#x27;http://localhost:5173&#x27;</span>,</span><br><span class="line">    <span class="attr">screenshot</span>: <span class="string">&#x27;only-on-failure&#x27;</span>,</span><br><span class="line">    <span class="attr">trace</span>: <span class="string">&#x27;retain-on-failure&#x27;</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">projects</span>: [</span><br><span class="line">    &#123; <span class="attr">name</span>: <span class="string">&#x27;chromium&#x27;</span>, <span class="attr">use</span>: &#123; <span class="attr">browserName</span>: <span class="string">&#x27;chromium&#x27;</span> &#125; &#125;,</span><br><span class="line">    &#123; <span class="attr">name</span>: <span class="string">&#x27;firefox&#x27;</span>, <span class="attr">use</span>: &#123; <span class="attr">browserName</span>: <span class="string">&#x27;firefox&#x27;</span> &#125; &#125;,</span><br><span class="line">    &#123; <span class="attr">name</span>: <span class="string">&#x27;webkit&#x27;</span>, <span class="attr">use</span>: &#123; <span class="attr">browserName</span>: <span class="string">&#x27;webkit&#x27;</span> &#125; &#125;,</span><br><span class="line">  ],</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="五、CI-集成"><a href="#五、CI-集成" class="headerlink" title="五、CI 集成"></a>五、CI 集成</h2><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># .github/workflows/test.yml</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">Frontend</span> <span class="string">Tests</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span> [<span class="string">push</span>, <span class="string">pull_request</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">test:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">      <span class="bullet">-</span> <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="number">20</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <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="comment"># 单元测试</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># E2E 测试</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">Playwright</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npx</span> <span class="string">playwright</span> <span class="string">install</span> <span class="string">--with-deps</span> <span class="string">chromium</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Start</span> <span class="string">dev</span> <span class="string">server</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">dev</span> <span class="string">&amp;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Run</span> <span class="string">E2E</span> <span class="string">tests</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npx</span> <span class="string">playwright</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/upload-artifact@v4</span></span><br><span class="line">        <span class="attr">if:</span> <span class="string">failure()</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">test-screenshots</span></span><br><span class="line">          <span class="attr">path:</span> <span class="string">test-results/</span></span><br></pre></td></tr></table></figure><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 测试策略</span></span><br><span class="line"></span><br><span class="line">| 测试类型 | 工具 | 重点 | 数量 |</span><br><span class="line">|---------|------|------|------|</span><br><span class="line">| 单元测试 | Vitest | 工具函数、逻辑 | 多（70%） |</span><br><span class="line">| 组件测试 | Vue Test Utils | 组件渲染、交互 | 中（20%） |</span><br><span class="line">| E2E 测试 | Playwright | 核心用户流程 | 少（10%） |</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><br><span class="line">✅ 给最重要的 5 个用户流程写 E2E 测试</span><br><span class="line">✅ 集成到 CI，每次 push 自动运行</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前端测试入门教程——从单元测试到-E2E-测试&quot;&gt;&lt;a href=&quot;#前端测试入门教程——从单元测试到-E2E-测试&quot; class=&quot;headerlink&quot; title=&quot;前端测试入门教程——从单元测试到 E2E 测试&quot;&gt;&lt;/a&gt;前端测试入门教程——从单元测试到 </summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="前端" scheme="https://www.geniux.top/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="测试" scheme="https://www.geniux.top/tags/%E6%B5%8B%E8%AF%95/"/>
    
    <category term="vitest" scheme="https://www.geniux.top/tags/vitest/"/>
    
    <category term="playwright" scheme="https://www.geniux.top/tags/playwright/"/>
    
  </entry>
  
  <entry>
    <title>Go 语言入门教程——从 Hello World 到 Web 服务</title>
    <link href="https://www.geniux.top/article/5fe316c11b9b/"/>
    <id>https://www.geniux.top/article/5fe316c11b9b/</id>
    <published>2026-03-15T02:00:00.000Z</published>
    <updated>2026-06-01T03:47:48.030Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Go-语言入门教程——从-Hello-World-到-Web-服务"><a href="#Go-语言入门教程——从-Hello-World-到-Web-服务" class="headerlink" title="Go 语言入门教程——从 Hello World 到 Web 服务"></a>Go 语言入门教程——从 Hello World 到 Web 服务</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-03-15<br><strong>本文为原创教程</strong></p></blockquote><hr><p>Go 语言（Golang）由 Google 开发，因其<strong>简洁的语法、原生并发支持和极快的编译速度</strong>，在云原生、微服务、CLI 工具等领域占据重要地位。Docker、Kubernetes、Prometheus 都是用 Go 写的。</p><h2 id="一、安装-Go"><a href="#一、安装-Go" class="headerlink" title="一、安装 Go"></a>一、安装 Go</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载安装包</span></span><br><span class="line">wget https://go.dev/dl/go1.22.0.linux-amd64.tar.gz</span><br><span class="line">sudo tar -C /usr/<span class="built_in">local</span> -xzf go1.22.0.linux-amd64.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置环境变量</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export PATH=$PATH:/usr/local/go/bin&#x27;</span> &gt;&gt; ~/.bashrc</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;export GOPATH=$HOME/go&#x27;</span> &gt;&gt; ~/.bashrc</span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br><span class="line"></span><br><span class="line"><span class="comment"># macOS</span></span><br><span class="line">brew install go</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">go version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置代理（国内）</span></span><br><span class="line">go env -w GO111MODULE=on</span><br><span class="line">go env -w GOPROXY=https://goproxy.cn,direct</span><br></pre></td></tr></table></figure><h2 id="二、基础语法"><a href="#二、基础语法" class="headerlink" title="二、基础语法"></a>二、基础语法</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">&quot;fmt&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    <span class="comment">// 变量声明</span></span><br><span class="line">    <span class="keyword">var</span> name <span class="keyword">string</span> = <span class="string">&quot;Go&quot;</span></span><br><span class="line">    age := <span class="number">28</span>           <span class="comment">// 简短声明</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 常量</span></span><br><span class="line">    <span class="keyword">const</span> PI = <span class="number">3.14159</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 基本类型</span></span><br><span class="line">    <span class="keyword">var</span> isDone <span class="keyword">bool</span> = <span class="literal">false</span></span><br><span class="line">    <span class="keyword">var</span> score <span class="keyword">int64</span> = <span class="number">100</span></span><br><span class="line">    <span class="keyword">var</span> price <span class="keyword">float64</span> = <span class="number">99.9</span></span><br><span class="line">    <span class="keyword">var</span> msg <span class="keyword">string</span> = <span class="string">&quot;Hello&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 数组和切片</span></span><br><span class="line">    <span class="keyword">var</span> arr [<span class="number">3</span>]<span class="keyword">int</span> = [<span class="number">3</span>]<span class="keyword">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line">    slice := []<span class="keyword">int</span>&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line">    slice = <span class="built_in">append</span>(slice, <span class="number">4</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment">// Map</span></span><br><span class="line">    user := <span class="keyword">map</span>[<span class="keyword">string</span>]<span class="keyword">string</span>&#123;</span><br><span class="line">        <span class="string">&quot;name&quot;</span>: <span class="string">&quot;Alice&quot;</span>,</span><br><span class="line">        <span class="string">&quot;email&quot;</span>: <span class="string">&quot;alice@test.com&quot;</span>,</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 结构体</span></span><br><span class="line">    <span class="keyword">type</span> Person <span class="keyword">struct</span> &#123;</span><br><span class="line">        Name <span class="keyword">string</span></span><br><span class="line">        Age  <span class="keyword">int</span></span><br><span class="line">    &#125;</span><br><span class="line">    p := Person&#123;Name: <span class="string">&quot;Bob&quot;</span>, Age: <span class="number">30</span>&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 流程控制</span></span><br><span class="line">    <span class="keyword">if</span> age &gt;= <span class="number">18</span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;成年&quot;</span>)</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        fmt.Println(<span class="string">&quot;未成年&quot;</span>)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">5</span>; i++ &#123;</span><br><span class="line">        fmt.Println(i)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> index, value := <span class="keyword">range</span> slice &#123;</span><br><span class="line">        fmt.Printf(<span class="string">&quot;%d: %d\n&quot;</span>, index, value)</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    fmt.Printf(<span class="string">&quot;Hello %s!\n&quot;</span>, name)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="三、并发编程（Goroutine）"><a href="#三、并发编程（Goroutine）" class="headerlink" title="三、并发编程（Goroutine）"></a>三、并发编程（Goroutine）</h2><p>Go 最强大的特性——并发如此简单：</p><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 启动一个 goroutine</span></span><br><span class="line"><span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">    fmt.Println(<span class="string">&quot;在另一个线程中运行&quot;</span>)</span><br><span class="line">&#125;()</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用 channel 通信</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</span><br><span class="line">        ch &lt;- <span class="string">&quot;Hello from goroutine&quot;</span></span><br><span class="line">    &#125;()</span><br><span class="line"></span><br><span class="line">    msg := &lt;-ch</span><br><span class="line">    fmt.Println(msg)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 带缓冲的 channel</span></span><br><span class="line">ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">int</span>, <span class="number">3</span>)</span><br><span class="line">ch &lt;- <span class="number">1</span></span><br><span class="line">ch &lt;- <span class="number">2</span></span><br><span class="line">ch &lt;- <span class="number">3</span></span><br><span class="line">fmt.Println(&lt;-ch) <span class="comment">// 1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// select 多路复用</span></span><br><span class="line"><span class="keyword">select</span> &#123;</span><br><span class="line"><span class="keyword">case</span> msg1 := &lt;-ch1:</span><br><span class="line">    fmt.Println(msg1)</span><br><span class="line"><span class="keyword">case</span> msg2 := &lt;-ch2:</span><br><span class="line">    fmt.Println(msg2)</span><br><span class="line"><span class="keyword">case</span> &lt;-time.After(<span class="number">1</span> * time.Second):</span><br><span class="line">    fmt.Println(<span class="string">&quot;超时&quot;</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="四、实战：Web-服务"><a href="#四、实战：Web-服务" class="headerlink" title="四、实战：Web 服务"></a>四、实战：Web 服务</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// main.go</span></span><br><span class="line"><span class="keyword">package</span> main</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> (</span><br><span class="line">    <span class="string">&quot;encoding/json&quot;</span></span><br><span class="line">    <span class="string">&quot;fmt&quot;</span></span><br><span class="line">    <span class="string">&quot;log&quot;</span></span><br><span class="line">    <span class="string">&quot;net/http&quot;</span></span><br><span class="line">    <span class="string">&quot;strconv&quot;</span></span><br><span class="line">    <span class="string">&quot;sync&quot;</span></span><br><span class="line">    <span class="string">&quot;time&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 用户模型</span></span><br><span class="line"><span class="keyword">type</span> User <span class="keyword">struct</span> &#123;</span><br><span class="line">    ID        <span class="keyword">int</span>       <span class="string">`json:&quot;id&quot;`</span></span><br><span class="line">    Name      <span class="keyword">string</span>    <span class="string">`json:&quot;name&quot;`</span></span><br><span class="line">    Email     <span class="keyword">string</span>    <span class="string">`json:&quot;email&quot;`</span></span><br><span class="line">    CreatedAt time.Time <span class="string">`json:&quot;created_at&quot;`</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 内存数据库</span></span><br><span class="line"><span class="keyword">type</span> UserStore <span class="keyword">struct</span> &#123;</span><br><span class="line">    mu    sync.RWMutex</span><br><span class="line">    users <span class="keyword">map</span>[<span class="keyword">int</span>]User</span><br><span class="line">    nextID <span class="keyword">int</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">NewUserStore</span><span class="params">()</span> *<span class="title">UserStore</span></span> &#123;</span><br><span class="line">    <span class="keyword">return</span> &amp;UserStore&#123;</span><br><span class="line">        users:  <span class="built_in">make</span>(<span class="keyword">map</span>[<span class="keyword">int</span>]User),</span><br><span class="line">        nextID: <span class="number">1</span>,</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(s *UserStore)</span> <span class="title">Create</span><span class="params">(name, email <span class="keyword">string</span>)</span> <span class="title">User</span></span> &#123;</span><br><span class="line">    s.mu.Lock()</span><br><span class="line">    <span class="keyword">defer</span> s.mu.Unlock()</span><br><span class="line"></span><br><span class="line">    user := User&#123;</span><br><span class="line">        ID:        s.nextID,</span><br><span class="line">        Name:      name,</span><br><span class="line">        Email:     email,</span><br><span class="line">        CreatedAt: time.Now(),</span><br><span class="line">    &#125;</span><br><span class="line">    s.users[user.ID] = user</span><br><span class="line">    s.nextID++</span><br><span class="line">    <span class="keyword">return</span> user</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(s *UserStore)</span> <span class="title">GetAll</span><span class="params">()</span> []<span class="title">User</span></span> &#123;</span><br><span class="line">    s.mu.RLock()</span><br><span class="line">    <span class="keyword">defer</span> s.mu.RUnlock()</span><br><span class="line"></span><br><span class="line">    result := <span class="built_in">make</span>([]User, <span class="number">0</span>, <span class="built_in">len</span>(s.users))</span><br><span class="line">    <span class="keyword">for</span> _, u := <span class="keyword">range</span> s.users &#123;</span><br><span class="line">        result = <span class="built_in">append</span>(result, u)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> result</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// HTTP 处理器</span></span><br><span class="line"><span class="keyword">type</span> UserHandler <span class="keyword">struct</span> &#123;</span><br><span class="line">    store *UserStore</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="params">(h *UserHandler)</span> <span class="title">ServeHTTP</span><span class="params">(w http.ResponseWriter, r *http.Request)</span></span> &#123;</span><br><span class="line">    w.Header().Set(<span class="string">&quot;Content-Type&quot;</span>, <span class="string">&quot;application/json&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">switch</span> r.Method &#123;</span><br><span class="line">    <span class="keyword">case</span> http.MethodGet:</span><br><span class="line">        users := h.store.GetAll()</span><br><span class="line">        json.NewEncoder(w).Encode(users)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">case</span> http.MethodPost:</span><br><span class="line">        <span class="keyword">var</span> req <span class="keyword">struct</span> &#123;</span><br><span class="line">            Name  <span class="keyword">string</span> <span class="string">`json:&quot;name&quot;`</span></span><br><span class="line">            Email <span class="keyword">string</span> <span class="string">`json:&quot;email&quot;`</span></span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> err := json.NewDecoder(r.Body).Decode(&amp;req); err != <span class="literal">nil</span> &#123;</span><br><span class="line">            http.Error(w, <span class="string">`&#123;&quot;error&quot;:&quot;invalid request&quot;&#125;`</span>, http.StatusBadRequest)</span><br><span class="line">            <span class="keyword">return</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        user := h.store.Create(req.Name, req.Email)</span><br><span class="line">        w.WriteHeader(http.StatusCreated)</span><br><span class="line">        json.NewEncoder(w).Encode(user)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">default</span>:</span><br><span class="line">        http.Error(w, <span class="string">`&#123;&quot;error&quot;:&quot;method not allowed&quot;&#125;`</span>, http.StatusMethodNotAllowed)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 中间件</span></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">loggingMiddleware</span><span class="params">(next http.Handler)</span> <span class="title">http</span>.<span class="title">Handler</span></span> &#123;</span><br><span class="line">    <span class="keyword">return</span> http.HandlerFunc(<span class="function"><span class="keyword">func</span><span class="params">(w http.ResponseWriter, r *http.Request)</span></span> &#123;</span><br><span class="line">        start := time.Now()</span><br><span class="line">        next.ServeHTTP(w, r)</span><br><span class="line">        log.Printf(<span class="string">&quot;%s %s %v&quot;</span>, r.Method, r.URL.Path, time.Since(start))</span><br><span class="line">    &#125;)</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</span><br><span class="line">    store := NewUserStore()</span><br><span class="line">    handler := &amp;UserHandler&#123;store: store&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 添加路由</span></span><br><span class="line">    http.Handle(<span class="string">&quot;/api/users&quot;</span>, loggingMiddleware(handler))</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 健康检查</span></span><br><span class="line">    http.HandleFunc(<span class="string">&quot;/health&quot;</span>, <span class="function"><span class="keyword">func</span><span class="params">(w http.ResponseWriter, r *http.Request)</span></span> &#123;</span><br><span class="line">        fmt.Fprintf(w, <span class="string">`&#123;&quot;status&quot;:&quot;ok&quot;&#125;`</span>)</span><br><span class="line">    &#125;)</span><br><span class="line"></span><br><span class="line">    addr := <span class="string">&quot;:8080&quot;</span></span><br><span class="line">    log.Printf(<span class="string">&quot;服务器启动在 %s&quot;</span>, addr)</span><br><span class="line">    log.Fatal(http.ListenAndServe(addr, <span class="literal">nil</span>))</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 运行</span></span><br><span class="line">go run main.go</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试</span></span><br><span class="line">curl http://localhost:8080/health</span><br><span class="line">curl -X POST http://localhost:8080/api/users \</span><br><span class="line">  -H <span class="string">&quot;Content-Type: application/json&quot;</span> \</span><br><span class="line">  -d <span class="string">&#x27;&#123;&quot;name&quot;:&quot;Alice&quot;,&quot;email&quot;:&quot;alice@test.com&quot;&#125;&#x27;</span></span><br><span class="line">curl http://localhost:8080/api/users</span><br></pre></td></tr></table></figure><h2 id="五、包管理"><a href="#五、包管理" class="headerlink" title="五、包管理"></a>五、包管理</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 初始化模块</span></span><br><span class="line">go mod init myapp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加依赖</span></span><br><span class="line">go get github.com/gin-gonic/gin</span><br><span class="line">go get github.com/go-sql-driver/mysql</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新依赖</span></span><br><span class="line">go mod tidy</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载全部依赖</span></span><br><span class="line">go mod download</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编译</span></span><br><span class="line">go build -o myapp main.go</span><br></pre></td></tr></table></figure><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## Go 的核心优势</span></span><br><span class="line"></span><br><span class="line">✅ 简洁——没有复杂的泛型、继承、重载</span><br><span class="line">✅ 并发——goroutine 和 channel 让并发编程简单</span><br><span class="line">✅ 快速——编译速度极快，启动速度更快</span><br><span class="line">✅ 跨平台——编译成单二进制，无需运行时</span><br><span class="line">✅ 标准库——HTTP Server、JSON、加密都开箱即用</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">2.</span> ✅ 接口与错误处理</span><br><span class="line"><span class="bullet">3.</span> ✅ goroutine 与 channel</span><br><span class="line"><span class="bullet">4.</span> ✅ HTTP 服务开发</span><br><span class="line"><span class="bullet">5.</span> ✅ 数据库操作</span><br><span class="line"><span class="bullet">6.</span> ✅ 测试（testing 包）</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Go-语言入门教程——从-Hello-World-到-Web-服务&quot;&gt;&lt;a href=&quot;#Go-语言入门教程——从-Hello-World-到-Web-服务&quot; class=&quot;headerlink&quot; title=&quot;Go 语言入门教程——从 Hello World 到</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="后端" scheme="https://www.geniux.top/tags/%E5%90%8E%E7%AB%AF/"/>
    
    <category term="go" scheme="https://www.geniux.top/tags/go/"/>
    
    <category term="golang" scheme="https://www.geniux.top/tags/golang/"/>
    
  </entry>
  
  <entry>
    <title>WebSocket 入门教程——从理论到实时通信实战</title>
    <link href="https://www.geniux.top/article/a62295c9fe68/"/>
    <id>https://www.geniux.top/article/a62295c9fe68/</id>
    <published>2026-02-20T02:00:00.000Z</published>
    <updated>2026-06-01T03:46:37.507Z</updated>
    
    <content type="html"><![CDATA[<h1 id="WebSocket-入门教程——从理论到实时通信实战"><a href="#WebSocket-入门教程——从理论到实时通信实战" class="headerlink" title="WebSocket 入门教程——从理论到实时通信实战"></a>WebSocket 入门教程——从理论到实时通信实战</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-02-20<br><strong>本文为原创教程</strong></p></blockquote><hr><p>实时通信已经成为现代 Web 应用的标配。无论是聊天、通知、实时数据看板还是在线协作，都需要 WebSocket。</p><p>本文从 WebSocket 协议原理开始，带你用 Spring Boot + Vue 3 搭建完整的实时通信应用。</p><h2 id="一、HTTP-vs-WebSocket"><a href="#一、HTTP-vs-WebSocket" class="headerlink" title="一、HTTP vs WebSocket"></a>一、HTTP vs WebSocket</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## HTTP（轮询）</span></span><br><span class="line">客户端 → 服务器（请求）</span><br><span class="line">客户端 ← 服务器（响应）</span><br><span class="line">客户端 → 服务器（请求）</span><br><span class="line">客户端 ← 服务器（响应）</span><br><span class="line">...</span><br><span class="line">实时性差，每次请求都带 HTTP 头部</span><br><span class="line"></span><br><span class="line"><span class="section">## WebSocket（长连接）</span></span><br><span class="line">客户端 → 服务器（握手升级）</span><br><span class="line">客户端 ←→ 服务器（全双工通信）</span><br><span class="line">...</span><br><span class="line">一次握手，双向通信，头部开销极小</span><br></pre></td></tr></table></figure><table><thead><tr><th>对比</th><th>HTTP 轮询</th><th>WebSocket</th></tr></thead><tbody><tr><td>通信方向</td><td>单向（客户端发起）</td><td>双向</td></tr><tr><td>连接开销</td><td>每次请求都有 HTTP 头部</td><td>一次握手后持久连接</td></tr><tr><td>实时性</td><td>延迟 = 轮询间隔</td><td>毫秒级</td></tr><tr><td>服务端推送</td><td>❌ 需要轮询</td><td>✅ 原生支持</td></tr><tr><td>适用场景</td><td>REST API</td><td>实时消息、游戏、协作</td></tr></tbody></table><h2 id="二、后端实现（Spring-Boot）"><a href="#二、后端实现（Spring-Boot）" class="headerlink" title="二、后端实现（Spring Boot）"></a>二、后端实现（Spring Boot）</h2><h3 id="添加依赖"><a href="#添加依赖" class="headerlink" title="添加依赖"></a>添加依赖</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dependency</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.springframework.boot<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>spring-boot-starter-websocket<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dependency</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="配置-WebSocket"><a href="#配置-WebSocket" class="headerlink" title="配置 WebSocket"></a>配置 WebSocket</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// WebSocketConfig.java</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@EnableWebSocket</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">WebSocketConfig</span> <span class="keyword">implements</span> <span class="title">WebSocketConfigurer</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">registerWebSocketHandlers</span><span class="params">(WebSocketHandlerRegistry registry)</span> </span>&#123;</span><br><span class="line">        registry.addHandler(chatHandler(), <span class="string">&quot;/ws/chat&quot;</span>)</span><br><span class="line">                .setAllowedOrigins(<span class="string">&quot;*&quot;</span>)</span><br><span class="line">                .addInterceptors(<span class="keyword">new</span> HttpSessionHandshakeInterceptor());</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Bean</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> WebSocketHandler <span class="title">chatHandler</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> ChatWebSocketHandler();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="消息处理器"><a href="#消息处理器" class="headerlink" title="消息处理器"></a>消息处理器</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ChatWebSocketHandler.java</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ChatWebSocketHandler</span> <span class="keyword">extends</span> <span class="title">TextWebSocketHandler</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 在线用户列表</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Map&lt;String, WebSocketSession&gt; sessions = <span class="keyword">new</span> ConcurrentHashMap&lt;&gt;();</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">afterConnectionEstablished</span><span class="params">(WebSocketSession session)</span> </span>&#123;</span><br><span class="line">        String userId = getUserId(session);</span><br><span class="line">        sessions.put(userId, session);</span><br><span class="line">        log.info(<span class="string">&quot;用户 &#123;&#125; 已连接&quot;</span>, userId);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 广播在线人数</span></span><br><span class="line">        broadcastUserCount();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">handleTextMessage</span><span class="params">(WebSocketSession session, TextMessage message)</span> </span>&#123;</span><br><span class="line">        String payload = message.getPayload();</span><br><span class="line">        ChatMessage chatMessage = JSON.parseObject(payload, ChatMessage.class);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 根据消息类型处理</span></span><br><span class="line">        <span class="keyword">switch</span> (chatMessage.getType()) &#123;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;chat&quot;</span>:</span><br><span class="line">                handleChat(chatMessage);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;typing&quot;</span>:</span><br><span class="line">                handleTyping(chatMessage);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;read&quot;</span>:</span><br><span class="line">                handleReadReceipt(chatMessage);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">afterConnectionClosed</span><span class="params">(WebSocketSession session, CloseStatus status)</span> </span>&#123;</span><br><span class="line">        String userId = getUserId(session);</span><br><span class="line">        sessions.remove(userId);</span><br><span class="line">        broadcastUserCount();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 发送给指定用户</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">sendToUser</span><span class="params">(String userId, String message)</span> </span>&#123;</span><br><span class="line">        WebSocketSession session = sessions.get(userId);</span><br><span class="line">        <span class="keyword">if</span> (session != <span class="keyword">null</span> &amp;&amp; session.isOpen()) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                session.sendMessage(<span class="keyword">new</span> TextMessage(message));</span><br><span class="line">            &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">                log.error(<span class="string">&quot;发送消息失败&quot;</span>, e);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 广播</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">broadcast</span><span class="params">(String message)</span> </span>&#123;</span><br><span class="line">        sessions.values().forEach(session -&gt; &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (session.isOpen()) &#123;</span><br><span class="line">                    session.sendMessage(<span class="keyword">new</span> TextMessage(message));</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (IOException e) &#123;</span><br><span class="line">                log.error(<span class="string">&quot;广播失败&quot;</span>, e);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="消息模型"><a href="#消息模型" class="headerlink" title="消息模型"></a>消息模型</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ChatMessage.java</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ChatMessage</span> </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> String type;      <span class="comment">// chat, typing, read, online_count</span></span><br><span class="line">    <span class="keyword">private</span> String sender;</span><br><span class="line">    <span class="keyword">private</span> String receiver;</span><br><span class="line">    <span class="keyword">private</span> String content;</span><br><span class="line">    <span class="keyword">private</span> Long timestamp;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="三、前端实现（Vue-3）"><a href="#三、前端实现（Vue-3）" class="headerlink" title="三、前端实现（Vue 3）"></a>三、前端实现（Vue 3）</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><span class="line">&lt;script setup&gt;</span><br><span class="line">import &#123; ref, onMounted, onUnmounted &#125; from &#x27;vue&#x27;</span><br><span class="line"></span><br><span class="line">const ws = ref(null)</span><br><span class="line">const messages = ref([])</span><br><span class="line">const inputMessage = ref(&#x27;&#x27;)</span><br><span class="line">const onlineCount = ref(0)</span><br><span class="line">const userId = &#x27;user_&#x27; + Date.now()</span><br><span class="line"></span><br><span class="line">function connect() &#123;</span><br><span class="line">  const protocol = location.protocol === &#x27;https:&#x27; ? &#x27;wss:&#x27; : &#x27;ws:&#x27;</span><br><span class="line">  const url = `$&#123;protocol&#125;//localhost:8080/ws/chat`</span><br><span class="line"></span><br><span class="line">  ws.value = new WebSocket(url)</span><br><span class="line"></span><br><span class="line">  ws.value.onopen = () =&gt; &#123;</span><br><span class="line">    console.log(&#x27;WebSocket 已连接&#x27;)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ws.value.onmessage = (event) =&gt; &#123;</span><br><span class="line">    const data = JSON.parse(event.data)</span><br><span class="line"></span><br><span class="line">    switch (data.type) &#123;</span><br><span class="line">      case &#x27;chat&#x27;:</span><br><span class="line">        messages.value.push(data)</span><br><span class="line">        break</span><br><span class="line">      case &#x27;online_count&#x27;:</span><br><span class="line">        onlineCount.value = data.count</span><br><span class="line">        break</span><br><span class="line">      case &#x27;typing&#x27;:</span><br><span class="line">        showTypingIndicator(data.sender)</span><br><span class="line">        break</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ws.value.onclose = () =&gt; &#123;</span><br><span class="line">    console.log(&#x27;WebSocket 断开，5秒后重连...&#x27;)</span><br><span class="line">    setTimeout(connect, 5000)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ws.value.onerror = (error) =&gt; &#123;</span><br><span class="line">    console.error(&#x27;WebSocket 错误:&#x27;, error)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">function sendMessage() &#123;</span><br><span class="line">  if (!inputMessage.value.trim()) return</span><br><span class="line"></span><br><span class="line">  const message = &#123;</span><br><span class="line">    type: &#x27;chat&#x27;,</span><br><span class="line">    sender: userId,</span><br><span class="line">    content: inputMessage.value,</span><br><span class="line">    timestamp: Date.now()</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  ws.value.send(JSON.stringify(message))</span><br><span class="line">  inputMessage.value = &#x27;&#x27;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">onMounted(() =&gt; &#123;</span><br><span class="line">  connect()</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">onUnmounted(() =&gt; &#123;</span><br><span class="line">  ws.value?.close()</span><br><span class="line">&#125;)</span><br><span class="line">&lt;/script&gt;</span><br><span class="line"></span><br><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div class=&quot;chat-container&quot;&gt;</span><br><span class="line">    &lt;header&gt;</span><br><span class="line">      &lt;h3&gt;实时聊天&lt;/h3&gt;</span><br><span class="line">      &lt;span class=&quot;online&quot;&gt;👥 &#123;&#123; onlineCount &#125;&#125; 人在线&lt;/span&gt;</span><br><span class="line">    &lt;/header&gt;</span><br><span class="line"></span><br><span class="line">    &lt;div class=&quot;messages&quot;&gt;</span><br><span class="line">      &lt;div v-for=&quot;msg in messages&quot; :key=&quot;msg.timestamp&quot;</span><br><span class="line">           :class=&quot;msg.sender === userId ? &#x27;own&#x27; : &#x27;other&#x27;&quot;&gt;</span><br><span class="line">        &lt;div class=&quot;message-content&quot;&gt;&#123;&#123; msg.content &#125;&#125;&lt;/div&gt;</span><br><span class="line">        &lt;div class=&quot;time&quot;&gt;&#123;&#123; formatTime(msg.timestamp) &#125;&#125;&lt;/div&gt;</span><br><span class="line">      &lt;/div&gt;</span><br><span class="line">    &lt;/div&gt;</span><br><span class="line"></span><br><span class="line">    &lt;div class=&quot;input-area&quot;&gt;</span><br><span class="line">      &lt;input v-model=&quot;inputMessage&quot;</span><br><span class="line">             @keyup.enter=&quot;sendMessage&quot;</span><br><span class="line">             placeholder=&quot;输入消息...&quot;&gt;</span><br><span class="line">      &lt;button @click=&quot;sendMessage&quot;&gt;发送&lt;/button&gt;</span><br><span class="line">    &lt;/div&gt;</span><br><span class="line">  &lt;/div&gt;</span><br><span class="line">&lt;/template&gt;</span><br></pre></td></tr></table></figure><h2 id="四、Nginx-代理-WebSocket"><a href="#四、Nginx-代理-WebSocket" class="headerlink" title="四、Nginx 代理 WebSocket"></a>四、Nginx 代理 WebSocket</h2><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">location</span> /ws/ &#123;</span><br><span class="line">    <span class="attribute">proxy_pass</span> http://backend:8080;</span><br><span class="line">    <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;           <span class="comment"># WebSocket 需要 HTTP/1.1</span></span><br><span class="line">    <span class="attribute">proxy_set_header</span> Upgrade $http_upgrade;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Connection <span class="string">&quot;upgrade&quot;</span>;</span><br><span class="line">    <span class="attribute">proxy_set_header</span> Host $host;</span><br><span class="line">    <span class="attribute">proxy_read_timeout</span> <span class="number">3600s</span>;         <span class="comment"># WebSocket 长连接超时</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="五、测试"><a href="#五、测试" class="headerlink" title="五、测试"></a>五、测试</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 浏览器控制台测试</span></span><br><span class="line"><span class="keyword">const</span> ws = <span class="keyword">new</span> WebSocket(<span class="string">&#x27;ws://localhost:8080/ws/chat&#x27;</span>)</span><br><span class="line"></span><br><span class="line">ws.onopen = <span class="function">() =&gt;</span> <span class="built_in">console</span>.log(<span class="string">&#x27;已连接&#x27;</span>)</span><br><span class="line">ws.onmessage = <span class="function">(<span class="params">e</span>) =&gt;</span> <span class="built_in">console</span>.log(<span class="string">&#x27;收到:&#x27;</span>, e.data)</span><br><span class="line"></span><br><span class="line">ws.send(<span class="built_in">JSON</span>.stringify(&#123;</span><br><span class="line">  <span class="attr">type</span>: <span class="string">&#x27;chat&#x27;</span>,</span><br><span class="line">  <span class="attr">content</span>: <span class="string">&#x27;Hello WebSocket!&#x27;</span>,</span><br><span class="line">  <span class="attr">sender</span>: <span class="string">&#x27;test_user&#x27;</span>,</span><br><span class="line">  <span class="attr">timestamp</span>: <span class="built_in">Date</span>.now()</span><br><span class="line">&#125;))</span><br></pre></td></tr></table></figure><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## WebSocket 核心要点</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> 基于 HTTP 升级握手（101 Switching Protocols）</span><br><span class="line"><span class="bullet">2.</span> 全双工通信，服务端可主动推送</span><br><span class="line"><span class="bullet">3.</span> 头部开销小（2-10 bytes vs HTTP 数百 bytes）</span><br><span class="line"><span class="bullet">4.</span> 支持文本和二进制帧</span><br><span class="line"><span class="bullet">5.</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><br><span class="line">✅ 在线协作编辑</span><br><span class="line">✅ 游戏实时同步</span><br><span class="line">✅ 股票/行情推送</span><br><span class="line">✅ 通知推送</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;WebSocket-入门教程——从理论到实时通信实战&quot;&gt;&lt;a href=&quot;#WebSocket-入门教程——从理论到实时通信实战&quot; class=&quot;headerlink&quot; title=&quot;WebSocket 入门教程——从理论到实时通信实战&quot;&gt;&lt;/a&gt;WebSocke</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="前端" scheme="https://www.geniux.top/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="后端" scheme="https://www.geniux.top/tags/%E5%90%8E%E7%AB%AF/"/>
    
    <category term="websocket" scheme="https://www.geniux.top/tags/websocket/"/>
    
    <category term="实时通信" scheme="https://www.geniux.top/tags/%E5%AE%9E%E6%97%B6%E9%80%9A%E4%BF%A1/"/>
    
  </entry>
  
  <entry>
    <title>使用 Claude Code 进行代码重构——实战指南</title>
    <link href="https://www.geniux.top/article/f05424e49f2d/"/>
    <id>https://www.geniux.top/article/f05424e49f2d/</id>
    <published>2026-02-15T02:00:00.000Z</published>
    <updated>2026-06-01T03:46:37.568Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用-Claude-Code-进行代码重构——实战指南"><a href="#使用-Claude-Code-进行代码重构——实战指南" class="headerlink" title="使用 Claude Code 进行代码重构——实战指南"></a>使用 Claude Code 进行代码重构——实战指南</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-02-15<br><strong>本文为原创教程</strong></p></blockquote><hr><p>代码重构是最适合 AI 编程助手的场景之一。AI 擅长理解现有代码结构并进行系统性修改，而 Claude Code 的 Skills 系统和终端原生能力让它在重构任务中表现尤为出色。</p><h2 id="一、准备工作"><a href="#一、准备工作" class="headerlink" title="一、准备工作"></a>一、准备工作</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 确保项目有版本控制</span></span><br><span class="line">git init</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;chore: 重构前备份&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建重构分支</span></span><br><span class="line">git checkout -b refactor/user-service</span><br></pre></td></tr></table></figure><h3 id="项目上下文文件"><a href="#项目上下文文件" class="headerlink" title="项目上下文文件"></a>项目上下文文件</h3><p>创建 <code>.claude/CLAUDE.md</code> 告诉 Claude 项目规范：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># Project Context</span></span><br><span class="line"></span><br><span class="line"><span class="section">## Tech Stack</span></span><br><span class="line"><span class="bullet">-</span> Spring Boot 2.7 + JDK 8</span><br><span class="line"><span class="bullet">-</span> MyBatis-Plus + MySQL</span><br><span class="line"><span class="bullet">-</span> Vue 3 + Ant Design Vue</span><br><span class="line"></span><br><span class="line"><span class="section">## Code Style</span></span><br><span class="line"><span class="bullet">-</span> 包名: com.example.&#123;module&#125;</span><br><span class="line"><span class="bullet">-</span> 响应格式: &#123; code, msg, data &#125;</span><br><span class="line"><span class="bullet">-</span> Controller 统一用 @RestController</span><br><span class="line"><span class="bullet">-</span> Service 层必须写接口</span><br></pre></td></tr></table></figure><h2 id="二、重构类型与策略"><a href="#二、重构类型与策略" class="headerlink" title="二、重构类型与策略"></a>二、重构类型与策略</h2><h3 id="1-提取方法"><a href="#1-提取方法" class="headerlink" title="1. 提取方法"></a>1. 提取方法</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 重构前：一个方法做太多事</span></span><br><span class="line"><span class="keyword">async</span> <span class="function"><span class="keyword">function</span> <span class="title">createOrder</span>(<span class="params">userId, items, couponCode</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// 校验用户</span></span><br><span class="line">  <span class="keyword">const</span> user = <span class="keyword">await</span> db.users.findById(userId);</span><br><span class="line">  <span class="keyword">if</span> (!user || user.status !== <span class="string">&#x27;active&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Error</span>(<span class="string">&#x27;用户不存在或已禁用&#x27;</span>);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 校验库存</span></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> item <span class="keyword">of</span> items) &#123;</span><br><span class="line">    <span class="keyword">const</span> product = <span class="keyword">await</span> db.products.findById(item.productId);</span><br><span class="line">    <span class="keyword">if</span> (!product || product.stock &lt; item.quantity) &#123;</span><br><span class="line">      <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Error</span>(<span class="string">`商品 <span class="subst">$&#123;item.productId&#125;</span> 库存不足`</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 计算价格</span></span><br><span class="line">  <span class="keyword">let</span> total = items.reduce(<span class="function">(<span class="params">sum, item</span>) =&gt;</span> sum + item.price * item.quantity, <span class="number">0</span>);</span><br><span class="line">  <span class="keyword">if</span> (couponCode) &#123;</span><br><span class="line">    <span class="keyword">const</span> coupon = <span class="keyword">await</span> db.coupons.findByCode(couponCode);</span><br><span class="line">    <span class="keyword">if</span> (coupon) total *= (<span class="number">1</span> - coupon.discount);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 创建订单</span></span><br><span class="line">  <span class="keyword">const</span> order = <span class="keyword">await</span> db.orders.create(&#123; userId, items, total &#125;);</span><br><span class="line">  <span class="keyword">return</span> order;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用 Claude Code：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">claude <span class="string">&quot;将这个 createOrder 方法按职责拆分为多个小方法：</span></span><br><span class="line"><span class="string">validateUser、validateStock、calculatePrice、createOrderRecord&quot;</span></span><br></pre></td></tr></table></figure><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 重构后</span></span><br><span class="line"><span class="keyword">async</span> <span class="function"><span class="keyword">function</span> <span class="title">createOrder</span>(<span class="params">userId, items, couponCode</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">const</span> user = <span class="keyword">await</span> validateUser(userId);</span><br><span class="line">  <span class="keyword">await</span> validateStock(items);</span><br><span class="line">  <span class="keyword">const</span> total = <span class="keyword">await</span> calculatePrice(items, couponCode);</span><br><span class="line">  <span class="keyword">return</span> createOrderRecord(userId, items, total);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-提取通用工具类"><a href="#2-提取通用工具类" class="headerlink" title="2. 提取通用工具类"></a>2. 提取通用工具类</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">claude <span class="string">&quot;将项目中所有处理日期的代码提取到一个 DateUtils 工具类中，</span></span><br><span class="line"><span class="string">放在 com.example.common.utils 包下&quot;</span></span><br></pre></td></tr></table></figure><h3 id="3-迁移到新框架"><a href="#3-迁移到新框架" class="headerlink" title="3. 迁移到新框架"></a>3. 迁移到新框架</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">claude <span class="string">&quot;将这个项目的 Spring MVC Controller 从返回 ModelAndView</span></span><br><span class="line"><span class="string">迁移为 @RestController + @ResponseBody 的 RESTful 风格&quot;</span></span><br></pre></td></tr></table></figure><h2 id="三、批量重构命令"><a href="#三、批量重构命令" class="headerlink" title="三、批量重构命令"></a>三、批量重构命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 重命名</span></span><br><span class="line">claude /batch <span class="string">&quot;将项目中所有 xxxMapper.xml 中的 namespace</span></span><br><span class="line"><span class="string">从 com.old 改为 com.new&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 统一错误处理</span></span><br><span class="line">claude /batch <span class="string">&quot;将 Controller 中的 try-catch 块</span></span><br><span class="line"><span class="string">替换为使用 @ExceptionHandler 的全局异常处理&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加日志</span></span><br><span class="line">claude /batch <span class="string">&quot;为所有 Service 方法的入口和出口添加日志</span></span><br><span class="line"><span class="string">使用 slf4j，格式：method=xxx, params=xxx, result=xxx&quot;</span></span><br></pre></td></tr></table></figure><h2 id="四、代码审查"><a href="#四、代码审查" class="headerlink" title="四、代码审查"></a>四、代码审查</h2><p>重构完成后，让 Claude 进行审查：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">claude /code-review</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或指定范围审查</span></span><br><span class="line">claude <span class="string">&quot;审查 src/main/java/com/example/service/ 目录下的所有修改，</span></span><br><span class="line"><span class="string">重点关注：1) 是否破坏了原有逻辑 2) 命名是否合理 3) 是否遗漏了边界情况&quot;</span></span><br></pre></td></tr></table></figure><h2 id="五、验证重构"><a href="#五、验证重构" class="headerlink" title="五、验证重构"></a>五、验证重构</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 运行现有测试</span></span><br><span class="line">claude <span class="string">&quot;运行所有测试，确认重构没有破坏已有功能&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 检查覆盖率</span></span><br><span class="line">claude <span class="string">&quot;检查重构后的代码测试覆盖率，标记未覆盖的分支&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 对比差异</span></span><br><span class="line">claude <span class="string">&quot;对比 refactor/user-service 和 main 分支的差异，</span></span><br><span class="line"><span class="string">总结所有变更点，生成重构报告&quot;</span></span><br></pre></td></tr></table></figure><h2 id="六、最佳实践"><a href="#六、最佳实践" class="headerlink" title="六、最佳实践"></a>六、最佳实践</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 重构前</span></span><br><span class="line">□ 提交当前代码（git commit）</span><br><span class="line">□ 创建重构分支</span><br><span class="line">□ 编写项目 CLAUDE.md</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><br><span class="line">□ 每步都运行测试</span><br><span class="line">□ 使用 /batch 处理重复性修改</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><br><span class="line">□ 代码审查（/code-review）</span><br><span class="line">□ 对比 diff</span><br><span class="line">□ 性能测试</span><br><span class="line">□ 更新文档</span><br></pre></td></tr></table></figure><h2 id="七、总结"><a href="#七、总结" class="headerlink" title="七、总结"></a>七、总结</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 完整重构工作流</span></span><br><span class="line">git checkout -b refactor/module-name</span><br><span class="line">claude <span class="string">&quot;帮我重构这个模块...&quot;</span></span><br><span class="line">claude /batch <span class="string">&quot;统一格式...&quot;</span></span><br><span class="line">claude /code-review</span><br><span class="line">git commit -m <span class="string">&quot;refactor: 完成模块重构&quot;</span></span><br></pre></td></tr></table></figure><p>Claude Code 特别适合的重构场景：</p><ul><li>✅ 批量重命名和迁移</li><li>✅ 提取公共方法/工具类</li><li>✅ 统一代码风格</li><li>✅ 添加日志和异常处理</li><li>✅ 框架迁移</li></ul><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;使用-Claude-Code-进行代码重构——实战指南&quot;&gt;&lt;a href=&quot;#使用-Claude-Code-进行代码重构——实战指南&quot; class=&quot;headerlink&quot; title=&quot;使用 Claude Code 进行代码重构——实战指南&quot;&gt;&lt;/a&gt;使用 Cl</summary>
      
    
    
    
    
    <category term="ai" scheme="https://www.geniux.top/tags/ai/"/>
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="claude-code" scheme="https://www.geniux.top/tags/claude-code/"/>
    
    <category term="重构" scheme="https://www.geniux.top/tags/%E9%87%8D%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>使用 GitHub Codespaces 搭建云端开发环境</title>
    <link href="https://www.geniux.top/article/b7b4a979896f/"/>
    <id>https://www.geniux.top/article/b7b4a979896f/</id>
    <published>2026-01-20T02:00:00.000Z</published>
    <updated>2026-06-01T03:46:37.538Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用-GitHub-Codespaces-搭建云端开发环境"><a href="#使用-GitHub-Codespaces-搭建云端开发环境" class="headerlink" title="使用 GitHub Codespaces 搭建云端开发环境"></a>使用 GitHub Codespaces 搭建云端开发环境</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-01-20<br><strong>本文为原创教程</strong></p></blockquote><hr><p>2026 年，云端开发已经成为主流。GitHub Codespaces 让你可以在浏览器中就拥有完整的开发环境，无需配置本地环境，开箱即用。</p><h2 id="一、什么是-Codespaces？"><a href="#一、什么是-Codespaces？" class="headerlink" title="一、什么是 Codespaces？"></a>一、什么是 Codespaces？</h2><p>GitHub Codespaces 是基于 VS Code 的云端开发环境：</p><ul><li><strong>一键启动</strong>——点击按钮，30 秒内获得完整开发环境</li><li><strong>配置即代码</strong>——<code>.devcontainer/devcontainer.json</code> 定义环境</li><li><strong>预构建</strong>——提前构建好镜像，启动只需数秒</li><li><strong>随处访问</strong>——浏览器、桌面 VS Code、JetBrains 都支持</li></ul><h3 id="价格"><a href="#价格" class="headerlink" title="价格"></a>价格</h3><table><thead><tr><th>规格</th><th>vCPU</th><th>内存</th><th>存储</th><th>免费额度</th></tr></thead><tbody><tr><td>Basic</td><td>2</td><td>4GB</td><td>32GB</td><td>120小时/月</td></tr><tr><td>Standard</td><td>4</td><td>8GB</td><td>64GB</td><td>60小时/月</td></tr><tr><td>Premium</td><td>8</td><td>16GB</td><td>128GB</td><td>30小时/月</td></tr></tbody></table><h2 id="二、快速开始"><a href="#二、快速开始" class="headerlink" title="二、快速开始"></a>二、快速开始</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 方式一：在 GitHub 仓库中点击 Code → Create codespace</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 方式二：使用命令行</span></span><br><span class="line">gh codespace create --repo owner/repo</span><br><span class="line">gh codespace code  <span class="comment"># 在 VS Code 中打开</span></span><br></pre></td></tr></table></figure><h3 id="默认环境"><a href="#默认环境" class="headerlink" title="默认环境"></a>默认环境</h3><p>GitHub Codespaces 默认提供：</p><ul><li>VS Code（浏览器版）</li><li>Git</li><li>Docker</li><li>Node.js / Python / Go 等常用运行时</li><li>终端（bash/zsh）</li></ul><h2 id="三、配置文件"><a href="#三、配置文件" class="headerlink" title="三、配置文件"></a>三、配置文件</h2><p>创建 <code>.devcontainer/devcontainer.json</code>：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;name&quot;</span>: <span class="string">&quot;My Project&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;image&quot;</span>: <span class="string">&quot;mcr.microsoft.com/devcontainers/universal:2&quot;</span>,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 或使用 Dockerfile</span></span><br><span class="line">  <span class="attr">&quot;build&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;dockerfile&quot;</span>: <span class="string">&quot;Dockerfile&quot;</span></span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 安装扩展</span></span><br><span class="line">  <span class="attr">&quot;extensions&quot;</span>: [</span><br><span class="line">    <span class="string">&quot;ms-python.python&quot;</span>,</span><br><span class="line">    <span class="string">&quot;dbaeumer.vscode-eslint&quot;</span>,</span><br><span class="line">    <span class="string">&quot;esbenp.prettier-vscode&quot;</span></span><br><span class="line">  ],</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 端口自动转发</span></span><br><span class="line">  <span class="attr">&quot;forwardPorts&quot;</span>: [<span class="number">3000</span>, <span class="number">8080</span>],</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 环境变量</span></span><br><span class="line">  <span class="attr">&quot;remoteEnv&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;DATABASE_URL&quot;</span>: <span class="string">&quot;postgresql://localhost:5432/myapp&quot;</span></span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 创建后执行的命令</span></span><br><span class="line">  <span class="attr">&quot;postCreateCommand&quot;</span>: <span class="string">&quot;npm install&quot;</span>,</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 特性（一键安装常用工具）</span></span><br><span class="line">  <span class="attr">&quot;features&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;ghcr.io/devcontainers/features/docker-in-docker:2&quot;</span>: &#123;&#125;,</span><br><span class="line">    <span class="attr">&quot;ghcr.io/devcontainers/features/node:1&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;version&quot;</span>: <span class="string">&quot;20&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="项目示例：Java-后端"><a href="#项目示例：Java-后端" class="headerlink" title="项目示例：Java 后端"></a>项目示例：Java 后端</h3><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;name&quot;</span>: <span class="string">&quot;Spring Boot Project&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;image&quot;</span>: <span class="string">&quot;mcr.microsoft.com/devcontainers/java:17&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;features&quot;</span>: &#123;</span><br><span class="line">    <span class="attr">&quot;ghcr.io/devcontainers/features/java:1&quot;</span>: &#123;</span><br><span class="line">      <span class="attr">&quot;version&quot;</span>: <span class="string">&quot;17&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;installMaven&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">      <span class="attr">&quot;installGradle&quot;</span>: <span class="literal">false</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">&quot;ghcr.io/devcontainers/features/docker-in-docker:2&quot;</span>: &#123;&#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">&quot;extensions&quot;</span>: [</span><br><span class="line">    <span class="string">&quot;vscjava.vscode-java-pack&quot;</span>,</span><br><span class="line">    <span class="string">&quot;vmware.vscode-spring-boot&quot;</span>,</span><br><span class="line">    <span class="string">&quot;gabrielbb.vscode-lombok&quot;</span></span><br><span class="line">  ],</span><br><span class="line">  <span class="attr">&quot;forwardPorts&quot;</span>: [<span class="number">8080</span>],</span><br><span class="line">  <span class="attr">&quot;postCreateCommand&quot;</span>: <span class="string">&quot;mvn clean compile&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="四、自定义-Dockerfile"><a href="#四、自定义-Dockerfile" class="headerlink" title="四、自定义 Dockerfile"></a>四、自定义 Dockerfile</h2><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># .devcontainer/Dockerfile</span></span><br><span class="line"><span class="keyword">FROM</span> mcr.microsoft.com/devcontainers/base:ubuntu-<span class="number">22.04</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 Node.js 20</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \</span></span><br><span class="line"><span class="bash">    &amp;&amp; apt-get install -y nodejs \</span></span><br><span class="line"><span class="bash">    &amp;&amp; npm install -g pnpm</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 Redis CLI</span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update &amp;&amp; apt-get install -y redis-tools</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置工作目录</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="bash"> /workspace</span></span><br></pre></td></tr></table></figure><h2 id="五、预构建配置"><a href="#五、预构建配置" class="headerlink" title="五、预构建配置"></a>五、预构建配置</h2><p>对于大型项目，预构建可以大幅加速启动时间：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;image&quot;</span>: <span class="string">&quot;mcr.microsoft.com/devcontainers/universal:2&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;updateContentCommand&quot;</span>: <span class="string">&quot;npm ci&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;postCreateCommand&quot;</span>: <span class="string">&quot;npm run build&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在仓库 Settings → Codespaces → Set up prebuild 配置预构建，每次 push 到 main 分支时自动构建镜像。</p><h2 id="六、多容器配置"><a href="#六、多容器配置" class="headerlink" title="六、多容器配置"></a>六、多容器配置</h2><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;name&quot;</span>: <span class="string">&quot;Full Stack App&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;dockerComposeFile&quot;</span>: <span class="string">&quot;docker-compose.yml&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;service&quot;</span>: <span class="string">&quot;app&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;workspaceFolder&quot;</span>: <span class="string">&quot;/workspace&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;forwardPorts&quot;</span>: [<span class="number">3000</span>, <span class="number">5432</span>, <span class="number">6379</span>],</span><br><span class="line">  <span class="attr">&quot;extensions&quot;</span>: [</span><br><span class="line">    <span class="string">&quot;ms-python.python&quot;</span>,</span><br><span class="line">    <span class="string">&quot;bradlc.vscode-tailwindcss&quot;</span></span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># docker-compose.yml</span></span><br><span class="line"><span class="attr">version:</span> <span class="string">&#x27;3.8&#x27;</span></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">app:</span></span><br><span class="line">    <span class="attr">build:</span></span><br><span class="line">      <span class="attr">context:</span> <span class="string">.</span></span><br><span class="line">      <span class="attr">dockerfile:</span> <span class="string">Dockerfile</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">.:/workspace:cached</span></span><br><span class="line">    <span class="attr">command:</span> <span class="string">sleep</span> <span class="string">infinity</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">db</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">redis</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">db:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">postgres:16</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">POSTGRES_DB:</span> <span class="string">myapp</span></span><br><span class="line">      <span class="attr">POSTGRES_PASSWORD:</span> <span class="string">password</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">redis:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">redis:7-alpine</span></span><br></pre></td></tr></table></figure><h2 id="七、CLI-命令"><a href="#七、CLI-命令" class="headerlink" title="七、CLI 命令"></a>七、CLI 命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 列出所有 codespace</span></span><br><span class="line">gh codespace list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建新 codespace</span></span><br><span class="line">gh codespace create -r owner/repo -b main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在 VS Code 中打开</span></span><br><span class="line">gh codespace code</span><br><span class="line"></span><br><span class="line"><span class="comment"># 在浏览器中打开</span></span><br><span class="line">gh codespace open --web</span><br><span class="line"></span><br><span class="line"><span class="comment"># SSH 连接</span></span><br><span class="line">gh codespace ssh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止</span></span><br><span class="line">gh codespace stop</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除</span></span><br><span class="line">gh codespace delete</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看使用情况</span></span><br><span class="line">gh codespace view</span><br></pre></td></tr></table></figure><h2 id="八、总结"><a href="#八、总结" class="headerlink" title="八、总结"></a>八、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## Codespaces 的优势</span></span><br><span class="line"></span><br><span class="line">✅ 零配置——克隆即开发</span><br><span class="line">✅ 环境一致——避免&quot;在我电脑上能跑&quot;</span><br><span class="line">✅ 按需付费——不用时停止，不收费</span><br><span class="line">✅ 随处可访问——任何设备都能开发</span><br><span class="line">✅ 团队统一——一个配置，全员一致</span><br><span class="line"></span><br><span class="line"><span class="section">## 适用场景</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> 新成员入职：秒级搭建开发环境</span><br><span class="line"><span class="bullet">-</span> 临时贡献：不用 fork 后配置环境</span><br><span class="line"><span class="bullet">-</span> 培训/教学：统一环境，排除配置干扰</span><br><span class="line"><span class="bullet">-</span> 代码审查：在完整环境中审查</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;使用-GitHub-Codespaces-搭建云端开发环境&quot;&gt;&lt;a href=&quot;#使用-GitHub-Codespaces-搭建云端开发环境&quot; class=&quot;headerlink&quot; title=&quot;使用 GitHub Codespaces 搭建云端开发环境&quot;&gt;&lt;/a</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="github" scheme="https://www.geniux.top/tags/github/"/>
    
    <category term="devops" scheme="https://www.geniux.top/tags/devops/"/>
    
    <category term="开发工具" scheme="https://www.geniux.top/tags/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    <category term="codespaces" scheme="https://www.geniux.top/tags/codespaces/"/>
    
  </entry>
  
  <entry>
    <title>Rust 入门教程——从零开始的系统编程</title>
    <link href="https://www.geniux.top/article/cf72bfbf42c0/"/>
    <id>https://www.geniux.top/article/cf72bfbf42c0/</id>
    <published>2026-01-15T02:00:00.000Z</published>
    <updated>2026-06-01T03:46:37.549Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Rust-入门教程——从零开始的系统编程"><a href="#Rust-入门教程——从零开始的系统编程" class="headerlink" title="Rust 入门教程——从零开始的系统编程"></a>Rust 入门教程——从零开始的系统编程</h1><blockquote><p><strong>作者：</strong> CaoZH<br><strong>日期：</strong> 2026-01-15<br><strong>本文为原创教程</strong></p></blockquote><hr><p>Rust 连续多年在 Stack Overflow 开发者调查中被评为”最受喜爱的编程语言”。它的<strong>内存安全</strong>和<strong>零成本抽象</strong>特性，让它在系统编程、WebAssembly、CLI 工具等领域越来越受欢迎。</p><h2 id="一、安装-Rust"><a href="#一、安装-Rust" class="headerlink" title="一、安装 Rust"></a>一、安装 Rust</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 推荐方式：rustup</span></span><br><span class="line">curl --proto <span class="string">&#x27;=https&#x27;</span> --tlsv1.2 -sSf https://sh.rustup.rs | sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">rustc --version</span><br><span class="line">cargo --version</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新</span></span><br><span class="line">rustup update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看文档（离线）</span></span><br><span class="line">rustup doc</span><br></pre></td></tr></table></figure><h3 id="Hello-World"><a href="#Hello-World" class="headerlink" title="Hello World"></a>Hello World</h3><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">main</span></span>() &#123;</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;Hello, Rust!&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编译运行</span></span><br><span class="line">rustc hello.rs</span><br><span class="line">./hello</span><br><span class="line"></span><br><span class="line"><span class="comment"># 或用 cargo</span></span><br><span class="line">cargo new hello-world</span><br><span class="line"><span class="built_in">cd</span> hello-world</span><br><span class="line">cargo run</span><br></pre></td></tr></table></figure><h2 id="二、基础语法"><a href="#二、基础语法" class="headerlink" title="二、基础语法"></a>二、基础语法</h2><h3 id="变量与可变性"><a href="#变量与可变性" class="headerlink" title="变量与可变性"></a>变量与可变性</h3><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 变量默认不可变</span></span><br><span class="line"><span class="keyword">let</span> x = <span class="number">5</span>;</span><br><span class="line"><span class="comment">// x = 6;  // ❌ 编译错误</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// mut 关键字声明可变变量</span></span><br><span class="line"><span class="keyword">let</span> <span class="keyword">mut</span> y = <span class="number">5</span>;</span><br><span class="line">y = <span class="number">6</span>;  <span class="comment">// ✅</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 常量</span></span><br><span class="line"><span class="keyword">const</span> MAX_USERS: <span class="built_in">u32</span> = <span class="number">1000</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 解构赋值</span></span><br><span class="line"><span class="keyword">let</span> (a, b) = (<span class="number">1</span>, <span class="string">&quot;hello&quot;</span>);</span><br></pre></td></tr></table></figure><h3 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h3><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 标量类型</span></span><br><span class="line"><span class="keyword">let</span> age: <span class="built_in">i32</span> = <span class="number">28</span>;          <span class="comment">// 有符号整数</span></span><br><span class="line"><span class="keyword">let</span> price: <span class="built_in">f64</span> = <span class="number">99.9</span>;      <span class="comment">// 浮点数</span></span><br><span class="line"><span class="keyword">let</span> done: <span class="built_in">bool</span> = <span class="literal">true</span>;      <span class="comment">// 布尔值</span></span><br><span class="line"><span class="keyword">let</span> letter: <span class="built_in">char</span> = <span class="string">&#x27;A&#x27;</span>;     <span class="comment">// 字符</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 复合类型</span></span><br><span class="line"><span class="keyword">let</span> tup: (<span class="built_in">i32</span>, <span class="built_in">f64</span>, &amp;<span class="built_in">str</span>) = (<span class="number">500</span>, <span class="number">6.4</span>, <span class="string">&quot;hello&quot;</span>);</span><br><span class="line"><span class="keyword">let</span> (x, y, z) = tup;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> arr: [<span class="built_in">i32</span>; <span class="number">3</span>] = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>];</span><br><span class="line"><span class="keyword">let</span> first = arr[<span class="number">0</span>];</span><br></pre></td></tr></table></figure><h3 id="所有权系统"><a href="#所有权系统" class="headerlink" title="所有权系统"></a>所有权系统</h3><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Rust 的核心特性：所有权规则</span></span><br><span class="line"><span class="comment">// 1. 每个值都有一个所有者</span></span><br><span class="line"><span class="comment">// 2. 同一时间只能有一个所有者</span></span><br><span class="line"><span class="comment">// 3. 所有者离开作用域，值被丢弃</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">main</span></span>() &#123;</span><br><span class="line">    <span class="keyword">let</span> s1 = <span class="built_in">String</span>::from(<span class="string">&quot;hello&quot;</span>);</span><br><span class="line">    <span class="keyword">let</span> s2 = s1;  <span class="comment">// s1 的所有权转移到 s2</span></span><br><span class="line">    <span class="comment">// println!(&quot;&#123;&#125;&quot;, s1);  // ❌ s1 已失效</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 克隆（深拷贝）</span></span><br><span class="line">    <span class="keyword">let</span> s3 = s2.clone();</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;&#123;&#125;&quot;</span>, s2);  <span class="comment">// ✅</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 借用（引用）</span></span><br><span class="line">    <span class="keyword">let</span> len = calculate_length(&amp;s3);</span><br><span class="line">    <span class="built_in">println!</span>(<span class="string">&quot;&#123;&#125; 的长度是 &#123;&#125;&quot;</span>, s3, len);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">calculate_length</span></span>(s: &amp;<span class="built_in">String</span>) -&gt; <span class="built_in">usize</span> &#123;</span><br><span class="line">    s.len()  <span class="comment">// 不获取所有权</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h3><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 函数定义</span></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">add</span></span>(x: <span class="built_in">i32</span>, y: <span class="built_in">i32</span>) -&gt; <span class="built_in">i32</span> &#123;</span><br><span class="line">    x + y  <span class="comment">// 表达式，不带分号即为返回值</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 方法</span></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Point</span></span> &#123;</span><br><span class="line">    x: <span class="built_in">f64</span>,</span><br><span class="line">    y: <span class="built_in">f64</span>,</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">impl</span> Point &#123;</span><br><span class="line">    <span class="function"><span class="keyword">fn</span> <span class="title">distance</span></span>(&amp;<span class="keyword">self</span>, other: &amp;Point) -&gt; <span class="built_in">f64</span> &#123;</span><br><span class="line">        <span class="keyword">let</span> dx = <span class="keyword">self</span>.x - other.x;</span><br><span class="line">        <span class="keyword">let</span> dy = <span class="keyword">self</span>.y - other.y;</span><br><span class="line">        (dx * dx + dy * dy).sqrt()</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="三、实战：CLI-工具"><a href="#三、实战：CLI-工具" class="headerlink" title="三、实战：CLI 工具"></a>三、实战：CLI 工具</h2><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/main.rs</span></span><br><span class="line"><span class="keyword">use</span> std::env;</span><br><span class="line"><span class="keyword">use</span> std::fs;</span><br><span class="line"><span class="keyword">use</span> std::process;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">main</span></span>() &#123;</span><br><span class="line">    <span class="keyword">let</span> args: <span class="built_in">Vec</span>&lt;<span class="built_in">String</span>&gt; = env::args().collect();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> args.len() &lt; <span class="number">2</span> &#123;</span><br><span class="line">        eprintln!(<span class="string">&quot;用法: &#123;&#125; &lt;文件路径&gt;&quot;</span>, args[<span class="number">0</span>]);</span><br><span class="line">        process::exit(<span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> file_path = &amp;args[<span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">match</span> read_file(file_path) &#123;</span><br><span class="line">        <span class="literal">Ok</span>(content) =&gt; &#123;</span><br><span class="line">            <span class="keyword">let</span> line_count = content.lines().count();</span><br><span class="line">            <span class="keyword">let</span> word_count = content.split_whitespace().count();</span><br><span class="line">            <span class="keyword">let</span> char_count = content.chars().count();</span><br><span class="line"></span><br><span class="line">            <span class="built_in">println!</span>(<span class="string">&quot;文件: &#123;&#125;&quot;</span>, file_path);</span><br><span class="line">            <span class="built_in">println!</span>(<span class="string">&quot;行数: &#123;&#125;&quot;</span>, line_count);</span><br><span class="line">            <span class="built_in">println!</span>(<span class="string">&quot;单词数: &#123;&#125;&quot;</span>, word_count);</span><br><span class="line">            <span class="built_in">println!</span>(<span class="string">&quot;字符数: &#123;&#125;&quot;</span>, char_count);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="literal">Err</span>(e) =&gt; &#123;</span><br><span class="line">            eprintln!(<span class="string">&quot;读取文件失败: &#123;&#125;&quot;</span>, e);</span><br><span class="line">            process::exit(<span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">read_file</span></span>(path: &amp;<span class="built_in">str</span>) -&gt; <span class="built_in">Result</span>&lt;<span class="built_in">String</span>, std::io::Error&gt; &#123;</span><br><span class="line">    fs::read_to_string(path)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="四、错误处理"><a href="#四、错误处理" class="headerlink" title="四、错误处理"></a>四、错误处理</h2><figure class="highlight rust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> std::fs::File;</span><br><span class="line"><span class="keyword">use</span> std::io::&#123;<span class="keyword">self</span>, Read&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用 Result</span></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">read_username</span></span>() -&gt; <span class="built_in">Result</span>&lt;<span class="built_in">String</span>, io::Error&gt; &#123;</span><br><span class="line">    <span class="keyword">let</span> <span class="keyword">mut</span> file = File::open(<span class="string">&quot;user.txt&quot;</span>)?;  <span class="comment">// ? 运算符传播错误</span></span><br><span class="line">    <span class="keyword">let</span> <span class="keyword">mut</span> content = <span class="built_in">String</span>::new();</span><br><span class="line">    file.read_to_string(&amp;<span class="keyword">mut</span> content)?;</span><br><span class="line">    <span class="literal">Ok</span>(content.trim().to_string())</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用 Option</span></span><br><span class="line"><span class="function"><span class="keyword">fn</span> <span class="title">find_user</span></span>(id: <span class="built_in">i32</span>) -&gt; <span class="built_in">Option</span>&lt;<span class="built_in">String</span>&gt; &#123;</span><br><span class="line">    <span class="keyword">let</span> users = <span class="built_in">vec!</span>[<span class="string">&quot;Alice&quot;</span>.to_string(), <span class="string">&quot;Bob&quot;</span>.to_string()];</span><br><span class="line">    users.get(id <span class="keyword">as</span> <span class="built_in">usize</span>).cloned()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="五、常用命令"><a href="#五、常用命令" class="headerlink" title="五、常用命令"></a>五、常用命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cargo new project_name     <span class="comment"># 创建新项目</span></span><br><span class="line">cargo build                <span class="comment"># 编译</span></span><br><span class="line">cargo build --release      <span class="comment"># 编译（优化）</span></span><br><span class="line">cargo run                  <span class="comment"># 编译并运行</span></span><br><span class="line">cargo check                <span class="comment"># 检查语法（不生成二进制）</span></span><br><span class="line">cargo <span class="built_in">test</span>                 <span class="comment"># 运行测试</span></span><br><span class="line">cargo doc --open           <span class="comment"># 生成文档</span></span><br><span class="line">cargo add serde            <span class="comment"># 添加依赖</span></span><br><span class="line">cargo publish              <span class="comment"># 发布到 crates.io</span></span><br></pre></td></tr></table></figure><h2 id="六、总结"><a href="#六、总结" class="headerlink" title="六、总结"></a>六、总结</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">## 核心概念</span></span><br><span class="line"><span class="bullet">-</span> 所有权（Ownership）</span><br><span class="line"><span class="bullet">-</span> 借用（Borrowing）</span><br><span class="line"><span class="bullet">-</span> 生命周期（Lifetime）</span><br><span class="line"><span class="bullet">-</span> 模式匹配（Pattern Matching）</span><br><span class="line"><span class="bullet">-</span> 无惧并发（Fearless Concurrency）</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">2.</span> ✅ 枚举与模式匹配</span><br><span class="line"><span class="bullet">3.</span> ✅ 错误处理</span><br><span class="line"><span class="bullet">4.</span> ✅ 泛型与 trait</span><br><span class="line"><span class="bullet">5.</span> ✅ 生命周期</span><br><span class="line"><span class="bullet">6.</span> ✅ 并发编程</span><br><span class="line"><span class="bullet">7.</span> ✅  unsafe Rust</span><br></pre></td></tr></table></figure><hr><p><em>首发于 CaoZH 的笔记</em></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Rust-入门教程——从零开始的系统编程&quot;&gt;&lt;a href=&quot;#Rust-入门教程——从零开始的系统编程&quot; class=&quot;headerlink&quot; title=&quot;Rust 入门教程——从零开始的系统编程&quot;&gt;&lt;/a&gt;Rust 入门教程——从零开始的系统编程&lt;/h1&gt;&lt;</summary>
      
    
    
    
    
    <category term="教程" scheme="https://www.geniux.top/tags/%E6%95%99%E7%A8%8B/"/>
    
    <category term="rust" scheme="https://www.geniux.top/tags/rust/"/>
    
    <category term="系统编程" scheme="https://www.geniux.top/tags/%E7%B3%BB%E7%BB%9F%E7%BC%96%E7%A8%8B/"/>
    
  </entry>
  
</feed>
