<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>晚风携夜色 · 幽梦赴长空</title>
    <link>https://moeao.cn</link>
    <description></description>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 18 Jul 2026 15:48:42 GMT</lastBuildDate>
    <generator>moeMac Theme (Hexo 8.1.2)</generator>
    <atom:link href="https://moeao.cn/atom.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>VWD评论系统使用说明</title>
      <link>https://moeao.cn/posts/bf499fec.html</link>
      <guid isPermaLink="true">https://moeao.cn/posts/bf499fec.html</guid>
      <pubDate>Sat, 18 Jul 2026 10:00:00 GMT</pubDate>
      <description><![CDATA[<p><strong>VWD（Vercel Workers Discuss）</strong> 是一款基于 Vercel Serverless 平台的自托管评论系统，使用 Vercel Postgres 和 Vercel KV 作为数据存储。深度适配 Vercel 生态，开箱即用，<strong>部署成本为零</strong>。</p>
<p>本项目参考了 <a href="https://github.com/anghunk/cwd">CWD</a>（Cloudflare Workers Discuss）和 <a href="https://waline.js.org/">Waline</a> 评论系统的设计与实现，适合个人博客或中小型站点使用。</p>
<blockquote>
<p><strong>提示</strong>：本文涵盖从部署到进阶配置的所有内容，建议先通读一遍，再按需查阅。</p>
</blockquote>
<span id="more"></span>

<div class="btn-group btn-group-rounded btn-group-center"><a href="https://github.com/s-Ruthless/Vercel-Workers-Discuss" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-star"></i> GitHub 仓库</a><a href="https://github.com/s-Ruthless/Vercel-Workers-Discuss" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-book"></i> 官方文档</a></div>
<h2 id="功能特性"><a href="#功能特性" class="headerlink" title="功能特性"></a>功能特性</h2><p>VWD 评论系统提供了一套完整的评论解决方案，涵盖评论、说说、通知、安全、备份等功能。</p>
<div class="card-box" style="--card-color:#3b82f6"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">核心能力</span></div><div class="card-box-body"><ul>
<li><strong>评论系统</strong>：支持嵌套回复、Markdown 渲染、XSS 过滤、图片灯箱</li>
<li><strong>说说功能</strong>：博主可发布动态&#x2F;短博文，支持 Markdown、表情、标签、点赞</li>
<li><strong>管理后台</strong>：Vue 3 + macOS 风格 UI，暗黑模式、中英文双语、自定义主题色</li>
<li><strong>邮件通知</strong>：SMTP 邮件通知，支持自定义模板，兼容 QQ&#x2F;163 邮箱</li>
<li><strong>Telegram 通知</strong>：新评论实时推送到 Telegram，支持一键 Webhook 配置</li>
<li><strong>S3 备份</strong>：兼容 AWS S3 &#x2F; Cloudflare R2 &#x2F; MinIO，支持自动备份与恢复</li>
<li><strong>点赞功能</strong>：文章点赞、评论点赞和说说点赞</li>
<li><strong>表情系统</strong>：Waline 风格表情包，内置阿鲁表情包和颜文字</li>
<li><strong>数据迁移</strong>：支持从 Twikoo、Artalk、Valine 导入评论数据</li>
<li><strong>多站点</strong>：支持多站点管理，通过 <code>siteId</code> 隔离数据</li>
<li><strong>安全</strong>：IP&#x2F;邮箱黑名单、域名白名单、评论审核机制</li>
</ul>
</div></div>
<h2 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h2><table>
<thead>
<tr>
<th>层级</th>
<th>技术</th>
</tr>
</thead>
<tbody><tr>
<td>运行时</td>
<td>Vercel Serverless (Node.js 20+)</td>
</tr>
<tr>
<td>Web 框架</td>
<td>Hono + <code>hono/vercel</code> adapter</td>
</tr>
<tr>
<td>数据库</td>
<td>Vercel Postgres (Neon PostgreSQL)</td>
</tr>
<tr>
<td>键值存储</td>
<td>Vercel KV (Upstash Redis)</td>
</tr>
<tr>
<td>邮件</td>
<td>nodemailer</td>
</tr>
<tr>
<td>S3 存储</td>
<td>aws4fetch</td>
</tr>
<tr>
<td>Admin 前端</td>
<td>Vue 3 + Vite + TypeScript</td>
</tr>
<tr>
<td>图表</td>
<td>ECharts</td>
</tr>
<tr>
<td>国际化</td>
<td>vue-i18n（Admin 支持中英文，Widget 仅中文）</td>
</tr>
<tr>
<td>样式</td>
<td>LESS + CSS Variables（暗黑模式）</td>
</tr>
</tbody></table>
<h2 id="免费额度分析"><a href="#免费额度分析" class="headerlink" title="免费额度分析"></a>免费额度分析</h2><p>根据对 Vercel 免费计划的分析，VWD 评论系统的部署成本为零，不需要任何成本。</p>
<table>
<thead>
<tr>
<th>指标</th>
<th>免费每月额度</th>
<th>单次消耗</th>
<th>理论极限</th>
</tr>
</thead>
<tbody><tr>
<td>Serverless 函数调用</td>
<td>100 万次</td>
<td>~3 次&#x2F;次访问</td>
<td>33 万次页面访问</td>
</tr>
<tr>
<td>带宽</td>
<td>100 GB</td>
<td>~50 KB&#x2F;次访问</td>
<td>200 万次页面访问</td>
</tr>
<tr>
<td>Postgres 计算</td>
<td>60 小时</td>
<td>~20ms&#x2F;次请求</td>
<td>1000 万次请求</td>
</tr>
<tr>
<td>KV 命令</td>
<td>300 万次</td>
<td>~2 次&#x2F;次访问</td>
<td>150 万次页面访问</td>
</tr>
</tbody></table>
<div class="note-success custom-block cb-success"><div class="custom-block-header"><i class="fas fa-circle-check"></i><span class="custom-block-title">放心使用</span></div><div class="custom-block-body"><p>对于个人博客或中小型站点来说，Vercel 免费计划完全够用。</p>
</div></div>
<h2 id="快速部署"><a href="#快速部署" class="headerlink" title="快速部署"></a>快速部署</h2><h3 id="前置要求"><a href="#前置要求" class="headerlink" title="前置要求"></a>前置要求</h3><p><div class="todo-item" style="--todo-color:var(--accent-color)"><span class="todo-checkbox"></span><span class="todo-text">拥有 GitHub 账号</span></div><br><div class="todo-item" style="--todo-color:var(--accent-color)"><span class="todo-checkbox"></span><span class="todo-text">拥有 Vercel 账号（可使用 GitHub 登录）</span></div><br><div class="todo-item todo-checked" style="--todo-color:var(--accent-color)"><span class="todo-checkbox todo-checkbox-checked"></span><span class="todo-text">Node.js >= 20（本地开发需要）</span></div></p>
<h3 id="部署步骤"><a href="#部署步骤" class="headerlink" title="部署步骤"></a>部署步骤</h3><div class="steps-container" id="steps-1b3bvq"><div class="steps-nav"><button class="step-label active" data-step="steps-1b3bvq-0"><span class="step-num">1</span><span class="step-text">Fork / 克隆仓库</span></button><button class="step-label" data-step="steps-1b3bvq-1"><span class="step-num">2</span><span class="step-text">在 Vercel 导入仓库</span></button><button class="step-label" data-step="steps-1b3bvq-2"><span class="step-num">3</span><span class="step-text">创建数据库资源</span></button><button class="step-label" data-step="steps-1b3bvq-3"><span class="step-num">4</span><span class="step-text">关联数据库到项目</span></button><button class="step-label" data-step="steps-1b3bvq-4"><span class="step-num">5</span><span class="step-text">重新部署并设置管理员</span></button></div><div class="steps-body"><div class="step-content active" id="steps-1b3bvq-0"><p>CODE0</p>
<p>或直接在 GitHub 上 Fork <a href="https://github.com/s-Ruthless/Vercel-Workers-Discuss">Vercel-Workers-Discuss</a> 仓库。</p></div><div class="step-content" id="steps-1b3bvq-1"><ol>
<li>登录 <a href="https://vercel.com/dashboard">Vercel 控制台</a></li>
<li>点击 <strong>Add New → Project</strong></li>
<li>选择你 Fork 的仓库 undefined</li>
<li>Vercel 会自动识别 undefined 配置，无需手动设置：<ul>
<li><strong>Build Command</strong>：undefined（自动构建 Widget + Admin + 文档）</li>
<li><strong>Output Directory</strong>：undefined</li>
<li><strong>Install Command</strong>：undefined</li>
</ul>
</li>
<li>点击 <strong>Deploy</strong>，等待构建完成</li>
</ol></div><div class="step-content" id="steps-1b3bvq-2"><p>在 Vercel 控制台中创建以下资源（与项目关联到同一个 Scope）：</p>
<ol>
<li><strong>Vercel Postgres</strong> — 存储 评论、设置、说说数据</li>
<li><strong>Vercel KV</strong> — 管理会话 Token 和限流</li>
</ol>
<p>创建方式：Vercel 控制台 → <strong>Storage</strong> → <strong>Create</strong> → 选择 Postgres &#x2F; KV</p></div><div class="step-content" id="steps-1b3bvq-3"><ol>
<li>进入项目 <strong>Settings → Storage</strong></li>
<li>将创建的 Postgres 和 KV 实例连接到本项目</li>
<li>以下环境变量会<strong>自动注入</strong>，无需手动配置：</li>
</ol>
<table>
<thead>
<tr>
<th>变量名</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>undefined</td>
<td>Vercel Postgres 连接地址</td>
</tr>
<tr>
<td>undefined</td>
<td>Vercel KV REST API 地址</td>
</tr>
<tr>
<td>undefined</td>
<td>Vercel KV REST API Token</td>
</tr>
</tbody></table></div><div class="step-content" id="steps-1b3bvq-4"><p>关联数据库后，在 Vercel 控制台点击 <strong>Redeploy</strong>。</p>
<p><div class="note-tip custom-block cb-tip"><div class="custom-block-header"><i class="fas fa-lightbulb"></i><span class="custom-block-title">自动建表</span></div><div class="custom-block-body"><p>数据库表会在首次 API 请求时<strong>自动创建</strong>（<code>ensureSchema</code>），无需手动初始化。</p>
</div></div></p>
<p>部署成功后，打开 undefined，首次访问会引导你设置管理员账号和密码。</p></div></div></div>
<h3 id="方式二：Vercel-CLI-部署"><a href="#方式二：Vercel-CLI-部署" class="headerlink" title="方式二：Vercel CLI 部署"></a>方式二：Vercel CLI 部署</h3><p>如果你更喜欢命令行操作，也可以使用 Vercel CLI 部署：</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 克隆并安装</span>
<span class="token function">git</span> clone https://github.com/s-Ruthless/Vercel-Workers-Discuss.git
<span class="token builtin class-name">cd</span> Vercel-Workers-Discuss
<span class="token function">npm</span> <span class="token function">install</span>

<span class="token comment"># 登录 Vercel</span>
npx vercel login

<span class="token comment"># 部署（包含构建）</span>
<span class="token function">npm</span> run deploy

<span class="token comment"># 或分步操作</span>
<span class="token function">npm</span> run build        <span class="token comment"># 构建 Widget + Admin + 文档</span>
npx vercel <span class="token parameter variable">--prod</span>    <span class="token comment"># 部署到生产环境</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="部署完成"><a href="#部署完成" class="headerlink" title="部署完成"></a>部署完成</h3><p>部署成功后，你将获得以下地址：</p>
<table>
<thead>
<tr>
<th>地址</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>https://your-project.vercel.app/</code></td>
<td>首页引导页</td>
</tr>
<tr>
<td><code>https://your-project.vercel.app/doc/</code></td>
<td>使用文档（VitePress 文档站）</td>
</tr>
<tr>
<td><code>https://your-project.vercel.app/admin/</code></td>
<td>管理后台</td>
</tr>
<tr>
<td><code>https://your-project.vercel.app/vwd.js</code></td>
<td>Widget JS 文件</td>
</tr>
<tr>
<td><code>https://your-project.vercel.app/api/health</code></td>
<td>健康检查</td>
</tr>
<tr>
<td><code>https://your-project.vercel.app/emotion/</code></td>
<td>表情图片资源</td>
</tr>
</tbody></table>
<div class="note-tip custom-block cb-tip"><div class="custom-block-header"><i class="fas fa-lightbulb"></i><span class="custom-block-title">检测部署情况</span></div><div class="custom-block-body"><p>部署成功后，访问健康检查接口 <code>https://your-project.vercel.app/api/health</code>，如果成功会返回：</p>
<p>CODE2</p>
</div></div>
<h2 id="前端接入"><a href="#前端接入" class="headerlink" title="前端接入"></a>前端接入</h2><p>VWD 内置 Widget 组件，部署后自动构建到 <code>public/vwd.js</code>，可通过你的域名直接引用。</p>
<h3 id="组件特性"><a href="#组件特性" class="headerlink" title="组件特性"></a>组件特性</h3><p>VWD 评论组件采用 <strong>Shadow DOM</strong> 技术构建，基于独立根节点渲染，具备以下优势：</p>
<ul>
<li><strong>样式隔离</strong>：组件样式完全独立，不会与宿主页面的样式产生冲突</li>
<li><strong>DOM 隔离</strong>：组件内部 DOM 结构与外部页面完全隔离，互不干扰</li>
<li><strong>即插即用</strong>：无需担心现有网站的样式框架（如 Bootstrap、Tailwind 等）影响组件显示</li>
<li><strong>自定义样式</strong>：通过 <code>customCssUrl</code> 参数注入自定义样式表，灵活调整外观</li>
</ul>
<h3 id="不同框架接入示例"><a href="#不同框架接入示例" class="headerlink" title="不同框架接入示例"></a>不同框架接入示例</h3><div class="tabs-container" id="tabs-framework-tabs-"><div class="tabs-nav"><button class="tab-label active" data-tab="tabs-framework-tabs--1">HTML（通用）</button><button class="tab-label" data-tab="tabs-framework-tabs--2">Vue 3</button><button class="tab-label" data-tab="tabs-framework-tabs--3">React</button><button class="tab-label" data-tab="tabs-framework-tabs--4">Astro</button></div><div class="tabs-body"><div class="tab-content active" id="tabs-framework-tabs--1"><p>此方法适用于绝大多数博客框架，包括 Hexo、Hugo、Jekyll、WordPress 等。</p>
<p>CODE3</p></div><div class="tab-content" id="tabs-framework-tabs--2"><p>安装 undefined（或直接引用 CDN）</p>
<p>CODE4</p>
<p>CODE5</p></div><div class="tab-content" id="tabs-framework-tabs--3"><p>CODE6</p></div><div class="tab-content" id="tabs-framework-tabs--4"><p>CODE7</p></div></div></div>
<h3 id="配置参数"><a href="#配置参数" class="headerlink" title="配置参数"></a>配置参数</h3><table>
<thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>必填</th>
<th>默认值</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>el</code></td>
<td><code>string | HTMLElement</code></td>
<td>是</td>
<td>—</td>
<td>挂载元素选择器或 DOM 元素</td>
</tr>
<tr>
<td><code>apiBaseUrl</code></td>
<td><code>string</code></td>
<td>是</td>
<td>—</td>
<td>API 基础地址</td>
</tr>
<tr>
<td><code>siteId</code></td>
<td><code>string</code></td>
<td>否</td>
<td><code>blog</code></td>
<td>站点 ID，用于多站点数据隔离，推荐配置</td>
</tr>
<tr>
<td><code>postSlug</code></td>
<td><code>string</code></td>
<td>否</td>
<td><code>window.location.pathname</code></td>
<td>自定义评论标识符，用于跨路径&#x2F;多语言聚合</td>
</tr>
<tr>
<td><code>postTitle</code></td>
<td><code>string</code></td>
<td>否</td>
<td><code>document.title</code></td>
<td>文章标题（用于通知邮件）</td>
</tr>
<tr>
<td><code>postUrl</code></td>
<td><code>string</code></td>
<td>否</td>
<td><code>window.location.origin + pathname</code></td>
<td>文章 URL（用于通知邮件）</td>
</tr>
<tr>
<td><code>mode</code></td>
<td><code>&#39;says&#39;</code></td>
<td>否</td>
<td>—</td>
<td>设为 <code>&#39;says&#39;</code> 开启说说渲染功能</td>
</tr>
<tr>
<td><code>lang</code></td>
<td><code>&#39;zh-CN&#39;</code></td>
<td>否</td>
<td><code>zh-CN</code></td>
<td>评论组件语言代码</td>
</tr>
<tr>
<td><code>theme</code></td>
<td><code>&#39;light&#39; | &#39;dark&#39;</code></td>
<td>否</td>
<td><code>&#39;light&#39;</code></td>
<td>主题模式</td>
</tr>
<tr>
<td><code>pageSize</code></td>
<td><code>number</code></td>
<td>否</td>
<td><code>20</code></td>
<td>每页显示评论数</td>
</tr>
<tr>
<td><code>primaryColor</code></td>
<td><code>string</code></td>
<td>否</td>
<td><code>#0969da</code></td>
<td>主题色（hex 格式）</td>
</tr>
<tr>
<td><code>customCssUrl</code></td>
<td><code>string</code></td>
<td>否</td>
<td>—</td>
<td>自定义样式表 URL，追加到 Shadow DOM 底部</td>
</tr>
</tbody></table>
<h3 id="实例方法"><a href="#实例方法" class="headerlink" title="实例方法"></a>实例方法</h3><table>
<thead>
<tr>
<th>方法</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>mount()</code></td>
<td>挂载组件到 DOM</td>
</tr>
<tr>
<td><code>unmount()</code></td>
<td>卸载组件</td>
</tr>
<tr>
<td><code>updateConfig(config)</code></td>
<td>更新配置（支持动态切换主题等）</td>
</tr>
<tr>
<td><code>getConfig()</code></td>
<td>获取当前配置</td>
</tr>
</tbody></table>
<p><strong>使用示例：</strong></p>
<pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">// 动态切换主题</span>
comments<span class="token punctuation">.</span><span class="token function">updateConfig</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span> <span class="token literal-property property">theme</span><span class="token operator">:</span> <span class="token string">'dark'</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 动态修改评论标识符（适用于单页应用路由切换）</span>
comments<span class="token punctuation">.</span><span class="token function">updateConfig</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span> <span class="token literal-property property">postSlug</span><span class="token operator">:</span> <span class="token string">'/new-post-slug'</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">// 配置自定义样式（会以 &lt;link> 形式注入到 Shadow DOM 底部）</span>
comments<span class="token punctuation">.</span><span class="token function">updateConfig</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>
  <span class="token literal-property property">customCssUrl</span><span class="token operator">:</span> <span class="token string">'https://your-cdn.example.com/vwd-custom.css'</span><span class="token punctuation">,</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<div class="note-warning custom-block cb-warning"><div class="custom-block-header"><i class="fas fa-triangle-exclamation"></i><span class="custom-block-title">postSlug 说明</span></div><div class="custom-block-body"><p>如果你的站点是多语言结构（例如 <code>/en/post/1</code> 和 <code>/zh/post/1</code>），或者是不同路径需要共享同一份评论数据，可以通过 <code>postSlug</code> 参数手动指定唯一的标识符。如果未指定 <code>postSlug</code>，组件将默认使用 <code>window.location.pathname</code> 作为标识符。</p>
</div></div>
<h2 id="Hexo-moeMac-主题接入"><a href="#Hexo-moeMac-主题接入" class="headerlink" title="Hexo + moeMac 主题接入"></a>Hexo + moeMac 主题接入</h2><p>如果你使用的是 moeMac 主题，VWD 已深度集成，只需在主题配置文件 <code>themes/moeMac/_config.yml</code> 中配置即可。</p>
<h3 id="开启-VWD-评论"><a href="#开启-VWD-评论" class="headerlink" title="开启 VWD 评论"></a>开启 VWD 评论</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">comments</span><span class="token punctuation">:</span>
  <span class="token key atrule">enable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">provider</span><span class="token punctuation">:</span> <span class="token string">"vwd"</span>  <span class="token comment"># 设置为 vwd</span>
  <span class="token key atrule">vwd</span><span class="token punctuation">:</span>
    <span class="token key atrule">apiBaseUrl</span><span class="token punctuation">:</span> <span class="token string">"https://your-vwd-api.vercel.app"</span>  <span class="token comment"># VWD API 地址（Vercel 部署后的地址）</span>
    <span class="token key atrule">jsUrl</span><span class="token punctuation">:</span> <span class="token string">""</span>               <span class="token comment"># vwd.js 脚本地址，留空则默认使用 apiBaseUrl + /vwd.js</span>
    <span class="token key atrule">siteId</span><span class="token punctuation">:</span> <span class="token string">"blog"</span>          <span class="token comment"># 站点标识，用于多站点数据隔离（推荐配置）</span>
    <span class="token key atrule">lang</span><span class="token punctuation">:</span> <span class="token string">"auto"</span>            <span class="token comment"># 评论组件语言，auto 自动检测浏览器语言</span>
    <span class="token key atrule">customCssUrl</span><span class="token punctuation">:</span> <span class="token string">''</span>        <span class="token comment"># 自定义 CSS 地址，留空则使用默认样式</span>
    <span class="token key atrule">primaryColor</span><span class="token punctuation">:</span> <span class="token string">'#cf0226'</span> <span class="token comment"># 主题色，影响按钮/链接等强调色</span>
    <span class="token key atrule">saysEnable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>        <span class="token comment"># true 开启说说渲染（动态页面），false 关闭</span>
    <span class="token key atrule">saysPageSize</span><span class="token punctuation">:</span> <span class="token number">10</span>        <span class="token comment"># 每页显示说说数（也可在 VWD 后台设置）</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="配置项说明"><a href="#配置项说明" class="headerlink" title="配置项说明"></a>配置项说明</h3><details class="folding-panel folding-blue" id="fold-7bwzld"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>jsUrl 脚本地址说明</span></summary><div class="folding-body"><p>留空时默认从 API 服务器远程加载 <code>vwd.js</code>。也可填写自定义地址：</p>
<ul>
<li><strong>远程地址</strong>（可加版本号刷新缓存）：<code>jsUrl: &quot;https://vwd.moeao.cn/vwd.js?v=2&quot;</code></li>
<li><strong>本地路径</strong>（下载到本地后使用）：<code>jsUrl: &quot;/assets/js/vwd.js&quot;</code></li>
</ul>
</div></details>
<details class="folding-panel folding-green" id="fold-gqb5n8"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>页面级控制</span></summary><div class="folding-body"><p>在文章&#x2F;页面的 front-matter 中可以单独控制评论显示：</p>
<p>CODE10</p>
</div></details>
<details class="folding-panel folding-default" id="fold-alhemr"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>orange 多主题色适配</span></summary><div class="folding-body"><p><code>primaryColor</code> 会影响评论组件的按钮、链接等强调色。建议与你的博客主题色保持一致，例如 moeMac 主题默认色为 <code>#cf0226</code>。</p>
</div></details>
<blockquote>
<p>VWD 支持暗黑模式自动切换、Shadow DOM 隔离样式、评论数据本地存储等特性。</p>
</blockquote>
<h3 id="moeMac-主题相关文章"><a href="#moeMac-主题相关文章" class="headerlink" title="moeMac 主题相关文章"></a>moeMac 主题相关文章</h3><a class="post-card ajax-link" data-href="/posts/ada921dd.html"><div class="post-card-thumb"><img src="https://picsum.photos/seed/moemac-guide/600/400" alt="moeMac主题使用说明" loading="lazy" decoding="async"></div><div class="post-card-info"><div class="post-card-title">moeMac主题使用说明</div><div class="post-card-excerpt">moeMac 是一款 macOS 桌面风格 的 Hexo 主题，采用毛玻璃（Glassmorphism）设计语言，支持可拖拽窗口、Dock 导航栏、AJAX 无...</div><div class="post-card-meta"><span class="post-card-date"><i class="fas fa-calendar-day"></i> 2026-07-11</span><span class="post-card-read"><i class="fas fa-arrow-right"></i> 阅读</span></div></div></a>
<h2 id="说说功能"><a href="#说说功能" class="headerlink" title="说说功能"></a>说说功能</h2><p>VWD 评论系统内置说说功能，博主可以在后台 <code>/admin/says</code> 发布说说，然后创建独立页面展示说说列表。</p>
<h3 id="发布说说"><a href="#发布说说" class="headerlink" title="发布说说"></a>发布说说</h3><p>在管理后台的「说说管理」页面可以：</p>
<ul>
<li><strong>发布说说</strong>：支持 Markdown 内容、表情、标签</li>
<li><strong>编辑说说</strong>：修改已有说说的内容</li>
<li><strong>删除说说</strong>：删除不需要的说说</li>
<li><strong>说说状态</strong>：控制说说的显示&#x2F;隐藏</li>
</ul>
<h3 id="在独立页面展示说说"><a href="#在独立页面展示说说" class="headerlink" title="在独立页面展示说说"></a>在独立页面展示说说</h3><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>vwd-says<span class="token punctuation">"</span></span> <span class="token special-attr"><span class="token attr-name">style</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value css language-css"><span class="token property">max-width</span><span class="token punctuation">:</span> 800px<span class="token punctuation">;</span> <span class="token property">margin</span><span class="token punctuation">:</span> 2rem auto<span class="token punctuation">;</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://your-project.vercel.app/vwd.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript">
  <span class="token keyword">new</span> <span class="token class-name">VWDComments</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>
    <span class="token literal-property property">el</span><span class="token operator">:</span> <span class="token string">'#vwd-says'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">apiBaseUrl</span><span class="token operator">:</span> <span class="token string">'https://your-project.vercel.app'</span><span class="token punctuation">,</span>
    <span class="token literal-property property">mode</span><span class="token operator">:</span> <span class="token string">'says'</span>
  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">mount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="moeMac-主题动态页面"><a href="#moeMac-主题动态页面" class="headerlink" title="moeMac 主题动态页面"></a>moeMac 主题动态页面</h3><p>如果你使用 moeMac 主题，说说功能已内置集成。创建动态页面：</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo new page dynamic<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>在 <code>source/dynamic/index.md</code> 中设置布局：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token punctuation">---</span>
<span class="token key atrule">title</span><span class="token punctuation">:</span> 动态
<span class="token key atrule">date</span><span class="token punctuation">:</span> <span class="token datetime number">2026-07-15 10:00:00</span>
<span class="token key atrule">layout</span><span class="token punctuation">:</span> page<span class="token punctuation">-</span>dynamic
<span class="token key atrule">comment</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token punctuation">---</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<div class="note-tip custom-block cb-tip"><div class="custom-block-header"><i class="fas fa-lightbulb"></i><span class="custom-block-title">工作原理</span></div><div class="custom-block-body"><p><code>page-dynamic</code> 布局直接从 <code>comments.vwd</code> 读取 VWD 配置，自动初始化 <code>VWDComments</code> 组件并设置 <code>mode: &#39;says&#39;</code>，渲染说说列表。页面底部同时包含评论区（由 <code>comment</code> 开关控制）。</p>
</div></div>
<h3 id="说说后台设置"><a href="#说说后台设置" class="headerlink" title="说说后台设置"></a>说说后台设置</h3><p>在后台「设置」→「说说设置」中可配置：</p>
<table>
<thead>
<tr>
<th>配置项</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>说说开关</td>
<td>开启&#x2F;关闭说说功能</td>
</tr>
<tr>
<td>说说点赞</td>
<td>开启&#x2F;关闭说说点赞（也可在功能开关中配置）</td>
</tr>
<tr>
<td>每页数量</td>
<td>说说列表每页显示条数</td>
</tr>
<tr>
<td>说说审核</td>
<td>开启后新说说需审核后显示</td>
</tr>
</tbody></table>
<h2 id="管理后台"><a href="#管理后台" class="headerlink" title="管理后台"></a>管理后台</h2><p>管理后台基于 Vue 3 + Vite + TypeScript 构建，采用 macOS 风格 UI，支持暗黑模式、中英文双语切换、自定义主题色。</p>
<p>访问地址：<code>https://your-project.vercel.app/admin/</code></p>
<h3 id="后台功能"><a href="#后台功能" class="headerlink" title="后台功能"></a>后台功能</h3><div class="card-box" style="--card-color:#3b82f6"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">评论管理</span></div><div class="card-box-body"><ul>
<li>评论列表查看与搜索</li>
<li>单条评论编辑（修改内容、置顶权重）</li>
<li>评论审核（通过&#x2F;拒绝）</li>
<li>评论删除</li>
<li>评论状态管理</li>
</ul>
</div></div>
<div class="card-box" style="--card-color:#22c55e"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">说说管理</span></div><div class="card-box-body"><ul>
<li>发布说说（支持 Markdown、表情、标签）</li>
<li>编辑&#x2F;删除说说</li>
<li>说说状态控制</li>
</ul>
</div></div>
<div class="card-box" style="--card-color:#f97316"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">系统设置</span></div><div class="card-box-body"><ul>
<li>头像服务前缀配置（Gravatar &#x2F; Cravatar &#x2F; 自定义）</li>
<li>博主标签显示</li>
<li>评论审核机制</li>
<li>功能开关（点赞、图片灯箱、表情等）</li>
<li>主题色自定义</li>
<li>评论框提示文案</li>
</ul>
</div></div>
<div class="card-box" style="--card-color:#a855f7"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">数据管理</span></div><div class="card-box-body"><ul>
<li>评论数据导出&#x2F;导入（VWD &#x2F; Twikoo &#x2F; Artalk &#x2F; Valine）</li>
<li>系统配置导出&#x2F;导入</li>
<li>访问统计导出&#x2F;导入</li>
<li>全量备份与恢复</li>
<li>S3 自动备份配置</li>
</ul>
</div></div>
<h3 id="多站点管理"><a href="#多站点管理" class="headerlink" title="多站点管理"></a>多站点管理</h3><p>管理后台顶部导航栏提供了站点下拉选择器，用于在多站点之间切换数据视图。在「站点管理」页面可以添加、编辑、删除托管站点，每个站点通过 <code>siteId</code> 进行数据隔离。</p>
<h3 id="使用官方管理后台"><a href="#使用官方管理后台" class="headerlink" title="使用官方管理后台"></a>使用官方管理后台</h3><p>除了自部署的管理后台，你也可以使用官方提供的管理后台（最新版本）：<a href="https://vwd.zishu.me/">https://vwd.zishu.me</a></p>
<p>登陆时填入你的 API 地址、账号和密码。</p>
<h2 id="邮件通知"><a href="#邮件通知" class="headerlink" title="邮件通知"></a>邮件通知</h2><p>VWD 支持 SMTP 邮件通知，新评论和回复会实时推送到管理员邮箱。</p>
<h3 id="支持的邮箱服务"><a href="#支持的邮箱服务" class="headerlink" title="支持的邮箱服务"></a>支持的邮箱服务</h3><p><span class="inline-badge badge-pill" style="--badge-color:#3b82f6">QQ 邮箱</span> <span class="inline-badge badge-pill" style="--badge-color:#22c55e">163 邮箱</span> <span class="inline-badge badge-pill" style="--badge-color:#a855f7">自定义 SMTP</span></p>
<h3 id="配置步骤"><a href="#配置步骤" class="headerlink" title="配置步骤"></a>配置步骤</h3><div class="tabs-container" id="tabs-email-tabs-"><div class="tabs-nav"><button class="tab-label active" data-tab="tabs-email-tabs--1">QQ 邮箱</button><button class="tab-label" data-tab="tabs-email-tabs--2">163 邮箱</button><button class="tab-label" data-tab="tabs-email-tabs--3">自定义 SMTP</button></div><div class="tabs-body"><div class="tab-content active" id="tabs-email-tabs--1"><ol>
<li>登录 QQ 邮箱，进入 undefined</li>
<li>开启 undefined，并获取授权码</li>
<li>在管理后台设置中配置 QQ 邮箱账号和授权码</li>
</ol>
<p><strong>SMTP 配置参考：</strong></p>
<table>
<thead>
<tr>
<th>字段</th>
<th>值</th>
</tr>
</thead>
<tbody><tr>
<td>主机</td>
<td>undefined</td>
</tr>
<tr>
<td>端口</td>
<td>undefined</td>
</tr>
<tr>
<td>安全连接</td>
<td>undefined</td>
</tr>
<tr>
<td>密码</td>
<td>授权码（非 QQ 密码）</td>
</tr>
</tbody></table></div><div class="tab-content" id="tabs-email-tabs--2"><ol>
<li>登录 163 邮箱，进入 undefined</li>
<li>开启 undefined，并获取授权码</li>
<li>在管理后台设置中配置 163 邮箱账号和授权码</li>
</ol></div><div class="tab-content" id="tabs-email-tabs--3"><p>配置自定义 SMTP 邮箱需要以下信息：</p>
<ul>
<li>SMTP 服务器地址</li>
<li>SMTP 服务器端口</li>
<li>发件邮箱账号</li>
<li>邮箱密码或授权码</li>
</ul></div></div></div>
<h3 id="邮件模板变量"><a href="#邮件模板变量" class="headerlink" title="邮件模板变量"></a>邮件模板变量</h3><p>支持自定义 HTML 邮件模板，包含以下变量：</p>
<details class="folding-panel folding-blue" id="fold-d6ck1l"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>回复评论模板变量</span></summary><div class="folding-body"><table>
<thead>
<tr>
<th>变量名</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>${toEmail}</code></td>
<td>收件人邮箱</td>
</tr>
<tr>
<td><code>${toName}</code></td>
<td>收件人昵称</td>
</tr>
<tr>
<td><code>${postTitle}</code></td>
<td>文章标题</td>
</tr>
<tr>
<td><code>${parentComment}</code></td>
<td>被回复的评论内容</td>
</tr>
<tr>
<td><code>${replyAuthor}</code></td>
<td>回复者昵称</td>
</tr>
<tr>
<td><code>${replyContent}</code></td>
<td>回复内容</td>
</tr>
<tr>
<td><code>${postUrl}</code></td>
<td>文章链接</td>
</tr>
</tbody></table>
</div></details>
<details class="folding-panel folding-green" id="fold-alld9b"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>新评论通知模板变量</span></summary><div class="folding-body"><table>
<thead>
<tr>
<th>变量名</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>${postTitle}</code></td>
<td>文章标题</td>
</tr>
<tr>
<td><code>${postUrl}</code></td>
<td>文章链接</td>
</tr>
<tr>
<td><code>${commentAuthor}</code></td>
<td>评论者昵称</td>
</tr>
<tr>
<td><code>${commentContent}</code></td>
<td>评论内容</td>
</tr>
</tbody></table>
</div></details>
<details class="folding-panel folding-default" id="fold-23r0qu"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>orange 评论通过审核通知模板变量</span></summary><div class="folding-body"><table>
<thead>
<tr>
<th>变量名</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>${toName}</code></td>
<td>收件人昵称</td>
</tr>
<tr>
<td><code>${postTitle}</code></td>
<td>文章标题</td>
</tr>
<tr>
<td><code>${commentContent}</code></td>
<td>评论内容</td>
</tr>
<tr>
<td><code>${postUrl}</code></td>
<td>文章链接</td>
</tr>
</tbody></table>
</div></details>
<h2 id="Telegram-通知"><a href="#Telegram-通知" class="headerlink" title="Telegram 通知"></a>Telegram 通知</h2><p>系统支持通过 Telegram 机器人接收新评论通知，并支持快捷审核。</p>
<h3 id="功能特性-1"><a href="#功能特性-1" class="headerlink" title="功能特性"></a>功能特性</h3><ul>
<li><strong>实时通知</strong>：新评论会立即推送到指定的 Telegram 账号或群组</li>
<li><strong>快捷审核</strong>：通知消息包含”批准”按钮，无需登录后台即可审核</li>
</ul>
<h3 id="配置步骤-1"><a href="#配置步骤-1" class="headerlink" title="配置步骤"></a>配置步骤</h3><div class="steps-container" id="steps-10li49"><div class="steps-nav"><button class="step-label active" data-step="steps-10li49-0"><span class="step-num">1</span><span class="step-text">创建机器人</span></button><button class="step-label" data-step="steps-10li49-1"><span class="step-num">2</span><span class="step-text">获取 Chat ID</span></button><button class="step-label" data-step="steps-10li49-2"><span class="step-num">3</span><span class="step-text">后台设置</span></button></div><div class="steps-body"><div class="step-content active" id="steps-10li49-0"><ul>
<li>在 Telegram 中搜索 undefined</li>
<li>发送 undefined 命令，按照提示创建新机器人</li>
<li>获取 <strong>API Token</strong></li>
</ul></div><div class="step-content" id="steps-10li49-1"><ul>
<li>如果是个人接收，给你的机器人发送一条消息</li>
<li>访问 undefined 查看 undefined</li>
<li>或者使用 undefined 获取你的 ID</li>
<li>如果是群组，将机器人拉入群组，并获取群组 ID（通常以 undefined 开头）</li>
</ul></div><div class="step-content" id="steps-10li49-2"><ul>
<li>登录评论系统后台</li>
<li>进入”设置” → “Telegram 通知设置”</li>
<li>填入 <strong>Bot Token</strong> 和 <strong>Chat ID</strong></li>
<li>开启 <strong>Telegram 通知</strong> 开关</li>
<li>点击 <strong>保存</strong></li>
<li>点击 <strong>一键设置 Webhook</strong>（重要：必须执行此步骤，机器人才能接收按钮点击事件）</li>
</ul></div></div></div>
<div class="note-danger custom-block cb-danger"><div class="custom-block-header"><i class="fas fa-circle-xmark"></i><span class="custom-block-title">重要提示</span></div><div class="custom-block-body"><p>配置完成后，必须点击「一键设置 Webhook」按钮，否则 Telegram 机器人无法接收按钮点击事件，快捷审核功能将无法使用。</p>
</div></div>
<h2 id="安全设置"><a href="#安全设置" class="headerlink" title="安全设置"></a>安全设置</h2><p>VWD 提供多维度的安全防护机制，有效防范垃圾评论与恶意攻击。</p>
<h3 id="管理员评论密钥"><a href="#管理员评论密钥" class="headerlink" title="管理员评论密钥"></a>管理员评论密钥</h3><p>设置管理员评论密钥后，博主在前台使用管理员邮箱发表评论时，需要先输入正确的密钥进行身份验证。验证通过的评论将直接视为已审核，通过「先审核再显示」的限制。</p>
<div class="note-warning custom-block cb-warning"><div class="custom-block-header"><i class="fas fa-triangle-exclamation"></i><span class="custom-block-title">安全机制</span></div><div class="custom-block-body"><ul>
<li>同一 IP 连续验证失败 3 次后，将触发风控并锁定该 IP 30 分钟</li>
<li>失败次数的统计有效期为 1 小时，超过 1 小时未再尝试会自动清零</li>
</ul>
</div></div>
<h3 id="其他安全配置"><a href="#其他安全配置" class="headerlink" title="其他安全配置"></a>其他安全配置</h3><div class="card-box" style="--card-color:#ef4444"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">域名白名单</span></div><div class="card-box-body"><p>配置允许调用的域名，多个域名用逗号或换行分隔，留空表示不做限制。配置后，仅当当前访问页面的域名在列表中时，前台评论组件才会正常加载。</p>
</div></div>
<div class="card-box" style="--card-color:#f97316"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">评论审核</span></div><div class="card-box-body"><p>开启后，普通用户提交的新评论默认状态为”待审核”，需在后台审核通过后才会显示。关闭时，新评论将在通过基础校验后直接公开展示。</p>
</div></div>
<div class="card-box" style="--card-color:#ef4444"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">IP 黑名单</span></div><div class="card-box-body"><p>支持多个 IP，用逗号或换行分隔，留空表示不限制。匹配到的 IP 在提交评论时会被直接拒绝，适合用于临时封禁恶意刷评或攻击来源。</p>
</div></div>
<div class="card-box" style="--card-color:#ef4444"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">邮箱黑名单</span></div><div class="card-box-body"><p>支持多个邮箱，用逗号或换行分隔，留空表示不限制。匹配到的邮箱在提交评论时会被直接拒绝，适合用于屏蔽垃圾邮箱或可疑机器人账号。</p>
</div></div>
<h2 id="数据迁移与备份"><a href="#数据迁移与备份" class="headerlink" title="数据迁移与备份"></a>数据迁移与备份</h2><h3 id="评论数据迁移"><a href="#评论数据迁移" class="headerlink" title="评论数据迁移"></a>评论数据迁移</h3><p>VWD 支持从其他评论框架导入数据，方便无缝切换。</p>
<p><span class="inline-badge badge-pill" style="--badge-color:#3b82f6">VWD</span> <span class="inline-badge badge-pill" style="--badge-color:#22c55e">Twikoo</span> <span class="inline-badge badge-pill" style="--badge-color:#f97316">Artalk</span> <span class="inline-badge badge-pill" style="--badge-color:#a855f7">Valine</span></p>
<p><strong>使用方法：</strong></p>
<p>在 <code>后台管理 &gt; 数据管理 &gt; 评论数据</code> 区块下：</p>
<ul>
<li>使用「导出 JSON」按钮，可导出当前所有评论数据（VWD 原生格式），用于备份或在其他环境恢复</li>
<li>使用「导入评论」按钮，先在下拉框中选择要导入的框架类型，再选择本地 JSON 文件进行导入</li>
</ul>
<div class="note-tip custom-block cb-tip"><div class="custom-block-header"><i class="fas fa-lightbulb"></i><span class="custom-block-title">智能匹配</span></div><div class="custom-block-body"><p>迁移程序会自动判断是否包含域名前缀（因部分框架默认不输出域名前缀），然后可以自定义前缀。</p>
</div></div>
<h3 id="其他数据导入导出"><a href="#其他数据导入导出" class="headerlink" title="其他数据导入导出"></a>其他数据导入导出</h3><p>在 <code>后台管理 &gt; 数据管理</code> 页面，还提供以下操作：</p>
<ul>
<li><strong>系统配置</strong>：导出 &#x2F; 导入 Settings 表中的配置（评论设置、邮件设置、功能开关等）</li>
<li><strong>访问统计</strong>：导出 &#x2F; 导入页面访问量、按日访问和点赞明细</li>
<li><strong>全量备份</strong>：一键导出或导入「评论 + 配置 + 统计」全部数据，适合整站迁移或备份恢复</li>
</ul>
<h3 id="S3-自动备份"><a href="#S3-自动备份" class="headerlink" title="S3 自动备份"></a>S3 自动备份</h3><p>VWD 支持 S3 兼容存储自动备份，兼容 AWS S3 &#x2F; Cloudflare R2 &#x2F; MinIO。</p>
<div class="btn-group btn-group-rounded btn-group-center"><a href="https://aws.amazon.com/s3/" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-cloud"></i> AWS S3</a><a href="https://www.cloudflare.com/products/r2/" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-cloud"></i> Cloudflare R2</a><a href="https://min.io/" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-cloud"></i> MinIO</a></div>
<p><strong>配置 S3：</strong></p>
<p>在后台「设置」→「S3 备份配置」中填写：</p>
<table>
<thead>
<tr>
<th>字段</th>
<th>说明</th>
<th>示例</th>
</tr>
</thead>
<tbody><tr>
<td>Endpoint</td>
<td>S3 服务地址</td>
<td><code>https://s3.amazonaws.com</code></td>
</tr>
<tr>
<td>Region</td>
<td>区域</td>
<td><code>us-east-1</code></td>
</tr>
<tr>
<td>Bucket</td>
<td>存储桶名</td>
<td><code>vwd-backup</code></td>
</tr>
<tr>
<td>Access Key</td>
<td>访问密钥 ID</td>
<td><code>your-access-key</code></td>
</tr>
<tr>
<td>Secret Key</td>
<td>访问密钥</td>
<td><code>your-secret-key</code></td>
</tr>
</tbody></table>
<p><strong>使用方式：</strong></p>
<ul>
<li><strong>手动备份</strong>：点击「立即备份」按钮触发一次备份</li>
<li><strong>备份列表</strong>：查看历史备份文件，支持下载和删除</li>
<li><strong>恢复</strong>：选择备份文件进行恢复</li>
</ul>
<h2 id="功能开关"><a href="#功能开关" class="headerlink" title="功能开关"></a>功能开关</h2><p>在 <code>网站设置</code> &gt; <code>功能开关</code> 中，可以控制各项功能的开启状态和个性化配置。</p>
<h3 id="点赞功能"><a href="#点赞功能" class="headerlink" title="点赞功能"></a>点赞功能</h3><table>
<thead>
<tr>
<th>功能</th>
<th>说明</th>
<th>默认状态</th>
</tr>
</thead>
<tbody><tr>
<td>评论点赞</td>
<td>用户可以对评论进行点赞操作</td>
<td>开启</td>
</tr>
<tr>
<td>文章点赞</td>
<td>每篇文章底部显示点赞按钮</td>
<td>开启</td>
</tr>
<tr>
<td>说说点赞</td>
<td>用户可以对说说进行点赞操作</td>
<td>开启</td>
</tr>
</tbody></table>
<h3 id="图片预览"><a href="#图片预览" class="headerlink" title="图片预览"></a>图片预览</h3><p>控制是否启用评论内容中图片的灯箱预览功能。开启后，评论中的图片可以点击放大查看，再次点击关闭。功能默认关闭，可根据需要开启。</p>
<h3 id="表情系统"><a href="#表情系统" class="headerlink" title="表情系统"></a>表情系统</h3><ul>
<li><strong>表情开关</strong>：控制是否启用表情功能，开启后评论框中会显示表情选择器</li>
<li><strong>自定义表情包路径</strong>：支持配置自定义表情包路径（Waline 风格），可使用 unpkg 等 CDN 地址。内置阿鲁表情包和颜文字</li>
</ul>
<h3 id="个性化设置"><a href="#个性化设置" class="headerlink" title="个性化设置"></a>个性化设置</h3><ul>
<li><strong>评论框提示文案</strong>：自定义评论输入框的提示文字，支持换行，留空则使用默认值”发表你的看法…”</li>
<li><strong>主题色</strong>：自定义评论组件的主题色（hex 格式），如 <code>#0969da</code>，也可在前端实例化时通过 <code>primaryColor</code> 参数指定</li>
</ul>
<h2 id="API-概览"><a href="#API-概览" class="headerlink" title="API 概览"></a>API 概览</h2><h3 id="公开-API"><a href="#公开-API" class="headerlink" title="公开 API"></a>公开 API</h3><table>
<thead>
<tr>
<th>方法</th>
<th>路径</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>GET</td>
<td><code>/api/comments</code></td>
<td>获取评论列表</td>
</tr>
<tr>
<td>POST</td>
<td><code>/api/comments</code></td>
<td>提交评论</td>
</tr>
<tr>
<td>POST</td>
<td><code>/api/comments/like</code></td>
<td>评论点赞</td>
</tr>
<tr>
<td>DELETE</td>
<td><code>/api/comments/like</code></td>
<td>取消评论点赞</td>
</tr>
<tr>
<td>POST</td>
<td><code>/api/verify-admin</code></td>
<td>管理员评论验证</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/like</code></td>
<td>获取文章点赞状态</td>
</tr>
<tr>
<td>POST</td>
<td><code>/api/like</code></td>
<td>文章点赞</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/says</code></td>
<td>获取说说列表</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/says/:id</code></td>
<td>获取单条说说</td>
</tr>
<tr>
<td>POST</td>
<td><code>/api/says/like</code></td>
<td>说说点赞</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/config/comments</code></td>
<td>获取公开配置（含表情包路径）</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/health</code></td>
<td>健康检查</td>
</tr>
</tbody></table>
<h3 id="管理-API（需鉴权）"><a href="#管理-API（需鉴权）" class="headerlink" title="管理 API（需鉴权）"></a>管理 API（需鉴权）</h3><table>
<thead>
<tr>
<th>方法</th>
<th>路径</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>POST</td>
<td><code>/api/admin/login</code></td>
<td>管理员登录</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/admin/comments/list</code></td>
<td>评论列表</td>
</tr>
<tr>
<td>DELETE</td>
<td><code>/api/admin/comments/delete</code></td>
<td>删除评论</td>
</tr>
<tr>
<td>PUT</td>
<td><code>/api/admin/comments/status</code></td>
<td>更新评论状态</td>
</tr>
<tr>
<td>PUT</td>
<td><code>/api/admin/comments/update</code></td>
<td>编辑评论</td>
</tr>
<tr>
<td>GET&#x2F;PUT</td>
<td><code>/api/admin/settings/*</code></td>
<td>各项设置</td>
</tr>
<tr>
<td>GET&#x2F;POST</td>
<td><code>/api/admin/export/*</code></td>
<td>数据导出</td>
</tr>
<tr>
<td>POST</td>
<td><code>/api/admin/import/*</code></td>
<td>数据导入</td>
</tr>
<tr>
<td>GET</td>
<td><code>/api/admin/stats/*</code></td>
<td>评论统计</td>
</tr>
<tr>
<td>GET&#x2F;POST&#x2F;PUT&#x2F;DELETE</td>
<td><code>/api/admin/says/*</code></td>
<td>说说管理</td>
</tr>
<tr>
<td>GET&#x2F;PUT</td>
<td><code>/api/admin/settings/says</code></td>
<td>说说设置</td>
</tr>
</tbody></table>
<div class="note-warning custom-block cb-warning"><div class="custom-block-header"><i class="fas fa-triangle-exclamation"></i><span class="custom-block-title">鉴权说明</span></div><div class="custom-block-body"><p>所有管理 API（除 login 外）需在请求头中携带 <code>Authorization: Bearer &lt;token&gt;</code>。</p>
</div></div>
<h2 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h2><table>
<thead>
<tr>
<th>变量</th>
<th>必需</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>POSTGRES_URL</code></td>
<td>是</td>
<td>Vercel Postgres 连接地址（Vercel 自动注入）</td>
</tr>
<tr>
<td><code>KV_REST_API_URL</code></td>
<td>是</td>
<td>Vercel KV REST API 地址（Vercel 自动注入）</td>
</tr>
<tr>
<td><code>KV_REST_API_TOKEN</code></td>
<td>是</td>
<td>Vercel KV REST API Token（Vercel 自动注入）</td>
</tr>
</tbody></table>
<div class="note-tip custom-block cb-tip"><div class="custom-block-header"><i class="fas fa-lightbulb"></i><span class="custom-block-title">无需环境变量的配置</span></div><div class="custom-block-body"><p>管理员账号和密码在部署后通过 <code>/admin/</code> 页面首次设置，存储在数据库中。以下配置均在 Admin 后台的设置页面中配置：</p>
<ul>
<li><strong>管理员账户</strong>：首次部署时通过页面设置</li>
<li><strong>SMTP 配置</strong>：发件邮箱、SMTP 服务器、端口、授权码</li>
<li><strong>Telegram 配置</strong>：Bot Token、Chat ID</li>
<li><strong>S3 配置</strong>：Endpoint、Region、Bucket、Access Key、Secret Key</li>
</ul>
</div></div>
<h2 id="数据库表结构"><a href="#数据库表结构" class="headerlink" title="数据库表结构"></a>数据库表结构</h2><table>
<thead>
<tr>
<th>表名</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>Comment</code></td>
<td>评论数据（昵称、邮箱、内容、状态、点赞数等）</td>
</tr>
<tr>
<td><code>Settings</code></td>
<td>系统设置（键值对存储）</td>
</tr>
<tr>
<td><code>Likes</code></td>
<td>点赞记录（文章点赞、说说点赞，按 user_id 去重）</td>
</tr>
<tr>
<td><code>Say</code></td>
<td>说说&#x2F;动态（Markdown 内容、状态、标签等）</td>
</tr>
</tbody></table>
<h2 id="本地开发"><a href="#本地开发" class="headerlink" title="本地开发"></a>本地开发</h2><details class="folding-panel folding-blue" id="fold-sj584a"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>本地开发命令</span></summary><div class="folding-body"><p>CODE14</p>
<blockquote>
<p>项目包含三个独立的 <code>package.json</code>（根目录服务端、<code>admin/</code> 后台前端、<code>widget/</code> 评论组件），<code>npm run install:all</code> 会一次性安装全部三个目录的依赖。</p>
<p>Admin 和 Widget 通过 <code>@shared</code> 别名引用 <code>scripts/emoji.js</code> 中的共享表情逻辑。Vite 配置中 <code>@shared</code> 分别指向 <code>../scripts</code>。</p>
</blockquote>
</div></details>
<details class="folding-panel folding-green" id="fold-xar633"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>构建脚本</span></summary><div class="folding-body"><p>CODE15</p>
<blockquote>
<p>表情图片资源（<code>public/emotion/</code>）已随仓库提交，构建时无需额外复制步骤。</p>
</blockquote>
</div></details>
<h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><details class="folding-panel folding-default" id="fold-bmchee"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>设置完 siteId 后，评论区不显示旧的评论数据？</span></summary><div class="folding-body"><p>因为设置了 siteId 后，接口会根据 siteId 来查询数据库带有你设置的 siteId 的评论数据。旧数据需要手动去 Vercel Postgres 控制台执行 SQL 语句来更新：</p>
<p>CODE16</p>
<p>运行以上 SQL 语句后，评论区就会显示带有 <code>abc</code> siteId 的评论数据了。</p>
</div></details>
<details class="folding-panel folding-default" id="fold-807bza"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>评论框不显示</span></summary><div class="folding-body"><ul>
<li>检查浏览器控制台是否有报错</li>
<li>确认 <code>apiBaseUrl</code> 地址正确，<strong>末尾不要加 <code>/</code></strong></li>
<li>确认 <code>vwd.js</code> 能正常加载（在浏览器地址栏直接访问该 URL）</li>
<li>确认 <code>el</code> 选择器对应的元素存在于页面中</li>
</ul>
</div></details>
<details class="folding-panel folding-default" id="fold-0xijh3"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>评论提交后不显示</span></summary><div class="folding-body"><ul>
<li>登录管理后台 <code>/admin/</code>，检查是否开启了「评论审核」（开启后新评论需手动审批）</li>
<li>检查评论是否被 <code>IP/邮箱黑名单</code> 拦截</li>
</ul>
</div></details>
<details class="folding-panel folding-default" id="fold-2tlbj7"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>指定文章的自定义标识</span></summary><div class="folding-body"><p>默认情况下，VWD 使用页面路径（<code>window.location.pathname</code>）作为文章标识。如果你的文章 URL 变了（比如换了域名或路径结构），评论会丢失。可以通过显式指定 <code>postSlug</code> 来固定标识：</p>
<p>CODE17</p>
</div></details>
<details class="folding-panel folding-default" id="fold-p4exj7"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>邮件通知不生效</span></summary><div class="folding-body"><ul>
<li>在 <code>/admin/settings</code> 中正确配置 SMTP 服务器、端口、发件邮箱、授权码</li>
<li>注意 QQ 邮箱使用授权码而非密码，163 邮箱同理</li>
<li>检查服务器是否屏蔽了邮件端口</li>
</ul>
</div></details>
<details class="folding-panel folding-default" id="fold-ak0oo4"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>Telegram 通知不生效</span></summary><div class="folding-body"><ul>
<li>在 <code>/admin/settings</code> 中配置 Bot Token 和 Chat ID</li>
<li>Chat ID 可以通过给 @userinfobot 发消息获取</li>
<li>确认 Bot 已被加入到目标群组（如果发到群组）</li>
<li>确认已点击「一键设置 Webhook」</li>
</ul>
</div></details>
<details class="folding-panel folding-default" id="fold-503dth"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>Vercel 构建报 SyntaxError</span></summary><div class="folding-body"><p>确保修改的源文件使用 UTF-8 编码（无 BOM），否则 Vercel 构建时可能报 <code>SyntaxError: Invalid or unexpected token</code>。</p>
</div></details>
<details class="folding-panel folding-default" id="fold-2pfs4i"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>文档站如何访问</span></summary><div class="folding-body"><p>部署成功后，文档站地址为：</p>
<p>CODE18</p>
<p>也可以通过 <code>/doc</code>（不带斜杠）访问，会自动重定向到 <code>/doc/</code>。</p>
</div></details>
<h2 id="后续更新"><a href="#后续更新" class="headerlink" title="后续更新"></a>后续更新</h2><p>GitHub 仓库推送代码后，Vercel 会<strong>自动拉取并重新构建部署</strong>，无需任何手动操作。</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span>
<span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"update: your changes"</span>
<span class="token function">git</span> push origin main
<span class="token comment"># Vercel 自动触发部署</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<div class="note-warning custom-block cb-warning"><div class="custom-block-header"><i class="fas fa-triangle-exclamation"></i><span class="custom-block-title">编码注意</span></div><div class="custom-block-body"><p>确保修改的源文件使用 UTF-8 编码（无 BOM），否则 Vercel 构建时可能报 <code>SyntaxError: Invalid or unexpected token</code>。</p>
</div></div>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>VWD 评论系统是一款基于 Vercel Serverless 平台的免服务器、极速安全、即插即用评论系统，具有以下优势：</p>
<table>
<thead>
<tr>
<th>特性</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><span class="inline-badge badge-pill" style="--badge-color:#22c55e">免费</span></td>
<td>基于 Vercel 免费计划，个人博客部署成本为零</td>
</tr>
<tr>
<td><span class="inline-badge badge-pill" style="--badge-color:#3b82f6">快速</span></td>
<td>Vercel 边缘网络全球 CDN 加速，毫秒级响应</td>
</tr>
<tr>
<td><span class="inline-badge badge-pill" style="--badge-color:#ef4444">安全</span></td>
<td>IP&#x2F;邮箱黑名单、域名白名单、评论审核、XSS 过滤</td>
</tr>
<tr>
<td><span class="inline-badge badge-pill" style="--badge-color:#a855f7">功能丰富</span></td>
<td>评论、说说、点赞、表情、邮件通知、Telegram 通知</td>
</tr>
<tr>
<td><span class="inline-badge badge-pill" style="--badge-color:#f97316">易集成</span></td>
<td>一行代码嵌入，Shadow DOM 样式隔离，支持多种框架</td>
</tr>
<tr>
<td><span class="inline-badge badge-pill" style="--badge-color:#06b6d4">可迁移</span></td>
<td>支持 Twikoo、Artalk、Valine 数据导入，S3 自动备份</td>
</tr>
</tbody></table>
<p>如果你喜欢这个项目，欢迎在 GitHub 上 Star 支持！</p>
<div class="btn-group btn-group-rounded btn-group-center"><a href="https://github.com/s-Ruthless/Vercel-Workers-Discuss" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-star"></i> Star 支持</a><a href="https://github.com/s-Ruthless/Vercel-Workers-Discuss/issues" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-comment"></i> 问题反馈</a></div>
<div class="article-divider-fancy"><span class="divider-line"></span><i class="fas fa-heart"></i><span class="divider-text">VWD</span><span class="divider-line"></span></div>
]]></description>
      <category>技术</category>
      <author>梦繁星</author>
    </item>
    <item>
      <title>代码语法高亮样式演示</title>
      <link>https://moeao.cn/posts/7672e062.html</link>
      <guid isPermaLink="true">https://moeao.cn/posts/7672e062.html</guid>
      <pubDate>Sun, 12 Jul 2026 18:00:00 GMT</pubDate>
      <description><![CDATA[<p>本文用于演示 moeMac 主题所有语言的代码高亮样式，包括浅色（GitHub Light）和暗色（Tokyo Night）两套配色。你可以切换主题来对比效果。</p>
<span id="more"></span>

<h2 id="JavaScript"><a href="#JavaScript" class="headerlink" title="JavaScript"></a>JavaScript</h2><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">// JavaScript 示例 — 涵盖各种语法元素</span>
<span class="token keyword">import</span> <span class="token punctuation">&#123;</span> useState<span class="token punctuation">,</span> useEffect <span class="token punctuation">&#125;</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token operator">*</span> <span class="token keyword">as</span> utils <span class="token keyword">from</span> <span class="token string">'./utils'</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> <span class="token constant">API_URL</span> <span class="token operator">=</span> <span class="token string">'https://api.example.com/v2'</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> <span class="token constant">TIMEOUT</span> <span class="token operator">=</span> <span class="token number">5000</span><span class="token punctuation">;</span>

<span class="token comment">/**
 * 异步获取用户数据
 * @param &#123;number&#125; id - 用户 ID
 * @returns &#123;Promise&lt;Object>&#125; 用户信息
 */</span>
<span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">fetchUser</span><span class="token punctuation">(</span><span class="token parameter">id</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">$&#123;API_URL&#125;/users/$&#123;id&#125;</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span> <span class="token punctuation">&#123;</span>
      <span class="token literal-property property">method</span><span class="token operator">:</span> <span class="token string">'GET'</span><span class="token punctuation">,</span>
      <span class="token literal-property property">headers</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span> <span class="token string-property property">'Authorization'</span><span class="token operator">:</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Bearer $&#123;token&#125;</span><span class="token template-punctuation string">`</span></span> <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
      <span class="token literal-property property">signal</span><span class="token operator">:</span> AbortSignal<span class="token punctuation">.</span><span class="token function">timeout</span><span class="token punctuation">(</span><span class="token constant">TIMEOUT</span><span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>response<span class="token punctuation">.</span>ok<span class="token punctuation">)</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Error</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">HTTP $&#123;response.status&#125;</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> data <span class="token operator">=</span> <span class="token keyword">await</span> response<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token punctuation">&#123;</span> <span class="token operator">...</span>data<span class="token punctuation">,</span> <span class="token literal-property property">fetchedAt</span><span class="token operator">:</span> Date<span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>err<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    console<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">'Fetch failed:'</span><span class="token punctuation">,</span> err<span class="token punctuation">.</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">class</span> <span class="token class-name">UserStore</span> <span class="token punctuation">&#123;</span>
  #users <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Map</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token function">add</span><span class="token punctuation">(</span><span class="token parameter">user</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>#users<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>user<span class="token punctuation">.</span>id<span class="token punctuation">,</span> user<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>

  <span class="token function">get</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>#users<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token operator">??</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>

  <span class="token keyword">get</span> <span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>#users<span class="token punctuation">.</span>size<span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">UserStore</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> numbers <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token parameter">n</span> <span class="token operator">=></span> n <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token parameter">n</span> <span class="token operator">=></span> n <span class="token operator">></span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> regex <span class="token operator">=</span> <span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^https?:\/\/[\w.-]+</span><span class="token regex-delimiter">/</span><span class="token regex-flags">i</span></span><span class="token punctuation">;</span>
<span class="token keyword">const</span> template <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Total: $&#123;numbers.length&#125; items</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="TypeScript"><a href="#TypeScript" class="headerlink" title="TypeScript"></a>TypeScript</h2><pre class="line-numbers language-typescript" data-language="typescript"><code class="language-typescript"><span class="token comment">// TypeScript 示例 — 泛型、接口、类型守卫</span>
<span class="token keyword">interface</span> <span class="token class-name">User<span class="token operator">&lt;</span><span class="token constant">T</span> <span class="token keyword">extends</span> Record<span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token builtin">unknown</span><span class="token operator">>></span></span> <span class="token punctuation">&#123;</span>
  id<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
  name<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
  email<span class="token operator">?</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>
  metadata<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">;</span>
  roles<span class="token operator">:</span> ReadonlyArray<span class="token operator">&lt;</span><span class="token string">'admin'</span> <span class="token operator">|</span> <span class="token string">'user'</span> <span class="token operator">|</span> <span class="token string">'guest'</span><span class="token operator">></span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">type</span> <span class="token class-name">UserStatus</span> <span class="token operator">=</span> <span class="token string">'active'</span> <span class="token operator">|</span> <span class="token string">'inactive'</span> <span class="token operator">|</span> <span class="token string">'banned'</span><span class="token punctuation">;</span>
<span class="token keyword">type</span> <span class="token class-name">UserFilter</span> <span class="token operator">=</span> Partial<span class="token operator">&lt;</span>Pick<span class="token operator">&lt;</span>User<span class="token operator">&lt;</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token operator">></span><span class="token punctuation">,</span> <span class="token string">'name'</span> <span class="token operator">|</span> <span class="token string">'email'</span><span class="token operator">>></span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">isUser</span><span class="token punctuation">(</span>obj<span class="token operator">:</span> <span class="token builtin">unknown</span><span class="token punctuation">)</span><span class="token operator">:</span> obj <span class="token keyword">is</span> User<span class="token operator">&lt;</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">return</span> <span class="token keyword">typeof</span> obj <span class="token operator">===</span> <span class="token string">'object'</span> <span class="token operator">&amp;&amp;</span> obj <span class="token operator">!==</span> <span class="token keyword">null</span> <span class="token operator">&amp;&amp;</span> <span class="token string">'id'</span> <span class="token keyword">in</span> obj <span class="token operator">&amp;&amp;</span> <span class="token string">'name'</span> <span class="token keyword">in</span> obj<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">function</span> <span class="token generic-function"><span class="token function">processUsers</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token constant">T</span> <span class="token keyword">extends</span> User<span class="token operator">&lt;</span><span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token operator">>></span></span></span><span class="token punctuation">(</span>
  users<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  <span class="token function-variable function">filter</span><span class="token operator">:</span> <span class="token punctuation">(</span>u<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token builtin">boolean</span>
<span class="token punctuation">)</span><span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">return</span> users<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>filter<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span>u <span class="token operator">=></span> <span class="token punctuation">(</span><span class="token punctuation">&#123;</span> <span class="token operator">...</span>u<span class="token punctuation">,</span> processed<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">enum</span> Direction <span class="token punctuation">&#123;</span>
  Up <span class="token operator">=</span> <span class="token string">'UP'</span><span class="token punctuation">,</span>
  Down <span class="token operator">=</span> <span class="token string">'DOWN'</span><span class="token punctuation">,</span>
  Left <span class="token operator">=</span> <span class="token string">'LEFT'</span><span class="token punctuation">,</span>
  Right <span class="token operator">=</span> <span class="token string">'RIGHT'</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">Animal<span class="token operator">&lt;</span><span class="token constant">T</span> <span class="token keyword">extends</span> <span class="token builtin">string</span><span class="token operator">></span></span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">abstract</span> <span class="token keyword">readonly</span> species<span class="token operator">:</span> <span class="token constant">T</span><span class="token punctuation">;</span>
  <span class="token function">constructor</span><span class="token punctuation">(</span><span class="token keyword">public</span> name<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">,</span> <span class="token keyword">protected</span> age<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>

  <span class="token keyword">abstract</span> <span class="token function">makeSound</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span>

  <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">string</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">return</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">$&#123;this.species&#125;($&#123;this.name&#125;, $&#123;this.age&#125;)</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Python"><a href="#Python" class="headerlink" title="Python"></a>Python</h2><pre class="line-numbers language-python" data-language="python"><code class="language-python"><span class="token comment"># Python 示例 — 装饰器、类型提示、异步</span>
<span class="token keyword">from</span> __future__ <span class="token keyword">import</span> annotations
<span class="token keyword">import</span> asyncio
<span class="token keyword">from</span> dataclasses <span class="token keyword">import</span> dataclass<span class="token punctuation">,</span> field
<span class="token keyword">from</span> typing <span class="token keyword">import</span> Generic<span class="token punctuation">,</span> TypeVar<span class="token punctuation">,</span> Callable<span class="token punctuation">,</span> Awaitable
<span class="token keyword">from</span> functools <span class="token keyword">import</span> wraps

T <span class="token operator">=</span> TypeVar<span class="token punctuation">(</span><span class="token string">'T'</span><span class="token punctuation">)</span>

<span class="token keyword">def</span> <span class="token function">retry</span><span class="token punctuation">(</span>max_attempts<span class="token punctuation">:</span> <span class="token builtin">int</span> <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    <span class="token triple-quoted-string string">"""重试装饰器"""</span>
    <span class="token keyword">def</span> <span class="token function">decorator</span><span class="token punctuation">(</span>func<span class="token punctuation">:</span> Callable<span class="token punctuation">[</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> Awaitable<span class="token punctuation">[</span>T<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> Callable<span class="token punctuation">[</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">,</span> Awaitable<span class="token punctuation">[</span>T<span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">:</span>
        <span class="token decorator annotation punctuation">@wraps</span><span class="token punctuation">(</span>func<span class="token punctuation">)</span>
        <span class="token keyword">async</span> <span class="token keyword">def</span> <span class="token function">wrapper</span><span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">**</span>kwargs<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> T<span class="token punctuation">:</span>
            last_error <span class="token operator">=</span> <span class="token boolean">None</span>
            <span class="token keyword">for</span> attempt <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> max_attempts <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
                <span class="token keyword">try</span><span class="token punctuation">:</span>
                    <span class="token keyword">return</span> <span class="token keyword">await</span> func<span class="token punctuation">(</span><span class="token operator">*</span>args<span class="token punctuation">,</span> <span class="token operator">**</span>kwargs<span class="token punctuation">)</span>
                <span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>
                    last_error <span class="token operator">=</span> e
                    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Attempt </span><span class="token interpolation"><span class="token punctuation">&#123;</span>attempt<span class="token punctuation">&#125;</span></span><span class="token string">/</span><span class="token interpolation"><span class="token punctuation">&#123;</span>max_attempts<span class="token punctuation">&#125;</span></span><span class="token string"> failed: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>e<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
            <span class="token keyword">raise</span> last_error
        <span class="token keyword">return</span> wrapper
    <span class="token keyword">return</span> decorator

<span class="token decorator annotation punctuation">@dataclass</span>
<span class="token keyword">class</span> <span class="token class-name">Point</span><span class="token punctuation">(</span>Generic<span class="token punctuation">[</span>T<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
    x<span class="token punctuation">:</span> T
    y<span class="token punctuation">:</span> T
    tags<span class="token punctuation">:</span> <span class="token builtin">list</span><span class="token punctuation">[</span><span class="token builtin">str</span><span class="token punctuation">]</span> <span class="token operator">=</span> field<span class="token punctuation">(</span>default_factory<span class="token operator">=</span><span class="token builtin">list</span><span class="token punctuation">)</span>

    <span class="token keyword">def</span> <span class="token function">distance_to</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> other<span class="token punctuation">:</span> Point<span class="token punctuation">[</span>T<span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">float</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>self<span class="token punctuation">.</span>x <span class="token operator">-</span> other<span class="token punctuation">.</span>x<span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span> <span class="token operator">+</span> <span class="token punctuation">(</span>self<span class="token punctuation">.</span>y <span class="token operator">-</span> other<span class="token punctuation">.</span>y<span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">**</span> <span class="token number">0.5</span>

    <span class="token keyword">def</span> <span class="token function">__repr__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">str</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> <span class="token string-interpolation"><span class="token string">f"Point(</span><span class="token interpolation"><span class="token punctuation">&#123;</span>self<span class="token punctuation">.</span>x<span class="token punctuation">&#125;</span></span><span class="token string">, </span><span class="token interpolation"><span class="token punctuation">&#123;</span>self<span class="token punctuation">.</span>y<span class="token punctuation">&#125;</span></span><span class="token string">)"</span></span>

<span class="token keyword">class</span> <span class="token class-name">Fibonacci</span><span class="token punctuation">:</span>
    <span class="token triple-quoted-string string">"""无限斐波那契数列迭代器"""</span>

    <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
        self<span class="token punctuation">.</span>_a<span class="token punctuation">,</span> self<span class="token punctuation">.</span>_b <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span>

    <span class="token keyword">def</span> <span class="token function">__iter__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
        <span class="token keyword">return</span> self

    <span class="token keyword">def</span> <span class="token function">__next__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>
        value <span class="token operator">=</span> self<span class="token punctuation">.</span>_a
        self<span class="token punctuation">.</span>_a<span class="token punctuation">,</span> self<span class="token punctuation">.</span>_b <span class="token operator">=</span> self<span class="token punctuation">.</span>_b<span class="token punctuation">,</span> self<span class="token punctuation">.</span>_a <span class="token operator">+</span> self<span class="token punctuation">.</span>_b
        <span class="token keyword">return</span> value

<span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>
    fib <span class="token operator">=</span> Fibonacci<span class="token punctuation">(</span><span class="token punctuation">)</span>
    first_ten <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token builtin">next</span><span class="token punctuation">(</span>fib<span class="token punctuation">)</span> <span class="token keyword">for</span> _ <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"First 10 Fibonacci: </span><span class="token interpolation"><span class="token punctuation">&#123;</span>first_ten<span class="token punctuation">&#125;</span></span><span class="token string">"</span></span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="CSS"><a href="#CSS" class="headerlink" title="CSS"></a>CSS</h2><pre class="line-numbers language-css" data-language="css"><code class="language-css"><span class="token comment">/* CSS 示例 — 变量、嵌套、动画 */</span>
<span class="token selector">:root</span> <span class="token punctuation">&#123;</span>
  <span class="token property">--primary</span><span class="token punctuation">:</span> #007aff<span class="token punctuation">;</span>
  <span class="token property">--radius</span><span class="token punctuation">:</span> 12px<span class="token punctuation">;</span>
  <span class="token property">--shadow</span><span class="token punctuation">:</span> 0 4px 16px <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.08<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token selector">.card</span> <span class="token punctuation">&#123;</span>
  <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
  <span class="token property">flex-direction</span><span class="token punctuation">:</span> column<span class="token punctuation">;</span>
  <span class="token property">gap</span><span class="token punctuation">:</span> 16px<span class="token punctuation">;</span>
  <span class="token property">padding</span><span class="token punctuation">:</span> 24px<span class="token punctuation">;</span>
  <span class="token property">border-radius</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--radius<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token function">linear-gradient</span><span class="token punctuation">(</span>135deg<span class="token punctuation">,</span> #fff 0%<span class="token punctuation">,</span> #f8f9fa 100%<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">box-shadow</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--shadow<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">transition</span><span class="token punctuation">:</span> transform 0.3s ease<span class="token punctuation">,</span> box-shadow 0.3s ease<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token selector">.card:hover</span> <span class="token punctuation">&#123;</span>
  <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateY</span><span class="token punctuation">(</span>-4px<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 8px 32px <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.12<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token selector">.card__title</span> <span class="token punctuation">&#123;</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 1.5rem<span class="token punctuation">;</span>
  <span class="token property">font-weight</span><span class="token punctuation">:</span> 700<span class="token punctuation">;</span>
  <span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--primary<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token selector">.card__title::after</span> <span class="token punctuation">&#123;</span>
  <span class="token property">content</span><span class="token punctuation">:</span> <span class="token string">''</span><span class="token punctuation">;</span>
  <span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span>
  <span class="token property">width</span><span class="token punctuation">:</span> 40px<span class="token punctuation">;</span>
  <span class="token property">height</span><span class="token punctuation">:</span> 3px<span class="token punctuation">;</span>
  <span class="token property">margin-top</span><span class="token punctuation">:</span> 8px<span class="token punctuation">;</span>
  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--primary<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">border-radius</span><span class="token punctuation">:</span> 2px<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token atrule"><span class="token rule">@keyframes</span> fadeIn</span> <span class="token punctuation">&#123;</span>
  <span class="token selector">from</span> <span class="token punctuation">&#123;</span> <span class="token property">opacity</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateY</span><span class="token punctuation">(</span>20px<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>
  <span class="token selector">to</span> <span class="token punctuation">&#123;</span> <span class="token property">opacity</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span> <span class="token property">transform</span><span class="token punctuation">:</span> <span class="token function">translateY</span><span class="token punctuation">(</span>0<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token atrule"><span class="token rule">@media</span> <span class="token punctuation">(</span><span class="token property">max-width</span><span class="token punctuation">:</span> 768px<span class="token punctuation">)</span></span> <span class="token punctuation">&#123;</span>
  <span class="token selector">.card</span> <span class="token punctuation">&#123;</span>
    <span class="token property">padding</span><span class="token punctuation">:</span> 16px<span class="token punctuation">;</span>
    <span class="token property">border-radius</span><span class="token punctuation">:</span> 8px<span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="HTML"><a href="#HTML" class="headerlink" title="HTML"></a>HTML</h2><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>zh-CN<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>width=device-width, initial-scale=1.0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>示例页面<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>style.css<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>header</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>site-header<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>nav</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>logo<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>My Site<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>nav-list<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/about<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>关于<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/contact<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>联系<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>nav</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>header</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>main</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>article</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>文章标题<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>这是一段 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>strong</span><span class="token punctuation">></span></span>加粗<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>strong</span><span class="token punctuation">></span></span> 和 <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>em</span><span class="token punctuation">></span></span>斜体<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>em</span><span class="token punctuation">></span></span> 的文字。<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>cover.jpg<span class="token punctuation">"</span></span> <span class="token attr-name">alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>封面图<span class="token punctuation">"</span></span> <span class="token attr-name">loading</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>lazy<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>blockquote</span><span class="token punctuation">></span></span>引用文字<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>blockquote</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>article</span><span class="token punctuation">></span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>section</span> <span class="token attr-name">data-component</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>comments<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
      <span class="token comment">&lt;!-- 评论区 --></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>section</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>main</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>module<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript">
    <span class="token keyword">import</span> <span class="token punctuation">&#123;</span> init <span class="token punctuation">&#125;</span> <span class="token keyword">from</span> <span class="token string">'./app.js'</span><span class="token punctuation">;</span>
    <span class="token function">init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="JSON"><a href="#JSON" class="headerlink" title="JSON"></a>JSON</h2><pre class="line-numbers language-json" data-language="json"><code class="language-json"><span class="token punctuation">&#123;</span>
  <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"moeMac-theme"</span><span class="token punctuation">,</span>
  <span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"2.1.0"</span><span class="token punctuation">,</span>
  <span class="token property">"description"</span><span class="token operator">:</span> <span class="token string">"Mac 风格的 Hexo 博客主题"</span><span class="token punctuation">,</span>
  <span class="token property">"author"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>
    <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"moeMac"</span><span class="token punctuation">,</span>
    <span class="token property">"email"</span><span class="token operator">:</span> <span class="token string">"dev@moemac.com"</span>
  <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
  <span class="token property">"keywords"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"hexo"</span><span class="token punctuation">,</span> <span class="token string">"theme"</span><span class="token punctuation">,</span> <span class="token string">"mac"</span><span class="token punctuation">,</span> <span class="token string">"blog"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  <span class="token property">"config"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>
    <span class="token property">"darkMode"</span><span class="token operator">:</span> <span class="token string">"auto"</span><span class="token punctuation">,</span>
    <span class="token property">"language"</span><span class="token operator">:</span> <span class="token string">"zh-CN"</span><span class="token punctuation">,</span>
    <span class="token property">"features"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>
      <span class="token property">"search"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
      <span class="token property">"comments"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
      <span class="token property">"analytics"</span><span class="token operator">:</span> <span class="token boolean">false</span>
    <span class="token punctuation">&#125;</span>
  <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
  <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>
    <span class="token property">"build"</span><span class="token operator">:</span> <span class="token string">"hexo generate"</span><span class="token punctuation">,</span>
    <span class="token property">"server"</span><span class="token operator">:</span> <span class="token string">"hexo server"</span>
  <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
  <span class="token property">"engines"</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span>
    <span class="token property">"node"</span><span class="token operator">:</span> <span class="token string">">=18.0.0"</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Bash-Shell"><a href="#Bash-Shell" class="headerlink" title="Bash &#x2F; Shell"></a>Bash &#x2F; Shell</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span>
<span class="token comment"># 部署脚本示例</span>
<span class="token builtin class-name">set</span> <span class="token parameter variable">-euo</span> pipefail

<span class="token assign-left variable">PROJECT_DIR</span><span class="token operator">=</span><span class="token string">"/var/www/blog"</span>
<span class="token assign-left variable">BACKUP_DIR</span><span class="token operator">=</span><span class="token string">"/var/backups/blog/$(date +%Y%m%d)"</span>

<span class="token builtin class-name">echo</span> <span class="token string">"=== 开始部署 ==="</span>

<span class="token comment"># 创建备份目录</span>
<span class="token function">mkdir</span> <span class="token parameter variable">-p</span> <span class="token string">"$BACKUP_DIR"</span>

<span class="token comment"># 备份当前版本</span>
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token parameter variable">-d</span> <span class="token string">"$PROJECT_DIR"</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span>
  <span class="token builtin class-name">echo</span> <span class="token string">"备份当前版本到 $BACKUP_DIR"</span>
  <span class="token function">cp</span> <span class="token parameter variable">-r</span> <span class="token string">"$PROJECT_DIR"</span> <span class="token string">"$BACKUP_DIR/"</span>
<span class="token keyword">fi</span>

<span class="token comment"># 拉取最新代码</span>
<span class="token builtin class-name">cd</span> <span class="token string">"$PROJECT_DIR"</span>
<span class="token function">git</span> pull origin main

<span class="token comment"># 安装依赖</span>
<span class="token function">npm</span> ci <span class="token parameter variable">--production</span>

<span class="token comment"># 构建</span>
npx hexo clean
npx hexo generate

<span class="token comment"># 重启服务</span>
<span class="token function">sudo</span> systemctl restart hexo-blog

<span class="token builtin class-name">echo</span> <span class="token string">"=== 部署完成 ==="</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Go"><a href="#Go" class="headerlink" title="Go"></a>Go</h2><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// Go 示例 — 并发、接口、错误处理</span>
<span class="token keyword">package</span> main

<span class="token keyword">import</span> <span class="token punctuation">(</span>
	<span class="token string">"context"</span>
	<span class="token string">"fmt"</span>
	<span class="token string">"sync"</span>
	<span class="token string">"time"</span>
<span class="token punctuation">)</span>

<span class="token keyword">type</span> Fetcher <span class="token keyword">interface</span> <span class="token punctuation">&#123;</span>
	<span class="token function">Fetch</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> url <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">byte</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">type</span> Result <span class="token keyword">struct</span> <span class="token punctuation">&#123;</span>
	URL    <span class="token builtin">string</span>
	Status <span class="token builtin">int</span>
	Body   <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">byte</span>
	Err    <span class="token builtin">error</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">func</span> <span class="token function">fetchAll</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> fetcher Fetcher<span class="token punctuation">,</span> urls <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>Result <span class="token punctuation">&#123;</span>
	<span class="token keyword">var</span> wg sync<span class="token punctuation">.</span>WaitGroup
	results <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span>Result<span class="token punctuation">,</span> <span class="token function">len</span><span class="token punctuation">(</span>urls<span class="token punctuation">)</span><span class="token punctuation">)</span>

	<span class="token keyword">for</span> i<span class="token punctuation">,</span> url <span class="token operator">:=</span> <span class="token keyword">range</span> urls <span class="token punctuation">&#123;</span>
		wg<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
		<span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span>idx <span class="token builtin">int</span><span class="token punctuation">,</span> u <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
			<span class="token keyword">defer</span> wg<span class="token punctuation">.</span><span class="token function">Done</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
			ctx<span class="token punctuation">,</span> cancel <span class="token operator">:=</span> context<span class="token punctuation">.</span><span class="token function">WithTimeout</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> <span class="token number">10</span><span class="token operator">*</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span>
			<span class="token keyword">defer</span> <span class="token function">cancel</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

			body<span class="token punctuation">,</span> err <span class="token operator">:=</span> fetcher<span class="token punctuation">.</span><span class="token function">Fetch</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> u<span class="token punctuation">)</span>
			results<span class="token punctuation">[</span>idx<span class="token punctuation">]</span> <span class="token operator">=</span> Result<span class="token punctuation">&#123;</span>URL<span class="token punctuation">:</span> u<span class="token punctuation">,</span> Body<span class="token punctuation">:</span> body<span class="token punctuation">,</span> Err<span class="token punctuation">:</span> err<span class="token punctuation">&#125;</span>
		<span class="token punctuation">&#125;</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> url<span class="token punctuation">)</span>
	<span class="token punctuation">&#125;</span>

	wg<span class="token punctuation">.</span><span class="token function">Wait</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	<span class="token keyword">return</span> results
<span class="token punctuation">&#125;</span>

<span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
	urls <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">string</span><span class="token punctuation">&#123;</span>
		<span class="token string">"https://api.example.com/users"</span><span class="token punctuation">,</span>
		<span class="token string">"https://api.example.com/posts"</span><span class="token punctuation">,</span>
		<span class="token string">"https://api.example.com/comments"</span><span class="token punctuation">,</span>
	<span class="token punctuation">&#125;</span>

	<span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> r <span class="token operator">:=</span> <span class="token keyword">range</span> <span class="token function">fetchAll</span><span class="token punctuation">(</span>context<span class="token punctuation">.</span><span class="token function">Background</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">nil</span><span class="token punctuation">,</span> urls<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
		<span class="token keyword">if</span> r<span class="token punctuation">.</span>Err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">&#123;</span>
			fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"ERROR %s: %v\n"</span><span class="token punctuation">,</span> r<span class="token punctuation">.</span>URL<span class="token punctuation">,</span> r<span class="token punctuation">.</span>Err<span class="token punctuation">)</span>
		<span class="token punctuation">&#125;</span> <span class="token keyword">else</span> <span class="token punctuation">&#123;</span>
			fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"OK %s: %d bytes\n"</span><span class="token punctuation">,</span> r<span class="token punctuation">.</span>URL<span class="token punctuation">,</span> <span class="token function">len</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span>Body<span class="token punctuation">)</span><span class="token punctuation">)</span>
		<span class="token punctuation">&#125;</span>
	<span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Rust"><a href="#Rust" class="headerlink" title="Rust"></a>Rust</h2><pre class="line-numbers language-rust" data-language="rust"><code class="language-rust"><span class="token comment">// Rust 示例 — 所有权、生命周期、trait</span>
<span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>collections<span class="token punctuation">::</span></span><span class="token class-name">HashMap</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token namespace">std<span class="token punctuation">::</span>fmt<span class="token punctuation">::</span></span><span class="token punctuation">&#123;</span><span class="token keyword">self</span><span class="token punctuation">,</span> <span class="token class-name">Display</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span>

<span class="token attribute attr-name">#[derive(Debug, Clone)]</span>
<span class="token keyword">struct</span> <span class="token type-definition class-name">Config</span> <span class="token punctuation">&#123;</span>
    name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span>
    version<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">,</span>
    debug<span class="token punctuation">:</span> <span class="token keyword">bool</span><span class="token punctuation">,</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">impl</span> <span class="token class-name">Display</span> <span class="token keyword">for</span> <span class="token class-name">Config</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">fn</span> <span class="token function-definition function">fmt</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> f<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token namespace">fmt<span class="token punctuation">::</span></span><span class="token class-name">Formatter</span><span class="token operator">&lt;</span><span class="token lifetime-annotation symbol">'_</span><span class="token operator">></span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token namespace">fmt<span class="token punctuation">::</span></span><span class="token class-name">Result</span> <span class="token punctuation">&#123;</span>
        <span class="token macro property">write!</span><span class="token punctuation">(</span>f<span class="token punctuation">,</span> <span class="token string">"&#123;&#125;@&#123;&#125; (debug=&#123;&#125;)"</span><span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>name<span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>version<span class="token punctuation">,</span> <span class="token keyword">self</span><span class="token punctuation">.</span>debug<span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">trait</span> <span class="token type-definition class-name">Cache</span><span class="token operator">&lt;</span><span class="token class-name">K</span><span class="token punctuation">,</span> <span class="token class-name">V</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">fn</span> <span class="token function-definition function">get</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">K</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token operator">&amp;</span><span class="token class-name">V</span><span class="token operator">></span><span class="token punctuation">;</span>
    <span class="token keyword">fn</span> <span class="token function-definition function">insert</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token keyword">self</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token class-name">K</span><span class="token punctuation">,</span> value<span class="token punctuation">:</span> <span class="token class-name">V</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">fn</span> <span class="token function-definition function">remove</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token keyword">self</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">K</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token class-name">V</span><span class="token operator">></span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">struct</span> <span class="token type-definition class-name">LruCache</span><span class="token operator">&lt;</span><span class="token class-name">K</span><span class="token punctuation">,</span> <span class="token class-name">V</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
    entries<span class="token punctuation">:</span> <span class="token class-name">HashMap</span><span class="token operator">&lt;</span><span class="token class-name">K</span><span class="token punctuation">,</span> <span class="token class-name">V</span><span class="token operator">></span><span class="token punctuation">,</span>
    capacity<span class="token punctuation">:</span> <span class="token keyword">usize</span><span class="token punctuation">,</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">impl</span><span class="token operator">&lt;</span><span class="token class-name">K</span><span class="token punctuation">:</span> <span class="token namespace">std<span class="token punctuation">::</span>hash<span class="token punctuation">::</span></span><span class="token class-name">Hash</span> <span class="token operator">+</span> <span class="token class-name">Eq</span><span class="token punctuation">,</span> <span class="token class-name">V</span><span class="token operator">></span> <span class="token class-name">Cache</span><span class="token operator">&lt;</span><span class="token class-name">K</span><span class="token punctuation">,</span> <span class="token class-name">V</span><span class="token operator">></span> <span class="token keyword">for</span> <span class="token class-name">LruCache</span><span class="token operator">&lt;</span><span class="token class-name">K</span><span class="token punctuation">,</span> <span class="token class-name">V</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">fn</span> <span class="token function-definition function">get</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">self</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">K</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token operator">&amp;</span><span class="token class-name">V</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">fn</span> <span class="token function-definition function">insert</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token keyword">self</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token class-name">K</span><span class="token punctuation">,</span> value<span class="token punctuation">:</span> <span class="token class-name">V</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">if</span> <span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">len</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token keyword">self</span><span class="token punctuation">.</span>capacity <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">contains_key</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>key<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
            <span class="token comment">// 简化：移除第一个 key</span>
            <span class="token keyword">if</span> <span class="token keyword">let</span> <span class="token class-name">Some</span><span class="token punctuation">(</span>first_key<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">cloned</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
                <span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>first_key<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">&#125;</span>
        <span class="token punctuation">&#125;</span>
        <span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> value<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">fn</span> <span class="token function-definition function">remove</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token keyword">mut</span> <span class="token keyword">self</span><span class="token punctuation">,</span> key<span class="token punctuation">:</span> <span class="token operator">&amp;</span><span class="token class-name">K</span><span class="token punctuation">)</span> <span class="token punctuation">-></span> <span class="token class-name">Option</span><span class="token operator">&lt;</span><span class="token class-name">V</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">self</span><span class="token punctuation">.</span>entries<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span>key<span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">fn</span> <span class="token function-definition function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">let</span> config <span class="token operator">=</span> <span class="token class-name">Config</span> <span class="token punctuation">&#123;</span>
        name<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"moeMac"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        version<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">::</span><span class="token function">from</span><span class="token punctuation">(</span><span class="token string">"2.1.0"</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        debug<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>
    <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>

    <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"&#123;&#125;"</span><span class="token punctuation">,</span> config<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">let</span> <span class="token keyword">mut</span> cache <span class="token operator">=</span> <span class="token class-name">LruCache</span> <span class="token punctuation">&#123;</span>
        entries<span class="token punctuation">:</span> <span class="token class-name">HashMap</span><span class="token punctuation">::</span><span class="token function">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
        capacity<span class="token punctuation">:</span> <span class="token number">3</span><span class="token punctuation">,</span>
    <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>

    cache<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    cache<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string">"b"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    cache<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token string">"c"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">if</span> <span class="token keyword">let</span> <span class="token class-name">Some</span><span class="token punctuation">(</span>val<span class="token punctuation">)</span> <span class="token operator">=</span> cache<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token string">"b"</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token macro property">println!</span><span class="token punctuation">(</span><span class="token string">"cache['b'] = &#123;&#125;"</span><span class="token punctuation">,</span> val<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="SQL"><a href="#SQL" class="headerlink" title="SQL"></a>SQL</h2><pre class="line-numbers language-sql" data-language="sql"><code class="language-sql"><span class="token comment">-- SQL 示例 — DDL + DML + 查询</span>
<span class="token keyword">CREATE</span> <span class="token keyword">TABLE</span> users <span class="token punctuation">(</span>
    id          <span class="token keyword">SERIAL</span> <span class="token keyword">PRIMARY</span> <span class="token keyword">KEY</span><span class="token punctuation">,</span>
    username    <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span> <span class="token keyword">UNIQUE</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
    email       <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">)</span> <span class="token keyword">UNIQUE</span> <span class="token operator">NOT</span> <span class="token boolean">NULL</span><span class="token punctuation">,</span>
    role        <span class="token keyword">VARCHAR</span><span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token keyword">DEFAULT</span> <span class="token string">'user'</span> <span class="token keyword">CHECK</span> <span class="token punctuation">(</span>role <span class="token operator">IN</span> <span class="token punctuation">(</span><span class="token string">'admin'</span><span class="token punctuation">,</span> <span class="token string">'user'</span><span class="token punctuation">,</span> <span class="token string">'guest'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    created_at  <span class="token keyword">TIMESTAMP</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CURRENT_TIMESTAMP</span><span class="token punctuation">,</span>
    updated_at  <span class="token keyword">TIMESTAMP</span> <span class="token keyword">DEFAULT</span> <span class="token keyword">CURRENT_TIMESTAMP</span>
<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">CREATE</span> <span class="token keyword">INDEX</span> idx_users_email <span class="token keyword">ON</span> users<span class="token punctuation">(</span>email<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">-- 插入数据</span>
<span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> users <span class="token punctuation">(</span>username<span class="token punctuation">,</span> email<span class="token punctuation">,</span> role<span class="token punctuation">)</span>
<span class="token keyword">VALUES</span>
    <span class="token punctuation">(</span><span class="token string">'alice'</span><span class="token punctuation">,</span> <span class="token string">'alice@example.com'</span><span class="token punctuation">,</span> <span class="token string">'admin'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">(</span><span class="token string">'bob'</span><span class="token punctuation">,</span> <span class="token string">'bob@example.com'</span><span class="token punctuation">,</span> <span class="token string">'user'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
    <span class="token punctuation">(</span><span class="token string">'charlie'</span><span class="token punctuation">,</span> <span class="token string">'charlie@example.com'</span><span class="token punctuation">,</span> <span class="token string">'user'</span><span class="token punctuation">)</span>
<span class="token keyword">ON</span> CONFLICT <span class="token punctuation">(</span>username<span class="token punctuation">)</span> <span class="token keyword">DO</span> <span class="token keyword">UPDATE</span>
<span class="token keyword">SET</span> email <span class="token operator">=</span> EXCLUDED<span class="token punctuation">.</span>email<span class="token punctuation">,</span>
    updated_at <span class="token operator">=</span> <span class="token keyword">CURRENT_TIMESTAMP</span><span class="token punctuation">;</span>

<span class="token comment">-- 复杂查询</span>
<span class="token keyword">SELECT</span>
    u<span class="token punctuation">.</span>username<span class="token punctuation">,</span>
    u<span class="token punctuation">.</span>email<span class="token punctuation">,</span>
    <span class="token function">COUNT</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>id<span class="token punctuation">)</span> <span class="token keyword">AS</span> post_count<span class="token punctuation">,</span>
    <span class="token keyword">COALESCE</span><span class="token punctuation">(</span><span class="token function">SUM</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>views<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> total_views
<span class="token keyword">FROM</span> users u
<span class="token keyword">LEFT</span> <span class="token keyword">JOIN</span> posts p <span class="token keyword">ON</span> p<span class="token punctuation">.</span>author_id <span class="token operator">=</span> u<span class="token punctuation">.</span>id
<span class="token keyword">WHERE</span> u<span class="token punctuation">.</span>role <span class="token operator">=</span> <span class="token string">'user'</span>
  <span class="token operator">AND</span> p<span class="token punctuation">.</span>created_at <span class="token operator">>=</span> <span class="token function">NOW</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token keyword">INTERVAL</span> <span class="token string">'30 days'</span>
<span class="token keyword">GROUP</span> <span class="token keyword">BY</span> u<span class="token punctuation">.</span>id<span class="token punctuation">,</span> u<span class="token punctuation">.</span>username<span class="token punctuation">,</span> u<span class="token punctuation">.</span>email
<span class="token keyword">HAVING</span> <span class="token function">COUNT</span><span class="token punctuation">(</span>p<span class="token punctuation">.</span>id<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span>
<span class="token keyword">ORDER</span> <span class="token keyword">BY</span> total_views <span class="token keyword">DESC</span>
<span class="token keyword">LIMIT</span> <span class="token number">10</span><span class="token punctuation">;</span>

<span class="token comment">-- 窗口函数</span>
<span class="token keyword">WITH</span> ranked_posts <span class="token keyword">AS</span> <span class="token punctuation">(</span>
    <span class="token keyword">SELECT</span>
        title<span class="token punctuation">,</span>
        author_id<span class="token punctuation">,</span>
        views<span class="token punctuation">,</span>
        ROW_NUMBER<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">OVER</span> <span class="token punctuation">(</span><span class="token keyword">PARTITION</span> <span class="token keyword">BY</span> author_id <span class="token keyword">ORDER</span> <span class="token keyword">BY</span> views <span class="token keyword">DESC</span><span class="token punctuation">)</span> <span class="token keyword">AS</span> rank
    <span class="token keyword">FROM</span> posts
    <span class="token keyword">WHERE</span> published <span class="token operator">=</span> <span class="token boolean">true</span>
<span class="token punctuation">)</span>
<span class="token keyword">SELECT</span> <span class="token operator">*</span> <span class="token keyword">FROM</span> ranked_posts <span class="token keyword">WHERE</span> rank <span class="token operator">&lt;=</span> <span class="token number">3</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Java"><a href="#Java" class="headerlink" title="Java"></a>Java</h2><pre class="line-numbers language-java" data-language="java"><code class="language-java"><span class="token comment">// Java 示例 — 接口、泛型、Stream API</span>
<span class="token keyword">package</span> <span class="token namespace">com<span class="token punctuation">.</span>example<span class="token punctuation">.</span>blog</span><span class="token punctuation">;</span>

<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>stream<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>concurrent<span class="token punctuation">.</span></span><span class="token class-name">CompletableFuture</span></span><span class="token punctuation">;</span>

<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">PostService</span> <span class="token punctuation">&#123;</span>

    <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">PostRepository</span> repository<span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token class-name">PostService</span><span class="token punctuation">(</span><span class="token class-name">PostRepository</span> repository<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>repository <span class="token operator">=</span> <span class="token class-name">Objects</span><span class="token punctuation">.</span><span class="token function">requireNonNull</span><span class="token punctuation">(</span>repository<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Post</span><span class="token punctuation">></span></span> <span class="token function">getPublishedPosts</span><span class="token punctuation">(</span><span class="token keyword">int</span> limit<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> repository<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">stream</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token class-name">Post</span><span class="token operator">::</span><span class="token function">isPublished</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">sorted</span><span class="token punctuation">(</span><span class="token class-name">Comparator</span><span class="token punctuation">.</span><span class="token function">comparing</span><span class="token punctuation">(</span><span class="token class-name">Post</span><span class="token operator">::</span><span class="token function">getPublishedAt</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">reversed</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">limit</span><span class="token punctuation">(</span>limit<span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span><span class="token class-name">Collectors</span><span class="token punctuation">.</span><span class="token function">toList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token class-name">Long</span><span class="token punctuation">></span></span> <span class="token function">getTagCounts</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> repository<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">stream</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span><span class="token class-name">Post</span><span class="token operator">::</span><span class="token function">isPublished</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">flatMap</span><span class="token punctuation">(</span>post <span class="token operator">-></span> post<span class="token punctuation">.</span><span class="token function">getTags</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">stream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
            <span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span><span class="token class-name">Collectors</span><span class="token punctuation">.</span><span class="token function">groupingBy</span><span class="token punctuation">(</span>
                tag <span class="token operator">-></span> tag<span class="token punctuation">,</span>
                <span class="token class-name">Collectors</span><span class="token punctuation">.</span><span class="token function">counting</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token class-name">CompletableFuture</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Optional</span><span class="token punctuation">&lt;</span><span class="token class-name">Post</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token function">findByIdAsync</span><span class="token punctuation">(</span><span class="token class-name">Long</span> id<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> <span class="token class-name">CompletableFuture</span><span class="token punctuation">.</span><span class="token function">supplyAsync</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> repository<span class="token punctuation">.</span><span class="token function">findById</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">sealed</span> <span class="token keyword">interface</span> <span class="token class-name">PostStatus</span> <span class="token keyword">permits</span> <span class="token class-name">Draft</span><span class="token punctuation">,</span> <span class="token class-name">Published</span><span class="token punctuation">,</span> <span class="token class-name">Archived</span> <span class="token punctuation">&#123;</span>
        <span class="token class-name">String</span> <span class="token function">label</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">record</span> <span class="token class-name">Draft</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">implements</span> <span class="token class-name">PostStatus</span> <span class="token punctuation">&#123;</span>
        <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">label</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token keyword">return</span> <span class="token string">"草稿"</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">record</span> <span class="token class-name">Published</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">implements</span> <span class="token class-name">PostStatus</span> <span class="token punctuation">&#123;</span>
        <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">label</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token keyword">return</span> <span class="token string">"已发布"</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">record</span> <span class="token class-name">Archived</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">implements</span> <span class="token class-name">PostStatus</span> <span class="token punctuation">&#123;</span>
        <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token class-name">String</span> <span class="token function">label</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token keyword">return</span> <span class="token string">"已归档"</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Vue-SFC-单文件组件"><a href="#Vue-SFC-单文件组件" class="headerlink" title="Vue SFC (单文件组件)"></a>Vue SFC (单文件组件)</h2><pre class="line-numbers language-markup" data-language="markup"><code class="language-markup"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>counter<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>decrement<span class="token punctuation">"</span></span> <span class="token attr-name">:disabled</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>count &lt;= 0<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>-<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>count<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ count }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>span</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>increment<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>+<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span> <span class="token attr-name">v-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>count > 10<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>warning<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>已经超过 10 了！<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span><span class="token punctuation">></span></span><span class="token script"><span class="token language-javascript">
<span class="token keyword">import</span> <span class="token punctuation">&#123;</span> ref<span class="token punctuation">,</span> computed<span class="token punctuation">,</span> watch <span class="token punctuation">&#125;</span> <span class="token keyword">from</span> <span class="token string">'vue'</span>

<span class="token keyword">const</span> props <span class="token operator">=</span> <span class="token function">defineProps</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>
  <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span> <span class="token literal-property property">type</span><span class="token operator">:</span> String<span class="token punctuation">,</span> <span class="token keyword">default</span><span class="token operator">:</span> <span class="token string">'计数器'</span> <span class="token punctuation">&#125;</span><span class="token punctuation">,</span>
  <span class="token literal-property property">initial</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span> <span class="token literal-property property">type</span><span class="token operator">:</span> Number<span class="token punctuation">,</span> <span class="token keyword">default</span><span class="token operator">:</span> <span class="token number">0</span> <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">)</span>

<span class="token keyword">const</span> count <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span>props<span class="token punctuation">.</span>initial<span class="token punctuation">)</span>
<span class="token keyword">const</span> double <span class="token operator">=</span> <span class="token function">computed</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> count<span class="token punctuation">.</span>value <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span>

<span class="token function">watch</span><span class="token punctuation">(</span>count<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">newVal<span class="token punctuation">,</span> oldVal</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">&#123;</span>
  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">Count: $&#123;oldVal&#125; -> $&#123;newVal&#125;</span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">)</span>

<span class="token keyword">function</span> <span class="token function">increment</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
  count<span class="token punctuation">.</span>value<span class="token operator">++</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">function</span> <span class="token function">decrement</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
  count<span class="token punctuation">.</span>value<span class="token operator">--</span>
<span class="token punctuation">&#125;</span>
</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span> <span class="token attr-name">scoped</span><span class="token punctuation">></span></span><span class="token style"><span class="token language-css">
<span class="token selector">.counter</span> <span class="token punctuation">&#123;</span>
  <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
  <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
  <span class="token property">gap</span><span class="token punctuation">:</span> 12px<span class="token punctuation">;</span>
  <span class="token property">padding</span><span class="token punctuation">:</span> 16px 24px<span class="token punctuation">;</span>
  <span class="token property">border-radius</span><span class="token punctuation">:</span> 12px<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token selector">.count</span> <span class="token punctuation">&#123;</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>
  <span class="token property">font-weight</span><span class="token punctuation">:</span> 700<span class="token punctuation">;</span>
  <span class="token property">min-width</span><span class="token punctuation">:</span> 48px<span class="token punctuation">;</span>
  <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token selector">.warning</span> <span class="token punctuation">&#123;</span>
  <span class="token property">color</span><span class="token punctuation">:</span> #f59e0b<span class="token punctuation">;</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 0.875rem<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>
</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">></span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="PHP"><a href="#PHP" class="headerlink" title="PHP"></a>PHP</h2><pre class="line-numbers language-php" data-language="php"><code class="language-php"><span class="token php language-php"><span class="token delimiter important">&lt;?php</span>
<span class="token comment">// PHP 示例 — 命名空间、trait、闭包、生成器</span>
<span class="token keyword">namespace</span> <span class="token package">App<span class="token punctuation">\</span>Services</span><span class="token punctuation">;</span>

<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Models<span class="token punctuation">\</span>User</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">App<span class="token punctuation">\</span>Models<span class="token punctuation">\</span>Post</span><span class="token punctuation">;</span>
<span class="token keyword">use</span> <span class="token package">Illuminate<span class="token punctuation">\</span>Database<span class="token punctuation">\</span>Eloquent<span class="token punctuation">\</span>Builder</span><span class="token punctuation">;</span>

<span class="token keyword">class</span> <span class="token class-name-definition class-name">BlogService</span>
<span class="token punctuation">&#123;</span>
    <span class="token keyword">private</span> <span class="token keyword type-declaration">array</span> $cache <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span>
        <span class="token keyword">private</span> <span class="token keyword">readonly</span> UserRepository $users<span class="token punctuation">,</span>
        <span class="token keyword">private</span> <span class="token keyword">readonly</span> PostRepository $posts
    <span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getPopularPosts</span><span class="token punctuation">(</span><span class="token keyword type-declaration">int</span> $limit <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
    <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> $this<span class="token operator">-></span><span class="token property">cache</span><span class="token punctuation">[</span>$limit<span class="token punctuation">]</span> <span class="token operator">??=</span> $this<span class="token operator">-></span><span class="token property">posts</span>
            <span class="token operator">-></span><span class="token function">query</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'published'</span><span class="token punctuation">,</span> <span class="token constant boolean">true</span><span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">where</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'views'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'>'</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">orderByDesc</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'views'</span><span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">limit</span><span class="token punctuation">(</span>$limit<span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">map</span><span class="token punctuation">(</span><span class="token keyword">fn</span> <span class="token punctuation">(</span>Post $post<span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">[</span>
                <span class="token string single-quoted-string">'id'</span> <span class="token operator">=></span> $post<span class="token operator">-></span><span class="token property">id</span><span class="token punctuation">,</span>
                <span class="token string single-quoted-string">'title'</span> <span class="token operator">=></span> $post<span class="token operator">-></span><span class="token property">title</span><span class="token punctuation">,</span>
                <span class="token string single-quoted-string">'author'</span> <span class="token operator">=></span> $post<span class="token operator">-></span><span class="token property">user</span><span class="token operator">-></span><span class="token property">name</span><span class="token punctuation">,</span>
                <span class="token string single-quoted-string">'views'</span> <span class="token operator">=></span> $post<span class="token operator">-></span><span class="token property">views</span><span class="token punctuation">,</span>
            <span class="token punctuation">]</span><span class="token punctuation">)</span>
            <span class="token operator">-></span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">generateTags</span><span class="token punctuation">(</span>Post $post<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token class-name class-name-fully-qualified return-type"><span class="token punctuation">\</span>Generator</span>
    <span class="token punctuation">&#123;</span>
        <span class="token keyword">foreach</span> <span class="token punctuation">(</span>$post<span class="token operator">-></span><span class="token property">tags</span> <span class="token keyword">as</span> $tag<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
            <span class="token keyword">yield</span> $tag<span class="token operator">-></span><span class="token property">name</span> <span class="token operator">=></span> $tag<span class="token operator">-></span><span class="token property">count</span><span class="token punctuation">;</span>
        <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">filterPosts</span><span class="token punctuation">(</span><span class="token keyword">callable</span> $callback<span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">array</span>
    <span class="token punctuation">&#123;</span>
        $posts <span class="token operator">=</span> $this<span class="token operator">-></span><span class="token property">posts</span><span class="token operator">-></span><span class="token function">all</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token function">array_filter</span><span class="token punctuation">(</span>$posts<span class="token punctuation">,</span> $callback<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">trait</span> <span class="token class-name-definition class-name">Sluggable</span>
<span class="token punctuation">&#123;</span>
    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">slug</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span>
    <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> <span class="token function">strtolower</span><span class="token punctuation">(</span>
            <span class="token function">preg_replace</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/[^A-Za-z0-9-]+/'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'-'</span><span class="token punctuation">,</span> $this<span class="token operator">-></span><span class="token property">title</span><span class="token punctuation">)</span>
        <span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">interface</span> <span class="token class-name-definition class-name">Renderable</span>
<span class="token punctuation">&#123;</span>
    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">class</span> <span class="token class-name-definition class-name">MarkdownPost</span> <span class="token keyword">implements</span> <span class="token class-name">Renderable</span>
<span class="token punctuation">&#123;</span>
    <span class="token keyword">use</span> <span class="token package">Sluggable</span><span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span>
        <span class="token keyword">public</span> <span class="token keyword">readonly</span> <span class="token keyword type-declaration">string</span> $title<span class="token punctuation">,</span>
        <span class="token keyword">public</span> <span class="token keyword">readonly</span> <span class="token keyword type-declaration">string</span> $content
    <span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>

    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span> <span class="token keyword return-type">string</span>
    <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> <span class="token string double-quoted-string">"&lt;article>&lt;h1>&#123;$this->title&#125;&lt;/h1>&#123;$this->content&#125;&lt;/article>"</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

$post <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MarkdownPost</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Hello World'</span><span class="token punctuation">,</span> <span class="token string single-quoted-string">'## Welcome'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> $post<span class="token operator">-></span><span class="token function">slug</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">echo</span> $post<span class="token operator">-></span><span class="token function">render</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Ruby"><a href="#Ruby" class="headerlink" title="Ruby"></a>Ruby</h2><pre class="line-numbers language-ruby" data-language="ruby"><code class="language-ruby"><span class="token comment"># Ruby 示例 — 模块、块、元编程</span>
<span class="token keyword">module</span> <span class="token class-name">Bloggable</span>
  attr_accessor <span class="token symbol">:title</span><span class="token punctuation">,</span> <span class="token symbol">:content</span>

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">word_count</span></span>
    content<span class="token punctuation">.</span>split<span class="token punctuation">.</span>size
  <span class="token keyword">end</span>

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">summary</span></span><span class="token punctuation">(</span>length <span class="token operator">=</span> <span class="token number">50</span><span class="token punctuation">)</span>
    content<span class="token punctuation">.</span>length <span class="token operator">></span> length <span class="token operator">?</span> <span class="token string-literal"><span class="token string">"</span><span class="token interpolation"><span class="token delimiter punctuation">#&#123;</span><span class="token content">content<span class="token punctuation">[</span><span class="token number">0.</span><span class="token operator">..</span>length<span class="token punctuation">]</span></span><span class="token delimiter punctuation">&#125;</span></span><span class="token string">..."</span></span> <span class="token operator">:</span> content
  <span class="token keyword">end</span>
<span class="token keyword">end</span>

<span class="token keyword">class</span> <span class="token class-name">Post</span>
  <span class="token keyword">include</span> Bloggable

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">initialize</span></span><span class="token punctuation">(</span>title<span class="token punctuation">,</span> content<span class="token punctuation">,</span> tags <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
    <span class="token variable">@title</span> <span class="token operator">=</span> title
    <span class="token variable">@content</span> <span class="token operator">=</span> content
    <span class="token variable">@tags</span> <span class="token operator">=</span> tags
  <span class="token keyword">end</span>

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">each_tag</span></span><span class="token punctuation">(</span><span class="token operator">&amp;</span>block<span class="token punctuation">)</span>
    <span class="token variable">@tags</span><span class="token punctuation">.</span><span class="token keyword">each</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>block<span class="token punctuation">)</span>
  <span class="token keyword">end</span>

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">method_missing</span></span><span class="token punctuation">(</span>name<span class="token punctuation">,</span> <span class="token operator">*</span>args<span class="token punctuation">)</span>
    <span class="token keyword">if</span> name<span class="token punctuation">.</span>to_s <span class="token operator">=~</span> <span class="token regex-literal"><span class="token regex">/^tag_(.+)\?$/</span></span>
      <span class="token variable">@tags</span><span class="token punctuation">.</span><span class="token keyword">include</span><span class="token operator">?</span><span class="token punctuation">(</span>$<span class="token number">1.</span>to_sym<span class="token punctuation">)</span>
    <span class="token keyword">else</span>
      <span class="token keyword">super</span>
    <span class="token keyword">end</span>
  <span class="token keyword">end</span>
<span class="token keyword">end</span>

<span class="token keyword">class</span> <span class="token class-name">PostsCollection</span>
  <span class="token keyword">include</span> Enumerable

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">initialize</span></span>
    <span class="token variable">@posts</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
  <span class="token keyword">end</span>

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">add</span></span><span class="token punctuation">(</span>post<span class="token punctuation">)</span>
    <span class="token variable">@posts</span> <span class="token operator">&lt;&lt;</span> post
    <span class="token keyword">self</span>
  <span class="token keyword">end</span>

  <span class="token keyword">def</span> <span class="token method-definition"><span class="token function">each</span></span><span class="token punctuation">(</span><span class="token operator">&amp;</span>block<span class="token punctuation">)</span>
    <span class="token variable">@posts</span><span class="token punctuation">.</span><span class="token keyword">each</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>block<span class="token punctuation">)</span>
  <span class="token keyword">end</span>
<span class="token keyword">end</span>

posts <span class="token operator">=</span> <span class="token class-name">PostsCollection</span><span class="token punctuation">.</span><span class="token keyword">new</span>
posts<span class="token punctuation">.</span>add<span class="token punctuation">(</span><span class="token class-name">Post</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"Ruby Tips"</span></span><span class="token punctuation">,</span> <span class="token string-literal"><span class="token string">"Learn Ruby metaprogramming..."</span></span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token symbol">:ruby</span><span class="token punctuation">,</span> <span class="token symbol">:meta</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
posts<span class="token punctuation">.</span>add<span class="token punctuation">(</span><span class="token class-name">Post</span><span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">"Rails Guide"</span></span><span class="token punctuation">,</span> <span class="token string-literal"><span class="token string">"Build web apps with Rails"</span></span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token symbol">:ruby</span><span class="token punctuation">,</span> <span class="token symbol">:rails</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>

longest <span class="token operator">=</span> posts<span class="token punctuation">.</span>max_by<span class="token punctuation">(</span><span class="token operator">&amp;</span><span class="token symbol">:word_count</span><span class="token punctuation">)</span>
puts <span class="token string-literal"><span class="token string">"Longest: </span><span class="token interpolation"><span class="token delimiter punctuation">#&#123;</span><span class="token content">longest<span class="token punctuation">.</span>title</span><span class="token delimiter punctuation">&#125;</span></span><span class="token string"> (</span><span class="token interpolation"><span class="token delimiter punctuation">#&#123;</span><span class="token content">longest<span class="token punctuation">.</span>word_count</span><span class="token delimiter punctuation">&#125;</span></span><span class="token string"> words)"</span></span>

posts<span class="token punctuation">.</span>each_tag <span class="token punctuation">&#123;</span> <span class="token operator">|</span>tag<span class="token operator">|</span> puts <span class="token string-literal"><span class="token string">"Tag: </span><span class="token interpolation"><span class="token delimiter punctuation">#&#123;</span><span class="token content">tag</span><span class="token delimiter punctuation">&#125;</span></span><span class="token string">"</span></span> <span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Swift"><a href="#Swift" class="headerlink" title="Swift"></a>Swift</h2><pre class="line-numbers language-swift" data-language="swift"><code class="language-swift"><span class="token comment">// Swift 示例 — 协议、泛型、async/await</span>
<span class="token keyword">import</span> <span class="token class-name">Foundation</span>

<span class="token keyword">protocol</span> <span class="token class-name">Describable</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token keyword">get</span> <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">struct</span> <span class="token class-name">Post</span><span class="token punctuation">:</span> <span class="token class-name">Identifiable</span><span class="token punctuation">,</span> <span class="token class-name">Describable</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">let</span> id<span class="token punctuation">:</span> <span class="token constant">UUID</span>
    <span class="token keyword">var</span> title<span class="token punctuation">:</span> <span class="token class-name">String</span>
    <span class="token keyword">var</span> views<span class="token punctuation">:</span> <span class="token class-name">Int</span>
    <span class="token keyword">var</span> tags<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">]</span>

    <span class="token keyword">var</span> description<span class="token punctuation">:</span> <span class="token class-name">String</span> <span class="token punctuation">&#123;</span> <span class="token string-literal"><span class="token string">"</span><span class="token interpolation-punctuation punctuation">\(</span><span class="token interpolation">title</span><span class="token interpolation-punctuation punctuation">)</span><span class="token string"> (</span><span class="token interpolation-punctuation punctuation">\(</span><span class="token interpolation">views</span><span class="token interpolation-punctuation punctuation">)</span><span class="token string"> views)"</span></span> <span class="token punctuation">&#125;</span>

    <span class="token keyword">func</span> <span class="token function-definition function">contains</span><span class="token punctuation">(</span>tag<span class="token punctuation">:</span> <span class="token class-name">String</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token class-name">Bool</span> <span class="token punctuation">&#123;</span>
        tags<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span>tag<span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token attribute atrule">@MainActor</span>
<span class="token keyword">class</span> <span class="token class-name">BlogStore</span><span class="token punctuation">:</span> <span class="token class-name">ObservableObject</span> <span class="token punctuation">&#123;</span>
    <span class="token attribute atrule">@Published</span> <span class="token keyword">var</span> posts<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">Post</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>

    <span class="token keyword">func</span> <span class="token function-definition function">fetchPosts</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token keyword">throws</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">let</span> <span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token omit keyword">_</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token keyword">try</span> <span class="token keyword">await</span> <span class="token class-name">URLSession</span><span class="token punctuation">.</span>shared<span class="token punctuation">.</span><span class="token function">data</span><span class="token punctuation">(</span>from<span class="token punctuation">:</span> <span class="token function">URL</span><span class="token punctuation">(</span>string<span class="token punctuation">:</span> <span class="token string-literal"><span class="token string">"https://api.example.com/posts"</span></span><span class="token punctuation">)</span><span class="token operator">!</span><span class="token punctuation">)</span>
        <span class="token keyword">self</span><span class="token punctuation">.</span>posts <span class="token operator">=</span> <span class="token keyword">try</span> <span class="token class-name">JSONDecoder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">decode</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token class-name">Post</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token keyword">self</span><span class="token punctuation">,</span> from<span class="token punctuation">:</span> data<span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">func</span> <span class="token function-definition function">popularPosts</span><span class="token punctuation">(</span>minViews<span class="token punctuation">:</span> <span class="token class-name">Int</span> <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">[</span><span class="token class-name">Post</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>
        posts<span class="token punctuation">.</span>filter <span class="token punctuation">&#123;</span> $<span class="token number">0</span><span class="token punctuation">.</span>views <span class="token operator">>=</span> minViews <span class="token punctuation">&#125;</span><span class="token punctuation">.</span>sorted <span class="token punctuation">&#123;</span> $<span class="token number">0</span><span class="token punctuation">.</span>views <span class="token operator">></span> $<span class="token number">1</span><span class="token punctuation">.</span>views <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">func</span> <span class="token function-definition function">groupedByTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">[</span><span class="token class-name">String</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">Post</span><span class="token punctuation">]</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>
        <span class="token class-name">Dictionary</span><span class="token punctuation">(</span>grouping<span class="token punctuation">:</span> posts<span class="token punctuation">.</span>flatMap <span class="token punctuation">&#123;</span> post <span class="token keyword">in</span>
            post<span class="token punctuation">.</span>tags<span class="token punctuation">.</span>map <span class="token punctuation">&#123;</span> <span class="token punctuation">(</span>$<span class="token number">0</span><span class="token punctuation">,</span> post<span class="token punctuation">)</span> <span class="token punctuation">&#125;</span>
        <span class="token punctuation">&#125;</span><span class="token punctuation">,</span> by<span class="token punctuation">:</span> <span class="token punctuation">&#123;</span> $<span class="token number">0.0</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span>
        <span class="token punctuation">.</span>mapValues <span class="token punctuation">&#123;</span> $<span class="token number">0</span><span class="token punctuation">.</span>map <span class="token punctuation">&#123;</span> $<span class="token number">0.1</span> <span class="token punctuation">&#125;</span> <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token comment">// 泛型函数</span>
<span class="token keyword">func</span> <span class="token function-definition function">topN</span><span class="token operator">&lt;</span><span class="token class-name">T</span><span class="token operator">></span><span class="token punctuation">(</span><span class="token omit keyword">_</span> items<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token class-name">T</span><span class="token punctuation">]</span><span class="token punctuation">,</span> count<span class="token punctuation">:</span> <span class="token class-name">Int</span><span class="token punctuation">,</span> by keyPath<span class="token punctuation">:</span> <span class="token class-name">KeyPath</span><span class="token operator">&lt;</span><span class="token class-name">T</span><span class="token punctuation">,</span> <span class="token class-name">Int</span><span class="token operator">></span><span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token punctuation">[</span><span class="token class-name">T</span><span class="token punctuation">]</span> <span class="token punctuation">&#123;</span>
    items<span class="token punctuation">.</span>sorted <span class="token punctuation">&#123;</span> $<span class="token number">0</span><span class="token punctuation">[</span>keyPath<span class="token punctuation">:</span> keyPath<span class="token punctuation">]</span> <span class="token operator">></span> $<span class="token number">1</span><span class="token punctuation">[</span>keyPath<span class="token punctuation">:</span> keyPath<span class="token punctuation">]</span> <span class="token punctuation">&#125;</span>
        <span class="token punctuation">.</span><span class="token keyword">prefix</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span>
        <span class="token punctuation">.</span>map <span class="token punctuation">&#123;</span> $<span class="token number">0</span> <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">let</span> store <span class="token operator">=</span> <span class="token class-name">BlogStore</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token class-name">Task</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">try</span><span class="token operator">?</span> <span class="token keyword">await</span> store<span class="token punctuation">.</span><span class="token function">fetchPosts</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token keyword">for</span> post <span class="token keyword">in</span> store<span class="token punctuation">.</span><span class="token function">popularPosts</span><span class="token punctuation">(</span>minViews<span class="token punctuation">:</span> <span class="token number">50</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token function">print</span><span class="token punctuation">(</span>post<span class="token punctuation">.</span>description<span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Kotlin"><a href="#Kotlin" class="headerlink" title="Kotlin"></a>Kotlin</h2><pre class="line-numbers language-kotlin" data-language="kotlin"><code class="language-kotlin"><span class="token comment">// Kotlin 示例 — 协程、密封类、扩展函数</span>
<span class="token keyword">import</span> kotlinx<span class="token punctuation">.</span>coroutines<span class="token punctuation">.</span><span class="token operator">*</span>
<span class="token keyword">import</span> kotlinx<span class="token punctuation">.</span>coroutines<span class="token punctuation">.</span>flow<span class="token punctuation">.</span><span class="token operator">*</span>

<span class="token keyword">sealed</span> <span class="token keyword">class</span> Result<span class="token operator">&lt;</span><span class="token keyword">out</span> T<span class="token operator">></span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">data</span> <span class="token keyword">class</span> Success<span class="token operator">&lt;</span>T<span class="token operator">></span><span class="token punctuation">(</span><span class="token keyword">val</span> <span class="token keyword">data</span><span class="token operator">:</span> T<span class="token punctuation">)</span> <span class="token operator">:</span> Result<span class="token operator">&lt;</span>T<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token keyword">data</span> <span class="token keyword">class</span> <span class="token function">Error</span><span class="token punctuation">(</span><span class="token keyword">val</span> message<span class="token operator">:</span> String<span class="token punctuation">)</span> <span class="token operator">:</span> Result<span class="token operator">&lt;</span>Nothing<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token keyword">object</span> Loading <span class="token operator">:</span> Result<span class="token operator">&lt;</span>Nothing<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">data</span> <span class="token keyword">class</span> <span class="token function">Post</span><span class="token punctuation">(</span>
    <span class="token keyword">val</span> id<span class="token operator">:</span> Long<span class="token punctuation">,</span>
    <span class="token keyword">val</span> title<span class="token operator">:</span> String<span class="token punctuation">,</span>
    <span class="token keyword">val</span> author<span class="token operator">:</span> String<span class="token punctuation">,</span>
    <span class="token keyword">val</span> views<span class="token operator">:</span> Int<span class="token punctuation">,</span>
    <span class="token keyword">val</span> tags<span class="token operator">:</span> List<span class="token operator">&lt;</span>String<span class="token operator">></span>
<span class="token punctuation">)</span>

<span class="token keyword">class</span> PostRepository <span class="token punctuation">&#123;</span>
    <span class="token keyword">private</span> <span class="token keyword">val</span> posts <span class="token operator">=</span> mutableListOf<span class="token operator">&lt;</span>Post<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span>

    <span class="token keyword">fun</span> <span class="token function">add</span><span class="token punctuation">(</span>post<span class="token operator">:</span> Post<span class="token punctuation">)</span> <span class="token operator">=</span> posts<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>post<span class="token punctuation">)</span>

    <span class="token keyword">fun</span> <span class="token function">getAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> List<span class="token operator">&lt;</span>Post<span class="token operator">></span> <span class="token operator">=</span> posts<span class="token punctuation">.</span><span class="token function">toList</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

    <span class="token keyword">fun</span> <span class="token function">getPopular</span><span class="token punctuation">(</span>minViews<span class="token operator">:</span> Int<span class="token punctuation">)</span><span class="token operator">:</span> List<span class="token operator">&lt;</span>Post<span class="token operator">></span> <span class="token operator">=</span>
        posts<span class="token punctuation">.</span><span class="token function">filter</span> <span class="token punctuation">&#123;</span> it<span class="token punctuation">.</span>views <span class="token operator">>=</span> minViews <span class="token punctuation">&#125;</span><span class="token punctuation">.</span><span class="token function">sortedByDescending</span> <span class="token punctuation">&#123;</span> it<span class="token punctuation">.</span>views <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token comment">// 扩展函数</span>
<span class="token keyword">fun</span> List<span class="token operator">&lt;</span>Post<span class="token operator">></span><span class="token punctuation">.</span><span class="token function">groupByTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Map<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> List<span class="token operator">&lt;</span>Post<span class="token operator">></span><span class="token operator">></span> <span class="token operator">=</span>
    flatMap <span class="token punctuation">&#123;</span> post <span class="token operator">-></span> post<span class="token punctuation">.</span>tags<span class="token punctuation">.</span><span class="token function">map</span> <span class="token punctuation">&#123;</span> tag <span class="token operator">-></span> tag <span class="token keyword">to</span> post <span class="token punctuation">&#125;</span> <span class="token punctuation">&#125;</span>
        <span class="token punctuation">.</span><span class="token function">groupBy</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span> it<span class="token punctuation">.</span>first <span class="token punctuation">&#125;</span><span class="token punctuation">,</span> <span class="token punctuation">&#123;</span> it<span class="token punctuation">.</span>second <span class="token punctuation">&#125;</span><span class="token punctuation">)</span>

<span class="token comment">// 协程 Flow</span>
<span class="token keyword">fun</span> PostRepository<span class="token punctuation">.</span><span class="token function">fetchFlow</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">:</span> Flow<span class="token operator">&lt;</span>Result<span class="token operator">&lt;</span>List<span class="token operator">&lt;</span>Post<span class="token operator">></span><span class="token operator">></span><span class="token operator">></span> <span class="token operator">=</span> flow <span class="token punctuation">&#123;</span>
    <span class="token function">emit</span><span class="token punctuation">(</span>Result<span class="token punctuation">.</span>Loading<span class="token punctuation">)</span>
    <span class="token function">delay</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span>
    <span class="token keyword">try</span> <span class="token punctuation">&#123;</span>
        <span class="token function">emit</span><span class="token punctuation">(</span>Result<span class="token punctuation">.</span><span class="token function">Success</span><span class="token punctuation">(</span><span class="token function">getAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>e<span class="token operator">:</span> Exception<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token function">emit</span><span class="token punctuation">(</span>Result<span class="token punctuation">.</span><span class="token function">Error</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>message <span class="token operator">?:</span> <span class="token string-literal singleline"><span class="token string">"Unknown error"</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">fun</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span> runBlocking <span class="token punctuation">&#123;</span>
    <span class="token keyword">val</span> repo <span class="token operator">=</span> <span class="token function">PostRepository</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">apply</span> <span class="token punctuation">&#123;</span>
        <span class="token function">add</span><span class="token punctuation">(</span><span class="token function">Post</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string-literal singleline"><span class="token string">"Kotlin Tips"</span></span><span class="token punctuation">,</span> <span class="token string-literal singleline"><span class="token string">"Alice"</span></span><span class="token punctuation">,</span> <span class="token number">150</span><span class="token punctuation">,</span> <span class="token function">listOf</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"kotlin"</span></span><span class="token punctuation">,</span> <span class="token string-literal singleline"><span class="token string">"jvm"</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        <span class="token function">add</span><span class="token punctuation">(</span><span class="token function">Post</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string-literal singleline"><span class="token string">"Coroutines"</span></span><span class="token punctuation">,</span> <span class="token string-literal singleline"><span class="token string">"Bob"</span></span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">,</span> <span class="token function">listOf</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"kotlin"</span></span><span class="token punctuation">,</span> <span class="token string-literal singleline"><span class="token string">"async"</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>

    repo<span class="token punctuation">.</span><span class="token function">fetchFlow</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">collect</span> <span class="token punctuation">&#123;</span> result <span class="token operator">-></span>
        <span class="token keyword">when</span> <span class="token punctuation">(</span>result<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
            <span class="token keyword">is</span> Result<span class="token punctuation">.</span>Loading <span class="token operator">-></span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"Loading..."</span></span><span class="token punctuation">)</span>
            <span class="token keyword">is</span> Result<span class="token punctuation">.</span>Success <span class="token operator">-></span> result<span class="token punctuation">.</span>data<span class="token punctuation">.</span><span class="token function">forEach</span> <span class="token punctuation">&#123;</span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"$&#123;it.title&#125; by $&#123;it.author&#125;"</span></span><span class="token punctuation">)</span> <span class="token punctuation">&#125;</span>
            <span class="token keyword">is</span> Result<span class="token punctuation">.</span>Error <span class="token operator">-></span> <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"Error: $&#123;result.message&#125;"</span></span><span class="token punctuation">)</span>
        <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>

    repo<span class="token punctuation">.</span><span class="token function">getPopular</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">groupByTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">forEach</span> <span class="token punctuation">&#123;</span> <span class="token punctuation">(</span>tag<span class="token punctuation">,</span> posts<span class="token punctuation">)</span> <span class="token operator">-></span>
        <span class="token function">println</span><span class="token punctuation">(</span><span class="token string-literal singleline"><span class="token string">"#$tag: $&#123;posts.size&#125; posts"</span></span><span class="token punctuation">)</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Dart"><a href="#Dart" class="headerlink" title="Dart"></a>Dart</h2><pre class="line-numbers language-dart" data-language="dart"><code class="language-dart"><span class="token comment">// Dart 示例 — 异步、泛型、Mixin</span>
<span class="token keyword">import</span> <span class="token string-literal"><span class="token string">'dart:async'</span></span><span class="token punctuation">;</span>
<span class="token keyword">import</span> <span class="token string-literal"><span class="token string">'dart:convert'</span></span><span class="token punctuation">;</span>

<span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">DataSource</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">T</span><span class="token punctuation">></span></span> <span class="token punctuation">&#123;</span>
  <span class="token class-name">Future</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">List</span><span class="token punctuation">&lt;</span><span class="token class-name">T</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token class-name">Stream</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">T</span><span class="token punctuation">></span></span> <span class="token function">watch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">class</span> <span class="token class-name">Post</span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">final</span> int id<span class="token punctuation">;</span>
  <span class="token keyword">final</span> <span class="token class-name">String</span> title<span class="token punctuation">;</span>
  <span class="token keyword">final</span> <span class="token class-name">String</span> author<span class="token punctuation">;</span>
  <span class="token keyword">final</span> int views<span class="token punctuation">;</span>

  <span class="token keyword">const</span> <span class="token class-name">Post</span><span class="token punctuation">(</span><span class="token punctuation">&#123;</span>
    required <span class="token keyword">this</span><span class="token punctuation">.</span>id<span class="token punctuation">,</span>
    required <span class="token keyword">this</span><span class="token punctuation">.</span>title<span class="token punctuation">,</span>
    required <span class="token keyword">this</span><span class="token punctuation">.</span>author<span class="token punctuation">,</span>
    required <span class="token keyword">this</span><span class="token punctuation">.</span>views<span class="token punctuation">,</span>
  <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">factory</span> <span class="token class-name">Post</span><span class="token punctuation">.</span><span class="token function">fromJson</span><span class="token punctuation">(</span><span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token keyword">dynamic</span><span class="token punctuation">></span></span> json<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token class-name">Post</span><span class="token punctuation">(</span>
        id<span class="token punctuation">:</span> json<span class="token punctuation">[</span><span class="token string-literal"><span class="token string">'id'</span></span><span class="token punctuation">]</span> <span class="token operator">as</span> int<span class="token punctuation">,</span>
        title<span class="token punctuation">:</span> json<span class="token punctuation">[</span><span class="token string-literal"><span class="token string">'title'</span></span><span class="token punctuation">]</span> <span class="token operator">as</span> <span class="token class-name">String</span><span class="token punctuation">,</span>
        author<span class="token punctuation">:</span> json<span class="token punctuation">[</span><span class="token string-literal"><span class="token string">'author'</span></span><span class="token punctuation">]</span> <span class="token operator">as</span> <span class="token class-name">String</span><span class="token punctuation">,</span>
        views<span class="token punctuation">:</span> json<span class="token punctuation">[</span><span class="token string-literal"><span class="token string">'views'</span></span><span class="token punctuation">]</span> <span class="token operator">as</span> int<span class="token punctuation">,</span>
      <span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token keyword">dynamic</span><span class="token punctuation">></span></span> <span class="token function">toJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">&#123;</span>
        <span class="token string-literal"><span class="token string">'id'</span></span><span class="token punctuation">:</span> id<span class="token punctuation">,</span>
        <span class="token string-literal"><span class="token string">'title'</span></span><span class="token punctuation">:</span> title<span class="token punctuation">,</span>
        <span class="token string-literal"><span class="token string">'author'</span></span><span class="token punctuation">:</span> author<span class="token punctuation">,</span>
        <span class="token string-literal"><span class="token string">'views'</span></span><span class="token punctuation">:</span> views<span class="token punctuation">,</span>
      <span class="token punctuation">&#125;</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">mixin</span> <span class="token class-name">Serializable</span> <span class="token punctuation">&#123;</span>
  <span class="token class-name">Map</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token keyword">dynamic</span><span class="token punctuation">></span></span> <span class="token function">toJson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">class</span> <span class="token class-name">PostService</span> <span class="token keyword">implements</span> <span class="token class-name">DataSource</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Post</span><span class="token punctuation">></span></span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">final</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Post</span><span class="token punctuation">></span></span> _cache <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>

  <span class="token metadata function">@override</span>
  <span class="token class-name">Future</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">List</span><span class="token punctuation">&lt;</span><span class="token class-name">Post</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">await</span> <span class="token class-name">Future</span><span class="token punctuation">.</span><span class="token function">delayed</span><span class="token punctuation">(</span><span class="token class-name">Duration</span><span class="token punctuation">(</span>milliseconds<span class="token punctuation">:</span> <span class="token number">300</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> _cache<span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>

  <span class="token metadata function">@override</span>
  <span class="token class-name">Stream</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">Post</span><span class="token punctuation">></span></span> <span class="token function">watch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">async*</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">final</span> post <span class="token keyword">in</span> _cache<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
      <span class="token keyword">yield</span> post<span class="token punctuation">;</span>
      <span class="token keyword">await</span> <span class="token class-name">Future</span><span class="token punctuation">.</span><span class="token function">delayed</span><span class="token punctuation">(</span><span class="token class-name">Duration</span><span class="token punctuation">(</span>milliseconds<span class="token punctuation">:</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
  <span class="token punctuation">&#125;</span>

  <span class="token class-name">Future</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token keyword">void</span><span class="token punctuation">></span></span> <span class="token function">loadFromJson</span><span class="token punctuation">(</span><span class="token class-name">String</span> jsonStr<span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">final</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation">&lt;</span><span class="token keyword">dynamic</span><span class="token punctuation">></span></span> json <span class="token operator">=</span> <span class="token function">jsonDecode</span><span class="token punctuation">(</span>jsonStr<span class="token punctuation">)</span><span class="token punctuation">;</span>
    _cache<span class="token punctuation">.</span><span class="token function">addAll</span><span class="token punctuation">(</span>json<span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token punctuation">(</span>j<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token class-name">Post</span><span class="token punctuation">.</span><span class="token function">fromJson</span><span class="token punctuation">(</span>j<span class="token punctuation">.</span>cast<span class="token generics"><span class="token punctuation">&lt;</span><span class="token class-name">String</span><span class="token punctuation">,</span> <span class="token keyword">dynamic</span><span class="token punctuation">></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">async</span> <span class="token punctuation">&#123;</span>
  <span class="token keyword">final</span> service <span class="token operator">=</span> <span class="token class-name">PostService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">await</span> service<span class="token punctuation">.</span><span class="token function">loadFromJson</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">'''
    [&#123;"id":1,"title":"Dart Tips","author":"Alice","views":100&#125;,
     &#123;"id":2,"title":"Flutter UI","author":"Bob","views":250&#125;]
  '''</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">final</span> posts <span class="token operator">=</span> <span class="token keyword">await</span> service<span class="token punctuation">.</span><span class="token function">fetch</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">final</span> popular <span class="token operator">=</span> posts<span class="token punctuation">.</span><span class="token function">where</span><span class="token punctuation">(</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> p<span class="token punctuation">.</span>views <span class="token operator">></span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toList</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
    <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> b<span class="token punctuation">.</span>views<span class="token punctuation">.</span><span class="token function">compareTo</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span>views<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">final</span> post <span class="token keyword">in</span> popular<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token function">print</span><span class="token punctuation">(</span><span class="token string-literal"><span class="token string">'$&#123;post.title&#125; by $&#123;post.author&#125; ($&#123;post.views&#125; views)'</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Dockerfile"><a href="#Dockerfile" class="headerlink" title="Dockerfile"></a>Dockerfile</h2><pre class="line-numbers language-docker" data-language="docker"><code class="language-docker"><span class="token comment"># Dockerfile 示例 — 多阶段构建</span>
<span class="token instruction"><span class="token keyword">FROM</span> node:20-alpine <span class="token keyword">AS</span> builder</span>
<span class="token instruction"><span class="token keyword">WORKDIR</span> /app</span>
<span class="token instruction"><span class="token keyword">COPY</span> package.json pnpm-lock.yaml ./</span>
<span class="token instruction"><span class="token keyword">RUN</span> corepack enable &amp;&amp; pnpm install --frozen-lockfile</span>
<span class="token instruction"><span class="token keyword">COPY</span> . .</span>
<span class="token instruction"><span class="token keyword">RUN</span> pnpm build</span>

<span class="token instruction"><span class="token keyword">FROM</span> nginx:alpine <span class="token keyword">AS</span> runtime</span>
<span class="token instruction"><span class="token keyword">COPY</span> <span class="token options"><span class="token property">--from</span><span class="token punctuation">=</span><span class="token string">builder</span></span> /app/public /usr/share/nginx/html</span>
<span class="token instruction"><span class="token keyword">COPY</span> nginx.conf /etc/nginx/conf.d/default.conf</span>

<span class="token instruction"><span class="token keyword">EXPOSE</span> 80</span>
<span class="token instruction"><span class="token keyword">HEALTHCHECK</span> <span class="token options"><span class="token property">--interval</span><span class="token punctuation">=</span><span class="token string">30s</span> <span class="token property">--timeout</span><span class="token punctuation">=</span><span class="token string">3s</span> <span class="token property">--retries</span><span class="token punctuation">=</span><span class="token string">3</span></span> <span class="token operator">\</span>
  <span class="token keyword">CMD</span> wget -q --spider http://localhost/ || exit 1</span>

<span class="token instruction"><span class="token keyword">LABEL</span> maintainer=<span class="token string">"dev@example.com"</span> <span class="token operator">\</span>
      version=<span class="token string">"2.1.0"</span> <span class="token operator">\</span>
      description=<span class="token string">"moeMac blog static site"</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="Nginx-配置"><a href="#Nginx-配置" class="headerlink" title="Nginx 配置"></a>Nginx 配置</h2><pre class="line-numbers language-nginx" data-language="nginx"><code class="language-nginx"><span class="token comment"># Nginx 配置示例 — 反向代理 + HTTPS</span>
<span class="token directive"><span class="token keyword">upstream</span> blog_backend</span> <span class="token punctuation">&#123;</span>
    <span class="token directive"><span class="token keyword">server</span> 127.0.0.1:3000 weight=3</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">server</span> 127.0.0.1:3001 weight=2</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">keepalive</span> <span class="token number">32</span></span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">&#123;</span>
    <span class="token directive"><span class="token keyword">listen</span> <span class="token number">443</span> ssl http2</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">server_name</span> blog.example.com</span><span class="token punctuation">;</span>

    <span class="token directive"><span class="token keyword">ssl_certificate</span>     /etc/ssl/certs/blog.pem</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">ssl_certificate_key</span> /etc/ssl/private/blog.key</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">ssl_protocols</span>       TLSv1.2 TLSv1.3</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">ssl_ciphers</span>         HIGH:!aNULL:!MD5</span><span class="token punctuation">;</span>

    <span class="token directive"><span class="token keyword">root</span> /var/www/blog</span><span class="token punctuation">;</span>
    <span class="token directive"><span class="token keyword">index</span> index.html</span><span class="token punctuation">;</span>

    <span class="token comment"># 静态资源缓存</span>
    <span class="token directive"><span class="token keyword">location</span> ~* \.(css|js|woff2|png|jpg|webp)$</span> <span class="token punctuation">&#123;</span>
        <span class="token directive"><span class="token keyword">expires</span> <span class="token number">30d</span></span><span class="token punctuation">;</span>
        <span class="token directive"><span class="token keyword">add_header</span> Cache-Control <span class="token string">"public, immutable"</span></span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token comment"># API 反向代理</span>
    <span class="token directive"><span class="token keyword">location</span> /api/</span> <span class="token punctuation">&#123;</span>
        <span class="token directive"><span class="token keyword">proxy_pass</span> http://blog_backend</span><span class="token punctuation">;</span>
        <span class="token directive"><span class="token keyword">proxy_set_header</span> Host $host</span><span class="token punctuation">;</span>
        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Real-IP $remote_addr</span><span class="token punctuation">;</span>
        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-For $proxy_add_x_forwarded_for</span><span class="token punctuation">;</span>
        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Proto $scheme</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token comment"># SPA 路由回退</span>
    <span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">&#123;</span>
        <span class="token directive"><span class="token keyword">try_files</span> $uri $uri/ /index.html</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="C"><a href="#C" class="headerlink" title="C"></a>C</h2><pre class="line-numbers language-c" data-language="c"><code class="language-c"><span class="token comment">// C 示例 — 指针、结构体、内存管理</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;stdlib.h></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;string.h></span></span>

<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">MAX_SIZE</span> <span class="token expression"><span class="token number">256</span></span></span>

<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">Node</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">int</span> data<span class="token punctuation">;</span>
    <span class="token keyword">struct</span> <span class="token class-name">Node</span><span class="token operator">*</span> next<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span> Node<span class="token punctuation">;</span>

<span class="token comment">// 创建新节点</span>
Node<span class="token operator">*</span> <span class="token function">create_node</span><span class="token punctuation">(</span><span class="token keyword">int</span> data<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    Node<span class="token operator">*</span> node <span class="token operator">=</span> <span class="token punctuation">(</span>Node<span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">malloc</span><span class="token punctuation">(</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>Node<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>node <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token function">fprintf</span><span class="token punctuation">(</span><span class="token constant">stderr</span><span class="token punctuation">,</span> <span class="token string">"Memory allocation failed\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token function">exit</span><span class="token punctuation">(</span>EXIT_FAILURE<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
    node<span class="token operator">-></span>data <span class="token operator">=</span> data<span class="token punctuation">;</span>
    node<span class="token operator">-></span>next <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> node<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token comment">// 链表反转</span>
Node<span class="token operator">*</span> <span class="token function">reverse_list</span><span class="token punctuation">(</span>Node<span class="token operator">*</span> head<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    Node<span class="token operator">*</span> prev <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    Node<span class="token operator">*</span> current <span class="token operator">=</span> head<span class="token punctuation">;</span>
    Node<span class="token operator">*</span> next <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span> <span class="token punctuation">(</span>current <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        next <span class="token operator">=</span> current<span class="token operator">-></span>next<span class="token punctuation">;</span>
        current<span class="token operator">-></span>next <span class="token operator">=</span> prev<span class="token punctuation">;</span>
        prev <span class="token operator">=</span> current<span class="token punctuation">;</span>
        current <span class="token operator">=</span> next<span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
    <span class="token keyword">return</span> prev<span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token comment">// 安全字符串拷贝</span>
<span class="token keyword">void</span> <span class="token function">safe_copy</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token operator">*</span> dest<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span><span class="token operator">*</span> src<span class="token punctuation">,</span> <span class="token class-name">size_t</span> size<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token function">strncpy</span><span class="token punctuation">(</span>dest<span class="token punctuation">,</span> src<span class="token punctuation">,</span> size <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    dest<span class="token punctuation">[</span>size <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token char">'\0'</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span><span class="token operator">*</span> argv<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    Node<span class="token operator">*</span> head <span class="token operator">=</span> <span class="token function">create_node</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    head<span class="token operator">-></span>next <span class="token operator">=</span> <span class="token function">create_node</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    head<span class="token operator">-></span>next<span class="token operator">-></span>next <span class="token operator">=</span> <span class="token function">create_node</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    head <span class="token operator">=</span> <span class="token function">reverse_list</span><span class="token punctuation">(</span>head<span class="token punctuation">)</span><span class="token punctuation">;</span>

    Node<span class="token operator">*</span> cur <span class="token operator">=</span> head<span class="token punctuation">;</span>
    <span class="token keyword">while</span> <span class="token punctuation">(</span>cur <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d -> "</span><span class="token punctuation">,</span> cur<span class="token operator">-></span>data<span class="token punctuation">)</span><span class="token punctuation">;</span>
        cur <span class="token operator">=</span> cur<span class="token operator">-></span>next<span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"NULL\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">while</span> <span class="token punctuation">(</span>head <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        Node<span class="token operator">*</span> tmp <span class="token operator">=</span> head<span class="token punctuation">;</span>
        head <span class="token operator">=</span> head<span class="token operator">-></span>next<span class="token punctuation">;</span>
        <span class="token function">free</span><span class="token punctuation">(</span>tmp<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="C-1"><a href="#C-1" class="headerlink" title="C++"></a>C++</h2><pre class="line-numbers language-cpp" data-language="cpp"><code class="language-cpp"><span class="token comment">// C++ 示例 — 模板、STL、智能指针</span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;iostream></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;vector></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;memory></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;algorithm></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;optional></span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;concepts></span></span>

<span class="token keyword">template</span><span class="token operator">&lt;</span><span class="token keyword">typename</span> <span class="token class-name">T</span><span class="token operator">></span>
<span class="token keyword">concept</span> <span class="token class-name">Numeric</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span>integral<span class="token operator">&lt;</span>T<span class="token operator">></span> <span class="token operator">||</span> std<span class="token double-colon punctuation">::</span>floating_point<span class="token operator">&lt;</span>T<span class="token operator">></span><span class="token punctuation">;</span>

<span class="token keyword">template</span><span class="token operator">&lt;</span>Numeric T<span class="token operator">></span>
<span class="token keyword">class</span> <span class="token class-name">Matrix</span> <span class="token punctuation">&#123;</span>
<span class="token keyword">private</span><span class="token operator">:</span>
    std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span>T<span class="token operator">>></span> data<span class="token punctuation">;</span>
    size_t rows<span class="token punctuation">,</span> cols<span class="token punctuation">;</span>

<span class="token keyword">public</span><span class="token operator">:</span>
    <span class="token function">Matrix</span><span class="token punctuation">(</span>size_t r<span class="token punctuation">,</span> size_t c<span class="token punctuation">,</span> T init <span class="token operator">=</span> T<span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span><span class="token punctuation">)</span>
        <span class="token operator">:</span> <span class="token function">rows</span><span class="token punctuation">(</span>r<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">cols</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">data</span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">vector</span><span class="token generic class-name"><span class="token operator">&lt;</span>T<span class="token operator">></span></span></span><span class="token punctuation">(</span>c<span class="token punctuation">,</span> init<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span><span class="token punctuation">&#125;</span>

    T<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span>size_t i<span class="token punctuation">,</span> size_t j<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token keyword">return</span> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>
    <span class="token keyword">const</span> T<span class="token operator">&amp;</span> <span class="token keyword">operator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">(</span>size_t i<span class="token punctuation">,</span> size_t j<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">&#123;</span> <span class="token keyword">return</span> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">&#125;</span>

    Matrix <span class="token keyword">operator</span><span class="token operator">+</span><span class="token punctuation">(</span><span class="token keyword">const</span> Matrix<span class="token operator">&amp;</span> other<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">&#123;</span>
        Matrix <span class="token function">result</span><span class="token punctuation">(</span>rows<span class="token punctuation">,</span> cols<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span>size_t i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> rows<span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span>
            <span class="token keyword">for</span> <span class="token punctuation">(</span>size_t j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator">&lt;</span> cols<span class="token punctuation">;</span> <span class="token operator">++</span>j<span class="token punctuation">)</span>
                <span class="token function">result</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span> <span class="token operator">=</span> data<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token function">other</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> j<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> result<span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">static</span> std<span class="token double-colon punctuation">::</span>unique_ptr<span class="token operator">&lt;</span>Matrix<span class="token operator">></span> <span class="token function">create</span><span class="token punctuation">(</span>size_t r<span class="token punctuation">,</span> size_t c<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
        <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">make_unique</span><span class="token generic class-name"><span class="token operator">&lt;</span>Matrix<span class="token operator">></span></span></span><span class="token punctuation">(</span>r<span class="token punctuation">,</span> c<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span class="token punctuation">;</span>

<span class="token keyword">auto</span> <span class="token function">get_stats</span><span class="token punctuation">(</span><span class="token keyword">const</span> std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">></span><span class="token operator">&amp;</span> v<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">auto</span> <span class="token punctuation">[</span>min_it<span class="token punctuation">,</span> max_it<span class="token punctuation">]</span> <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">minmax_element</span><span class="token punctuation">(</span>v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">double</span> avg <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">accumulate</span><span class="token punctuation">(</span>v<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> v<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0.0</span><span class="token punctuation">)</span> <span class="token operator">/</span> v<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> std<span class="token double-colon punctuation">::</span><span class="token function">make_tuple</span><span class="token punctuation">(</span><span class="token operator">*</span>min_it<span class="token punctuation">,</span> <span class="token operator">*</span>max_it<span class="token punctuation">,</span> avg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>
    <span class="token keyword">auto</span> m <span class="token operator">=</span> <span class="token class-name">Matrix</span><span class="token double-colon punctuation">::</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">(</span><span class="token operator">*</span>m<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">5.0</span><span class="token punctuation">;</span>

    std<span class="token double-colon punctuation">::</span>vector<span class="token operator">&lt;</span><span class="token keyword">int</span><span class="token operator">></span> nums <span class="token operator">=</span> <span class="token punctuation">&#123;</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">&#125;</span><span class="token punctuation">;</span>
    <span class="token keyword">auto</span> <span class="token punctuation">[</span>min<span class="token punctuation">,</span> max<span class="token punctuation">,</span> avg<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">get_stats</span><span class="token punctuation">(</span>nums<span class="token punctuation">)</span><span class="token punctuation">;</span>

    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> <span class="token string">"Min: "</span> <span class="token operator">&lt;&lt;</span> min <span class="token operator">&lt;&lt;</span> <span class="token string">", Max: "</span> <span class="token operator">&lt;&lt;</span> max
              <span class="token operator">&lt;&lt;</span> <span class="token string">", Avg: "</span> <span class="token operator">&lt;&lt;</span> avg <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>

    std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>nums<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> nums<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span> <span class="token keyword">return</span> a <span class="token operator">></span> b<span class="token punctuation">;</span> <span class="token punctuation">&#125;</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">auto</span><span class="token operator">&amp;</span> n <span class="token operator">:</span> nums<span class="token punctuation">)</span> std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> n <span class="token operator">&lt;&lt;</span> <span class="token char">' '</span><span class="token punctuation">;</span>
    std<span class="token double-colon punctuation">::</span>cout <span class="token operator">&lt;&lt;</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span>

    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="C-2"><a href="#C-2" class="headerlink" title="C#"></a>C#</h2><pre class="line-numbers language-csharp" data-language="csharp"><code class="language-csharp"><span class="token comment">// C# 示例 — LINQ、异步、泛型</span>
<span class="token keyword">using</span> <span class="token namespace">System</span><span class="token punctuation">;</span>
<span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Collections<span class="token punctuation">.</span>Generic</span><span class="token punctuation">;</span>
<span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Linq</span><span class="token punctuation">;</span>
<span class="token keyword">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Threading<span class="token punctuation">.</span>Tasks</span><span class="token punctuation">;</span>

<span class="token keyword">namespace</span> <span class="token namespace">BlogDemo</span>
<span class="token punctuation">&#123;</span>
    <span class="token keyword">public</span> <span class="token keyword">record</span> <span class="token class-name">Post</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> Id<span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">string</span></span> Title<span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">string</span></span> Author<span class="token punctuation">,</span> <span class="token class-name"><span class="token keyword">int</span></span> Views<span class="token punctuation">,</span> <span class="token class-name">DateTime</span> PublishedAt<span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">BlogService</span>
    <span class="token punctuation">&#123;</span>
        <span class="token keyword">private</span> <span class="token keyword">readonly</span> <span class="token class-name">List<span class="token punctuation">&lt;</span>Post<span class="token punctuation">></span></span> _posts <span class="token operator">=</span> <span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">public</span> <span class="token return-type class-name"><span class="token keyword">void</span></span> <span class="token function">AddPost</span><span class="token punctuation">(</span><span class="token class-name">Post</span> post<span class="token punctuation">)</span> <span class="token operator">=></span> _posts<span class="token punctuation">.</span><span class="token function">Add</span><span class="token punctuation">(</span>post<span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">public</span> <span class="token return-type class-name">IEnumerable<span class="token punctuation">&lt;</span>Post<span class="token punctuation">></span></span> <span class="token function">GetTopPosts</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> count<span class="token punctuation">)</span>
        <span class="token punctuation">&#123;</span>
            <span class="token keyword">return</span> _posts
                <span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>p <span class="token operator">=></span> p<span class="token punctuation">.</span>PublishedAt <span class="token operator">&lt;</span> DateTime<span class="token punctuation">.</span>Now<span class="token punctuation">)</span>
                <span class="token punctuation">.</span><span class="token function">OrderByDescending</span><span class="token punctuation">(</span>p <span class="token operator">=></span> p<span class="token punctuation">.</span>Views<span class="token punctuation">)</span>
                <span class="token punctuation">.</span><span class="token function">Take</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">&#125;</span>

        <span class="token keyword">public</span> <span class="token return-type class-name">Dictionary<span class="token punctuation">&lt;</span><span class="token keyword">string</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">></span></span> <span class="token function">GetAuthorStats</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">&#123;</span>
            <span class="token keyword">return</span> _posts
                <span class="token punctuation">.</span><span class="token function">GroupBy</span><span class="token punctuation">(</span>p <span class="token operator">=></span> p<span class="token punctuation">.</span>Author<span class="token punctuation">)</span>
                <span class="token punctuation">.</span><span class="token function">ToDictionary</span><span class="token punctuation">(</span>g <span class="token operator">=></span> g<span class="token punctuation">.</span>Key<span class="token punctuation">,</span> g <span class="token operator">=></span> g<span class="token punctuation">.</span><span class="token function">Count</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">&#125;</span>

        <span class="token keyword">public</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task<span class="token punctuation">&lt;</span>Post<span class="token punctuation">?</span><span class="token punctuation">></span></span> <span class="token function">FindByIdAsync</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">int</span></span> id<span class="token punctuation">)</span>
        <span class="token punctuation">&#123;</span>
            <span class="token keyword">await</span> Task<span class="token punctuation">.</span><span class="token function">Delay</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span> _posts<span class="token punctuation">.</span><span class="token function">FirstOrDefault</span><span class="token punctuation">(</span>p <span class="token operator">=></span> p<span class="token punctuation">.</span>Id <span class="token operator">==</span> id<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">&#125;</span>

        <span class="token keyword">public</span> <span class="token return-type class-name">T<span class="token punctuation">[</span><span class="token punctuation">]</span></span> <span class="token generic-method"><span class="token function">Filter</span><span class="token generic class-name"><span class="token punctuation">&lt;</span>T<span class="token punctuation">></span></span></span><span class="token punctuation">(</span><span class="token class-name">IEnumerable<span class="token punctuation">&lt;</span>T<span class="token punctuation">></span></span> source<span class="token punctuation">,</span> <span class="token class-name">Func<span class="token punctuation">&lt;</span>T<span class="token punctuation">,</span> <span class="token keyword">bool</span><span class="token punctuation">></span></span> predicate<span class="token punctuation">)</span>
        <span class="token punctuation">&#123;</span>
            <span class="token keyword">return</span> source<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>predicate<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ToArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>

    <span class="token keyword">class</span> <span class="token class-name">Program</span>
    <span class="token punctuation">&#123;</span>
        <span class="token keyword">static</span> <span class="token keyword">async</span> <span class="token return-type class-name">Task</span> <span class="token function">Main</span><span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">string</span><span class="token punctuation">[</span><span class="token punctuation">]</span></span> args<span class="token punctuation">)</span>
        <span class="token punctuation">&#123;</span>
            <span class="token class-name"><span class="token keyword">var</span></span> service <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token constructor-invocation class-name">BlogService</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            service<span class="token punctuation">.</span><span class="token function">AddPost</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">Post</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"Hello"</span><span class="token punctuation">,</span> <span class="token string">"Alice"</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> DateTime<span class="token punctuation">.</span>Now<span class="token punctuation">.</span><span class="token function">AddDays</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            service<span class="token punctuation">.</span><span class="token function">AddPost</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">Post</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token string">"World"</span><span class="token punctuation">,</span> <span class="token string">"Bob"</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">,</span> DateTime<span class="token punctuation">.</span>Now<span class="token punctuation">.</span><span class="token function">AddDays</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            service<span class="token punctuation">.</span><span class="token function">AddPost</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token constructor-invocation class-name">Post</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token string">"C# Tips"</span><span class="token punctuation">,</span> <span class="token string">"Alice"</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">,</span> DateTime<span class="token punctuation">.</span>Now<span class="token punctuation">.</span><span class="token function">AddDays</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token class-name"><span class="token keyword">var</span></span> top <span class="token operator">=</span> service<span class="token punctuation">.</span><span class="token function">GetTopPosts</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword">var</span></span> post <span class="token keyword">in</span> top<span class="token punctuation">)</span>
                Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span>$<span class="token string">"&#123;post.Title&#125; by &#123;post.Author&#125; (&#123;post.Views&#125; views)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token class-name"><span class="token keyword">var</span></span> found <span class="token operator">=</span> <span class="token keyword">await</span> service<span class="token punctuation">.</span><span class="token function">FindByIdAsync</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            Console<span class="token punctuation">.</span><span class="token function">WriteLine</span><span class="token punctuation">(</span>$<span class="token string">"Found: &#123;found?.Title ?? "</span>Not found<span class="token string">"&#125;"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">&#125;</span>
    <span class="token punctuation">&#125;</span>
<span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="YAML"><a href="#YAML" class="headerlink" title="YAML"></a>YAML</h2><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token comment"># _config.yml 示例</span>
<span class="token key atrule">title</span><span class="token punctuation">:</span> 我的博客
<span class="token key atrule">subtitle</span><span class="token punctuation">:</span> 记录生活与技术
<span class="token key atrule">description</span><span class="token punctuation">:</span> 一个使用 Hexo + moeMac 主题的个人博客
<span class="token key atrule">language</span><span class="token punctuation">:</span> zh<span class="token punctuation">-</span>CN
<span class="token key atrule">timezone</span><span class="token punctuation">:</span> Asia/Shanghai

<span class="token key atrule">url</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//blog.example.com
<span class="token key atrule">root</span><span class="token punctuation">:</span> /
<span class="token key atrule">permalink</span><span class="token punctuation">:</span> posts/<span class="token punctuation">:</span>abbrlink/

<span class="token key atrule">theme</span><span class="token punctuation">:</span> moeMac

<span class="token key atrule">highlight</span><span class="token punctuation">:</span>
  <span class="token key atrule">enable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">line_number</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">auto_detect</span><span class="token punctuation">:</span> <span class="token boolean important">false</span>
  <span class="token key atrule">tab_replace</span><span class="token punctuation">:</span> <span class="token string">'  '</span>

<span class="token key atrule">deploy</span><span class="token punctuation">:</span>
  <span class="token key atrule">type</span><span class="token punctuation">:</span> git
  <span class="token key atrule">repo</span><span class="token punctuation">:</span> git@github.com<span class="token punctuation">:</span>user/blog.git
  <span class="token key atrule">branch</span><span class="token punctuation">:</span> gh<span class="token punctuation">-</span>pages

<span class="token key atrule">social</span><span class="token punctuation">:</span>
  <span class="token key atrule">github</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//github.com/user
  <span class="token key atrule">twitter</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//twitter.com/user
  <span class="token key atrule">email</span><span class="token punctuation">:</span> mailto<span class="token punctuation">:</span>user@example.com

<span class="token key atrule">menu</span><span class="token punctuation">:</span>
  <span class="token key atrule">home</span><span class="token punctuation">:</span> /
  <span class="token key atrule">archives</span><span class="token punctuation">:</span> /archives
  <span class="token key atrule">about</span><span class="token punctuation">:</span> /about<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h2 id="行内代码演示"><a href="#行内代码演示" class="headerlink" title="行内代码演示"></a>行内代码演示</h2><p>这是一段包含行内代码的文字：使用 <code>npm install</code> 安装依赖，然后用 <code>npx hexo server</code> 启动本地服务器。你还可以用 <code>Ctrl + A</code> 选中所有代码，行号不会被选中哦！</p>
<h2 id="纯文本代码块（无语言标记）"><a href="#纯文本代码块（无语言标记）" class="headerlink" title="纯文本代码块（无语言标记）"></a>纯文本代码块（无语言标记）</h2><pre class="line-numbers language-none"><code class="language-none">这是一个没有指定语言的纯文本代码块
没有语法高亮
但依然有行号和 Mac 风格窗口<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h2 id="超长行（测试水平滚动）"><a href="#超长行（测试水平滚动）" class="headerlink" title="超长行（测试水平滚动）"></a>超长行（测试水平滚动）</h2><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token keyword">const</span> veryLongLine <span class="token operator">=</span> <span class="token punctuation">&#123;</span> <span class="token literal-property property">id</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token literal-property property">name</span><span class="token operator">:</span> <span class="token string">'This is a very long line to test horizontal scrolling behavior of the code block container, it should scroll smoothly without breaking the layout or causing the line numbers to misalign'</span><span class="token punctuation">,</span> <span class="token literal-property property">value</span><span class="token operator">:</span> <span class="token number">42</span><span class="token punctuation">,</span> <span class="token literal-property property">timestamp</span><span class="token operator">:</span> Date<span class="token punctuation">.</span><span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token literal-property property">metadata</span><span class="token operator">:</span> <span class="token punctuation">&#123;</span> <span class="token literal-property property">source</span><span class="token operator">:</span> <span class="token string">'test'</span><span class="token punctuation">,</span> <span class="token literal-property property">priority</span><span class="token operator">:</span> <span class="token string">'high'</span><span class="token punctuation">,</span> <span class="token literal-property property">tags</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">'long'</span><span class="token punctuation">,</span> <span class="token string">'scroll'</span><span class="token punctuation">,</span> <span class="token string">'demo'</span><span class="token punctuation">]</span> <span class="token punctuation">&#125;</span> <span class="token punctuation">&#125;</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h2 id="多行代码（测试三位数行号）"><a href="#多行代码（测试三位数行号）" class="headerlink" title="多行代码（测试三位数行号）"></a>多行代码（测试三位数行号）</h2><pre class="line-numbers language-javascript" data-language="javascript"><code class="language-javascript"><span class="token comment">// 第 1 行 — 测试三位数行号的显示</span>
<span class="token comment">// 第 2 行</span>
<span class="token comment">// 第 3 行</span>
<span class="token comment">// 第 4 行</span>
<span class="token comment">// 第 5 行</span>
<span class="token comment">// 第 6 行</span>
<span class="token comment">// 第 7 行</span>
<span class="token comment">// 第 8 行</span>
<span class="token comment">// 第 9 行</span>
<span class="token comment">// 第 10 行</span>
<span class="token comment">// 第 11 行</span>
<span class="token comment">// 第 12 行</span>
<span class="token comment">// 第 13 行</span>
<span class="token comment">// 第 14 行</span>
<span class="token comment">// 第 15 行</span>
<span class="token comment">// 第 16 行</span>
<span class="token comment">// 第 17 行</span>
<span class="token comment">// 第 18 行</span>
<span class="token comment">// 第 19 行</span>
<span class="token comment">// 第 20 行</span>
<span class="token comment">// 第 21 行</span>
<span class="token comment">// 第 22 行</span>
<span class="token comment">// 第 23 行</span>
<span class="token comment">// 第 24 行</span>
<span class="token comment">// 第 25 行</span>
<span class="token comment">// 第 26 行</span>
<span class="token comment">// 第 27 行</span>
<span class="token comment">// 第 28 行</span>
<span class="token comment">// 第 29 行</span>
<span class="token comment">// 第 30 行</span>
<span class="token comment">// 第 31 行</span>
<span class="token comment">// 第 32 行</span>
<span class="token comment">// 第 33 行</span>
<span class="token comment">// 第 34 行</span>
<span class="token comment">// 第 35 行</span>
<span class="token comment">// 第 36 行</span>
<span class="token comment">// 第 37 行</span>
<span class="token comment">// 第 38 行</span>
<span class="token comment">// 第 39 行</span>
<span class="token comment">// 第 40 行</span>
<span class="token comment">// 第 41 行</span>
<span class="token comment">// 第 42 行</span>
<span class="token comment">// 第 43 行</span>
<span class="token comment">// 第 44 行</span>
<span class="token comment">// 第 45 行</span>
<span class="token comment">// 第 46 行</span>
<span class="token comment">// 第 47 行</span>
<span class="token comment">// 第 48 行</span>
<span class="token comment">// 第 49 行</span>
<span class="token comment">// 第 50 行</span>
<span class="token comment">// 第 51 行</span>
<span class="token comment">// 第 52 行</span>
<span class="token comment">// 第 53 行</span>
<span class="token comment">// 第 54 行</span>
<span class="token comment">// 第 55 行</span>
<span class="token comment">// 第 56 行</span>
<span class="token comment">// 第 57 行</span>
<span class="token comment">// 第 58 行</span>
<span class="token comment">// 第 59 行</span>
<span class="token comment">// 第 60 行</span>
<span class="token comment">// 第 61 行</span>
<span class="token comment">// 第 62 行</span>
<span class="token comment">// 第 63 行</span>
<span class="token comment">// 第 64 行</span>
<span class="token comment">// 第 65 行</span>
<span class="token comment">// 第 66 行</span>
<span class="token comment">// 第 67 行</span>
<span class="token comment">// 第 68 行</span>
<span class="token comment">// 第 69 行</span>
<span class="token comment">// 第 70 行</span>
<span class="token comment">// 第 71 行</span>
<span class="token comment">// 第 72 行</span>
<span class="token comment">// 第 73 行</span>
<span class="token comment">// 第 74 行</span>
<span class="token comment">// 第 75 行</span>
<span class="token comment">// 第 76 行</span>
<span class="token comment">// 第 77 行</span>
<span class="token comment">// 第 78 行</span>
<span class="token comment">// 第 79 行</span>
<span class="token comment">// 第 80 行</span>
<span class="token comment">// 第 81 行</span>
<span class="token comment">// 第 82 行</span>
<span class="token comment">// 第 83 行</span>
<span class="token comment">// 第 84 行</span>
<span class="token comment">// 第 85 行</span>
<span class="token comment">// 第 86 行</span>
<span class="token comment">// 第 87 行</span>
<span class="token comment">// 第 88 行</span>
<span class="token comment">// 第 89 行</span>
<span class="token comment">// 第 90 行</span>
<span class="token comment">// 第 91 行</span>
<span class="token comment">// 第 92 行</span>
<span class="token comment">// 第 93 行</span>
<span class="token comment">// 第 94 行</span>
<span class="token comment">// 第 95 行</span>
<span class="token comment">// 第 96 行</span>
<span class="token comment">// 第 97 行</span>
<span class="token comment">// 第 98 行</span>
<span class="token comment">// 第 99 行</span>
<span class="token comment">// 第 100 行 — 到达三位数行号！</span>
<span class="token comment">// 第 101 行</span>
<span class="token comment">// 第 102 行</span>
<span class="token comment">// 第 103 行</span>
<span class="token comment">// 第 104 行</span>
<span class="token comment">// 第 105 行</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<hr>
<blockquote>
<p><strong>提示</strong>：试试用 <code>Ctrl + A</code> 全选本文，然后 <code>Ctrl + C</code> 复制——你会发现行号完全不会被选中！这就是 CSS counter 伪元素方案的优势。</p>
</blockquote>
]]></description>
      <category>技术</category>
      <author>梦繁星</author>
    </item>
    <item>
      <title>moeMac主题使用说明</title>
      <link>https://moeao.cn/posts/ada921dd.html</link>
      <guid isPermaLink="true">https://moeao.cn/posts/ada921dd.html</guid>
      <pubDate>Sat, 11 Jul 2026 10:00:00 GMT</pubDate>
      <description><![CDATA[<p>moeMac 是一款 <strong>macOS 桌面风格</strong> 的 Hexo 主题，采用毛玻璃（Glassmorphism）设计语言，支持可拖拽窗口、Dock 导航栏、AJAX 无刷新切换、暗黑模式等特性。本文是主题的完整使用指南。</p>
<blockquote>
<p><strong>提示</strong>：本文涵盖从安装到进阶配置的所有内容，建议先通读一遍，再按需查阅。</p>
</blockquote>
<span id="more"></span>


<h2 id="快速开始"><a href="#快速开始" class="headerlink" title="快速开始"></a>快速开始</h2><h3 id="安装主题"><a href="#安装主题" class="headerlink" title="安装主题"></a>安装主题</h3><p>将 moeMac 主题克隆到 Hexo 博客的 <code>themes/</code> 目录：</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> your-hexo-blog
<span class="token function">git</span> clone https://github.com/s-Ruthless/moeMac.git themes/moeMac<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<p>然后在站点配置文件 <code>_config.yml</code> 中启用主题：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">theme</span><span class="token punctuation">:</span> moeMac<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h3 id="插件说明"><a href="#插件说明" class="headerlink" title="插件说明"></a>插件说明</h3><h4 id="hexo-init-自带插件（无需手动安装）"><a href="#hexo-init-自带插件（无需手动安装）" class="headerlink" title="hexo init 自带插件（无需手动安装）"></a>hexo init 自带插件（无需手动安装）</h4><p>以下插件由 <code>hexo init</code> 自动安装，是 Hexo 的标准依赖：</p>
<table>
<thead>
<tr>
<th>插件</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><code>hexo</code></td>
<td>Hexo 核心</td>
</tr>
<tr>
<td><code>hexo-server</code></td>
<td>本地预览服务器</td>
</tr>
<tr>
<td><code>hexo-renderer-ejs</code></td>
<td>EJS 模板渲染</td>
</tr>
<tr>
<td><code>hexo-renderer-marked</code></td>
<td>Markdown 渲染</td>
</tr>
<tr>
<td><code>hexo-renderer-stylus</code></td>
<td>Stylus 渲染</td>
</tr>
<tr>
<td><code>hexo-generator-archive</code></td>
<td>归档页生成</td>
</tr>
<tr>
<td><code>hexo-generator-category</code></td>
<td>分类页生成</td>
</tr>
<tr>
<td><code>hexo-generator-tag</code></td>
<td>标签页生成</td>
</tr>
<tr>
<td><code>hexo-generator-index</code></td>
<td>首页分页生成</td>
</tr>
</tbody></table>
<h4 id="需手动安装的插件"><a href="#需手动安装的插件" class="headerlink" title="需手动安装的插件"></a>需手动安装的插件</h4><p>moeMac 的搜索功能依赖 <code>hexo-generator-searchdb</code>（<code>hexo init</code> 不会自动安装）：</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> hexo-generator-searchdb<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<blockquote>
<p>不需要搜索功能可跳过，在主题 <code>_config.yml</code> 中设置 <code>search: false</code>。</p>
</blockquote>
<h4 id="无需安装任何插件的功能"><a href="#无需安装任何插件的功能" class="headerlink" title="无需安装任何插件的功能"></a>无需安装任何插件的功能</h4><p>以下功能全部由主题内置脚本实现，零外部 npm 依赖：</p>
<table>
<thead>
<tr>
<th>功能</th>
<th>实现脚本</th>
</tr>
</thead>
<tbody><tr>
<td>SEO 短链接</td>
<td><code>scripts/abbrlink.js</code> — CRC32 哈希</td>
</tr>
<tr>
<td>RSS 订阅</td>
<td><code>scripts/rss.js</code> — 生成 atom.xml</td>
</tr>
<tr>
<td>站点地图</td>
<td><code>scripts/sitemap.js</code> — 生成 sitemap.xml</td>
</tr>
<tr>
<td>豆瓣书影音</td>
<td><code>scripts/douban-sync.js</code></td>
</tr>
<tr>
<td>标签外挂</td>
<td><code>scripts/tag-plugins.js</code> + <code>scripts/container-blocks.js</code></td>
</tr>
<tr>
<td>TOC 目录</td>
<td><code>scripts/helpers.js</code></td>
</tr>
<tr>
<td>KaTeX 公式</td>
<td><code>scripts/katex-render.js</code></td>
</tr>
<tr>
<td>Mermaid 图表</td>
<td><code>scripts/mermaid-render.js</code></td>
</tr>
</tbody></table>
<blockquote>
<p><code>themes/moeMac/scripts/</code> 下的 JS 文件是 Hexo 构建时脚本，运行在 Node.js 服务端，不可通过 CDN 引用。</p>
</blockquote>
<h3 id="启动预览"><a href="#启动预览" class="headerlink" title="启动预览"></a>启动预览</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo clean <span class="token operator">&amp;&amp;</span> hexo server<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>打开 <code>http://localhost:4000</code> 即可看到效果。</p>
<h2 id="基本配置"><a href="#基本配置" class="headerlink" title="基本配置"></a>基本配置</h2><p>所有主题配置在 <code>themes/moeMac/_config.yml</code> 中完成。</p>
<h3 id="站点信息"><a href="#站点信息" class="headerlink" title="站点信息"></a>站点信息</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">blog_name</span><span class="token punctuation">:</span> <span class="token string">"你的博客名"</span>
<span class="token key atrule">blog_description</span><span class="token punctuation">:</span> <span class="token string">"一句话描述&lt;br>可换行"</span>
<span class="token key atrule">author</span><span class="token punctuation">:</span> <span class="token string">"你的名字"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="主题色"><a href="#主题色" class="headerlink" title="主题色"></a>主题色</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">accent_color</span><span class="token punctuation">:</span> <span class="token string">"#cf0226"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>主题色会影响全站的强调色，包括链接、按钮、标签、Dock 高亮等。支持任何合法的 CSS 颜色值。</p>
<h3 id="头像"><a href="#头像" class="headerlink" title="头像"></a>头像</h3><p>支持图片头像和文字头像两种模式：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token comment"># 图片头像</span>
<span class="token key atrule">avatar_type</span><span class="token punctuation">:</span> <span class="token string">"image"</span>
<span class="token key atrule">avatar_url</span><span class="token punctuation">:</span> <span class="token string">"https://example.com/avatar.jpg"</span>

<span class="token comment"># 文字头像</span>
<span class="token key atrule">avatar_type</span><span class="token punctuation">:</span> <span class="token string">"text"</span>
<span class="token key atrule">avatar_text</span><span class="token punctuation">:</span> <span class="token string">"梦繁星"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="社交链接"><a href="#社交链接" class="headerlink" title="社交链接"></a>社交链接</h3><p>在首页「我的主页」窗口中显示社交按钮：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">social</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"github"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"https://github.com/yourname"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"GitHub"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"email"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"mailto:you@example.com"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"邮箱"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"qq"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"tencent://message/?uin=123456"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"QQ"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"twitter"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"https://twitter.com/yourname"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"Twitter"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"bilibili"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"https://space.bilibili.com/123456"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"B站"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"zhihu"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"https://www.zhihu.com/people/yourname"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"知乎"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"link"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"https://your-link.com"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"自定义"</span> <span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="Favicon"><a href="#Favicon" class="headerlink" title="Favicon"></a>Favicon</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">favicon</span><span class="token punctuation">:</span> <span class="token string">""</span>                    <span class="token comment"># 自定义 favicon 路径，留空则使用 emoji</span>
<span class="token key atrule">favicon_emoji</span><span class="token punctuation">:</span> <span class="token string">"🌿"</span>            <span class="token comment"># emoji 图标作为 favicon</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>


<h2 id="Dock-导航栏"><a href="#Dock-导航栏" class="headerlink" title="Dock 导航栏"></a>Dock 导航栏</h2><p>Dock 栏位于屏幕底部，类似 macOS 的 Dock，支持站内页面和外部链接：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">dock</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-house"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"首页"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-newspaper"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"文章"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/posts/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-folder-open"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"归档"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/archives/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-images"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"相册"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/gallery/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-book"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"豆瓣"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/douban/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-comments"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"动态"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/dynamic/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-link"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"友链"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/links/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">icon</span><span class="token punctuation">:</span> <span class="token string">"fas fa-heart"</span><span class="token punctuation">,</span> <span class="token key atrule">label</span><span class="token punctuation">:</span> <span class="token string">"关于"</span><span class="token punctuation">,</span> <span class="token key atrule">page</span><span class="token punctuation">:</span> <span class="token string">"/about/"</span><span class="token punctuation">,</span> <span class="token key atrule">type</span><span class="token punctuation">:</span> <span class="token string">"page"</span> <span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<ul>
<li><code>icon</code>：Font Awesome 图标类名</li>
<li><code>type: &quot;page&quot;</code> 为站内页面（AJAX 加载），<code>type: &quot;link&quot;</code> 为外链（新窗口打开）</li>
</ul>
<blockquote>
<p>RSS 按钮由 <code>rss.show_in_home: true</code> 控制自动显示在主页社交图标区，无需在 Dock 中配置。</p>
</blockquote>
<h2 id="首页窗口"><a href="#首页窗口" class="headerlink" title="首页窗口"></a>首页窗口</h2><p>首页采用浮动窗口布局，可自由配置显示哪些窗口及排列顺序：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">home_windows</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> <span class="token string">"posts"</span>       <span class="token comment"># 最新文章</span>
  <span class="token punctuation">-</span> <span class="token string">"categories"</span>  <span class="token comment"># 分类</span>
  <span class="token punctuation">-</span> <span class="token string">"tags"</span>        <span class="token comment"># 标签云</span>
  <span class="token punctuation">-</span> <span class="token string">"music"</span>       <span class="token comment"># 音乐播放器</span>
  <span class="token punctuation">-</span> <span class="token string">"data"</span>        <span class="token comment"># 站点数据</span>
  <span class="token punctuation">-</span> <span class="token string">"info"</span>        <span class="token comment"># 网站信息</span>

<span class="token key atrule">recent_posts_count</span><span class="token punctuation">:</span> <span class="token number">5</span>  <span class="token comment"># 最新文章窗口显示的文章数</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="窗口交互"><a href="#窗口交互" class="headerlink" title="窗口交互"></a>窗口交互</h3><ul>
<li><strong>拖拽</strong>：按住窗口标题栏可自由拖动位置</li>
<li><strong>关闭&#x2F;最小化</strong>：点击窗口左上角红绿灯按钮</li>
<li><strong>置顶</strong>：点击绿色图钉按钮可将窗口置顶</li>
<li><strong>调整大小</strong>：拖动窗口右下角可调整大小</li>
<li><strong>Dock 恢复</strong>：最小化后点击 Dock 图标恢复窗口</li>
</ul>
<h2 id="音乐播放器"><a href="#音乐播放器" class="headerlink" title="音乐播放器"></a>音乐播放器</h2><p>moeMac 内置音乐播放器，基于 MetingJS，支持网易云&#x2F;QQ音乐&#x2F;酷狗等平台：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">meting_api</span><span class="token punctuation">:</span> <span class="token string">"https://api.injahow.cn/meting/"</span>  <span class="token comment"># Meting API 地址</span>
<span class="token key atrule">platform</span><span class="token punctuation">:</span> <span class="token string">"netease"</span>        <span class="token comment"># 音乐平台</span>
<span class="token key atrule">playlist_id</span><span class="token punctuation">:</span> <span class="token string">"18117638485"</span> <span class="token comment"># 歌单 ID</span>
<span class="token key atrule">show_desktop_lyrics</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>  <span class="token comment"># 桌面歌词</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<p><strong>获取歌单 ID</strong>：打开网易云音乐网页版，找到你的歌单，URL 中的数字即为 ID。</p>
<blockquote>
<p>推荐自建 Meting API 以避免公共 API 限流。</p>
</blockquote>
<h2 id="评论系统"><a href="#评论系统" class="headerlink" title="评论系统"></a>评论系统</h2><p>支持 Waline &#x2F; Twikoo &#x2F; Giscus &#x2F; Gitalk &#x2F; CWD &#x2F; VWD 六种评论系统：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">comments</span><span class="token punctuation">:</span>
  <span class="token key atrule">enable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">provider</span><span class="token punctuation">:</span> <span class="token string">"waline"</span>  <span class="token comment"># waline / twikoo / giscus / gitalk / cwd / vwd</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="Waline"><a href="#Waline" class="headerlink" title="Waline"></a>Waline</h3><blockquote>
<p>官方文档：<a href="https://waline.js.org/">https://waline.js.org/</a></p>
</blockquote>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">waline</span><span class="token punctuation">:</span>
  <span class="token key atrule">serverURL</span><span class="token punctuation">:</span> <span class="token string">"https://your-waline.vercel.app"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="Twikoo"><a href="#Twikoo" class="headerlink" title="Twikoo"></a>Twikoo</h3><blockquote>
<p>官方文档：<a href="https://twikoo.js.org/">https://twikoo.js.org/</a></p>
</blockquote>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">twikoo</span><span class="token punctuation">:</span>
  <span class="token key atrule">envId</span><span class="token punctuation">:</span> <span class="token string">""</span>               <span class="token comment"># 腾讯云环境ID 或自建地址</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="Giscus（基于-GitHub-Discussions）"><a href="#Giscus（基于-GitHub-Discussions）" class="headerlink" title="Giscus（基于 GitHub Discussions）"></a>Giscus（基于 GitHub Discussions）</h3><blockquote>
<p>官方文档：<a href="https://giscus.app/">https://giscus.app/</a></p>
</blockquote>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">giscus</span><span class="token punctuation">:</span>
  <span class="token key atrule">repo</span><span class="token punctuation">:</span> <span class="token string">"owner/repo"</span>
  <span class="token key atrule">repoId</span><span class="token punctuation">:</span> <span class="token string">"R_xxx"</span>
  <span class="token key atrule">category</span><span class="token punctuation">:</span> <span class="token string">"Announcements"</span>
  <span class="token key atrule">categoryId</span><span class="token punctuation">:</span> <span class="token string">"DIC_xxx"</span>
  <span class="token key atrule">mapping</span><span class="token punctuation">:</span> <span class="token string">"pathname"</span>
  <span class="token key atrule">inputPosition</span><span class="token punctuation">:</span> <span class="token string">"top"</span>
  <span class="token key atrule">reactionsEnabled</span><span class="token punctuation">:</span> <span class="token number">0</span>
  <span class="token key atrule">theme_light</span><span class="token punctuation">:</span> <span class="token string">"noborder_light"</span>
  <span class="token key atrule">theme_dark</span><span class="token punctuation">:</span> <span class="token string">"noborder_dark"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="Gitalk（基于-GitHub-Issues）"><a href="#Gitalk（基于-GitHub-Issues）" class="headerlink" title="Gitalk（基于 GitHub Issues）"></a>Gitalk（基于 GitHub Issues）</h3><blockquote>
<p>官方文档：<a href="https://github.com/gitalk/gitalk">https://github.com/gitalk/gitalk</a></p>
</blockquote>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">gitalk</span><span class="token punctuation">:</span>
  <span class="token key atrule">clientID</span><span class="token punctuation">:</span> <span class="token string">""</span>
  <span class="token key atrule">clientSecret</span><span class="token punctuation">:</span> <span class="token string">""</span>
  <span class="token key atrule">repo</span><span class="token punctuation">:</span> <span class="token string">""</span>
  <span class="token key atrule">owner</span><span class="token punctuation">:</span> <span class="token string">""</span>
  <span class="token key atrule">admin</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">""</span><span class="token punctuation">]</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="CWD（基于-Cloudflare-Workers）"><a href="#CWD（基于-Cloudflare-Workers）" class="headerlink" title="CWD（基于 Cloudflare Workers）"></a>CWD（基于 Cloudflare Workers）</h3><blockquote>
<p>官方文档：<a href="https://cwd.js.org/">https://cwd.js.org/</a></p>
</blockquote>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">cwd</span><span class="token punctuation">:</span>
  <span class="token key atrule">apiBaseUrl</span><span class="token punctuation">:</span> <span class="token string">"https://your-cwd-api.workers.dev"</span>
  <span class="token key atrule">siteId</span><span class="token punctuation">:</span> <span class="token string">"blog"</span>
  <span class="token key atrule">lang</span><span class="token punctuation">:</span> <span class="token string">"auto"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="VWD（基于-Vercel-Serverless）"><a href="#VWD（基于-Vercel-Serverless）" class="headerlink" title="VWD（基于 Vercel Serverless）"></a>VWD（基于 Vercel Serverless）</h3><p>VWD 是基于 Vercel Serverless 的评论系统，部署简单，适合个人博客使用。</p>
<blockquote>
<p>官方文档：<a href="https://github.com/s-Ruthless/Vercel-Workers-Discuss">https://github.com/s-Ruthless/Vercel-Workers-Discuss</a></p>
</blockquote>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">vwd</span><span class="token punctuation">:</span>
  <span class="token key atrule">apiBaseUrl</span><span class="token punctuation">:</span> <span class="token string">"https://your-vwd-api.vercel.app"</span>  <span class="token comment"># VWD API 地址（Vercel 部署后的地址）</span>
  <span class="token key atrule">jsUrl</span><span class="token punctuation">:</span> <span class="token string">""</span>               <span class="token comment"># vwd.js 脚本地址，留空则默认使用 apiBaseUrl + /vwd.js</span>
  <span class="token key atrule">siteId</span><span class="token punctuation">:</span> <span class="token string">"blog"</span>           <span class="token comment"># 站点标识，用于多站点数据隔离（推荐配置）</span>
  <span class="token key atrule">lang</span><span class="token punctuation">:</span> <span class="token string">"auto"</span>            <span class="token comment"># 评论组件语言，auto 自动检测浏览器语言</span>
  <span class="token key atrule">customCssUrl</span><span class="token punctuation">:</span> <span class="token string">''</span>         <span class="token comment"># 自定义 CSS 地址，留空则使用默认样式</span>
  <span class="token key atrule">primaryColor</span><span class="token punctuation">:</span> <span class="token string">'#cf0226'</span>  <span class="token comment"># 主题色，影响按钮/链接等强调色</span>
  <span class="token key atrule">saysEnable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>       <span class="token comment"># true 开启说说渲染（动态页面），false 关闭</span>
  <span class="token key atrule">saysPageSize</span><span class="token punctuation">:</span> <span class="token number">10</span>       <span class="token comment"># 每页显示说说数（也可在 VWD 后台设置）</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<blockquote>
<p><strong><code>jsUrl</code> 说明</strong>：留空时默认从 API 服务器远程加载 <code>vwd.js</code>。也可填写自定义地址：</p>
<ul>
<li>远程地址（可加版本号刷新缓存）：<code>jsUrl: &quot;https://vwd.moeao.cn/vwd.js?v=2&quot;</code></li>
<li>本地路径（下载到本地后使用）：<code>jsUrl: &quot;/assets/js/vwd.js&quot;</code></li>
</ul>
</blockquote>
<p>VWD 支持暗黑模式自动切换、Shadow DOM 隔离样式、评论数据本地存储等特性。</p>
<blockquote>
<p>VWD 还支持说说（动态&#x2F;短博文）功能，详见下方<a href="#%E5%8A%A8%E6%80%81%E8%AF%B4%E8%AF%B4">动态说说</a>章节。</p>
</blockquote>
<h3 id="页面级控制"><a href="#页面级控制" class="headerlink" title="页面级控制"></a>页面级控制</h3><p>在文章&#x2F;页面的 front-matter 中：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">title</span><span class="token punctuation">:</span> 不需要评论的文章
<span class="token key atrule">comment</span><span class="token punctuation">:</span> <span class="token boolean important">false</span>  <span class="token comment"># 关闭评论</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>


<h2 id="动态说说"><a href="#动态说说" class="headerlink" title="动态说说"></a>动态说说</h2><p>VWD 评论系统内置说说功能，博主可以在后台 <code>/admin/says</code> 发布说说，然后创建独立页面展示说说列表。</p>
<h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>说说功能直接在 <code>comments.vwd</code> 下配置，无需额外字段：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">comments</span><span class="token punctuation">:</span>
  <span class="token key atrule">enable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">provider</span><span class="token punctuation">:</span> <span class="token string">"vwd"</span>
  <span class="token key atrule">vwd</span><span class="token punctuation">:</span>
    <span class="token key atrule">apiBaseUrl</span><span class="token punctuation">:</span> <span class="token string">"https://your-vwd-api.vercel.app"</span>
    <span class="token comment"># ... 其他 VWD 配置 ...</span>
    <span class="token key atrule">saysEnable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>       <span class="token comment"># true 开启说说渲染，false 关闭</span>
    <span class="token key atrule">saysPageSize</span><span class="token punctuation">:</span> <span class="token number">10</span>       <span class="token comment"># 每页显示说说数（也可在 VWD 后台设置）</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<blockquote>
<p>说说和评论共用同一套 VWD 配置（apiBaseUrl、siteId、lang 等），<code>saysEnable</code> 控制说说渲染开关，<code>saysPageSize</code> 控制每页条数。</p>
</blockquote>
<h3 id="创建动态页面"><a href="#创建动态页面" class="headerlink" title="创建动态页面"></a>创建动态页面</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo new page dynamic<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>在 <code>source/dynamic/index.md</code> 中设置布局：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token punctuation">---</span>
<span class="token key atrule">title</span><span class="token punctuation">:</span> 动态
<span class="token key atrule">date</span><span class="token punctuation">:</span> <span class="token datetime number">2026-07-15 10:00:00</span>
<span class="token key atrule">layout</span><span class="token punctuation">:</span> page<span class="token punctuation">-</span>dynamic
<span class="token key atrule">comment</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
<span class="token punctuation">---</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<blockquote>
<p><code>comment: true</code> 会在说说列表下方显示评论区，设为 <code>false</code> 则只显示说说。</p>
</blockquote>
<h3 id="工作原理"><a href="#工作原理" class="headerlink" title="工作原理"></a>工作原理</h3><p><code>page-dynamic</code> 布局直接从 <code>comments.vwd</code> 读取 VWD 配置，自动初始化 <code>VWDComments</code> 组件并设置 <code>mode: &#39;says&#39;</code>，渲染说说列表。页面底部同时包含评论区（由 <code>comment</code> 开关控制）。</p>
<ul>
<li>说说管理：在 VWD 后台 <code>/admin/says</code> 发布和管理说说</li>
<li>暗黑模式：自动同步切换</li>
<li>主题色：跟随 <code>comments.vwd.primaryColor</code></li>
<li>站点隔离：跟随 <code>comments.vwd.siteId</code></li>
</ul>
<blockquote>
<p>说说功能依赖 VWD 评论系统，需先在 <code>comments</code> 中配置 <code>provider: &quot;vwd&quot;</code> 并填写 <code>vwd.apiBaseUrl</code>。</p>
</blockquote>
<h2 id="豆瓣书影音"><a href="#豆瓣书影音" class="headerlink" title="豆瓣书影音"></a>豆瓣书影音</h2><p>moeMac 支持自动抓取豆瓣书影音记录并展示。</p>
<h3 id="自动抓取（推荐）"><a href="#自动抓取（推荐）" class="headerlink" title="自动抓取（推荐）"></a>自动抓取（推荐）</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">douban</span><span class="token punctuation">:</span>
  <span class="token key atrule">user_id</span><span class="token punctuation">:</span> <span class="token string">"your-douban-id"</span>       <span class="token comment"># 豆瓣 ID</span>
  <span class="token key atrule">auto_sync</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>                  <span class="token comment"># hexo g 时自动同步</span>
  <span class="token key atrule">sync_interval_hours</span><span class="token punctuation">:</span> <span class="token number">24</span>          <span class="token comment"># 同步间隔</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<p>运行 <code>npx hexo douban</code> 可手动触发抓取，数据保存在 <code>source/_data/douban.json</code>。</p>
<h3 id="手动配置"><a href="#手动配置" class="headerlink" title="手动配置"></a>手动配置</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">douban</span><span class="token punctuation">:</span>
  <span class="token key atrule">books</span><span class="token punctuation">:</span>
    <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"书名"</span><span class="token punctuation">,</span> <span class="token key atrule">cover</span><span class="token punctuation">:</span> <span class="token string">"封面URL"</span><span class="token punctuation">,</span> <span class="token key atrule">rating</span><span class="token punctuation">:</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token key atrule">date</span><span class="token punctuation">:</span> <span class="token string">"2026-01-01"</span><span class="token punctuation">,</span> <span class="token key atrule">note</span><span class="token punctuation">:</span> <span class="token string">"读后感"</span> <span class="token punctuation">&#125;</span>
  <span class="token key atrule">movies</span><span class="token punctuation">:</span>
    <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"电影名"</span><span class="token punctuation">,</span> <span class="token key atrule">cover</span><span class="token punctuation">:</span> <span class="token string">"封面URL"</span><span class="token punctuation">,</span> <span class="token key atrule">rating</span><span class="token punctuation">:</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token key atrule">date</span><span class="token punctuation">:</span> <span class="token string">"2026-01-01"</span><span class="token punctuation">,</span> <span class="token key atrule">note</span><span class="token punctuation">:</span> <span class="token string">"观后感"</span> <span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>


<h2 id="相册页面"><a href="#相册页面" class="headerlink" title="相册页面"></a>相册页面</h2><p>创建相册页面：</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">hexo new page gallery<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>在 <code>source/gallery/index.md</code> 中使用 <strong>Markdown 图片语法</strong> 写入图片数据：</p>
<pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">title: 相册
layout: gallery
date: 2026-07-05 22:00:00

<span class="token comment">&lt;!-- 相册管理说明：
  每张图片用 Markdown 语法编写，格式：![标题](缩略图地址)
  如需指定大图（灯箱查看），在大图URL前加 "large:" 前缀写在图片下方一行
--></span>

<span class="token url"><span class="token operator">!</span>[<span class="token content">山间河流</span>](<span class="token url">https://example.com/photo1-small.jpg</span>)</span>
large: https://example.com/photo1-large.jpg

<span class="token url"><span class="token operator">!</span>[<span class="token content">云海山脉</span>](<span class="token url">https://example.com/photo2-small.jpg</span>)</span>
large: https://example.com/photo2-large.jpg<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<ul>
<li><strong>缩略图</strong>：<code>![标题](缩略图URL)</code> — 必填</li>
<li><strong>大图</strong>：<code>large: 大图URL</code> — 可选，不写则用缩略图作为大图</li>
<li><strong>标题</strong>：<code>![]</code> 中的文字 — 可选，显示在图片悬浮层</li>
</ul>
<p>相册页面使用瀑布流布局，支持无限滚动加载，点击图片可打开灯箱查看大图。</p>
<h2 id="壁纸设置"><a href="#壁纸设置" class="headerlink" title="壁纸设置"></a>壁纸设置</h2><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">wallpaper_path</span><span class="token punctuation">:</span> <span class="token string">"/assets/img/background.webp"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>留空则使用默认渐变背景。支持本地路径和网络 URL。</p>
<h2 id="一言-每日一句"><a href="#一言-每日一句" class="headerlink" title="一言 &#x2F; 每日一句"></a>一言 &#x2F; 每日一句</h2><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">hitokoto</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>                    <span class="token comment"># true: 使用一言 API</span>
<span class="token key atrule">hitokoto_api</span><span class="token punctuation">:</span> <span class="token string">"https://v1.hitokoto.cn/"</span>
<span class="token key atrule">sentences</span><span class="token punctuation">:</span>                        <span class="token comment"># false 或 API 失败时的回退句子</span>
  <span class="token punctuation">-</span> <span class="token string">"生活明朗，万物可爱。"</span>
  <span class="token punctuation">-</span> <span class="token string">"愿你眼中有光，心中有爱。"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>


<h2 id="文章列表布局"><a href="#文章列表布局" class="headerlink" title="文章列表布局"></a>文章列表布局</h2><p>「全部文章」页面（<code>/posts/</code>）支持 <strong>10 种</strong> 文章列表布局，在主题配置文件 <code>_config.yml</code> 中通过 <code>posts_layout</code> 切换：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">posts_layout</span><span class="token punctuation">:</span> grid   <span class="token comment"># 可选值见下表</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<table>
<thead>
<tr>
<th>布局值</th>
<th>名称</th>
<th>说明</th>
<th>适用场景</th>
</tr>
</thead>
<tbody><tr>
<td><code>grid</code></td>
<td>网格卡片</td>
<td>封面图+摘要+标签，3列网格（默认）</td>
<td>通用博客</td>
</tr>
<tr>
<td><code>list</code></td>
<td>列表布局</td>
<td>封面图在左，标题摘要在右，单列</td>
<td>文字为主的博客</td>
</tr>
<tr>
<td><code>simple</code></td>
<td>极简列表</td>
<td>无封面图，仅标题+日期，单列</td>
<td>日记型&#x2F;极简博客</td>
</tr>
<tr>
<td><code>magazine</code></td>
<td>杂志布局</td>
<td>置顶文章大卡片占满宽 + 后续2列网格</td>
<td>内容丰富的资讯站</td>
</tr>
<tr>
<td><code>card</code></td>
<td>大卡片布局</td>
<td>全宽封面图+内容，单列，视觉冲击强</td>
<td>摄影作品集</td>
</tr>
<tr>
<td><code>compact</code></td>
<td>紧凑网格</td>
<td>4列小卡片，仅封面+标题，信息密度高</td>
<td>文章数量多的站点</td>
</tr>
<tr>
<td><code>timeline</code></td>
<td>时间线布局</td>
<td>按年份分组，竖向时间轴排列</td>
<td>日记型&#x2F;归档展示</td>
</tr>
<tr>
<td><code>overlay</code></td>
<td>封面叠加布局</td>
<td>大图背景+底部渐变遮罩+文字叠加</td>
<td>Medium&#x2F;Substack 风格</td>
</tr>
<tr>
<td><code>feature</code></td>
<td>特色卡片布局</td>
<td>首个横向大卡片 + 后续3列网格</td>
<td>Apple News 风格</td>
</tr>
<tr>
<td><code>zigzag</code></td>
<td>Z字形布局</td>
<td>左右交替排列的横向卡片</td>
<td>设计博客&#x2F;产品展示</td>
</tr>
</tbody></table>
<h3 id="布局特性"><a href="#布局特性" class="headerlink" title="布局特性"></a>布局特性</h3><p>所有布局均支持以下功能：</p>
<ul>
<li><strong>封面图懒加载</strong>：使用 <code>loading=&quot;lazy&quot;</code> + 可爱小猫加载动画</li>
<li><strong>置顶文章</strong>：通过 front-matter <code>sticky</code> 配置，所有布局均显示置顶徽章</li>
<li><strong>分类筛选</strong>：顶部工具栏支持按分类筛选文章</li>
<li><strong>响应式适配</strong>：自动适配桌面&#x2F;平板&#x2F;手机三种视口</li>
<li><strong>AJAX 无刷新跳转</strong>：点击卡片平滑过渡到文章页</li>
</ul>
<h3 id="布局选择建议"><a href="#布局选择建议" class="headerlink" title="布局选择建议"></a>布局选择建议</h3><ul>
<li><strong>文章数量少</strong>（&lt;20篇）：推荐 <code>magazine</code>、<code>feature</code>、<code>zigzag</code>，突出内容</li>
<li><strong>文章数量多</strong>（&gt;50篇）：推荐 <code>grid</code>、<code>compact</code>、<code>timeline</code>，信息密度高</li>
<li><strong>摄影&#x2F;设计类博客</strong>：推荐 <code>overlay</code>、<code>card</code>、<code>zigzag</code>，视觉冲击强</li>
<li><strong>日记型博客</strong>：推荐 <code>simple</code>、<code>timeline</code>，简洁清爽</li>
</ul>
<h3 id="切换布局示例"><a href="#切换布局示例" class="headerlink" title="切换布局示例"></a>切换布局示例</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token comment"># 杂志风格</span>
<span class="token key atrule">posts_layout</span><span class="token punctuation">:</span> magazine

<span class="token comment"># 时间线风格</span>
<span class="token key atrule">posts_layout</span><span class="token punctuation">:</span> timeline

<span class="token comment"># Z字形风格</span>
<span class="token key atrule">posts_layout</span><span class="token punctuation">:</span> zigzag<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>


<h2 id="文章配置"><a href="#文章配置" class="headerlink" title="文章配置"></a>文章配置</h2><h3 id="Front-matter-选项"><a href="#Front-matter-选项" class="headerlink" title="Front-matter 选项"></a>Front-matter 选项</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">title</span><span class="token punctuation">:</span> 文章标题
<span class="token key atrule">date</span><span class="token punctuation">:</span> <span class="token datetime number">2026-07-11 10:00:00</span>
<span class="token key atrule">cover</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//example.com/cover.jpg   <span class="token comment"># 封面图</span>
<span class="token key atrule">sticky</span><span class="token punctuation">:</span> <span class="token number">1</span>                               <span class="token comment"># 置顶（数值越大越靠前）</span>
<span class="token key atrule">tags</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> 标签1
  <span class="token punctuation">-</span> 标签2
<span class="token key atrule">categories</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> 分类
<span class="token key atrule">comment</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>       <span class="token comment"># 是否显示评论（默认 true）</span>
<span class="token key atrule">copyright</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>     <span class="token comment"># 是否显示版权声明（默认 true）</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="文章目录"><a href="#文章目录" class="headerlink" title="文章目录"></a>文章目录</h3><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">post</span><span class="token punctuation">:</span>
  <span class="token key atrule">show_toc</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>        <span class="token comment"># 显示目录</span>
  <span class="token key atrule">toc_expand</span><span class="token punctuation">:</span> <span class="token boolean important">false</span>     <span class="token comment"># 二级目录是否默认展开</span>
  <span class="token key atrule">show_date</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>       <span class="token comment"># 显示发布日期</span>
  <span class="token key atrule">copyright</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>       <span class="token comment"># 版权声明</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>


<h2 id="SEO-短链接（abbrlink）"><a href="#SEO-短链接（abbrlink）" class="headerlink" title="SEO 短链接（abbrlink）"></a>SEO 短链接（abbrlink）</h2><p>主题内置 abbrlink 生成器，根据文章标题自动生成 CRC32 哈希短链接，URL 稳定且对 SEO 友好。</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">abbrlink</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>  <span class="token comment"># true: 始终根据 title 算 CRC32，覆盖手写值；false: 尊重手写值，没有才生成</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>文章 URL 格式为 <code>posts/b8e72f3a.html</code>（8 位十六进制哈希）。同一标题永远生成相同哈希，URL 稳定不变。</p>
<p>需在站点 <code>_config.yml</code> 中设置：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">permalink</span><span class="token punctuation">:</span> posts/<span class="token punctuation">:</span>abbrlink.html<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>运行 <code>hexo generate</code> 时会自动为所有文章生成 abbrlink 并写入 front-matter，始终根据 title 计算，确保链接一致性。</p>
<h2 id="RSS-订阅"><a href="#RSS-订阅" class="headerlink" title="RSS 订阅"></a>RSS 订阅</h2><p>内置 RSS 生成器，自动输出 <code>atom.xml</code>（标准 RSS 2.0 格式），无需安装任何插件。</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">rss</span><span class="token punctuation">:</span>
  <span class="token key atrule">enable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">path</span><span class="token punctuation">:</span> atom.xml       <span class="token comment"># 输出文件路径</span>
  <span class="token key atrule">limit</span><span class="token punctuation">:</span> <span class="token number">20</span>            <span class="token comment"># 输出文章数量（0 = 全部）</span>
  <span class="token key atrule">content</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>        <span class="token comment"># true 包含全文 / false 仅摘要</span>
  <span class="token key atrule">show_in_home</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>   <span class="token comment"># true: 主页社交图标区自动显示 RSS 按钮</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<p>读者可通过浏览器自动发现的 RSS 链接或直接访问 <code>https://你的域名/atom.xml</code> 订阅。</p>
<h2 id="站点地图（Sitemap）"><a href="#站点地图（Sitemap）" class="headerlink" title="站点地图（Sitemap）"></a>站点地图（Sitemap）</h2><p>内置站点地图生成器，自动输出 <code>sitemap.xml</code>，供搜索引擎抓取。</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">sitemap</span><span class="token punctuation">:</span>
  <span class="token key atrule">enable</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
  <span class="token key atrule">path</span><span class="token punctuation">:</span> sitemap.xml<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<p>生成后可提交到 <a href="https://search.google.com/search-console">Google Search Console</a> 或百度站长平台。</p>
<h2 id="搜索"><a href="#搜索" class="headerlink" title="搜索"></a>搜索</h2><p>moeMac 内置站内搜索，基于 <code>hexo-generator-searchdb</code> 插件：</p>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> hexo-generator-searchdb<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>在站点 <code>_config.yml</code> 中配置：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">search</span><span class="token punctuation">:</span>
  <span class="token key atrule">path</span><span class="token punctuation">:</span> search.xml
  <span class="token key atrule">field</span><span class="token punctuation">:</span> post
  <span class="token key atrule">format</span><span class="token punctuation">:</span> html
  <span class="token key atrule">limit</span><span class="token punctuation">:</span> <span class="token number">10000</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<p>在主题配置中开启：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">search</span><span class="token punctuation">:</span> <span class="token boolean important">true</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>


<h2 id="CDN-加速"><a href="#CDN-加速" class="headerlink" title="CDN 加速"></a>CDN 加速</h2><p>将 <code>source/assets/</code> 目录上传到 CDN，然后填写：</p>
<pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">cdn</span><span class="token punctuation">:</span> <span class="token string">"https://your-cdn.com/moemac/assets"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>所有 CSS&#x2F;JS&#x2F;字体资源将自动走 CDN。</p>
<h2 id="暗黑模式"><a href="#暗黑模式" class="headerlink" title="暗黑模式"></a>暗黑模式</h2><p>点击页面右下角的月亮&#x2F;太阳图标切换暗黑模式，选择会保存在 <code>localStorage</code> 中，下次访问自动应用。</p>
<h2 id="标签外挂"><a href="#标签外挂" class="headerlink" title="标签外挂"></a>标签外挂</h2><p>moeMac 内置丰富的标签外挂，包括提示容器、标签页、折叠面板、轮播图、画廊、时间线、步骤条、文章引用卡片等。</p>
<p>详细的语法教程和效果演示请查看下方文章：</p>
<a class="post-card ajax-link" data-href="/posts/75bba892.html"><div class="post-card-thumb"><img src="https://picsum.photos/seed/moemac-tags/600/400" alt="moeMac标签外挂演示" loading="lazy" decoding="async"></div><div class="post-card-info"><div class="post-card-title">moeMac标签外挂演示</div><div class="post-card-excerpt">本文是 moeMac 主题所有标签外挂（Tag Plugins）的完整语法教程与效果演示。所有功能开箱即用，无需额外安装插件。  提示：每个功能都包含「语法」和...</div><div class="post-card-meta"><span class="post-card-date"><i class="fas fa-calendar-day"></i> 2026-06-30</span><span class="post-card-read"><i class="fas fa-arrow-right"></i> 阅读</span></div></div></a>
<h2 id="网站信息"><a href="#网站信息" class="headerlink" title="网站信息"></a>网站信息</h2><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">site_info</span><span class="token punctuation">:</span>
  <span class="token key atrule">icp</span><span class="token punctuation">:</span> <span class="token string">"备ICP号"</span>           <span class="token comment"># ICP 备案号</span>
  <span class="token key atrule">psbc</span><span class="token punctuation">:</span> <span class="token string">"公安备案号"</span>        <span class="token comment"># 公安备案号</span>
  <span class="token key atrule">start_date</span><span class="token punctuation">:</span> <span class="token string">"2023-01-01"</span> <span class="token comment"># 建站日期</span>
  <span class="token key atrule">copyright</span><span class="token punctuation">:</span> <span class="token string">"@2026"</span>       <span class="token comment"># 版权声明</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>


<h2 id="友链"><a href="#友链" class="headerlink" title="友链"></a>友链</h2><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">friends</span><span class="token punctuation">:</span>
  <span class="token punctuation">-</span> <span class="token punctuation">&#123;</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"站点名"</span><span class="token punctuation">,</span> <span class="token key atrule">url</span><span class="token punctuation">:</span> <span class="token string">"https://example.com"</span><span class="token punctuation">,</span> <span class="token key atrule">avatar</span><span class="token punctuation">:</span> <span class="token string">"https://example.com/favicon.ico"</span><span class="token punctuation">,</span> <span class="token key atrule">description</span><span class="token punctuation">:</span> <span class="token string">"一句话描述"</span> <span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<p>友链页面会自动渲染为卡片布局，支持 hover 动效。</p>
<h2 id="响应式设计"><a href="#响应式设计" class="headerlink" title="响应式设计"></a>响应式设计</h2><ul>
<li><strong>桌面端</strong>（&gt;768px）：浮动窗口布局，支持拖拽、调整大小</li>
<li><strong>移动端</strong>（≤768px）：自动切换为单列卡片流布局，触摸友好的交互</li>
</ul>
<p>主题会自动检测视口宽度并切换布局模式，跨越 768px 断点时会自动刷新页面。</p>
<h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><h3 id="页面切换后动画不执行？"><a href="#页面切换后动画不执行？" class="headerlink" title="页面切换后动画不执行？"></a>页面切换后动画不执行？</h3><p>确保 <code>animations.js</code> 和 <code>main.js</code> 在页面中正确加载。AJAX 切换会自动重新触发动画。</p>
<h3 id="音乐播放器不显示？"><a href="#音乐播放器不显示？" class="headerlink" title="音乐播放器不显示？"></a>音乐播放器不显示？</h3><p>检查 Meting API 是否可用，歌单 ID 是否正确。可尝试更换 API 地址。</p>
<h3 id="豆瓣抓取失败？"><a href="#豆瓣抓取失败？" class="headerlink" title="豆瓣抓取失败？"></a>豆瓣抓取失败？</h3><p>豆瓣有反爬机制，可尝试配置 <code>cookie</code> 字段，或适当降低抓取频率。</p>
<h3 id="评论不显示？"><a href="#评论不显示？" class="headerlink" title="评论不显示？"></a>评论不显示？</h3><p>检查评论系统配置是否正确，<code>provider</code> 与对应的配置字段是否匹配。</p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>moeMac 主题力求在美观与性能之间取得平衡，所有功能开箱即用。如果你喜欢这个主题，欢迎在 GitHub 上 Star 支持！</p>
<p>有问题或建议，欢迎留言交流。</p>
]]></description>
      <category>技术</category>
      <author>梦繁星</author>
    </item>
    <item>
      <title>moeMac标签外挂演示</title>
      <link>https://moeao.cn/posts/75bba892.html</link>
      <guid isPermaLink="true">https://moeao.cn/posts/75bba892.html</guid>
      <pubDate>Tue, 30 Jun 2026 12:00:00 GMT</pubDate>
      <description><![CDATA[<p>本文是 moeMac 主题所有标签外挂（Tag Plugins）的<strong>完整语法教程</strong>与<strong>效果演示</strong>。所有功能开箱即用，无需额外安装插件。</p>
<blockquote>
<p><strong>提示</strong>：每个功能都包含「语法」和「效果」两部分，你可以直接复制语法到自己的文章中使用。</p>
</blockquote>
<span id="more"></span>


<h2 id="Note-提示容器"><a href="#Note-提示容器" class="headerlink" title="Note 提示容器"></a>Note 提示容器</h2><p>用于在文章中突出显示提示、警告等信息。支持多种类型和两种语法。</p>
<h3 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h3><p><strong>方式一：<code>:::</code> 容器语法（推荐）</strong></p>
<pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">::: tip
提示内容
:::

::: warning 自定义标题
带自定义标题的警告
:::<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<p>支持的类型：<code>tip</code> &#x2F; <code>info</code> &#x2F; <code>warning</code> &#x2F; <code>danger</code> &#x2F; <code>success</code> &#x2F; <code>note</code> &#x2F; <code>primary</code> &#x2F; <code>default</code></p>
<p><strong>方式二：<code>{% note %}</code> 标签语法</strong></p>
<pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% note <span class="token url">[<span class="token content">type</span>] [<span class="token variable">title</span>]</span> %}
内容
{% endnote %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><div class="note-tip custom-block cb-tip"><div class="custom-block-header"><i class="fas fa-lightbulb"></i><span class="custom-block-title">提示</span></div><div class="custom-block-body"><p>这是一个提示（tip）容器，用于展示一般性提示信息。</p>
</div></div>
<div class="note-info custom-block cb-info"><div class="custom-block-header"><i class="fas fa-circle-info"></i><span class="custom-block-title">信息</span></div><div class="custom-block-body"><p>这是一个信息（info）容器，用于展示补充信息。</p>
</div></div>
<div class="note-warning custom-block cb-warning"><div class="custom-block-header"><i class="fas fa-triangle-exclamation"></i><span class="custom-block-title">警告</span></div><div class="custom-block-body"><p>这是一个警告（warning）容器，需要注意的事项。</p>
</div></div>
<div class="note-danger custom-block cb-danger"><div class="custom-block-header"><i class="fas fa-circle-xmark"></i><span class="custom-block-title">危险</span></div><div class="custom-block-body"><p>这是一个危险（danger）容器，表示需要特别注意的操作。</p>
</div></div>
<div class="note-success custom-block cb-success"><div class="custom-block-header"><i class="fas fa-circle-check"></i><span class="custom-block-title">成功</span></div><div class="custom-block-body"><p>这是一个成功（success）容器，表示操作完成。</p>
</div></div>
<div class="note-warning custom-block cb-warning"><div class="custom-block-header"><i class="fas fa-triangle-exclamation"></i><span class="custom-block-title">自定义标题</span></div><div class="custom-block-body"><p>容器也可以自定义标题，就像这个一样。</p>
</div></div>
<div class="note-primary custom-block cb-primary"><div class="custom-block-header"><i class="fas fa-circle-info"></i><span class="custom-block-title">提示</span></div><div class="custom-block-body"><p>这是一个 primary 类型的 note 容器，使用标签语法。</p>
</div></div>
<div class="note-danger custom-block cb-danger"><div class="custom-block-header"><i class="fas fa-circle-xmark"></i><span class="custom-block-title">重要提醒</span></div><div class="custom-block-body"><p>note 容器内部也<strong>支持 Markdown</strong> 语法：</p>
<ul>
<li>列表项一</li>
<li>列表项二</li>
<li>列表项三</li>
</ul>
</div></div>
<h2 id="Checkbox-待办事项"><a href="#Checkbox-待办事项" class="headerlink" title="Checkbox 待办事项"></a>Checkbox 待办事项</h2><p>用于展示待办列表，支持勾选状态和多种颜色。</p>
<h3 id="语法-1"><a href="#语法-1" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% checkbox 文本 %}                    未完成
{% checkbox checked, 已完成项 %}        已完成
{% checkbox checked, green, 绿色已完成 %}  指定颜色<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<p>支持的颜色：<code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>yellow</code> &#x2F; <code>cyan</code> &#x2F; <code>purple</code></p>
<h3 id="效果-1"><a href="#效果-1" class="headerlink" title="效果"></a>效果</h3><p><div class="todo-item" style="--todo-color:var(--accent-color)"><span class="todo-checkbox"></span><span class="todo-text">未完成的任务一</span></div><br><div class="todo-item" style="--todo-color:var(--accent-color)"><span class="todo-checkbox"></span><span class="todo-text">未完成的任务二</span></div><br><div class="todo-item todo-checked" style="--todo-color:var(--accent-color)"><span class="todo-checkbox todo-checkbox-checked"></span><span class="todo-text">已完成的任务</span></div><br><div class="todo-item todo-checked" style="--todo-color:#22c55e"><span class="todo-checkbox todo-checkbox-checked"></span><span class="todo-text">绿色已完成</span></div><br><div class="todo-item todo-checked" style="--todo-color:#ef4444"><span class="todo-checkbox todo-checkbox-checked"></span><span class="todo-text">红色已完成</span></div><br><div class="todo-item todo-checked" style="--todo-color:#3b82f6"><span class="todo-checkbox todo-checkbox-checked"></span><span class="todo-text">蓝色已完成</span></div><br><div class="todo-item todo-checked" style="--todo-color:#a855f7"><span class="todo-checkbox todo-checkbox-checked"></span><span class="todo-text">紫色已完成</span></div></p>
<h2 id="Tabs-标签页"><a href="#Tabs-标签页" class="headerlink" title="Tabs 标签页"></a>Tabs 标签页</h2><p>将多个内容组织在不同的标签中，节省页面空间。</p>
<h3 id="语法-2"><a href="#语法-2" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% tabs 标签页名称, 默认显示第几个 %}

{% tab 标签1标题 %}
标签1内容
{% endtab %}

{% tab 标签2标题 %}
标签2内容
{% endtab %}

{% endtabs %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-2"><a href="#效果-2" class="headerlink" title="效果"></a>效果</h3><div class="tabs-container" id="tabs-demo-tabs-"><div class="tabs-nav"><button class="tab-label active" data-tab="tabs-demo-tabs--1">概述</button><button class="tab-label" data-tab="tabs-demo-tabs--2">代码示例</button><button class="tab-label" data-tab="tabs-demo-tabs--3">引用与表格</button></div><div class="tabs-body"><div class="tab-content active" id="tabs-demo-tabs--1"><p>这是第一个标签页的内容，默认显示。</p>
<p>支持 <strong>Markdown</strong> 格式，包括：</p>
<ul>
<li>列表项 1</li>
<li>列表项 2</li>
<li>列表项 3</li>
</ul></div><div class="tab-content" id="tabs-demo-tabs--2"><p>这是第二个标签页的内容，支持代码块：</p>
<p>CODE4</p></div><div class="tab-content" id="tabs-demo-tabs--3"><p>这是第三个标签页的内容。</p>
<blockquote>
<p>引用也可以用在 Tab 里。</p>
</blockquote>
<table>
<thead>
<tr>
<th>功能</th>
<th>状态</th>
</tr>
</thead>
<tbody><tr>
<td>Tabs</td>
<td>✅</td>
</tr>
<tr>
<td>Note</td>
<td>✅</td>
</tr>
<tr>
<td>Mermaid</td>
<td>✅</td>
</tr>
</tbody></table></div></div></div>
<h2 id="Folding-折叠面板"><a href="#Folding-折叠面板" class="headerlink" title="Folding 折叠面板"></a>Folding 折叠面板</h2><p>默认收起，点击标题展开内容，适合放置较长的补充说明。</p>
<h3 id="语法-3"><a href="#语法-3" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% folding <span class="token url">[<span class="token content">color</span>] [<span class="token variable">标题</span>]</span> %}
折叠内容
{% endfolding %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<p>支持的颜色：<code>blue</code> &#x2F; <code>green</code> &#x2F; <code>red</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code>（可选，不填为默认色）</p>
<h3 id="效果-3"><a href="#效果-3" class="headerlink" title="效果"></a>效果</h3><details class="folding-panel folding-default" id="fold-smjyy1"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>查看默认折叠面板</span></summary><div class="folding-body"><p>点击标题可以展开&#x2F;收起内容。</p>
<p>这里可以放较长的内容，默认折叠节省页面空间。</p>
</div></details>
<details class="folding-panel folding-blue" id="fold-kyvt3r"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>蓝色折叠面板</span></summary><div class="folding-body"><p>蓝色边框的折叠面板，适合信息类内容。</p>
</div></details>
<details class="folding-panel folding-green" id="fold-savp8t"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>绿色折叠面板</span></summary><div class="folding-body"><p>绿色边框的折叠面板，适合成功&#x2F;完成类内容。</p>
</div></details>
<details class="folding-panel folding-red" id="fold-tu0gtl"><summary class="folding-header"><i class="fas fa-chevron-right folding-icon"></i><span>红色折叠面板</span></summary><div class="folding-body"><p>红色边框的折叠面板，适合警告类内容。</p>
</div></details>
<h2 id="Hide-隐藏文本"><a href="#Hide-隐藏文本" class="headerlink" title="Hide 隐藏文本"></a>Hide 隐藏文本</h2><p>用于隐藏敏感内容或剧透内容，支持行内隐藏和块级隐藏。</p>
<h3 id="语法-4"><a href="#语法-4" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% hide 隐藏文本 %}                        行内隐藏（鼠标悬停显示）
{% hideBlock 按钮文字 %} 隐藏块内容 {% endhideBlock %}   块级隐藏
{% hideToggle 标题 %} 可展开内容 {% endhideToggle %}     可展开隐藏<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-4"><a href="#效果-4" class="headerlink" title="效果"></a>效果</h3><p><strong>行内隐藏：</strong></p>
<p>这是一个句子，其中 <span class="hide-text" tabindex="0">这是被隐藏的文本</span> 需要鼠标悬停才能看到。</p>
<p><strong>隐藏块：</strong></p>
<div class="hide-block" id="hb-xfbdic18"><button class="hide-block-btn" onclick="var e=document.getElementById('hb-c-xfbdic18');var b=this;e.style.display='block';b.style.display='none';"><i class="fas fa-eye"></i> 点击查看隐藏内容</button><div class="hide-block-content" id="hb-c-xfbdic18" style="display:none;"><p>这里是隐藏的块级内容，点击按钮后才会显示。</p>
<p>可以包含任意 Markdown 内容：</p>
<p>CODE7</p>
</div></div>
<p><strong>可展开隐藏：</strong></p>
<details class="hide-toggle-panel" id="ht-hz7gw9"><summary class="hide-toggle-header"><i class="fas fa-chevron-right folding-icon"></i><span>点击展开详情</span></summary><div class="hide-toggle-body"><p>类似折叠面板，但视觉风格不同。适合用于 FAQ 或答案展示。</p>
</div></details>
<h2 id="Badge-徽章"><a href="#Badge-徽章" class="headerlink" title="Badge 徽章"></a>Badge 徽章</h2><p>用于在行内突出显示状态标签，支持多种颜色和圆角样式。</p>
<h3 id="语法-5"><a href="#语法-5" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% badge 文本, 颜色 %}           方形徽章
{% badge 文本, 颜色, pill %}     圆角徽章<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<p>支持的颜色：<code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code> &#x2F; <code>gray</code> &#x2F; <code>cyan</code></p>
<h3 id="效果-5"><a href="#效果-5" class="headerlink" title="效果"></a>效果</h3><p>这是<span class="inline-badge badge-square" style="--badge-color:#ef4444">Hot</span>一个热门<span class="inline-badge badge-pill" style="--badge-color:#22c55e">New</span>功能的<span class="inline-badge badge-square" style="--badge-color:#3b82f6">v2.0</span>演示。</p>
<p><span class="inline-badge badge-square" style="--badge-color:#f97316">推荐</span> <span class="inline-badge badge-pill" style="--badge-color:#a855f7">Beta</span> <span class="inline-badge badge-square" style="--badge-color:#6b7280">Deprecated</span> <span class="inline-badge badge-pill" style="--badge-color:#06b6d4">Updated</span></p>
<h2 id="Label-行内标签"><a href="#Label-行内标签" class="headerlink" title="Label 行内标签"></a>Label 行内标签</h2><p>给文字添加彩色背景高亮，类似荧光笔效果。</p>
<h3 id="语法-6"><a href="#语法-6" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% label 文本@颜色 %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>支持的颜色：<code>red</code> &#x2F; <code>blue</code> &#x2F; <code>green</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code> &#x2F; <code>pink</code> &#x2F; <code>gray</code></p>
<h3 id="效果-6"><a href="#效果-6" class="headerlink" title="效果"></a>效果</h3><p>这是一段包含<span class="inline-label" style="--label-color:#ef4444">关键词</span>和<span class="inline-label" style="--label-color:#3b82f6">重点</span>的文本。</p>
<p>也支持<span class="inline-label" style="--label-color:#a855f7">紫色</span>、<span class="inline-label" style="--label-color:#f97316">橙色</span>、<span class="inline-label" style="--label-color:#22c55e">绿色</span>、<span class="inline-label" style="--label-color:#ec4899">粉色</span>等颜色。</p>
<h2 id="Mark-文本高亮"><a href="#Mark-文本高亮" class="headerlink" title="Mark 文本高亮"></a>Mark 文本高亮</h2><p>用彩色背景标记文字，类似荧光笔标记，比 Label 更轻量。</p>
<h3 id="语法-7"><a href="#语法-7" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% mark 文本 %}               默认黄色
{% mark 文本@颜色 %}          指定颜色<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<p>支持的颜色：<code>yellow</code> &#x2F; <code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>purple</code> &#x2F; <code>cyan</code></p>
<h3 id="效果-7"><a href="#效果-7" class="headerlink" title="效果"></a>效果</h3><p>这句话中<mark class="text-mark" style="background:rgba(250,204,21,0.35)">关键信息</mark>被高亮了，<mark class="text-mark" style="background:rgba(239,68,68,0.25)">重要内容</mark>也是。</p>
<p>还可以<mark class="text-mark" style="background:rgba(59,130,246,0.25)">蓝色标记</mark>和<mark class="text-mark" style="background:rgba(34,197,94,0.25)">绿色标记</mark>。</p>
<h2 id="Button-按钮链接"><a href="#Button-按钮链接" class="headerlink" title="Button 按钮链接"></a>Button 按钮链接</h2><p>创建美观的链接按钮，支持图标和居中。</p>
<h3 id="语法-8"><a href="#语法-8" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% btn 链接, 文字, 图标 %}              默认按钮
{% btn 链接, 文字, 图标, center %}      居中按钮
{% btn 链接, 文字, 图标, red %}        彩色按钮<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<p>图标使用 Font Awesome 名称，如 <code>fa-link</code> &#x2F; <code>fa-star</code> &#x2F; <code>fa-book</code> &#x2F; <code>fa-code</code> 等。</p>
<p>支持的颜色：<code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code> &#x2F; <code>pink</code> &#x2F; <code>cyan</code> &#x2F; <code>gray</code></p>
<h3 id="效果-8"><a href="#效果-8" class="headerlink" title="效果"></a>效果</h3><p><a href="https://hexo.io" class="tag-btn" target="_blank" rel="noopener"><i class="fas fa-link"></i> Hexo 官网</a> <a href="https://butterfly.js.org/" class="tag-btn" target="_blank" rel="noopener"><i class="fas fa-star"></i> Butterfly 主题</a></p>
<p>彩色按钮：</p>
<p><a href="https://github.com" class="tag-btn tag-btn-colored" style="--btn-color:#ef4444" target="_blank" rel="noopener"><i class="fas fa-star"></i> GitHub</a> <a href="https://hexo.io" class="tag-btn tag-btn-colored" style="--btn-color:#3b82f6" target="_blank" rel="noopener"><i class="fas fa-book"></i> 文档</a> <a href="https://nodejs.org" class="tag-btn tag-btn-colored" style="--btn-color:#22c55e" target="_blank" rel="noopener"><i class="fas fa-code"></i> Node.js</a> <a href="https://vuejs.org" class="tag-btn tag-btn-colored" style="--btn-color:#a855f7" target="_blank" rel="noopener"><i class="fas fa-star"></i> Vue.js</a></p>
<p>居中按钮：</p>
<a href="https://github.com" class="tag-btn tag-btn-colored center" style="--btn-color:#f97316" target="_blank" rel="noopener"><i class="fas fa-star"></i> GitHub</a>
<h2 id="Btns-按钮组"><a href="#Btns-按钮组" class="headerlink" title="Btns 按钮组"></a>Btns 按钮组</h2><p>将多个按钮排列成一组，支持圆角和居中。</p>
<h3 id="语法-9"><a href="#语法-9" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% btns <span class="token url">[<span class="token content">rounded</span>] [<span class="token variable">center</span>]</span> %}
{% btn 链接1, 文字1, 图标1, 颜色1 %}
{% btn 链接2, 文字2, 图标2, 颜色2 %}
{% endbtns %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<p>可选参数：<code>rounded</code>（圆角按钮）、<code>center</code>（居中排列）<br>按钮颜色：<code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code> &#x2F; <code>pink</code> &#x2F; <code>cyan</code> &#x2F; <code>gray</code></p>
<h3 id="效果-9"><a href="#效果-9" class="headerlink" title="效果"></a>效果</h3><div class="btn-group btn-group-rounded btn-group-center"><a href="https://hexo.io" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-book"></i> Hexo</a><a href="https://nodejs.org" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-code"></i> Node.js</a><a href="https://vuejs.org" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-star"></i> Vue.js</a><a href="https://github.com" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-heart"></i> GitHub</a><a href="https://react.dev" class="btn-group-item" target="_blank" rel="noopener"><i class="fas fa-star"></i> React</a></div>
<h2 id="Quot-带作者引用"><a href="#Quot-带作者引用" class="headerlink" title="Quot 带作者引用"></a>Quot 带作者引用</h2><p>比普通引用更优雅，支持添加作者信息。</p>
<h3 id="语法-10"><a href="#语法-10" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% quot 引用文本 %}
{% quot 引用文本, 作者名 %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="效果-10"><a href="#效果-10" class="headerlink" title="效果"></a>效果</h3><blockquote class="quot-block"><p class="quot-text">代码是写给人看的，只是顺便能在机器上运行。</p></blockquote>
<blockquote class="quot-block"><p class="quot-text">任何傻瓜都能写出计算机能理解的代码，但优秀的程序员能写出人类能理解的代码。</p><footer class="quot-author">— Martin Fowler</footer></blockquote>
<blockquote class="quot-block"><p class="quot-text">简单是可靠的先决条件。</p><footer class="quot-author">— Edsger Dijkstra</footer></blockquote>
<h2 id="Flink-友链卡片"><a href="#Flink-友链卡片" class="headerlink" title="Flink 友链卡片"></a>Flink 友链卡片</h2><p>批量展示友情链接，以网格卡片排列，每个卡片包含头像、站点名称和描述。适合做友链页面或推荐站点列表。</p>
<h3 id="语法-11"><a href="#语法-11" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% flink %}
<span class="token list punctuation">-</span> name: 站点名称
  link: https://example.com
  avatar: https://example.com/favicon.png
  desc: 站点描述
<span class="token list punctuation">-</span> name: 另一个站点
  link: https://another.com
  avatar: https://another.com/favicon.png
  desc: 另一个描述
{% endflink %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-11"><a href="#效果-11" class="headerlink" title="效果"></a>效果</h3><div class="flink-list"><a class="flink-card" href="https://hexo.io" target="_blank" rel="noopener"><img class="flink-avatar" src="https://hexo.io/favicon.svg" alt="Hexo" loading="lazy"><div class="flink-info"><span class="flink-name">Hexo</span><span class="flink-desc">快速、简洁且高效的博客框架</span></div></a><a class="flink-card" href="https://butterfly.js.org" target="_blank" rel="noopener"><img class="flink-avatar" src="https://butterfly.js.org/img/favicon.png" alt="Butterfly" loading="lazy"><div class="flink-info"><span class="flink-name">Butterfly</span><span class="flink-desc">A Simple and Card UI Design theme</span></div></a><a class="flink-card" href="https://vuejs.org" target="_blank" rel="noopener"><img class="flink-avatar" src="https://vuejs.org/logo.svg" alt="Vue.js" loading="lazy"><div class="flink-info"><span class="flink-name">Vue.js</span><span class="flink-desc">渐进式 JavaScript 框架</span></div></a><a class="flink-card" href="https://nodejs.org" target="_blank" rel="noopener"><img class="flink-avatar" src="https://nodejs.org/static/images/favicons/favicon.png" alt="Node.js" loading="lazy"><div class="flink-info"><span class="flink-name">Node.js</span><span class="flink-desc">JavaScript 运行时</span></div></a></div>
<h2 id="Gallery-图片画廊"><a href="#Gallery-图片画廊" class="headerlink" title="Gallery 图片画廊"></a>Gallery 图片画廊</h2><p>等高对齐画廊布局，每行图片根据原始宽高比自动计算高度，保持各行等高对齐。支持自定义列数和图片说明。</p>
<h3 id="语法-12"><a href="#语法-12" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% gallery 列数 %}
<span class="token url"><span class="token operator">!</span>[<span class="token content">图片说明1</span>](<span class="token url">图片地址1</span>)</span>
<span class="token url"><span class="token operator">!</span>[<span class="token content">图片说明2</span>](<span class="token url">图片地址2</span>)</span>
{% endgallery %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<p>也支持逗号分隔格式：</p>
<pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% gallery 3 %}
图片地址1, 说明1
图片地址2, 说明2
{% endgallery %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<blockquote>
<p>列数默认为 4，移动端自动降为 2~3 列。</p>
</blockquote>
<h3 id="效果-12"><a href="#效果-12" class="headerlink" title="效果"></a>效果</h3><div class="gallery-container" id="gallery-mxl581" data-cols="4"><div class="gallery-items"><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/Fze9jchtnyJXMHN.jpg"><img src="https://i.loli.net/2019/12/25/Fze9jchtnyJXMHN.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/ryLVePaqkYm4TEK.jpg"><img src="https://i.loli.net/2019/12/25/ryLVePaqkYm4TEK.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/gEy5Zc1Ai6VuO4N.jpg"><img src="https://i.loli.net/2019/12/25/gEy5Zc1Ai6VuO4N.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/d6QHbytlSYO4FBG.jpg"><img src="https://i.loli.net/2019/12/25/d6QHbytlSYO4FBG.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/6nepIJ1xTgufatZ.jpg"><img src="https://i.loli.net/2019/12/25/6nepIJ1xTgufatZ.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/E7Jvr4eIPwUNmzq.jpg"><img src="https://i.loli.net/2019/12/25/E7Jvr4eIPwUNmzq.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/mh19anwBSWIkGlH.jpg"><img src="https://i.loli.net/2019/12/25/mh19anwBSWIkGlH.jpg" alt="" decoding="async"></div><div class="gallery-item" data-full="https://i.loli.net/2019/12/25/2tu9JC8ewpBFagv.jpg"><img src="https://i.loli.net/2019/12/25/2tu9JC8ewpBFagv.jpg" alt="" decoding="async"></div></div></div>
<h2 id="Timeline-时间线"><a href="#Timeline-时间线" class="headerlink" title="Timeline 时间线"></a>Timeline 时间线</h2><p>展示按时间排列的事件，适合做项目进度、更新日志等。</p>
<h3 id="语法-13"><a href="#语法-13" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% timeline %}

{% timenode 日期 %}
事件内容
{% endtimenode %}

{% timenode 另一个日期 %}
另一个事件
{% endtimenode %}

{% endtimeline %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-13"><a href="#效果-13" class="headerlink" title="效果"></a>效果</h3><div class="timeline-container"><div class="timeline-node"><div class="timeline-date">2026-06-01</div><div class="timeline-content"><p>博客正式上线，使用 Hexo + moeMac 主题。</p></div></div><div class="timeline-node"><div class="timeline-date">2026-06-10</div><div class="timeline-content"><p>添加 Vue 3 组合式 API 文章。</p></div></div><div class="timeline-node"><div class="timeline-date">2026-06-18</div><div class="timeline-content"><p>添加 CSS Grid 布局实战笔记。</p></div></div><div class="timeline-node"><div class="timeline-date">2026-06-28</div><div class="timeline-content"><p>添加 Node.js API 服务教程。</p></div></div><div class="timeline-node"><div class="timeline-date">2026-06-30</div><div class="timeline-content"><p>完成标签外挂功能移植，支持 30+ 种标签外挂。</p></div></div></div>
<h2 id="Copy-行内复制"><a href="#Copy-行内复制" class="headerlink" title="Copy 行内复制"></a>Copy 行内复制</h2><p>行内代码复制按钮，点击即可复制文本到剪贴板。</p>
<h3 id="语法-14"><a href="#语法-14" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% copy 要复制的文本 %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h3 id="效果-14"><a href="#效果-14" class="headerlink" title="效果"></a>效果</h3><p>使用 <span class="copy-inline" data-text="npm install hexo-cli -g"><code>npm install hexo-cli -g</code><button class="copy-inline-btn" onclick="navigator.clipboard.writeText(this.parentElement.getAttribute('data-text')).then(function(){var b=this;b.classList.add('copied');setTimeout(function(){b.classList.remove('copied')},1500)}.bind(this))"><i class="fas fa-copy"></i></button></span> 安装 Hexo CLI。</p>
<p>部署命令：<span class="copy-inline" data-text="hexo clean && hexo g && hexo d"><code>hexo clean && hexo g && hexo d</code><button class="copy-inline-btn" onclick="navigator.clipboard.writeText(this.parentElement.getAttribute('data-text')).then(function(){var b=this;b.classList.add('copied');setTimeout(function(){b.classList.remove('copied')},1500)}.bind(this))"><i class="fas fa-copy"></i></button></span></p>
<p>配置文件路径：<span class="copy-inline" data-text="_config.yml"><code>_config.yml</code><button class="copy-inline-btn" onclick="navigator.clipboard.writeText(this.parentElement.getAttribute('data-text')).then(function(){var b=this;b.classList.add('copied');setTimeout(function(){b.classList.remove('copied')},1500)}.bind(this))"><i class="fas fa-copy"></i></button></span></p>
<h2 id="inlineImg-行内图片"><a href="#inlineImg-行内图片" class="headerlink" title="inlineImg 行内图片"></a>inlineImg 行内图片</h2><p>在行内插入图片，支持自定义宽高。</p>
<h3 id="语法-15"><a href="#语法-15" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% inlineImg 图片地址 <span class="token url">[<span class="token content">width:宽度</span>] [<span class="token variable">height:高度</span>]</span> %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h3 id="效果-15"><a href="#效果-15" class="headerlink" title="效果"></a>效果</h3><p>在行内插入小图片：<code>{% inlineImg /img/avatar.png 40px %}</code>（将地址替换为有效图片即可显示）。</p>
<blockquote>
<p>由于演示文章没有本地图片资源，此处仅展示语法。实际使用时请替换为有效图片地址。</p>
</blockquote>
<h2 id="数学公式（KaTeX）"><a href="#数学公式（KaTeX）" class="headerlink" title="数学公式（KaTeX）"></a>数学公式（KaTeX）</h2><p>支持行内公式和块级公式，使用 KaTeX 渲染。</p>
<h3 id="语法-16"><a href="#语法-16" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">行内公式：$E = mc^2$

块级公式：
$$
\int_&#123;-\infty&#125;^&#123;\infty&#125; e^&#123;-x^2&#125; dx = \sqrt&#123;\pi&#125;
$$<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-16"><a href="#效果-16" class="headerlink" title="效果"></a>效果</h3><p><strong>行内公式：</strong></p>
<p>质能方程 <span class="math-inline">E = mc^2</span> 是物理学最著名的公式。</p>
<p>欧拉公式 <span class="math-inline">e^{i\pi} + 1 = 0</span> 被称为最美的数学公式。</p>
<p>勾股定理 <span class="math-inline">a^2 + b^2 = c^2</span> 描述直角三角形三边关系。</p>
<p><strong>块级公式：</strong></p>
<div class="math-block">\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}</div>
<div class="math-block">\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}</div>
<div class="math-block">\frac{\partial f}{\partial x} = \lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x}</div>
<h2 id="Mermaid-图表"><a href="#Mermaid-图表" class="headerlink" title="Mermaid 图表"></a>Mermaid 图表</h2><p>在 Markdown 中绘制流程图、时序图、甘特图等。</p>
<h3 id="语法-17"><a href="#语法-17" class="headerlink" title="语法"></a>语法</h3><p>使用 mermaid 代码块（即以 mermaid 为语言标记的代码块）即可：</p>
<pre class="line-numbers language-none"><code class="language-none">&#96;&#96;&#96;mermaid
graph TD
    A[开始] --&gt; B[结束]
&#96;&#96;&#96;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-17"><a href="#效果-17" class="headerlink" title="效果"></a>效果</h3><p><strong>流程图：</strong></p>
<pre class="line-numbers language-mermaid" data-language="mermaid"><code class="language-mermaid"><span class="token keyword">graph</span> TD
    A<span class="token text string">[开始]</span> <span class="token arrow operator">--></span> B<span class="token text string">&#123;条件判断&#125;</span>
    B <span class="token inter-arrow-label"><span class="token arrow-head arrow operator">--</span> <span class="token label property">是</span> <span class="token arrow operator">--></span></span> C<span class="token text string">[执行操作 A]</span>
    B <span class="token inter-arrow-label"><span class="token arrow-head arrow operator">--</span> <span class="token label property">否</span> <span class="token arrow operator">--></span></span> D<span class="token text string">[执行操作 B]</span>
    C <span class="token arrow operator">--></span> E<span class="token text string">[处理结果]</span>
    D <span class="token arrow operator">--></span> E
    E <span class="token arrow operator">--></span> F<span class="token text string">[结束]</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<p><strong>时序图：</strong></p>
<pre class="line-numbers language-mermaid" data-language="mermaid"><code class="language-mermaid"><span class="token keyword">sequenceDiagram</span>
    <span class="token keyword">participant</span> U as 用户
    <span class="token keyword">participant</span> F as 前端
    <span class="token keyword">participant</span> A as API
    <span class="token keyword">participant</span> D as 数据库
    
    U<span class="token arrow operator">->></span>F<span class="token operator">:</span> 点击登录
    F<span class="token arrow operator">->></span>A<span class="token operator">:</span> POST /api/login
    A<span class="token arrow operator">->></span>D<span class="token operator">:</span> 查询用户
    D<span class="token arrow operator">-->></span>A<span class="token operator">:</span> 返回用户数据
    A<span class="token arrow operator">->></span>A<span class="token operator">:</span> 验证密码 + 生成 JWT
    A<span class="token arrow operator">-->></span>F<span class="token operator">:</span> 返回 Token
    F<span class="token arrow operator">-->></span>U<span class="token operator">:</span> 登录成功<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<p><strong>甘特图：</strong></p>
<pre class="line-numbers language-mermaid" data-language="mermaid"><code class="language-mermaid"><span class="token keyword">gantt</span>
    title 项目开发计划
    dateFormat YYYY-MM-DD
    section 设计阶段
    需求分析    <span class="token operator">:</span>a1, 2026-06-01, 7d
    原型设计    <span class="token operator">:</span>after a1, 5d
    section 开发阶段
    前端开发    <span class="token operator">:</span>2026-06-13, 10d
    后端开发    <span class="token operator">:</span>2026-06-13, 12d
    section 上线
    测试与部署   <span class="token operator">:</span>2026-06-25, 5d<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>


<h2 id="Linkcard-链接卡片"><a href="#Linkcard-链接卡片" class="headerlink" title="Linkcard 链接卡片"></a>Linkcard 链接卡片</h2><p>单个外部链接卡片，带标题、描述和可选缩略图，适合在文章中引用外部网站或资源。与 Flink 不同，Linkcard 用于单个链接的精美展示，而非批量友链。</p>
<h3 id="语法-18"><a href="#语法-18" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% linkcard url, 标题, 描述, [图片url] %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h3 id="效果-18"><a href="#效果-18" class="headerlink" title="效果"></a>效果</h3><a class="link-card" href="https://hexo.io" target="_blank" rel="noopener"><div class="link-card-content"><div class="link-card-text"><span class="link-card-title">Hexo</span><span class="link-card-desc">快速、简洁且高效的博客框架</span></div><img class="link-card-img" src="https://hexo.io/favicon.svg" alt="Hexo" loading="lazy"></div></a>
<a class="link-card" href="https://github.com" target="_blank" rel="noopener"><div class="link-card-content"><div class="link-card-text"><span class="link-card-title">GitHub</span><span class="link-card-desc">全球最大的代码托管平台</span></div></div></a>
<h2 id="Postcard-文章引用卡片"><a href="#Postcard-文章引用卡片" class="headerlink" title="Postcard 文章引用卡片"></a>Postcard 文章引用卡片</h2><p>在文章中引用站内其他文章，自动获取标题、摘要和封面图，点击通过 AJAX 无刷新跳转。</p>
<h3 id="语法-19"><a href="#语法-19" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% postcard /文章路径/ %}                        单卡片，自动获取文章信息
{% postcard /文章路径/, 自定义标题, 自定义描述 %}    手动指定标题和描述
{% postcard /文章路径/, 标题, 描述, 封面图URL %}     完全自定义
{% postcard /路径1/ | /路径2/ | /路径3/ %}          多卡片横排<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<blockquote>
<p>文章路径为 Hexo 生成的 URL 路径，如 <code>/2026/06/30/moeMac主题标签外挂演示/</code>。<br>不指定标题和描述时会自动从文章的 <code>title</code>、<code>excerpt</code> 和 <code>cover</code> 中获取。<br>使用 <code>|</code> 分隔多个路径可一行显示多个卡片。</p>
</blockquote>
<h3 id="效果-19"><a href="#效果-19" class="headerlink" title="效果"></a>效果</h3><p><strong>单卡片：</strong></p>
<a class="post-card ajax-link" data-href="/posts/ada921dd.html"><div class="post-card-thumb"><img src="https://picsum.photos/seed/moemac-guide/600/400" alt="moeMac主题使用说明" loading="lazy" decoding="async"></div><div class="post-card-info"><div class="post-card-title">moeMac主题使用说明</div><div class="post-card-excerpt">moeMac 是一款 macOS 桌面风格 的 Hexo 主题，采用毛玻璃（Glassmorphism）设计语言，支持可拖拽窗口、Dock 导航栏、AJAX 无...</div><div class="post-card-meta"><span class="post-card-date"><i class="fas fa-calendar-day"></i> 2026-07-11</span><span class="post-card-read"><i class="fas fa-arrow-right"></i> 阅读</span></div></div></a>
<p><strong>多卡片横排：</strong></p>
<div class="post-card-grid"><a class="post-card ajax-link" data-href="/posts/ada921dd.html"><div class="post-card-thumb"><img src="https://picsum.photos/seed/moemac-guide/600/400" alt="moeMac主题使用说明" loading="lazy" decoding="async"></div><div class="post-card-info"><div class="post-card-title">moeMac主题使用说明</div><div class="post-card-excerpt">moeMac 是一款 macOS 桌面风格 的 Hexo 主题，采用毛玻璃（Glassmorphism）设计语言，支持可拖拽窗口、Dock 导航栏、AJAX 无...</div><div class="post-card-meta"><span class="post-card-date"><i class="fas fa-calendar-day"></i> 2026-07-11</span><span class="post-card-read"><i class="fas fa-arrow-right"></i> 阅读</span></div></div></a><a class="post-card ajax-link" data-href="/posts/ada921dd.html"><div class="post-card-thumb"><img src="https://picsum.photos/seed/moemac-guide/600/400" alt="moeMac主题使用说明" loading="lazy" decoding="async"></div><div class="post-card-info"><div class="post-card-title">moeMac主题使用说明</div><div class="post-card-excerpt">moeMac 是一款 macOS 桌面风格 的 Hexo 主题，采用毛玻璃（Glassmorphism）设计语言，支持可拖拽窗口、Dock 导航栏、AJAX 无...</div><div class="post-card-meta"><span class="post-card-date"><i class="fas fa-calendar-day"></i> 2026-07-11</span><span class="post-card-read"><i class="fas fa-arrow-right"></i> 阅读</span></div></div></a><a class="post-card ajax-link" data-href="/posts/ada921dd.html"><div class="post-card-thumb"><img src="https://picsum.photos/seed/moemac-guide/600/400" alt="moeMac主题使用说明" loading="lazy" decoding="async"></div><div class="post-card-info"><div class="post-card-title">moeMac主题使用说明</div><div class="post-card-excerpt">moeMac 是一款 macOS 桌面风格 的 Hexo 主题，采用毛玻璃（Glassmorphism）设计语言，支持可拖拽窗口、Dock 导航栏、AJAX 无...</div><div class="post-card-meta"><span class="post-card-date"><i class="fas fa-calendar-day"></i> 2026-07-11</span><span class="post-card-read"><i class="fas fa-arrow-right"></i> 阅读</span></div></div></a></div>
<h2 id="Poem-诗词排版"><a href="#Poem-诗词排版" class="headerlink" title="Poem 诗词排版"></a>Poem 诗词排版</h2><p>居中展示诗词，带有标题和作者，适合文学类内容。</p>
<h3 id="语法-20"><a href="#语法-20" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% poem 标题, 作者 %}
第一行
第二行
第三行
{% endpoem %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-20"><a href="#效果-20" class="headerlink" title="效果"></a>效果</h3><div class="poem-block"><h4 class="poem-title">静夜思</h4><p class="poem-author">— 李白</p><div class="poem-body"><p class="poem-line">床前明月光</p><p class="poem-line">疑是地上霜</p><p class="poem-line">举头望明月</p><p class="poem-line">低头思故乡</p></div></div>
<h2 id="Radio-单选按钮"><a href="#Radio-单选按钮" class="headerlink" title="Radio 单选按钮"></a>Radio 单选按钮</h2><p>类似 Checkbox，但使用圆形单选按钮样式。</p>
<h3 id="语法-21"><a href="#语法-21" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% radio 文本 %}                    未选中
{% radio checked, 已选中项 %}        已选中
{% radio checked, green, 绿色已选中 %} 指定颜色<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-21"><a href="#效果-21" class="headerlink" title="效果"></a>效果</h3><p><div class="todo-item radio-item" style="--todo-color:var(--accent-color)"><span class="radio-checkbox"></span><span class="todo-text">选项一</span></div><br><div class="todo-item radio-item todo-checked" style="--todo-color:var(--accent-color)"><span class="radio-checkbox radio-checkbox-checked"></span><span class="todo-text">选项二（已选中）</span></div><br><div class="todo-item radio-item" style="--todo-color:var(--accent-color)"><span class="radio-checkbox"></span><span class="todo-text">选项三</span></div><br><div class="todo-item radio-item todo-checked" style="--todo-color:#3b82f6"><span class="radio-checkbox radio-checkbox-checked"></span><span class="todo-text">蓝色已选中</span></div><br><div class="todo-item radio-item todo-checked" style="--todo-color:#ef4444"><span class="radio-checkbox radio-checkbox-checked"></span><span class="todo-text">红色已选中</span></div></p>
<h2 id="Divider-分割线"><a href="#Divider-分割线" class="headerlink" title="Divider 分割线"></a>Divider 分割线</h2><p>带图标和文字的装饰性分割线，比普通 <code>&lt;hr&gt;</code> 更美观。</p>
<h3 id="语法-22"><a href="#语法-22" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% divider %}                        普通分割线
{% divider fa-star %}                带图标的分割线
{% divider fa-heart, 居中文字 %}      带图标和文字<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-22"><a href="#效果-22" class="headerlink" title="效果"></a>效果</h3><hr class="article-divider">
<div class="article-divider-fancy"><span class="divider-line"></span><i class="fas fa-star"></i><span class="divider-line"></span></div>
<div class="article-divider-fancy"><span class="divider-line"></span><i class="fas fa-heart"></i><span class="divider-text">分割线也可以很美</span><span class="divider-line"></span></div>
<h2 id="Detail-详情展开"><a href="#Detail-详情展开" class="headerlink" title="Detail 详情展开"></a>Detail 详情展开</h2><p>简洁的折叠面板，点击展开&#x2F;收起内容。</p>
<h3 id="语法-23"><a href="#语法-23" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% detail 标题 %}
详情内容
{% enddetail %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-23"><a href="#效果-23" class="headerlink" title="效果"></a>效果</h3><details class="details-panel" id="detail-p0poa7"><summary class="details-summary">点击查看更多信息</summary><div class="details-content"><p>这里是详情内容，点击标题可以收起。</p>
<p>支持 <strong>Markdown</strong> 语法和列表：</p>
<ul>
<li>列表项一</li>
<li>列表项二</li>
</ul>
</div></details>
<details class="details-panel" id="detail-fg6oah"><summary class="details-summary">技术细节</summary><div class="details-content"><p>适合放置技术文档中的补充说明，默认折叠不占空间。</p>
</div></details>
<h2 id="Kbd-键盘按键"><a href="#Kbd-键盘按键" class="headerlink" title="Kbd 键盘按键"></a>Kbd 键盘按键</h2><p>展示键盘按键样式，适合编写快捷键教程。</p>
<h3 id="语法-24"><a href="#语法-24" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% kbd Ctrl %}              单个按键
{% kbd Ctrl + C %}          组合键（自动拆分）<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="效果-24"><a href="#效果-24" class="headerlink" title="效果"></a>效果</h3><p>按 <kbd class="kbd-key">Ctrl</kbd> + <kbd class="kbd-key">C</kbd> 复制，<kbd class="kbd-key">Ctrl</kbd> + <kbd class="kbd-key">V</kbd> 粘贴。</p>
<p>快捷键：<kbd class="kbd-key">Ctrl</kbd><span class="kbd-plus">+</span><kbd class="kbd-key">Shift</kbd><span class="kbd-plus">+</span><kbd class="kbd-key">Esc</kbd> 打开任务管理器。</p>
<p>按 <kbd class="kbd-key">Enter</kbd> 确认，<kbd class="kbd-key">Esc</kbd> 取消。</p>
<h2 id="Span-自定义样式"><a href="#Span-自定义样式" class="headerlink" title="Span 自定义样式"></a>Span 自定义样式</h2><p>给行内文字添加自定义样式，支持颜色和字体效果组合。</p>
<h3 id="语法-25"><a href="#语法-25" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% span red, 红色文字 %}
{% span bold large, 粗体大号文字 %}
{% span blue underline, 蓝色下划线 %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<p>支持的颜色：<code>red</code> &#x2F; <code>blue</code> &#x2F; <code>green</code> &#x2F; <code>purple</code> &#x2F; <code>orange</code> &#x2F; <code>pink</code> &#x2F; <code>gray</code><br>支持的样式：<code>bold</code> &#x2F; <code>italic</code> &#x2F; <code>underline</code> &#x2F; <code>strike</code> &#x2F; <code>large</code> &#x2F; <code>small</code></p>
<h3 id="效果-25"><a href="#效果-25" class="headerlink" title="效果"></a>效果</h3><p>这是一段包含<span class="custom-span" style="color:#ef4444">红色文字</span>和<span class="custom-span" style="color:#3b82f6">蓝色文字</span>的句子。</p>
<p>支持组合样式：<span class="custom-span" style="font-weight:700;font-size:1.2em">粗体大号</span>、<span class="custom-span" style="color:#22c55e;font-style:italic">绿色斜体</span>、<span class="custom-span" style="color:#a855f7;text-decoration:underline">紫色下划线</span>。</p>
<p><span class="custom-span" style="color:#f97316;text-decoration:line-through">删除线效果</span> 也可以用 span 实现。</p>
<h2 id="Icon-行内图标"><a href="#Icon-行内图标" class="headerlink" title="Icon 行内图标"></a>Icon 行内图标</h2><p>在文字中插入 Font Awesome 图标，支持指定颜色。</p>
<h3 id="语法-26"><a href="#语法-26" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% icon fa-heart %}              默认图标
{% icon fa-star, red %}          红色图标
{% icon fa-check-circle, green %} 绿色图标<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-26"><a href="#效果-26" class="headerlink" title="效果"></a>效果</h3><p><i class="fas fa-heart inline-icon" style="color:#ef4444"></i> 爱心、<i class="fas fa-star inline-icon" style="color:#eab308"></i> 星星、<i class="fas fa-circle-check inline-icon" style="color:#22c55e"></i> 对勾、<i class="fas fa-circle-info inline-icon" style="color:#3b82f6"></i> 信息。</p>
<p>在句子中使用：请注意<i class="fas fa-triangle-exclamation inline-icon" style="color:#f97316"></i> 这个警告图标。</p>
<h2 id="U-下划线"><a href="#U-下划线" class="headerlink" title="U 下划线"></a>U 下划线</h2><p>给文字添加强调下划线，颜色跟随主题色。</p>
<h3 id="语法-27"><a href="#语法-27" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% u 需要下划线的文本 %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h3 id="效果-27"><a href="#效果-27" class="headerlink" title="效果"></a>效果</h3><p>这句话中<u class="underline-text">关键内容</u>被加上了下划线，<u class="underline-text">用于强调重要信息</u>。</p>
<h2 id="Abbr-缩写提示"><a href="#Abbr-缩写提示" class="headerlink" title="Abbr 缩写提示"></a>Abbr 缩写提示</h2><p>鼠标悬停时显示缩写的完整名称。</p>
<h3 id="语法-28"><a href="#语法-28" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% abbr HTML, HyperText Markup Language %}
{% abbr CSS, Cascading Style Sheets %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="效果-28"><a href="#效果-28" class="headerlink" title="效果"></a>效果</h3><p>网页由 <abbr class="abbr-text" title="HyperText Markup Language">HTML</abbr> 结构和 <abbr class="abbr-text" title="Cascading Style Sheets">CSS</abbr> 样式组成。</p>
<p>前端开发常用 <abbr class="abbr-text" title="JavaScript">JS</abbr>、<abbr class="abbr-text" title="TypeScript">TS</abbr> 和 <abbr class="abbr-text" title="Application Programming Interface">API</abbr>。</p>
<h2 id="Aside-旁注"><a href="#Aside-旁注" class="headerlink" title="Aside 旁注"></a>Aside 旁注</h2><p>将文字以旁注形式展示，适合补充说明或引用。</p>
<h3 id="语法-29"><a href="#语法-29" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% aside 这是左侧旁注内容 %}
{% aside right, 这是右侧旁注内容 %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="效果-29"><a href="#效果-29" class="headerlink" title="效果"></a>效果</h3><aside class="pullquote pullquote-left">这是一段旁注文字，适合用于补充说明或引用名言。</aside>
<p>正文内容继续，旁注会在左侧以特殊样式显示。</p>
<aside class="pullquote pullquote-right">右侧旁注也可以使用，适合对称排版。</aside>
<h2 id="Sub-Sup-上下标"><a href="#Sub-Sup-上下标" class="headerlink" title="Sub&#x2F;Sup 上下标"></a>Sub&#x2F;Sup 上下标</h2><p>插入上标和下标文字，适合化学公式、数学表达等。</p>
<h3 id="语法-30"><a href="#语法-30" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">H{% sub 2 %}O              下标
E = mc{% sup 2 %}          上标<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre>

<h3 id="效果-30"><a href="#效果-30" class="headerlink" title="效果"></a>效果</h3><p>水分子：H<sub class="sub-text">2</sub>O，二氧化碳：CO<sub class="sub-text">2</sub>。</p>
<p>质能方程：E &#x3D; mc<sup class="sup-text">2</sup>，面积单位：m<sup class="sup-text">2</sup>、体积单位：m<sup class="sup-text">3</sup>。</p>
<h2 id="Bubble-气泡注释"><a href="#Bubble-气泡注释" class="headerlink" title="Bubble 气泡注释"></a>Bubble 气泡注释</h2><p>鼠标悬停时显示注释气泡，适合在不打断阅读流的情况下补充说明。</p>
<h3 id="语法-31"><a href="#语法-31" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% bubble 文本@注释内容 %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<h3 id="效果-31"><a href="#效果-31" class="headerlink" title="效果"></a>效果</h3><p>这是一个包含<span class="bubble-note" data-tip="两个或多个粒子之间存在的一种特殊关联">量子纠缠<i class="fas fa-circle-info bubble-icon"></i></span>的句子。</p>
<p>也可以<span class="bubble-note" data-tip="注释">简单标注<i class="fas fa-circle-info bubble-icon"></i></span>一下某个概念。</p>
<h2 id="Progress-进度条"><a href="#Progress-进度条" class="headerlink" title="Progress 进度条"></a>Progress 进度条</h2><p>可视化展示进度、完成度等数值信息。</p>
<h3 id="语法-32"><a href="#语法-32" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% progress 百分比, [颜色], [标签] %}<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>

<p>支持的颜色：<code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code> &#x2F; <code>cyan</code> &#x2F; <code>pink</code></p>
<h3 id="效果-32"><a href="#效果-32" class="headerlink" title="效果"></a>效果</h3><div class="progress-bar-wrap" style="--progress-color:#3b82f6"><span class="progress-label">前端开发</span><div class="progress-track"><div class="progress-fill" style="width:75%"></div></div><span class="progress-percent">75%</span></div>
<div class="progress-bar-wrap" style="--progress-color:#22c55e"><span class="progress-label">后端接口</span><div class="progress-track"><div class="progress-fill" style="width:90%"></div></div><span class="progress-percent">90%</span></div>
<div class="progress-bar-wrap" style="--progress-color:#f97316"><span class="progress-label">测试覆盖</span><div class="progress-track"><div class="progress-fill" style="width:45%"></div></div><span class="progress-percent">45%</span></div>
<div class="progress-bar-wrap" style="--progress-color:#a855f7"><span class="progress-label">文档编写</span><div class="progress-track"><div class="progress-fill" style="width:100%"></div></div><span class="progress-percent">100%</span></div>
<h2 id="Steps-步骤条"><a href="#Steps-步骤条" class="headerlink" title="Steps 步骤条"></a>Steps 步骤条</h2><p>将内容组织在可切换的步骤中，适合教程、流程说明等场景。</p>
<h3 id="语法-33"><a href="#语法-33" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% steps %}

{% step 步骤一标题 %}
步骤一内容
{% endstep %}

{% step 步骤二标题 %}
步骤二内容
{% endstep %}

{% endsteps %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-33"><a href="#效果-33" class="headerlink" title="效果"></a>效果</h3><div class="steps-container" id="steps-zxr4cd"><div class="steps-nav"><button class="step-label active" data-step="steps-zxr4cd-0"><span class="step-num">1</span><span class="step-text">准备环境</span></button><button class="step-label" data-step="steps-zxr4cd-1"><span class="step-num">2</span><span class="step-text">初始化项目</span></button><button class="step-label" data-step="steps-zxr4cd-2"><span class="step-num">3</span><span class="step-text">安装主题</span></button><button class="step-label" data-step="steps-zxr4cd-3"><span class="step-num">4</span><span class="step-text">启动预览</span></button></div><div class="steps-body"><div class="step-content active" id="steps-zxr4cd-0"><p>安装 Node.js 和 Hexo CLI：</p>
<p>CODE42</p></div><div class="step-content" id="steps-zxr4cd-1"><p>创建新的 Hexo 博客：</p>
<p>CODE43</p></div><div class="step-content" id="steps-zxr4cd-2"><p>将 moeMac 主题放入 undefined 目录，然后在 undefined 中设置：</p>
<p>CODE44</p></div><div class="step-content" id="steps-zxr4cd-3"><p>CODE45</p>
<p>访问 undefined 即可看到效果。</p></div></div></div>
<h2 id="Carousel-轮播图"><a href="#Carousel-轮播图" class="headerlink" title="Carousel 轮播图"></a>Carousel 轮播图</h2><p>图片轮播组件，支持自动播放、手动切换和触摸滑动。</p>
<h3 id="语法-34"><a href="#语法-34" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% carousel %}
<span class="token url"><span class="token operator">!</span>[<span class="token content">说明1</span>](<span class="token url">图片地址1</span>)</span>
<span class="token url"><span class="token operator">!</span>[<span class="token content">说明2</span>](<span class="token url">图片地址2</span>)</span>
{% endcarousel %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre>

<h3 id="效果-34"><a href="#效果-34" class="headerlink" title="效果"></a>效果</h3><div class="carousel-container" id="carousel-bcn1h1"><div class="carousel-track"><div class="carousel-slide active"><img src="/images/douban/movie/p2893270877.jpg" alt="春日花园" loading="eager" decoding="async"><div class="carousel-caption">春日花园</div></div><div class="carousel-slide"><img src="/images/douban/movie/p2545472803.jpg" alt="夏日萤火" loading="eager" decoding="async"><div class="carousel-caption">夏日萤火</div></div><div class="carousel-slide"><img src="/images/douban/movie/p2770857575.jpg" alt="秋日银杏" loading="eager" decoding="async"><div class="carousel-caption">秋日银杏</div></div><div class="carousel-slide"><img src="/images/douban/movie/p2814949620.jpg" alt="冬日雪景" loading="eager" decoding="async"><div class="carousel-caption">冬日雪景</div></div></div><button class="carousel-btn carousel-prev" data-carousel="carousel-bcn1h1"><i class="fas fa-chevron-left"></i></button><button class="carousel-btn carousel-next" data-carousel="carousel-bcn1h1"><i class="fas fa-chevron-right"></i></button><div class="carousel-dots"><button class="carousel-dot active" data-carousel="carousel-bcn1h1" data-idx="0"></button><button class="carousel-dot" data-carousel="carousel-bcn1h1" data-idx="1"></button><button class="carousel-dot" data-carousel="carousel-bcn1h1" data-idx="2"></button><button class="carousel-dot" data-carousel="carousel-bcn1h1" data-idx="3"></button></div></div>
<h2 id="Card-卡片容器"><a href="#Card-卡片容器" class="headerlink" title="Card 卡片容器"></a>Card 卡片容器</h2><p>带标题和颜色的卡片容器，适合突出展示重要内容。</p>
<h3 id="语法-35"><a href="#语法-35" class="headerlink" title="语法"></a>语法</h3><pre class="line-numbers language-markdown" data-language="markdown"><code class="language-markdown">{% card <span class="token url">[<span class="token content">颜色</span>] [<span class="token variable">标题</span>]</span> %}
卡片内容
{% endcard %}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre>

<p>支持的颜色：<code>red</code> &#x2F; <code>green</code> &#x2F; <code>blue</code> &#x2F; <code>yellow</code> &#x2F; <code>orange</code> &#x2F; <code>purple</code> &#x2F; <code>cyan</code> &#x2F; <code>pink</code> &#x2F; <code>default</code></p>
<h3 id="效果-35"><a href="#效果-35" class="headerlink" title="效果"></a>效果</h3><div class="card-box" style="--card-color:#3b82f6"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">重要提示</span></div><div class="card-box-body"><p>这是一个蓝色卡片容器，内部<strong>支持 Markdown</strong> 语法。</p>
<ul>
<li>列表项一</li>
<li>列表项二</li>
</ul>
<blockquote>
<p>也可以使用引用块。</p>
</blockquote>
</div></div>
<div class="card-box" style="--card-color:#22c55e"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">成功案例</span></div><div class="card-box-body"><p>使用 moeMac 主题搭建博客的步骤简单明了，几分钟即可完成部署。</p>
</div></div>
<div class="card-box" style="--card-color:#f97316"><div class="card-box-header"><i class="fas fa-bookmark card-box-icon"></i><span class="card-box-title">注意事项</span></div><div class="card-box-body"><p>请确保 Node.js 版本 &gt;&#x3D; 14，否则部分功能可能无法正常使用。</p>
</div></div>
<h2 id="功能总结"><a href="#功能总结" class="headerlink" title="功能总结"></a>功能总结</h2><p>moeMac 主题已支持以下 <strong>38 种</strong> 标签外挂功能：</p>
<table>
<thead>
<tr>
<th>功能</th>
<th>语法</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>Note 容器</td>
<td><code>::: type</code></td>
<td>提示&#x2F;警告&#x2F;危险等容器块</td>
</tr>
<tr>
<td>Checkbox 待办</td>
<td><code>checkbox</code></td>
<td>待办事项列表</td>
</tr>
<tr>
<td>Radio 单选</td>
<td><code>radio</code></td>
<td>单选按钮</td>
</tr>
<tr>
<td>Tabs 标签页</td>
<td><code>tabs</code></td>
<td>标签页切换</td>
</tr>
<tr>
<td>Folding 折叠</td>
<td><code>folding</code></td>
<td>可展开&#x2F;收起的面板</td>
</tr>
<tr>
<td>Detail 详情</td>
<td><code>detail</code></td>
<td>简洁折叠面板</td>
</tr>
<tr>
<td>Hide 隐藏</td>
<td><code>hide</code></td>
<td>鼠标悬停显示</td>
</tr>
<tr>
<td>HideBlock</td>
<td><code>hideBlock</code></td>
<td>点击显示块</td>
</tr>
<tr>
<td>HideToggle</td>
<td><code>hideToggle</code></td>
<td>可展开隐藏</td>
</tr>
<tr>
<td>Badge 徽章</td>
<td><code>badge</code></td>
<td>行内彩色徽章</td>
</tr>
<tr>
<td>Label 标签</td>
<td><code>label</code></td>
<td>行内彩色文字</td>
</tr>
<tr>
<td>Mark 高亮</td>
<td><code>mark</code></td>
<td>荧光笔标记</td>
</tr>
<tr>
<td>Button 按钮</td>
<td><code>btn</code></td>
<td>按钮链接</td>
</tr>
<tr>
<td>Btns 按钮组</td>
<td><code>btns</code></td>
<td>多按钮排列</td>
</tr>
<tr>
<td>Linkcard 链接卡片</td>
<td><code>linkcard</code></td>
<td>卡片式链接</td>
</tr>
<tr>
<td>Postcard 文章卡片</td>
<td><code>postcard</code></td>
<td>站内文章引用卡片</td>
</tr>
<tr>
<td>Quot 引用</td>
<td><code>quot</code></td>
<td>带作者引用</td>
</tr>
<tr>
<td>Poem 诗词</td>
<td><code>poem</code></td>
<td>诗词排版</td>
</tr>
<tr>
<td>Flink 友链</td>
<td><code>flink</code></td>
<td>友情链接卡片</td>
</tr>
<tr>
<td>Gallery 画廊</td>
<td><code>gallery</code></td>
<td>图片网格画廊</td>
</tr>
<tr>
<td>Timeline 时间线</td>
<td><code>timeline</code></td>
<td>时间轴</td>
</tr>
<tr>
<td>Copy 复制</td>
<td><code>copy</code></td>
<td>行内代码复制</td>
</tr>
<tr>
<td>Divider 分割线</td>
<td><code>divider</code></td>
<td>装饰性分割线</td>
</tr>
<tr>
<td>Kbd 键盘按键</td>
<td><code>kbd</code></td>
<td>键盘按键样式</td>
</tr>
<tr>
<td>Span 样式</td>
<td><code>span</code></td>
<td>自定义行内样式</td>
</tr>
<tr>
<td>Icon 图标</td>
<td><code>icon</code></td>
<td>行内 Font Awesome 图标</td>
</tr>
<tr>
<td>U 下划线</td>
<td><code>u</code></td>
<td>强调下划线</td>
</tr>
<tr>
<td>Abbr 缩写</td>
<td><code>abbr</code></td>
<td>悬停提示缩写</td>
</tr>
<tr>
<td>Aside 旁注</td>
<td><code>aside</code></td>
<td>旁注引用</td>
</tr>
<tr>
<td>Sub 下标</td>
<td><code>sub</code></td>
<td>下标文字</td>
</tr>
<tr>
<td>Sup 上标</td>
<td><code>sup</code></td>
<td>上标文字</td>
</tr>
<tr>
<td>Bubble 气泡注释</td>
<td><code>bubble</code></td>
<td>悬停显示注释气泡</td>
</tr>
<tr>
<td>Progress 进度条</td>
<td><code>progress</code></td>
<td>可视化进度条</td>
</tr>
<tr>
<td>Steps 步骤条</td>
<td><code>steps</code></td>
<td>可切换步骤内容</td>
</tr>
<tr>
<td>Carousel 轮播图</td>
<td><code>carousel</code></td>
<td>图片轮播组件</td>
</tr>
<tr>
<td>Card 卡片容器</td>
<td><code>card</code></td>
<td>带标题颜色卡片</td>
</tr>
<tr>
<td>数学公式</td>
<td><code>$...$</code></td>
<td>KaTeX 渲染</td>
</tr>
<tr>
<td>Mermaid 图表</td>
<td><code>mermaid</code></td>
<td>流程图&#x2F;时序图&#x2F;甘特图</td>
</tr>
</tbody></table>
]]></description>
      <category>技术</category>
      <author>梦繁星</author>
    </item>
  </channel>
</rss>
