<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://nfcup.cn/</id>
  <title type="text">南风尘小站</title>
  <subtitle type="text">个人主页与技术笔记</subtitle>
  <updated>2026-09-12T00:00:00.000Z</updated>
  <author><name>南风尘</name></author>
  <link rel="alternate" href="https://nfcup.cn/"/>
  <link rel="self" href="https://nfcup.cn/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://nfcup.cn/posts/ai-automation-tutorial/</id>
      <title type="text">从零开始：让 AI 帮你写自动化脚本 · 傻瓜版教程</title>
      <published>2026-09-10T00:00:00.000Z</published>
      <updated>2026-09-10T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/ai-automation-tutorial/"/>
      <summary type="text">面向零基础同事的入门教程：装好工具、跑通案例、写提示词改造脚本、接入钉钉通知与定时运行。</summary>
      <content type="html"><![CDATA[<blockquote><p><strong>写给谁</strong>：电脑上没装过 Python、WorkBuddy、Trae Work、TraeCode，完全零代码基础的同事。
<strong>看完你能学会</strong>：装好全部工具 → 把 4 个成功案例跑起来 → 用”提示词”指挥 AI 把案例改造成你公司/你岗位的专有脚本 → 让结果自动发到钉钉 → 定时自动运行、日常维护。
<strong>你不需要</strong>：会写代码、懂英文、懂编程概念。全程只做三件事：<strong>装软件、改配置、说人话下指令</strong>。</p></blockquote>
<hr />
<section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li>第 0 章 先搞懂：这套东西是什么、各工具干什么</li>
<li>第 1 章 概念扫盲：提示词、成功案例、配置文件</li>
<li>第 2 章 软件安装与环境部署（让 AI 帮你装）</li>
<li>第 3 章 认识 4 个成功案例</li>
<li>第 4 章 第一次运行成功案例（改配置 → 双击 → 出结果）</li>
<li>第 5 章 核心章节：学会写提示词，让 AI 把案例改成你自己的</li>
<li>第 6 章 用 TraeCode 调试：看懂报错、把报错喂回给 AI</li>
<li>第 7 章 接入钉钉：机器人通知 + AI 表格自动流</li>
<li>第 8 章 定时自动运行（Windows 任务计划程序）</li>
<li>第 9 章 日常运行与维护</li>
<li>附录 A 提示词速查卡（10 条即抄即用）</li>
<li>附录 B 常见报错对照表</li>
<li>附录 C 安全红线（必读）</li>
</ul><hr /></section>
<section><h1>第 0 章 先搞懂：这套东西是什么、各工具干什么<a href="#第-0-章-先搞懂这套东西是什么各工具干什么"><span>#</span></a></h1><p>用一个比喻：<strong>你要开一家”自动化快餐店”，每个工具就是一个岗位。</strong></p>

<table><thead><tr><th>工具</th><th>角色</th><th>比喻</th><th>你需要学到什么程度</th></tr></thead><tbody><tr><td><strong>Python</strong></td><td>底层脚本语言，所有脚本靠它运行</td><td>厨房的燃气和电——没有它灶点不着</td><td>只负责”装好”，装完基本不用碰</td></tr><tr><td><strong>WorkBuddy</strong></td><td>日常 AI 搭建主力，对话式干活</td><td>大厨——你说要什么菜，他做</td><td>会聊天、会发指令（提示词）</td></tr><tr><td><strong>Trae Work</strong></td><td>另一个 AI 搭建主力，和 WorkBuddy 二选一或配合用</td><td>二厨——擅长盯着项目文件干活</td><td>同上</td></tr><tr><td><strong>TraeCode</strong></td><td>IDE（代码编辑器），用来调试脚本</td><td>车间检修台——东西坏了在这里拆开看</td><td>会打开文件夹、会运行、会复制报错信息</td></tr><tr><td><strong>钉钉 MCP / AI 表格自动流</strong></td><td>成果输出平台</td><td>出餐口——做好的菜从这里端给客人</td><td>会建群机器人、会授权连接</td></tr></tbody></table><p><strong>一句话总结工作流：</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>你用"人话"（提示词）指挥 AI（WorkBuddy / Trae Work）</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>↓</span></div></div><div><div><div>3</div></div><div><span>AI 参考成功案例，生成/修改 Python 脚本</span></div></div><div><div><div>4</div></div><div><span><span>        </span></span><span>↓</span></div></div><div><div><div>5</div></div><div><span>你双击 bat 文件运行脚本</span></div></div><div><div><div>6</div></div><div><span><span>        </span></span><span>↓</span></div></div><div><div><div>7</div></div><div><span>结果（报表/消息）自动输出到钉钉</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>你全程不写一行代码，你只负责：说清楚需求 + 改配置文件里的账号路径 + 把报错复制给 AI。</strong></p><hr /></section>
<section><h1>第 1 章 概念扫盲：提示词、成功案例、配置文件<a href="#第-1-章-概念扫盲提示词成功案例配置文件"><span>#</span></a></h1><section><h2>1.1 什么是”提示词”？<a href="#11-什么是提示词"><span>#</span></a></h2><p><strong>提示词 = 你发给 AI 的工作指令。</strong> 没有任何神秘感，就是”把话说清楚”。</p><p>对比一下：</p><p>❌ 差的提示词：“帮我做个脚本。“（AI 不知道你要什么，只能瞎猜）</p><p>✅ 好的提示词：“参考我发给你的’蓝凌EKP系统登录’成功案例，帮我写一个自动登录我们公司 OA 系统的脚本：每天早上自动登录，把’请假审批’列表里昨天结束的流程全部导出成 Excel，存到 （本机路径） 文件夹。账号密码放在配置文件里。“（AI 能直接开工）</p><p>好提示词的秘诀就一条：<strong>把”谁、参考什么、做什么、结果放哪”四件事说全。</strong> 第 5 章会给你万能公式和现成模板。</p></section><section><h2>1.2 什么是”成功案例”？<a href="#12-什么是成功案例"><span>#</span></a></h2><p>成功案例就是 <strong>4 个已经做完、能正常运行的自动化项目</strong>，它们是你学走这套本领的”样板间”。你不需要看懂里面的代码——你只需要知道：</p><ol>
<li>它能干什么（比如：自动登录网站、下载报表、发钉钉通知）；</li>
<li>哪个文件是”遥控器”（配置文件）；</li>
<li>哪个文件双击就能跑（.bat 启动文件）。</li>
</ol><p><strong>AI 改造案例的原理</strong>：你把成功案例文件夹交给 AI，说”照着这个样子，改成我公司的场景”。AI 会模仿案例的结构、套路、写法，生成属于你的新脚本。这就是”参考成功案例”的含义——<strong>案例是给 AI 看的范本，不是给你看的</strong>。</p></section><section><h2>1.3 什么是”配置文件”（.ini）？<a href="#13-什么是配置文件ini"><span>#</span></a></h2><p>打开任何一个案例文件夹，你都会看到一个 <code>.ini</code> 结尾的文件，长得像这样（已脱敏）：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[登录信息]</span></div></div><div><div><div>2</div></div><div><span>登录账号 = 你的账号</span></div></div><div><div><div>3</div></div><div><span>登录密码 = 你的密码</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[浏览器配置]</span></div></div><div><div><div>6</div></div><div><span>无头模式 = false</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这就是<strong>遥控器</strong>：账号密码、网址、保存路径、要不要后台运行……所有”会变的东西”都集中在这一个文件里。</p><p><strong>你以后 90% 的”修改工作”就是改这个文件</strong>——比如换账号、换下载路径、增删一个下载任务。改法：用记事本或 TraeCode 打开，改等号右边的值，保存。</p><blockquote><p>⚠️ 注意：<code>等号左边</code>的名字不要动，只改<code>等号右边</code>的值；<code>#</code> 或 <code>;</code> 开头的行是注释说明，可以随便看，删不删都行。</p></blockquote></section><section><h2>1.4 三个文件后缀，认识就够了<a href="#14-三个文件后缀认识就够了"><span>#</span></a></h2>

<table><thead><tr><th>后缀</th><th>是什么</th><th>你要干什么</th></tr></thead><tbody><tr><td><code>.py</code></td><td>Python 脚本（代码本体）</td><td><strong>不用打开、不用改</strong>，AI 负责写</td></tr><tr><td><code>.ini</code></td><td>配置文件（遥控器）</td><td>经常改，只改等号右边的值</td></tr><tr><td><code>.bat</code></td><td>一键启动器</td><td>双击它，脚本就跑起来了</td></tr></tbody></table><hr /></section></section>
<section><h1>第 2 章 软件安装与环境部署（让 AI 帮你装）<a href="#第-2-章-软件安装与环境部署让-ai-帮你装"><span>#</span></a></h1><blockquote><p>系统要求：Windows 10 / 11。全程约 30～60 分钟（大部分时间在等下载）。</p></blockquote><section><h2>2.1 安装 Python（唯一需要手动点几次鼠标的环节）<a href="#21-安装-python唯一需要手动点几次鼠标的环节"><span>#</span></a></h2><ol>
<li>打开浏览器，访问 Python 官网下载页：`http（本机路径）</li>
<li>点击黄色的 <strong>Download Python 3.x.x</strong> 大按钮，下载安装包。</li>
<li>双击安装包，<strong>第一屏最关键</strong>：
<ul>
<li>✅ 务必勾选底部的 <strong>“Add python.exe to PATH”</strong>（把 Python 加入系统路径）——不勾后面全盘卡住；</li>
<li>然后点 <strong>Install Now</strong>，一路等待完成。</li>
</ul>
</li>
<li>验证是否装好：按键盘 <code>Win + R</code>，输入 <code>cmd</code> 回车，打开黑色命令行窗口，输入：</li>
</ol><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>python --version</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>显示 <code>Python 3.12</code> 之类的版本号 = 成功。显示”不是内部或外部命令” = 大概率没勾 Add to PATH，<strong>不用慌，看 2.3 让 AI 救你</strong>。</p></section><section><h2>2.2 安装 WorkBuddy、Trae Work、TraeCode<a href="#22-安装-workbuddytrae-worktraecode"><span>#</span></a></h2><p>三个都是图形界面软件，和装微信一样：官网下载安装包 → 双击 → 下一步到底。</p>

<table><thead><tr><th>软件</th><th>安装要点</th></tr></thead><tbody><tr><td><strong>WorkBuddy</strong></td><td>官网（workbuddy.cn）下载 Windows 版，安装后用公司账号登录即可对话</td></tr><tr><td><strong>Trae Work</strong></td><td>Trae 官网下载 “Trae Work” 版本（区别于普通 Trae），安装后登录</td></tr><tr><td><strong>TraeCode</strong></td><td>同一官网下载 “Trae Code” 版本，它是个编辑器，装完不用登录也能用基本功能</td></tr></tbody></table><blockquote><p>三者的分工回顾：WorkBuddy / Trae Work 负责”聊天干活”，TraeCode 负责”打开项目看文件、跑脚本、看报错”。</p></blockquote></section><section><h2>2.3 关键姿势：环境部署也交给 AI<a href="#23-关键姿势环境部署也交给-ai"><span>#</span></a></h2><p>装完软件后，<strong>缺什么库、路径不对、环境变量坏了——全都直接问 AI，不要自己百度</strong>。把下面这段话复制给 WorkBuddy：</p><blockquote><p>📋 <strong>提示词模板 ①：环境体检与部署</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>我是一零基础新手，刚在这台 Windows 电脑上装好了 Python、WorkBuddy。</span></div></div><div><div><div>2</div></div><div><span>请你帮我完成环境检查和部署：</span></div></div><div><div><div>3</div></div><div><span>1、检查 Python 是否安装成功、版本是多少；</span></div></div><div><div><div>4</div></div><div><span>2、帮我安装项目需要的依赖库：playwright、beautifulsoup4、openpyxl、requests；</span></div></div><div><div><div>5</div></div><div><span>3、检测缺什么就装什么，安装过程和结果用大白话告诉我；</span></div></div><div><div><div>6</div></div><div><span>4、全部完成后，给我一份"环境体检报告"：哪些已就绪、哪些还有问题、下一步该干什么。</span></div></div><div><div><div>7</div></div><div><span>注意：所有命令你直接帮我执行，不要让我自己敲命令行。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><p>AI 会自动执行检查、安装依赖、报告结果。<strong>遇到任何红色报错，直接截图发给它</strong>，说”这一步失败了，帮我解决”。</p></section><section><h2>2.4 验证清单<a href="#24-验证清单"><span>#</span></a></h2><p>全部装完后，对着打勾：</p><ul>
<li> <code>Win+R</code> → <code>cmd</code> → <code>python --version</code> 能显示版本号</li>
<li> WorkBuddy 打开后能正常对话</li>
<li> Trae Work 打开后能正常对话</li>
<li> TraeCode 能打开一个文件夹（随便拖个文件夹进去试试）</li>
<li> 把提示词模板①发给 AI，它回复”环境就绪”</li>
</ul><p>全打勾 → 进入第 3 章。</p><hr /></section></section>
<section><h1>第 3 章 认识 4 个成功案例<a href="#第-3-章-认识-4-个成功案例"><span>#</span></a></h1><p>把”成功案例”文件夹整体复制到自己电脑（建议放 `（本机路径），<strong>路径里尽量不要有中文以外的特殊字符，也不要放桌面</strong>）。</p><p>4 个案例一览（均已脱敏）：</p>

<table><thead><tr><th>案例</th><th>干什么</th><th>一句话理解</th><th>双击运行的文件</th></tr></thead><tbody><tr><td><strong>BI任务模块化</strong></td><td>自动登录公司 BI 报表平台，按配置批量下载多张报表，存到共享盘，并发钉钉通知</td><td>“报表下载机器人”</td><td><code>BI任务打包启动.bat</code></td></tr><tr><td><strong>每日CRM任务</strong></td><td>自动登录销售易 CRM，导出销售合同表格，再自动汇总进一张总表，发钉钉通知</td><td>“CRM 数据搬运工”</td><td><code>CRM任务启动程序.bat</code></td></tr><tr><td><strong>每日运营决策</strong></td><td>自动登录运营决策平台，爬取数据导出，配日志通知和钉钉告警</td><td>“运营数据采集员”</td><td><code>运营决策平台导出_主程序打包启动.bat</code></td></tr><tr><td><strong>蓝凌EKP系统登录</strong></td><td>自动登录蓝凌 OA，按”导航指令”批量导出流程单据，还能把网页转成 Excel 报表</td><td>“OA 流程导出员”</td><td><code>启动蓝凌EKP系统主程序.bat</code></td></tr></tbody></table><section><h2>3.1 所有案例的共同骨架（看懂这个，你就看懂了全部）<a href="#31-所有案例的共同骨架看懂这个你就看懂了全部"><span>#</span></a></h2><p>打开任意一个案例文件夹，结构都长一个样：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>蓝凌EKP系统登录/</span></div></div><div><div><div>2</div></div><div><span>├── 蓝凌EKP系统登录_主程序.py      ← 代码主程序（不用碰）</span></div></div><div><div><div>3</div></div><div><span>├── 蓝凌EKP系统登录配置.ini        ← 遥控器（你主要改这个）</span></div></div><div><div><div>4</div></div><div><span>├── 启动蓝凌EKP系统主程序.bat      ← 双击运行</span></div></div><div><div><div>5</div></div><div><span>├── 使用说明书.md / 导航说明书.md   ← 案例自带说明书（遇到问题先翻它）</span></div></div><div><div><div>6</div></div><div><span>└── 模块/                          ← 功能零件（登录、下载、发通知……AI 负责写）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>这就是贯穿所有项目的 <strong>“1 个主程序 + 1 个配置文件 + 1 个模块文件夹”</strong> 架构。你以后让 AI 给你做新脚本，也统一用这个架子，好维护、好替换。</p></section><section><h2>3.2 每个案例都有的三类”可变东西”<a href="#32-每个案例都有的三类可变东西"><span>#</span></a></h2><p>不管哪个案例，配置文件里无非三类内容：</p><ol>
<li><strong>身份</strong>：账号、密码（改成你自己的）；</li>
<li><strong>目标</strong>：网址、报表导航路径、要下载什么（改成你公司的系统）；</li>
<li><strong>去处</strong>：文件存哪、钉钉机器人地址发到哪个群（改成你的路径和群）。</li>
</ol><p><strong>改造一个案例 = 把这三类东西换成你自己的。</strong> 里面具体怎么改，第 4、5 章手把手教。</p><hr /></section></section>
<section><h1>第 4 章 第一次运行成功案例（改配置 → 双击 → 出结果）<a href="#第-4-章-第一次运行成功案例改配置--双击--出结果"><span>#</span></a></h1><blockquote><p>目标：拿”蓝凌EKP系统登录”练手（它自带最详细的《使用说明书.md》），完整走一遍”配置→运行→出结果”。</p></blockquote><section><h2>4.1 第一步：让 AI 帮你读懂案例<a href="#41-第一步让-ai-帮你读懂案例"><span>#</span></a></h2><p>把案例文件夹拖进 WorkBuddy 对话框（或在 Trae Work 里打开该文件夹），发：</p><blockquote><p>📋 <strong>提示词模板 ②：案例导读</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>这是公司的一个成功案例项目，我是零基础新手。请你：</span></div></div><div><div><div>2</div></div><div><span>1、用大白话讲清楚这个项目是干什么的、运行起来会发生什么；</span></div></div><div><div><div>3</div></div><div><span>2、告诉我哪些文件我可以动（配置、说明），哪些绝对不能动（代码）；</span></div></div><div><div><div>4</div></div><div><span>3、把配置文件里每一项的含义列成表格，标注"必改 / 可不改 / 别动"；</span></div></div><div><div><div>5</div></div><div><span>4、告诉我第一次运行前必须改哪几项才能跑起来。</span></div></div><div><div><div>6</div></div><div><span>不要给我讲代码，只讲使用方法。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><p>AI 会给你一份导读报告。<strong>这份报告就是你的作业清单。</strong></p></section><section><h2>4.2 第二步：按清单改配置<a href="#42-第二步按清单改配置"><span>#</span></a></h2><p>以蓝凌案例为例，需要改的一般是：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[登录信息]</span></div></div><div><div><div>2</div></div><div><span>登录账号 = 改成你的OA账号</span></div></div><div><div><div>3</div></div><div><span>登录密码 = 改成你的OA密码</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[浏览器配置]</span></div></div><div><div><div>6</div></div><div><span>浏览器路径 = 改成本机Chrome的路径，例如 （本机路径） Files\Google\Chrome\Application\chrome.exe</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>改文件的三种方式（任选）：</strong></p><ul>
<li>方式 A（推荐新手）：直接在 WorkBuddy 里说”帮我把配置文件里的登录账号改成 xxx、密码改成 xxx”，<strong>让 AI 替你改</strong>；</li>
<li>方式 B：右键 .ini 文件 → 打开方式 → 记事本 → 改完 <code>Ctrl+S</code> 保存；</li>
<li>方式 C：用 TraeCode 打开项目，双击 .ini 文件编辑保存（顺便熟悉 TraeCode）。</li>
</ul><blockquote><p>💡 不知道自己电脑的 Chrome 路径？问 AI：“帮我查一下我电脑上 Chrome 浏览器的安装路径，并帮我写进配置文件。”</p></blockquote></section><section><h2>4.3 第三步：双击运行<a href="#43-第三步双击运行"><span>#</span></a></h2><p>双击 <code>启动蓝凌EKP系统主程序.bat</code>，会弹出黑色窗口，随后自动打开浏览器自动登录、自动操作。<strong>期间不要动鼠标键盘去抢浏览器的控制权。</strong></p><p>跑完看两个地方：</p><ul>
<li>黑窗口里的文字：出现 <code>[OK]</code>、<code>成功</code> 字样即正常；</li>
<li>案例文件夹里的 <code>输出结果/</code> 目录：导出的文件在里面。</li>
</ul></section><section><h2>4.4 第四步：跑不起来？把报错喂给 AI<a href="#44-第四步跑不起来把报错喂给-ai"><span>#</span></a></h2><p>双击后黑窗口一闪而过，或出现大片红字 = 出错了。<strong>这是新手最需要学会的一招：</strong></p><ol>
<li>用”截图 + 复制文字”把黑窗口里的报错信息完整保留（窗口关太快就问 AI：“帮我让 bat 运行完不自动关闭”）；</li>
<li>发给 WorkBuddy，附一句话：</li>
</ol><blockquote><p>📋 <strong>提示词模板 ③：报错求救</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>我运行成功案例"蓝凌EKP系统登录"时报错了，报错信息如下（见截图/如下文字）。</span></div></div><div><div><div>2</div></div><div><span>请你：1、用大白话告诉我错在哪；2、直接帮我修好；3、告诉我怎么验证修好了。</span></div></div><div><div><div>3</div></div><div><span>我看不懂代码，修复过程你全权负责，改完哪个文件告诉我就行。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><p><strong>记住这个循环：运行 → 报错 → 贴给 AI → AI 修 → 再运行。</strong> 所有的学习都发生在这个循环里，你永远不需要独自面对报错。</p><hr /></section></section>
<section><h1>第 5 章 核心章节：学会写提示词，让 AI 把案例改成你自己的<a href="#第-5-章-核心章节学会写提示词让-ai-把案例改成你自己的"><span>#</span></a></h1><blockquote><p>前面都是”用现成的”，这一章教你”造自己的”。这是整本教程的核心——<strong>学写提示词，不是学写代码。</strong></p></blockquote><section><h2>5.1 万能提示词公式<a href="#51-万能提示词公式"><span>#</span></a></h2><p>一个好提示词 = 下面六块积木，按顺序搭：</p>

<table><thead><tr><th>积木</th><th>说明</th><th>示例</th></tr></thead><tbody><tr><td>① 角色</td><td>告诉 AI 以什么身份干活</td><td>“你是经验丰富的办公自动化工程师”</td></tr><tr><td>② 背景</td><td>我是谁、电脑环境、我的水平</td><td>“我零代码基础，Windows 11，已装好 Python”</td></tr><tr><td>③ 素材</td><td>参考什么案例、有什么资料</td><td>“参考附件’每日CRM任务’成功案例”</td></tr><tr><td>④ 任务</td><td>具体要做什么，一步步列清楚</td><td>“登录××系统，导出××报表，存到××”</td></tr><tr><td>⑤ 要求</td><td>架构、习惯、禁区</td><td>“用’1主程序+1配置+模块文件夹’架构，配置用中文命名，不要改案例原有代码”</td></tr><tr><td>⑥ 输出</td><td>做完交付什么</td><td>“完成后写一份使用说明书，并教我怎么运行”</td></tr></tbody></table><p><strong>黄金法则：把 AI 当成一个很能干但对你公司一无所知的外包工程师。</strong> 它不知道你们系统网址、不知道报表叫什么、不知道存哪——这些你不说，它就只能瞎编。所以④”任务”要写得像给新员工的交接文档：几步、点什么、看到什么算成功。</p></section><section><h2>5.2 实战一：仿”蓝凌EKP”做一个你们公司 OA 的导出脚本<a href="#52-实战一仿蓝凌ekp做一个你们公司-oa-的导出脚本"><span>#</span></a></h2><p><strong>场景</strong>：你们公司也用蓝凌 OA（或类似系统），你想每天自动导出”请假流程”并转 Excel。</p><p><strong>操作</strong>：把案例文件夹和下面提示词一起发给 WorkBuddy：</p><blockquote><p>📋 <strong>提示词模板 ④：改造案例（完整范例，可直接抄改）</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>【角色】你是经验丰富的办公自动化工程师。</span></div></div><div><div><div>2</div></div><div><span>【背景】我零代码基础，Windows 11，Python 环境已就绪。</span></div></div><div><div><div>3</div></div><div><span>【素材】附件是公司的成功案例"蓝凌EKP系统登录"，它已能自动登录蓝凌OA、</span></div></div><div><div><div>4</div></div><div><span>按导航编码批量导出流程、并把HTML转成Excel。请完整参考它的架构和写法。</span></div></div><div><div><div>5</div></div><div><span>【任务】帮我在案例旁边新建一个同样架构的项目"请假流程导出"，实现：</span></div></div><div><div><div>6</div></div><div><span>1、自动登录我们公司OA（网址：htt（本机路径））；</span></div></div><div><div><div>7</div></div><div><span>2、进入"流程中心-请假审批"列表；</span></div></div><div><div><div>8</div></div><div><span>3、筛选"结束时间 = 前天到今天"的流程；</span></div></div><div><div><div>9</div></div><div><span>4、逐条打开详情，导出打印模板HTML；</span></div></div><div><div><div>10</div></div><div><span>5、自动转换成Excel（每个流程一个工作表，再合并一张总表）；</span></div></div><div><div><div>11</div></div><div><span>6、保存到 （本机路径）。</span></div></div><div><div><div>12</div></div><div><span>【要求】</span></div></div><div><div><div>13</div></div><div><span>1、严格沿用成功案例的"1主程序+1配置ini+模块文件夹"架构；</span></div></div><div><div><div>14</div></div><div><span>2、账号密码、网址、路径全部放进ini配置，代码里不写死；</span></div></div><div><div><div>15</div></div><div><span>3、变量和文件名用中文命名，关键逻辑加中文注释；</span></div></div><div><div><div>16</div></div><div><span>4、参考案例的"组件编码"导航写法（ACC/CARD/FLT那些）。</span></div></div><div><div><div>17</div></div><div><span>【输出】</span></div></div><div><div><div>18</div></div><div><span>1、生成完整项目文件夹；</span></div></div><div><div><div>19</div></div><div><span>2、附一份《使用说明书.md》，包含：怎么配置、怎么双击运行、常见问题；</span></div></div><div><div><div>20</div></div><div><span>3、最后教我第一步先改哪个配置项。</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></blockquote><p><strong>要点解析（为什么这么写）：</strong></p><ul>
<li>“参考它的架构和写法” → AI 会照着成熟套路来，成功率远高于从零写；</li>
<li>任务写成 1、2、3、4 步骤 → 每一步都可验证，AI 不容易跑偏；</li>
<li>“账号密码放 ini 不写死” → 以后换账号你改配置就行，不用再求 AI；</li>
<li>“附使用说明书” → 逼 AI 留下文档，一个月后你自己都还记得怎么用。</li>
</ul></section><section><h2>5.3 实战二：仿”每日CRM任务”做自家业务系统导出<a href="#53-实战二仿每日crm任务做自家业务系统导出"><span>#</span></a></h2><p>CRM 案例的精髓是”<strong>任务步骤文档</strong>”：当初开发者就是写了一份《CRM任务步骤.txt》，把”点哪、看到什么算加载完、下载到哪”用大白话+网页元素代码写清楚，AI 照此生成脚本。</p><p><strong>你也能照做，三步：</strong></p><p><strong>第 1 步：写你自己的”任务步骤”文档</strong>（打开目标网页，人肉走一遍流程，边走边记录）：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>任务：导出我们系统的"客户订单"列表</span></div></div><div><div><div>2</div></div><div><span>1、打开登录页：http（本机路径），输入账号密码登录；</span></div></div><div><div><div>3</div></div><div><span>2、登录成功的标志：页面右上角出现"工作台"三个字；</span></div></div><div><div><div>4</div></div><div><span>3、点击左侧菜单"订单管理"→"全部订单"；</span></div></div><div><div><div>5</div></div><div><span>4、列表加载完成的标志：表头出现"订单编号"；</span></div></div><div><div><div>6</div></div><div><span>5、点击右上角"导出"按钮，等待下载完成；</span></div></div><div><div><div>7</div></div><div><span>6、文件保存到 （本机路径）。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>第 2 步：顺手抓”网页元素”给 AI</strong>（进阶但极其有效）：在网页上按 <code>F12</code> → 点左上角小箭头图标 → 点一下你要操作的按钮 → 下方高亮的那行代码右键 → Copy → Copy element，粘贴进步骤文档。案例里那些 <code>&lt;a id="export"&gt;导出&lt;/a&gt;</code> 就是这么来的。<strong>元素给得越准，AI 写的脚本越稳。</strong></p><p><strong>第 3 步：发提示词</strong>：</p><blockquote><p>📋 <strong>提示词模板 ⑤：按任务步骤生成脚本</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>【素材1】成功案例"每日CRM任务"（附件），请参考其架构：</span></div></div><div><div><div>2</div></div><div><span>1主程序 + N任务模块 + 1个ini配置，登录逻辑、等待元素、静默下载的写法都可复用。</span></div></div><div><div><div>3</div></div><div><span>【素材2】我的任务步骤文档：（把上面第1步写的内容粘贴在这里）</span></div></div><div><div><div>4</div></div><div><span>【任务】按步骤文档，为我生成一个同架构的新项目"订单导出"。</span></div></div><div><div><div>5</div></div><div><span>【要求】</span></div></div><div><div><div>6</div></div><div><span>1、页面元素的定位优先用我文档里提供的元素，没提供的由你给出合理方案；</span></div></div><div><div><div>7</div></div><div><span>2、"加载完成的标志"必须做成验证步骤，验证不过就重试并报错，不要瞎点；</span></div></div><div><div><div>8</div></div><div><span>3、下载用静默下载（不弹保存对话框），路径读ini配置；</span></div></div><div><div><div>9</div></div><div><span>4、跑完把结果（成功几条/失败原因）推送到钉钉群机器人（机器人地址我之后填）。</span></div></div><div><div><div>10</div></div><div><span>【输出】完整项目 + 使用说明书 + 首次运行检查清单。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote></section><section><h2>5.4 实战三：仿”BI任务模块化”增删报表下载任务<a href="#54-实战三仿bi任务模块化增删报表下载任务"><span>#</span></a></h2><p>BI 案例最好改造，因为<strong>加一个下载任务只需改配置、不用改代码</strong>。它的配置长这样（脱敏）：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[任务-2]</span></div></div><div><div><div>2</div></div><div><span>名称 = 库存下载</span></div></div><div><div><div>3</div></div><div><span>导航路径 = 我的分析|协作给我的|Ⅺ-库存|K1-库存数|库存明细</span></div></div><div><div><div>4</div></div><div><span>导出格式 = Excel</span></div></div><div><div><div>5</div></div><div><span>目标文件夹 = （本机路径）</span></div></div><div><div><div>6</div></div><div><span>目标文件名 = 库存明细.xlsx</span></div></div><div><div><div>7</div></div><div><span>启用 = True</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>你要做的就是在 BI 平台里人肉点一遍你要的报表，把”依次点过的菜单名”用 <code>|</code> 串起来填进 <code>导航路径</code>。</strong></p><p>配套提示词（跑通前让 AI 把关）：</p><blockquote><p>📋 <strong>提示词模板 ⑥：新增/修改下载任务</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>这是"BI任务模块化"项目的配置文件。我想新增一个下载任务：</span></div></div><div><div><div>2</div></div><div><span>报表位置：我依次点击了「分析 → 协作给我的 → 3-销售 → 每日销售达成」；</span></div></div><div><div><div>3</div></div><div><span>导出 Excel，保存到 （本机路径），文件名叫"每日销售达成.xlsx"。</span></div></div><div><div><div>4</div></div><div><span>请你：1、帮我把新任务写进配置文件；2、检查我的导航路径写法是否符合</span></div></div><div><div><div>5</div></div><div><span>该项目的格式要求；3、告诉我改完后怎么验证任务跑通了。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote></section><section><h2>5.5 提示词的迭代心法：一次只改一件事<a href="#55-提示词的迭代心法一次只改一件事"><span>#</span></a></h2><p>AI 第一次生成的脚本很少一次完美，<strong>高手和新手的区别不在第一句提示词，而在后续怎么”追问”</strong>。心法三条：</p><ol>
<li><strong>小步快跑</strong>：一次只提一个改动。“把下载路径改成 E 盘” ✅；“顺便把下载、汇总、通知、定时全改了” ❌——改动越多，AI 越容易顾此失彼。</li>
<li><strong>拿事实说话</strong>：不说”跑得不对”，要说”我双击运行后，浏览器打开登录页就没动了，黑窗口最后一行显示：等待元素超时（附截图）“。现象+报错原文，比任何形容词都有用。</li>
<li><strong>改完就测</strong>：AI 说改好了，你立刻双击跑一遍验证，别攒一堆改动再测——出了问题分不清是哪次改坏的。</li>
</ol></section><section><h2>5.6 改造时的边界与禁忌<a href="#56-改造时的边界与禁忌"><span>#</span></a></h2><ul>
<li>✅ 可以让 AI 参考案例的<strong>结构、写法、套路</strong>；</li>
<li>❌ 不要让 AI 直接在成功案例文件夹里大改（先复制一份再改，原案例留底）；</li>
<li>❌ 账号密码不要出现在提示词正文和给 AI 的截图里，让 AI”留空位”，你自己填进 ini；</li>
<li>❌ 不要一开始就挑战最复杂的场景。正确路径：<strong>先跑通登录 → 再跑通一个下载 → 再加筛选条件 → 最后加钉钉通知</strong>。每通一步，让 AI 确认一步。</li>
</ul><hr /></section></section>
<section><h1>第 6 章 用 TraeCode 调试：看懂报错、把报错喂回给 AI<a href="#第-6-章-用-traecode-调试看懂报错把报错喂回给-ai"><span>#</span></a></h1><blockquote><p>TraeCode 是你的”检修台”。你依然不写代码，但要会用它的四个基本功能。</p></blockquote><section><h2>6.1 四个基本动作<a href="#61-四个基本动作"><span>#</span></a></h2><ol>
<li><strong>打开项目</strong>：TraeCode → 文件 → 打开文件夹 → 选案例文件夹。左侧出现文件树。</li>
<li><strong>看文件</strong>：双击任何文件打开。<code>.ini</code>、<code>.md</code>、<code>.txt</code> 都能直接看；<code>.py</code> 看不懂没关系，要用的是下一步。</li>
<li><strong>改文件</strong>：直接编辑保存（改 ini 主要用这个）。</li>
<li><strong>运行</strong>：菜单”终端”→“新建终端”，输入 <code>python 主程序文件名.py</code> 回车；或直接在文件管理器双击 .bat。<strong>报错信息会显示在下方终端里，不会一闪而过</strong>——这是 TraeCode 比双击 bat 好用的地方。</li>
</ol></section><section><h2>6.2 报错三看（不用懂代码也能定位问题）<a href="#62-报错三看不用懂代码也能定位问题"><span>#</span></a></h2><p>终端里一片红字时，只看三处：</p>

<table><thead><tr><th>看什么</th><th>例子</th><th>通常意味着</th></tr></thead><tbody><tr><td><strong>最后一行</strong></td><td><code>TimeoutError: 等待元素超时</code></td><td>问题的一句话结论</td></tr><tr><td><strong>文件名+行号</strong></td><td><code>文件 "模块_登录.py"，第 45 行</code></td><td>在哪个零件出的事</td></tr><tr><td><strong>关键词</strong></td><td><code>No such file</code>（找不到文件）/ <code>Connection</code>（网络）/ <code>Permission</code>（权限）</td><td>大方向</td></tr></tbody></table><p><strong>然后把这三样原封不动复制给 AI（提示词模板③），加一句”请直接帮我修好”。</strong> 你的任务只是”搬运工”，诊断和修理是 AI 的事。</p></section><section><h2>6.3 新手常见的三个”假故障”<a href="#63-新手常见的三个假故障"><span>#</span></a></h2>

<table><thead><tr><th>现象</th><th>真相</th><th>解决</th></tr></thead><tbody><tr><td>双击 bat 黑窗口一闪就没了</td><td>程序可能秒退（配置错了），报错没看清</td><td>改用 TraeCode 终端运行，或问 AI”让窗口停住”</td></tr><tr><td>提示 <code>python 不是内部或外部命令</code></td><td>装 Python 没勾 Add to PATH</td><td>让 AI 帮你修环境变量（模板①照发）</td></tr><tr><td>改了 ini 不生效</td><td>文件保存成了别的编码/后缀（如 ini.txt）</td><td>问 AI：“帮我检查配置文件编码和后缀”，用 TraeCode 改别用记事本另存</td></tr></tbody></table><hr /></section></section>
<section><h1>第 7 章 接入钉钉：机器人通知 + AI 表格自动流<a href="#第-7-章-接入钉钉机器人通知--ai-表格自动流"><span>#</span></a></h1><blockquote><p>钉钉是成果输出平台：脚本跑完没跑成、报表在哪，自动推到群里，同事直接看。所有成功案例都内置了钉钉通知能力，你只需要”喂给它一个机器人地址”。</p></blockquote><section><h2>7.1 第一步：建群机器人，拿到 Webhook 地址<a href="#71-第一步建群机器人拿到-webhook-地址"><span>#</span></a></h2><ol>
<li>打开你要接收通知的钉钉群 → 群设置 → <strong>机器人</strong> → <strong>添加机器人</strong> → 选 <strong>自定义（通过 Webhook 接入）</strong>；</li>
<li>名字随便取（如”报表小助手”），安全设置建议勾”<strong>自定义关键词</strong>”，填一个词如 <code>报表</code>；</li>
<li>完成后会给你一个 <strong>Webhook 地址</strong>（`http（本机路径） 长这样）——<strong>复制保存，这就是机器人的”门牌号”</strong>。</li>
</ol></section><section><h2>7.2 第二步：把地址填进项目配置<a href="#72-第二步把地址填进项目配置"><span>#</span></a></h2><p>所有案例的 ini 里都有这一段：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[机器人配置]</span></div></div><div><div><div>2</div></div><div><span>报送机器人 = http（本机路径）</span></div></div><div><div><div>3</div></div><div><span>信息格式 = JSON</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>把 Webhook 粘贴进去保存即可。<strong>注意</strong>：若你的机器人设了关键词，让 AI 确保通知文案里包含该关键词（比如都带”报表”二字），否则消息会被钉钉拒收。改完可以让 AI 发条测试消息验证：</p><blockquote><p>📋 <strong>提示词模板 ⑦：测试钉钉通知</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>我已把钉钉机器人的 Webhook 地址填进配置文件（关键词是"报表"）。</span></div></div><div><div><div>2</div></div><div><span>请帮我：1、检查配置格式对不对；2、发送一条测试消息到这个机器人；</span></div></div><div><div><div>3</div></div><div><span>3、如果群里没收到，帮我按"关键词/网络/地址"三个方向排查。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote></section><section><h2>7.3 第三步：WorkBuddy 连接钉钉（MCP 连接器）<a href="#73-第三步workbuddy-连接钉钉mcp-连接器"><span>#</span></a></h2><p>这一步让 <strong>WorkBuddy 本身能直接操作钉钉</strong>（发消息、读写 AI 表格、查审批……），是”AI 表格自动流”的基础：</p><ol>
<li>WorkBuddy → 设置/连接器 → 找到 <strong>钉钉</strong> → 点击<strong>连接</strong>；</li>
<li>弹出钉钉授权页面 → 用公司账号登录 → 点<strong>同意授权</strong>；</li>
<li>回到 WorkBuddy 显示”已连接”即可。</li>
</ol><p>连上之后你就可以说人话直接指挥，例如：</p><blockquote><p>“帮我把 （本机路径） 里的数据整理成摘要，发到’运营数据群’。”
“把今天三个下载任务的结果汇总成一张表，写进钉钉 AI 表格《每日报数看板》。”</p></blockquote></section><section><h2>7.4 AI 表格自动流：让结果沉淀成看板<a href="#74-ai-表格自动流让结果沉淀成看板"><span>#</span></a></h2><p>思路：<strong>脚本负责”产出文件”，WorkBuddy+钉钉 AI 表格负责”汇总展示”</strong>。典型玩法：</p><ol>
<li>在钉钉里建一张 AI 表格（如《每日报数看板》），列头设好：日期、任务名、状态、文件链接；</li>
<li>让 WorkBuddy 记住这套格式，之后每次跑完脚本说一句”按老规矩把今天的运行结果写进看板”。</li>
</ol><p>配套提示词：</p><blockquote><p>📋 <strong>提示词模板 ⑧：结果自动入表</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>我有一个"BI任务模块化"项目，每天自动下载多张报表到共享盘，</span></div></div><div><div><div>2</div></div><div><span>并在ini里留有运行日志。请你帮我建立一条固定流程：</span></div></div><div><div><div>3</div></div><div><span>每次我发送"今日汇总"四个字时，你自动：</span></div></div><div><div><div>4</div></div><div><span>1、读取今天的运行日志和下载结果；</span></div></div><div><div><div>5</div></div><div><span>2、整理成四列：日期、任务名称、成功/失败、文件位置；</span></div></div><div><div><div>6</div></div><div><span>3、通过钉钉连接器写进 AI 表格《每日报数看板》；</span></div></div><div><div><div>7</div></div><div><span>4、有失败任务时，在群里额外@我并附报错摘要。</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><hr /></section></section>
<section><h1>第 8 章 定时自动运行（Windows 任务计划程序）<a href="#第-8-章-定时自动运行windows-任务计划程序"><span>#</span></a></h1><blockquote><p>傻瓜版三步，让脚本每天自己跑，你只负责看钉钉汇报。</p></blockquote><p><strong>准备</strong>：先把脚本里的 <code>无头模式</code> 改为 <code>true</code>（后台运行不弹浏览器窗口，各案例的 ini 里都有这项）。</p><p><strong>操作</strong>：</p><ol>
<li><code>Win</code> 键搜”<strong>任务计划程序</strong>”打开 → 右侧点”<strong>创建基本任务</strong>”；</li>
<li>向导里依次填：
<ul>
<li>名称：如”每天下载库存报表”；</li>
<li>触发器：每天 → 设时间（如 08&lt;30&gt;）；</li>
<li>操作：启动程序 → <strong>浏览选中案例的 .bat 文件</strong>；</li>
</ul>
</li>
<li>完成后在任务列表里右键 → <strong>运行</strong>，试跑一次，去输出目录和钉钉群确认成功。</li>
</ol><p><strong>偷懒替代方案</strong>：直接对 WorkBuddy 说”帮我创建一个自动化任务：每个工作日早上 8 点半运行 （本机路径），并把结果发到钉钉”，用 WorkBuddy 自带的定时自动化能力托管，连任务计划程序都不用碰。</p><hr /></section>
<section><h1>第 9 章 日常运行与维护<a href="#第-9-章-日常运行与维护"><span>#</span></a></h1><section><h2>9.1 每天的动作<a href="#91-每天的动作"><span>#</span></a></h2>

<table><thead><tr><th>时点</th><th>你做什么</th><th>花多久</th></tr></thead><tbody><tr><td>早上</td><td>看钉钉群通知：昨日任务全部 ✅ → 收工；有 ❌ → 进入排障</td><td>1 分钟</td></tr><tr><td>要改需求</td><td>改 ini 配置（换路径/加任务/换账号），或找 AI 改脚本</td><td>视情况</td></tr><tr><td>每周</td><td>瞄一眼输出文件夹，确认文件在正常新增</td><td>1 分钟</td></tr></tbody></table></section><section><h2>9.2 出问题时的标准排障流程<a href="#92-出问题时的标准排障流程"><span>#</span></a></h2><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>看钉钉通知/启动错误日志.txt 里的报错</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>↓ 原封不动复制报错</span></div></div><div><div><div>3</div></div><div><span>发给 AI（提示词模板③）："帮我修好，修完告诉我怎么验证"</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>↓ AI 修复</span></div></div><div><div><div>5</div></div><div><span>双击 bat / TraeCode 运行验证</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>↓ 成功</span></div></div><div><div><div>7</div></div><div><span>结束（把这次的报错和修法记下来，下次秒懂）</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><strong>原则：报错不过夜、修复必验证、现象说清楚。</strong></p></section><section><h2>9.3 改配置的四条军规<a href="#93-改配置的四条军规"><span>#</span></a></h2><ol>
<li><strong>改前先备份</strong>：复制一份 ini 改名为 <code>配置_备份_日期.ini</code>，改砸了好回滚；</li>
<li><strong>只改等号右边</strong>，左边字段名和 <code>[中括号]</code> 节名不要动；</li>
<li><strong>用 TraeCode 或 VS Code 改</strong>，别用 Word/WPS（会破坏格式）；保存编码选 UTF-8；</li>
<li><strong>一次只改一处</strong>，改完立刻试跑。</li>
</ol></section><section><h2>9.4 让 AI 改脚本后的验证流程<a href="#94-让-ai-改脚本后的验证流程"><span>#</span></a></h2><ol>
<li>AI 说改好 → 问它”这次改动会影响哪些功能？”；</li>
<li>双击运行一次完整流程；</li>
<li>核对三样：输出文件新增了没？文件内容对不对？钉钉通知到了没？</li>
<li>三样都 OK，这次改动才算落地。</li>
</ol><hr /></section></section>
<section><h1>附录 A：提示词速查卡（10 条即抄即用）<a href="#附录-a提示词速查卡10-条即抄即用"><span>#</span></a></h1>

<table><thead><tr><th>#</th><th>场景</th><th>提示词（直接复制改内容）</th></tr></thead><tbody><tr><td>1</td><td>环境部署</td><td>见正文模板①</td></tr><tr><td>2</td><td>案例导读</td><td>见正文模板②</td></tr><tr><td>3</td><td>报错求救</td><td>见正文模板③</td></tr><tr><td>4</td><td>改造新项目</td><td>见正文模板④</td></tr><tr><td>5</td><td>按步骤生成</td><td>见正文模板⑤</td></tr><tr><td>6</td><td>加下载任务</td><td>见正文模板⑥</td></tr><tr><td>7</td><td>测钉钉</td><td>见正文模板⑦</td></tr><tr><td>8</td><td>结果入表</td><td>见正文模板⑧</td></tr><tr><td>9</td><td>换账号/换路径</td><td>“帮我把XX项目的配置文件里登录账号改为××、密码改为××、保存路径改为××，改完告诉我怎么验证。”</td></tr><tr><td>10</td><td>加新功能</td><td>“在不动现有功能的前提下，给XX项目加一个功能：××。请先告诉我你的改动方案，我确认后再动手。”</td></tr></tbody></table><p><strong>两条通用技巧</strong>：① 让 AI”先给方案、确认再动手”，可以避免它大改一通；② 每做完一个新项目，让 AI 补一份《使用说明书.md》放进项目文件夹——文档就是未来的你最好的同事。</p><hr /></section>
<section><h1>附录 B：常见报错对照表<a href="#附录-b常见报错对照表"><span>#</span></a></h1>

<table><thead><tr><th>报错关键词（看最后一行）</th><th>大白话解释</th><th>你该做什么</th></tr></thead><tbody><tr><td><code>python 不是内部或外部命令</code></td><td>Python 没装好或没加路径</td><td>发模板①让 AI 修</td></tr><tr><td><code>No module named 'xxx'</code></td><td>缺依赖库</td><td>发给 AI：“帮我安装缺失的库”</td></tr><tr><td><code>浏览器可执行文件不存在</code></td><td>ini 里的 Chrome 路径不对</td><td>查本机 Chrome 路径填进 ini</td></tr><tr><td><code>Timeout 等待元素超时</code></td><td>网页没出现该出现的按钮（网址变了/网络慢/元素失效）</td><td>截图+报错发 AI 排查</td></tr><tr><td><code>登录失败</code></td><td>账号密码错 / 需要验证码</td><td>先手动登录一次确认能登，再发 AI</td></tr><tr><td><code>Permission denied</code></td><td>没权限（目标文件夹只读/被占用）</td><td>关掉占用程序（如正开着的 Excel），重跑</td></tr><tr><td><code>errcode:310000</code>（钉钉）</td><td>机器人拒收（关键词不符/地址失效）</td><td>核对通知文案含关键词、Webhook 是否最新</td></tr><tr><td>文件名乱码</td><td>ini 被存成错误编码</td><td>用 TraeCode 以 UTF-8 重新保存</td></tr></tbody></table><hr /></section>
<section><h1>附录 C：安全红线（必读）<a href="#附录-c安全红线必读"><span>#</span></a></h1><ol>
<li><strong>账号密码只放 ini，绝不写进提示词、截图、聊天记录</strong>；给 AI 看配置前先打码；</li>
<li><strong>ini 文件绝不能外发</strong>（发同事前删掉账号密码段），更不能传到网上；</li>
<li><strong>先在测试环境试</strong>：新脚本先拿测试账号/测试数据跑通，再上正式环境；</li>
<li><strong>钉钉机器人 Webhook 等同于”谁有地址谁就能往群里发消息”</strong>，泄露了就去群里删掉机器人重建；</li>
<li><strong>自动操作的是真实系统</strong>：定时任务上生产前，先用”启用=False / 执行任务留空”的方式试运行，确认行为符合预期再放开；</li>
<li>重要输出目录建议定期备份（报表文件虽可再生，共享盘路径变了要记得同步改 ini）。</li>
</ol><hr /><p><em>教程完 · 遇到本教程没覆盖的问题，记住万能第一句：“我是零基础新手，请你用大白话帮我解决，并直接动手操作。”</em></p></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/code-examples/</id>
      <title type="text">Firefly 代码块示例</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/code-examples/"/>
      <summary type="text">在Firefly中使用表达性代码的代码块在 Markdown 中的外观。</summary>
      <content type="html"><![CDATA[<p>在这里，我们将探索如何使用 <a href="https://expressive-code.com/" target="_blank">Expressive Code</a> 展示代码块。提供的示例基于官方文档，您可以参考以获取更多详细信息。</p>
<section><h2>表达性代码<a href="#表达性代码"><span>#</span></a></h2><section><h3>语法高亮<a href="#语法高亮"><span>#</span></a></h3><p><a href="https://expressive-code.com/key-features/syntax-highlighting/" target="_blank">语法高亮</a></p><section><h4>常规语法高亮<a href="#常规语法高亮"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'此代码有语法高亮!'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>渲染 ANSI 转义序列<a href="#渲染-ansi-转义序列"><span>#</span></a></h4><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Standard ANSI colors:</span></div></div><div><div><div>2</div></div><div><span>- Dimmed:     </span><span> Black </span><span> Red </span><span> Green </span><span> Yellow </span><span> Blue </span><span> Magenta </span><span> Cyan </span><span> White </span></div></div><div><div><div>3</div></div><div><span>- Foreground: </span><span> Black </span><span> Red </span><span> Green </span><span> Yellow </span><span> Blue </span><span> Magenta </span><span> Cyan </span><span> White </span></div></div><div><div><div>4</div></div><div><span>- Background: </span><span> Black </span><span> Red </span><span> Green </span><span> Yellow </span><span> Blue </span><span> Magenta </span><span> Cyan </span><span> White </span></div></div><div><div><div>5</div></div><div><span>- Reversed:   </span><span> Black </span><span> Red </span><span> Green </span><span> Yellow </span><span> Blue </span><span> Magenta </span><span> Cyan </span><span> White </span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>8-bit colors (showing colors 160-171 as an example):</span></div></div><div><div><div>8</div></div><div><span>- Dimmed:     </span><span> 160 </span><span> 161 </span><span> 162 </span><span> 163 </span><span> 164 </span><span> 165 </span><span> 166 </span><span> 167 </span><span> 168 </span><span> 169 </span><span> 170 </span><span> 171 </span></div></div><div><div><div>9</div></div><div><span>- Foreground: </span><span> 160 </span><span> 161 </span><span> 162 </span><span> 163 </span><span> 164 </span><span> 165 </span><span> 166 </span><span> 167 </span><span> 168 </span><span> 169 </span><span> 170 </span><span> 171 </span></div></div><div><div><div>10</div></div><div><span>- Background: </span><span> 160 </span><span> 161 </span><span> 162 </span><span> 163 </span><span> 164 </span><span> 165 </span><span> 166 </span><span> 167 </span><span> 168 </span><span> 169 </span><span> 170 </span><span> 171 </span></div></div><div><div><div>11</div></div><div><span>- Reversed:   </span><span> 160 </span><span> 161 </span><span> 162 </span><span> 163 </span><span> 164 </span><span> 165 </span><span> 166 </span><span> 167 </span><span> 168 </span><span> 169 </span><span> 170 </span><span> 171 </span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>24-bit colors (full RGB):</span></div></div><div><div><div>14</div></div><div><span>- Dimmed:     </span><span> ForestGreen - RGB(34,139,34) </span><span> RebeccaPurple - RGB(102,51,153) </span></div></div><div><div><div>15</div></div><div><span>- Foreground: </span><span> ForestGreen - RGB(34,139,34) </span><span> RebeccaPurple - RGB(102,51,153) </span></div></div><div><div><div>16</div></div><div><span>- Background: </span><span> ForestGreen - RGB(34,139,34) </span><span> RebeccaPurple - RGB(102,51,153) </span></div></div><div><div><div>17</div></div><div><span>- Reversed:   </span><span> ForestGreen - RGB(34,139,34) </span><span> RebeccaPurple - RGB(102,51,153) </span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>Font styles:</span></div></div><div><div><div>20</div></div><div><span>- Default</span></div></div><div><div><div>21</div></div><div><span>- </span><span>Bold</span></div></div><div><div><div>22</div></div><div><span>- </span><span>Dimmed</span></div></div><div><div><div>23</div></div><div><span>- </span><span>Italic</span></div></div><div><div><div>24</div></div><div><span>- </span><span>Underline</span></div></div><div><div><div>25</div></div><div><span>- </span><span>Reversed</span></div></div><div><div><div>26</div></div><div><span>- </span><span>Strikethrough</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section></section><section><h3>编辑器和终端框架<a href="#编辑器和终端框架"><span>#</span></a></h3><p><a href="https://expressive-code.com/key-features/frames/" target="_blank">编辑器和终端框架</a></p><section><h4>代码编辑器框架<a href="#代码编辑器框架"><span>#</span></a></h4><div><figure><figcaption><span>my-test-file.js</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'标题属性示例'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption><span>src/content/index.html</span></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>div</span><span>&gt;文件名注释示例&lt;/</span><span>div</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>终端框架<a href="#终端框架"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"此终端框架没有标题"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption><span>PowerShell 终端示例</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Write-Output</span><span> </span><span>"这个有标题!"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>覆盖框架类型<a href="#覆盖框架类型"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"看，没有框架!"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption><span>PowerShell Profile.ps1</span></figcaption><pre><code><div><div><div>1</div></div><div><span># 如果不覆盖，这将是一个终端框架</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>Watch-Tail</span><span> { </span><span>Get-Content</span><span><span> </span><span>-</span><span>Tail </span></span><span>20</span><span><span> </span><span>-</span><span>Wait $args }</span></span></div></div><div><div><div>3</div></div><div><span>New-Alias</span><span> tail </span><span>Watch-Tail</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>文本和行标记<a href="#文本和行标记"><span>#</span></a></h3><p><a href="https://expressive-code.com/key-features/text-markers/" target="_blank">文本和行标记</a></p><section><h4>标记整行和行范围<a href="#标记整行和行范围"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 第1行 - 通过行号定位</span></div></div><div><div><div>2</div></div><div><span>// 第2行</span></div></div><div><div><div>3</div></div><div><span>// 第3行</span></div></div><div><div><div>4</div></div><div><span>// 第4行 - 通过行号定位</span></div></div><div><div><div>5</div></div><div><span>// 第5行</span></div></div><div><div><div>6</div></div><div><span>// 第6行</span></div></div><div><div><div>7</div></div><div><span>// 第7行 - 通过范围 "7-8" 定位</span></div></div><div><div><div>8</div></div><div><span>// 第8行 - 通过范围 "7-8" 定位</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>选择行标记类型 (mark, ins, del)<a href="#选择行标记类型-mark-ins-del"><span>#</span></a></h4><div><figure><figcaption><span>line-markers.js</span></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>demo</span><span>() {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'此行标记为已删除'</span><span>)</span></div></div><div><div><div>3</div></div><div><span>  </span><span>// 此行和下一行标记为已插入</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'这是第二个插入行'</span><span>)</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>return</span><span> </span><span>'此行使用中性默认标记类型'</span></div></div><div><div><div>7</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>为行标记添加标签<a href="#为行标记添加标签"><span>#</span></a></h4><div><figure><figcaption><span>labeled-line-markers.jsx</span></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>button</span></div></div><div><div><div>2</div></div><div><span>  </span><span>role</span><span>=</span><span>"button"</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>{</span><span>...</span><span>props</span><span>}</span></div></div><div><div><div>4</div></div><div><span>  </span><span>value</span><span>=</span><span>{</span><span>value</span><span>}</span></div></div><div><div><div>5</div></div><div><span>  </span><span>className</span><span><span>=</span><span>{</span><span>buttonClassName</span><span>}</span></span></div></div><div><div><div>6</div></div><div><span>  </span><span>disabled</span><span>=</span><span>{</span><span>disabled</span><span>}</span></div></div><div><div><div>7</div></div><div><span>  </span><span>active</span><span>=</span><span>{</span><span>active</span><span>}</span></div></div><div><div><div>8</div></div><div><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>{</span><span>children</span><span> </span><span>&amp;&amp;</span></div></div><div><div><div>10</div></div><div><span><span>    </span></span><span>!</span><span>active</span><span> </span><span>&amp;&amp;</span></div></div><div><div><div>11</div></div><div><span><span><span>    </span></span><span>(</span></span><span>typeof</span><span> </span><span>children</span><span> </span><span>===</span><span> </span><span>'string'</span><span> </span><span>?</span><span> &lt;</span><span>span</span><span>&gt;</span><span>{</span><span>children</span><span>}</span><span>&lt;/</span><span>span</span><span>&gt; </span><span>:</span><span> </span><span>children</span><span>)</span><span>}</span></div></div><div><div><div>12</div></div><div><span>&lt;/</span><span>button</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>在单独行上添加长标签<a href="#在单独行上添加长标签"><span>#</span></a></h4><div><div><div><figure><figcaption><span>labeled-line-markers.jsx</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>button</span></div></div><div><div><div>2</div></div><div><span>  </span><span>role</span><span>=</span><span>"button"</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>{</span><span>...</span><span>props</span><span>}</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>  </span><span>value</span><span>=</span><span>{</span><span>value</span><span>}</span></div></div><div><div><div>6</div></div><div><span>  </span><span>className</span><span><span>=</span><span>{</span><span>buttonClassName</span><span>}</span></span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span>  </span><span>disabled</span><span>=</span><span>{</span><span>disabled</span><span>}</span></div></div><div><div><div>9</div></div><div><span>  </span><span>active</span><span>=</span><span>{</span><span>active</span><span>}</span></div></div><div><div><div>10</div></div><div><span>&gt;</span></div></div><div><div><div>11</div></div><div>
</div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>{</span><span>children</span><span> </span><span>&amp;&amp;</span></div></div><div><div><div>13</div></div><div><span><span>    </span></span><span>!</span><span>active</span><span> </span><span>&amp;&amp;</span></div></div><div><div><div>14</div></div><div><span><span><span>    </span></span><span>(</span></span><span>typeof</span><span> </span><span>children</span><span> </span><span>===</span><span> </span><span>'string'</span><span> </span><span>?</span><span> &lt;</span><span>span</span><span>&gt;</span><span>{</span><span>children</span><span>}</span><span>&lt;/</span><span>span</span><span>&gt; </span><span>:</span><span> </span><span>children</span><span>)</span><span>}</span></div></div><div><div><div>15</div></div><div><span>&lt;/</span><span>button</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h4>使用类似 diff 的语法<a href="#使用类似-diff-的语法"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>此行将标记为已插入</span></div></div><div><div><div>2</div></div><div><span>此行将标记为已删除</span></div></div><div><div><div>3</div></div><div><span>这是常规行</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>--- a/README.md</span></div></div><div><div><div>2</div></div><div><span>+++ b/README.md</span></div></div><div><div><div>3</div></div><div><span>@@ -1,3 +1,4 @@</span></div></div><div><div><div>4</div></div><div><span>+this is an actual diff file</span></div></div><div><div><div>5</div></div><div><span>-all contents will remain unmodified</span></div></div><div><div><div>6</div></div><div><span><span> </span></span><span>no whitespace will be removed either</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>结合语法高亮和类似 diff 的语法<a href="#结合语法高亮和类似-diff-的语法"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>thisIsJavaScript</span><span>() {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// 整个块都会以 JavaScript 高亮显示，</span></div></div><div><div><div>3</div></div><div><span>  </span><span>// 并且我们仍然可以为其添加 diff 标记！</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'要删除的旧代码'</span><span>)</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'新的闪亮代码！'</span><span>)</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>标记行内的单独文本<a href="#标记行内的单独文本"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>demo</span><span>() {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// 标记行内的任何给定文本</span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>'支持给定文本的多个匹配项'</span><span>;</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>正则表达式<a href="#正则表达式"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'单词 </span><mark><span>yes</span></mark><span> 和 </span><mark><span>yep</span></mark><span> 将被标记。'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>转义正斜杠<a href="#转义正斜杠"><span>#</span></a></h4><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>"Test"</span><span> &gt; </span><mark><span>/home/</span></mark><span>test.txt</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>选择内联标记类型 (mark, ins, del)<a href="#选择内联标记类型-mark-ins-del"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function</span><span> </span><span>demo</span><span>() {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>'这些是插入和删除的标记类型'</span><span>);</span></div></div><div><div><div>3</div></div><div><span>  </span><span>// return 语句使用默认标记类型</span></div></div><div><div><div>4</div></div><div><span>  </span><mark><span>return</span><span> </span><span>true</span><span>;</span></mark></div></div><div><div><div>5</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section><section><h3>自动换行<a href="#自动换行"><span>#</span></a></h3><p><a href="https://expressive-code.com/key-features/word-wrap/" target="_blank">自动换行</a></p><section><h4>为每个块配置自动换行<a href="#为每个块配置自动换行"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 启用换行的示例</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>getLongString</span><span>() {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>'这是一个非常长的字符串，除非容器极宽，否则很可能无法适应可用空间'</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// wrap=false 的示例</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>getLongString</span><span>() {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>'这是一个非常长的字符串，除非容器极宽，否则很可能无法适应可用空间'</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>配置换行的缩进<a href="#配置换行的缩进"><span>#</span></a></h4><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// preserveIndent 示例（默认启用）</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>getLongString</span><span>() {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>'这是一个非常长的字符串，除非容器极宽，否则很可能无法适应可用空间'</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// preserveIndent=false 的示例</span></div></div><div><div><div>2</div></div><div><span>function</span><span> </span><span>getLongString</span><span>() {</span></div></div><div><div><div>3</div></div><div><span>  </span><span>return</span><span> </span><span>'这是一个非常长的字符串，除非容器极宽，否则很可能无法适应可用空间'</span></div></div><div><div><div>4</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section></section>
<section><h2>可折叠部分<a href="#可折叠部分"><span>#</span></a></h2><p><a href="https://expressive-code.com/plugins/collapsible-sections/" target="_blank">可折叠部分</a></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div></div></div><div><span></span><span></span><span>5 collapsed lines</span></div></div><div><div><div>1</div></div><div><span>// 所有这些样板设置代码将被折叠</span></div></div><div><div><div>2</div></div><div><span>import</span><span> { </span><span>someBoilerplateEngine</span><span> } </span><span>from</span><span> </span><span>'@example/some-boilerplate'</span></div></div><div><div><div>3</div></div><div><span>import</span><span> { </span><span>evenMoreBoilerplate</span><span> } </span><span>from</span><span> </span><span>'@example/even-more-boilerplate'</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>const</span><span> </span><span>engine</span><span> </span><span>=</span><span> </span><span>someBoilerplateEngine</span><span>(</span><span>evenMoreBoilerplate</span><span>())</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>// 这部分代码默认可见</span></div></div><div><div><div>8</div></div><div><span><span>engine</span><span>.</span></span><span>doSomething</span><span>(</span><span>1</span><span>, </span><span>2</span><span>, </span><span>3</span><span><span>, </span><span>calcFn</span><span>)</span></span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>function</span><span> </span><span>calcFn</span><span>() {</span></div></div><div><div><div>11</div></div><div><span>  </span><span>// 您可以有多个折叠部分</span></div></div><div><div><div></div></div><div><span></span><span></span><span>3 collapsed lines</span></div></div><div><div><div>12</div></div><div><span>  </span><span>const</span><span> </span><span>a</span><span> </span><span>=</span><span> </span><span>1</span></div></div><div><div><div>13</div></div><div><span>  </span><span>const</span><span> </span><span>b</span><span> </span><span>=</span><span> </span><span>2</span></div></div><div><div><div>14</div></div><div><span>  </span><span>const</span><span> </span><span>c</span><span> </span><span>=</span><span><span> </span><span>a</span><span> </span></span><span>+</span><span><span> </span><span>b</span></span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>  </span><span>// 这将保持可见</span></div></div><div><div><div>17</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>`计算结果: </span><span>${</span><span>a</span><span>}</span><span> + </span><span>${</span><span>b</span><span>}</span><span> = </span><span>${</span><span>c</span><span>}</span><span>`</span><span>)</span></div></div><div><div><div>18</div></div><div><span>  </span><span>return</span><span><span> </span><span>c</span></span></div></div><div><div><div>19</div></div><div><span>}</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div></div></div><div><span></span><span></span><span>4 collapsed lines</span></div></div><div><div><div>21</div></div><div><span>// 直到块末尾的所有代码将再次被折叠</span></div></div><div><div><div>22</div></div><div><span><span>engine</span><span>.</span></span><span>closeConnection</span><span>()</span></div></div><div><div><div>23</div></div><div><span><span>engine</span><span>.</span></span><span>freeMemory</span><span>()</span></div></div><div><div><div>24</div></div><div><span><span>engine</span><span>.</span></span><span>shutdown</span><span>({ </span><span>reason</span><span>:</span><span> </span><span>'示例样板代码结束'</span><span> })</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section>
<section><h2>行号<a href="#行号"><span>#</span></a></h2><p><a href="https://expressive-code.com/plugins/line-numbers/" target="_blank">行号</a></p><section><h3>为每个块显示行号<a href="#为每个块显示行号"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>// 此代码块将显示行号</span></div></div><div><div><div>2</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'来自第2行的问候!'</span><span>)</span></div></div><div><div><div>3</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'我在第3行'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><div><figure><figcaption></figcaption><pre><code><div><div><span>// 此块禁用行号</span></div></div><div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'你好?'</span><span>)</span></div></div><div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'抱歉，你知道我在第几行吗?'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h3>更改起始行号<a href="#更改起始行号"><span>#</span></a></h3><div><figure><figcaption></figcaption><pre><code><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'来自第5行的问候!'</span><span>)</span></div></div><div><div><div>6</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>'我在第6行'</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section></section>
<section><h2>Tab 代码块<a href="#tab-代码块"><span>#</span></a></h2><p>由 <a href="https://github.com/ITZSHOAIB/rehype-code-group" target="_blank">rehype-code-group</a> 提供，语法与 <a href="https://vitepress.dev/guide/markdown#code-groups" target="_blank">VitePress 代码组</a> 一致：用 <code>::: code-group labels=[...]</code> 包裹多个代码块，即可合并成一组标签页。</p><div><div><div></div><div>Note</div></div><div><p><code>labels=[...]</code> 中的标签按顺序对应组内的代码块，用英文逗号分隔；<code>:::</code> 与 <code>code-group</code> 之间的空格不能省略。</p></div></div><section><h3>基本用法<a href="#基本用法"><span>#</span></a></h3><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>::: code-group labels=[code.js, code.py, code.html]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>```js</span></div></div><div><div><div>4</div></div><div><span>export</span><span> </span><span>function</span><span> </span><span>greet</span><span><span>(</span><span>name</span><span>) {</span></span></div></div><div><div><div>5</div></div><div><span>  </span><span>return</span><span> </span><span>`Hello, </span><span>${</span><span>name</span><span>}</span><span>!`</span><span>;</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>```</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>```py</span></div></div><div><div><div>10</div></div><div><span>def</span><span> </span><span>greet</span><span><span>(</span><span>name</span><span>):</span></span></div></div><div><div><div>11</div></div><div><span>    </span><span>return</span><span> </span><span>f</span><span>"Hello, </span><span>{</span><span>name</span><span>}</span><span>!"</span></div></div><div><div><div>12</div></div><div><span>```</span></div></div><div><div><div>13</div></div><div>
</div></div><div><div><div>14</div></div><div><span>```html</span></div></div><div><div><div>15</div></div><div><span>&lt;</span><span>p</span><span>&gt;Hello, world!&lt;/</span><span>p</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span>```</span></div></div><div><div><div>17</div></div><div>
</div></div><div><div><div>18</div></div><div><span>:::</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p>渲染效果：</p><div><div>code.jscode.pycode.html</div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>function</span><span> </span><span>greet</span><span><span>(</span><span>name</span><span>) {</span></span></div></div><div><div><div>2</div></div><div><span>  </span><span>return</span><span> </span><span>`Hello, </span><span>${</span><span>name</span><span>}</span><span>!`</span><span>;</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>def</span><span> </span><span>greet</span><span>(</span><span>name</span><span>):</span></div></div><div><div><div>2</div></div><div><span>    </span><span>return</span><span> </span><span>f</span><span>"Hello, </span><span>{</span><span>name</span><span>}</span><span>!"</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>p</span><span>&gt;Hello, world!&lt;/</span><span>p</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div></section><section><h3>标签中使用 Emoji<a href="#标签中使用-emoji"><span>#</span></a></h3><p>标签支持 <a href="https://github.com/omnidan/node-emoji#readme" target="_blank">emoji 短代码</a>，构建时会自动转换成 emoji：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>::: code-group labels=[:package: npm, :package: pnpm, :yarn: yarn]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div>📦 npm📦 pnpm🧶 yarn</div><div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>npm</span><span> </span><span>create</span><span> </span><span>astro@latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div><div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm</span><span> </span><span>create</span><span> </span><span>astro@latest</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div><div><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>yarn</span><span> </span><span>create</span><span> </span><span>astro</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div></section><section><h3>与其他代码块特性组合<a href="#与其他代码块特性组合"><span>#</span></a></h3><p>组内仍是普通的 Expressive Code 代码块，标题、行号、行标记、折叠、终端框架等特性都可以照常使用。</p><div><div>配置文件终端折叠</div><div><div><figure><figcaption><span>astro.config.mjs</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>default</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>theme</span><span>:</span><span> </span><span>"firefly"</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>codeGroup</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>4</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div><div><div><figure><figcaption><span>部署</span></figcaption><pre><code><div><div><div>1</div></div><div><span>pnpm</span><span> </span><span>build</span><span> &amp;&amp; </span><span>pnpm</span><span> </span><span>preview</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div></div></div><div><span></span><span></span><span>3 collapsed lines</span></div></div><div><div><div>1</div></div><div><span>// 这三行默认折叠</span></div></div><div><div><div>2</div></div><div><span>import</span><span> { </span><span>a</span><span> } </span><span>from</span><span> </span><span>"a"</span><span>;</span></div></div><div><div><div>3</div></div><div><span>import</span><span> { </span><span>b</span><span> } </span><span>from</span><span> </span><span>"b"</span><span>;</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span><span>(</span><span>a</span><span>, </span><span>b</span><span>);</span></span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div></section><section><h3>不止是代码块<a href="#不止是代码块"><span>#</span></a></h3><p>标签页内可以放任意内容，例如文字、列表或图片：</p><div><div>说明列表</div><div><p>这是一段普通的段落内容。</p></div><div><ul>
<li>列表项一</li>
<li>列表项二</li>
</ul></div></div><div><div><div></div><div>Tip</div></div><div><p>标签栏在构建期生成，默认展开第一项；支持鼠标点击与键盘 <kbd>←</kbd> / <kbd>→</kbd> / <kbd>Home</kbd> / <kbd>End</kbd> 切换。</p></div></div></section><section><h3>在提醒框内使用（MDX 组件）<a href="#在提醒框内使用mdx-组件"><span>#</span></a></h3><p><code>::: code-group</code> 和 <code>::: tip</code> 等 Docusaurus 风格提醒框都使用 <code>:::</code> 容器语法，而 micromark-directive 规定父子容器的冒号数必须不同，因此 <code>::: code-group</code> <strong>无法嵌套在 <code>::: tip</code> 等提醒框内</strong>（整块会失效）。</p><p>这种情况改用 MDX 组件 <a href="@/components/common/TabGroup.svelte"><code>TabGroup</code></a>：MDX 组件不经过 <code>:::</code> 指令解析，在提醒框内外都能正常使用，也方便日后扩展更多 UI 组件。把文章后缀改为 <code>.mdx</code>，从统一入口 <a href="@/components/firefly-mdx.ts"><code>@/components/firefly-mdx</code></a> 引入（可一次引入多个组件）：</p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>import</span><span> { </span><span>TabGroup</span><span> } </span><span>from</span><span> </span><span>"@/components/firefly-mdx"</span><span>;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>:::tip</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>&lt;</span><span>TabGroup</span><span> </span><span>labels</span><span>=</span><span>{</span><span>[</span><span>"test.js"</span><span>, </span><span>"test.py"</span><span>]</span><span>}</span><span> </span><span>client</span><span>:</span><span>load</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>  </span><span>```</span><span>js</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>1</span><span>)</span></div></div><div><div><div>8</div></div><div><span>  </span><span>```</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>  </span><span>```</span><span>py</span></div></div><div><div><div>11</div></div><div><span>  </span><span>print</span><span>(</span><span>"hello world"</span><span>)</span></div></div><div><div><div>12</div></div><div><span>  </span><span>```</span></div></div><div><div><div>13</div></div><div><span>&lt;/</span><span>TabGroup</span><span>&gt;</span></div></div><div><div><div>14</div></div><div>
</div></div><div><div><div>15</div></div><div><span>:::</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><div><div><div></div><div>Tip</div></div><div><ul>
<li><code>labels</code> 数组给每个代码块声明标签，顺序一一对应</li>
<li>组件用 <code>client:load</code> 激活标签切换</li>
</ul></div></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/encrypted-demo/</id>
      <title type="text">Firefly 文章加密</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/encrypted-demo/"/>
      <summary type="text">这是一篇密码保护的示例文章，用于演示文章加密功能。</summary>
      <content type="html"><![CDATA[本文已加密保护，请访问网站查看。]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/guide/firefly-layout-system/</id>
      <title type="text">Firefly 布局系统详解</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/guide/firefly-layout-system/"/>
      <summary type="text">深入了解 Firefly 的布局系统，包括侧边栏布局（左侧/双侧）和文章列表布局（列表/网格），以及自适应网格列数。</summary>
      <content type="html"><![CDATA[<section><h2>📖 概述<a href="#-概述"><span>#</span></a></h2><p>Firefly 提供了灵活的布局系统，允许您根据内容需求和个人喜好自定义博客的视觉呈现方式。布局系统主要包括<strong>侧边栏布局</strong>和<strong>文章列表布局</strong>两个维度，它们相互配合，共同决定了页面的整体结构。</p><p>本文将详细介绍 Firefly 的各种布局模式、它们的特点、使用场景，以及不同布局组合的效果。</p><hr /><div><figure><img alt="左侧边栏+列表布局" loading="lazy" width="2192" height="1233" src="/_astro/left-list.CdJfuugk_23fiFf.webp" /><figcaption>左侧边栏+列表布局</figcaption></figure><figure><img alt="右侧边栏+网格布局" loading="lazy" width="2192" height="1233" src="/_astro/right-grid2.BDLeNFG9_Z1Ypd95.webp" /><figcaption>右侧边栏+网格布局</figcaption></figure><figure><img alt="左侧边栏+三列网格布局" loading="lazy" width="2192" height="1233" src="/_astro/left-grid3.DCIbm9j3_Z5Vd5j.webp" /><figcaption>左侧边栏+三列网格布局</figcaption></figure></div><div><figure><img alt="双侧边栏+列表布局" loading="lazy" width="2192" height="1233" src="/_astro/both-list.CybtDZTU_xxVkb.webp" /><figcaption>双侧边栏+列表布局</figcaption></figure><figure><img alt="双侧边栏+网格布局" loading="lazy" width="2192" height="1233" src="/_astro/both-grid.B-BFe9Al_1g1tLj.webp" /><figcaption>双侧边栏+网格布局</figcaption></figure><figure><img alt="双侧边栏+网格瀑布流布局" loading="lazy" width="2192" height="1233" src="/_astro/masonry.BgzRsBcp_2mfpqn.webp" /><figcaption>双侧边栏+网格瀑布流布局</figcaption></figure></div></section>
<section><h2>一、侧边栏布局系统<a href="#一侧边栏布局系统"><span>#</span></a></h2><p>侧边栏是博客页面的重要组成部分，用于展示导航、分类、标签、统计信息等辅助内容。Firefly 支持两种侧边栏布局模式。</p><section><h3>1.1 单侧边栏模式<a href="#11-单侧边栏模式"><span>#</span></a></h3><section><h4>左侧边栏 (position: “left”)<a href="#左侧边栏-position-left"><span>#</span></a></h4><p></p><figure><img alt="左侧边栏布局" loading="lazy" width="2192" height="1233" src="/_astro/left-list.CdJfuugk_23fiFf.webp" /><figcaption>左侧边栏布局</figcaption></figure><p></p></section><section><h4>右侧边栏 (position: “right”)<a href="#右侧边栏-position-right"><span>#</span></a></h4><p></p><figure><img alt="右侧边栏布局" loading="lazy" width="2192" height="1233" src="/_astro/right-grid2.BDLeNFG9_Z1Ypd95.webp" /><figcaption>右侧边栏布局</figcaption></figure><p></p></section><section><h4>特点<a href="#特点"><span>#</span></a></h4><ul>
<li>侧边栏固定在页面其中一侧</li>
<li>文章阅读区域体验更佳，更宽敞</li>
<li>更加简约，没有那么紧凑</li>
</ul></section><section><h4>适用场景<a href="#适用场景"><span>#</span></a></h4><ul>
<li>传统博客风格</li>
<li>强调导航和分类的博客</li>
<li>需要突出用户资料的个人博客</li>
<li>内容为主，辅助信息次之的场景</li>
</ul><div><div><div></div><div>Tip</div></div><div><p>文章详情页显示哪几侧，由**各组件的 <code>showOnPostPage</code>（以及 <code>hideOnNonPostPage</code>）**决定：某一侧在当前页型下没有任何可见组件时，该列会自动收起，把空间让给内容栏。</p><p>如果想在文章页同时显示双侧边栏，把 <code>position</code> 设为 <code>"both"</code>，并给两侧组件配好 <code>showOnPostPage</code> 即可。</p></div></div></section><section><h4>配置示例<a href="#配置示例"><span>#</span></a></h4><div><figure><figcaption><span>src/config/sidebarConfig.ts</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>const</span><span> </span><span>sidebarLayoutConfig</span><span>:</span><span> </span><span>SidebarLayoutConfig</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>enable</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>position</span><span>:</span><span> </span><span>"left"</span><span>, </span><span>// 左侧边栏</span></div></div><div><div><div>4</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h3>1.2 双侧边栏模式 (position: “both”)<a href="#12-双侧边栏模式-position-both"><span>#</span></a></h3><section><h4>特点<a href="#特点-1"><span>#</span></a></h4><ul>
<li>左右两侧同时存在侧边栏</li>
<li>主内容区域位于中间</li>
<li>最大化利用屏幕空间</li>
<li>可以展示更多辅助信息</li>
<li>适合宽屏显示器</li>
</ul></section><section><h4>布局结构<a href="#布局结构"><span>#</span></a></h4><p></p><figure><img alt="双侧边栏+列表布局" loading="lazy" width="2192" height="1233" src="/_astro/both-list.CybtDZTU_xxVkb.webp" /><figcaption>双侧边栏+列表布局</figcaption></figure><p></p><p></p><figure><img alt="双侧边栏+网格布局" loading="lazy" width="2192" height="1233" src="/_astro/both-grid.B-BFe9Al_1g1tLj.webp" /><figcaption>双侧边栏+网格布局</figcaption></figure><p></p></section><section><h4>适用场景<a href="#适用场景-1"><span>#</span></a></h4><ul>
<li>宽屏桌面端浏览</li>
<li>信息密集型博客</li>
<li>需要展示大量辅助内容</li>
<li>专业性强的技术博客</li>
</ul></section><section><h4>配置示例<a href="#配置示例-1"><span>#</span></a></h4><div><figure><figcaption><span>src/config/sidebarConfig.ts</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>const</span><span> </span><span>sidebarLayoutConfig</span><span>:</span><span> </span><span>SidebarLayoutConfig</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>enable</span><span>:</span><span> </span><span>true</span><span>,</span></div></div><div><div><div>3</div></div><div><span>  </span><span>position</span><span>:</span><span> </span><span>"both"</span><span>, </span><span>// 双侧边栏</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section></section>
<section><h2>二、文章列表布局系统<a href="#二文章列表布局系统"><span>#</span></a></h2><p>文章列表是博客首页和归档页的核心内容，Firefly 提供两种展示方式，并支持多种网格配置。</p><section><h3>2.1 列表模式 (defaultMode: “list”)<a href="#21-列表模式-defaultmode-list"><span>#</span></a></h3><section><h4>特点<a href="#特点-2"><span>#</span></a></h4><ul>
<li>单列纵向排列</li>
<li>显示文章封面图，可配置在左侧或右侧</li>
<li>展示更多文章摘要</li>
<li>适合深度阅读</li>
</ul></section><section><h4>列表布局结构<a href="#列表布局结构"><span>#</span></a></h4><p></p><figure><img alt="列表模式布局" loading="lazy" width="2192" height="1233" src="/_astro/left-list.CdJfuugk_23fiFf.webp" /><figcaption>列表模式布局</figcaption></figure><p></p></section><section><h4>封面位置<a href="#封面位置"><span>#</span></a></h4><p>列表模式的封面图默认在卡片右侧，可以通过 <code>coverPosition</code> 改到左侧。改到左侧后，标题前的主题色竖线会自动隐藏（它是贴着卡片左边缘的设计），腾出的间距留给正文。</p><p>网格模式的封面固定在卡片顶部，不受这项配置影响。</p></section><section><h4>优点<a href="#优点"><span>#</span></a></h4><ul>
<li>✅ 视觉冲击力强，封面图吸引眼球</li>
<li>✅ 可以展示更多文章信息（摘要、标签等）</li>
<li>✅ 适合图片内容丰富的博客</li>
<li>✅ 移动端友好，单列更易阅读</li>
<li>✅ 兼容所有侧边栏配置（单侧、双侧）</li>
</ul></section><section><h4>配置示例<a href="#配置示例-2"><span>#</span></a></h4><div><figure><figcaption><span>src/config/siteConfig.ts</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>const</span><span> </span><span>siteConfig</span><span>:</span><span> </span><span>SiteConfig</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>postListLayout</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>defaultMode</span><span>:</span><span> </span><span>"list"</span><span>,    </span><span>// 列表模式</span></div></div><div><div><div>4</div></div><div><span>    </span><span>coverPosition</span><span>:</span><span> </span><span>"right"</span><span>, </span><span>// 封面图位置："right" 右侧，"left" 左侧</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>6</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h3>2.2 网格模式 (defaultMode: “grid”)<a href="#22-网格模式-defaultmode-grid"><span>#</span></a></h3><section><h4>特点<a href="#特点-3"><span>#</span></a></h4><ul>
<li>自适应列数，根据浏览器宽度自动调整</li>
<li>紧凑布局，信息密度高</li>
<li>适合快速浏览</li>
</ul></section><section><h4>自适应网格<a href="#自适应网格"><span>#</span></a></h4><p>网格模式通过 <code>columnWidth</code> 配置卡片的最小宽度（单位 px），浏览器会根据容器可用宽度自动计算能容纳多少列。</p><p></p><figure><img alt="网格布局" loading="lazy" width="2192" height="1233" src="/_astro/left-grid3.DCIbm9j3_Z5Vd5j.webp" /><figcaption>网格布局</figcaption></figure><p></p></section><section><h4>配置示例<a href="#配置示例-3"><span>#</span></a></h4><div><figure><figcaption><span>src/config/siteConfig.ts</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>const</span><span> </span><span>siteConfig</span><span>:</span><span> </span><span>SiteConfig</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>postListLayout</span><span>:</span><span> {</span></div></div><div><div><div>3</div></div><div><span>    </span><span>defaultMode</span><span>:</span><span> </span><span>"grid"</span><span>,</span></div></div><div><div><div>4</div></div><div><span>    </span><span>grid</span><span>:</span><span> {</span></div></div><div><div><div>5</div></div><div><span>      </span><span>masonry</span><span>:</span><span> </span><span>true</span><span>,      </span><span>// 开启瀑布流</span></div></div><div><div><div>6</div></div><div><span>      </span><span>columnWidth</span><span>:</span><span> </span><span>320</span><span>,   </span><span>// 卡片最小宽度(px)，浏览器自动计算列数</span></div></div><div><div><div>7</div></div><div><span><span>    </span></span><span>},</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>9</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section></section><section><h3>2.3 瀑布流布局 (Masonry)<a href="#23-瀑布流布局-masonry"><span>#</span></a></h3><p>Firefly 的网格模式内置了智能瀑布流布局支持，解决了网格布局中因图文混合文章导致的卡片高度不一致导致的空白问题。</p><p></p><figure><img alt="瀑布流布局" loading="lazy" width="2192" height="1233" src="/_astro/masonry.BgzRsBcp_2mfpqn.webp" /><figcaption>瀑布流布局</figcaption></figure><p></p><ul>
<li><strong>智能排版</strong>：自动将卡片放置到最短的列，最大化利用垂直空间。</li>
<li><strong>消除空白</strong>：通过绝对定位精确计算每个卡片的位置，让卡片紧贴上方卡片，消除垂直方向的空白间隙。</li>
<li><strong>自适应列数</strong>：瀑布流同样根据 <code>columnWidth</code> 和容器宽度动态计算列数，无需固定配置。</li>
<li><strong>配置灵活</strong>：您可以在 <code>siteConfig.ts</code> 中通过 <code>postListLayout.grid.masonry</code> 选项自由开启或关闭此功能。</li>
</ul><hr /></section></section>
<section><h2>三、布局组合指南<a href="#三布局组合指南"><span>#</span></a></h2><p>Firefly 允许您自由组合侧边栏和文章列表布局。以下是各种组合的效果说明。</p>

<table><thead><tr><th>侧边栏模式</th><th>文章列表模式</th><th>推荐度</th><th>适用场景</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>列表模式</td><td>⭐⭐⭐⭐⭐</td><td>需要展示大量侧边栏信息的站点</td></tr><tr><td>双侧边栏</td><td>网格模式</td><td>⭐⭐⭐⭐⭐</td><td>极客风格，追求最高信息密度</td></tr></tbody></table><hr /></section>
<section><h2>四、响应式布局行为<a href="#四响应式布局行为"><span>#</span></a></h2><p>Firefly 的布局系统具有智能的响应式设计，会根据屏幕尺寸自动调整。</p><p>为了保证最佳阅读体验，系统会在屏幕变窄时自动调整布局：</p><ol>
<li><strong>网格列数自动减少</strong>：网格模式的列数由 <code>columnWidth</code> 和容器宽度自动决定，屏幕越窄列数越少。</li>
<li><strong>列表模式 -&gt; 网格模式</strong>：当屏幕宽度小于 380px（超小屏设备）时，列表模式会自动切换为网格模式，以保证卡片内容的可读性。</li>
<li><strong>双侧边栏 -&gt; 单侧边栏</strong>：当屏幕宽度小于 1280px 时，会根据<code>tabletSidebar</code>配置显示单侧边栏，隐藏其中一个侧边栏，文章目录导航会切换成浮动目录导航。</li>
</ol><hr /></section>
<section><h2>五、常见问题<a href="#五常见问题"><span>#</span></a></h2><section><h3>Q1: 如何调整网格列数？<a href="#q1-如何调整网格列数"><span>#</span></a></h3><p><strong>A</strong>: 通过 <code>columnWidth</code> 配置卡片最小宽度即可。值越小，同等宽度下列数越多；值越大，列数越少。浏览器会自动根据可用宽度计算最佳列数。</p><hr /></section></section>
<section><h2>六、总结<a href="#六总结"><span>#</span></a></h2><p>Firefly 的布局系统给予了您更大的自由度，您都可以通过简单的配置实现。</p><p>我们建议您根据自己的内容类型和目标读者的设备偏好，尝试不同的组合，找到最适合您的博客形态。</p><hr /></section>
<section><h2>相关链接<a href="#相关链接"><span>#</span></a></h2><ul>
<li>📚 <a href="https://docs-firefly.cuteleaf.cn/config/sidebarConfig-usage/" target="_blank">侧边栏配置文档</a></li>
<li>📚 <a href="https://docs-firefly.cuteleaf.cn/config/siteConfig-usage/" target="_blank">站点配置文档</a></li>
<li>🏠 <a href="https://docs-firefly.cuteleaf.cn/" target="_blank">Firefly 官方文档</a></li>
<li>⭐ <a href="https://github.com/CuteLeaf/Firefly" target="_blank">Firefly GitHub</a></li>
</ul></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/guide/firefly-wiki-link/</id>
      <title type="text">Firefly Wiki Link 内部链接示例</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/guide/firefly-wiki-link/"/>
      <summary type="text">在 Firefly 文章中使用 Obsidian 风格的 Wiki Link 内部链接，并自动生成文章链接卡片。</summary>
      <content type="html"><![CDATA[<p>Firefly 支持在 Markdown、MDX 文章中使用 Obsidian 风格的 Wiki Link 内部链接。链接目标填写文章的 slug 或文件路径，都不需要包含扩展名，具体匹配规则见下文「链接目标的三种写法」。</p>
<section><h2>文章链接卡片<a href="#文章链接卡片"><span>#</span></a></h2><p><code>[[slug]]</code> 单独成段时，会自动读取目标文章的标题、描述、发布时间、分类、标签和封面，渲染为链接卡片：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>firefly</span><span>]</span><span>]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[</span><span>[</span><span>guide/index</span><span>]</span><span>]</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>[</span><span>[</span><span>markdown-extended</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><a href="/posts/firefly/"><div><div>Firefly 一款清新美观的 Astro 博客主题模板</div><div>Firefly 是一款基于 Astro 框架和 Fuwari 模板开发的清新美观且现代化个人博客主题模板，专为技术爱好者和内容创作者设计。该主题融合了现代 Web 技术栈，提供了丰富的功能模块和高度可定制的界面，让您能够轻松打造出专业且美观的个人博客网站。</div><div><span>2026-09-12</span><span>博客指南</span><span><span>#Markdown</span><span>#Firefly</span><span>#博客</span><span>#主题</span><span>#模板</span></span></div></div><div><img alt="" loading="lazy" width="480" height="259" src="/_astro/firefly2.dxmXG905_Z2o5m8L.webp" /></div></a><a href="/posts/guide/"><div><div>Firefly 简单使用指南</div><div>如何使用 Firefly 博客模板。</div><div><span>2026-09-12</span><span>博客指南</span><span><span>#Firefly</span><span>#博客</span><span>#Markdown</span><span>#指南</span></span></div></div><div><img alt="" loading="lazy" width="480" height="270" src="/_astro/cover.bDPQizdp_C8GFs.webp" /></div></a><a href="/posts/markdown-extended/"><div><div>Markdown 扩展功能</div><div>了解 Firefly 中的 Markdown 功能</div><div><span>2026-09-12</span><span>博客指南</span><span><span>#演示</span><span>#示例</span><span>#Markdown</span><span>#Firefly</span></span></div></div></a></section>
<section><h2>行内链接<a href="#行内链接"><span>#</span></a></h2><p><code>[[slug]]</code> 出现在正文中间时，渲染为普通链接，链接文字自动使用目标文章的标题</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>请参阅 [</span><span>[</span><span>firefly</span><span>]</span><span>] 了解主题特性。</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>请参阅 <a href="/posts/firefly/">Firefly 一款清新美观的 Astro 博客主题模板</a> 了解主题特性。</p></section>
<section><h2>自定义显示标题<a href="#自定义显示标题"><span>#</span></a></h2><p>在 <code>|</code> 后填写链接的显示文字。行内链接会用它替换文章标题；单独成段时依然渲染为卡片，卡片标题使用自定义文字，描述、时间、分类、标签和封面仍然读取目标文章：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>请参阅 [</span><span>[</span><span>firefly|主题介绍</span><span>]</span><span>] 了解主题特性。</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[[firefly|Firefly 主题介绍]]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>请参阅 <a href="/posts/firefly/">主题介绍</a> 了解主题特性。</p><a href="/posts/firefly/"><div><div>Firefly 主题介绍</div><div>Firefly 是一款基于 Astro 框架和 Fuwari 模板开发的清新美观且现代化个人博客主题模板，专为技术爱好者和内容创作者设计。该主题融合了现代 Web 技术栈，提供了丰富的功能模块和高度可定制的界面，让您能够轻松打造出专业且美观的个人博客网站。</div><div><span>2026-09-12</span><span>博客指南</span><span><span>#Markdown</span><span>#Firefly</span><span>#博客</span><span>#主题</span><span>#模板</span></span></div></div><div><img alt="" loading="lazy" width="480" height="259" src="/_astro/firefly2.dxmXG905_Z2o5m8L.webp" /></div></a><p>一个例外：如果 <code>|</code> 后的文字只是把链接目标又抄了一遍（<code>[[guide/index|index]]</code>），会被当作无效别名忽略，仍然显示文章标题。Obsidian 在插入的链接时会自动补上这样的别名，避免笔记里显示一长串路径，这个例外就是为它准备的。</p></section>
<section><h2>链接目标的三种写法<a href="#链接目标的三种写法"><span>#</span></a></h2><p>用 Obsidian 管理文章时，把 <code>src/content/posts</code> 目录本身作为 Obsidian 仓库（vault）打开。下文提到的「仓库根目录」都指这个目录，它正好也是 Firefly 解析链接路径的起点。</p><p>链接目标按以下顺序匹配：</p>

<table><thead><tr><th>写法</th><th>示例</th><th>在 Obsidian 中</th></tr></thead><tbody><tr><td>frontmatter 的 <code>slug</code></td><td><code>[[firefly-wiki-link]]</code></td><td>✗ 不支持</td></tr><tr><td>文件路径（相对仓库根目录）</td><td><code>[[guide/firefly-layout-system]]</code></td><td>✓ 需改设置（推荐）</td></tr><tr><td>裸文件名（仓库内唯一时）</td><td><code>[[firefly-layout-system]]</code></td><td>✓ 默认即是</td></tr></tbody></table><section><h3>第一种：slug<a href="#第一种slug"><span>#</span></a></h3><p><code>slug</code> 写法在 Obsidian 中不支持，<code>slug</code> 是 Firefly 自己的概念，Obsidian 不读取 frontmatter 里的 <code>slug</code>，所以按 slug 写的链接在 Obsidian 里既不会自动补全，也点不动，只有构建出的站点上能正常跳转。如果你主要在 Obsidian 里写作，用下面两种写法。</p></section><section><h3>第二种：文件路径（推荐）<a href="#第二种文件路径推荐"><span>#</span></a></h3><p>文件路径写法需要改 Obsidian 设置，在 <code>设置 → 文件与链接 → 链接 → 内部链接类型</code> 中选择<strong>基于仓库根目录的绝对路径</strong>，Obsidian 插入的链接才会带上目录：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>guide/firefly-layout-system|firefly-layout-system</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><a href="/posts/guide/firefly-layout-system/"><div><div>Firefly 布局系统详解</div><div>深入了解 Firefly 的布局系统，包括侧边栏布局（左侧/双侧）和文章列表布局（列表/网格），以及自适应网格列数。</div><div><span>2026-09-12</span><span>博客指南</span><span><span>#Firefly</span><span>#布局</span><span>#博客</span><span>#指南</span></span></div></div><div><img alt="" loading="lazy" width="480" height="270" src="/_astro/firefly1.CZCuCN4V_1uGCKh.webp" /></div></a><p>因为仓库根目录就是 <code>src/content/posts</code>，Obsidian 写出的这个路径和 Firefly 需要的路径完全一致，不需要任何额外转换。</p><p>上面这行末尾的 <code>|firefly-layout-system</code> 是 Obsidian 自动补的别名，Firefly 会忽略它，卡片标题仍然取文章的 title，除非你把它修改和文件名不一致，才会变成你修改后的别名。</p><p>内部链接类型下拉框里的<strong>基于当前笔记的相对路径</strong>只在同目录内可用：它给同目录文章生成的是裸文件名，能正常匹配；但跨目录时会生成 <code>../</code> 前缀，Firefly 无法解析，链接会按原文显示。</p></section><section><h3>第三种：裸文件名<a href="#第三种裸文件名"><span>#</span></a></h3><p>「内部链接类型」的默认值就是<strong>尽可能简短的形式</strong>：只要文件名在整个仓库里唯一，Obsidian 插入的链接就只有文件名，不带目录。这种写法不需要改任何设置，效果和写完整路径完全一致：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>firefly-layout-system</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><a href="/posts/guide/firefly-layout-system/"><div><div>Firefly 布局系统详解</div><div>深入了解 Firefly 的布局系统，包括侧边栏布局（左侧/双侧）和文章列表布局（列表/网格），以及自适应网格列数。</div><div><span>2026-09-12</span><span>博客指南</span><span><span>#Firefly</span><span>#布局</span><span>#博客</span><span>#指南</span></span></div></div><div><img alt="" loading="lazy" width="480" height="270" src="/_astro/firefly1.CZCuCN4V_1uGCKh.webp" /></div></a><p>文件名重名时这种写法会失效，构建日志里会给出提示，改用完整文件路径即可，所以推荐直接修改 Obsidian 内部链接类型设置为<strong>基于仓库根目录的绝对路径</strong>，使用第二种文件路径写法，一劳永逸</p></section></section>
<section><h2>链接到其他文章的标题<a href="#链接到其他文章的标题"><span>#</span></a></h2><p>在文章 slug 后添加 <code>#标题</code>。带标题锚点的链接始终渲染为普通链接：</p><p><a href="/posts/code-examples/#%E8%AF%AD%E6%B3%95%E9%AB%98%E4%BA%AE">查看代码块语法高亮</a></p><p><a href="/posts/guide/firefly-layout-system/#%E7%9B%B8%E5%85%B3%E9%93%BE%E6%8E%A5">Firefly 布局系统详解#相关链接</a></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>code-examples#语法高亮|查看代码块语法高亮</span><span>]</span><span>]</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[</span><span>[</span><span>guide/firefly-layout-system#相关链接|firefly-layout-system</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>标题锚点使用与页面标题相同的 slug 规则，因此中文、空格和大小写都会按页面实际生成的 ID 处理。</p></section>
<section><h2>链接到本页标题<a href="#链接到本页标题"><span>#</span></a></h2><p>省略文章 slug，只填写标题即可链接到当前文章：</p><p><a href="#%E6%9C%AC%E9%A1%B5%E7%9B%AE%E6%A0%87">跳转到本页目标</a></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>[</span><span>#本页目标|跳转到本页目标</span><span>]</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>本页目标<a href="#本页目标"><span>#</span></a></h2><p>这是本页 Wiki Link 指向的标题。</p></section>
<section><h2>不支持附件嵌入<a href="#不支持附件嵌入"><span>#</span></a></h2><p>附件嵌入语法目前不会被转换，会按原文显示：</p><p>![[image.png]]</p><p>行内代码和代码块中的 <code>[[firefly]]</code> 也不会被转换。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/katex-math-example/</id>
      <title type="text">KaTeX 数学公式示例</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/katex-math-example/"/>
      <summary type="text">展示 Firefly 主题对 KaTeX 数学公式的支持，包括行内公式、块级公式和复杂数学符号。</summary>
      <content type="html"><![CDATA[<p>本文展示了 <a href="https://github.com/CuteLeaf/Firefly" target="_blank">Firefly</a> 主题对 KaTeX 数学公式的渲染支持。</p>
<section><h2>行内公式 (Inline)<a href="#行内公式-inline"><span>#</span></a></h2><p>行内公式使用单个 <code>$</code> 符号包裹。</p><p>例如：欧拉公式 <span><span>eiπ+1=0e^{i\pi} + 1 = 0</span><span><span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>iπ</span></span></span></span></span></span></span></span></span><span></span><span>+</span><span></span></span><span><span></span><span>1</span><span></span><span>=</span><span></span></span><span><span></span><span>0</span></span></span></span> 是数学中最优美的公式之一。</p><p>质能方程 <span><span>E=mc2E = mc^2</span><span><span><span></span><span>E</span><span></span><span>=</span><span></span></span><span><span></span><span>m</span><span><span>c</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span></span></span></span> 也是家喻户晓。</p></section>
<section><h2>块级公式 (Block)<a href="#块级公式-block"><span>#</span></a></h2><p>块级公式使用两个 <code>$$</code> 符号包裹，会居中显示。</p><span><span><span>∫−∞∞e−x2dx=π\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}</span><span><span><span></span><span><span>∫</span><span><span><span><span><span><span></span><span><span><span>−</span><span>∞</span></span></span></span><span><span></span><span><span><span>∞</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span></span><span><span>e</span><span><span><span><span><span><span></span><span><span><span>−</span><span><span>x</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span>d</span><span>x</span><span></span><span>=</span><span></span></span><span><span></span><span><span><span><span><span><span></span><span><span>π</span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span><span><span><span>x=−b±b2−4ac2ax = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}</span><span><span><span></span><span>x</span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>2</span><span>a</span></span></span><span><span></span><span></span></span><span><span></span><span><span>−</span><span>b</span><span></span><span>±</span><span></span><span><span><span><span><span><span></span><span><span><span>b</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span><span></span><span>−</span><span></span><span>4</span><span>a</span><span>c</span></span></span><span><span></span><span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span></span></section>
<section><h2>复杂示例<a href="#复杂示例"><span>#</span></a></h2><section><h3>矩阵 (Matrices)<a href="#矩阵-matrices"><span>#</span></a></h3><span><span><span>(abcd)(αβγδ)=(aα+bγaβ+bδcα+dγcβ+dδ)\begin{pmatrix}
a &amp; b \\
c &amp; d
\end{pmatrix}
\begin{pmatrix}
\alpha &amp; \beta \\
\gamma &amp; \delta
\end{pmatrix} =
\begin{pmatrix}
a\alpha + b\gamma &amp; a\beta + b\delta \\
c\alpha + d\gamma &amp; c\beta + d\delta
\end{pmatrix}</span><span><span><span></span><span><span><span>(</span></span><span><span><span><span><span><span><span><span></span><span><span>a</span></span></span><span><span></span><span><span>c</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>b</span></span></span><span><span></span><span><span>d</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>)</span></span></span><span></span><span><span><span>(</span></span><span><span><span><span><span><span><span><span></span><span><span>α</span></span></span><span><span></span><span><span>γ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>β</span></span></span><span><span></span><span><span>δ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>)</span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span><span>(</span></span><span><span><span><span><span><span><span><span></span><span><span>a</span><span>α</span><span></span><span>+</span><span></span><span>bγ</span></span></span><span><span></span><span><span>c</span><span>α</span><span></span><span>+</span><span></span><span>d</span><span>γ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span></span><span><span><span><span><span><span></span><span><span>a</span><span>β</span><span></span><span>+</span><span></span><span>b</span><span>δ</span></span></span><span><span></span><span><span>c</span><span>β</span><span></span><span>+</span><span></span><span>d</span><span>δ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span><span><span>)</span></span></span></span></span></span></span></section><section><h3>极限与求和 (Limits and Sums)<a href="#极限与求和-limits-and-sums"><span>#</span></a></h3><span><span><span>∑n=1∞1n2=π26\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}</span><span><span><span></span><span><span><span><span><span><span></span><span><span><span>n</span><span>=</span><span>1</span></span></span></span><span><span></span><span><span>∑</span></span></span><span><span></span><span><span><span>∞</span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span><span></span><span><span><span><span><span><span></span><span><span><span>n</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span>1</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span></span><span>=</span><span></span></span><span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>6</span></span></span><span><span></span><span></span></span><span><span></span><span><span><span>π</span><span><span><span><span><span><span></span><span><span>2</span></span></span></span></span></span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span></span><span><span><span>lim⁡x→0sin⁡xx=1\lim_{x \to 0} \frac{\sin x}{x} = 1</span><span><span><span></span><span><span><span><span><span><span></span><span><span><span>x</span><span>→</span><span>0</span></span></span></span><span><span></span><span><span>lim</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span><span><span></span><span><span><span><span><span><span></span><span><span>x</span></span></span><span><span></span><span></span></span><span><span></span><span><span>sin</span><span></span><span>x</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span><span></span><span>=</span><span></span></span><span><span></span><span>1</span></span></span></span></span></section><section><h3>麦克斯韦方程组 (Maxwell’s Equations)<a href="#麦克斯韦方程组-maxwells-equations"><span>#</span></a></h3><span><span><span>∇⋅E=ρε0∇⋅B=0∇×E=−∂B∂t∇×B=μ0J+μ0ε0∂E∂t\begin{aligned}
\nabla \cdot \mathbf{E} &amp;= \frac{\rho}{\varepsilon_0} \\
\nabla \cdot \mathbf{B} &amp;= 0 \\
\nabla \times \mathbf{E} &amp;= -\frac{\partial \mathbf{B}}{\partial t} \\
\nabla \times \mathbf{B} &amp;= \mu_0\mathbf{J} + \mu_0\varepsilon_0\frac{\partial \mathbf{E}}{\partial t}
\end{aligned}</span><span><span><span></span><span><span><span><span><span><span><span><span></span><span><span>∇</span><span></span><span>⋅</span><span></span><span>E</span></span></span><span><span></span><span><span>∇</span><span></span><span>⋅</span><span></span><span>B</span></span></span><span><span></span><span><span>∇</span><span></span><span>×</span><span></span><span>E</span></span></span><span><span></span><span><span>∇</span><span></span><span>×</span><span></span><span>B</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span><span><span><span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span></span><span><span><span><span><span><span></span><span><span><span>ε</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span><span><span></span><span></span></span><span><span></span><span><span>ρ</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>0</span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span>−</span><span><span></span><span><span><span><span><span><span></span><span><span>∂</span><span>t</span></span></span><span><span></span><span></span></span><span><span></span><span><span>∂</span><span>B</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span><span><span></span><span><span></span><span></span><span>=</span><span></span><span><span>μ</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span>J</span><span></span><span>+</span><span></span><span><span>μ</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span>ε</span><span><span><span><span><span><span></span><span><span>0</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span><span><span></span><span><span><span><span><span><span></span><span><span>∂</span><span>t</span></span></span><span><span></span><span></span></span><span><span></span><span><span>∂</span><span>E</span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span><span></span></span></span></span></span><span>​</span></span><span><span><span></span></span></span></span></span></span></span></span></span></span></span></section><section><h3>化学方程式 (Chemical Equations)<a href="#化学方程式-chemical-equations"><span>#</span></a></h3><span><span><span>\ceCH4+2O2−&gt;CO2+2H2O\ce{CH4 + 2O2 -&gt; CO2 + 2H2O}</span><span><span><span></span><span><span>\ce</span></span><span><span>C</span><span>H</span><span>4</span><span></span><span>+</span><span></span><span>2</span><span>O</span><span>2</span><span>−</span><span></span><span>&gt;</span><span></span><span>C</span><span>O</span><span>2</span><span></span><span>+</span><span></span><span>2</span><span>H</span><span>2</span><span>O</span></span></span></span></span></span></section></section>
<section><h2>更多符号<a href="#更多符号"><span>#</span></a></h2>

<table><thead><tr><th>符号</th><th>代码</th><th>渲染结果</th></tr></thead><tbody><tr><td>Alpha</td><td><code>\alpha</code></td><td><span><span>α\alpha</span><span><span><span></span><span>α</span></span></span></span></td></tr><tr><td>Beta</td><td><code>\beta</code></td><td><span><span>β\beta</span><span><span><span></span><span>β</span></span></span></span></td></tr><tr><td>Gamma</td><td><code>\Gamma</code></td><td><span><span>Γ\Gamma</span><span><span><span></span><span>Γ</span></span></span></span></td></tr><tr><td>Pi</td><td><code>\pi</code></td><td><span><span>π\pi</span><span><span><span></span><span>π</span></span></span></span></td></tr><tr><td>Infinity</td><td><code>\infty</code></td><td><span><span>∞\infty</span><span><span><span></span><span>∞</span></span></span></span></td></tr><tr><td>Right Arrow</td><td><code>\rightarrow</code></td><td><span><span>→\rightarrow</span><span><span><span></span><span>→</span></span></span></span></td></tr><tr><td>Partial</td><td><code>\partial</code></td><td><span><span>∂\partial</span><span><span><span></span><span>∂</span></span></span></span></td></tr></tbody></table><p>更多 KaTeX 语法请参考 <a href="https://katex.org/docs/supported.html" target="_blank">KaTeX Supported Functions</a>。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/markdown-extended/</id>
      <title type="text">Markdown 扩展功能</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>1970-01-01T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/markdown-extended/"/>
      <summary type="text">了解 Firefly 中的 Markdown 功能</summary>
      <content type="html"><![CDATA[<section><h2>GitHub 仓库卡片<a href="#github-仓库卡片"><span>#</span></a></h2><p>您可以添加链接到 GitHub 仓库的动态卡片，在页面加载时，仓库信息会从 GitHub API 获取。</p><a href="https://github.com/CuteLeaf/Firefly" target="_blank"><div><div><div><div></div><div>CuteLeaf</div></div><div>/</div><div>Firefly</div></div><div></div></div><div>🍀Firefly, fresh and aesthetic Astro blog theme template. </div><div><div>—</div><div>—</div><div>MIT</div><span>Astro</span></div></a><p>使用代码 <code>::github{repo="CuteLeaf/Firefly"}</code> 创建 GitHub 仓库卡片。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>::github{repo="CuteLeaf/Firefly"}</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>提醒框(Admonitions)配置<a href="#提醒框admonitions配置"><span>#</span></a></h2><p>Firefly 采用了 <a href="https://github.com/lin-stephanie/rehype-callouts" target="_blank">rehype-callouts</a> 插件，支持了四种风格的提醒框主题：<code>GitHub</code>、<code>Obsidian</code>、<code>VitePress</code> 和 <code>Docusaurus</code>。您可以在 <code>src/config/siteConfig.ts</code> 中进行配置：</p><div><figure><figcaption><span>src/config/siteConfig.ts</span></figcaption><pre><code><div><div><div>1</div></div><div><span>export</span><span> </span><span>const</span><span> </span><span>siteConfig</span><span>:</span><span> </span><span>SiteConfig</span><span> </span><span>=</span><span> {</span></div></div><div><div><div>2</div></div><div><span>  </span><span>// ...</span></div></div><div><div><div>3</div></div><div><span>  </span><span>rehypeCallouts</span><span>:</span><span> {</span></div></div><div><div><div>4</div></div><div><span>    </span><span>// 选项: "github" | "obsidian" | "vitepress" | "docusaurus"</span></div></div><div><div><div>5</div></div><div><span>    </span><span>theme</span><span>:</span><span> </span><span>"github"</span><span>,</span></div></div><div><div><div>6</div></div><div><span><span>  </span></span><span>},</span></div></div><div><div><div>7</div></div><div><span>  </span><span>// ...</span></div></div><div><div><div>8</div></div><div><span>};</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>注意：<strong>更改配置后需要重启开发服务器才能生效。</strong></p><p>以下是各个主题支持的类型列表，每个主题风格和语法不同，可根据喜好选择。</p><section><h3>1. GitHub 主题风格<a href="#1-github-主题风格"><span>#</span></a></h3><p>这是 GitHub 官方支持的 5 种基本类型。</p><p></p><figure><img alt="GitHub" loading="lazy" width="2144" height="1086" src="/_astro/github.urcbElKG_Z1bC9wS.webp" /><figcaption>GitHub</figcaption></figure><p></p><p><strong>基本语法</strong></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; </span><span>[</span><span>!NOTE</span><span>]</span><span> NOTE</span></div></div><div><div><div>2</div></div><div><span>&gt; 突出显示用户应该考虑的信息。</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>&gt; </span><span>[</span><span>!TIP</span><span>]</span><span> TIP</span></div></div><div><div><div>5</div></div><div><span>&gt; 可选信息，帮助用户更成功。</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&gt; </span><span>[</span><span>!IMPORTANT</span><span>]</span><span> IMPORTANT</span></div></div><div><div><div>8</div></div><div><span>&gt; 用户成功所必需的关键信息。</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>&gt; </span><span>[</span><span>!WARNING</span><span>]</span><span> WARNING</span></div></div><div><div><div>11</div></div><div><span>&gt; 关键内容，需要立即注意。</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>&gt; </span><span>[</span><span>!CAUTION</span><span>]</span><span> CAUTION</span></div></div><div><div><div>14</div></div><div><span>&gt; 行动的负面潜在后果。</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>&gt; </span><span>[</span><span>!NOTE</span><span>]</span><span> 自定义标题</span></div></div><div><div><div>17</div></div><div><span>&gt; 这是一个带有自定义标题的示例。</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section><section><h3>2. Obsidian 主题风格<a href="#2-obsidian-主题风格"><span>#</span></a></h3><p><a href="https://obsidian.md/" target="_blank">Obsidian</a> 风格支持非常丰富的类型和别名。</p>
点击展开 Obsidian 语法列表<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; </span><span>[</span><span>!NOTE</span><span>]</span><span> NOTE</span></div></div><div><div><div>2</div></div><div><span>&gt; 通用的笔记块。</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>&gt; </span><span>[</span><span>!ABSTRACT</span><span>]</span><span> ABSTRACT</span></div></div><div><div><div>5</div></div><div><span>&gt; 文章的摘要。</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&gt; </span><span>[</span><span>!SUMMARY</span><span>]</span><span> SUMMARY</span></div></div><div><div><div>8</div></div><div><span>&gt; 文章的总结（同 Abstract）。</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>&gt; </span><span>[</span><span>!TLDR</span><span>]</span><span> TLDR</span></div></div><div><div><div>11</div></div><div><span>&gt; 太长不看（同 Abstract）。</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>&gt; </span><span>[</span><span>!INFO</span><span>]</span><span> INFO</span></div></div><div><div><div>14</div></div><div><span>&gt; 提供额外信息。</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>&gt; </span><span>[</span><span>!TODO</span><span>]</span><span> TODO</span></div></div><div><div><div>17</div></div><div><span>&gt; 需要完成的事项。</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>&gt; </span><span>[</span><span>!TIP</span><span>]</span><span> TIP</span></div></div><div><div><div>20</div></div><div><span>&gt; 实用技巧或提示。</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>&gt; </span><span>[</span><span>!HINT</span><span>]</span><span> HINT</span></div></div><div><div><div>23</div></div><div><span>&gt; 暗示（同 Tip）。</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>&gt; </span><span>[</span><span>!IMPORTANT</span><span>]</span><span> IMPORTANT</span></div></div><div><div><div>26</div></div><div><span>&gt; 重要信息（Obsidian 风格通常使用类似的图标）。</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>&gt; </span><span>[</span><span>!SUCCESS</span><span>]</span><span> SUCCESS</span></div></div><div><div><div>29</div></div><div><span>&gt; 操作成功。</span></div></div><div><div><div>30</div></div><div>
</div></div><div><div><div>31</div></div><div><span>&gt; </span><span>[</span><span>!CHECK</span><span>]</span><span> CHECK</span></div></div><div><div><div>32</div></div><div><span>&gt; 检查通过（同 Success）。</span></div></div><div><div><div>33</div></div><div>
</div></div><div><div><div>34</div></div><div><span>&gt; </span><span>[</span><span>!DONE</span><span>]</span><span> DONE</span></div></div><div><div><div>35</div></div><div><span>&gt; 已完成（同 Success）。</span></div></div><div><div><div>36</div></div><div>
</div></div><div><div><div>37</div></div><div><span>&gt; </span><span>[</span><span>!QUESTION</span><span>]</span><span> QUESTION</span></div></div><div><div><div>38</div></div><div><span>&gt; 提出问题。</span></div></div><div><div><div>39</div></div><div>
</div></div><div><div><div>40</div></div><div><span>&gt; </span><span>[</span><span>!HELP</span><span>]</span><span> HELP</span></div></div><div><div><div>41</div></div><div><span>&gt; 寻求帮助（同 Question）。</span></div></div><div><div><div>42</div></div><div>
</div></div><div><div><div>43</div></div><div><span>&gt; </span><span>[</span><span>!FAQ</span><span>]</span><span> FAQ</span></div></div><div><div><div>44</div></div><div><span>&gt; 常见问题（同 Question）。</span></div></div><div><div><div>45</div></div><div>
</div></div><div><div><div>46</div></div><div><span>&gt; </span><span>[</span><span>!WARNING</span><span>]</span><span> WARNING</span></div></div><div><div><div>47</div></div><div><span>&gt; 警告信息。</span></div></div><div><div><div>48</div></div><div>
</div></div><div><div><div>49</div></div><div><span>&gt; </span><span>[</span><span>!CAUTION</span><span>]</span><span> CAUTION</span></div></div><div><div><div>50</div></div><div><span>&gt; 注意事项（同 Warning）。</span></div></div><div><div><div>51</div></div><div>
</div></div><div><div><div>52</div></div><div><span>&gt; </span><span>[</span><span>!ATTENTION</span><span>]</span><span> ATTENTION</span></div></div><div><div><div>53</div></div><div><span>&gt; 引起注意（同 Warning）。</span></div></div><div><div><div>54</div></div><div>
</div></div><div><div><div>55</div></div><div><span>&gt; </span><span>[</span><span>!FAILURE</span><span>]</span><span> FAILURE</span></div></div><div><div><div>56</div></div><div><span>&gt; 操作失败。</span></div></div><div><div><div>57</div></div><div>
</div></div><div><div><div>58</div></div><div><span>&gt; </span><span>[</span><span>!FAIL</span><span>]</span><span> FAIL</span></div></div><div><div><div>59</div></div><div><span>&gt; 失败（同 Failure）。</span></div></div><div><div><div>60</div></div><div>
</div></div><div><div><div>61</div></div><div><span>&gt; </span><span>[</span><span>!MISSING</span><span>]</span><span> MISSING</span></div></div><div><div><div>62</div></div><div><span>&gt; 缺失内容（同 Failure）。</span></div></div><div><div><div>63</div></div><div>
</div></div><div><div><div>64</div></div><div><span>&gt; </span><span>[</span><span>!DANGER</span><span>]</span><span> DANGER</span></div></div><div><div><div>65</div></div><div><span>&gt; 危险操作警告。</span></div></div><div><div><div>66</div></div><div>
</div></div><div><div><div>67</div></div><div><span>&gt; </span><span>[</span><span>!ERROR</span><span>]</span><span> ERROR</span></div></div><div><div><div>68</div></div><div><span>&gt; 错误信息（同 Danger）。</span></div></div><div><div><div>69</div></div><div>
</div></div><div><div><div>70</div></div><div><span>&gt; </span><span>[</span><span>!BUG</span><span>]</span><span> BUG</span></div></div><div><div><div>71</div></div><div><span>&gt; 报告软件缺陷。</span></div></div><div><div><div>72</div></div><div>
</div></div><div><div><div>73</div></div><div><span>&gt; </span><span>[</span><span>!EXAMPLE</span><span>]</span><span> EXAMPLE</span></div></div><div><div><div>74</div></div><div><span>&gt; 展示一个例子。</span></div></div><div><div><div>75</div></div><div>
</div></div><div><div><div>76</div></div><div><span>&gt; </span><span>[</span><span>!QUOTE</span><span>]</span><span> QUOTE</span></div></div><div><div><div>77</div></div><div><span>&gt; 引用一段话。</span></div></div><div><div><div>78</div></div><div>
</div></div><div><div><div>79</div></div><div><span>&gt; </span><span>[</span><span>!CITE</span><span>]</span><span> CITE</span></div></div><div><div><div>80</div></div><div><span>&gt; 引证（同 Quote）。</span></div></div><div><div><div>81</div></div><div>
</div></div><div><div><div>82</div></div><div><span>&gt; </span><span>[</span><span>!NOTE</span><span>]</span><span> 自定义标题</span></div></div><div><div><div>83</div></div><div><span>&gt; 这是一个带有自定义标题的示例。</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p></p><figure><img alt="Obsidian" loading="lazy" width="2144" height="1320" src="/_astro/obsidian.Cwb2iYzd_1I7Wom.webp" /><figcaption>Obsidian</figcaption></figure><p></p><hr /></section><section><h3>3. VitePress 主题风格<a href="#3-vitepress-主题风格"><span>#</span></a></h3><p><a href="https://vitepress.dev/" target="_blank">VitePress</a> 风格提供了一套现代化的、扁平的默认样式。目前仅包含与 GitHub 一致的 <strong>5 种</strong> 基础类型。</p>
点击展开 VitePress 语法列表<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; </span><span>[</span><span>!NOTE</span><span>]</span><span> NOTE</span></div></div><div><div><div>2</div></div><div><span>&gt; 对应 GitHub 的 Note。</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>&gt; </span><span>[</span><span>!TIP</span><span>]</span><span> TIP</span></div></div><div><div><div>5</div></div><div><span>&gt; 对应 GitHub 的 Tip。</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&gt; </span><span>[</span><span>!IMPORTANT</span><span>]</span><span> IMPORTANT</span></div></div><div><div><div>8</div></div><div><span>&gt; 对应 GitHub 的 Important。</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>&gt; </span><span>[</span><span>!WARNING</span><span>]</span><span> WARNING</span></div></div><div><div><div>11</div></div><div><span>&gt; 对应 GitHub 的 Warning。</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>&gt; </span><span>[</span><span>!CAUTION</span><span>]</span><span> CAUTION</span></div></div><div><div><div>14</div></div><div><span>&gt; 对应 GitHub 的 Caution。</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>&gt; </span><span>[</span><span>!TIP</span><span>]</span><span> 自定义标题</span></div></div><div><div><div>17</div></div><div><span>&gt; VitePress 风格同样支持自定义标题。</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p></p><figure><img alt="VitePress" loading="lazy" width="2144" height="1318" src="/_astro/vitepress.D2YnjBWE_Z1rUl1H.webp" /><figcaption>VitePress</figcaption></figure><p></p><hr /></section><section><h3>4. Docusaurus 主题风格<a href="#4-docusaurus-主题风格"><span>#</span></a></h3><p><a href="https://docusaurus.io/docs/markdown-features/admonitions" target="_blank">Docusaurus</a> 风格提供了一套现代化的提醒框样式，支持 5 种类型。</p>
点击展开 Docusaurus 语法列表 <p>支持以下类型的提醒框：<code>note</code> <code>tip</code> <code>info</code> <code>warning</code> <code>danger</code></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>:::note</span></div></div><div><div><div>2</div></div><div><span>突出显示用户应该考虑的信息，即使在快速浏览时也是如此。</span></div></div><div><div><div>3</div></div><div><span>:::</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>:::tip</span></div></div><div><div><div>6</div></div><div><span>可选信息，帮助用户更成功。</span></div></div><div><div><div>7</div></div><div><span>:::</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>:::info</span></div></div><div><div><div>10</div></div><div><span>一般信息。</span></div></div><div><div><div>11</div></div><div><span>:::</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>:::warning</span></div></div><div><div><div>14</div></div><div><span>由于潜在风险需要用户立即注意的关键内容。</span></div></div><div><div><div>15</div></div><div><span>:::</span></div></div><div><div><div>16</div></div><div>
</div></div><div><div><div>17</div></div><div><span>:::danger</span></div></div><div><div><div>18</div></div><div><span>行动的负面潜在后果。</span></div></div><div><div><div>19</div></div><div><span>:::</span></div></div><div><div><div>20</div></div><div>
</div></div><div><div><div>21</div></div><div><span>:::tip</span><span>[</span><span>自定义标题</span><span>]</span></div></div><div><div><div>22</div></div><div><span>可选信息，帮助用户更成功。</span></div></div><div><div><div>23</div></div><div><span>:::</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><p></p><figure><img alt="Docusaurus" loading="lazy" width="2158" height="1394" src="/_astro/docusaurus.Cu-On_k2_Zy4rHX.webp" /><figcaption>Docusaurus</figcaption></figure><p></p><hr /></section></section>
<section><h2>剧透<a href="#剧透"><span>#</span></a></h2><p>您可以为文本添加剧透。文本也支持 <strong>Markdown</strong> 语法。</p><p>内容 被隐藏了 <strong>哈哈</strong>！</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>内容 :spoiler[被隐藏了 </span><span>**哈哈**</span><span>]！</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section>
<section><h2>图片画廊网格 (Image Grid)<a href="#图片画廊网格-image-grid"><span>#</span></a></h2><p>您可以使用 <code>[grid]</code> 和 <code>[/grid]</code> 标签将多张图片纵向并排展示。这对于展示照片画廊或对比图非常有用。系统会自动根据包裹在其中的图片数量（最多支持并排展示4张）以响应式网格进行布局。</p><p><strong>自动补齐图片高度：</strong> 同一排中如果有高度、大小或者比例不一的图片，会像「九宫格画廊相册」一样自动撑满。较短或不协调的图片会自动使用 object-cover 进行完美中心裁剪补充视野。图片边框水平彻底对齐无缝隙，但被裁剪后，只有点击图片通过灯箱才能查看完整图片，所以建议尽量避免使用长宽比例不一致的图片在同一排中。</p><p><strong>图注恒定底端对齐：</strong> 不论上面的图片长宽如何变化，在同一行的所有图像解释文字（图注）都会对标到一条完美的水平基线上了。</p><div><figure><img alt="示例图片一" loading="lazy" width="3328" height="1872" src="/_astro/firefly1.CZCuCN4V_1dgNYg.webp" /><figcaption>示例图片一</figcaption></figure><figure><img alt="示例图片二" loading="lazy" width="4096" height="2212" src="/_astro/firefly2.dxmXG905_ZyJm5m.webp" /><figcaption>示例图片二</figcaption></figure><figure><img alt="示例图片二" loading="lazy" width="3840" height="2160" src="/_astro/firefly3.CGzFXcxi_Z1Lz6q8.webp" /><figcaption>示例图片二</figcaption></figure></div><p><strong>基本语法</strong></p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[</span><span>grid</span><span>]</span></div></div><div><div><div>2</div></div><div><span>![</span><span>示例图片一</span><span>]</span><span><span>(</span><span>./images/firefly1.avif</span><span>)</span></span></div></div><div><div><div>3</div></div><div><span>![</span><span>示例图片二</span><span>]</span><span><span>(</span><span>./images/firefly2.avif</span><span>)</span></span></div></div><div><div><div>4</div></div><div><span>![</span><span>示例图片二</span><span>]</span><span><span>(</span><span>./images/firefly3.avif</span><span>)</span></span></div></div><div><div><div>5</div></div><div><span>[</span><span>/grid</span><span>]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/markdown-mermaid/</id>
      <title type="text">Markdown Mermaid 图表</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/markdown-mermaid/"/>
      <summary type="text">一个包含 Mermaid 的 Markdown 博客文章简单示例。</summary>
      <content type="html"><![CDATA[<section><h2>Markdown 中 Mermaid 图表完整指南<a href="#markdown-中-mermaid-图表完整指南"><span>#</span></a></h2><p>本文演示如何在 Markdown 文档中使用 Mermaid 创建各种复杂图表，包括流程图、时序图、ER 图、类图、状态图、XY 图、甘特图、思维导图等。</p><blockquote><p>Mermaid 图表由 <a href="https://github.com/Latias94/merman" target="_blank">Merman</a> 实现。Firefly 在 Astro 构建阶段生成亮色和深色两套静态 SVG，无需在浏览器中加载 Mermaid 渲染运行时。可以前往 <a href="http://frankorz.com/merman/" target="_blank">Merman Playground</a> 实时编辑语法并预览渲染结果。</p></blockquote></section>
<section><h2>流程图示例<a href="#流程图示例"><span>#</span></a></h2><p>流程图非常适合表示流程或算法步骤。</p><div><div><div><div><span></span></div><div><span><p>是</p></span></div><div><span><p>否</p></span></div><div><span><p>选项 1</p></span></div><div><span><p>选项 2</p></span></div><div><span><p>选项 3</p></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>子过程详情</p></span></div><div><span></span></div><div><span></span></div><div><span><p>子步骤 1</p></span></div><div><span><p>子步骤 2</p></span></div><div><span><p>子步骤 3</p></span></div><div><span><p>开始</p></span></div><div><span><p>条件检查</p></span></div><div><span><p>处理步骤 1</p></span></div><div><span><p>处理步骤 2</p></span></div><div><span><p>另一个决策</p></span></div><div><span><p>结果 1</p></span></div><div><span><p>结果 2</p></span></div><div><span><p>结果 3</p></span></div><div><span><p>结束</p></span></div>
</div><div><div><span></span></div><div><span><p>是</p></span></div><div><span><p>否</p></span></div><div><span><p>选项 1</p></span></div><div><span><p>选项 2</p></span></div><div><span><p>选项 3</p></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>子过程详情</p></span></div><div><span></span></div><div><span></span></div><div><span><p>子步骤 1</p></span></div><div><span><p>子步骤 2</p></span></div><div><span><p>子步骤 3</p></span></div><div><span><p>开始</p></span></div><div><span><p>条件检查</p></span></div><div><span><p>处理步骤 1</p></span></div><div><span><p>处理步骤 2</p></span></div><div><span><p>另一个决策</p></span></div><div><span><p>结果 1</p></span></div><div><span><p>结果 2</p></span></div><div><span><p>结果 3</p></span></div><div><span><p>结束</p></span></div>
</div></div></div></section>
<section><h2>时序图示例<a href="#时序图示例"><span>#</span></a></h2><p>时序图显示对象之间随时间的交互。</p><div><div><div>数据库服务器网页应用用户数据库服务器网页应用用户alt[认证成功][认证失败]提交登录请求发送认证请求查询用户凭据返回用户数据返回认证结果显示欢迎页面请求用户数据获取用户偏好返回偏好设置返回用户数据加载个性化界面显示错误消息提示重新输入
</div><div>数据库服务器网页应用用户数据库服务器网页应用用户alt[认证成功][认证失败]提交登录请求发送认证请求查询用户凭据返回用户数据返回认证结果显示欢迎页面请求用户数据获取用户偏好返回偏好设置返回用户数据加载个性化界面显示错误消息提示重新输入
</div></div></div></section>
<section><h2>ER 图示例<a href="#er-图示例"><span>#</span></a></h2><p>ER 图（实体关系图）非常适合表示数据库结构。</p><div><div><div>

<div><span><p>writes</p></span></div><div><span><p>posts</p></span></div><div><span><p>has</p></span></div><div><span><p>belongs to</p></span></div>
<div><span><p>USER</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>username</p></span></div><div><span></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>email</p></span></div><div><span></span></div><div><span></span></div><div><span><p>datetime</p></span></div><div><span><p>created_at</p></span></div><div><span></span></div><div><span></span></div><div><span><p>ARTICLE</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>title</p></span></div><div><span></span></div><div><span></span></div><div><span><p>text</p></span></div><div><span><p>content</p></span></div><div><span></span></div><div><span></span></div><div><span><p>datetime</p></span></div><div><span><p>published</p></span></div><div><span></span></div><div><span></span></div><div><span><p>int</p></span></div><div><span><p>author_id</p></span></div><div><span><p>FK</p></span></div><div><span></span></div><div><span><p>COMMENT</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>text</p></span></div><div><span><p>content</p></span></div><div><span></span></div><div><span></span></div><div><span><p>datetime</p></span></div><div><span><p>created_at</p></span></div><div><span></span></div><div><span></span></div><div><span><p>int</p></span></div><div><span><p>user_id</p></span></div><div><span><p>FK</p></span></div><div><span></span></div><div><span><p>int</p></span></div><div><span><p>article_id</p></span></div><div><span><p>FK</p></span></div><div><span></span></div><div><span><p>CATEGORY</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>name</p></span></div><div><span></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>description</p></span></div><div><span></span></div><div><span></span></div>

</div><div>

<div><span><p>writes</p></span></div><div><span><p>posts</p></span></div><div><span><p>has</p></span></div><div><span><p>belongs to</p></span></div>
<div><span><p>USER</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>username</p></span></div><div><span></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>email</p></span></div><div><span></span></div><div><span></span></div><div><span><p>datetime</p></span></div><div><span><p>created_at</p></span></div><div><span></span></div><div><span></span></div><div><span><p>ARTICLE</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>title</p></span></div><div><span></span></div><div><span></span></div><div><span><p>text</p></span></div><div><span><p>content</p></span></div><div><span></span></div><div><span></span></div><div><span><p>datetime</p></span></div><div><span><p>published</p></span></div><div><span></span></div><div><span></span></div><div><span><p>int</p></span></div><div><span><p>author_id</p></span></div><div><span><p>FK</p></span></div><div><span></span></div><div><span><p>COMMENT</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>text</p></span></div><div><span><p>content</p></span></div><div><span></span></div><div><span></span></div><div><span><p>datetime</p></span></div><div><span><p>created_at</p></span></div><div><span></span></div><div><span></span></div><div><span><p>int</p></span></div><div><span><p>user_id</p></span></div><div><span><p>FK</p></span></div><div><span></span></div><div><span><p>int</p></span></div><div><span><p>article_id</p></span></div><div><span><p>FK</p></span></div><div><span></span></div><div><span><p>CATEGORY</p></span></div><div><span><p>int</p></span></div><div><span><p>id</p></span></div><div><span><p>PK</p></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>name</p></span></div><div><span></span></div><div><span></span></div><div><span><p>string</p></span></div><div><span><p>description</p></span></div><div><span></span></div><div><span></span></div>

</div></div></div></section>
<section><h2>类图示例<a href="#类图示例"><span>#</span></a></h2><p>类图显示系统的静态结构，包括类、属性、方法及其关系。</p><div><div><div><div><span><p>写作</p></span></div><div><span><p>发表</p></span></div><div><span><p>拥有</p></span></div><div><span><p>属于</p></span></div><div><span><p>1</p></span></div><div><span><p>1</p></span></div><div><span><p>1</p></span></div><div><span><p>1</p></span></div><div><span><p>*</p></span></div><div><span><p>*</p></span></div><div><span><p>*</p></span></div><div><span><p>*</p></span></div><div><span><p>User</p></span></div><div><span><p>+String username</p></span></div><div><span><p>+String password</p></span></div><div><span><p>+String email</p></span></div><div><span><p>+Boolean active</p></span></div><div><span><p>+login()</p></span></div><div><span><p>+logout()</p></span></div><div><span><p>+updateProfile()</p></span></div><div><span><p>Article</p></span></div><div><span><p>+String title</p></span></div><div><span><p>+String content</p></span></div><div><span><p>+Date publishDate</p></span></div><div><span><p>+Boolean published</p></span></div><div><span><p>+publish()</p></span></div><div><span><p>+edit()</p></span></div><div><span><p>+delete()</p></span></div><div><span><p>Comment</p></span></div><div><span><p>+String content</p></span></div><div><span><p>+Date commentDate</p></span></div><div><span><p>+addComment()</p></span></div><div><span><p>+deleteComment()</p></span></div><div><span><p>Category</p></span></div><div><span><p>+String name</p></span></div><div><span><p>+String description</p></span></div><div><span><p>+addArticle()</p></span></div><div><span><p>+removeArticle()</p></span></div></div><div><div><span><p>写作</p></span></div><div><span><p>发表</p></span></div><div><span><p>拥有</p></span></div><div><span><p>属于</p></span></div><div><span><p>1</p></span></div><div><span><p>1</p></span></div><div><span><p>1</p></span></div><div><span><p>1</p></span></div><div><span><p>*</p></span></div><div><span><p>*</p></span></div><div><span><p>*</p></span></div><div><span><p>*</p></span></div><div><span><p>User</p></span></div><div><span><p>+String username</p></span></div><div><span><p>+String password</p></span></div><div><span><p>+String email</p></span></div><div><span><p>+Boolean active</p></span></div><div><span><p>+login()</p></span></div><div><span><p>+logout()</p></span></div><div><span><p>+updateProfile()</p></span></div><div><span><p>Article</p></span></div><div><span><p>+String title</p></span></div><div><span><p>+String content</p></span></div><div><span><p>+Date publishDate</p></span></div><div><span><p>+Boolean published</p></span></div><div><span><p>+publish()</p></span></div><div><span><p>+edit()</p></span></div><div><span><p>+delete()</p></span></div><div><span><p>Comment</p></span></div><div><span><p>+String content</p></span></div><div><span><p>+Date commentDate</p></span></div><div><span><p>+addComment()</p></span></div><div><span><p>+deleteComment()</p></span></div><div><span><p>Category</p></span></div><div><span><p>+String name</p></span></div><div><span><p>+String description</p></span></div><div><span><p>+addArticle()</p></span></div><div><span><p>+removeArticle()</p></span></div></div></div></div></section>
<section><h2>状态图示例<a href="#状态图示例"><span>#</span></a></h2><p>状态图显示对象在其生命周期中经历的状态序列。</p><div><div><div><div><span></span></div><div><span><p>提交</p></span></div><div><span><p>拒绝</p></span></div><div><span><p>批准</p></span></div><div><span><p>发布</p></span></div><div><span><p>归档</p></span></div><div><span><p>撤回</p></span></div><div><span></span></div><div><span><p>草稿</p></span></div><div><span><p>审核中</p></span></div><div><span><p>已批准</p></span></div><div><span><p>已归档</p></span></div><div><span>已发布</span></div><div><span></span></div><div><span><p>临时隐藏</p></span></div><div><span><p>恢复</p></span></div><div><span></span></div><div><span></span></div><div><span><p>活跃</p></span></div><div><span><p>隐藏</p></span></div>
</div><div><div><span></span></div><div><span><p>提交</p></span></div><div><span><p>拒绝</p></span></div><div><span><p>批准</p></span></div><div><span><p>发布</p></span></div><div><span><p>归档</p></span></div><div><span><p>撤回</p></span></div><div><span></span></div><div><span><p>草稿</p></span></div><div><span><p>审核中</p></span></div><div><span><p>已批准</p></span></div><div><span><p>已归档</p></span></div><div><span>已发布</span></div><div><span></span></div><div><span><p>临时隐藏</p></span></div><div><span><p>恢复</p></span></div><div><span></span></div><div><span></span></div><div><span><p>活跃</p></span></div><div><span><p>隐藏</p></span></div>
</div></div></div></section>
<section><h2>XY 图示例<a href="#xy-图示例"><span>#</span></a></h2><p>XY 图表非常适合展示趋势和对比数据。</p><div><div><div>月度访问量趋势1月2月3月4月5月6月5000450040003500300025002000150010005000访问量
</div><div>月度访问量趋势1月2月3月4月5月6月5000450040003500300025002000150010005000访问量
</div></div></div></section>
<section><h2>饼图示例<a href="#饼图示例"><span>#</span></a></h2><p>饼图适合直观展示各部分在整体中的占比。</p><div><div><div>45%30%15%10%内容类型占比技术文章 [45]项目记录 [30]生活随笔 [15]其他 [10]
</div><div>45%30%15%10%内容类型占比技术文章 [45]项目记录 [30]生活随笔 [15]其他 [10]
</div></div></div></section>
<section><h2>甘特图示例<a href="#甘特图示例"><span>#</span></a></h2><p>甘特图可以按时间轴展示项目阶段、任务依赖和当前进度。</p><div><div><div>07/0107/0307/0507/0707/0907/1107/1307/1507/17需求整理 视觉设计 功能实现 内容迁移 构建检查 正式上线 准备开发发布博客版本发布计划
</div><div>07/0107/0307/0507/0707/0907/1107/1307/1507/17需求整理 视觉设计 功能实现 内容迁移 构建检查 正式上线 准备开发发布博客版本发布计划
</div></div></div></section>
<section><h2>思维导图示例<a href="#思维导图示例"><span>#</span></a></h2><p>思维导图适合梳理主题层级和知识结构。</p><div><div><div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>Firefly</p></span></div><div><span><p>内容</p></span></div><div><span><p>技术文章</p></span></div><div><span><p>生活记录</p></span></div><div><span><p>体验</p></span></div><div><span><p>搜索</p></span></div><div><span><p>深色模式</p></span></div><div><span><p>图表</p></span></div><div><span><p>工程</p></span></div><div><span><p>Astro</p></span></div><div><span><p>Svelte</p></span></div><div><span><p>Merman</p></span></div>
</div><div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>Firefly</p></span></div><div><span><p>内容</p></span></div><div><span><p>技术文章</p></span></div><div><span><p>生活记录</p></span></div><div><span><p>体验</p></span></div><div><span><p>搜索</p></span></div><div><span><p>深色模式</p></span></div><div><span><p>图表</p></span></div><div><span><p>工程</p></span></div><div><span><p>Astro</p></span></div><div><span><p>Svelte</p></span></div><div><span><p>Merman</p></span></div>
</div></div></div></section>
<section><h2>时间线示例<a href="#时间线示例"><span>#</span></a></h2><p>时间线用于按年份或阶段呈现项目的重要事件。</p><div><div><div>2024建立博客完成基础主题2025加入搜索与图库完善内容系统2026升级   Astro   7使用   Merman   渲染图表Firefly 演进时间线
</div><div>2024建立博客完成基础主题2025加入搜索与图库完善内容系统2026升级   Astro   7使用   Merman   渲染图表Firefly 演进时间线
</div></div></div></section>
<section><h2>用户旅程图示例<a href="#用户旅程图示例"><span>#</span></a></h2><p>用户旅程图能够描述用户在不同阶段的行为和体验评分。</p><div><div><div>读者<div><div>发现内容</div></div>发现内容读者<div><div>      打开首页</div></div>      打开首页读者<div><div>      搜索主题</div></div>      搜索主题<div><div>阅读文章</div></div>阅读文章读者<div><div>      浏览正文</div></div>      浏览正文读者<div><div>      查看图表</div></div>      查看图表<div><div>继续探索</div></div>继续探索读者<div><div>      查看相关文章</div></div>      查看相关文章读者<div><div>      分享文章</div></div>      分享文章读者浏览文章的旅程
</div><div>读者<div><div>发现内容</div></div>发现内容读者<div><div>      打开首页</div></div>      打开首页读者<div><div>      搜索主题</div></div>      搜索主题<div><div>阅读文章</div></div>阅读文章读者<div><div>      浏览正文</div></div>      浏览正文读者<div><div>      查看图表</div></div>      查看图表<div><div>继续探索</div></div>继续探索读者<div><div>      查看相关文章</div></div>      查看相关文章读者<div><div>      分享文章</div></div>      分享文章读者浏览文章的旅程
</div></div></div></section>
<section><h2>Git 图示例<a href="#git-图示例"><span>#</span></a></h2><p>Git 图可以清晰展示分支、提交和合并历史。</p><div><div><div>mainfeatureinitadd-diagramspolish-themesmerge-featurerelease
</div><div>mainfeatureinitadd-diagramspolish-themesmerge-featurerelease
</div></div></div></section>
<section><h2>看板示例<a href="#看板示例"><span>#</span></a></h2><p>看板适合展示任务在不同工作阶段之间的分布。</p><div><div><div><div><span><p>待办</p></span></div><div><span><p>进行中</p></span></div><div><span><p>已完成</p></span></div><div><span><p>整理需求</p></span></div><div><span></span></div><div><span></span></div><div><span><p>准备示例</p></span></div><div><span></span></div><div><span></span></div><div><span><p>接入 Merman</p></span></div><div><span></span></div><div><span></span></div><div><span><p>服务端渲染</p></span></div><div><span></span></div><div><span></span></div><div><span><p>亮暗主题</p></span></div><div><span></span></div><div><span></span></div>
</div><div><div><span><p>待办</p></span></div><div><span><p>进行中</p></span></div><div><span><p>已完成</p></span></div><div><span><p>整理需求</p></span></div><div><span></span></div><div><span></span></div><div><span><p>准备示例</p></span></div><div><span></span></div><div><span></span></div><div><span><p>接入 Merman</p></span></div><div><span></span></div><div><span></span></div><div><span><p>服务端渲染</p></span></div><div><span></span></div><div><span></span></div><div><span><p>亮暗主题</p></span></div><div><span></span></div><div><span></span></div>
</div></div></div></section>
<section><h2>Sankey 图示例<a href="#sankey-图示例"><span>#</span></a></h2><p>Sankey 图通过连线宽度展示流量在不同节点之间的流向。</p><div><div><div>Home
1650Post list
1200Search
450Post detail
1220Related posts
260External shares
180</div><div>Home
1650Post list
1200Search
450Post detail
1220Related posts
260External shares
180</div></div></div></section>
<section><h2>总结<a href="#总结"><span>#</span></a></h2><p>Mermaid 是在 Markdown 文档中创建各种类型图表的强大工具。本文演示了流程图、时序图、ER 图、类图、状态图、XY 图、饼图、甘特图、思维导图、时间线、用户旅程图、Git 图、看板和 Sankey 图。这些图表可以帮助您更清晰地表达复杂的概念、流程和数据结构。</p><p>要使用 Mermaid，只需在代码块中指定 mermaid 语言，并使用简洁的文本语法描述图表。图表会在构建时自动渲染为 SVG，无需客户端 JavaScript 加载。</p><p>可以前往 <a href="http://frankorz.com/merman/" target="_blank">Merman Playground</a> 尝试更多语法，再将图表代码粘贴到文章中。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/markdown-plantuml/</id>
      <title type="text">Markdown PlantUML 图表</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/markdown-plantuml/"/>
      <summary type="text">用于验证 Firefly 中 PlantUML 插件渲染、主题切换与交互能力的示例文章。</summary>
      <content type="html"><![CDATA[<section><h2>Markdown 中 PlantUML 图表指南<a href="#markdown-中-plantuml-图表指南"><span>#</span></a></h2><p>PlantUML 是一种使用纯文本描述图表的工具。你只需要写一段结构化语法，就可以生成时序图、类图、用例图、活动图等常见工程图。</p><p>它特别适合写在技术博客和项目文档里：</p><ul>
<li>图表和正文一起版本管理，便于协作与审阅</li>
<li>修改图只需要改文本，适合频繁迭代</li>
<li>能和 Markdown 无缝结合，保持文档统一</li>
</ul><p>在 Firefly 中，<code>plantuml</code> 代码块会在构建阶段编码并生成服务器 SVG 地址，页面端再根据亮暗主题自动切换图源，并支持缩放、拖拽和全屏交互。</p><p>如果你想快速上手，可以记住这个最小模板：</p><div><div><img alt="@startuml
Alice -&gt; Bob: Hello
Bob --&gt; Alice: Hi
@enduml" src="https://www.plantuml.com/plantuml/svg/SoWkIImgAStDuULopCbCJbNGjLDmoa-oKl18pSd9v-LooazIqDMrKm1BMYbuPF9oEQJcfPJcvW00" loading="lazy" /></div></div></section>
<section><h2>活动图示例<a href="#活动图示例"><span>#</span></a></h2><div><div><img alt="@startuml
start
:用户提交订单;
if (库存充足?) then (是)
	:冻结库存;
	:创建支付单;
	if (支付成功?) then (是)
		:生成发货单;
		:通知仓库拣货;
	else (否)
		:取消订单;
		:释放库存;
	endif
else (否)
	:提示缺货;
endif
stop
@enduml" src="https://www.plantuml.com/plantuml/svg/NOvDYi9048NNQUWxP1clq2xqAe8j2aaK4_Tk78CYoM2Ke8k0F-Dir8N1WOvucbHrlCMGjCoWk-BL-pvUtN4RVNTWcPIK5oLCXj_e_Q0VP6ANdpOmMrGfwRHq0yGSZX6CHldrKgleRflRke7HkKA9nk0ZbUbSLQfbuAqX5HYUipHI3gsGg02z02RnkqHZCeoBb_-P9uSdfB77S2NZVLRQSRhDaqEHSzFXkW71boB1N-BL-zjROEC9XlV_HTnkTbgKl70C_K3kXBm9PNrs7BVRewJExUR0Cdy1" loading="lazy" /></div></div></section>
<section><h2>状态图示例<a href="#状态图示例"><span>#</span></a></h2><div><div><img alt="@startuml
[*] --&gt; 草稿

草稿 --&gt; 待审核 : 提交
待审核 --&gt; 草稿 : 驳回
待审核 --&gt; 已发布 : 审核通过
已发布 --&gt; 已归档 : 到期归档
已发布 --&gt; 草稿 : 撤回修改

state 已发布 {
	[*] --&gt; 可见
	可见 --&gt; 隐藏 : 手动隐藏
	隐藏 --&gt; 可见 : 恢复展示
}

已归档 --&gt; [*]" src="https://www.plantuml.com/plantuml/svg/NOyx2i9048Rh3CmTjXQyG0h9FSH2q4ujD5OYA2A-aAWeWehFWDhuB7o0vZBE9hc5hAkksCryyyt-iqR6ZARDR3A140v4M30OObwpvguS10HPlI3ToxIPyUcPwOnRhSVLHb1ChJ6T-UiZ3SV_OpeTo6hJkSHq9h5V67XE1K5DFjwjmsSBuLLtV3IHxR_tZUCTcuRZXxFXtOiuEcD6pVXFN0v1-toDhAstB29eidWnVz3o-fPugDQW-ags2DgRgpMX5ETaDsdVS-qhGbx4gNk56Gv448nuAfPD9fu0" loading="lazy" /></div></div></section>
<section><h2>用例图示例<a href="#用例图示例"><span>#</span></a></h2><div><div><img alt="@startuml
left to right direction
actor 游客
actor 用户
actor 管理员

rectangle 博客系统 {
	usecase &quot;浏览文章&quot; as UC1
	usecase &quot;搜索内容&quot; as UC2
	usecase &quot;发表评论&quot; as UC3
	usecase &quot;点赞收藏&quot; as UC4
	usecase &quot;审核评论&quot; a" src="https://www.plantuml.com/plantuml/svg/PP3BIiD058RN3fntE7JVXRqjfU0p-013EjP0ca0oMKatNcetaXQAYeWssLWGneLMq_Pvvl8OKX9h9ow_y_4Vplcx4QSXZmSU48-TSkG1Xcx_Z6FF3Pd3tS07GXqUXAZoN8hib_HieSRVEnAfdepaz048a6sE-dsFeRnzb2BJ7nkzUS5p80Tnn1mQCQofPM9Un-hkHh_DQqWZF3a-jFpaINzcSdGjnQhqZNqlawb95-RzoeXrwPlxNb-ipF9PpRxCVLBwbfKNgPhdLhvTsI_pI-k-3f3XzhsY1wpNZugZBMu0APhvynPNVRF2BI2xBijH-_-e0wJB_5uyy7u0" loading="lazy" /></div></div></section>
<section><h2>组件图示例<a href="#组件图示例"><span>#</span></a></h2><div><div><img alt="@startuml
package &quot;Firefly Site&quot; {
	[Astro App] as App
	[Markdown Parser] as Parser
	[PlantUML Encoder] as Encoder
	[Theme Switcher] as Theme
	[Search Indexer] as Search
}

cloud &quot;PlantUML Se" src="https://www.plantuml.com/plantuml/svg/LP51ImCn48NF1l8V7diltlSWBQ8WM2YiUn8FQJ9sbyqcCPbj5V6_IzBKuYd3VCEyzoRhn2hoCbifWjAJEX2Qnp7Ik_r2Dp8r-9RYvdMJE7fiGdY3IldDpQsAa_4dXvsAYM91vpBJdLME--qp7fpsfk9QP_uoq4peJYFheTBIogmZ5VM09sVeix9pIueVAQJGrYy6pPz4H_58iIa6UYcCOhLNYT3SUyVa61txI8NNJjwo2G6hrLtrZ1OX5vXhB2ago3FLE5fGgH2ozZ9RxAtNKvBYCb4szcWHwMEXn4Z7mrNhdBf5AhbXL9nkxNWO62dgwrWzG8lzCbg3aFzbpDVuP-gIBcifW-0J9odMvCmosry0" loading="lazy" /></div></div></section>
<section><h2>部署图示例<a href="#部署图示例"><span>#</span></a></h2><div><div><img alt="@startuml
node &quot;User Device&quot; {
	artifact &quot;Browser&quot;
}

node &quot;CDN / Edge&quot; {
	artifact &quot;Static Assets&quot;
}

node &quot;Cloudflare Worker&quot; {
	artifact &quot;SSR Handler&quot;
}

node &quot;PlantUML Service&quot; {
	ar" src="https://www.plantuml.com/plantuml/svg/ROz1Jy9044RFDkb_-D8xwRq7WmA1WwYXekUXEws5xIxEJE5W_Eyc92XIp_lUxFV6QYJMTpvDGdICRAqicFAXhJZ3PvhSa5XRKsN8xYKUbILBawyqEVEJwIDop5mpm4iZQolSgRBfbUHZxsfFmdYBicCPkEKA2mhENt_tx2dOUlc0akM_ZUNh72iEZkNNT6Iq8MLaJvijLuRIej1my99av-8nO1A3SR2p_nEEqUZskWi5vhCNR3MlLFEsQuRyHGiA27_qh8OzDPmcVrzF_636IIA7VLGRNhyCHe6QhNg7QwaHwg279at675pV-My0" loading="lazy" /></div></div></section>
<section><h2>ER 图示例<a href="#er-图示例"><span>#</span></a></h2><div><div><img alt="@startuml
entity User {
	*id : uuid &lt;&lt;PK&gt;&gt;
	--
	username : varchar
	email : varchar
	created_at : datetime
}

entity Post {
	*id : uuid &lt;&lt;PK&gt;&gt;
	--
	author_id : uuid &lt;&lt;FK&gt;&gt;
	title : varcha" src="https://www.plantuml.com/plantuml/svg/VP3BQWCn34NN5kWVj2xC3vWG0eLkkiccww2C1MFm8zXo7YJzzp8PscHecAskf7iucwfSjCM084czNkYhIg4hWddpZYorvXsjLjlFzHh1T1s2QLLAuYXawSYb7xWW68dimspI5s4LjsCbIuvLr4T1-4RuwzhcgijTt7J8PVSSVqonUWrpX3udbJIsgPmLmHpQFlWwB3EyvnZ7gqMCGwxw2c9KyMg-p-xou5WoSTTzktLTlauwB9sALwdpw9VIqlIi8jot_yK3LuID9DTY-040" loading="lazy" /></div></div></section>
<section><h2>时序图示例（登录与刷新令牌）<a href="#时序图示例登录与刷新令牌"><span>#</span></a></h2><div><div><img alt="@startuml
autonumber
actor User as 用户
participant Web as 前端页面
participant API as 网关接口
participant Auth as 认证服务
database Redis as 会话缓存

用户 -&gt; 前端页面 : 输入账号密码并提交
前端页面 -&gt; 网关接口 : POST /login
网关接口 " src="https://www.plantuml.com/plantuml/svg/bP2xJW9168NxIUOT_jwm4iij29PM4Y-nDCCo2X4MiZlx01HS0u91YHWC5y4O3PV42r50NuQPNTx2hDWC90RhSyxCztz-an63MR4eHiHYSTsA1Qc14T5Ot813anf0JB0l7qHsX56262oYHH94Pt14Wsx4SqNxQJ1llSvlst9XEx3pivrUyDIpEE_oqjrImM9Xj-7qEyuWAUf5dczX52AC18b9OO-68gQRpoOtpk3MdbHuxneZZ1OquF59duCApcU5fxhEopqlZVWWRJUJ_FrDbCgpZmv6KjVZaxX0XS3k_W5iHkEd4HqZAVFu949GGJHRyyS2p_H4iO-H57fy4YwemDCrdkg2GKyCQeQFMVoCwikZLHoYQTGq5stOM5xBVAiYjhnUi6jZFhqIsJBFDrnhYgB8hpfV6L5lWA8eRhoMdb-CDGNzVVEAA6VQ5yNsVqM9wb0wQpqveZgSZJjshe2Hd-eXAnRz1W00" loading="lazy" /></div></div></section>
<section><h2>C4 风格容器图示例<a href="#c4-风格容器图示例"><span>#</span></a></h2><div><div><img alt="@startuml
!includeurl https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(user, &quot;博客访客&quot;, &quot;阅读文章与搜索内容&quot;)

System_Boundary(system, &quot;Firefly Blog&quot;) {
	Contai" src="https://www.plantuml.com/plantuml/svg/PP7BRjD058RNHCex35uv8eqtNR5g6dgJKZMAKofMaHrFBjIne_6uQOIGK6aAGaeRGIaLBGenHQfKONDfHKYbzcKoO-Sjq7X2I60tSox_EUVxvooi86nNzMZaRiKewBO6RQI3CiOrwxua8QMUA5LmsLPj2wA2QM1eu4J1h4erNJ5Otuo5DRsYIgdPcGmBhQ-cfQfYOOYar6m-PHfOgHWG9MhXZ6Wa0v5b6YAJYmE1jDuJrmdSM-8wGXm8m-Dcu5tJenV-nST1Rv-sJ_rBX-mrYVjBYB5skM5XMCtFcxQXAQWXMk4_3eJ52e95lG7cTRCanC2JQEJEUBXOXseS21jG1SbQZSr9MXYPu1wGjw2E8OlGtdVQUJFiNWq_E8FU_g1_DkY_PZCdPKoq6Qujorcm4NvOQqetRQseAmYEWXQBahDTlxr7JrlaLTU_yBX-uFsattQcPH-euWWiq-8l86CJXNkjAcXJC-i6aC2Q-XWMU4efXKdovPZid8zn1LUxjDycpUVqxLVQSl_Pte8AAfJPzk43h1WQt6Og6QK4YnL32p4Sj0St9wJ9HEcdP_wbmrIUJg1VsCRY7_DPyyXq84EqnNduXntwiWtaXqk0dDm4tNDkNHRg8zkv7O5xEtpdieRbN2uZio9M4YR7f3amm81pR_wl7vN-PHXur-JWY5EPKXqJe9tFWUUGve_XeHjuhQcYYTluS7u3EuVVaKu-MblFvTCBYxbyTcLfEIV6ef4vQ6XsLVyD" loading="lazy" /></div></div></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/markdown-tutorial/</id>
      <title type="text">Markdown 教程</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>emn178</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/markdown-tutorial/"/>
      <summary type="text">一个简明的 Markdown 博客示例。</summary>
      <content type="html"><![CDATA[<p>这是一个展示如何编写 Markdown 文件的示例。本文档汇总了核心语法与常见扩展（GFM）。</p>
<ul>
<li><a href="#block-elements">块级元素</a>
<ul>
<li><a href="#paragraphs-and-line-breaks">段落与换行</a></li>
<li><a href="#headers">标题</a></li>
<li><a href="#blockquotes">引用</a></li>
<li><a href="#lists">列表</a></li>
<li><a href="#code-blocks">代码块</a></li>
<li><a href="#horizontal-rules">分割线</a></li>
<li><a href="#table">表格</a></li>
</ul>
</li>
<li><a href="#span-elements">内联元素</a>
<ul>
<li><a href="#links">链接</a></li>
<li><a href="#emphasis">强调</a></li>
<li><a href="#code">行内代码</a></li>
<li><a href="#images">图片</a></li>
<li><a href="#strikethrough">删除线</a></li>
</ul>
</li>
<li><a href="#miscellaneous">杂项</a>
<ul>
<li><a href="#automatic-links">自动链接</a></li>
<li><a href="#backslash-escapes">反斜杠转义</a></li>
</ul>
</li>
<li><a href="#inline-html">内联 HTML</a></li>
</ul>
<p><a></a></p>
<section><h2>块级元素<a href="#块级元素"><span>#</span></a></h2><p><a></a></p><section><h3>段落与换行<a href="#段落与换行"><span>#</span></a></h3><section><h4>段落<a href="#段落"><span>#</span></a></h4><p>HTML 标签：<code>&lt;p&gt;</code></p><p>使用一个或多个空行分隔段落。（仅包含<strong>空格</strong>或<strong>制表符</strong>的行也视为空行。）</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This will be</span></div></div><div><div><div>2</div></div><div><span>inline.</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>This is second paragraph.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>This will be
inline.</p><p>This is second paragraph.</p><hr /></section><section><h4>换行<a href="#换行"><span>#</span></a></h4><p>HTML 标签：<code>&lt;br /&gt;</code></p><p>在行末添加<strong>两个或更多空格</strong>来产生换行。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This will be not</span></div></div><div><div><div>2</div></div><div><span>inline.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>This will be not<br />
inline.</p><hr /><p><a></a></p></section></section><section><h3>标题<a href="#标题"><span>#</span></a></h3><p>Markdown 支持两种标题样式：Setext 与 atx。</p><section><h4>Setext<a href="#setext"><span>#</span></a></h4><p>HTML 标签：<code>&lt;h1&gt;</code>，<code>&lt;h2&gt;</code></p><p>使用<strong>等号 (=)</strong> 表示 <code>&lt;h1&gt;</code>、使用<strong>短横线 (-)</strong> 表示 <code>&lt;h2&gt;</code>，数量不限，作为“下划线”。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This is an H1</span></div></div><div><div><div>2</div></div><div><span>=============</span></div></div><div><div><div>3</div></div><div><span>This is an H2</span></div></div><div><div><div>4</div></div><div><span>-------------</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /></section></section></section>
<section><h1>This is an H1<a href="#this-is-an-h1"><span>#</span></a></h1><section><h2>This is an H2<a href="#this-is-an-h2"><span>#</span></a></h2><hr /><section><h4>atx<a href="#atx"><span>#</span></a></h4><p>HTML 标签：<code>&lt;h1&gt;</code>，<code>&lt;h2&gt;</code>，<code>&lt;h3&gt;</code>，<code>&lt;h4&gt;</code>，<code>&lt;h5&gt;</code>，<code>&lt;h6&gt;</code></p><p>在行首使用 1-6 个<strong>井号 (#)</strong>，对应 <code>&lt;h1&gt;</code> 至 <code>&lt;h6&gt;</code>。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># This is an H1</span></div></div><div><div><div>2</div></div><div><span>## This is an H2</span></div></div><div><div><div>3</div></div><div><span>###### This is an H6</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /></section></section></section>
<section><h1>This is an H1<a href="#this-is-an-h1-1"><span>#</span></a></h1><section><h2>This is an H2<a href="#this-is-an-h2-1"><span>#</span></a></h2><section><h6>This is an H6<a href="#this-is-an-h6"><span>#</span></a></h6><hr /><p>可选：你可以在行尾“闭合” atx 标题。末尾的井号数量<strong>不必与</strong>开头一致。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span># This is an H1 #</span></div></div><div><div><div>2</div></div><div><span>## This is an H2 ##</span></div></div><div><div><div>3</div></div><div><span>### This is an H3 ######</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /></section></section></section>
<section><h1>This is an H1<a href="#this-is-an-h1-2"><span>#</span></a></h1><section><h2>This is an H2<a href="#this-is-an-h2-2"><span>#</span></a></h2><section><h3>This is an H3<a href="#this-is-an-h3"><span>#</span></a></h3><hr /><p><a></a></p></section><section><h3>引用<a href="#引用"><span>#</span></a></h3><p>HTML 标签：<code>&lt;blockquote&gt;</code></p><p>Markdown 使用邮件风格的 <strong>&gt;</strong> 作为引用符号。若手动换行并在每行前加 &gt;，显示效果最佳。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,</span></div></div><div><div><div>2</div></div><div><span>&gt; consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.</span></div></div><div><div><div>3</div></div><div><span>&gt; Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</span></div></div><div><div><div>4</div></div><div><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse</span></div></div><div><div><div>6</div></div><div><span>&gt; id sem consectetuer libero luctus adipiscing.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><blockquote><p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p><p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.</p></blockquote><hr /><p>Markdown 允许“偷懒”：在一个硬换行段落中，只在第一行前加 &gt; 即可。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,</span></div></div><div><div><div>2</div></div><div><span>consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.</span></div></div><div><div><div>3</div></div><div><span>Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse</span></div></div><div><div><div>6</div></div><div><span>id sem consectetuer libero luctus adipiscing.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><blockquote><p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p></blockquote><blockquote><p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.</p></blockquote><hr /><p>引用可以嵌套（引用中的引用），通过增加 &gt; 层级实现。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; This is the first level of quoting.</span></div></div><div><div><div>2</div></div><div><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&gt; &gt; This is nested blockquote.</span></div></div><div><div><div>4</div></div><div><span>&gt;</span></div></div><div><div><div>5</div></div><div><span>&gt; Back to the first level.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><blockquote><p>This is the first level of quoting.</p><blockquote><p>This is nested blockquote.</p></blockquote><p>Back to the first level.</p></blockquote><hr /><p>引用内可包含其他 Markdown 元素，包括标题、列表与代码块。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&gt; ## This is a header.</span></div></div><div><div><div>2</div></div><div><span>&gt;</span></div></div><div><div><div>3</div></div><div><span>&gt; 1.   This is the first list item.</span></div></div><div><div><div>4</div></div><div><span>&gt; 2.   This is the second list item.</span></div></div><div><div><div>5</div></div><div><span>&gt;</span></div></div><div><div><div>6</div></div><div><span>&gt; Here's some example code:</span></div></div><div><div><div>7</div></div><div><span>&gt;</span></div></div><div><div><div>8</div></div><div><span>&gt;     return shell_exec("echo $input | $markdown_script");</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><blockquote><h2>This is a header.<a href="#this-is-a-header"><span>#</span></a></h2><ol>
<li>This is the first list item.</li>
<li>This is the second list item.</li>
</ol><p>Here’s some example code:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>return shell_exec("echo $input | $markdown_script");</span></div></div></code></pre><div><div></div><div></div></div></figure></div></blockquote><hr /><p><a></a></p></section><section><h3>列表<a href="#列表"><span>#</span></a></h3><p>Markdown 支持有序（数字）与无序（圆点）列表。</p><section><h4>无序列表<a href="#无序列表"><span>#</span></a></h4><p>HTML 标签：<code>&lt;ul&gt;</code></p><p>无序列表可使用 <strong>星号 (*)</strong>、<strong>加号 (+)</strong> 或 <strong>短横线 (-)</strong>。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*   Red</span></div></div><div><div><div>2</div></div><div><span>*   Green</span></div></div><div><div><div>3</div></div><div><span>*   Blue</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><ul>
<li>Red</li>
<li>Green</li>
<li>Blue</li>
</ul><hr /><p>等价于：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>+   Red</span></div></div><div><div><div>2</div></div><div><span>+   Green</span></div></div><div><div><div>3</div></div><div><span>+   Blue</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>或者：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>-   Red</span></div></div><div><div><div>2</div></div><div><span>-   Green</span></div></div><div><div><div>3</div></div><div><span>-   Blue</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h4>有序列表<a href="#有序列表"><span>#</span></a></h4><p>HTML 标签：<code>&lt;ol&gt;</code></p><p>有序列表使用数字加英文句点：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>1.  Bird</span></div></div><div><div><div>2</div></div><div><span>2.  McHale</span></div></div><div><div><div>3</div></div><div><span>3.  Parish</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><ol>
<li>Bird</li>
<li>McHale</li>
<li>Parish</li>
</ol><hr /><p>注意：像下面这样可能会“意外触发”有序列表：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>1986. What a great season.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><ol>
<li>What a great season.</li>
</ol><hr /><p>你可以用<strong>反斜杠转义 (\)</strong> 句点：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>1986\. What a great season.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>1986. What a great season.</p><hr /></section><section><h4>列表中的缩进内容<a href="#列表中的缩进内容"><span>#</span></a></h4><section><h5>列表项里的引用<a href="#列表项里的引用"><span>#</span></a></h5><p>在列表项内放置引用，需要将 &gt; 符号整体缩进：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*   A list item with a blockquote:</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&gt; This is a blockquote</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&gt; inside a list item.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><ul>
<li>
<p>A list item with a blockquote:</p>
<blockquote><p>This is a blockquote
inside a list item.</p></blockquote>
</li>
</ul><hr /></section><section><h5>列表项里的代码块<a href="#列表项里的代码块"><span>#</span></a></h5><p>在列表项内放置代码块，需要缩进两层——<strong>8 个空格</strong>或<strong>两个 Tab</strong>：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*   A list item with a code block:</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>        </span></span><span>&lt;code goes here&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><ul>
<li>
<p>A list item with a code block:</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;code goes here&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ul><hr /></section><section><h5>嵌套列表<a href="#嵌套列表"><span>#</span></a></h5><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>* A</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>* A1</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>* A2</span></div></div><div><div><div>4</div></div><div><span>* B</span></div></div><div><div><div>5</div></div><div><span>* C</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><ul>
<li>A
<ul>
<li>A1</li>
<li>A2</li>
</ul>
</li>
<li>B</li>
<li>C</li>
</ul><hr /><p><a></a></p></section></section></section><section><h3>代码块<a href="#代码块"><span>#</span></a></h3><p>HTML 标签：<code>&lt;pre&gt;</code></p><p>将代码块中的每行缩进至少<strong>4 个空格</strong>或<strong>1 个制表符</strong>。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This is a normal paragraph:</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>This is a code block.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>This is a normal paragraph:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This is a code block.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>代码块会一直持续，直到遇到未缩进的行（或文末）。</p><p>在代码块内，<strong>与号 (&amp;)</strong> 和尖括号 <strong>(&lt; &gt;)</strong> 会自动转为 HTML 实体。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>    </span></span><span>&lt;div class="footer"&gt;</span></div></div><div><div><div>2</div></div><div><span><span>        </span></span><span>&amp;copy; 2004 Foo Corporation</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>&lt;/div&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;div class="footer"&gt;</span></div></div><div><div><div>2</div></div><div><span><span>    </span></span><span>&amp;copy; 2004 Foo Corporation</span></div></div><div><div><div>3</div></div><div><span>&lt;/div&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p>下文的“围栏代码块”和“语法高亮”属于扩展语法，你也可以用它们来书写代码块。</p><section><h4>围栏代码块<a href="#围栏代码块"><span>#</span></a></h4><p>使用成对的反引号围起来（如下所示），就不需要四空格缩进了。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Here's an example:</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>```</span></div></div><div><div><div>4</div></div><div><span>function test() {</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>console.log("notice the blank line before this function?");</span></div></div><div><div><div>6</div></div><div><span>}</span></div></div><div><div><div>7</div></div><div><span>```</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>Here’s an example:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>function test() {</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>console.log("notice the blank line before this function?");</span></div></div><div><div><div>3</div></div><div><span>}</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /></section><section><h4>语法高亮<a href="#语法高亮"><span>#</span></a></h4><p>在围栏代码块后添加可选的语言标识，即可启用语法高亮（参见支持语言列表）。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>```ruby</span></div></div><div><div><div>2</div></div><div><span>require 'redcarpet'</span></div></div><div><div><div>3</div></div><div><span>markdown = Redcarpet.new("Hello World!")</span></div></div><div><div><div>4</div></div><div><span>puts markdown.to_html</span></div></div><div><div><div>5</div></div><div><span>```</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>require </span><span>'redcarpet'</span></div></div><div><div><div>2</div></div><div><span>markdown</span><span><span> </span><span>=</span><span> </span></span><span>Redcarpet</span><span>.</span><span>new</span><span>(</span><span>"Hello World!"</span><span>)</span></div></div><div><div><div>3</div></div><div><span>puts</span><span> markdown.</span><span>to_html</span></div></div></code></pre><div><div></div><div></div></div></figure></div><hr /><p><a></a></p></section></section><section><h3>分割线（水平线）<a href="#分割线水平线"><span>#</span></a></h3><p>HTML 标签：<code>&lt;hr /&gt;</code>
一行中放置<strong>三个或以上的短横线 (-)、星号 (*) 或下划线 (_)</strong>。符号之间允许有空格。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>* * *</span></div></div><div><div><div>2</div></div><div><span>***</span></div></div><div><div><div>3</div></div><div><span>*****</span></div></div><div><div><div>4</div></div><div><span>- - -</span></div></div><div><div><div>5</div></div><div><span>---------------------------------------</span></div></div><div><div><div>6</div></div><div><span>___</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><hr /><hr /><hr /><hr /><hr /><hr /><hr /><p><a></a></p></section><section><h3>表格<a href="#表格"><span>#</span></a></h3><p>HTML 标签：<code>&lt;table&gt;</code></p><p>这是扩展语法。</p><p>用<strong>竖线 (|)</strong> 分隔列，用<strong>短横线 (-)</strong> 分隔表头，使用<strong>冒号 (:)</strong> 指定对齐方式。</p><p>两侧的<strong>竖线 (|)</strong> 与对齐可选。用于表头分隔时，每列至少需要 <strong>3 个短横线</strong>。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>| Left | Center | Right |</span></div></div><div><div><div>2</div></div><div><span>|:-----|:------:|------:|</span></div></div><div><div><div>3</div></div><div><span>|aaa   |bbb     |ccc    |</span></div></div><div><div><div>4</div></div><div><span>|ddd   |eee     |fff    |</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span><span> </span></span><span>A | B</span></div></div><div><div><div>7</div></div><div><span>---|---</span></div></div><div><div><div>8</div></div><div><span>123|456</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div>
</div></div><div><div><div>11</div></div><div><span>A |B</span></div></div><div><div><div>12</div></div><div><span>--|--</span></div></div><div><div><div>13</div></div><div><span>12|45</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr />

<table><thead><tr><th>Left</th><th>Center</th><th>Right</th></tr></thead><tbody><tr><td>aaa</td><td>bbb</td><td>ccc</td></tr><tr><td>ddd</td><td>eee</td><td>fff</td></tr></tbody></table>

<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>123</td><td>456</td></tr></tbody></table>

<table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>12</td><td>45</td></tr></tbody></table><hr /><p><a></a></p></section></section><section><h2>内联元素<a href="#内联元素"><span>#</span></a></h2><p><a></a></p><section><h3>链接<a href="#链接"><span>#</span></a></h3><p>HTML 标签：<code>&lt;a&gt;</code></p><p>Markdown 支持两种链接样式：行内链接与引用式链接。</p><section><h4>行内链接<a href="#行内链接"><span>#</span></a></h4><p>行内链接格式：<code>[文本](URL "标题")</code></p><p>标题可选。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This is [an example](http://example.com/ "Title") inline link.</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>[This link](http://example.net/) has no title attribute.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>This is <a href="http://example.com/" target="_blank">an example</a> inline link.</p><p><a href="http://example.net/" target="_blank">This link</a> has no title attribute.</p><hr /><p>如果引用同一站点的本地资源，可以使用相对路径：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>See my [About](/about/) page for details.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>See my <a href="/about/">About</a> page for details.</p><hr /></section><section><h4>引用式链接<a href="#引用式链接"><span>#</span></a></h4><p>可以预定义链接引用。定义格式：<code>[id]: URL "标题"</code></p><p>标题同样可选。引用时使用：<code>[文本][id]</code></p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[id]: http://example.com/  "Optional Title Here"</span></div></div><div><div><div>2</div></div><div><span>This is [an example][id] reference-style link.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>This is <a href="http://example.com/" target="_blank">an example</a> reference-style link.</p><hr /><p>说明：</p><ul>
<li>方括号中包含链接标识（<strong>不区分大小写</strong>，可在左侧缩进最多三格空格）；</li>
<li>随后是冒号；</li>
<li>再跟一个或多个空格（或 tab）；</li>
<li>然后是链接 URL；</li>
<li>URL 可选地用尖括号包裹；</li>
<li>可选地跟随标题属性，用引号或圆括号包裹。</li>
</ul><p>以下三种定义等价：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[foo]: http://example.com/  "Optional Title Here"</span></div></div><div><div><div>2</div></div><div><span>[foo]: http://example.com/  'Optional Title Here'</span></div></div><div><div><div>3</div></div><div><span>[foo]: http://example.com/  (Optional Title Here)</span></div></div><div><div><div>4</div></div><div><span>[foo]: &lt;http://example.com/&gt;  "Optional Title Here"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>如果使用空的方括号，则链接文本本身会作为名称。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[Google]: http://google.com/</span></div></div><div><div><div>2</div></div><div><span>[Google][]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p><a href="http://google.com/" target="_blank">Google</a></p><hr /><p><a></a></p></section></section><section><h3>强调<a href="#强调"><span>#</span></a></h3><p>HTML 标签：<code>&lt;em&gt;</code>，<code>&lt;strong&gt;</code></p><p>Markdown 使用 <strong>星号 (*)</strong> 或 <strong>下划线 (_)</strong> 表示强调。<strong>一个分隔符</strong>对应 <code>&lt;em&gt;</code>；<strong>两个分隔符</strong>对应 <code>&lt;strong&gt;</code>。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>*single asterisks*</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>_single underscores_</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>**double asterisks**</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>__double underscores__</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p><em>single asterisks</em></p><p><em>single underscores</em></p><p><strong>double asterisks</strong></p><p><strong>double underscores</strong></p><hr /><p>但如果两侧有空格，则会被视作普通字符而非强调语法。</p><p>你可以使用反斜杠进行转义：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>\*this text is surrounded by literal asterisks\*</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>*this text is surrounded by literal asterisks*</p><hr /><p><a></a></p></section><section><h3>行内代码<a href="#行内代码"><span>#</span></a></h3><p>HTML 标签：<code>&lt;code&gt;</code></p><p>用<strong>反引号 (`)</strong> 包裹。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Use the `printf()` function.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>Use the <code>printf()</code> function.</p><hr /><p>若行内代码中需要包含反引号字符，可使用<strong>多重反引号</strong>作为定界符：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>``There is a literal backtick (`) here.``</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p><code>There is a literal backtick (`) here.</code></p><hr /><p>行内代码两侧的定界符允许包含空格（开头一个、结尾一个），方便在代码起始或结尾放置反引号字符：</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>A single backtick in a code span: `` ` ``</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>A backtick-delimited string in a code span: `` `foo` ``</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>A single backtick in a code span: <code>`</code></p><p>A backtick-delimited string in a code span: <code>`foo`</code></p><hr /><p><a></a></p></section><section><h3>图片<a href="#图片"><span>#</span></a></h3><p>HTML 标签：<code>&lt;img /&gt;</code></p><p>Markdown 的图片语法与链接类似，支持行内与引用两种方式。</p><section><h4>行内图片<a href="#行内图片"><span>#</span></a></h4><p>行内图片语法：<code>![替代文本](URL "标题")</code></p><p>标题可选。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>![Alt text](/path/to/img.jpg)</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>![Alt text](/path/to/img.jpg "Optional title")</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p></p><figure><img src="https://s2.loli.net/2024/08/20/5fszgXeOxmL3Wdv.webp" alt="Alt text" /><figcaption>Alt text</figcaption></figure><p></p><p></p><figure><img src="https://s2.loli.net/2024/08/20/5fszgXeOxmL3Wdv.webp" alt="Alt text" title="Optional title" /><figcaption>Alt text</figcaption></figure><p></p><hr /><p>说明：</p><ul>
<li>一个感叹号 !；</li>
<li>后接方括号，放置图片的替代文本；</li>
<li>再接圆括号，内含图片 URL/路径，及可选的标题（引号包裹）。</li>
</ul></section><section><h4>引用式图片<a href="#引用式图片"><span>#</span></a></h4><p>引用式图片语法：<code>![替代文本][id]</code></p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>[img id]: https://s2.loli.net/2024/08/20/5fszgXeOxmL3Wdv.webp  "Optional title attribute"</span></div></div><div><div><div>2</div></div><div><span>![Alt text][img id]</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p></p><figure><img src="https://s2.loli.net/2024/08/20/5fszgXeOxmL3Wdv.webp" alt="Alt text" title="Optional title attribute" /><figcaption>Alt text</figcaption></figure><p></p><hr /><p><a></a></p></section></section><section><h3>删除线<a href="#删除线"><span>#</span></a></h3><p>HTML 标签：<code>&lt;del&gt;</code></p><p>这是扩展语法。</p><p>GFM 增加了删除线语法。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>~~Mistaken text.~~</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>Mistaken text.</p><hr /><p><a></a></p></section></section><section><h2>杂项<a href="#杂项"><span>#</span></a></h2><p><a></a></p><section><h3>自动链接<a href="#自动链接"><span>#</span></a></h3><p>Markdown 支持一种便捷写法来创建“自动链接”（URL 与邮箱地址）：只需用尖括号将其包住即可。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;http://example.com/&gt;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>&lt;address@example.com&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p><a href="http://example.com/" target="_blank">http://example.com/</a></p><p><a href="#">address@example.com</a></p><hr /><p>GFM 会自动识别标准 URL 并转换为链接。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>https://github.com/emn178/markdown</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p><a href="https://github.com/emn178/markdown" target="_blank">https://github.com/emn178/markdown</a></p><hr /><p><a></a></p></section><section><h3>反斜杠转义<a href="#反斜杠转义"><span>#</span></a></h3><p>Markdown 允许使用反斜杠来转义那些本用于 Markdown 语法的特殊字符，使其按字面显示。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>\*literal asterisks\*</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>*literal asterisks*</p><hr /><p>以下字符可通过反斜杠转义以按字面量输出：</p><p>Code:</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>\   backslash</span></div></div><div><div><div>2</div></div><div><span>`   backtick</span></div></div><div><div><div>3</div></div><div><span>*   asterisk</span></div></div><div><div><div>4</div></div><div><span>_   underscore</span></div></div><div><div><div>5</div></div><div><span>{}  curly braces</span></div></div><div><div><div>6</div></div><div><span>[]  square brackets</span></div></div><div><div><div>7</div></div><div><span>()  parentheses</span></div></div><div><div><div>8</div></div><div><span>#   hash mark</span></div></div><div><div><div>9</div></div><div><span>+   plus sign</span></div></div><div><div><div>10</div></div><div><span>-   minus sign (hyphen)</span></div></div><div><div><div>11</div></div><div><span>.   dot</span></div></div><div><div><div>12</div></div><div><span>!   exclamation mark</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p><a></a></p></section></section><section><h2>内联 HTML<a href="#内联-html"><span>#</span></a></h2><p>对于 Markdown 语法未覆盖的标记，直接使用原生 HTML 即可。无需特别声明从 Markdown 切换到 HTML，直接写标签就行。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>This is a regular paragraph.</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>&lt;table&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>&lt;tr&gt;</span></div></div><div><div><div>5</div></div><div><span><span>        </span></span><span>&lt;td&gt;Foo&lt;/td&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>&lt;/tr&gt;</span></div></div><div><div><div>7</div></div><div><span>&lt;/table&gt;</span></div></div><div><div><div>8</div></div><div>
</div></div><div><div><div>9</div></div><div><span>This is another regular paragraph.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p>This is a regular paragraph.</p><table>
    <tbody><tr>
        <td>Foo</td>
    </tr>
</tbody></table><p>This is another regular paragraph.</p><hr /><p>请注意：在<strong>块级 HTML 标签</strong>内不会处理 Markdown 语法。</p><p>与块级标签不同，在<strong>行内级标签</strong>内会处理 Markdown 语法。</p><p>代码：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;span&gt;**Work**&lt;/span&gt;</span></div></div><div><div><div>2</div></div><div>
</div></div><div><div><div>3</div></div><div><span>&lt;div&gt;</span></div></div><div><div><div>4</div></div><div><span><span>    </span></span><span>**No Work**</span></div></div><div><div><div>5</div></div><div><span>&lt;/div&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>预览：</p><hr /><p><span><strong>Work</strong></span></p><div>
  **No Work**
</div>
***</section></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/mdx-example/</id>
      <title type="text">MDX 格式博客指南</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/mdx-example/"/>
      <summary type="text">这是一个 MDX 格式的示例文章，展示了如何在 Markdown 中使用 JSX。</summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Tip</div></div><div><p><a href="https://github.com/CuteLeaf/Firefly" target="_blank">Firefly</a> 支持 <code>MDX</code> 和 <code>Markdown</code> 两种类型的文章，你可以在文章中混合使用两种格式，如果没有特别复杂内容和需求，推荐使用 Markdown 格式就够了。</p></div></div>
<section><h2>Markdown 和 MDX 的区别<a href="#markdown-和-mdx-的区别"><span>#</span></a></h2><ul>
<li>Markdown (MD) 是一种轻量级标记语言，允许用户使用纯文本格式编写文档，然后将其转换为格式化的HTML。它因其简洁易用的语法而广受欢迎，特别适合编写文档和博客文章。</li>
<li>MDX 是一种扩展了 Markdown 语法的格式，允许在 Markdown 文档中无缝地插入 JSX 代码。通过 MDX，用户可以在文档中嵌入 React 组件，从而实现更丰富的交互性和动态性。</li>
</ul>

<table><thead><tr><th>特性</th><th>Markdown</th><th>MDX</th></tr></thead><tbody><tr><td>基础语法</td><td>支持 (CommonMark)</td><td>支持 (CommonMark)</td></tr><tr><td>HTML 标签</td><td>支持</td><td>支持 (作为 JSX)</td></tr><tr><td>组件导入</td><td>不支持</td><td>支持 (import)</td></tr><tr><td>动态数据</td><td>不支持</td><td>支持 (JS 表达式)</td></tr><tr><td>样式定制</td><td>有限 (class/style)</td><td>灵活 (className/CSS-in-JS)</td></tr></tbody></table><hr /></section>
<section><h2>Firefly 内置的专属 MDX UI 组件<a href="#firefly-内置的专属-mdx-ui-组件"><span>#</span></a></h2><p>这里列出 Firefly 内置的 MDX UI 组件，方便在 MDX 文章中直接使用。</p><section><h3>Tab分组：<code>TabGroup</code><a href="#tab分组tabgroup"><span>#</span></a></h3><p>用于创建可切换的标签页，方便在文章中展示不同语言或不同版本的代码等等。</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>TabGroup</span><span> </span><span>labels</span><span>=</span><span>{</span><span>[</span><span>"test.js"</span><span>, </span><span>"test.py"</span><span>]</span><span>}</span><span> </span><span>client</span><span>:</span><span>load</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span>  </span><span>```</span><span>js</span></div></div><div><div><div>3</div></div><div><span><span>  </span></span><span>console</span><span>.</span><span>log</span><span>(</span><span>1</span><span>)</span></div></div><div><div><div>4</div></div><div><span>  </span><span>```</span></div></div><div><div><div>5</div></div><div>
</div></div><div><div><div>6</div></div><div><span>  </span><span>```</span><span>py</span></div></div><div><div><div>7</div></div><div><span>  </span><span>print</span><span>(</span><span>"hello world"</span><span>)</span></div></div><div><div><div>8</div></div><div><span>  </span><span>```</span></div></div><div><div><div>9</div></div><div><span>&lt;/</span><span>TabGroup</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><div>test.jstest.py</div> <div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>console</span><span>.</span></span><span>log</span><span>(</span><span>1</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>print</span><span>(</span><span>"hello world"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div><hr /></section><section><h3>时间线：<code>Timeline</code> / <code>TimelineItem</code><a href="#时间线timeline--timelineitem"><span>#</span></a></h3>

<table><thead><tr><th>属性</th><th>必填</th><th>说明</th></tr></thead><tbody><tr><td><code>date</code></td><td>否</td><td>时间标签，如 “2024-03-10”</td></tr><tr><td><code>title</code></td><td>否</td><td>条目标题</td></tr><tr><td><code>type</code></td><td>否</td><td>节点颜色，default 为主题色，其余对应提示框色板（tip / note / important / warning / caution）</td></tr><tr><td><code>icon</code></td><td>否</td><td>内置图标名，显示在圆点内：star / rocket / git / flag / book / heart / zap / bug / tag / calendar / code / edit</td></tr><tr><td>正文</td><td>否</td><td><code>&lt;TimelineItem&gt;</code> 标签内的内容，支持 Markdown</td></tr></tbody></table><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>Timeline</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>TimelineItem</span><span> </span><span>date</span><span>=</span><span>"2026-08-16"</span><span> </span><span>title</span><span>=</span><span>"新版本发布"</span><span> </span><span>icon</span><span>=</span><span>"rocket"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>发布了全新版本，带来以下更新：</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span><span>    </span></span><span>- 新增时间线组件</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>- 改进暗色主题</span></div></div><div><div><div>7</div></div><div>
</div></div><div><div><div>8</div></div><div><span><span>    </span></span><span>正文里支持 </span><span>**</span><span>Markdown</span><span>**</span><span> 内容。</span></div></div><div><div><div>9</div></div><div><span><span>  </span></span><span>&lt;/</span><span>TimelineItem</span><span>&gt;</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>&lt;</span><span>TimelineItem</span><span> </span><span>date</span><span>=</span><span>"2025-11-02"</span><span> </span><span>title</span><span>=</span><span>"站点上线"</span><span> </span><span>type</span><span>=</span><span>"tip"</span><span> </span><span>icon</span><span>=</span><span>"flag"</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span><span>    </span></span><span>欢迎来到我的博客。</span></div></div><div><div><div>12</div></div><div><span><span>  </span></span><span>&lt;/</span><span>TimelineItem</span><span>&gt;</span></div></div><div><div><div>13</div></div><div><span><span>  </span></span><span>&lt;</span><span>TimelineItem</span><span> </span><span>date</span><span>=</span><span>"2025-06-15"</span><span> </span><span>title</span><span>=</span><span>"项目立项"</span><span> </span><span>type</span><span>=</span><span>"note"</span><span>&gt;</span></div></div><div><div><div>14</div></div><div><span><span>    </span></span><span>开始规划 Firefly 主题。</span></div></div><div><div><div>15</div></div><div><span><span>  </span></span><span>&lt;/</span><span>TimelineItem</span><span>&gt;</span></div></div><div><div><div>16</div></div><div><span>&lt;/</span><span>Timeline</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><ol><li><div><span></span></div><div><div>2026-08-16</div><div>新版本发布</div><div><p>发布了全新版本，带来以下更新：</p><ul>
<li>新增时间线组件</li>
<li>改进暗色主题</li>
</ul><p>正文里支持 <strong>Markdown</strong> 内容。</p></div></div></li><li><div><span></span></div><div><div>2025-11-02</div><div>站点上线</div><div><p>欢迎来到我的博客。</p></div></div></li><li><div></div><div><div>2025-06-15</div><div>项目立项</div><div><p>开始规划 Firefly 主题。</p></div></div></li></ol><hr /></section><section><h3>步骤条：<code>Steps</code> / <code>StepItem</code><a href="#步骤条steps--stepitem"><span>#</span></a></h3><p>编号步骤条，适合教程、部署流程。编号自动生成，无需手动传序号。</p>

<table><thead><tr><th>属性</th><th>必填</th><th>说明</th></tr></thead><tbody><tr><td><code>title</code></td><td>否</td><td>步骤标题</td></tr><tr><td><code>type</code></td><td>否</td><td>编号圆颜色，default 为主题色，其余对应提示框色板（tip / note / important / warning / caution）</td></tr><tr><td><code>icon</code></td><td>否</td><td>内置图标名，有图标时显示图标而非数字（star / rocket / git / flag / book / heart / zap / bug / tag / calendar / code / edit）</td></tr><tr><td>正文</td><td>否</td><td><code>&lt;StepItem&gt;</code> 标签内的内容，支持 Markdown</td></tr></tbody></table><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>Steps</span><span>&gt;</span></div></div><div><div><div>2</div></div><div><span><span>  </span></span><span>&lt;</span><span>StepItem</span><span> </span><span>title</span><span>=</span><span>"安装依赖"</span><span>&gt;</span></div></div><div><div><div>3</div></div><div><span><span>    </span></span><span>运行 </span><span>`</span><span>pnpm install</span><span>`</span><span>。</span></div></div><div><div><div>4</div></div><div><span><span>  </span></span><span>&lt;/</span><span>StepItem</span><span>&gt;</span></div></div><div><div><div>5</div></div><div><span><span>  </span></span><span>&lt;</span><span>StepItem</span><span> </span><span>title</span><span>=</span><span>"启动开发服务器"</span><span> </span><span>type</span><span>=</span><span>"tip"</span><span> </span><span>icon</span><span>=</span><span>"rocket"</span><span>&gt;</span></div></div><div><div><div>6</div></div><div><span><span>    </span></span><span>运行 </span><span>`</span><span>pnpm dev</span><span>`</span><span>，打开 </span><span>`</span><span>localhost:4321</span><span>`</span><span>。</span></div></div><div><div><div>7</div></div><div><span><span>  </span></span><span>&lt;/</span><span>StepItem</span><span>&gt;</span></div></div><div><div><div>8</div></div><div><span><span>  </span></span><span>&lt;</span><span>StepItem</span><span> </span><span>title</span><span>=</span><span>"编写文章"</span><span>&gt;</span></div></div><div><div><div>9</div></div><div><span><span>    </span></span><span>在 </span><span>`</span><span>src/content/posts/</span><span>`</span><span> 新建 </span><span>`</span><span>.mdx</span><span>`</span><span> 文章。</span></div></div><div><div><div>10</div></div><div><span><span>  </span></span><span>&lt;/</span><span>StepItem</span><span>&gt;</span></div></div><div><div><div>11</div></div><div><span>&lt;/</span><span>Steps</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol><li><span></span><div><div>安装依赖</div><div><p>运行 <code>pnpm install</code>。</p></div></div></li><li><span><span></span></span><div><div>启动开发服务器</div><div><p>运行 <code>pnpm dev</code>，打开 <code>localhost:4321</code>。</p></div></div></li><li><span></span><div><div>编写文章</div><div><p>在 <code>src/content/posts/</code> 新建 <code>.mdx</code> 文章。</p></div></div></li></ol><hr /></section><section><h3>徽章：<code>Badge</code><a href="#徽章badge"><span>#</span></a></h3><p>内联彩色小徽章，可嵌在段落或标题里。</p>

<table><thead><tr><th>属性</th><th>必填</th><th>说明</th></tr></thead><tbody><tr><td><code>type</code></td><td>否</td><td>default 为主题色，其余对应提示框色板（tip / note / important / warning / caution）</td></tr></tbody></table><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>&lt;</span><span>Badge</span><span> </span><span>type</span><span>=</span><span>"tip"</span><span>&gt;提示&lt;/</span><span>Badge</span><span>&gt; &lt;</span><span>Badge</span><span> </span><span>type</span><span>=</span><span>"warning"</span><span>&gt;注意&lt;/</span><span>Badge</span><span>&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div><span>新功能</span><span>提示</span><span>笔记</span><span>重要</span><span>注意</span><span>危险</span><hr /><p>更多信息，请查看 <a href="https://mdxjs.com/" target="_blank">MDX 文档</a></p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/video/</id>
      <title type="text">在文章中嵌入视频</title>
      <published>2026-09-12T00:00:00.000Z</published>
      <updated>2026-09-12T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/video/"/>
      <summary type="text">这篇文章演示如何在博客文章中嵌入视频。</summary>
      <content type="html"><![CDATA[<p>只需从 YouTube 或其他平台复制嵌入代码，然后将其粘贴到 markdown 文件中。</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>---</span></div></div><div><div><div>2</div></div><div><span>title</span><span>: </span><span>在文章中嵌入视频</span></div></div><div><div><div>3</div></div><div><span>published</span><span>: </span><span>2023-10-19</span></div></div><div><div><div>4</div></div><div><span>// ...</span></div></div><div><div><div>5</div></div><div><span>---</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>&lt;iframe width="100%" height="468" src="https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_" title="YouTube video player" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<section><h2>YouTube<a href="#youtube"><span>#</span></a></h2></section>
<section><h2>Bilibili<a href="#bilibili"><span>#</span></a></h2> </section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/dingtalk-local-linkage/</id>
      <title type="text">钉钉 × 本地电脑：一句话指令的自动执行方案</title>
      <published>2026-09-11T00:00:00.000Z</published>
      <updated>2026-09-11T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/dingtalk-local-linkage/"/>
      <summary type="text">钉钉协同办公的续篇：整套「钉钉下指令、本地自动干活、结果送回钉钉」联动方案的架构讲解——角色分工、六步执行流、接力棒机制与三重保险。</summary>
      <content type="html"><![CDATA[<blockquote><p>上一篇<a href="/posts/dingtalk-office-automation/">《AI 协同钉钉办公：本地脚本 + 群机器人的自动化实践》</a>讲了具体落地案例；这一篇是它的续作，把整套「钉钉下指令、电脑自动干活、结果送回钉钉」的联动方案完整讲清楚——写给非技术同事也能看懂。</p></blockquote>
<div><div><div>3</div><div>参与系统</div></div><div><div>15+</div><div>专业任务程序</div></div><div><div>53 秒</div><div>首棒响应窗口</div></div><div><div>30 分钟</div><div>结果留底备查</div></div></div>
<section><h2>01 一页看懂：一句话指令的完整旅程<a href="#01-一页看懂一句话指令的完整旅程"><span>#</span></a></h2><p>整个体系分三块，中间靠一条加密消息热线连起来——指令向右流动，结果向左送回：</p><div><div><div><div><span><p>本地</p></span></div><div><span><p>云端</p></span></div><div><span><p>钉钉侧</p></span></div><div><span><p>加密热线下发指令</p></span></div><div><span><p>MQTT · TLS 加密</p></span></div><div><span></span></div><div><span><p>结果回传</p></span></div><div><span><p>MQTT · TLS 加密</p></span></div><div><span></span></div><div><span><p>钉钉自动流<br />定时触发 / 手动一句话</p></span></div><div><span><p>结果推回钉钉<br />通知用户</p></span></div><div><span><p>云端对接程序<br />传令兵 + 站岗哨兵<br />首棒等 53 秒 · 换岗接力</p></span></div><div><span><p>本地调度中心<br />大管家</p></span></div><div><span><p>任务程序群<br />15+ 个专业任务</p></span></div>
</div><div><div><span><p>本地</p></span></div><div><span><p>云端</p></span></div><div><span><p>钉钉侧</p></span></div><div><span><p>加密热线下发指令</p></span></div><div><span><p>MQTT · TLS 加密</p></span></div><div><span></span></div><div><span><p>结果回传</p></span></div><div><span><p>MQTT · TLS 加密</p></span></div><div><span></span></div><div><span><p>钉钉自动流<br />定时触发 / 手动一句话</p></span></div><div><span><p>结果推回钉钉<br />通知用户</p></span></div><div><span><p>云端对接程序<br />传令兵 + 站岗哨兵<br />首棒等 53 秒 · 换岗接力</p></span></div><div><span><p>本地调度中心<br />大管家</p></span></div><div><span><p>任务程序群<br />15+ 个专业任务</p></span></div>
</div></div></div></section>
<section><h2>02 为什么要做：解决三个麻烦<a href="#02-为什么要做解决三个麻烦"><span>#</span></a></h2>

<table><thead><tr><th>现在的麻烦</th><th>方案带来的改变</th></tr></thead><tbody><tr><td><strong>时间被绑住</strong>：报表要在固定时间跑，人不在电脑前，任务就停摆</td><td><strong>定时自动执行</strong>：钉钉自动流到点触发，无需任何人值守</td></tr><tr><td><strong>操作重复繁琐</strong>：登录系统、下载、导出、汇总，一套动作天天重复</td><td><strong>一句话指挥</strong>：记住几个关键词，就能调度整套流程，多步连跑</td></tr><tr><td><strong>人不在公司</strong>：系统和数据都在公司内网，人在家里够不着</td><td><strong>远程可达</strong>：人在哪里，钉钉就在哪里</td></tr></tbody></table><p>本质就一句话：把「人必须到电脑前操作」变成「钉钉下指令，电脑自己干」。</p></section>
<section><h2>03 角色分工：谁负责什么<a href="#03-角色分工谁负责什么"><span>#</span></a></h2><p>一次完整联动里，四个环节各司其职，<strong>本地调度中心居中统筹——它是唯一「什么都懂」的角色</strong>：</p><div><div><div><span>🛰️</span><span>发令者</span></div><div>钉钉自动流</div><p>定时触发到点自动下指令；手动触发就是在钉钉里发一句话。人在哪里，指令就从哪里出发。</p></div><div><div><span>📡</span><span>传令兵 + 哨兵</span></div><div>云端对接程序</div><p>首棒送指令、原地等 53 秒回音；长任务由接力棒换岗接着等，保证结果必达。</p></div><div><div><span>🤖</span><span>干活的工人</span></div><div>任务程序群</div><p>15+ 个专业任务各干各的；组合任务把多道工序连成流水线，一条指令全搞定。</p></div><div><div><span>🧭</span><span>大管家 · 关键枢纽</span></div><div>本地调度中心</div><p>翻译指令、安排节奏、看护全程——唯一「什么都懂」的角色，整个方案的心脏。</p></div></div><p>四者的协作关系（指令与结果的完整闭环）：</p><div><div><div><div><span><p>指令</p></span></div><div><span><p>MQTT 热线</p></span></div><div><span><p>安排干活</p></span></div><div><span><p>结果</p></span></div><div><span><p>本地调度中心<br />翻译指令 · 排队调度 · 超时看护</p></span></div><div><span><p>钉钉自动流</p></span></div><div><span><p>云端对接程序</p></span></div><div><span><p>任务程序群</p></span></div>
</div><div><div><span><p>指令</p></span></div><div><span><p>MQTT 热线</p></span></div><div><span><p>安排干活</p></span></div><div><span><p>结果</p></span></div><div><span><p>本地调度中心<br />翻译指令 · 排队调度 · 超时看护</p></span></div><div><span><p>钉钉自动流</p></span></div><div><span><p>云端对接程序</p></span></div><div><span><p>任务程序群</p></span></div>
</div></div></div></section>
<section><h2>04 怎么运行：六步走完一次完整执行<a href="#04-怎么运行六步走完一次完整执行"><span>#</span></a></h2><div><div><div>任务程序调度中心云端程序钉钉自动流任务程序调度中心云端程序钉钉自动流到点触发 / 手动一句话1加密热线送出指令（原地站岗监听）2回复「收到」3找到对应任务程序4下载 / 导出 / 跑机器人（多步排队连跑）5结果回传6结果送回（长任务换岗接力）7结果推回钉钉，通知用户8
</div><div>任务程序调度中心云端程序钉钉自动流任务程序调度中心云端程序钉钉自动流到点触发 / 手动一句话1加密热线送出指令（原地站岗监听）2回复「收到」3找到对应任务程序4下载 / 导出 / 跑机器人（多步排队连跑）5结果回传6结果送回（长任务换岗接力）7结果推回钉钉，通知用户8
</div></div></div><p>六步的文字版速览：</p><ol><li><span>1</span><div><div>触发</div><p>钉钉自动流到点自动触发，或手动在钉钉里发一句话。</p></div></li><li><span>2</span><div><div>下发</div><p>云端程序通过加密热线把指令送到本地，原地站岗监听。</p></div></li><li><span>3</span><div><div>确认</div><p>调度中心回复「收到」——指令被成功接住。</p></div></li><li><span>4</span><div><div>执行</div><p>调度中心找到对应任务程序安排干活，多步任务排队连跑。</p></div></li><li><span>5</span><div><div>回传</div><p>任务结果送回调度中心，由它统一回传云端。</p></div></li><li><span>6</span><div><div>闭环</div><p>结果推回钉钉，通知用户——全程无需任何人守在电脑前。</p></div></li></ol></section>
<section><h2>05 关键点：调度中心是整个方案的心脏<a href="#05-关键点调度中心是整个方案的心脏"><span>#</span></a></h2><p>云端只管传话，任务程序只管干活——中间所有的秩序，都由这位「大管家」维持：</p><ul>
<li><strong>翻译官</strong>：把「关键词」翻译成「电脑动作」。收到 AQ001 → 启动 BI 月计划下载程序。新增任务只需在配置表加一行，不用改代码——指令词、程序路径、开关全在一张配置表里</li>
<li><strong>大管家</strong>：安排干活节奏。组合任务按顺序逐个执行（排队调度）；单个任务最多 900 秒，到点即报（超时看护）；每份结果保留 30 分钟备查</li>
<li><strong>保安</strong>：防重复、防冲突，正在执行的任务绝不被打断</li>
</ul></section>
<section><h2>06 指挥手册：一句话能指挥哪些活<a href="#06-指挥手册一句话能指挥哪些活"><span>#</span></a></h2><p>以下为常用任务节选，每条指令对应配置表里的一行设置：</p>

<table><thead><tr><th>指令关键词</th><th>任务名</th><th>它帮你干什么</th><th>需要解锁屏幕</th></tr></thead><tbody><tr><td>AQ001</td><td>BI 月计划下载</td><td>自动登录 BI 系统，下载月度营销计划表</td><td>否</td></tr><tr><td>AQ002</td><td>运营决策平台导出</td><td>自动导出运营决策平台的数据报表</td><td>否</td></tr><tr><td>AQ003</td><td>CRM 销售合同导出</td><td>从 CRM 系统导出销售合同清单</td><td>否</td></tr><tr><td>AQ_BATCH1</td><td>月度数据全量更新</td><td>AQ001→002→003 三步连跑，一条指令全搞定</td><td>否</td></tr><tr><td>ZHSAPXL</td><td>SAP 销量导出</td><td>调度 RPA 机器人登录 SAP，导出销量数据</td><td>是</td></tr><tr><td>AQ101</td><td>每日自动签到打卡</td><td>WorkBuddy 每日签到</td><td>否</td></tr><tr><td>配置更新</td><td>远程改配置</td><td>不到电脑前，远程更新任务配置</td><td>—</td></tr></tbody></table></section>
<section><h2>07 关键要点 ①：接力棒突破「60 秒魔咒」<a href="#07-关键要点-接力棒突破60-秒魔咒"><span>#</span></a></h2><p><strong>硬约束</strong>：钉钉规定云端程序单次最多运行 60 秒，而本地任务（比如 RPA 导 SAP 数据）常常一跑几分钟——哨兵还没等到结果就被迫下岗，结果悬在半空。</p><p><strong>解法：像接力赛一样换岗。</strong></p><div><div><div>钉钉接力棒 N本地电脑首棒哨兵钉钉接力棒 N本地电脑首棒哨兵接力棒 1 → 2 → N 无限传直到结果到手才收工送出指令，原地等 53 秒到点交接判断换岗（带同一张工单号）重新上线，接着等 50 秒任务完成，结果送达结果推回用户，闭环完成
</div><div>钉钉接力棒 N本地电脑首棒哨兵钉钉接力棒 N本地电脑首棒哨兵接力棒 1 → 2 → N 无限传直到结果到手才收工送出指令，原地等 53 秒到点交接判断换岗（带同一张工单号）重新上线，接着等 50 秒任务完成，结果送达结果推回用户，闭环完成
</div></div></div><p><strong>换岗那几秒会不会漏掉结果？不会。</strong> 本地把每份已推送的结果留底 30 分钟，换岗空窗期由「补问重发」机制兜底。</p></section>
<section><h2>08 关键要点 ②：三重保险 + 一条安全底线<a href="#08-关键要点-三重保险--一条安全底线"><span>#</span></a></h2><div><div><div><span>🎟️</span><span>不串台</span></div><div>唯一工单号</div><p>每条指令自带唯一工单号，云端哨兵只认工单号完全一致的消息——多人同时下指令，各收各的结果，像取快递必须核对取件码。</p></div><div><div><span>💾</span><span>不丢失</span></div><div>留底 30 分钟</div><p>结果在本地留底 30 分钟，换岗空窗期由「补问重发」兜底——哨兵晚了一步也照样拿到结果，长任务的回报不落空。</p></div><div><div><span>🚫</span><span>不打断</span></div><div>单实例保护</div><p>调度中心能识别「管家正在干活」，新启动的实例自动让位退出——正在执行的任务绝不被强杀中断。</p></div></div><p><strong>安全底线</strong>：消息全程 TLS 加密传输；云端与本地各用独立账号；指令、结果双通道分离。</p></section>
<section><h2>09 总结：记住这五件事<a href="#09-总结记住这五件事"><span>#</span></a></h2><ol>
<li><strong>一句话指挥</strong>：在钉钉里发关键词，办公室电脑自动干活，结果自动推回钉钉</li>
<li><strong>调度中心是心脏</strong>：翻译指令、排队调度、超时看护、防重复——所有秩序都靠它维持</li>
<li><strong>两条加密专线</strong>：指令走 004_A、结果走 004_B，经公共消息热线中转，全程加密不落地</li>
<li><strong>接力棒破 60 秒</strong>：云端哨兵一棒接一棒无限换岗，长任务也能稳稳等到结果</li>
<li><strong>三重保险</strong>：工单号防串台、留底防丢失、单实例防打断，全程自动生效</li>
</ol><p>人只负责两件事：<strong>下指令、看结果</strong>。其余的一切，交给这套自动体系。</p></section>
<section><h2>附：本文配套演示文稿<a href="#附本文配套演示文稿"><span>#</span></a></h2><a href="/assets/files/钉钉本地联动方案.pptx"><span>📂</span><div><div>钉钉本地联动方案.pptx</div><div>PPTX · 71 KB · 原版演示文稿，可下载留存</div></div><span>下载 ⤓</span></a></section>]]></content>
    </entry>
    <entry>
      <id>https://nfcup.cn/posts/dingtalk-office-automation/</id>
      <title type="text">AI 协同钉钉办公：本地脚本 + 群机器人的自动化实践</title>
      <published>2026-09-10T00:00:00.000Z</published>
      <updated>2026-09-10T00:00:00.000Z</updated>
      <author><name>南风尘</name></author>
      <link rel="alternate" href="https://nfcup.cn/posts/dingtalk-office-automation/"/>
      <summary type="text">用脚本自动导出报表、钉钉群机器人回传结果、自动流定时触发任务的一套落地做法与搭建要点。</summary>
      <content type="html"><![CDATA[<section><h2>全景：这套自动化长什么样<a href="#全景这套自动化长什么样"><span>#</span></a></h2><p>三个报表脚本 + 一个调度程序 + 钉钉群机器人，串成一条完整的自动化链路：</p><div><div><div><div><span><p>下发指令</p></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>Webhook 推送</p></span></div><div><span><p>钉钉自动流<br />定时 / 手动触发</p></span></div><div><span><p>本地调度程序</p></span></div><div><span><p>CRM 报表导出</p></span></div><div><span><p>BI 报表导出</p></span></div><div><span><p>运营决策导出</p></span></div><div><span><p>运行日志 + 导出文件</p></span></div><div><span><p>钉钉群机器人<br />结果回传到群</p></span></div>
</div><div><div><span><p>下发指令</p></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span></span></div><div><span><p>Webhook 推送</p></span></div><div><span><p>钉钉自动流<br />定时 / 手动触发</p></span></div><div><span><p>本地调度程序</p></span></div><div><span><p>CRM 报表导出</p></span></div><div><span><p>BI 报表导出</p></span></div><div><span><p>运营决策导出</p></span></div><div><span><p>运行日志 + 导出文件</p></span></div><div><span><p>钉钉群机器人<br />结果回传到群</p></span></div>
</div></div></div><div><div><div>3</div><div>报表任务全自动</div></div><div><div>1</div><div>调度程序统筹</div></div><div><div>24h</div><div>全天候在线</div></div><div><div>0</div><div>人工干预</div></div></div></section>
<section><h2>一、自动化导出报表<a href="#一自动化导出报表"><span>#</span></a></h2><p>三个系统共用同一套脚本骨架，只是”进哪个门、导哪张表”不同：</p><div><div><div>1</div><div>启动脚本</div><div>到点自动运行</div></div><div><div>2</div><div>打开浏览器</div><div>定位目标系统</div></div><div><div>3</div><div>登录账号</div><div>凭证脚本托管</div></div><div><div>4</div><div>进入页面</div><div>筛选条件已预设</div></div><div><div>5</div><div>执行导出</div><div>文件落盘 + 日志推送</div></div></div><section><h3>1. CRM 自动导出销售合同<a href="#1-crm-自动导出销售合同"><span>#</span></a></h3><ul>
<li>脚本步骤：打开浏览器 → 打开 CRM 登录链接 → 登录账号 → 打开销售合同 → 导出</li>
<li>前置条件：销售合同页面设置默认筛选条件「实际生效日期时间范围」</li>
</ul></section><section><h3>2. BI 自动导出报表<a href="#2-bi-自动导出报表"><span>#</span></a></h3><ul>
<li>脚本步骤：打开浏览器 → 打开 BI 登录链接 → 登录账号 → 打开对应项目 → 导出</li>
<li>前置条件：BI 项目的筛选日期、条件设置好，每日滚动</li>
</ul></section><section><h3>3. 运营决策导出报表<a href="#3-运营决策导出报表"><span>#</span></a></h3><ul>
<li>脚本步骤：打开浏览器 → 打开 BI 登录链接 → 登录账号 → 打开对应项目 → 导出</li>
<li>前置条件：设置好常用调出组合，比如「选择公司」</li>
</ul></section></section>
<section><h2>二、钉钉群机器人自动化搭建<a href="#二钉钉群机器人自动化搭建"><span>#</span></a></h2><section><h3>1. 本地脚本运行日志推送<a href="#1-本地脚本运行日志推送"><span>#</span></a></h3><p>钉钉自动流通过 Webhook 接收数据，机器人把消息回传到群里——这是一切自动化日志的基础：<strong>脚本跑到哪一步、成功还是失败，群里一目了然</strong>。</p></section><section><h3>2. 定时启动任务搭建<a href="#2-定时启动任务搭建"><span>#</span></a></h3><p>钉钉自动流使用定时触发组件，将指令发送至本地脚本，实现全自动化——<strong>到点自动跑，无人值守</strong>。</p></section><section><h3>3. 指令控制面板<a href="#3-指令控制面板"><span>#</span></a></h3><p>利用 AI 表格搭建，通过按钮组件触发自动流，实现<strong>远程发送任务指令</strong>——人在外面，手机点一下按钮，办公室电脑就开始干活。</p></section></section>
<section><h2>三、进阶：日报生成并推送至钉钉<a href="#三进阶日报生成并推送至钉钉"><span>#</span></a></h2><p>前置条件与路径：</p><ul>
<li>搭建 Excel 数据分析表，把复杂计算放在表格里，减少 Python 代码难度</li>
<li>使用 AI 办公软件（如 Trae、WorkBuddy）跑一次完整任务，让 AI 把任务固化成 Python 脚本</li>
<li>接入 AI 大模型 API 做结果分析（前期可用各平台免费模型）</li>
</ul></section>
<section><h2>四、总结：三块拼图<a href="#四总结三块拼图"><span>#</span></a></h2><div><div><div><span>💻</span><span>拼图 ①</span></div><div>本地准备</div><p>接听任务并启动任务的调度程序 + 各任务的 Python 脚本——用 Trae、WorkBuddy 等 AI 办公软件，自然语言描述即可生成。</p></div><div><div><span>🔔</span><span>拼图 ②</span></div><div>钉钉准备</div><p>利用群机器人自动化 + AI 表格自动化，搭建定时 / 手动两种触发方式的指令通道，远程下指令、回收结果。</p></div><div><div><span>🧩</span><span>拼图 ③</span></div><div>系统准备</div><p>需要自动化的系统，筛选组件尽可能预设好——降低脚本开发难度，让脚本只做「点击和导出」。</p></div></div><section><h3>搭建要点<a href="#搭建要点"><span>#</span></a></h3><ol>
<li><strong>Python 脚本贯穿所有场景</strong>，必不可缺，能解决很多平台无法实现的任务</li>
<li><strong>Excel 模板</strong>尽可能做到「粘贴数据、刷新即出结果」，可用网页版免费 DeepSeek 辅助生成 WPS JS 宏</li>
<li><strong>写清执行步骤</strong>：需要搭建的任务，步骤要写得条理清晰，不要让 AI 猜下一步</li>
</ol><p>上述自动化案例均为每日必做、执行动作基本不变、操作简单的任务——把重复性工作交给脚本，将时间聚焦在真正需要动脑的工作上。</p></section></section>
<section><h2>附：本文配套演示文稿<a href="#附本文配套演示文稿"><span>#</span></a></h2><a href="/assets/files/AI协同钉钉办公_案例展示.pptx"><span>📂</span><div><div>AI协同钉钉办公_案例展示.pptx</div><div>PPTX · 5.4 MB · 原版演示文稿，可下载留存</div></div><span>下载 ⤓</span></a></section>]]></content>
    </entry>
</feed>
