<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://studynotes-90w.pages.dev/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://studynotes-90w.pages.dev/</id>
  <title>JimBo的米奇妙妙屋</title>
  <subtitle>简洁·核心·不烧心的全栈知识库</subtitle>
  <icon>https://studynotes-90w.pages.dev/avatar.png</icon>
  <updated>2026-10-27T16:33:45.260Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://studynotes-90w.pages.dev/atom.xml"/>
  <link rel="alternate" href="https://studynotes-90w.pages.dev/"/>
  <category term="杂谈"/>
  <category term="技术复盘"/>
  <entry>
    <title type="text">关于</title>
    <id>https://studynotes-90w.pages.dev/about.html</id>
    <link href="https://studynotes-90w.pages.dev/about.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<p>这里是 JimBo。</p>
<p>简单几行介绍你自己：在做什么、擅长什么、这个站会写什么。</p>
<h2>联系方式</h2>
<ul>
<li>邮箱：you@example.com</li>
<li>GitHub：https://github.com/yourname</li>
<li>博客：https://blog.jimbo.xxx</li>
</ul>
<blockquote>
<p>品牌名、导航、logo 都是占位，随时在 <code>src/.vuepress/</code> 下改。</p>
</blockquote>
]]></summary>
    <content type="html"><![CDATA[
<p>这里是 JimBo。</p>
<p>简单几行介绍你自己：在做什么、擅长什么、这个站会写什么。</p>
<h2>联系方式</h2>
<ul>
<li>邮箱：you@example.com</li>
<li>GitHub：https://github.com/yourname</li>
<li>博客：https://blog.jimbo.xxx</li>
</ul>
<blockquote>
<p>品牌名、导航、logo 都是占位，随时在 <code>src/.vuepress/</code> 下改。</p>
</blockquote>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">优质资源</title>
    <id>https://studynotes-90w.pages.dev/resources/</id>
    <link href="https://studynotes-90w.pages.dev/resources/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<p>值得反复回看的外部资源：文档、课程、工具、开源项目、博客。</p>
<blockquote>
<p>内容整理中。</p>
</blockquote>
<h2>文档与课程</h2>
<p>待补充。</p>
<h2>工具</h2>
<p>待补充。</p>
<h2>开源项目</h2>
<p>待补充。</p>
<h2>博客与站点</h2>
<p>待补充。</p>
]]></summary>
    <content type="html"><![CDATA[
<p>值得反复回看的外部资源：文档、课程、工具、开源项目、博客。</p>
<blockquote>
<p>内容整理中。</p>
</blockquote>
<h2>文档与课程</h2>
<p>待补充。</p>
<h2>工具</h2>
<p>待补充。</p>
<h2>开源项目</h2>
<p>待补充。</p>
<h2>博客与站点</h2>
<p>待补充。</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">Agent工作流</title>
    <id>https://studynotes-90w.pages.dev/workflow/</id>
    <link href="https://studynotes-90w.pages.dev/workflow/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<p>把「一人 + 多个 AI Agent」的开发流程固化成可复用的工作流：角色分工、流水线、模板与规范。</p>
<blockquote>
<p>内容整理中。后续把 workflows / agents / templates / standards 搬进来。</p>
</blockquote>
<h2>角色</h2>
<ul>
<li>产品经理</li>
<li>架构师</li>
<li>UI/UX 设计师</li>
<li>全栈开发</li>
<li>测试工程师</li>
<li>运维工程师</li>
<li>代码评审</li>
</ul>
<h2>流水线</h2>
<p>待补充。</p>]]></summary>
    <content type="html"><![CDATA[
<p>把「一人 + 多个 AI Agent」的开发流程固化成可复用的工作流：角色分工、流水线、模板与规范。</p>
<blockquote>
<p>内容整理中。后续把 workflows / agents / templates / standards 搬进来。</p>
</blockquote>
<h2>角色</h2>
<ul>
<li>产品经理</li>
<li>架构师</li>
<li>UI/UX 设计师</li>
<li>全栈开发</li>
<li>测试工程师</li>
<li>运维工程师</li>
<li>代码评审</li>
</ul>
<h2>流水线</h2>
<p>待补充。</p>
<h2>模板与规范</h2>
<p>待补充。</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">文章索引</title>
    <id>https://studynotes-90w.pages.dev/posts/posts.html</id>
    <link href="https://studynotes-90w.pages.dev/posts/posts.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<ul>
<li><a href="/posts/2026/%E5%BC%80%E7%AF%87-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E8%BF%99%E4%B8%AA%E7%AB%99.html" target="_blank">开篇 · 为什么写这个站</a></li>
<li><a href="/posts/2026/%E6%9F%90%E7%AF%87%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98.html" target="_blank">某篇技术复盘</a></li>
</ul>
]]></summary>
    <content type="html"><![CDATA[
<ul>
<li><a href="/posts/2026/%E5%BC%80%E7%AF%87-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E8%BF%99%E4%B8%AA%E7%AB%99.html" target="_blank">开篇 · 为什么写这个站</a></li>
<li><a href="/posts/2026/%E6%9F%90%E7%AF%87%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98.html" target="_blank">某篇技术复盘</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">文章</title>
    <id>https://studynotes-90w.pages.dev/posts/</id>
    <link href="https://studynotes-90w.pages.dev/posts/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<ul>
<li><a href="/posts/2026/%E5%BC%80%E7%AF%87-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E8%BF%99%E4%B8%AA%E7%AB%99.html" target="_blank">开篇 · 为什么写这个站</a></li>
<li><a href="/posts/2026/%E6%9F%90%E7%AF%87%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98.html" target="_blank">某篇技术复盘</a></li>
</ul>
<p>完整归档见 <a href="/posts/_posts.html" target="_blank">文章索引</a>。</p>]]></summary>
    <content type="html"><![CDATA[
<ul>
<li><a href="/posts/2026/%E5%BC%80%E7%AF%87-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E8%BF%99%E4%B8%AA%E7%AB%99.html" target="_blank">开篇 · 为什么写这个站</a></li>
<li><a href="/posts/2026/%E6%9F%90%E7%AF%87%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98.html" target="_blank">某篇技术复盘</a></li>
</ul>
<p>完整归档见 <a href="/posts/_posts.html" target="_blank">文章索引</a>。</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">全栈笔记</title>
    <id>https://studynotes-90w.pages.dev/notes/</id>
    <link href="https://studynotes-90w.pages.dev/notes/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<p>按 9 个方向整理的工程笔记，共 191 篇。左侧目录与本地笔记目录一一对应。</p>
<h2>00-计算机基础</h2>
<p>共 25 篇。</p>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" target="_blank">01-数据结构</a> · 8 篇</li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" target="_blank">02-计算机组成原理</a> · 6 篇</li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" target="_blank">03-操作系统</a> · 5 篇</li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/" target="_blank">04-计算机网络</a> · 6 篇</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<p>按 9 个方向整理的工程笔记，共 191 篇。左侧目录与本地笔记目录一一对应。</p>
<h2>00-计算机基础</h2>
<p>共 25 篇。</p>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" target="_blank">01-数据结构</a> · 8 篇</li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" target="_blank">02-计算机组成原理</a> · 6 篇</li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" target="_blank">03-操作系统</a> · 5 篇</li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/" target="_blank">04-计算机网络</a> · 6 篇</li>
</ul>
<h2>01-产品</h2>
<p>共 17 篇。</p>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/" target="_blank">01-产品认知</a> · 2 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/" target="_blank">02-用户与需求</a> · 3 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/" target="_blank">03-文档与交付</a> · 2 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/" target="_blank">04-指标与数据</a> · 2 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/" target="_blank">05-规划与迭代</a> · 2 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/" target="_blank">06-B端产品</a> · 2 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/" target="_blank">07-AI产品</a> · 2 篇</li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/" target="_blank">08-上线与运营</a> · 2 篇</li>
</ul>
<h2>02-UI</h2>
<p>共 18 篇。</p>
<ul>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/" target="_blank">01-设计基础</a> · 3 篇</li>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/" target="_blank">02-交互与信息架构</a> · 2 篇</li>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/" target="_blank">03-设计系统</a> · 3 篇</li>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/" target="_blank">04-Figma工程化</a> · 2 篇</li>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/" target="_blank">05-可用性与无障碍</a> · 2 篇</li>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/" target="_blank">06-多端与适配</a> · 2 篇</li>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/" target="_blank">07-动效与资产</a> · 2 篇</li>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/" target="_blank">08-协作与度量</a> · 2 篇</li>
</ul>
<h2>03-架构</h2>
<p>共 29 篇。</p>
<ul>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/01-%E6%9E%B6%E6%9E%84%E5%9F%BA%E7%A1%80/" target="_blank">01-架构基础</a> · 3 篇</li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/02-%E9%A2%86%E5%9F%9F%E4%B8%8E%E8%BE%B9%E7%95%8C/" target="_blank">02-领域与边界</a> · 2 篇</li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/03-%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%8E%E4%B8%80%E8%87%B4%E6%80%A7/" target="_blank">03-分布式与一致性</a> · 3 篇</li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/04-%E5%AE%B9%E9%87%8F%E4%B8%8E%E9%AB%98%E5%8F%AF%E7%94%A8/" target="_blank">04-容量与高可用</a> · 5 篇</li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/05-%E4%BC%81%E4%B8%9A%E7%B3%BB%E7%BB%9F%E4%B8%8E%E9%9B%86%E6%88%90/" target="_blank">05-企业系统与集成</a> · 10 篇</li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/06-%E6%BC%94%E8%BF%9B%E4%B8%8E%E6%B2%BB%E7%90%86/" target="_blank">06-演进与治理</a> · 4 篇</li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/07-%E5%85%B8%E5%9E%8B%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/" target="_blank">07-典型系统设计</a> · 2 篇</li>
</ul>
<h2>04-前端</h2>
<p>共 22 篇。</p>
<ul>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/" target="_blank">01-HTML与CSS</a> · 2 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/02-JavaScript%E4%B8%8ETypeScript/" target="_blank">02-JavaScript与TypeScript</a> · 2 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/03-React/" target="_blank">03-React</a> · 3 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/04-Vue/" target="_blank">04-Vue</a> · 3 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/05-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/" target="_blank">05-前端工程化</a> · 3 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/06-%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E4%B8%8EUI/" target="_blank">06-数据请求与UI</a> · 3 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/07-%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8E%E7%BD%91%E7%BB%9C/" target="_blank">07-浏览器与网络</a> · 1 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/08-%E5%AE%89%E5%85%A8%E4%B8%8E%E6%80%A7%E8%83%BD/" target="_blank">08-安全与性能</a> · 2 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/09-%E5%B7%A5%E7%A8%8B%E4%BF%9D%E9%9A%9C/" target="_blank">09-工程保障</a> · 2 篇</li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/10-%E5%AD%98%E9%87%8F%E6%8A%80%E6%9C%AF/" target="_blank">10-存量技术</a> · 1 篇</li>
</ul>
<h2>05-后端</h2>
<p>共 22 篇。</p>
<ul>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/01-Java/" target="_blank">01-Java</a> · 3 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/02-Python/" target="_blank">02-Python</a> · 3 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/03-Web%E4%B8%8EAPI/" target="_blank">03-Web与API</a> · 3 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/04-%E6%95%B0%E6%8D%AE%E5%BA%93/" target="_blank">04-数据库</a> · 4 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/05-%E4%B8%AD%E9%97%B4%E4%BB%B6/" target="_blank">05-中间件</a> · 2 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/06-%E8%AE%A4%E8%AF%81%E4%B8%8E%E4%BB%BB%E5%8A%A1/" target="_blank">06-认证与任务</a> · 2 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/07-%E6%96%87%E4%BB%B6%E4%B8%8E%E5%AE%89%E5%85%A8/" target="_blank">07-文件与安全</a> · 2 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/08-%E8%B4%A8%E9%87%8F%E4%B8%8E%E8%A7%82%E6%B5%8B/" target="_blank">08-质量与观测</a> · 2 篇</li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/09-%E5%AD%98%E9%87%8F%E6%8A%80%E6%9C%AF/" target="_blank">09-存量技术</a> · 1 篇</li>
</ul>
<h2>06-测试</h2>
<p>共 11 篇。</p>
<ul>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/01-%E6%B5%8B%E8%AF%95%E7%90%86%E8%AE%BA/" target="_blank">01-测试理论</a> · 2 篇</li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/02-%E5%8D%95%E5%85%83%E4%B8%8E%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95/" target="_blank">02-单元与集成测试</a> · 2 篇</li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/03-%E6%8E%A5%E5%8F%A3%E4%B8%8EE2E%E6%B5%8B%E8%AF%95/" target="_blank">03-接口与E2E测试</a> · 2 篇</li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/04-%E4%B8%93%E9%A1%B9%E6%B5%8B%E8%AF%95/" target="_blank">04-专项测试</a> · 2 篇</li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/05-%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C/" target="_blank">05-质量保障</a> · 3 篇</li>
</ul>
<h2>07-运维</h2>
<p>共 25 篇。</p>
<ul>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/01-Linux%E7%B3%BB%E7%BB%9F/" target="_blank">01-Linux系统</a> · 4 篇</li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/02-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/" target="_blank">02-版本管理</a> · 2 篇</li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/03-%E5%AE%B9%E5%99%A8%E4%B8%8E%E7%BC%96%E6%8E%92/" target="_blank">03-容器与编排</a> · 6 篇</li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/04-%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E4%BB%98/" target="_blank">04-自动化交付</a> · 6 篇</li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/05-%E7%9B%91%E6%8E%A7%E4%B8%8E%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/" target="_blank">05-监控与可观测性</a> · 4 篇</li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/06-%E4%BA%91%E5%B9%B3%E5%8F%B0/" target="_blank">06-云平台</a> · 3 篇</li>
</ul>
<h2>08-AI</h2>
<p>共 22 篇。</p>
<ul>
<li><a href="/notes/08-AI/01-Python%E4%B8%8EAI%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/" target="_blank">01-Python与AI数据处理</a> · 2 篇</li>
<li><a href="/notes/08-AI/02-%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A5%E5%85%A5/" target="_blank">02-大模型接入</a> · 3 篇</li>
<li><a href="/notes/08-AI/03-Prompt%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B/" target="_blank">03-Prompt与上下文工程</a> · 2 篇</li>
<li><a href="/notes/08-AI/04-%E7%BB%93%E6%9E%84%E5%8C%96%E8%BE%93%E5%87%BA%E4%B8%8E%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8/" target="_blank">04-结构化输出与工具调用</a> · 2 篇</li>
<li><a href="/notes/08-AI/05-Embedding%E4%B8%8E%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2/" target="_blank">05-Embedding与向量检索</a> · 2 篇</li>
<li><a href="/notes/08-AI/06-RAG/" target="_blank">06-RAG</a> · 2 篇</li>
<li><a href="/notes/08-AI/07-Agent%E4%B8%8E%E5%B7%A5%E4%BD%9C%E6%B5%81/" target="_blank">07-Agent与工作流</a> · 2 篇</li>
<li><a href="/notes/08-AI/08-%E6%A8%A1%E5%9E%8B%E5%AE%9A%E5%88%B6%E4%B8%8E%E9%83%A8%E7%BD%B2/" target="_blank">08-模型定制与部署</a> · 2 篇</li>
<li><a href="/notes/08-AI/09-AI%E5%BA%94%E7%94%A8%E5%B7%A5%E7%A8%8B/" target="_blank">09-AI应用工程</a> · 1 篇</li>
<li><a href="/notes/08-AI/10-AI%E8%B4%A8%E9%87%8F%E4%B8%8E%E5%AE%89%E5%85%A8/" target="_blank">10-AI质量与安全</a> · 2 篇</li>
<li><a href="/notes/08-AI/11-%E5%A4%9A%E6%A8%A1%E6%80%81%E4%B8%8E%E7%94%9F%E6%80%81/" target="_blank">11-多模态与生态</a> · 2 篇</li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">全栈项目</title>
    <id>https://studynotes-90w.pages.dev/projects/</id>
    <link href="https://studynotes-90w.pages.dev/projects/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<p>按八个方向整理的实战项目，每个方向从需求到部署走完整链路。</p>
<blockquote>
<p>内容整理中，按 计算机基础 / 产品 / UI / 架构 / 前端 / 后端 / 测试 / 运维 / AI 分类填充。</p>
</blockquote>
<h2>计算机基础</h2>
<p>待补充。</p>
<h2>产品</h2>
<p>待补充。</p>
<h2>UI</h2>
<p>待补充。</p>
<h2>架构</h2>
<p>待补充。</p>
<h2>前端</h2>
<p>待补充。</p>
<h2>后端</h2>
<p>待补充。</p>
<h2>测试</h2>
<p>待补充。</p>]]></summary>
    <content type="html"><![CDATA[
<p>按八个方向整理的实战项目，每个方向从需求到部署走完整链路。</p>
<blockquote>
<p>内容整理中，按 计算机基础 / 产品 / UI / 架构 / 前端 / 后端 / 测试 / 运维 / AI 分类填充。</p>
</blockquote>
<h2>计算机基础</h2>
<p>待补充。</p>
<h2>产品</h2>
<p>待补充。</p>
<h2>UI</h2>
<p>待补充。</p>
<h2>架构</h2>
<p>待补充。</p>
<h2>前端</h2>
<p>待补充。</p>
<h2>后端</h2>
<p>待补充。</p>
<h2>测试</h2>
<p>待补充。</p>
<h2>运维</h2>
<p>待补充。</p>
<h2>AI</h2>
<p>待补充。</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">开篇 · 为什么写这个站</title>
    <id>https://studynotes-90w.pages.dev/posts/2026/%E5%BC%80%E7%AF%87-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E8%BF%99%E4%B8%AA%E7%AB%99.html</id>
    <link href="https://studynotes-90w.pages.dev/posts/2026/%E5%BC%80%E7%AF%87-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E8%BF%99%E4%B8%AA%E7%AB%99.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[<h2>为什么</h2>
<p>记录比记忆靠谱。脑子会忘，仓库不会。</p>
<h2>会写什么</h2>
<p>全栈、系统设计、云原生运维、AI 工程。不搬运那 191 篇旧笔记，这里是新的内容线。</p>
<h2>怎么更新</h2>
<p>本地写 Markdown → <code>git push</code> → Cloudflare 自动构建。不需要登录任何后台。</p>
]]></summary>
    <content type="html"><![CDATA[<h2>为什么</h2>
<p>记录比记忆靠谱。脑子会忘，仓库不会。</p>
<h2>会写什么</h2>
<p>全栈、系统设计、云原生运维、AI 工程。不搬运那 191 篇旧笔记，这里是新的内容线。</p>
<h2>怎么更新</h2>
<p>本地写 Markdown → <code>git push</code> → Cloudflare 自动构建。不需要登录任何后台。</p>
]]></content>
    <category term="杂谈"/>
    <published>2026-01-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">某篇技术复盘</title>
    <id>https://studynotes-90w.pages.dev/posts/2026/%E6%9F%90%E7%AF%87%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98.html</id>
    <link href="https://studynotes-90w.pages.dev/posts/2026/%E6%9F%90%E7%AF%87%E6%8A%80%E6%9C%AF%E5%A4%8D%E7%9B%98.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[<h2>背景</h2>
<p>一次请求链路的梳理。从客户端到数据库，每一步都值得记一笔。</p>
<h2>架构</h2>
<h2>结论</h2>
<p>网关做鉴权与限流，服务无状态，缓存挡读。细节以后慢慢补。</p>
]]></summary>
    <content type="html"><![CDATA[<h2>背景</h2>
<p>一次请求链路的梳理。从客户端到数据库，每一步都值得记一笔。</p>
<h2>架构</h2>
<h2>结论</h2>
<p>网关做鉴权与限流，服务无状态，缓存挡读。细节以后慢慢补。</p>
]]></content>
    <category term="技术复盘"/>
    <published>2026-01-02T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">计算机基础</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" target="_blank">数据结构</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" target="_blank">计算机组成原理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" target="_blank">操作系统</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/" target="_blank">计算机网络</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" target="_blank">数据结构</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/" target="_blank">计算机组成原理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" target="_blank">操作系统</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/" target="_blank">计算机网络</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">产品</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/" target="_blank">产品认知</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/" target="_blank">用户 与 需求</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/" target="_blank">文档 与 交付</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/" target="_blank">指标 与 数据</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/" target="_blank">规划 与 迭代</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/" target="_blank">B端产品</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/" target="_blank">AI产品</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/" target="_blank">上线 与 运营</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/" target="_blank">产品认知</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/" target="_blank">用户 与 需求</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/" target="_blank">文档 与 交付</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/" target="_blank">指标 与 数据</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/" target="_blank">规划 与 迭代</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/" target="_blank">B端产品</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/" target="_blank">AI产品</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/" target="_blank">上线 与 运营</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">UI</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/" target="_blank">设计基础</a></li>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/" target="_blank">交互 与 信息架构</a></li>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/" target="_blank">设计系统</a></li>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/" target="_blank">Figma工程化</a></li>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/" target="_blank">可用性 与 无障碍</a></li>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/" target="_blank">多端 与 适配</a></li>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/" target="_blank">动效 与 资产</a></li>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/" target="_blank">协作 与 度量</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/" target="_blank">设计基础</a></li>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/" target="_blank">交互 与 信息架构</a></li>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/" target="_blank">设计系统</a></li>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/" target="_blank">Figma工程化</a></li>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/" target="_blank">可用性 与 无障碍</a></li>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/" target="_blank">多端 与 适配</a></li>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/" target="_blank">动效 与 资产</a></li>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/" target="_blank">协作 与 度量</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">前端</title>
    <id>https://studynotes-90w.pages.dev/notes/04-%E5%89%8D%E7%AB%AF/</id>
    <link href="https://studynotes-90w.pages.dev/notes/04-%E5%89%8D%E7%AB%AF/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/" target="_blank">HTML与CSS</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/02-JavaScript%E4%B8%8ETypeScript/" target="_blank">JavaScript与TypeScript</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/03-React/" target="_blank">React</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/04-Vue/" target="_blank">Vue</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/05-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/" target="_blank">前端工程化</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/06-%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E4%B8%8EUI/" target="_blank">数据请求 与 UI</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/07-%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8E%E7%BD%91%E7%BB%9C/" target="_blank">浏览器 与 网络</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/08-%E5%AE%89%E5%85%A8%E4%B8%8E%E6%80%A7%E8%83%BD/" target="_blank">安全 与 性能</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/09-%E5%B7%A5%E7%A8%8B%E4%BF%9D%E9%9A%9C/" target="_blank">工程保障</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/10-%E5%AD%98%E9%87%8F%E6%8A%80%E6%9C%AF/" target="_blank">存量技术</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/" target="_blank">HTML与CSS</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/02-JavaScript%E4%B8%8ETypeScript/" target="_blank">JavaScript与TypeScript</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/03-React/" target="_blank">React</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/04-Vue/" target="_blank">Vue</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/05-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/" target="_blank">前端工程化</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/06-%E6%95%B0%E6%8D%AE%E8%AF%B7%E6%B1%82%E4%B8%8EUI/" target="_blank">数据请求 与 UI</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/07-%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%8E%E7%BD%91%E7%BB%9C/" target="_blank">浏览器 与 网络</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/08-%E5%AE%89%E5%85%A8%E4%B8%8E%E6%80%A7%E8%83%BD/" target="_blank">安全 与 性能</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/09-%E5%B7%A5%E7%A8%8B%E4%BF%9D%E9%9A%9C/" target="_blank">工程保障</a></li>
<li><a href="/notes/04-%E5%89%8D%E7%AB%AF/10-%E5%AD%98%E9%87%8F%E6%8A%80%E6%9C%AF/" target="_blank">存量技术</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">架构</title>
    <id>https://studynotes-90w.pages.dev/notes/03-%E6%9E%B6%E6%9E%84/</id>
    <link href="https://studynotes-90w.pages.dev/notes/03-%E6%9E%B6%E6%9E%84/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/01-%E6%9E%B6%E6%9E%84%E5%9F%BA%E7%A1%80/" target="_blank">架构基础</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/02-%E9%A2%86%E5%9F%9F%E4%B8%8E%E8%BE%B9%E7%95%8C/" target="_blank">领域 与 边界</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/03-%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%8E%E4%B8%80%E8%87%B4%E6%80%A7/" target="_blank">分布式 与 一致性</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/04-%E5%AE%B9%E9%87%8F%E4%B8%8E%E9%AB%98%E5%8F%AF%E7%94%A8/" target="_blank">容量 与 高可用</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/05-%E4%BC%81%E4%B8%9A%E7%B3%BB%E7%BB%9F%E4%B8%8E%E9%9B%86%E6%88%90/" target="_blank">企业系统 与 集成</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/06-%E6%BC%94%E8%BF%9B%E4%B8%8E%E6%B2%BB%E7%90%86/" target="_blank">演进 与 治理</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/07-%E5%85%B8%E5%9E%8B%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/" target="_blank">典型系统设计</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/01-%E6%9E%B6%E6%9E%84%E5%9F%BA%E7%A1%80/" target="_blank">架构基础</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/02-%E9%A2%86%E5%9F%9F%E4%B8%8E%E8%BE%B9%E7%95%8C/" target="_blank">领域 与 边界</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/03-%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%8E%E4%B8%80%E8%87%B4%E6%80%A7/" target="_blank">分布式 与 一致性</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/04-%E5%AE%B9%E9%87%8F%E4%B8%8E%E9%AB%98%E5%8F%AF%E7%94%A8/" target="_blank">容量 与 高可用</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/05-%E4%BC%81%E4%B8%9A%E7%B3%BB%E7%BB%9F%E4%B8%8E%E9%9B%86%E6%88%90/" target="_blank">企业系统 与 集成</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/06-%E6%BC%94%E8%BF%9B%E4%B8%8E%E6%B2%BB%E7%90%86/" target="_blank">演进 与 治理</a></li>
<li><a href="/notes/03-%E6%9E%B6%E6%9E%84/07-%E5%85%B8%E5%9E%8B%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/" target="_blank">典型系统设计</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">后端</title>
    <id>https://studynotes-90w.pages.dev/notes/05-%E5%90%8E%E7%AB%AF/</id>
    <link href="https://studynotes-90w.pages.dev/notes/05-%E5%90%8E%E7%AB%AF/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/01-Java/" target="_blank">Java</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/02-Python/" target="_blank">Python</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/03-Web%E4%B8%8EAPI/" target="_blank">Web与API</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/04-%E6%95%B0%E6%8D%AE%E5%BA%93/" target="_blank">数据库</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/05-%E4%B8%AD%E9%97%B4%E4%BB%B6/" target="_blank">中间件</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/06-%E8%AE%A4%E8%AF%81%E4%B8%8E%E4%BB%BB%E5%8A%A1/" target="_blank">认证 与 任务</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/07-%E6%96%87%E4%BB%B6%E4%B8%8E%E5%AE%89%E5%85%A8/" target="_blank">文件 与 安全</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/08-%E8%B4%A8%E9%87%8F%E4%B8%8E%E8%A7%82%E6%B5%8B/" target="_blank">质量 与 观测</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/09-%E5%AD%98%E9%87%8F%E6%8A%80%E6%9C%AF/" target="_blank">存量技术</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/01-Java/" target="_blank">Java</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/02-Python/" target="_blank">Python</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/03-Web%E4%B8%8EAPI/" target="_blank">Web与API</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/04-%E6%95%B0%E6%8D%AE%E5%BA%93/" target="_blank">数据库</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/05-%E4%B8%AD%E9%97%B4%E4%BB%B6/" target="_blank">中间件</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/06-%E8%AE%A4%E8%AF%81%E4%B8%8E%E4%BB%BB%E5%8A%A1/" target="_blank">认证 与 任务</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/07-%E6%96%87%E4%BB%B6%E4%B8%8E%E5%AE%89%E5%85%A8/" target="_blank">文件 与 安全</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/08-%E8%B4%A8%E9%87%8F%E4%B8%8E%E8%A7%82%E6%B5%8B/" target="_blank">质量 与 观测</a></li>
<li><a href="/notes/05-%E5%90%8E%E7%AB%AF/09-%E5%AD%98%E9%87%8F%E6%8A%80%E6%9C%AF/" target="_blank">存量技术</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">测试</title>
    <id>https://studynotes-90w.pages.dev/notes/06-%E6%B5%8B%E8%AF%95/</id>
    <link href="https://studynotes-90w.pages.dev/notes/06-%E6%B5%8B%E8%AF%95/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/01-%E6%B5%8B%E8%AF%95%E7%90%86%E8%AE%BA/" target="_blank">测试理论</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/02-%E5%8D%95%E5%85%83%E4%B8%8E%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95/" target="_blank">单元 与 集成测试</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/03-%E6%8E%A5%E5%8F%A3%E4%B8%8EE2E%E6%B5%8B%E8%AF%95/" target="_blank">接口 与 E2E测试</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/04-%E4%B8%93%E9%A1%B9%E6%B5%8B%E8%AF%95/" target="_blank">专项测试</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/05-%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C/" target="_blank">质量保障</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/01-%E6%B5%8B%E8%AF%95%E7%90%86%E8%AE%BA/" target="_blank">测试理论</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/02-%E5%8D%95%E5%85%83%E4%B8%8E%E9%9B%86%E6%88%90%E6%B5%8B%E8%AF%95/" target="_blank">单元 与 集成测试</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/03-%E6%8E%A5%E5%8F%A3%E4%B8%8EE2E%E6%B5%8B%E8%AF%95/" target="_blank">接口 与 E2E测试</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/04-%E4%B8%93%E9%A1%B9%E6%B5%8B%E8%AF%95/" target="_blank">专项测试</a></li>
<li><a href="/notes/06-%E6%B5%8B%E8%AF%95/05-%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C/" target="_blank">质量保障</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">运维</title>
    <id>https://studynotes-90w.pages.dev/notes/07-%E8%BF%90%E7%BB%B4/</id>
    <link href="https://studynotes-90w.pages.dev/notes/07-%E8%BF%90%E7%BB%B4/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/01-Linux%E7%B3%BB%E7%BB%9F/" target="_blank">Linux系统</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/02-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/" target="_blank">版本管理</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/03-%E5%AE%B9%E5%99%A8%E4%B8%8E%E7%BC%96%E6%8E%92/" target="_blank">容器 与 编排</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/04-%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E4%BB%98/" target="_blank">自动化交付</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/05-%E7%9B%91%E6%8E%A7%E4%B8%8E%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/" target="_blank">监控 与 可观测性</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/06-%E4%BA%91%E5%B9%B3%E5%8F%B0/" target="_blank">云平台</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/01-Linux%E7%B3%BB%E7%BB%9F/" target="_blank">Linux系统</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/02-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86/" target="_blank">版本管理</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/03-%E5%AE%B9%E5%99%A8%E4%B8%8E%E7%BC%96%E6%8E%92/" target="_blank">容器 与 编排</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/04-%E8%87%AA%E5%8A%A8%E5%8C%96%E4%BA%A4%E4%BB%98/" target="_blank">自动化交付</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/05-%E7%9B%91%E6%8E%A7%E4%B8%8E%E5%8F%AF%E8%A7%82%E6%B5%8B%E6%80%A7/" target="_blank">监控 与 可观测性</a></li>
<li><a href="/notes/07-%E8%BF%90%E7%BB%B4/06-%E4%BA%91%E5%B9%B3%E5%8F%B0/" target="_blank">云平台</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">AI</title>
    <id>https://studynotes-90w.pages.dev/notes/08-AI/</id>
    <link href="https://studynotes-90w.pages.dev/notes/08-AI/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/08-AI/01-Python%E4%B8%8EAI%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/" target="_blank">Python与AI数据处理</a></li>
<li><a href="/notes/08-AI/02-%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A5%E5%85%A5/" target="_blank">大模型接入</a></li>
<li><a href="/notes/08-AI/03-Prompt%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B/" target="_blank">Prompt 与 上下文工程</a></li>
<li><a href="/notes/08-AI/04-%E7%BB%93%E6%9E%84%E5%8C%96%E8%BE%93%E5%87%BA%E4%B8%8E%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8/" target="_blank">结构化输出 与 工具调用</a></li>
<li><a href="/notes/08-AI/05-Embedding%E4%B8%8E%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2/" target="_blank">Embedding 与 向量检索</a></li>
<li><a href="/notes/08-AI/06-RAG/" target="_blank">RAG</a></li>
<li><a href="/notes/08-AI/07-Agent%E4%B8%8E%E5%B7%A5%E4%BD%9C%E6%B5%81/" target="_blank">Agent 与 工作流</a></li>
<li><a href="/notes/08-AI/08-%E6%A8%A1%E5%9E%8B%E5%AE%9A%E5%88%B6%E4%B8%8E%E9%83%A8%E7%BD%B2/" target="_blank">模型定制 与 部署</a></li>
<li><a href="/notes/08-AI/09-AI%E5%BA%94%E7%94%A8%E5%B7%A5%E7%A8%8B/" target="_blank">AI应用工程</a></li>
<li><a href="/notes/08-AI/10-AI%E8%B4%A8%E9%87%8F%E4%B8%8E%E5%AE%89%E5%85%A8/" target="_blank">AI质量 与 安全</a></li>
<li><a href="/notes/08-AI/11-%E5%A4%9A%E6%A8%A1%E6%80%81%E4%B8%8E%E7%94%9F%E6%80%81/" target="_blank">多模态 与 生态</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>子目录</h2>
<ul>
<li><a href="/notes/08-AI/01-Python%E4%B8%8EAI%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86/" target="_blank">Python与AI数据处理</a></li>
<li><a href="/notes/08-AI/02-%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A5%E5%85%A5/" target="_blank">大模型接入</a></li>
<li><a href="/notes/08-AI/03-Prompt%E4%B8%8E%E4%B8%8A%E4%B8%8B%E6%96%87%E5%B7%A5%E7%A8%8B/" target="_blank">Prompt 与 上下文工程</a></li>
<li><a href="/notes/08-AI/04-%E7%BB%93%E6%9E%84%E5%8C%96%E8%BE%93%E5%87%BA%E4%B8%8E%E5%B7%A5%E5%85%B7%E8%B0%83%E7%94%A8/" target="_blank">结构化输出 与 工具调用</a></li>
<li><a href="/notes/08-AI/05-Embedding%E4%B8%8E%E5%90%91%E9%87%8F%E6%A3%80%E7%B4%A2/" target="_blank">Embedding 与 向量检索</a></li>
<li><a href="/notes/08-AI/06-RAG/" target="_blank">RAG</a></li>
<li><a href="/notes/08-AI/07-Agent%E4%B8%8E%E5%B7%A5%E4%BD%9C%E6%B5%81/" target="_blank">Agent 与 工作流</a></li>
<li><a href="/notes/08-AI/08-%E6%A8%A1%E5%9E%8B%E5%AE%9A%E5%88%B6%E4%B8%8E%E9%83%A8%E7%BD%B2/" target="_blank">模型定制 与 部署</a></li>
<li><a href="/notes/08-AI/09-AI%E5%BA%94%E7%94%A8%E5%B7%A5%E7%A8%8B/" target="_blank">AI应用工程</a></li>
<li><a href="/notes/08-AI/10-AI%E8%B4%A8%E9%87%8F%E4%B8%8E%E5%AE%89%E5%85%A8/" target="_blank">AI质量 与 安全</a></li>
<li><a href="/notes/08-AI/11-%E5%A4%9A%E6%A8%A1%E6%80%81%E4%B8%8E%E7%94%9F%E6%80%81/" target="_blank">多模态 与 生态</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">绪论</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/01-%E7%BB%AA%E8%AE%BA.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/01-%E7%BB%AA%E8%AE%BA.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>数据结构基本概念</h2>
<h3>一、数据结构</h3>
<p>数据结构（Data Structure）是 <strong>存储、组织和管理数据的方式</strong>，它不仅决定了数据的存储形式，也影响数据访问和操作的效率。</p>
<h4>1.1 分类 </h4>
<p></p>
<p>考试中涉及的数据结构可以分为以下几种：</p>
<ol>
<li>
<p>线性结构</p>
<p>（元素之间有顺序关系）</p>
<ul>
<li><strong>数组（Array）</strong>：连续内存，随机访问快，插入删除慢</li>
<li><strong>链表（Linked List）</strong>：节点通过指针连接，插入删除快，访问慢</li>
<li><strong>栈（Stack）</strong>：后进先出（LIFO），用于函数调用、表达式求值</li>
<li><strong>队列（Queue）</strong>：先进先出（FIFO），用于任务调度</li>
<li><strong>双端队列（Deque）</strong>：两端都可以操作</li>
</ul>
</li>
<li>
<p>树形结构</p>
<p>（元素之间有层级关系）</p>
<ul>
<li><strong>二叉树（Binary Tree）</strong></li>
<li><strong>二叉搜索树（BST）</strong></li>
<li><strong>堆（Heap）</strong>：优先队列实现</li>
<li><strong>平衡树（AVL、红黑树）</strong></li>
</ul>
</li>
<li>
<p>图结构</p>
<p>（元素之间有网络关系）</p>
<ul>
<li>有向图 / 无向图</li>
<li>邻接矩阵 / 邻接表存储</li>
<li>常用于路径搜索、社交网络建模</li>
</ul>
</li>
<li>
<p>散列表（Hash Table）</p>
<ul>
<li>通过哈希函数实现快速查找</li>
<li>常用于字典、缓存</li>
</ul>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<h2>数据结构基本概念</h2>
<h3>一、数据结构</h3>
<p>数据结构（Data Structure）是 <strong>存储、组织和管理数据的方式</strong>，它不仅决定了数据的存储形式，也影响数据访问和操作的效率。</p>
<h4>1.1 分类 </h4>
<p></p>
<p>考试中涉及的数据结构可以分为以下几种：</p>
<ol>
<li>
<p>线性结构</p>
<p>（元素之间有顺序关系）</p>
<ul>
<li><strong>数组（Array）</strong>：连续内存，随机访问快，插入删除慢</li>
<li><strong>链表（Linked List）</strong>：节点通过指针连接，插入删除快，访问慢</li>
<li><strong>栈（Stack）</strong>：后进先出（LIFO），用于函数调用、表达式求值</li>
<li><strong>队列（Queue）</strong>：先进先出（FIFO），用于任务调度</li>
<li><strong>双端队列（Deque）</strong>：两端都可以操作</li>
</ul>
</li>
<li>
<p>树形结构</p>
<p>（元素之间有层级关系）</p>
<ul>
<li><strong>二叉树（Binary Tree）</strong></li>
<li><strong>二叉搜索树（BST）</strong></li>
<li><strong>堆（Heap）</strong>：优先队列实现</li>
<li><strong>平衡树（AVL、红黑树）</strong></li>
</ul>
</li>
<li>
<p>图结构</p>
<p>（元素之间有网络关系）</p>
<ul>
<li>有向图 / 无向图</li>
<li>邻接矩阵 / 邻接表存储</li>
<li>常用于路径搜索、社交网络建模</li>
</ul>
</li>
<li>
<p>散列表（Hash Table）</p>
<ul>
<li>通过哈希函数实现快速查找</li>
<li>常用于字典、缓存</li>
</ul>
</li>
</ol>
<h3>二、算法</h3>
<p>算法（Algorithm）是 <strong>解决问题的一系列步骤或方法</strong>，用来操作数据结构，实现具体功能。</p>
<p><strong>数据结构和算法的关系</strong></p>
<ul>
<li><strong>数据结构提供“容器”</strong></li>
<li><strong>算法提供“操作方法”</strong></li>
<li>好的数据结构可以让算法更高效</li>
<li>算法的设计也依赖数据结构特性</li>
</ul>
<blockquote>
<p>💡 举例：</p>
<ul>
<li>用数组实现栈 → 可以快速访问栈顶</li>
<li>用链表实现队列 → 插入删除都很快</li>
<li>用堆实现优先队列 → 可以快速找最大/最小值</li>
<li>用图 + BFS → 可以找最短路径</li>
</ul>
</blockquote>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">线性表</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/02-%E7%BA%BF%E6%80%A7%E8%A1%A8.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/02-%E7%BA%BF%E6%80%A7%E8%A1%A8.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>定义和基本操作</h2>
<h3>一、线性表定义</h3>
<p></p>
<p><strong>线性表</strong>（Linear List）是 <strong>L 数据结构</strong> 中的一种基本结构。它是 <strong>零个或多个数据元素的有限序列</strong>。通常，<strong>线性表</strong> 中的 <strong>数据元素</strong> 之间是 <strong>有序的</strong>，它们之间存在着 <strong>前驱和后继的关系</strong>。</p>
<p></p>
<p>特点：</p>
<ul>
<li><strong>个数有限</strong></li>
<li><strong>表中元素数据类型都相同</strong>，每个元素占有 <strong>相同大小的存储空间</strong></li>
<li>仅讨论 <strong>元素间的逻辑关系</strong>，表中元素有 <strong>先后顺序</strong></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>定义和基本操作</h2>
<h3>一、线性表定义</h3>
<p></p>
<p><strong>线性表</strong>（Linear List）是 <strong>L 数据结构</strong> 中的一种基本结构。它是 <strong>零个或多个数据元素的有限序列</strong>。通常，<strong>线性表</strong> 中的 <strong>数据元素</strong> 之间是 <strong>有序的</strong>，它们之间存在着 <strong>前驱和后继的关系</strong>。</p>
<p></p>
<p>特点：</p>
<ul>
<li><strong>个数有限</strong></li>
<li><strong>表中元素数据类型都相同</strong>，每个元素占有 <strong>相同大小的存储空间</strong></li>
<li>仅讨论 <strong>元素间的逻辑关系</strong>，表中元素有 <strong>先后顺序</strong></li>
</ul>
<h4>1.1 顺序表和链表</h4>
<p>线性表分为顺序存储结构（又称 <strong>顺序表</strong>）和链式存储结构（又称为 <strong>链表</strong>）。</p>
<p>顺序表中的元素存储地址是 <strong>连续的</strong>（存储在栈中），而链表的元素存储地址是 <strong>非连续的</strong>（存储在堆中），元素节点中除了存储数据元素之外还存储相邻元素的地址信息。顺序表中数据之间的 <strong>逻辑关系</strong> 和 <strong>物理关系</strong> 是一致的，链表中数据元素的逻辑关系和物理关系并不一定一致。</p>

<p>上图中左边为顺序表，右边为链表。顺序表在内存中的地址是连续的，各个元素的下标之间是有规律可循的，通过一个已知下标的元素可以找到顺序表中任意一个其它元素。但是链式表中的元素在内存中的地址是不连续的，所以链式表中的每个元素除了要保存数据信息外，还要保存下一个元素的内存地址，以便形成线性关系。</p>
<h3>二、操作</h3>
<p>线性表中的操作包含以下类型，顺序表 和 链表 会各自使用不同的方案实现这些操作：</p>
<p></p>
<ul>
<li><strong>初始化</strong> (<code>InitList</code>): 创建一个 <strong>空的线性表</strong>。</li>
<li><strong>插入</strong> (<code>Insert</code>): 在线性表的 <strong>指定位置</strong> 插入一个 <strong>新的元素</strong>。</li>
<li><strong>删除</strong> (<code>Delete</code>): 删除线性表中的 <strong>指定位置的元素</strong>。</li>
<li><strong>查找</strong> (<code>LocateElem</code>): 根据 <strong>给定的条件</strong> 查找线性表中的 <strong>元素</strong>。</li>
<li><strong>获取元素</strong> (<code>GetElem</code>): 获取线性表中 <strong>指定位置的元素</strong>。</li>
<li><strong>设置元素</strong> (<code>SetElem</code>): 修改线性表中 <strong>指定位置的元素</strong> 的 <strong>值</strong>。</li>
<li><strong>长度</strong> (<code>Length</code>): 返回线性表中的 <strong>元素数量</strong>。</li>
<li><strong>判空</strong> (<code>IsEmpty</code>): 判断线性表是否 <strong>为空</strong>。</li>
<li><strong>清空</strong> (<code>ClearList</code>): <strong>清除</strong>线性表中的 <strong>所有元素</strong>。</li>
<li><strong>遍历</strong> (<code>Traverse</code>): 对线性表中的 <strong>每个元素</strong> 执行 <strong>某种操作</strong>。</li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">栈、队列、数组</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/03-%E6%A0%88%E3%80%81%E9%98%9F%E5%88%97%E3%80%81%E6%95%B0%E7%BB%84.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/03-%E6%A0%88%E3%80%81%E9%98%9F%E5%88%97%E3%80%81%E6%95%B0%E7%BB%84.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>栈</h2>
<h3>一、定义</h3>
<p><strong>栈</strong> 是一个元素的集合，加入元素的操作叫做 <strong>“压栈”（push）</strong>，而移除元素的操作叫做 <strong>“出栈”（pop）</strong>。它遵循 <strong>后进先出（LIFO, Last In First Out）</strong> 的原则。<em>这意味着最后被压入栈的元素是第一个被弹出的元素</em>。</p>

<h3>二、基本操作</h3>
<ul>
<li><code>push(element)</code>: 将元素添加到 <strong>栈</strong> 的顶部。</li>
<li><code>pop()</code>: 移除并返回 <strong>栈顶</strong> 的元素。如果 <strong>栈</strong> 为空，这个操作可能会抛出一个错误或返回特定的值（例如 null 或 undefined），具体取决于实现。</li>
<li><code>peek()</code> 或 <code>top()</code>: 返回 <strong>栈顶</strong> 的元素但不移除它。这只是一个查看操作，<strong>栈</strong> 的内容不会改变。如果 <strong>栈</strong> 为空，这个操作可能会抛出一个错误或返回特定的值。</li>
<li><code>isEmpty()</code>: 判断 <strong>栈</strong> 是否为空。如果 <strong>栈</strong> 为空，返回 <strong>true</strong>；否则返回 <strong>false</strong>。</li>
<li><code>size()</code> 或 <code>length()</code>: 返回 <strong>栈</strong> 中元素的数量。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>栈</h2>
<h3>一、定义</h3>
<p><strong>栈</strong> 是一个元素的集合，加入元素的操作叫做 <strong>“压栈”（push）</strong>，而移除元素的操作叫做 <strong>“出栈”（pop）</strong>。它遵循 <strong>后进先出（LIFO, Last In First Out）</strong> 的原则。<em>这意味着最后被压入栈的元素是第一个被弹出的元素</em>。</p>

<h3>二、基本操作</h3>
<ul>
<li><code>push(element)</code>: 将元素添加到 <strong>栈</strong> 的顶部。</li>
<li><code>pop()</code>: 移除并返回 <strong>栈顶</strong> 的元素。如果 <strong>栈</strong> 为空，这个操作可能会抛出一个错误或返回特定的值（例如 null 或 undefined），具体取决于实现。</li>
<li><code>peek()</code> 或 <code>top()</code>: 返回 <strong>栈顶</strong> 的元素但不移除它。这只是一个查看操作，<strong>栈</strong> 的内容不会改变。如果 <strong>栈</strong> 为空，这个操作可能会抛出一个错误或返回特定的值。</li>
<li><code>isEmpty()</code>: 判断 <strong>栈</strong> 是否为空。如果 <strong>栈</strong> 为空，返回 <strong>true</strong>；否则返回 <strong>false</strong>。</li>
<li><code>size()</code> 或 <code>length()</code>: 返回 <strong>栈</strong> 中元素的数量。</li>
</ul>
<h3>三、实现</h3>
<p><strong>栈</strong> 的实现方式有两种，<strong>顺序栈</strong> 和 <strong>链式栈</strong>。
<strong>顺序栈</strong> 是在 <strong>顺序表</strong> 的基础上实现 <strong>栈结构</strong>，
<strong>链式栈</strong> 是在 <strong>链表</strong> 的基础上实现 <strong>栈结构</strong>。</p>
<h4>3.1 顺序栈</h4>
<p><strong>顺序栈</strong>是使用 <strong>数组</strong> 来实现的 <strong>栈</strong>，利用数组的索引来模拟 <strong>栈</strong> 的操作。
与普通的线性表不同，<strong>栈</strong> 的操作被限制在表的一端进行，这一端被称为 <strong>栈顶 (Top)</strong>，另一端被称为 <strong>栈底 (Bottom)</strong>。</p>

<p><strong>顺序栈</strong>的关键在于 <strong>栈顶指针</strong>，<strong>栈顶指针</strong>是一个整数变量，用于指示 <strong>栈顶</strong> 元素在 <strong>数组</strong> 中的位置。其值的变化直接反映了栈中元素的变化。</p>
<p>当 <strong>栈空</strong> 时，一般将 <strong>栈顶指针</strong>设置为 <strong>1</strong>，当 <strong>栈满</strong> 时，<strong>栈顶指针</strong>指向 <strong>数组</strong> 中的最后一个元素。</p>
<p>当元素 <strong>入栈</strong> 时，将栈顶指针 <strong>向后</strong> 移动一个位置、然后放置新元素即可。当元素 <strong>出栈</strong> 时，需要将栈顶指针 <strong>向前</strong> 移动一个位置。</p>
<p>当然，入栈需要保证栈不满，出栈需要保证栈不空。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1.栈的定义</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> MAX_SIZE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 定义栈的最大容量</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 定义顺序栈的结构</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[MAX_SIZE];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 使用数组存储数据</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> top;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            // 栈顶指针</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} SeqStack;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 2.初始化</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 初始化栈</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> initStack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> stack </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(SeqStack));</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">stack) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Failed to allocate memory for stack</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        exit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 栈顶指针初始化为 -1，表示栈为空</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">top</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> stack;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 3.入栈</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 入栈操作</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> push</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">isFull</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(stack)) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Stack is full!</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 先移动栈顶指针，再存放元素</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">top</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 4.出栈</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 出栈操作</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> pop</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">isEmpty</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(stack)) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Stack is empty!</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 先取出元素，再移动栈顶指针</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">top</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">--</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">];</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 5.获取栈顶元素</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 获取栈顶元素</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> peek</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">isEmpty</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(stack)) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Stack is empty!</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">top</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">];</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 6.判断栈空</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 判断栈是否为空</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 当栈中没有元素时，栈顶指针通常指向一个特殊的位置，例如 -1。</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> isEmpty</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">top</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> ==</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 判断栈是否已满</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 当栈顶指针指向数组中的最后一个元素时，说明栈已经满了</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> isFull</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">SeqStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">top</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> ==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> MAX_SIZE </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>3.2 链式栈</h4>
<p>栈的 <strong>链式存储结构</strong> 利用 <strong><a href="https://www.csgraduates.com/data_structure/linearlist/linked/#%E5%8D%95%E9%93%BE%E8%A1%A8%E5%AE%9A%E4%B9%89" target="_blank" rel="noopener noreferrer">单链表</a></strong> 来实现栈的功能。</p>
<p></p>
<p>在 <strong>链式栈</strong> 实现中，一般 <strong>头结点不存放数据</strong>，仅作为链表的固定起点。栈顶元素始终为 <code>head-&gt;next</code>。这样依然可以保证 入栈 和 出栈 的时间复杂度为 <em>O</em>(1) 。</p>
<p>链式栈具备以下 <strong>重要特性</strong>：</p>
<ul>
<li><code>head</code> 始终存在，不存储实际数据，只作为哨兵节点。</li>
<li><strong>栈顶元素</strong> 始终位于 <code>head-&gt;next</code>。</li>
<li><strong>空栈</strong> 时，<code>head-&gt;next == NULL</code>。</li>
<li>入栈时在 <code>head-&gt;next</code> 前插入新节点；出栈时删除 <code>head-&gt;next</code>。</li>
</ul>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1.栈的定义</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 定义链式栈的节点结构</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> data;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> next;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} Node;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 定义链式栈（带头结点）</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> head;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 指向头结点</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} LinkedStack;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 2.初始化</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 初始化栈（带头结点）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> initStack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">() {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> stack </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(LinkedStack));</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">stack) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Failed to allocate memory for stack</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        exit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(Node));</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 创建头结点</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Failed to allocate memory for head node</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        exit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 初始为空栈</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> stack;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 3.入栈</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 入栈操作（头插法）</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> push</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> newNode </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(Node));</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#56B6C2">!</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">newNode) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Failed to allocate memory for new node</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        exit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    newNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    newNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> newNode;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 4.出栈</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 出栈操作</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> pop</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">isEmpty</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(stack)) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Stack is empty!</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> topNode </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> topNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> topNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    free</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(topNode);</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 5.获取栈顶元素</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 获取栈顶元素</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> peek</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">isEmpty</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(stack)) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Stack is empty!</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">value </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 6.判断栈空</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 判断栈是否为空</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">bool</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> isEmpty</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">LinkedStack</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> stack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> ==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">字符串</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/04-%E5%AD%97%E7%AC%A6%E4%B8%B2.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/04-%E5%AD%97%E7%AC%A6%E4%B8%B2.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>定义与实现</h2>
<h3>一、串的定义</h3>
<p>字符串是计算机科学中的一个基本概念，通常被定义为 <strong>有限序列</strong> 中 <strong>字符</strong> 的有序集合。</p>
<p><strong>形式定义：</strong></p>
<p></p>
<h3>二、串的存储结构</h3>
<h4>2.1 定长顺序存储表示</h4>
<p>在 <strong>定长顺序存储表示</strong> 中，每个字符串都有固定的长度，通常用一个预定义的最大大小来表示。这种表示方法使用一个一维数组，数组的大小等于预定的最大长度。</p>
<p>在某些语境中（例如 C 语言），使用特殊字符（如 <code>'\0'</code>）来标识字符串结束。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>定义与实现</h2>
<h3>一、串的定义</h3>
<p>字符串是计算机科学中的一个基本概念，通常被定义为 <strong>有限序列</strong> 中 <strong>字符</strong> 的有序集合。</p>
<p><strong>形式定义：</strong></p>
<p></p>
<h3>二、串的存储结构</h3>
<h4>2.1 定长顺序存储表示</h4>
<p>在 <strong>定长顺序存储表示</strong> 中，每个字符串都有固定的长度，通常用一个预定义的最大大小来表示。这种表示方法使用一个一维数组，数组的大小等于预定的最大长度。</p>
<p>在某些语境中（例如 C 语言），使用特殊字符（如 <code>'\0'</code>）来标识字符串结束。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> MAX_SIZE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 预定义的最大大小</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    char</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[MAX_SIZE];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 字符数组</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> length;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           // 当前字符串的长度</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} FixedString;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>2.2 堆分配存储表示</h4>
<p>在 <strong>堆分配存储表示</strong> 中，每个字符串具有其自己的 <strong>长度</strong>，因此可以动态地分配存储空间。字符串在堆中分配空间，只需要那么多的空间来存储实际的字符以及结束字符或 <strong>长度</strong> 信息。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    char</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">data;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           // 指向动态分配空间的指针</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> length;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">           // 字符串的长度</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} HeapString;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 创建一个新的字符串</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> initHeapString</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">HeapString </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> const</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> char</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> *</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">length</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> strlen</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(str);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">char</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">((</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">length</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> +</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">char</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">));</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> ==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        exit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 分配失败</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    strcpy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, str);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 释放字符串</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> freeHeapString</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">HeapString </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    free</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">length</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>2.3 块链存储表示</h4>
<p><strong>块链存储表示</strong> 是结合了 <strong>链表</strong> 与 <strong>块</strong> 存储的思想。串分为较小的 <strong>块</strong>，每个块存储一部分 <strong>字符</strong>。块之间使用 <strong>指针</strong> 链接。这样，整个字符串就变成了一个字符块的链表。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> BLOCK_SIZE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 4</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 为了简单起见，设块大小为 4</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> StringBlock {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    char</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[BLOCK_SIZE];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">   // 块中的字符数据</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> StringBlock </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">next;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 指向下一个块的指针</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} StringBlock;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    StringBlock </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">head;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      // 指向第一个块的指针</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> length;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">             // 字符串的总长度</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} BlockString;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 初始化块链字符串</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> initBlockString</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">BlockString </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    s</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">length</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 为了简化，这里只展示了数据结构定义和初始化函数。实际应用中还需要考虑其他函数，如插入、删除、销毁等。</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>三、串的基本操作</h3>
<ul>
<li>赋值（ Assign ）：
<ul>
<li>将一个串的内容复制到另一个串。</li>
</ul>
</li>
<li>比较（ Compare ）：
<ul>
<li>根据字符的字典顺序比较两个串。可以判断两个串是否相等，或者一个串是否小于或大于另一个串。</li>
</ul>
</li>
<li>长度（ Length ）：
<ul>
<li>返回串的 <strong>长度</strong>，即串中字符的数目。</li>
</ul>
</li>
<li>连接（ Concat ）：
<ul>
<li>将两个串连接成一个新的串。例如，将串&quot;Hello&quot;和串&quot;World&quot;连接为&quot;HelloWorld&quot;。</li>
</ul>
</li>
<li>子串提取（ Substr ）：
<ul>
<li>从串中提取某个指定位置开始的指定 <strong>长度</strong> 的字符序列作为一个新的串。例如，从串&quot;HelloWorld&quot;中提取从位置 1 开始的 5 个字符，得到&quot;Hello&quot;。</li>
</ul>
</li>
<li>插入（ Insert ）：
<ul>
<li>在串的指定位置插入另一个串。例如，在串&quot;HelloWorld&quot;的第 6 个位置插入串&quot;Beautiful&quot;, 得到&quot;HelloBeautifulWorld&quot;。</li>
</ul>
</li>
<li>删除（ Delete）：
<ul>
<li>从串中删除从指定位置开始的指定 <strong>长度</strong> 的字符。</li>
</ul>
</li>
<li>替换（ Subsititude ）：
<ul>
<li>将串中某个子串的所有出现替换为另一个子串。例如，将串&quot;apple, banana, apple&quot;中的&quot;apple&quot;替换为&quot;orange&quot;，得到&quot;orange, banana, orange&quot;。</li>
</ul>
</li>
<li>模式匹配（ Index）：
<ul>
<li>在串中查找另一个子串的位置。这通常使用算法如 KMP、BM 或 Sunday 来加速查找。</li>
</ul>
</li>
<li>清空（ Clear ）：
<ul>
<li>释放串的存储空间并将其设置为 <strong>空字符串</strong>。</li>
</ul>
</li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">树与二叉树</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/05-%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/05-%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>树</h2>
<h3>一、树的基本概念</h3>
<h4>1.1 结点属性</h4>
<ul>
<li><strong>双亲</strong> （parent）：如果一个结点包含子结点，则该结点被称为其子结点的双亲。</li>
<li><strong>兄弟</strong> （sibling）：具有相同双亲结点的结点互称为兄弟结点。</li>
<li><strong>孩子</strong> （child）：一个结点直接连接到另一个结点，并且位于较低的层级，则该结点被称为子结点或孩子。</li>
</ul>
<h4>1.2 度</h4>

<ul>
<li><strong>结点的度</strong>：结点的孩子数量</li>
<li><strong>树的度</strong>：等于树中所有结点度的最大值</li>
<li><strong>分支结点</strong>（非终端结点）：度大于 0 的结点</li>
<li><strong>叶子结点</strong>（终端结点）：度等于 0 的结点</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>树</h2>
<h3>一、树的基本概念</h3>
<h4>1.1 结点属性</h4>
<ul>
<li><strong>双亲</strong> （parent）：如果一个结点包含子结点，则该结点被称为其子结点的双亲。</li>
<li><strong>兄弟</strong> （sibling）：具有相同双亲结点的结点互称为兄弟结点。</li>
<li><strong>孩子</strong> （child）：一个结点直接连接到另一个结点，并且位于较低的层级，则该结点被称为子结点或孩子。</li>
</ul>
<h4>1.2 度</h4>

<ul>
<li><strong>结点的度</strong>：结点的孩子数量</li>
<li><strong>树的度</strong>：等于树中所有结点度的最大值</li>
<li><strong>分支结点</strong>（非终端结点）：度大于 0 的结点</li>
<li><strong>叶子结点</strong>（终端结点）：度等于 0 的结点</li>
</ul>
<h4>1.3 深度</h4>

<ul>
<li><strong>树的深度</strong>（Depth）：从根结点到最远叶子结点的 <strong>结点总数</strong>。</li>
<li><strong>结点的深度</strong>：是指从根结点到该结点的结点总数。</li>
</ul>

<h4>1.4 高度</h4>

<ul>
<li><strong>树的高度</strong>（Height）：从根结点到最远叶子结点的 <strong>结点总数</strong>。</li>
<li><strong>结点的高度</strong>：从该结点到其最远叶子结点的 结点总数。</li>
</ul>
<p></p>
<h4>1.5 路径</h4>
<p></p>
<ul>
<li><strong>路径</strong>：在一棵树中，从一个结点到另一个结点所经过的所有结点，被称为这两个结点之间的路径。</li>
<li><strong>结点的权</strong>：每个结点被赋予的一个数值，通常表示该结点的重要性或频率。</li>
<li><strong>结点的带权路径长度</strong>：从根结点到该结点的路径长度与该结点权值的乘积。</li>
<li><strong>树的带权路径长度</strong>：所有叶子结点的带权路径长度之和。</li>
</ul>
<h3>二、树的存储结构</h3>
<p>树的 <strong>存储结构</strong> 是指在计算机中如何表示和存储树这种数据结构，这里主要了解 <strong>双亲表示法</strong>、<strong>孩子表示法</strong> 和 <strong>孩子兄弟表示法</strong> 即可。</p>
<h4>2.1 双亲表示法</h4>
<p><strong>双亲表示法</strong> 主要是使用一个数组，其中每个结点都有一个指示其双亲结点在数组中位置的索引。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> MAXSIZE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> data;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">         // 结点数据</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> parent;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">       // 双亲的位置</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} PTNode;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    PTNode </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">nodes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[MAXSIZE];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 结点数组</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                  // 结点数</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} PTree;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p></p>
<h4>2.2 孩子表示法</h4>
<p><strong>孩子表示法</strong> 将每个结点的孩子结点排列起来，以单链表作为存储结构。然后再用一个数组与之相配合。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> MAXSIZE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 孩子结点</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ChildNode {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> child;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                   // 孩子结点在数组中的位置</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> ChildNode</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> next;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     // 下一个孩子</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">ChildPtr;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 表头结构</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> data;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                   // 结点数据</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    ChildPtr firstchild;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        // 第一个孩子的指针</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} CTBox;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    CTBox </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">nodes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[MAXSIZE];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">       // 结点数组</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                      // 结点数</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} CTree;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p></p>
<h4>2.3 孩子兄弟表示法</h4>
<p><strong>孩子兄弟表示法</strong> 是将树转化为 <strong>二叉树</strong> 的形式来存储。每个结点有两个指针，一个指向它的第一个孩子，另一个指向它的右兄弟。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> CSNode {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> data;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                     // 结点数据</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> CSNode</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> firstchild;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">   // 第一个孩子</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> CSNode</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> rightsib;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     // 右兄弟</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} CSNode, </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">CSTree;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
<h3>三、森林的基本概念</h3>
<p><strong>森林</strong>（Forest）是一组互不相交的树的集合。换句话说，森林由若干棵树组成，每棵树都是一个独立的层次结构，且这些树之间没有连接关系。</p>

<ul>
<li>森林与树的区别：
<ul>
<li>一棵树只有一个 <strong>根结点</strong>，而森林可以有多个 <strong>根结点</strong>（每棵树一个）。</li>
<li>森林可以看作是多个树的并集，树是森林的一个特例（森林中只有一棵树）。</li>
</ul>
</li>
<li><strong>森林的深度</strong>：森林中所有树的最大 <strong>高度</strong>（从根到最远叶结点的路径长度）。</li>
</ul>
<h3>四、树、森林和二叉树的转换</h3>
<h4>4.1 树转化为二叉树</h4>
<ul>
<li>若树的根结点有孩子，那么第一个孩子是 <strong>二叉树</strong> 的左孩子，其他的孩子结点依次作为前一个孩子结点的右孩子。</li>
<li>对每个孩子执行上述步骤。</li>
</ul>

<h4>4.2 森林转二叉树</h4>
<ul>
<li>把森林中的每一棵树转换为 <strong>二叉树</strong>。</li>
<li>第一棵二叉树不动，从第二棵二叉树开始，依次将后一棵二叉树的根作为前一棵二叉树的右孩子。其结果是一个 <strong>二叉树</strong>。</li>
</ul>

<h3>五、树和森林的遍历</h3>
<h4>5.1 树的遍历</h4>
<p>对于一个给定的树，通常有以下两种遍历方式：</p>
<ol>
<li>
<p>先根遍历</p>
<p>（类似于二叉树的前序遍历）：</p>
<ul>
<li>访问树的根结点。</li>
<li>递归地 <strong>先根遍历</strong> 根的每一棵子树。</li>
</ul>
</li>
<li>
<p>后根遍历</p>
<p>（类似于二叉树的后序遍历）：</p>
<ul>
<li>递归地 <strong>后根遍历</strong> 根的每一棵子树。</li>
<li>访问树的根结点。</li>
</ul>
</li>
</ol>
<p>注意树是没有 <strong>中根遍历</strong> 的，除非这棵树是二叉树。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1.树结点的定义</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> MAXCHILD</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 20</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">typedef</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> TreeNode {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> numChildren;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 子结点的数量</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> TreeNode </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">children</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[MAXCHILD];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 子结点指针数组</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">} TreeNode;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 2.先根遍历</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> preOrderTraversal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">TreeNode</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (root </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">%d</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 先访问根结点</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 然后遍历子结点</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">numChildren</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        preOrderTraversal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">children</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[i]);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 3.后根遍历</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> postOrderTraversal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">TreeNode</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (root </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 先遍历子结点</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">numChildren</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i) {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">        postOrderTraversal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">children</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[i]);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    printf</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">%d</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 再访问根结点</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>对于 <a href="https://www.csgraduates.com/data_structure/tree/tree/#%E6%A0%91%E8%BD%AC%E5%8C%96%E4%B8%BA%E4%BA%8C%E5%8F%89%E6%A0%91" target="_blank" rel="noopener noreferrer">上图</a> 所示的树：其 <strong>先根遍历</strong> 为 <code>A, B, E, F, C, D, G</code>，<strong>后根遍历</strong> 为<code>E, F, B, C, G, D, A</code>。</p>
<p>观察可以得到如下结论：</p>
<ul>
<li>树的 <strong>先根遍历</strong> 和其对应的二叉树的 <strong>先序遍历</strong> 相同</li>
<li>树的 <strong>后根遍历</strong> 和其对应的二叉树的 <strong>中序遍历</strong> 相同</li>
</ul>
<h4>5.2 森林的遍历</h4>
<p>对于一个给定的森林，遍历方式如下：</p>
<ol>
<li><strong>先根遍历</strong>（与树的先根遍历相似）：依次 <strong>先根遍历</strong> 森林中的每一棵树。</li>
<li><strong>后根遍历</strong>（与树的后根遍历相似）：依次 <strong>后根遍历</strong> 森林中的每一棵树。</li>
<li><strong>中根遍历</strong>（普通的树构成的森林是不存在中序遍历的，这里的中序遍历指代的是二叉树森林）：依次 <strong>中根遍历</strong> 森林中的每一棵二叉树。</li>
</ol>
<p>对于<a href="https://www.csgraduates.com/data_structure/tree/tree/#%E6%A3%AE%E6%9E%97%E8%BD%AC%E4%BA%8C%E5%8F%89%E6%A0%91" target="_blank" rel="noopener noreferrer">上图</a> 所示的森林：其<strong>先根遍历</strong> 为 <code>A, B, C, D, E, F, G, H, I</code>，<strong>后根遍历</strong> 为 <code>B, C, D, A, F, E, H, I, G</code>，<strong>中根遍历</strong> 为 <code>B, C, D, A, F, E, H, I, G</code></p>
<p>观察可以得到如下结论：</p>
<ul>
<li>森林的 <strong>先根遍历</strong> 和其对应的二叉树的 <strong>先序遍历</strong> 相同</li>
<li>森林的 <strong>中根遍历</strong> 和其对应的二叉树的 <strong>中序遍历</strong> 相同</li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">图</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/06-%E5%9B%BE.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/06-%E5%9B%BE.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>定义</h2>
<h3>一、图的概念</h3>
<p><strong>图</strong> 是由 <strong>顶点</strong> 和 <strong>边</strong> 组成的非线性数据结构。<strong>顶点</strong> 有时也被称为节点，而 <strong>边</strong> 是连接图中任意两个节点的线或弧。更正式地说，<strong>图</strong> 是由一组 <strong>顶点</strong> (<em>V</em>) 和一组 <strong>边</strong> (<em>E</em>) 组成的。图用 <em>G</em>(<em>E</em>,<em>V</em>) 表示。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>定义</h2>
<h3>一、图的概念</h3>
<p><strong>图</strong> 是由 <strong>顶点</strong> 和 <strong>边</strong> 组成的非线性数据结构。<strong>顶点</strong> 有时也被称为节点，而 <strong>边</strong> 是连接图中任意两个节点的线或弧。更正式地说，<strong>图</strong> 是由一组 <strong>顶点</strong> (<em>V</em>) 和一组 <strong>边</strong> (<em>E</em>) 组成的。图用 <em>G</em>(<em>E</em>,<em>V</em>) 表示。</p>

<p>在 <strong>图论</strong> 中，根据边的方向性、连接方式、顶点间的关系等，可以进一步划分出多种类型的图，并引入如 <strong>连通性</strong>、<strong>完全性</strong>、<strong>度数</strong> 等一系列关键概念。这些分类和术语有助于我们更好地理解 图的结构特点和应用场景，下面我们将逐一进行介绍。</p>
<h4>1.1 方向</h4>

<ul>
<li><strong>有向图</strong>（directed graph）：边是有方向的，从一个定点指向另一个定点</li>
<li><strong>无向图</strong>（undirected graph）：边是没有方向的</li>
</ul>
<h4>1.2 连通性</h4>

<ul>
<li><strong>连通图</strong>（Connected Graph）：图中的每一对不同顶点都可以通过一条或多条边相互连接，也就是说，从图中的任意一个顶点出发，都可以到达图中的任意其他顶点。</li>
<li><strong>非连通图</strong>（Disconnected Graph）：图中存在两个或多个互不相连的子图，也就是说，其中至少存在一个顶点集合，无法通过边连接到图中的其他顶点集合。</li>
<li><strong>完全图</strong>（Complete Graph）：完全图是一种特殊的图，其中每一对不同的顶点都直接相连，也就是说，完全图中的任意两个顶点之间都存在一条边。如果一个完全图有 <em>n</em> 个顶点，那么它将有 <em>C</em>(<em>n</em>,2)=<em>n</em>(<em>n</em>−1)/2 条边，其中 <em>C</em>(<em>n</em>,2) 表示从 n 个顶点中选择 2 个顶点的组合数。</li>
</ul>

<ul>
<li><strong>连通分量</strong>（Connected Components）：也称为连通子图，是一个无向图中的一个重要概念。一个连通分量是指在无向图中，如果从其中一个顶点出发，可以通过边的路径到达该连通分量内的任何其他顶点，而无法通过图中的边到达其他连通分量内的顶点。</li>
</ul>
<h4>1.3 度</h4>
<ul>
<li>顶点的度（Degree）：顶点的度是指与该顶点相邻的边的数量，也就是与该顶点直接相连的其他顶点的个数。对于有向图和无向图都适用。
<ul>
<li>在无向 <strong>图</strong> 中，<strong>顶点</strong> 的度就是与该 <strong>顶点</strong> 相邻的 <strong>边</strong> 的数量。</li>
<li>在有向 <strong>图</strong> 中，<strong>顶点</strong> 的度分为 <strong>入度</strong> 和 <strong>出度</strong>，分别表示指向该 <strong>顶点</strong> 的 <strong>边</strong> 的数量和从该 <strong>顶点</strong> 出发的 <strong>边</strong> 的数量的总和。</li>
</ul>
</li>
<li><strong>入度</strong>（In-Degree）：入度是指在有向图中指向某个顶点的边的数量，也就是与该顶点关联的边中以该顶点为终点的边的数量。</li>
<li><strong>出度</strong>（Out-Degree）：出度是指在有向图中从某个顶点出发的边的数量，也就是与该顶点关联的边中以该顶点为起点的边的数量。</li>
</ul>
<h4>1.4 路径</h4>

<ul>
<li><strong>简单路径</strong>：顶点不出现重复的路径</li>
<li><strong>非简单路径</strong>：顶点出现重复的路径</li>
<li><strong>回路</strong>：路径的起点和终点相同</li>
</ul>
<h3>二、图的存储</h3>
<p>在我们使用数据结构存储 <strong>图</strong> 时，主要关注两点：1. 如何存储 <strong>顶点</strong>？2. 如何存储 <strong>边</strong>？
采用的数据结构需要能够准备表示这些信息。</p>
<h4>2.1 领接矩阵</h4>
<p>图的 <strong>邻接矩阵</strong>（Adjacency Matrix）是一种常用的图表示方法，特别适用于 <strong>稠密图</strong>，它以矩阵的形式表示图的连接关系。</p>
<p>在邻接矩阵中，行和列分别代表 <strong>图的顶点</strong>，矩阵的元素表示顶点之间是否相邻或者 <strong>边的权重</strong>。</p>


<ol>
<li>对于无向图：
<ul>
<li>如果顶点 <em>i</em> 和顶点 <em>j</em> 之间存在边，则邻接矩阵中 (<em>i</em>,<em>j</em>) 和 (<em>j</em>,<em>i</em>) 位置的元素都被标记为 1 （或者表示 边 的权重）。</li>
<li>如果顶点 <em>i</em> 和顶点 <em>j</em> 之间不存在边，则邻接矩阵中 (<em>i</em>,<em>j</em>) 和 (<em>j</em>,<em>i</em>) 位置的元素都被标记为 0 。</li>
</ul>
</li>
<li>对于有向图：
<ul>
<li>如果有一条从顶点 <em>i</em> 到顶点 <em>j</em> 的有向边，则邻接矩阵中 (<em>i</em>,<em>j</em>) 位置的元素被标记为 1 （或者表示 边 的权重）。</li>
<li>如果没有从顶点 <em>i</em> 到顶点 <em>j</em> 的有向边，则邻接矩阵中 (<em>i</em>,<em>j</em>) 位置的元素被标记为 0 。</li>
</ul>
</li>
</ol>
<p>在邻接矩阵的实现中，我们使用一个 <strong>二维数组</strong> 来表示图的连接关系，邻接矩阵<code>matrix</code> 的行数和列数与图中的顶点数量相同。
其中 <code>matrix[i][j]</code> 表示顶点<code>i</code> 到顶点<code>j</code> 是否有边（或边的权值）。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1.领接矩阵定义</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">#define</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> MAX_VERTICES</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> adjMatrix</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[MAX_VERTICES][MAX_VERTICES];</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 邻接矩阵</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 初始化邻接矩阵</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> initializeMatrix</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> vertices</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> vertices; i</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> vertices; j</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            adjMatrix</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[i][j] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 初始化所有元素为 0</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 2.添加边</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 在邻接矩阵中添加一条边</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> addEdge</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> start</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> end</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    adjMatrix</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[start][end] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 添加边，将对应位置的元素设为 1</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    adjMatrix</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[end][start] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> // 无向图需要将对称位置的元素也设为 1</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
<p>如果需要计算 <strong>邻接矩阵</strong> 中某个 <strong>顶点</strong> 的 <strong>出度</strong> 的话，假设 <strong>顶点</strong> 编号为 i，我们统计 <strong>邻接矩阵</strong> 中的 <strong>第 i 行</strong> 有多少元素不为 0 即可（该顶点指向哪些顶点）。</p>
<p>如果需要计算 <strong>邻接矩阵</strong> 中某个 <strong>顶点</strong> 的 <strong>入度</strong> 的话，假设 <strong>顶点</strong> 编号为 i，我们统计 <strong>邻接矩阵</strong> 中的 <strong>第 i 列</strong> 有多少元素不为 0 即可（哪些顶点指向该顶点）。</p>
<h4>2.2 邻接表</h4>
<p>图的 <strong>邻接表</strong>（Adjacency List）是一种常见的图表示方法，特别适用于 <strong>稀疏图</strong>，它使用链表或数组的形式来表示图的连接关系。每个顶点都对应一个链表，链表中存储与该顶点相邻的其他顶点。</p>
<p>邻接表的主要思想是为 <strong>每个顶点创建一个链表</strong>，链表中的每个节点表示与该顶点相邻的另一个顶点。对于无向图，通常需要为每一条边创建两个链表节点，分别表示两个相邻的顶点。</p>

<p>在邻接表的实现中，我们为每个顶点维护一个链表，用于存储与该顶点相邻的所有顶点；所有顶点对应的 <strong>链表头节点</strong> 组成一个数组或列表（在以下实现为 <code>struct AdjList *array</code>），形成整个图的邻接表结构。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1.数据结构</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 链表节点结构：表示邻接的一个顶点</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> dest;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            // 邻接顶点的编号</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> next;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">   // 指向下一个邻接点</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 邻接表：每个顶点有一个链表</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> AdjList {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> head;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">   // 链表头</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 图结构</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Graph {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> V;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">                      // 顶点数</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> AdjList</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> array;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      // 邻接表数组</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 2.创建新节点</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> newNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> dest</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> node </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node));</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    node</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">dest</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> dest;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    node</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> node;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 3.创建图</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Graph</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> createGraph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> V</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Graph</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> graph </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Graph</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Graph));</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">V</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> V;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // 创建邻接表数组</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">array</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> AdjList</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">malloc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(V </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> sizeof</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> AdjList));</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> V; </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i)</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">        graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[i].</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> NULL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> graph;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 4.添加边</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> addEdge</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">struct</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> Graph</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> src</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> dest</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // src -> dest</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n1 </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> newNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(dest);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    n1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[src].</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[src].</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n1;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">    // dest -> src（因为是无向图）</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    struct</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n2 </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> newNode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(src);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    n2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">next</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B"> graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[dest].</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">    graph</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">-></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">array</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[dest].</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n2;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>2.3 邻接多重表</h4>
<p><strong>邻接多重表</strong>（Adjacency Multi-list）是一种用于表示 <strong>无向图</strong> 的数据结构，主要用于避免在 <strong>邻接表</strong> 存储方式中重复存储 <strong>无向边</strong>，提高存储效率，同时便于图的操作（如 <strong>边</strong> 的删除）。</p>

<p>邻接多重表中顶点种类 <strong>分为两种</strong>：</p>
<ul>
<li>顶点结点（Vertex Node）：
<ul>
<li>每个顶点有一个头结点，存储该顶点的信息，以及指向其所有关联边的指针。</li>
</ul>
</li>
<li>边结点（Edge Node）：
<ul>
<li>每条边有一个结点，存储该边的两个顶点及其相关信息。</li>
<li>该结点包含两个指针，分别指向该边所连接的两个顶点的邻接边链表的下一条边，使得图的存储更加紧凑。</li>
</ul>
</li>
</ul>

<p>还是举个实际例子说明，在上述的邻接多重表中，总共需要存储 5 条边，每条边只需要存储一次，所以总共有 5 个边结点，每个边结点中存储的数据如下表所示：</p>
<p>| 边   | <code>ivex</code> | <code>jvex</code> | <code>ilink</code> 指向 | <code>jlink</code> 指向 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">查找</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/07-%E6%9F%A5%E6%89%BE.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/07-%E6%9F%A5%E6%89%BE.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>数组查找</h2>
<h3>一、顺序查找</h3>
<p>顺序查找的 <strong>核心思想</strong> 是从数组（线性表）的第一个元素开始，逐个检查每个元素是否等于目标值，直到找到目标或检查完整个数组。</p>
<p>其代码实现如下，非常简单，遍历一次数组即可：</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> SequentialSearch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> A</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">[]</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> n</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n; i</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[i] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 找到，返回索引</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 未找到</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<h2>数组查找</h2>
<h3>一、顺序查找</h3>
<p>顺序查找的 <strong>核心思想</strong> 是从数组（线性表）的第一个元素开始，逐个检查每个元素是否等于目标值，直到找到目标或检查完整个数组。</p>
<p>其代码实现如下，非常简单，遍历一次数组即可：</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> SequentialSearch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> A</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">[]</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> n</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n; i</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">++</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[i] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 找到，返回索引</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 未找到</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>顺序查找的 <strong>时间复杂度</strong> 如下：</p>
<ul>
<li><strong>最好情况</strong>： <em>O</em>(1)</li>
<li><strong>最坏情况</strong>： <em>O</em>(<em>n</em>)</li>
<li><strong>平均情况</strong>： <em>O</em>(<em>n</em>)</li>
</ul>
<h3>二、折半查找</h3>
<p>折半查找 <strong>要求数组是有序的</strong>。</p>
<p>其 <strong>核心思想</strong> 在于每次将查找范围折半，只保留目标可能存在的一半，直到范围为空或找到目标为止。</p>
<p>例如，在有序数组中查找一个元素时，可以先比较中间元素：</p>
<ul>
<li>如果目标值小于中间值，查左半部分；</li>
<li>如果目标值大于中间值，查右半部分；</li>
<li>如果相等，则查找成功。</li>
</ul>
<p>下图给出了一个实例，从数组中折半查找元素 23：</p>
<p></p>
<p>折半查找可以基于 <strong>迭代实现</strong>，也可以作为一个 <strong>递归函数实现</strong>：</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 1.迭代版本</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> BinarySearch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> A</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">[]</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> n</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> low </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> high </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (low </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> high) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> low </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (high </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> low) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">/</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 防止溢出</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[mid] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 找到</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[mid] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value) {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            low </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            high </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 未找到</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 2.递归版本</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> BinarySearchRecursive</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> A</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">[]</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> low</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> high</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> int</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (low </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> high) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 区间无效，查找失败</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> low </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (high </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> low) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">/</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[mid] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid;</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 找到目标</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[mid] </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> value) {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> BinarySearchRecursive</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(A, mid </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, high, value);</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  // 查右半部分</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> BinarySearchRecursive</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(A, low, mid </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, value);</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">   // 查左半部分</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>折半查找的 <strong>时间复杂度</strong> 如下：</p>
<ul>
<li><strong>最好情况</strong>： <em>O</em>(1)</li>
<li><strong>最坏情况</strong>： <em>O</em>(<em>l<strong>o</strong>g</em>2<em>n</em>)</li>
<li><strong>平均情况</strong>： <em>O</em>(<em>l<strong>o</strong>g</em>2<em>n</em>)</li>
</ul>
<h4>2.1 折半查找判定树</h4>
<p>折半查找判定树（Binary Search Decision Tree）是折半查找（Binary Search）过程的树形表示，用于清晰地 <strong>描述在查找过程中所做的每一次比较决策</strong>。</p>
<p>所以简单地来说，如何根据一个有序序列得到一个折半查找判定树呢，就是将折半查找的过程走一遍，举两个实际的例子来说明一下：</p>
<p>假设数组为 <code>[10, 20, 30, 40, 50, 60]</code>，元素个数为 6。</p>
<p>🌳 <strong>折半查找判定树构造原则</strong></p>
<p>折半查找需要选一个“中点”作为根节点。偶数长度数组有两个中点，一般可以：</p>
<ul>
<li>选靠左的那个（常见做法）：<code>mid = (low + high) // 2</code></li>
<li>或者选靠右的那个</li>
</ul>
<p>假设按 <strong>常规左中点</strong> 来构造，则 <strong>构造过程如下</strong>：</p>
<ol>
<li><code>[10, 20, 30, 40, 50, 60]</code>，<code>mid = 2</code> → 30 为根；</li>
<li>左边 <code>[10, 20]</code>，<code>mid = 0</code> → 10 为左子树；
<ul>
<li>右边是 <code>[20]</code> → 作为 10 的右子节点；</li>
</ul>
</li>
<li>右边 <code>[40, 50, 60]</code>，<code>mid = 4</code> → 50 为右子树；
<ul>
<li>左边 <code>[40]</code> → 左子节点；</li>
<li>右边 <code>[60]</code> → 右子节点。</li>
</ul>
</li>
</ol>
<p>最后可以得到如下折半查找判定树：</p>

<h3>三、分块查找</h3>
<p>线性表的 <strong>分块查找</strong> 通常应用于一种特定的情境：线性表（例如数组）被分为多个大小相等（或者最后一个块可能较小）的块，并且块内的元素是无序的，但是块与块之间是有序的。也就是说，每个块内的最大（或最小）元素小于下一个块的任意元素。</p>
<p>常用的 <strong>分块查找策略</strong> 如下：</p>
<ol>
<li>先对块索引进行顺序或二分查找以确定所需元素可能所在的块。</li>
<li>然后在确定的块中进行顺序查找。</li>
</ol>
<p></p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">排序</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/08-%E6%8E%92%E5%BA%8F.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/08-%E6%8E%92%E5%BA%8F.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>内部排序</h2>
<h3>一、排序概念</h3>
<h4>1.1 稳定性</h4>
<p>排序算法的 <strong>稳定性</strong> 是指：在排序过程中，<strong>如果两个元素的键值相等</strong>，排序后它们的 <strong>相对顺序保持不变</strong>，那么这个排序算法就是 <strong>稳定的排序算法</strong>。</p>
<p>比如排序前的数组是这样：<code>[... A ... B ...]</code>，并且 <code>A</code> 和 <code>B</code> 的值相同。</p>
<p>如果排序后的数组是这样：<code>[... B A ...]</code>，那么排序算法就是不稳定的，反之排序算法就是 <strong>稳定的</strong>。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>内部排序</h2>
<h3>一、排序概念</h3>
<h4>1.1 稳定性</h4>
<p>排序算法的 <strong>稳定性</strong> 是指：在排序过程中，<strong>如果两个元素的键值相等</strong>，排序后它们的 <strong>相对顺序保持不变</strong>，那么这个排序算法就是 <strong>稳定的排序算法</strong>。</p>
<p>比如排序前的数组是这样：<code>[... A ... B ...]</code>，并且 <code>A</code> 和 <code>B</code> 的值相同。</p>
<p>如果排序后的数组是这样：<code>[... B A ...]</code>，那么排序算法就是不稳定的，反之排序算法就是 <strong>稳定的</strong>。</p>

<h4>1.2 元素移动次数</h4>
<p>排序算法中的 <strong>元素移动次数</strong>，指的是在排序过程中对 <strong>数组元素进行位置变换的次数</strong>。</p>
<p>下表列出了各排序算法的 <strong>元素移动次数</strong>：</p>
<p>| 排序算法 | 元素移动次数                         | 说明                                                    |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">数据结构</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/01-%E7%BB%AA%E8%AE%BA.html" target="_blank">绪论</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/02-%E7%BA%BF%E6%80%A7%E8%A1%A8.html" target="_blank">线性表</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/03-%E6%A0%88%E3%80%81%E9%98%9F%E5%88%97%E3%80%81%E6%95%B0%E7%BB%84.html" target="_blank">栈、队列、数组</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/04-%E5%AD%97%E7%AC%A6%E4%B8%B2.html" target="_blank">字符串</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/05-%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91.html" target="_blank">树与二叉树</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/06-%E5%9B%BE.html" target="_blank">图</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/07-%E6%9F%A5%E6%89%BE.html" target="_blank">查找</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/08-%E6%8E%92%E5%BA%8F.html" target="_blank">排序</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/01-%E7%BB%AA%E8%AE%BA.html" target="_blank">绪论</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/02-%E7%BA%BF%E6%80%A7%E8%A1%A8.html" target="_blank">线性表</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/03-%E6%A0%88%E3%80%81%E9%98%9F%E5%88%97%E3%80%81%E6%95%B0%E7%BB%84.html" target="_blank">栈、队列、数组</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/04-%E5%AD%97%E7%AC%A6%E4%B8%B2.html" target="_blank">字符串</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/05-%E6%A0%91%E4%B8%8E%E4%BA%8C%E5%8F%89%E6%A0%91.html" target="_blank">树与二叉树</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/06-%E5%9B%BE.html" target="_blank">图</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/07-%E6%9F%A5%E6%89%BE.html" target="_blank">查找</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/01-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/08-%E6%8E%92%E5%BA%8F.html" target="_blank">排序</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">概述</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/01-%E6%A6%82%E8%BF%B0.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/01-%E6%A6%82%E8%BF%B0.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>计算机系统层次结构</h2>
<h3>一、计算机系统的基本组成</h3>
<p><strong>硬件</strong> 系统和 <strong>软件</strong> 系统共同构成了一个完整的计算机系统。硬件指的是有形的物理设备，是计算机系统中实际物理装置的总称。软件指的是在硬件上运行的程序和相关的数据及文档。</p>
<p><strong>硬件</strong> 和 <strong>软件</strong> 关系：硬件是计算机的物理部分，它提供了运行软件所需的基础设施，而软件则是 <strong>指令集</strong>，<strong>指导</strong> 硬件如何工作以执行特定的任务。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>计算机系统层次结构</h2>
<h3>一、计算机系统的基本组成</h3>
<p><strong>硬件</strong> 系统和 <strong>软件</strong> 系统共同构成了一个完整的计算机系统。硬件指的是有形的物理设备，是计算机系统中实际物理装置的总称。软件指的是在硬件上运行的程序和相关的数据及文档。</p>
<p><strong>硬件</strong> 和 <strong>软件</strong> 关系：硬件是计算机的物理部分，它提供了运行软件所需的基础设施，而软件则是 <strong>指令集</strong>，<strong>指导</strong> 硬件如何工作以执行特定的任务。</p>
<h3>二、计算机硬件</h3>
<h4>2.1 冯诺伊曼结构</h4>
<p>冯·诺依曼提出的 <strong>“存储程序”</strong> 的思想奠定了当代计算机的基本结构，以此概念为基础的各类计算机通称为 <strong>冯·诺依曼机</strong>，其特点如下：</p>
<ol>
<li>计算机 <strong>硬件</strong> 系统由 <strong>运算器</strong>、<strong>存储器</strong>、<strong>控制器</strong>、<strong>输入设备</strong> 和 <strong>输出设备</strong> <em><strong>5 大部件</strong></em> 组成。</li>
<li><strong>指令和数据</strong> 以同等地位存储在 <strong>存储器</strong> 中，形式上没有区别，但计算机应能区分它们。</li>
<li>指令和数据均用 <strong>二进制代码</strong> 表示，指令包含操作码和地址码，操作码指出操作的类型，地址码指出操作数的地址。</li>
<li>以 <strong>运算器</strong> 为中心，其他部件配合其工作。</li>
</ol>

<p>其中 五大部件 的具体功能如下：</p>
<ol>
<li><strong>运算器</strong>（ALU）：负责算术运算（加减乘除）和逻辑运算（与或非）。</li>
<li><strong>控制器</strong>（CU）：从 <strong>存储器</strong> 中读取指令，解码并控制其他部件协同工作。</li>
<li><strong>存储器</strong>（Memory）：存储程序指令和运算数据（如内存、硬盘）。</li>
<li><strong>输入设备</strong>（Input）：接收外部数据（如键盘、鼠标）。</li>
<li><strong>输出设备</strong>（Output）：将结果反馈给用户（如显示器、打印机）。</li>
</ol>
<h3>三、计算机软件</h3>
<h4>3.1 系统软件和应用软件</h4>
<ol>
<li>系统软件 (System Software)
<ul>
<li>定义：<strong>系统软件</strong> 是直接运行在 <strong>硬件</strong> 上的 <strong>软件</strong>，为其他 <strong>软件</strong> 提供一个运行和执行的平台。</li>
<li>功能：
<ul>
<li>管理和控制计算机 <strong>硬件</strong>，使其能够与 <strong>应用软件</strong> 进行交互。</li>
<li>提供 <strong>应用软件</strong> 开发的基础服务和接口。</li>
</ul>
</li>
</ul>
</li>
<li>应用软件（Application Software）
<ul>
<li>定义：<strong>应用软件</strong> 是构建在 <strong>系统软件</strong> 之上，为用户提供特定功能或执行特定任务的 <strong>软件</strong>。</li>
<li>功能：
<ul>
<li>解决用户的具体问题或满足特定需求。</li>
<li>提供与用户的直接交互界面。</li>
</ul>
</li>
</ul>
</li>
</ol>
<h4>3.2 三个级别的语言</h4>
<ol>
<li>机器语言 (Machine Language):
<ul>
<li>定义：这是 <strong>计算机硬件</strong> 直接理解和执行的语言，它是用 <strong>二进制代码</strong> 表示的（通常是 0 和 1）。</li>
<li>特点：
<ul>
<li>与特定计算机架构紧密相关。</li>
<li>非常低级：每条机器代码对应 <strong>硬件</strong> 的一个操作。</li>
<li>对于人类来说，阅读和编写是困难的。</li>
</ul>
</li>
</ul>
</li>
<li>汇编语言 (Assembly Language):
<ul>
<li>定义：这是一种低级编程语言，它使用符号和助记符（而非 <strong>二进制代码</strong>）来代表机器语言的指令。</li>
<li>特点：
<ul>
<li>与特定计算机架构紧密相关。</li>
<li>比机器语言更容易理解和编写。</li>
<li>需要一个汇编器来将汇编代码转换为机器代码。</li>
</ul>
</li>
</ul>
</li>
<li>高级语言 (High-Level Language):
<ul>
<li>定义：这是为了更方便地编写和理解计算机程序而设计的语言。它们与特定的 <strong>硬件平台</strong> 相对独立。</li>
<li>特点：
<ul>
<li>抽象度高，语法通常更接近自然语言或数学符号。</li>
<li>可以在不同的 <strong>硬件平台</strong> 上运行，只需适当地 <strong>编译</strong> 或 <strong>解释</strong>。</li>
<li>需要一个 <strong>编译器</strong> 或 <strong>解释器</strong> 来将高级语言代码转换为机器代码（或执行）。</li>
</ul>
</li>
</ul>
</li>
</ol>
<p>三种语言的关系可以参照下图理解：</p>

<h3>四、计算机系统的工作原理</h3>
<h4>4.1 从源程序到可执行程序</h4>
<ol>
<li><strong>预处理</strong>（Preprocessing）：<strong>预处理</strong> 器会执行诸如宏替换、文件包含、条件编译等任务，仅限于某些语言，比如 <code>C</code> 和 <code>C++</code>。</li>
<li><strong>编译</strong>（Compilation）：<strong>编译</strong> 器将源代码或 <strong>预处理</strong> 后的源代码转换为中间代码或目标代码，目标代码通常是特定平台的汇编语言代码或机器代码。</li>
<li><strong>汇编</strong>（Assembly）：<strong>汇编</strong> 器将汇编语言代码转换为机器代码。</li>
<li><strong>链接</strong>（Linking）：<strong>链接</strong> 器将一个或多个目标文件与所需的库文件链接在一起，生成一个可执行文件。这个步骤确保所有函数或方法的调用都能找到它们在内存中的正确位置。</li>
<li><strong>加载和执行</strong>（Execution）：当你运行可执行文件时，操作系统的 <strong>加载器</strong> 会将它加载到内存中。CPU 开始按照程序的指令执行任务。</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 预处理</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">gcc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -E</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello.c</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello.i</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 编译</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">gcc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello.c</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello.o</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 汇编</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">gcc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -S</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello.c</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 链接</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">gcc</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello.o</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hello</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 加载和执行</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./hello</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">数据表示和计算</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/02-%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA%E5%92%8C%E8%AE%A1%E7%AE%97.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/02-%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA%E5%92%8C%E8%AE%A1%E7%AE%97.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>整数的表示</h2>
<h3>一、BCD码</h3>
<p><strong>BCD</strong>（Binary-Coded Decimal）码是一种 <strong>二进制编码方法</strong>，用于表示 <strong>十进制数字</strong>。每个十进制数字（0-9）都使用 <strong>四位二进制数字</strong> 表示。</p>
<p>BCD 码的基本思路是 <strong>单独表示每个十进制数字的二进制值</strong>，而不是像传统的二进制数系统那样对整个数字进行编码。例如，在传统的二进制编码中，数字&quot;19&quot;会表示为 10011，但在 BCD 中，它被表示为两个独立的数字：“0001”（对应于 1）和“1001”（对应于 9），因此整个表示为“0001 1001”。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>整数的表示</h2>
<h3>一、BCD码</h3>
<p><strong>BCD</strong>（Binary-Coded Decimal）码是一种 <strong>二进制编码方法</strong>，用于表示 <strong>十进制数字</strong>。每个十进制数字（0-9）都使用 <strong>四位二进制数字</strong> 表示。</p>
<p>BCD 码的基本思路是 <strong>单独表示每个十进制数字的二进制值</strong>，而不是像传统的二进制数系统那样对整个数字进行编码。例如，在传统的二进制编码中，数字&quot;19&quot;会表示为 10011，但在 BCD 中，它被表示为两个独立的数字：“0001”（对应于 1）和“1001”（对应于 9），因此整个表示为“0001 1001”。</p>
<div class="language-c line-numbers-mode" data-highlighter="shiki" data-ext="c" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-c"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">000</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    1</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">001</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    2</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">010</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">011</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    4</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    5</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">101</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">6</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">110</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    7</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75"> 0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">111</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    8</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1000</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">9</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1001</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>BCD 编码在某些应用中是很有用的，特别是在需要与 <strong>十进制界面</strong> 进行交互的地方，如 <strong>数字显示</strong> 或某些早期的计算机系统。尽管它不如 <strong>纯二进制编码</strong> 效率高，但它简化了与十进制数据的转换过程。</p>
<h3>二、整数的表示</h3>
<p>在介绍整数的不同表示之前，我们首先要定义清楚不同的名词，否则会造成极大的概念混淆。</p>

<p>在日常生活中，我们使用十进制表示数字，并通过符号（如 + 和 -）表示正负。这种用十进制表达的数字也叫做 <strong>字面值</strong>。</p>
<p>而计算机以二进制形式存储数据，<strong>补码、原码、无符号数</strong> 等只是 <strong>对二进制位的一种解释方式</strong>，它们决定了同一组二进制位所代表的实际数值。</p>
<p>在实际的计算机中，没有采用 <a href="https://www.csgraduates.com/constitution_principle/representation/integer/#%E5%8E%9F%E7%A0%81" target="_blank" rel="noopener noreferrer">原码</a> 存储数据的，具体原因后面会谈到到。对于计算机中存储的数字来说，它的二进制只可能是 <strong>有符号数</strong>（signed） 或者 <strong>无符号数</strong>（unsigned） 这两种情况。</p>
<h4>2.1 无符号数</h4>
<p></p>



<p>总结两种转换方式如下图：</p>

<h4>2.2 有符号数</h4>

<p></p>


<p>例子：</p>
<ul>
<li><code>10000001</code> 对应的值为 −128+1=−127</li>
<li><code>10001001</code> 对应的值为 −128+8+1=−119</li>
<li><code>01000001</code> 对应的值为 64+1=65</li>
</ul>
<p>以 8 位二进制数为例：</p>
<ol>
<li>对于正数，例如 +5，其二进制表示为 00000101，<strong>补码</strong> 也是 00000101。</li>
<li>对于负数，例如 -5，首先写出 5 的二进制表示：00000101。
<ul>
<li>按位取反得到：11111010</li>
<li>加 1 得到：11111011</li>
<li>所以，-5 的 <strong>补码</strong> 是 11111011。</li>
</ul>
</li>
</ol>


<h5>优点</h5>
<p>使用 <strong>补码</strong> 可以使得 <strong>加法、减法和负数的表示</strong> 变得简单和统一。比如给定两个数字 A 和 B，我们想要计算 C = A + B。A + B 由硬件加法器得到的二进制结果可以直接作为 C 的二进制表示。</p>
<p><strong>补码</strong> 的设计使得负数的加法变得简单。当使用 <strong>补码</strong> 表示时，可以直接将两个数相加，即使其中一个数是负数，而不需要进行任何特殊处理。这简化了计算机硬件的设计。</p>
<h4>2.3 原码</h4>
<p><strong>原码（Sign-Magnitude）</strong> 是一种简单的方式来表示二进制中的 <strong>有符号整数</strong>。在这种表示法中，数字的 <strong>最高位</strong>（最左边的位）用于表示符号，其余的位表示数字的大小。通常，符号位为 0 表示正数，而 1 表示负数。</p>
<p>原码的表示方法：</p>
<ol>
<li>正数的原码：<strong>最高位</strong> 为 0，其余位表示这个数的绝对值的二进制形式。</li>
<li>负数的原码：<strong>最高位</strong> 为 1，其余位表示这个数的绝对值的二进制形式。</li>
<li>零的原码：符号位可以是 0（表示 +0）或 1（表示 -0），但在实际应用中，通常只使用一个零，即符号位为 0。</li>
</ol>

<p>举例（以 8 位二进制数为例）：</p>
<ul>
<li>+25 的原码是：<code>0 0011001</code></li>
<li>-25 的原码是：<code>1 0011001</code></li>
</ul>
<h5>缺点</h5>
<ul>
<li>存在 <strong>正零</strong> 和 <strong>负零</strong> 的表示。</li>
<li>在进行算术运算时，正数和负数需要不同的处理，这使得硬件设计变得复杂。</li>
</ul>
<p>由于上述的缺点，<strong>原码</strong> 并不是计算机中最常用的表示法。在现代计算机中，<strong>补码</strong> 是更常用的方式来表示 <strong>有符号整数</strong>，因为它简化了算术运算的处理，并且没有 <strong>+0</strong> 和 <strong>-0</strong> 的冗余表示。</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">存储系统</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/03-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/03-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>存储系统概念</h2>
<h3>一、存储系统的层次结构</h3>
<p>存储系统是计算机体系结构的核心组成部分之一，用于存储程序指令和数据，以支持处理器的运算需求。为了平衡速度、容量和成本，现代计算机采用了分层存储体系结构，从最快速但容量有限的 <strong>寄存器</strong> 到容量大但速度较慢的辅助存储设备，形成了存储层次结构。</p>

<p>如上图所示，越靠近金字塔上层的容量越小但速度越快，越靠近金字塔下层的容量越大但速度越慢。计算机的存储系统包含以下层次：</p>
<ol>
<li>寄存器（Registers）:
<ul>
<li><strong>寄存器</strong> 是位于处理器内部的最快速存储单元。</li>
<li>它们提供极快的数据访问速度，但其容量非常有限。</li>
</ul>
</li>
<li>一级缓存（L1 Cache）:
<ul>
<li>L1 缓存位于处理器内部，比 <strong>寄存器</strong> 空间稍大，速度比 L2 和 L3 Cache 更快。</li>
<li>它通常分为 <strong>数据缓存</strong> （用于存储数据）和指令缓存（用于存储指令）。</li>
</ul>
</li>
<li>二级缓存（L2 Cache）:
<ul>
<li>L2 缓存比 L1 缓存大，并且位于处理器和主内存之间。</li>
<li>它的速度比 L1 慢，但比主内存快。</li>
</ul>
</li>
<li>三级缓存（L3 Cache）:
<ul>
<li>在某些系统中，还有 L3 缓存，这是一种更大但速度更慢的缓存。</li>
<li>它位于 L2 缓存和主内存之间，旨在进一步减少对主内存的访问。</li>
</ul>
</li>
<li>主存（RAM）:
<ul>
<li>就是我们常说的内存，比缓存慢，但比硬盘快得多，并且容量比缓存大。</li>
<li><strong>主存</strong> 用于存储正在运行的程序和当前使用的数据。</li>
</ul>
</li>
<li>辅助存储（如硬盘驱动器或固态驱动器）:
<ul>
<li><strong>辅助存储</strong> 设备提供大量的永久存储。</li>
<li>与 <strong>RAM</strong> 相比，这些设备访问速度较慢，但能够存储更多的数据，并且在断电时不会丢失数据。</li>
<li><a href="https://www.csgraduates.com/constitution_principle/storage/storage/#%E6%9C%BA%E6%A2%B0%E7%A1%AC%E7%9B%98" target="_blank" rel="noopener noreferrer">机械硬盘</a>（HDD）和<a href="https://www.csgraduates.com/constitution_principle/storage/storage/#%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98" target="_blank" rel="noopener noreferrer">固态硬盘</a>（SSD）是常见的 <strong>辅助存储</strong> 设备。</li>
</ul>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<h2>存储系统概念</h2>
<h3>一、存储系统的层次结构</h3>
<p>存储系统是计算机体系结构的核心组成部分之一，用于存储程序指令和数据，以支持处理器的运算需求。为了平衡速度、容量和成本，现代计算机采用了分层存储体系结构，从最快速但容量有限的 <strong>寄存器</strong> 到容量大但速度较慢的辅助存储设备，形成了存储层次结构。</p>

<p>如上图所示，越靠近金字塔上层的容量越小但速度越快，越靠近金字塔下层的容量越大但速度越慢。计算机的存储系统包含以下层次：</p>
<ol>
<li>寄存器（Registers）:
<ul>
<li><strong>寄存器</strong> 是位于处理器内部的最快速存储单元。</li>
<li>它们提供极快的数据访问速度，但其容量非常有限。</li>
</ul>
</li>
<li>一级缓存（L1 Cache）:
<ul>
<li>L1 缓存位于处理器内部，比 <strong>寄存器</strong> 空间稍大，速度比 L2 和 L3 Cache 更快。</li>
<li>它通常分为 <strong>数据缓存</strong> （用于存储数据）和指令缓存（用于存储指令）。</li>
</ul>
</li>
<li>二级缓存（L2 Cache）:
<ul>
<li>L2 缓存比 L1 缓存大，并且位于处理器和主内存之间。</li>
<li>它的速度比 L1 慢，但比主内存快。</li>
</ul>
</li>
<li>三级缓存（L3 Cache）:
<ul>
<li>在某些系统中，还有 L3 缓存，这是一种更大但速度更慢的缓存。</li>
<li>它位于 L2 缓存和主内存之间，旨在进一步减少对主内存的访问。</li>
</ul>
</li>
<li>主存（RAM）:
<ul>
<li>就是我们常说的内存，比缓存慢，但比硬盘快得多，并且容量比缓存大。</li>
<li><strong>主存</strong> 用于存储正在运行的程序和当前使用的数据。</li>
</ul>
</li>
<li>辅助存储（如硬盘驱动器或固态驱动器）:
<ul>
<li><strong>辅助存储</strong> 设备提供大量的永久存储。</li>
<li>与 <strong>RAM</strong> 相比，这些设备访问速度较慢，但能够存储更多的数据，并且在断电时不会丢失数据。</li>
<li><a href="https://www.csgraduates.com/constitution_principle/storage/storage/#%E6%9C%BA%E6%A2%B0%E7%A1%AC%E7%9B%98" target="_blank" rel="noopener noreferrer">机械硬盘</a>（HDD）和<a href="https://www.csgraduates.com/constitution_principle/storage/storage/#%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98" target="_blank" rel="noopener noreferrer">固态硬盘</a>（SSD）是常见的 <strong>辅助存储</strong> 设备。</li>
</ul>
</li>
</ol>
<p>存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。当 CPU 要从存储器中存取数据时，先访问 <strong>Cache</strong>，若不在 <strong>Cache</strong> 中，则访问 <strong>主存</strong>，若不在 <strong>主存</strong> 中，则访问磁盘，此时，操作数从磁盘读出送到 <strong>主存</strong>，然后从 <strong>主存</strong> 送到 <strong>Cache</strong>。</p>
<p><strong>Cache——主存层</strong> 主要解决 CPU 和主存速度不匹配的问题，主存和 <strong>Cache</strong> 之间的数据调动是由硬件自动完成的。</p>
<p><strong>主存一辅存层</strong> 主要解决存储系统的容量问题，主存和 <strong>辅存</strong> 之间的数据调动是由硬件和操作系统共同完成的，<strong>两者对于应用程序员都是透明的</strong>。</p>
<h3>二、RAM</h3>
<p>半导体随机存储器的英文为 <code>Semiconductor Random-Access Memory</code> （ <code>RAM</code> ）。</p>
<p>首先说一下这个名词中的几个部分：</p>
<ul>
<li>半导体：这种存储器使用半导体材料（如硅）制成。晶体管是构成半导体存储器的基本组成部分。</li>
<li>随机：随机的意思是随机访问，意味着可以以几乎恒定的时间访问存储器中的任意位置，它与其他存储技术（如磁盘或磁带）不同，后者需要按顺序访问数据。</li>
</ul>
<p>随机存储器主要分为 <strong>SRAM</strong> 和 <strong>DRAM</strong> 两种。</p>
<h4>2.1 SRAM</h4>
<p><strong>SRAM</strong>（Static RAM，静态随机存取存储器）使用触发器（通常由 4-6 个晶体管组成）构成存储器的基本存储单元，存储每个比特的数据，如下图所示：</p>

<p>只要电源持续供应，数据无需刷新即可保持稳定。</p>
<p><strong>SRAM</strong> 通过将触发器组织成二维阵列构成存储器，每行连接一个字线（Word Line），控制该行所有单元的访问。
每列连接一对位线（Bit Line），用于传输数据。</p>
<p><strong>SRAM</strong> <strong>主要用于</strong> CPU 缓存（L1/L2/L3 Cache）、寄存器、嵌入式系统中的小型高速存储。</p>
<h4>2.2 DRAM</h4>
<p><strong>DRAM</strong>（Dynamic RAM，动态随机存储器）使用 1 个晶体管和 1 个电容器（1T1C 结构）构成存储器的基本存储单元，存储每个比特的数据。</p>
<ul>
<li>电容器存储电荷，表示 1 比特数据（有电荷为 1，无电荷为 0）。</li>
<li>晶体管作为开关，控制电容器与外部位线（bit line）的连接，读写数据。</li>
</ul>

<p>与触发器不同，电容器具有 <strong>动态特性</strong>，会随时间漏电，导致数据丢失，因此需要 <strong>定期刷新</strong>（通常每几毫秒）以恢复电荷。</p>
<p><strong>DRAM</strong> 和 <strong>SRAM</strong> 的存储阵列在宏观上类似，都采用二维矩阵结构，通过字线和位线实现随机访问，主要区别在于基本存储单元的不同：</p>

<p>它以低成本和高容量著称，<strong>主要用于</strong> 计算机主内存（如系统 <strong>RAM</strong>）、显卡内存等。</p>
<h5>行列复用</h5>
<p>需要注意一点，绝大多数 DRAM 芯片的引脚都采用了 采用了 “行列地址复用” 的方式。</p>
<ul>
<li>DRAM 芯片内部存储单元是一个二维阵列：
<ul>
<li>行表示字线。</li>
<li>列表示位线。</li>
</ul>
</li>
<li>如果直接给每个单元提供地址引脚，需要 log₂(行数) + log₂(列数)个引脚。
<ul>
<li>例如：64K × 4 DRAM（64K 个字，每个字 4 bit），如果阵列是 256 行 × 256 列，就需要 16 根地址线。</li>
</ul>
</li>
<li>但在 20 世纪 70、80 年代，封装引脚数量有限，无法承受那么多地址线。</li>
</ul>
<p>于是，引入了 <strong>行列地址复用</strong>（Address Multiplexing）：</p>

<ul>
<li>芯片的外部只提供 <strong>log₂(max(行数, 列数))</strong> 根地址线。</li>
<li>地址分两次送入：
<ol>
<li>先送行地址（RAS，Row Address Strobe 信号有效时锁存）。</li>
<li>再送列地址（CAS，Column Address Strobe 信号有效时锁存）。</li>
</ol>
</li>
</ul>
<p>但是 <strong>SRAM</strong> 一般不使用行列复用：外部地址线一次性给出完整的地址，直接解码到存储单元。因为 SRAM 容量较小且速度有限，所以引脚数量不会太多。</p>
<p>| 特性     | DRAM               | SRAM             |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">指令系统</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/04-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/04-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>格式和寻址方式</h2>
<h3>一、指令格式</h3>
<p>指令的功能就是 <strong>对某些数据</strong> 进行 <strong>某种操作</strong>。</p>
<p>所以指令中主要包含两个部分：<strong>操作码</strong>（opcode）以及 <strong>地址</strong>（address）。</p>
<ul>
<li>操作码（opcode）就是决定了指令的类型：
<ul>
<li>这个指令是干嘛的？进行哪种操作？</li>
</ul>
</li>
<li>地址是一个通用含义，指的是操作的对象：
<ul>
<li>可以是一个 <strong>内存地址</strong>（<code>&lt;addr&gt;</code>）</li>
<li>也可以是 <strong>CPU 中的一个寄存器编号</strong>（<code>&lt;reg&gt;</code>）</li>
<li>也可以是一个 <strong>立即数</strong>（<code>&lt;imm&gt;</code>）</li>
</ul>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>格式和寻址方式</h2>
<h3>一、指令格式</h3>
<p>指令的功能就是 <strong>对某些数据</strong> 进行 <strong>某种操作</strong>。</p>
<p>所以指令中主要包含两个部分：<strong>操作码</strong>（opcode）以及 <strong>地址</strong>（address）。</p>
<ul>
<li>操作码（opcode）就是决定了指令的类型：
<ul>
<li>这个指令是干嘛的？进行哪种操作？</li>
</ul>
</li>
<li>地址是一个通用含义，指的是操作的对象：
<ul>
<li>可以是一个 <strong>内存地址</strong>（<code>&lt;addr&gt;</code>）</li>
<li>也可以是 <strong>CPU 中的一个寄存器编号</strong>（<code>&lt;reg&gt;</code>）</li>
<li>也可以是一个 <strong>立即数</strong>（<code>&lt;imm&gt;</code>）</li>
</ul>
</li>
</ul>

<h3>二、指令类型</h3>
<h4>2.1 根据操作码分类</h4>
<p>指令根据其 <strong>操作码</strong>（opcode）的不同可以分为以下类别：</p>
<ol>
<li>数据传输指令
<ul>
<li><code>MOV</code>：将数据从一个位置传输到另一个位置，可以是寄存器到寄存器、内存到寄存器、寄存器到内存等。</li>
<li><code>PUSH</code>：将数据（通常是寄存器中的值）推入堆栈。</li>
<li><code>POP</code>：从堆栈中弹出数据并存储到寄存器中。</li>
</ul>
</li>
<li>算术和逻辑运算指令
<ul>
<li><code>ADD</code>、<code>SUB</code>、<code>MUL</code>、<code>DIV</code>：执行算术运算，如加法、减法、乘法和除法。</li>
<li><code>AND</code>、<code>OR</code>、<code>XOR</code>、<code>NOT</code>：执行逻辑运算，如按位与、按位或、按位异或和按位取反。</li>
<li><code>INC</code>、<code>DEC</code>：递增和递减操作数的值。</li>
<li><code>CMP</code>：用于比较两个值，并根据结果设置标志寄存器的状态。</li>
</ul>
</li>
<li>控制转移指令
<ul>
<li><code>JMP</code>：用于无条件跳转到指定的目标地址。</li>
<li><code>Jxx</code>：条件跳转指令，根据特定的条件（如零标志、进位标志等）来决定是否跳转。</li>
<li><code>CALL</code>：调用子程序或函数。</li>
<li><code>RET</code>：从子程序返回。</li>
</ul>
</li>
<li>输入/输出指令
<ul>
<li><code>IN</code>：从外部设备或端口读取数据。</li>
<li><code>OUT</code>：向外部设备或端口发送数据。</li>
</ul>
</li>
<li>字符串操作指令（String Instructions）：
<ul>
<li><code>MOVS</code>、<code>LODS</code>、<code>STOS</code>、<code>CMPS</code>：用于在内存中执行字符串操作，如移动、加载、存储、比较。</li>
</ul>
</li>
<li>陷阱指令（Trap Instructions）：
<ul>
<li><code>INT</code>：用于引发中断，通常用于与操作系统进行通信。</li>
</ul>
</li>
<li>协处理器指令（Coprocessor Instructions）：
<ul>
<li><code>CLI</code>、<code>STI</code>：用于清除和设置 CPU 的中断标志，通常只能在内核模式下执行。</li>
</ul>
</li>
</ol>


<h4>2.2 根据地址个数分类</h4>
<p>根据指令中的 <strong>地址</strong> 个数，可以将指令划分为以下类型。
这些地址可以是 <strong>寄存器</strong>、<strong>内存地址</strong>，也可以是 <strong>立即数</strong>。</p>

<p>| 指令格式       | 指令格式         | 含义                                                        |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">中央处理器</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/05-%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/05-%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>功能和结构</h2>
<h3>一、CPU</h3>
<p>作为计算机的“大脑”，CPU（中央处理器）是执行程序指令、处理数据的关键部件。从宏观的计算机体系结构来看，CPU 是冯·诺依曼架构中“运算器”与“控制器”两大核心部件的具体实现与集成。因此，剖析 CPU 的内部组成，本质上就是探究现代计算机如何通过精密的硬件设计，将“运算”与“控制”这两大基本功能高效、协调地融为一体，并最终执行复杂的任务。</p>
<h4>1.1 组成结构</h4>
<p>在介绍 CPU 的组成结构之前，首先回顾一下计算机的 <a href="https://www.csgraduates.com/constitution_principle/overview/structure/#%E5%86%AF%E8%AF%BA%E4%BE%9D%E6%9B%BC%E7%BB%93%E6%9E%84" target="_blank" rel="noopener noreferrer">冯诺依曼结构</a>，其中 <strong>运算器</strong>、<strong>控制器</strong>、<strong>存储器</strong>、<strong>输入</strong>、<strong>输出</strong> 为计算机组成的五大部件，其中 CPU 涵盖的功能就包含 <strong>运算器</strong> 和 <strong>控制器</strong> 这两个。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>功能和结构</h2>
<h3>一、CPU</h3>
<p>作为计算机的“大脑”，CPU（中央处理器）是执行程序指令、处理数据的关键部件。从宏观的计算机体系结构来看，CPU 是冯·诺依曼架构中“运算器”与“控制器”两大核心部件的具体实现与集成。因此，剖析 CPU 的内部组成，本质上就是探究现代计算机如何通过精密的硬件设计，将“运算”与“控制”这两大基本功能高效、协调地融为一体，并最终执行复杂的任务。</p>
<h4>1.1 组成结构</h4>
<p>在介绍 CPU 的组成结构之前，首先回顾一下计算机的 <a href="https://www.csgraduates.com/constitution_principle/overview/structure/#%E5%86%AF%E8%AF%BA%E4%BE%9D%E6%9B%BC%E7%BB%93%E6%9E%84" target="_blank" rel="noopener noreferrer">冯诺依曼结构</a>，其中 <strong>运算器</strong>、<strong>控制器</strong>、<strong>存储器</strong>、<strong>输入</strong>、<strong>输出</strong> 为计算机组成的五大部件，其中 CPU 涵盖的功能就包含 <strong>运算器</strong> 和 <strong>控制器</strong> 这两个。</p>

<p>CPU 的核心功能包含 <strong>运算和控制</strong> 这两大模块，这对应了计算机五大部件中的 <strong>运算器</strong> 和 <strong>控制器</strong>。具体而言：运算功能（执行功能）是指 CPU 根据指令对数据进行算术或逻辑运算；控制功能则是指 CPU 通过指令协调计算机中各个部件的工作。</p>

<p>CPU 的结构简图如上图所示，CPU 由 <strong>运算部件</strong> 和 <strong>控制部件</strong> 组成。但是其实这两者并不能完全涵盖 CPU 的所有结构，因为这种分类方式忽略了 CPU 了内总线，所以一种更完善的 CPU 组件分类方法是将其分为 <strong>数据通路</strong> 和 <strong>控制器</strong> 这两部分：</p>
<ul>
<li><strong>数据通路</strong>（Datapath）是指令执行过程中，数据所经过的路径，包括路径中的部件。它是指令的 <strong>执行部件</strong>。</li>
<li><strong>控制器</strong>（Control Unit）对指令进行解码，生成对应的控制信号，控制 <strong>数据通路</strong> 的动作。能够执行指令发出控制信号，是指令的 <strong>控制部件</strong>。</li>
</ul>

<h5>数据通路</h5>
<p>CPU 的 <strong>数据通路</strong> 是指 CPU 在执行指令的过程中内部数据流动的路径，<strong>ALU</strong>、<strong>寄存器组</strong>、<strong>多路选择器</strong> 都属于数据通路的一部分。数据通路 <strong>描述了</strong> 信息从哪里开始，中间经过哪些部件，最后被传送到哪里。数据通路由 <a href="https://www.csgraduates.com/constitution_principle/cpu/controller/" target="_blank" rel="noopener noreferrer">控制部件</a> 控制，控制部件根据每条指令功能的不同，生成对数据通路的控制信号。</p>
<p>数据通路的元件主要分为 <strong>组合逻辑元件</strong> 和 <strong>时序逻辑元件</strong> 两类：</p>
<p>组合逻辑元件</p>
<p><strong>组合逻辑元件</strong>（操作元件）指那些仅由 <strong>组合逻辑电路</strong> 组成的元件，其输出仅取决于当前的输入，而不受存储器或时钟信号的影响。输入和输出之间无反馈通路，信号是单向传输的。</p>
<p>数据通路中常用的组合逻辑元件有 <strong>算数逻辑单元</strong>（<strong>ALU</strong>）、<strong>译码器</strong>、<strong>多路选择器</strong>、<strong>三态门</strong> 等，如下图所示：</p>

<ul>
<li><strong>译码器</strong>：用于操作码或地址码译码， <em>n</em> 位输入对应 2<em>n</em> 种不同组合，因此有 2<em>n</em> 种不同的输出，但是每次只有一个输出被使能。</li>
<li><strong>多路选择器</strong>：有多个输入，输出与其中一个输入相同，需要用控制信号 <strong>Select</strong> 选择哪个输入作为输出。</li>
<li><strong>三态门</strong>：可以被视为一种控制开关，由控制信号 <strong>EN</strong> 决定信号线的通断，当 <strong>EN=1</strong> 时，三态门被打开，输入信号等于输出信号；当 <strong>EN = 0</strong> 时，输出端呈现高阻态，数据通路被断开。</li>
</ul>
<p>时序逻辑元件</p>
<p>对于 <strong>时序逻辑元件</strong>（状态元件），其任何时刻的输出不仅与该时刻的输入有关，还与该时刻以前的输入有关，并且 <strong>具备状态存储</strong> 功能。此外，时序电路必须在 <strong>时钟节拍</strong> 下工作。</p>
<p>各类 <strong>寄存器</strong> 和 <strong>存储器</strong>，如 <strong>通用寄存器组</strong>、<strong>程序计数器</strong>、<strong>状态/移位/暂存/锁存寄存器</strong>等，都属于时序逻辑元件。</p>

<h5>控制器</h5>
<p><strong>控制器</strong>是计算机的指挥中心，它负责协调和控制计算机的所有操作。其核心功能是根据当前正在执行的<strong>指令</strong>，生成一系列<strong>控制信号</strong>，精确地指挥<strong>数据通路</strong>中的各个部件（如 ALU、寄存器、多路选择器）协同工作，从而完成指令所规定的任务。</p>
<p>控制器可以被视为整个 CPU 的“大脑”或“指挥家”。它不直接处理数据，而是决定数据在何时、何地、以何种方式流动和运算。</p>
<p>控制器的 <strong>基本工作原理</strong> 如下：</p>
<ol>
<li><strong>取指令</strong>：控制器指挥程序计数器（PC）送出当前指令地址，从存储器中取出指令，并送入指令寄存器（IR）。</li>
<li><strong>分析指令</strong>：对指令寄存器中的指令进行<strong>译码</strong>，识别出指令的操作类型（如加法、跳转）、寻址方式以及所需的操作数。</li>
<li><strong>执行指令</strong>：根据指令译码的结果，控制器在正确的时序下，生成并发出对应的控制信号序列。这些信号控制数据通路打开或关闭特定的数据路径，选择 ALU 的运算功能，决定是否写入寄存器或内存等。</li>
<li><strong>转向下条指令</strong>：在完成当前指令后，控制器会更新程序计数器，为取下一条指令做好准备，从而开始新一轮的循环。</li>
</ol>

<p>控制器的功能和组成详见 <a href="https://www.csgraduates.com/constitution_principle/cpu/controller/" target="_blank" rel="noopener noreferrer">该节</a>。</p>
<h3>二、8086 CPU</h3>
<p>上文已经对 CPU 中的组件进行了分类，但是仅有抽象概念是不足够的，该节会提供一个非常简单的 CPU 实现来说明情况，这个 CPU 就是 <strong>8086</strong>。</p>
<p><strong>8086</strong> 是 Intel 首款真正的 16 位处理器，也是现代 <strong>x86</strong> 处理器的开端，只要掌握了这个 CPU 的架构，就能搞定绝大多数考试过程中会遇到的问题。</p>
<h4>2.1 结构</h4>

<p>上文已经提到了 <a href="https://www.csgraduates.com/constitution_principle/cpu/structure/#%E7%BB%84%E6%88%90%E7%BB%93%E6%9E%84" target="_blank" rel="noopener noreferrer">CPU 的组成结构</a> 可以分为 <strong>数据通路</strong> 和 <strong>控制器</strong> 这两部分，<strong>8086</strong> 中的 <strong>数据通路</strong> 由指令队列、<a href="https://www.csgraduates.com/constitution_principle/cpu/structure/#%E5%AF%84%E5%AD%98%E5%99%A8" target="_blank" rel="noopener noreferrer">寄存器</a> 和内总线组成。<strong>控制器</strong>中包含指令译码器、时序控制单元、标志控制逻辑和微指令控制逻辑。</p>
<p>下文会按照这个脉络对 <strong>8086</strong> 中的组件进行详细说明。</p>
<h4>2.2 寄存器</h4>

<p>从功能的角度进行区分，<strong>8086 CPU</strong> 的 <strong>寄存器</strong> 可以为分为 <strong>通用寄存器</strong>、<strong>段寄存器</strong>、<strong>指针寄存器</strong>、<strong>附加寄存器</strong> 和 <strong>标志寄存器</strong> 这五类：</p>
<ol>
<li>通用寄存器：用于存储任意的地址或者数据。
<ul>
<li><code>AX</code> 寄存器：累加器（Accumulator），用于执行算术和逻辑运算。</li>
<li><code>BX</code> 寄存器：基址寄存器（Base Register），通常用于存储内存地址。</li>
<li><code>CX</code> 寄存器：计数寄存器（Counter Register），用于循环计数和移位操作。</li>
<li><code>DX</code> 寄存器：数据寄存器（Data Register），用于输入/输出操作和大整数运算。</li>
</ul>
</li>
<li>段寄存器：用于存储内存段的起始地址。
<ul>
<li><code>CS (Code Segment)</code> 寄存器：代码段寄存器，存储指向代码段的地址。</li>
<li><code>DS (Data Segment)</code> 寄存器：数据段寄存器，存储指向数据段的地址。</li>
<li><code>ES (Extra Segment)</code> 寄存器：附加数据段寄存器，通常用于数据访问。</li>
<li><code>SS (Stack Segment)</code> 寄存器：堆栈段寄存器，存储指向堆栈段的地址。</li>
</ul>
</li>
<li>变址寄存器：用于支持变址寻址模式，和数组和指针操作相关。
<ul>
<li><code>SI</code> 寄存器：源变址寄存器，通常用于数据传送操作。</li>
<li><code>DI</code> 寄存器：目的变址寄存器，也通常用于数据传送操作。</li>
</ul>
</li>
<li>指针寄存器：
<ul>
<li><code>SP (Stack Pointer)</code> 寄存器：堆栈指针寄存器，指向函数栈的顶部。</li>
<li><code>BP (Base Pointer)</code> 寄存器：堆栈基址寄存器，指向函数栈的底部。</li>
<li><code>IP</code> 寄存器：指令指针寄存器，存储当前执行指令的偏移地址。</li>
</ul>
</li>
<li>标志寄存器：
<ul>
<li><code>FLAGS</code> 寄存器：标志寄存器，存储有关条件和状态的信息，例如进位、零标志、溢出等。</li>
</ul>
</li>
<li>特殊寄存器：
<ul>
<li><code>IR (Instruction Register)</code> 寄存器：暂存读取的指令。</li>
<li><code>T</code> 暂存器：暂存 <strong>ALU</strong> 一端的输入。</li>
</ul>
</li>
</ol>

<h5>段寄存器</h5>
<p><strong>段寄存器</strong>指向程序调用时的 <strong>内存结构中不同段的起始位置</strong>：</p>
<ul>
<li><strong>CS</strong> 指向代码段（.text）的起始位置</li>
<li><strong>SS</strong> 指向栈段（User Stack）的起始位置</li>
<li><strong>DS</strong> 指向数据段（.data）的起始位置</li>
<li><strong>ES</strong> 指向附加段（Extra Segment）的起始位置</li>
</ul>
<p>对于运行在 <strong>8086</strong> 上的程序而言，其内存结构相比 <a href="https://www.csgraduates.com/operating_system/process/process_thread/#%E8%BF%9B%E7%A8%8B%E5%86%85%E5%AD%98%E7%A9%BA%E9%97%B4" target="_blank" rel="noopener noreferrer">现代进程内存空间</a> 更加简单，但其中的逻辑结构是类似的：</p>

<p>从逻辑上来说，程序的执行需要四个段：</p>
<ul>
<li><strong>代码段</strong>：存储编译后程序指令的地方</li>
<li><strong>数据段</strong>：存储有全局数据的地方</li>
<li><strong>栈段</strong>：函数嵌套调用的发生场所</li>
<li><strong>额外段</strong>：提供一些灵活性，供程序员发挥</li>
</ul>
<p>不同的段寄存器与不同的段相关联，指向相关段的起始地址。</p>
<h5>指针寄存器</h5>
<p>对于有些段来说，仅仅知道其起始地址是不足够的，在程序执行过程中，需要一些额外的寄存器来实现我们需要的操作，<strong>指针寄存器</strong>主要操作 <strong>栈段</strong> 和 <strong>代码段</strong>。</p>
<p>栈指针寄存器</p>
<p><strong>栈指针寄存器</strong> 包含 <strong>BP</strong>、<strong>SP</strong> 这两个，在进一步了解这两个寄存器之前，请复习一下 <a href="https://www.csgraduates.com/operating_system/process/process_thread/#%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%97%B6%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84" target="_blank" rel="noopener noreferrer">函数调用时的内存结构</a>。</p>
<p>函数在执行过程中需要保存的数据与栈类似，具有先进后出的特点。</p>
<p>函数栈从高地址向低地址增长，嵌套调用的函数所对应的函数栈 在栈段上不断堆叠。如果我们在 <code>main()</code> 主函数中嵌套调用 <code>f(g(h(1)))</code>，那么该程序对应的栈段对应的逻辑结构如下所示：</p>

<p>其中 <strong>BP</strong> 指向最后一个调用的函数栈的底部，<strong>SP</strong> 指向最后一个调用的函数栈的顶部，通过 <strong>BP</strong> 和 <strong>SP</strong> 我们保存了最后一个函数栈帧的栈底（开始位置）和栈顶（结束位置）。</p>
<p>指令指针寄存器</p>
<p>在 <strong>8086</strong> 中，指令指针寄存器指的就是 <strong>IP</strong>（Instruction Pointer）寄存器。</p>
<p>指令在 <strong>代码段</strong>（.text 段）中是从低地址向高地址增长的，这种增长方式也符合 <strong>程序计数器</strong>（PC 或 IP）的增长逻辑：在 <a href="https://www.csgraduates.com/constitution_principle/cpu/controller/#%E6%8C%87%E4%BB%A4%E6%89%A7%E8%A1%8C%E7%9A%84%E6%8E%A7%E5%88%B6%E4%BF%A1%E5%8F%B7" target="_blank" rel="noopener noreferrer">指令执行的取指阶段</a>，控制单元在完成取指后会控制 <strong>IP = IP + 指令长度</strong>，这样 <strong>IP</strong> 就指向了 <strong>下一条待执行指令的地址</strong>。</p>

<h5>变址寄存器</h5>
<p><strong>变址寄存器</strong> 主要用于实现变址寻址模式，方便对数组、字符串等数据结构中的 <strong>第 i 个元素</strong> 进行操作。<strong>8086</strong> 中的主要变址寄存器是 <strong>SI</strong>（源变址寄存器）和 <strong>DI</strong>（目的变址寄存器），下文分别从 <strong>数组</strong> 和 <strong>字符串操作</strong> 两个例子说明一下：</p>
<p><strong>数组操作</strong></p>
<p>以下汇编代码段通过一个循环操作实现了对于数组中的前五个元素进行操作。注意在 <strong>8086</strong> 中，我们是在 <strong>CX</strong> 中保存 loop 的轮数，每次 <strong>LOOP</strong> 被调用后 <strong>CX</strong> 的值自动被减一。</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-"><span class="line"><span>; 假设 DS 指向数据段并且数组从数据段开始</span></span>
<span class="line"><span>MOV DS, addr         ; 将数组的起始地址保存到 DS 中</span></span>
<span class="line"><span>MOV CX, 5            ; CX 用作循环计数器，假设数组有 5 个元素</span></span>
<span class="line"><span>MOV SI, 0            ; SI 作为索引寄存器，初始化为 0</span></span>
<span class="line"><span></span></span>
<span class="line"><span>NEXT_ELEMENT:</span></span>
<span class="line"><span>    MOV AX, [SI]     ; 从数组当前元素读取到 AX</span></span>
<span class="line"><span>    ; 对 AX 中的数据进行处理</span></span>
<span class="line"><span>    ADD SI, 2        ; 移动到下一个元素（假设每个元素 2 字节）</span></span>
<span class="line"><span>    LOOP NEXT_ELEMENT ; 循环直到 CX 为 0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>字符串操作</strong></p>
<p>以下汇编代码将一个字符串的前 <strong>length</strong> 个字符复制到另一个字符串中。</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-"><span class="line"><span>; 假设 DS 和 ES 已经分别指向源和目的数据段</span></span>
<span class="line"><span>MOV SI, OFFSET source ; SI 指向源字符串的起始位置</span></span>
<span class="line"><span>MOV DI, OFFSET dest   ; DI 指向目的字符串的起始位置</span></span>
<span class="line"><span>CLD                   ; 清除方向标志位，确保字符串操作从低地址到高地址</span></span>
<span class="line"><span></span></span>
<span class="line"><span>MOV CX, length        ; CX 初始化为字符串的长度</span></span>
<span class="line"><span></span></span>
<span class="line"><span>REP MOVSB             ; 复制 CX 个字节从 DS:SI 到 ES:DI</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h5>标志寄存器</h5>
<p><strong>标志寄存器</strong>（<strong>Flags</strong>）用于存储处理器在 <strong>执行指令过程中产生的各种状态和条件</strong>，这些状态可以进一步被 <a href="https://www.csgraduates.com/constitution_principle/cpu/controller/" target="_blank" rel="noopener noreferrer">控制器</a> 所用，控制后续指令执行的行为。</p>
<p>标志寄存器中的不同位用于标记某个特殊的状态，<strong>8086</strong> 中的 <strong>标志寄存器</strong> 是一个 <strong>16 位</strong> 的寄存器，其中 <em>9 个标志位</em> 被使用，其他 <em>7 个标志位</em> 没有含义。</p>

<p>这些标志位在逻辑上可以被分为 <strong>条件标志</strong>（conditional flags）和 <strong>控制标志</strong>（control flags）两种：</p>
<p>条件标志</p>
<p>条件标志用于标记指令执行后的结果状态，用于影响程序的控制流，<strong>条件标志</strong> 包含以下几种：</p>
<ul>
<li>OF (Overflow flag)：溢出标志。
<ul>
<li>当 <a href="https://www.csgraduates.com/constitution_principle/representation/integer/#%E6%9C%89%E7%AC%A6%E5%8F%B7%E6%95%B0" target="_blank" rel="noopener noreferrer">有符号整数</a> 运算的结果太大而无法适应目标寄存器时，<strong>OF</strong> 标志会设置为 1，表示发生了溢出。</li>
</ul>
</li>
<li>CF(Carry flag)：进位标志。
<ul>
<li>当无符号整数 运算的结果超出了目标寄存器的位数，CF标志被设置为 1，表示发生了进位。
<ul>
<li>加法时：<strong>CF=1</strong> 表示发生了 <strong>进位</strong>（即结果超过了寄存器能表示的范围）。</li>
<li>减法时：<strong>CF=1</strong> 表示发生了 <strong>借位</strong>（即被减数小于减数）。</li>
</ul>
</li>
</ul>
</li>
<li>SF(Sign flag)：符号标志。
<ul>
<li>根据操作结果的符号位来设置，如果结果为负数，则 <strong>SF</strong> 被设置为 1，否则为 0。</li>
</ul>
</li>
<li>ZF(Zero flag)：零标志。
<ul>
<li>当操作结果为零时，<strong>ZF</strong> 标志被设置为 1，否则为 0。</li>
</ul>
</li>
<li>AF(Auxiliary carry flag)：辅助进位标志。
<ul>
<li>通常用于 BCD（二进制编码十进制）算术运算，指示低四位的进位。</li>
</ul>
</li>
<li>PF(Parity flag)：奇偶校验标志。
<ul>
<li>根据结果中二进制位 1 的个数是奇数还是偶数，设置 <strong>PF</strong> 标志。奇数个 1 则 <strong>PF</strong> 为 1，偶数个 1 则 <strong>PF</strong> 为 0。</li>
</ul>
</li>
</ul>

<p>条件标志不需要 序员手动通过指令设置，当算数和逻辑指令（Add 和 AND 等）和 <strong>比较指令</strong>（CMP）被执行时，相关的标志位会被 <strong>自动设置</strong>。</p>
<p>条件标志通常用于控制 <a href="https://www.csgraduates.com/constitution_principle/instruction/instruction_ops/#jxx-%E6%9D%A1%E4%BB%B6%E8%B7%B3%E8%BD%AC%E6%8C%87%E4%BB%A4" target="_blank" rel="noopener noreferrer">条件跳转指令</a> 的执行。条件跳转指令会检查条件寄存器中的标志位，根据标志位的状态决定是否将 <strong>程序计数器</strong>（PC）修改为目标地址，从而实现程序流程的跳转。</p>
<p>以下我们需要说明几个需要注意的点，这些知识点很容易被混淆：</p>



<p>控制标志</p>
<p><strong>控制标志</strong> 并不会被通常的运算指令自动修改，而是通过专门的指令来进行设置或清除。对于以下字段，了解即可：</p>
<ul>
<li>IF(Interrupt flag)
<ul>
<li>控制中断处理</li>
<li>当 <strong>IF</strong> 被设置为 1 时，CPU 允许中断请求。如果 <strong>IF</strong> 为 0，CPU 将禁止所有 <a href="https://www.csgraduates.com/constitution_principle/bus/io/#%E5%8F%AF%E5%B1%8F%E8%94%BD%E4%B8%AD%E6%96%AD" target="_blank" rel="noopener noreferrer"><strong>可屏蔽中断</strong></a>，无论是外部硬件中断还是软件中断。</li>
</ul>
</li>
<li>TF(Trap flag)
<ul>
<li>控制单步执行。</li>
<li>当 <strong>TF</strong> 被设置为 1 时，CPU 将进入单步执行模式。在单步执行模式下，每执行一条指令后，CPU 将引发一个单步中断，允许程序员逐条调试程序。</li>
</ul>
</li>
<li>DF(Direction flag)
<ul>
<li>字符串操作的标志位。</li>
<li>当 <strong>DF</strong> 被设置为 1 时，字符串操作（如 MOVS、LODS、STOS）在内存中向高地址方向移动。这通常用于从高地址向低地址扫描字符串。当 <strong>DF</strong> 被清除为 0 时，字符串操作在内存中向低地址方向移动。这通常用于从低地址向高地址扫描字符串。</li>
</ul>
</li>
</ul>
<h5>特殊寄存器</h5>
<p>暂存器</p>
<p>每次 <strong>ALU</strong> 操作都需要两个操作数，但是 <strong>数据总线</strong> 是 <strong>共享的</strong>，同一时刻只能传输一个操作数。所以在 <strong>ALU</strong> 会按照以下方式进行计算：</p>
<ul>
<li>先读取第一个操作数，暂存在临时寄存器 <strong>T</strong> 中；</li>
<li>然后再读取第二个操作数；</li>
<li>最后，<strong>ALU</strong> 从 <strong>T</strong> 和第二个操作数一起执行运算。</li>
</ul>
<p>所以在 <strong>只有一个内部数据总线</strong> 的设计里，为了配合 <strong>ALU</strong> 的两个输入，<strong>暂存器</strong>被设置用于存储前一个时钟周期的数据。</p>
<p>指令寄存器</p>
<p>当 <strong>CPU</strong> 从内存或指令队列中取出一条指令时，这条指令会被送入 <strong>IR</strong>（指令寄存器），暂存在这里，供后续的译码和执行阶段使用。</p>
<p>控制单元（CU）可以对 <strong>IR</strong> 中的指令进行译码，生成一系列控制信号。</p>
<h4>2.3 引脚</h4>
<p>CPU 的 <strong>引脚</strong>（Pin）是处理器与主板之间进行电气连接的接口，是 CPU 与外部组件（如内存、I/O 设备、电源等）之间通信的桥梁。<strong>引脚</strong> 的功能包括 <strong>数据传输</strong>、<strong>地址定位</strong>、<strong>中断控制</strong>、<strong>时序控制</strong> 等，是实现 CPU 与外部世界交互的关键通道。</p>
<p>为便于理解，本节以 <strong>Intel 8086</strong> 处理器为例进行说明。需要注意的是，本节内容以了解为主，试题通常不会直接考察，但对于理解计算机体系结构十分重要。</p>


<p>以 <strong>8086</strong> 为例，<strong>8086</strong> 为 16 位计算机，其 <strong>数据总线</strong> 为 16 位，可寻址地址空间为 1 MB，所以其 <strong>地址总线</strong> 为 20 位。数据总线和地址总线 <strong>复用</strong>，地址总线的高位与状态线复用：</p>
<p>| 引脚名        | 方向 | 说明                                                        |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">总线与输入输出系统</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/06-%E6%80%BB%E7%BA%BF%E4%B8%8E%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/06-%E6%80%BB%E7%BA%BF%E4%B8%8E%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>总线</h2>
<h3>一、基本概念</h3>
<p><strong>总线</strong> 是一组电子导线或信号线，它们允许不同的硬件设备（如 <strong>CPU</strong>、<strong>内存</strong>、<strong>输入/输出</strong> 设备等）之间进行数据传输和通信。总线是计算机内部和外部设备之间的信息传递通道。</p>
<h3>二、总线分类</h3>
<h4>2.1 功能</h4>
<ol>
<li><strong>核内总线</strong> ：在处理器核内部各元件之间连线的总线称为 <strong>核内总线</strong> ，可连接核内各寄存器、ALU、指令部件等</li>
<li><strong>系统总线</strong> ：指连接 <strong>CPU</strong>、主存和 <strong>I/O</strong> 接口等主要部件的总线，通常所说的总线是指这类在系统主要模块之间互连的总线。下面要介绍的也是这种 <strong>系统总线</strong> 。</li>
<li><strong>通信总线</strong> ：计算机系统之间或计算机系统与其他系统（远程通信设备、测试设备）之间进行通信的总线，又称 <strong>外部总线</strong>。</li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<h2>总线</h2>
<h3>一、基本概念</h3>
<p><strong>总线</strong> 是一组电子导线或信号线，它们允许不同的硬件设备（如 <strong>CPU</strong>、<strong>内存</strong>、<strong>输入/输出</strong> 设备等）之间进行数据传输和通信。总线是计算机内部和外部设备之间的信息传递通道。</p>
<h3>二、总线分类</h3>
<h4>2.1 功能</h4>
<ol>
<li><strong>核内总线</strong> ：在处理器核内部各元件之间连线的总线称为 <strong>核内总线</strong> ，可连接核内各寄存器、ALU、指令部件等</li>
<li><strong>系统总线</strong> ：指连接 <strong>CPU</strong>、主存和 <strong>I/O</strong> 接口等主要部件的总线，通常所说的总线是指这类在系统主要模块之间互连的总线。下面要介绍的也是这种 <strong>系统总线</strong> 。</li>
<li><strong>通信总线</strong> ：计算机系统之间或计算机系统与其他系统（远程通信设备、测试设备）之间进行通信的总线，又称 <strong>外部总线</strong>。</li>
</ol>
<h4>2.2 数据传送方式</h4>
<p><strong>总线</strong> 的数据传输方式包含 <strong>串行</strong> 和 <strong>并行</strong> 两种：</p>

<ol>
<li><strong>串行总线</strong> ：只含有一条双向数据线或两条单向数据线，数据按位分时传送。适合远距离通信，大多数 <strong>通信总线</strong> 属于 <strong>串行总线</strong></li>
<li><strong>并行总线</strong> ：含有多条双向数据线，可实现多位同时传送。传输效率高，但相邻数据线之间会相互干扰，适合近距离传输。大多数 <strong>系统总线</strong> 属于 <strong>并行总线</strong></li>
</ol>
<p>试题中常常考查 <strong>哪些总线是串行总线，哪些总线是并行总线</strong> 。</p>
<p>这里核心把握一点：<em><strong>现代高速通信几乎都使用串行总线</strong></em>（PCIe、USB、SATA、DisplayPort），而并行总线主要用于内存、老式设备或非常短距离的高速通信。</p>
<p><strong>常见的串行总线</strong> 如下表所示：</p>
<p>| 总线类型                   | 简介                                                    |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">计算机组成原理</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/01-%E6%A6%82%E8%BF%B0.html" target="_blank">概述</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/02-%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA%E5%92%8C%E8%AE%A1%E7%AE%97.html" target="_blank">数据表示和计算</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/03-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F.html" target="_blank">存储系统</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/04-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F.html" target="_blank">指令系统</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/05-%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8.html" target="_blank">中央处理器</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/06-%E6%80%BB%E7%BA%BF%E4%B8%8E%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F.html" target="_blank">总线与输入输出系统</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/01-%E6%A6%82%E8%BF%B0.html" target="_blank">概述</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/02-%E6%95%B0%E6%8D%AE%E8%A1%A8%E7%A4%BA%E5%92%8C%E8%AE%A1%E7%AE%97.html" target="_blank">数据表示和计算</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/03-%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F.html" target="_blank">存储系统</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/04-%E6%8C%87%E4%BB%A4%E7%B3%BB%E7%BB%9F.html" target="_blank">指令系统</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/05-%E4%B8%AD%E5%A4%AE%E5%A4%84%E7%90%86%E5%99%A8.html" target="_blank">中央处理器</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/02-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/06-%E6%80%BB%E7%BA%BF%E4%B8%8E%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E7%B3%BB%E7%BB%9F.html" target="_blank">总线与输入输出系统</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">操作系统概述</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/01-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/01-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>操作系统概念</h2>
<h3>一、概念</h3>
<p><strong>操作系统</strong> 是计算机系统中的一个核心软件组件，负责管理和控制计算机硬件，为用户和应用程序提供服务。</p>
<h4>1.1 操作系统特征</h4>
<ol>
<li><strong>并发</strong>（Concurrence）：<strong>操作系统</strong> 具备同时处理和调度多个程序的能力。</li>
<li><strong>共享</strong>（Sharing）：系统中的资源可供内存中多个并发的进程共同使用。</li>
<li><strong>虚拟</strong>（Virtual）：将物理的实物虚拟为逻辑上的对应物。</li>
<li><strong>异步</strong>（Asynchronism）：任务可以不按固定的顺序执行，因此同一操作的结果可能因执行的时序而异。</li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<h2>操作系统概念</h2>
<h3>一、概念</h3>
<p><strong>操作系统</strong> 是计算机系统中的一个核心软件组件，负责管理和控制计算机硬件，为用户和应用程序提供服务。</p>
<h4>1.1 操作系统特征</h4>
<ol>
<li><strong>并发</strong>（Concurrence）：<strong>操作系统</strong> 具备同时处理和调度多个程序的能力。</li>
<li><strong>共享</strong>（Sharing）：系统中的资源可供内存中多个并发的进程共同使用。</li>
<li><strong>虚拟</strong>（Virtual）：将物理的实物虚拟为逻辑上的对应物。</li>
<li><strong>异步</strong>（Asynchronism）：任务可以不按固定的顺序执行，因此同一操作的结果可能因执行的时序而异。</li>
</ol>
<h4>1.2 目标和功能</h4>
<ul>
<li>作为用户语句计算机硬件系统之间的接口。</li>
<li>作为计算机系统资源的管理者。</li>
<li>实现了对计算机资源的抽象。</li>
</ul>
<h3>二、发展历程</h3>
<p><strong>操作系统</strong> 的发展历程经历了 手工操作、批处理操作、分时操作、实时操作 这四个阶段：</p>

<ol>
<li>
<p>手工操作阶段：</p>
<ul>
<li>时间背景：计算机的早期阶段。</li>
<li>特点：没有 <strong>操作系统</strong>，用户直接使用计算机硬件。</li>
<li>操作方式：用户在一个时刻将自己的程序载入计算机，然后执行。执行完毕后，将结果记录并释放计算机。</li>
<li>问题：效率低，<strong>CPU</strong> 大部分时间处于空闲状态。</li>
</ul>
</li>
<li>
<p>批处理操作系统：</p>
<ul>
<li>单道批处理系统：
<ul>
<li>特点：系统一次只执行一个任务。完成后再执行下一个。</li>
<li>操作方式：用户的多个作业被收集到一个作业队列中，<strong>操作系统</strong> 按照队列的顺序逐一执行。</li>
<li>问题：<strong>CPU</strong> 利用率仍然不高，因为在 I/O 操作时，<strong>CPU</strong> 仍然处于空闲状态。</li>
</ul>
</li>
<li>多道批处理系统：
<ul>
<li>特点：在内存中同时加载多个作业，并使它们共享 <strong>CPU</strong>。</li>
<li>操作方式：当一个作业进行 I/O 操作时，<strong>CPU</strong> 可以切换到另一个作业，从而提高了 <strong>CPU</strong> 的利用率。</li>
<li>优势：提高了系统吞吐量和 <strong>CPU</strong> 利用率。</li>
</ul>
</li>
</ul>
</li>
<li>
<p>分时操作系统：</p>
</li>
</ol>
<ul>
<li>时间背景：20 世纪 60 年代。</li>
<li>特点：允许多个用户通过终端同时访问计算机。</li>
<li>操作方式：<strong>操作系统</strong> 为每个用户提供了一个“虚拟机”的概念，使每个用户感觉自己独占了整个系统。实际上，系统在用户之间快速切换，为每个用户提供少量的 <strong>CPU</strong> 时间。</li>
<li>优势：提高了交互性和多用户并发访问的能力。</li>
<li>示例：<strong>Unix</strong> 操作系统在其初期就是一个分时系统。</li>
</ul>
<ol start="4">
<li>实时操作系统：</li>
</ol>
<ul>
<li>特点：系统必须在严格的时间限制内响应外部输入。</li>
<li>分类：
<ul>
<li><strong>硬实时系统</strong>：不满足时限会导致严重的后果，如飞行控制系统。</li>
<li><strong>软实时系统</strong>：不满足时限可能会降低系统的性能，但不会导致灾难，如多媒体播放器。</li>
</ul>
</li>
<li>操作方式：实时 <strong>操作系统</strong> 的任务调度是基于优先级的，且通常会预先定义每个任务的执行时间。</li>
<li>优势：满足特定应用场景的实时需求，如嵌入式系统和工业控制系统。</li>
</ul>
<h3>三、操作系统引导</h3>
<h3>3.1 引到流程</h3>


<p><strong>操作系统</strong> 引导的具体流程如下：</p>
<ol>
<li>电源开机（Power-On）：
<ul>
<li>当你按下计算机的电源键时，电源开始向主板和各个硬件供电。此时，系统首先进行加电自检。这个过程是由存储在主板 <strong>ROM</strong> 芯片中的基本输入/输出系统（<strong>BIOS</strong>）或统一可扩展固件接口（<strong>UEFI</strong>）固件执行的。</li>
</ul>
</li>
<li>BIOS/UEFI 阶段：
<ul>
<li><strong>BIOS/UEFI</strong> 会读取启动设备的首扇区（<strong>MBR</strong> 或 <strong>GPT</strong>），其中包含 <strong>引导加载器</strong>（Bootloader）的代码。</li>
</ul>
</li>
<li>引导加载器（Bootloader）：
<ul>
<li><strong>引导加载器</strong> 是一小段程序，它的主要任务是加载 <strong>操作系统</strong> 内核。</li>
<li>常见的bootloader有
<ul>
<li><strong>GRUB</strong>（Grand Unified Bootloader）：常用于 <strong>Linux</strong> 系统，功能强大，支持多系统引导。</li>
<li><strong>Windows Boot Manager</strong>：<strong>Windows</strong> 操作系统的引导管理器。</li>
</ul>
</li>
<li><strong>引导加载器</strong> 会将 <strong>操作系统</strong> 内核从存储设备（通常是硬盘）加载到内存中。</li>
</ul>
</li>
<li>加载操作系统内核：
<ul>
<li><strong>操作系统</strong> 内核是 <strong>操作系统</strong> 的核心部分，负责管理系统的各种资源，如内存、进程、设备等。<strong>引导加载器</strong> 将内核加载到内存后，会将控制权交给内核。</li>
</ul>
</li>
<li>内核初始化：
<ul>
<li><strong>操作系统</strong> 内核开始运行并进行自我初始化。它会检测和配置系统上的硬件资源，例如设置中断、初始化设备驱动、建立内存管理结构等。</li>
</ul>
</li>
<li>启动系统服务和守护进程：
<ul>
<li>在内核初始化后，它会启动一系列的系统进程或服务来管理各种系统任务。</li>
</ul>
</li>
</ol>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">进程管理</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/02-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/02-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>进程和线程</h2>
<h3>一、进程和线程</h3>
<p>在多道程序环境下，允许多个程序并发执行，为此操作系统引入了 <strong>进程</strong> (Process) 的概念，以便更好地描述和控制程序的并发执行，实现操作系统的并发性。</p>
<h4>1.1 进程</h4>
<p><strong>进程是系统资源分配的基本单位</strong>。进程拥有独立的系统资源，包括内存空间、文件描述符、CPU 时间片等，这些资源的分配由操作系统负责。</p>
<h5>进程和程序</h5>
<p>程序是 <strong>静态的</strong>，进程是 <strong>动态的</strong>，进程可以理解成运行的程序，两者的具体区别如下：</p>]]></summary>
    <content type="html"><![CDATA[
<h2>进程和线程</h2>
<h3>一、进程和线程</h3>
<p>在多道程序环境下，允许多个程序并发执行，为此操作系统引入了 <strong>进程</strong> (Process) 的概念，以便更好地描述和控制程序的并发执行，实现操作系统的并发性。</p>
<h4>1.1 进程</h4>
<p><strong>进程是系统资源分配的基本单位</strong>。进程拥有独立的系统资源，包括内存空间、文件描述符、CPU 时间片等，这些资源的分配由操作系统负责。</p>
<h5>进程和程序</h5>
<p>程序是 <strong>静态的</strong>，进程是 <strong>动态的</strong>，进程可以理解成运行的程序，两者的具体区别如下：</p>
<ul>
<li>程序
<ul>
<li>程序是一组指令的静态集合，它存储在磁盘等持久性存储介质中。</li>
<li>程序是被动的，它本身并不执行任何操作。</li>
<li>一个程序可以多次运行，每次运行都会创建一个新的进程。</li>
</ul>
</li>
<li>进程
<ul>
<li>进程是程序在内存中执行的实例。</li>
<li>当一个程序被加载到内存中并开始执行时，操作系统会创建一个进程。</li>
<li>进程是动态的，它代表了程序的执行过程。</li>
</ul>
</li>
</ul>

<h5>进程控制块</h5>
<p>操作系统通过 <strong>进程控制块</strong>（PCB，Process Control Block）对进程进行管理。 PCB 中保存了 <strong>操作系统管理进程所需的关键信息</strong>，当发生 <strong>进程切换（上下文切换）</strong> 时，需要将运行进程的状态保存到 PCB 中。</p>
<p>PCB 主要包含以下几类信息：</p>
<p>| 信息类别           | 典型内容                                        |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">内存管理</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/03-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/03-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>内存管理概念</h2>
<h3>一、内存管理</h3>
<h4>1.1 基本概念</h4>
<ul>
<li><a href="https://www.csgraduates.com/constitution_principle/storage/virtual/#%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98" target="_blank" rel="noopener noreferrer"><strong>虚拟地址</strong> 和 <strong>物理地址</strong> 空间</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>内存管理概念</h2>
<h3>一、内存管理</h3>
<h4>1.1 基本概念</h4>
<ul>
<li><a href="https://www.csgraduates.com/constitution_principle/storage/virtual/#%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%92%8C%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98" target="_blank" rel="noopener noreferrer"><strong>虚拟地址</strong> 和 <strong>物理地址</strong> 空间</a></li>
</ul>
<p>虚拟地址（VA, Virtual Address）由指令中的 <strong>地址字段</strong> 给出，进程看到的都是虚拟地址。物理地址是内存单元在 实际内存硬件 中的真实位置。</p>
<ul>
<li><a href="https://www.csgraduates.com/constitution_principle/storage/virtual/#%E5%9C%B0%E5%9D%80%E7%BF%BB%E8%AF%91%E6%9C%BA%E6%9E%84" target="_blank" rel="noopener noreferrer"><strong>地址翻译</strong></a></li>
</ul>
<p>地址翻译指的是在程序执行的过程中 <strong>将虚拟地址翻译为物理地址</strong>，地址变换由 内存管理单元（MMU, Memory Management Unit） 在硬件中完成，速度非常快。</p>
<ul>
<li><strong>内存共享</strong></li>
</ul>
<p>共享内存（Shared Memory）是多个 <strong>进程</strong> 共享的 <strong>内存区域</strong>。它是最快的 <strong>IPC</strong>（进程间通信）机制之一，因为进程直接读写内存，无需进入内核态。但是，因为多个进程可以同时访问这些内存，所以可能需要某种 <strong>同步机制</strong>（如信号量）来防止竞态条件。</p>
<ul>
<li><strong>内存保护</strong></li>
</ul>
<p>内存保护是现代操作系统中的一个 <strong>核心功能</strong>，用于防止一个进程访问另一个进程的 <strong>内存空间</strong>。这不仅保障了系统的稳定性，而且提高了安全性，因为它可以防止恶意软件损害其他进程或篡改其数据。</p>

<p>可以通过如下机制实现内存保护机制：</p>
<ol>
<li>分段与分页：
<ul>
<li><strong>分段</strong>：内存被划分为不同的 <strong>段</strong>，每个段都有其起始地址和长度。段常常用于表示高级的数据结构，如函数或对象。</li>
<li><strong>分页</strong>：内存被划分为固定大小的 <strong>页面</strong>，例如 4KB。操作系统为每个进程维护一个 <strong>页表</strong>，来映射其虚拟地址到物理地址。</li>
</ul>
</li>
<li><strong>访问权限</strong>：每个段或页面都有与之相关的访问权限。例如，一个页面可能被标记为只读，这意味着任何尝试写入该页面的操作都会引发一个异常。</li>
<li><strong>隔离</strong>：由于每个进程都有其独立的地址空间，所以一个进程不能直接访问另一个进程的内存。这为每个进程提供了一种形式的 <strong>隔离</strong>，确保了一个出错的进程不会影响其他进程。</li>
</ol>
<h4>1.2 管理方式分类</h4>
<p>在现代操作系统中，<strong>内存管理方式</strong> 大体可以归纳为两类：<strong>连续分配</strong> 和 <strong>离散分配</strong>。所谓 <strong>连续分配</strong>，是指操作系统为进程分配一整段连续的内存区域。这种方式实现简单、开销较小，但灵活性不足。典型的连续分配方式包括三种：单一连续分配、固定分区分配 以及 动态分区分配。</p>
<p>相比之下，<strong>离散分配</strong> 方式允许进程占用的内存空间是 <strong>不连续的</strong>，这使得内存利用率和管理灵活性显著提高。典型的离散分配方式也包含三种：页式、段式、段页式。</p>

<p>后文会具体介绍这几种内存管理方式的细节。</p>
<h3>二、连续分类管理方式</h3>
<h4>2.1 单一连续分配</h4>

<p>内存在此方式下分为 <strong>系统区</strong> 和 <strong>用户区</strong>，系统区仅供操作系统使用，通常在高地址部分；在用户区内存中，仅有一道用户程序，即整个内存的用户空间都由该程序独占。</p>
<p>这种方式的优点是 <strong>简单、无外部碎片</strong>，无需进行内存保护，因为内存中永远只有一道程序。缺点是只能用于 <strong>单用户、单任务</strong> 的操作系统中，存储器的利用率极低。</p>
<h4>2.2 固定分区分配</h4>

<p>固定分区分配是最简单的一种 <strong>多道程序存储管理</strong> 方式，它将用户内存空间划分为若干 <strong>固定大小的区域</strong>，每个分区只装入一道作业。当有空闲分区时，便可再从外存的后备作业队列中选择适当大小的作业装入该内存，如此循环。</p>
<p>为了方便内存分配，通常将分区按大小排队，并为之建立一张 <strong>分区说明表</strong>，其中各表项包含每个分区的起始地址、大小和状态。当有用户程序需要装入时，便检索该表，以找到合适的分区基于分配并将其状态设置为“已分配”；未找到合适分区时，则拒绝为给程序分配内存。</p>
<h4>2.3 动态分区分配</h4>
<p>在 <strong>固定分区分配</strong> 中，内存被预先划分为若干大小固定的区域。 这种方式实现简单，但也带来了一个明显问题：<strong>分区大小是静态的，而作业大小是动态的</strong>。</p>
<p>为了解决固定分区“尺寸僵化、内存利用率低”的问题，操作系统引入了 <strong>动态分区分配</strong>。</p>
<p>动态分区分配的基本思想是： <strong>不再事先划分固定大小的分区</strong>，而是将整个用户内存空间视为一块 <strong>连续的可分配区域</strong>，在程序装入时才根据其实际需要动态地划分内存。</p>
<p>当进程请求内存时，操作系统从当前的空闲内存中划出一块连续区域分配给该进程； 当进程结束或释放内存时，该区域重新成为空闲内存，可供后续进程再次使用。</p>

<p>通过这种 <strong>动态、按需分配</strong> 的方式，内存从逻辑上被划分为两类区域：</p>
<ul>
<li><strong>已分配区</strong>：正在被内核或进程占用的内存</li>
<li><strong>空闲区</strong>：尚未分配、可供后续进程使用的内存</li>
</ul>
<p>如下图所示，其中 <strong>内核内存（kernel memory）</strong> 和 <strong>进程内存（process memory）</strong> 属于已分配区域，其余部分为系统当前的空闲内存。</p>

<p>为了管理这些不断变化的空闲区域，操作系统通常维护一张 <strong>空闲分区表</strong>（或空闲链表），用于记录每一块空闲内存的：</p>
<ul>
<li>起始地址</li>
<li>大小</li>
</ul>
<p>示意如下：</p>

<p>当进程申请内存时，操作系统会遍历 <strong>空闲分区表</strong>，按照预定的 <strong><a href="https://www.csgraduates.com/operating_system/memory/concepts/#%E9%80%82%E5%BA%94%E7%AE%97%E6%B3%95" target="_blank" rel="noopener noreferrer">适应算法</a></strong>（如首次适应、最佳适应等），从中选择一块满足需求的空闲区域，并完成内存分配。</p>
<blockquote>
<p>不同适应算法的选择，会直接影响系统中 <strong>外部碎片</strong> 的产生情况，这一点将在后续章节中详细讨论。</p>
</blockquote>
<h5>内存碎片</h5>
<p>动态分区分配相比固定分区分配，提高了内存使用率，但是仍然无法避免内存碎片的问题，下图以一个实例说明了在动态分区分配过程中内存碎片产生的过程：</p>

<p>由于各进程所需的内存大小各不相同，在进行内存分配时经常会在已分配的块之间留下 <strong>内存碎片</strong>。</p>
<p>所谓内存碎片，指的是那些 <strong>尺寸过小、无法满足任何进程实际需求</strong> 的空闲内存块。因为进程的内存申请往往大于等于某个最小阈值，这些零散且容量不足的碎片就无法被再次利用，导致可用内存实际被浪费。</p>
<h5>适应算法</h5>
<p>内存空间中的空闲区域可能大小不一，且分布在内存中不同的位置，操作系统使用 <strong>空闲块表</strong> 来记录这些空闲区域的信息。</p>
<p>当进程申请一块新的内存时，必须从已有的空闲空间中选出一块分配给进程。动态分区的分配策略主要包含四种算法：<strong>首次适应</strong>（First Fit）、<strong>临近适应</strong>（Next Fit）、<strong>最佳适应</strong>（Best Fit）、<strong>最坏适应</strong>（Worst Fit）。</p>


<ul>
<li>First Fit（首次适应）：从头遍历空闲块表，<strong>找到第一个足够的空闲块</strong> 分配给进程。</li>
<li>Next Fit（临近适应）：<strong>从上次分配的位置的下一个位置开始查找</strong>，找到的第一个足够大的分区分配给进程。如果到了表尾没找到，就从头循环，直到找到或遍历一圈失败。</li>
<li>Best Fit（最佳适应）：遍历整个空闲块表，找到一个 <strong>利用率最高</strong> 的空闲块给进程。</li>
<li>Worst Fit（最坏适应）：与最佳适应的目标相反，找到一个 <strong>利用率最低</strong> 的空闲块给进程。</li>
</ul>

<p>适应算法中的利用率计算</p>
<p>假设进程申请的内存大小为 <strong>P</strong>，空闲块大小为 <strong>F</strong>，则利用率为：</p>
<p></p>
<p>举个实例例子，假设空闲块序列 <code>[8, 22, 20, 14, 10, 24]</code>，请求大小 <strong>P = 16</strong>。则四种分配算法会得到不同的结果：</p>

<p>四种适应算法在该例子的对比如下表所示：</p>
<p>| 算法                      | 查找方式                                                     | 本例选择结果                                                 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">文件管理</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/04-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/04-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>文件</h2>
<h3>一、文件元信息</h3>
<p>在 <strong>UNIX</strong> 和类 <strong>UNIX</strong> 操作系统中，inode（索引节点）用于存储 <strong>文件的元数据</strong>，它包含了关于该文件的大部分 <strong>元数据</strong>，但不包括 <strong>文件名</strong> 和 <strong>文件实际内容</strong>。</p>

<p>inode 中包含如下信息：</p>
<ul>
<li><strong>文件类型</strong>：文件是普通文件、目录还是链接文件等。</li>
<li><strong>权限</strong>：文件的访问控制信息，如用户、组和其他用户的读、写、执行权限。</li>
<li><strong>所有者</strong>：文件的所有者和组 ID。</li>
<li><strong>大小</strong>：文件的大小（字节数）。</li>
<li><strong>时间戳</strong>：文件的创建时间、最后修改时间和最后访问时间。</li>
<li><strong>链接计数</strong>：指向该文件的硬链接数量。当计数为 0 时，文件会被删除。</li>
<li><strong>数据块指针</strong>：文件内容所在的数据块（block）的位置信息。这包括直接指针、间接指针、二级间接指针和三级间接指针，用于指向存储文件内容的磁盘块。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>文件</h2>
<h3>一、文件元信息</h3>
<p>在 <strong>UNIX</strong> 和类 <strong>UNIX</strong> 操作系统中，inode（索引节点）用于存储 <strong>文件的元数据</strong>，它包含了关于该文件的大部分 <strong>元数据</strong>，但不包括 <strong>文件名</strong> 和 <strong>文件实际内容</strong>。</p>

<p>inode 中包含如下信息：</p>
<ul>
<li><strong>文件类型</strong>：文件是普通文件、目录还是链接文件等。</li>
<li><strong>权限</strong>：文件的访问控制信息，如用户、组和其他用户的读、写、执行权限。</li>
<li><strong>所有者</strong>：文件的所有者和组 ID。</li>
<li><strong>大小</strong>：文件的大小（字节数）。</li>
<li><strong>时间戳</strong>：文件的创建时间、最后修改时间和最后访问时间。</li>
<li><strong>链接计数</strong>：指向该文件的硬链接数量。当计数为 0 时，文件会被删除。</li>
<li><strong>数据块指针</strong>：文件内容所在的数据块（block）的位置信息。这包括直接指针、间接指针、二级间接指针和三级间接指针，用于指向存储文件内容的磁盘块。</li>
</ul>
<h3>二、进程文件管理</h3>
<p>在进程中可能会打开若干文件，操作系统需要以某种方式对进程打开的文件信息进行记录。这就需要用到三个数据结构：<strong>文件描述符表</strong>、<strong>文件表</strong>、<strong>inode 表</strong>。</p>
<ul>
<li><strong>文件描述符表</strong>（File Descriptor Table）：每个进程都有自己的 <strong>文件描述符表</strong>，这个表对应于该进程打开的文件描述符。文件描述符是进程范围内的一个小的非负整数。</li>
<li><strong>文件打开表</strong>（Open File Table）：操作系统维护一个 <strong>全局的</strong> 文件打开表，该表记录了所有打开文件的状态信息。每次 <code>open</code> 调用成功时，都会创建一个新的 <strong>文件打开表条目</strong>。</li>
<li><strong>INode 表</strong>（INode Table）：系统还维护了一个 <strong>inode 表</strong>，该表包含了文件的元数据和指向文件实际数据的指针。如果多个进程打开同一个文件，它们的 <strong>文件打开表条目</strong> 将指向 <strong>inode 表</strong> 中的同一 <strong>inode</strong>。</li>
</ul>
<h4>2.1 inode表</h4>
<p><strong>inode 表</strong>（inode table）是一个固定的、专门的区域，用来存储文件系统中所有文件和目录的 <strong>inode</strong> 结构。每个 <strong>inode</strong> 占用一个表项，表中的每个 <strong>inode</strong> 编号（inode number）对应一个唯一的文件或目录。</p>
<p>注意 <strong>inode 表是存储所有 inode 的唯一容器</strong>：</p>
<ul>
<li>每个文件/目录都有一个唯一的 <strong>inode 编号</strong></li>
<li>文件系统通过该编号在 <strong>inode 表</strong> 中找到对应的 <strong>inode</strong></li>
</ul>
<p>下表给出了一个简化的 <strong>inode 表</strong>示例：</p>
<p>| inode 编号 | 文件类型 | 权限       | 所有者 | 文件大小 (字节) | 数据块指针（简略）       | 创建时间         | 修改时间         |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">I/O管理</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/05-IO%E7%AE%A1%E7%90%86.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/05-IO%E7%AE%A1%E7%90%86.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>I/O设备</h2>
<h3>一、I/O接口类型</h3>

<p>根据设备类型的不同，我们将 <a href="https://www.csgraduates.com/constitution_principle/bus/io/#io-%E6%8E%A5%E5%8F%A3" target="_blank" rel="noopener noreferrer">I/O 接口</a> 分为三种类型：</p>
<ol>
<li><strong>块设备</strong>：</li>
</ol>
<p>块设备（Block Device）是计算机中一类以 <strong>固定大小的数据块</strong> 为单位进行数据读写的 I/O 设备，通常用于存储和检索大量数据。它们 <strong>支持随机访问</strong>，意味着可以直接定位到任意数据块，而无需按顺序读取。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>I/O设备</h2>
<h3>一、I/O接口类型</h3>

<p>根据设备类型的不同，我们将 <a href="https://www.csgraduates.com/constitution_principle/bus/io/#io-%E6%8E%A5%E5%8F%A3" target="_blank" rel="noopener noreferrer">I/O 接口</a> 分为三种类型：</p>
<ol>
<li><strong>块设备</strong>：</li>
</ol>
<p>块设备（Block Device）是计算机中一类以 <strong>固定大小的数据块</strong> 为单位进行数据读写的 I/O 设备，通常用于存储和检索大量数据。它们 <strong>支持随机访问</strong>，意味着可以直接定位到任意数据块，而无需按顺序读取。</p>
<p>典型例子包括<a href="https://www.csgraduates.com/constitution_principle/storage/storage/#%E6%9C%BA%E6%A2%B0%E7%A1%AC%E7%9B%98" target="_blank" rel="noopener noreferrer">机械硬盘</a>（HDD）、<a href="https://www.csgraduates.com/constitution_principle/storage/storage/#%E5%9B%BA%E6%80%81%E7%A1%AC%E7%9B%98" target="_blank" rel="noopener noreferrer">固态硬盘</a>（SSD）和 USB 闪存盘。<strong>块设备</strong> 的 <em>数据传输速率较高</em>，但涉及复杂的控制器和协议（如 SATA 或 NVMe)，因此在操作系统中通常由专门的驱动程序管理。</p>
<ol start="2">
<li><strong>字符设备</strong>：</li>
</ol>
<p>字符设备是另一类 I/O 设备，以 <strong>连续的字符流</strong> 形式进行数据传输，不支持随机访问，也不依赖数据块的概念。它们通常用于与硬件设备交互，如 <strong>键盘</strong>、<strong>鼠标</strong>、<strong>串口终端</strong> 或 <strong>打印机</strong>。字符设备的数据流是顺序的，适合实时或低速数据传输场景。</p>
<p>例如，键盘输入的字符流直接发送到系统，而无需缓存整个数据块。字符设备在操作系统中通常通过简单的驱动程序管理，且不涉及文件系统，适合处理非结构化数据。</p>
<ol start="3">
<li><strong>网络设备</strong>：</li>
</ol>
<p>网络设备是专门用于计算机网络通信的 I/O 设备，负责在计算机与网络之间传输 <strong>数据包</strong>。它们包括<a href="https://www.csgraduates.com/computer_network/physical/dev/#%E7%BD%91%E7%BB%9C%E9%80%82%E9%85%8D%E5%99%A8" target="_blank" rel="noopener noreferrer">网络适配器</a> 和调制解调器等设备。网络设备 <strong>以数据包为单位</strong> 工作，通常通过协议栈（如 TCP/IP) 处理数据，支持点对点或广播通信。</p>
<p>与块设备和字符设备不同，网络设备更注重 <strong>数据的高速传输</strong> 和 <strong>实时性</strong>，常涉及中断机制和 <strong>DMA</strong>（直接内存访问）来提高效率。操作系统通过网络驱动程序管理这些设备，以实现网络连接和数据交换。</p>
<h3>二、I/O控制方式</h3>
<p>在计算机系统中，I/O（输入/输出）控制方式决定了 CPU 与外设之间如何协作完成数据传输。主要有三种方式，每种方式在性能、复杂度与使用场景上各有不同：</p>
<ul>
<li><a href="https://www.csgraduates.com/constitution_principle/bus/io/#%E7%A8%8B%E5%BA%8F%E6%9F%A5%E8%AF%A2%E6%96%B9%E5%BC%8F" target="_blank" rel="noopener noreferrer">程序查询方式</a>： 又称“轮询方式”，CPU 主动不断地检查外设状态是否准备好。在设备较少、交互不频繁的场景下实现简单，但会占用大量 CPU 时间，效率较低。</li>
<li><a href="https://www.csgraduates.com/constitution_principle/bus/io/#%E7%A8%8B%E5%BA%8F%E4%B8%AD%E6%96%AD%E6%96%B9%E5%BC%8F" target="_blank" rel="noopener noreferrer">程序中断方式</a>： 外设准备就绪后向 CPU 发出中断信号，CPU 暂停当前任务处理 I/O 操作，相比轮询更高效。适用于响应及时性要求较高的系统，能够显著降低 CPU 的无效等待。</li>
<li><a href="https://www.csgraduates.com/constitution_principle/bus/io/#dma-%E6%96%B9%E5%BC%8F" target="_blank" rel="noopener noreferrer">DMA 方式</a>： 即“直接内存访问”，在数据量大、频繁传输的场景中尤为高效。CPU 只负责启动 DMA 控制器，数据传输过程由 DMA 独立完成，显著提高系统整体效率。</li>
</ul>
<h3>三、I/O软件层次</h3>
<p>I/O 软件层次是计算机系统中用于管理和协调输入输出操作的软件架构，从用户应用程序到硬件设备，分为多个层次，每一层负责特定的功能，确保高效、可靠的 I/O 操作。</p>

<h4>3.1 用户层I/O软件</h4>
<p>用户层 I/O 软件是 I/O 软件体系结构的最上层，直接与用户应用程序交互，<strong>提供标准化的接口</strong> 以便程序能够访问 I/O 设备。</p>
<p>它主要包括库函数和系统调用接口，例如 C 语言中的 stdio 库（提供 printf、scanf 等函数）或 POSIX 系统调用（如 read、write）。这些软件封装了底层的复杂性，让用户程序无需关心具体设备细节即可进行输入输出操作。</p>
<h4>3.2 设备独立性软件</h4>
<p>设备独立性软件位于用户层和设备驱动程序之间，负责屏蔽不同 I/O 设备的硬件差异，提供统一的接口供上层软件使用。它 <strong>实现了设备无关的功能</strong>，例如文件系统管理、设备命名、缓冲管理和错误处理。</p>
<p>例如，操作系统通过设备独立性软件将不同类型的存储设备（如硬盘、USB 驱动器）抽象为统一的文件系统接口，程序只需操作文件路径而无需关心底层设备类型。此外，它还管理设备的分配与释放，避免多个进程同时访问同一设备导致冲突。设备独立性软件的核心作用是提高系统的模块化和可移植性。</p>
<h4>3.3 设备驱动程序</h4>
<p>设备驱动程序是 I/O 软件层次中直接 <strong>与具体硬件设备交互</strong> 的部分，每个设备驱动程序针对特定类型的硬件设备设计，负责将设备独立性软件的通用命令转换为设备能够理解的特定指令。</p>
<p>例如，一个硬盘驱动程序会处理扇区读写命令，而一个打印机驱动程序可能发送控制字符序列。驱动程序通常由设备制造商提供，运行在操作系统的内核态，能够直接访问设备寄存器和端口。由于硬件设备的多样性，驱动程序需要处理设备初始化、数据传输和错误恢复等任务，是连接软件与硬件的关键桥梁。</p>
<h4>3.4 中断处理程序</h4>
<p>中断处理程序是 I/O 软件层次中 <strong>专门处理硬件中断</strong> 的部分，当设备完成操作或发生事件（如数据到达、错误发生）时，<strong>硬件会触发中断信号</strong>，中断处理程序迅速响应以处理这些事件。它运行在极低的层次，通常以极高的优先级执行，负责保存中断现场、处理设备状态、通知上层软件或触发后续操作。</p>
<p>例如，当网卡接收到 <strong>数据包</strong> 时，中断处理程序会将数据移到内存并通知网络协议栈。由于中断处理需要极快的响应速度，代码通常高度优化且精简，尽量减少处理时间，以避免影响系统性能。</p>
<h4>3.5 硬件</h4>
<p>硬件是 I/O 软件层次的最底层，直接负责 <strong>执行物理 I/O 操作</strong>，包括实际的设备控制器、寄存器、端口和数据传输通道。硬件层由具体的 I/O 设备（如硬盘、键盘、网络适配器）及其控制器组成，控制器通过寄存器和端口接收驱动程序的指令，执行数据读写或状态查询等操作。</p>
<p>例如，硬盘控制器通过 <strong>DMA</strong>（直接内存访问）将数据直接传输到内存，而网卡通过硬件队列处理 <strong>数据包</strong>。硬件层的性能和特性直接决定了 I/O 操作的效率，软件层的所有操作最终都依赖硬件的物理实现。</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">操作系统</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/01-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0.html" target="_blank">操作系统概述</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/02-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86.html" target="_blank">进程管理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/03-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.html" target="_blank">内存管理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/04-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.html" target="_blank">文件管理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/05-IO%E7%AE%A1%E7%90%86.html" target="_blank">IO管理</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/01-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0.html" target="_blank">操作系统概述</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/02-%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86.html" target="_blank">进程管理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/03-%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86.html" target="_blank">内存管理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/04-%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.html" target="_blank">文件管理</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/03-%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/05-IO%E7%AE%A1%E7%90%86.html" target="_blank">IO管理</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">计算机网络体系结构</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>分层结构</h2>
<h3>一、ISO/OSI模型</h3>
<p><strong>OSI 参考模型</strong> 有 <em>7 层</em>，自下而上依次为：物理层、数据链路层、网络层、传输层、会话层、表示层、应用层（记忆：物链网输会示用）</p>
<p>低三层统称为 <strong>通信子网</strong>，它是为了联网而附加的通信设备，完成数据的传输功能</p>
<p><strong>传输层</strong> 承上启下</p>
<p>高三层统称为 <strong>资源子网</strong>，它相当于计算机系统，完成数据的处理等功能。</p>
<p></p>
<h4>1.1 物理层</h4>]]></summary>
    <content type="html"><![CDATA[
<h2>分层结构</h2>
<h3>一、ISO/OSI模型</h3>
<p><strong>OSI 参考模型</strong> 有 <em>7 层</em>，自下而上依次为：物理层、数据链路层、网络层、传输层、会话层、表示层、应用层（记忆：物链网输会示用）</p>
<p>低三层统称为 <strong>通信子网</strong>，它是为了联网而附加的通信设备，完成数据的传输功能</p>
<p><strong>传输层</strong> 承上启下</p>
<p>高三层统称为 <strong>资源子网</strong>，它相当于计算机系统，完成数据的处理等功能。</p>
<p></p>
<h4>1.1 物理层</h4>
<p>物理层的传输单位是 <strong>比特</strong>，功能是在物理媒体上为数据端设备透明地传输原始比特流，不用参与数据封装工作。为了实现该功能，物理层需要定义 <strong>硬件设备标准</strong>，如电缆类型、接口类型、电压标准等。</p>
<h4>1.2 数据链路层</h4>
<p>数据链路层的传输单位是 <strong>帧</strong>，两台主机之间的数据传输总是在一段一段的链路上传送的，这就需要使用专门的链路层协议。</p>
<p>数据链路层将网络层交来的 IP 分组封装成帧，并且可靠地传输到相邻结点的网络层。主要作用是加强物理层传输原始比特流的功能，将物理层提供的可能出错的物理连接改造为尽可能可靠的 <strong>数据链路</strong>。数据链路层的功能可以概括为：<strong>物理寻址</strong>、<strong>组帧</strong>、<strong>差错控制</strong>、点对点流量控制、数据重发和传输管理等。</p>
<h4>1.3 网络层</h4>
<p><strong>网络层</strong>（Netweork Layer）的传输单位是 <strong>数据报</strong>，它关心的是通信子网的运行控制，主要任务是把网络层的 <strong>协议数据单元</strong>（分组）从源端传到目的端，为分组交换网上的不同主机提供通信服务。关键问题是对分组进行 <strong>路由选择</strong>，并实现整个网络的流量控制。</p>
<h4>1.4 传输层</h4>
<p><strong>传输层</strong>（Transport Layer）的传输单位是报文段或用户数据报，传输层负责主机中两个进程之间的通信，功能是为 <strong>端到端</strong> 连接提供可靠的传输服务，为 <strong>端到端</strong> 连接提供流量控制（端到端）、差错控制、服务质量、数据传输管理等服务。</p>
<p>数据链路层提供的是 <strong>点到点</strong> 的通信，传输层提供的是 <strong>端到端</strong> 的通信，两者不同。点到点 可以理解为主机到主机之间的通信；端到端的通信是指运行在 <strong>不同主机内的两个进程之间的通信</strong>，只有传输层及以上各层的通信才能称为端到端。</p>
<h4>1.5 会话层</h4>
<p><strong>会话层</strong>（Session Layer）允许不同主机上的各个进程之间进行会话。这 <strong>会话</strong> 这种服务主要为用户进程建立连接，并在连接上有序地传输数据，这就是 会话。</p>
<p>会话层负责管理主机间的会话进程，包括建立、管理及终止进程间的 <strong>检查点</strong> 机制来维持可靠会话，使通信会话在通信失效时从检查点继续恢复通信，即断点下载的原理。</p>
<h4>1.6 表示层</h4>
<p><strong>表示层</strong> 主要处理在两个通信系统中交换信息的表示方式。不同机器采用的 <strong>编码</strong> 和表示方法不同，使用的数据结构也不同。为了使不同表示方法的数据和信息之间能互相交换，表示层采用抽象的标准方法定义数据结构，并采用标准的 <strong>编码</strong> 形式。此外，<strong>数据压缩</strong>、加密和解密 也是表示层的功能。</p>
<h4>1.7 应用层</h4>
<p>应用层是 OSI 参考模型的最高层，是用户与网络的接口。应用层为特定类型的网络应用提供访问 OSI 参考模型环境的手段。因为用户的实际应用多种多样，这就要求 <strong>应用层</strong> 采用不同的应用 <strong>协议</strong> 来解决不同类型的应用要求，因此 <strong>应用层</strong> 是最复杂的一层，使用的 <strong>协议</strong> 也最多</p>
<h3>二、TCP/IP模型</h3>
<p><strong>TCP/IP 模型</strong> 有4层 ，从低到高依次为：网络接口层、网际层、传输层、应用层</p>
<ul>
<li><strong>网络接口层</strong>：对应 <strong>OSI 参考模型</strong> 中的物理层和数据链路层</li>
<li><strong>网际层</strong>、<strong>传输层</strong> 和 <strong>应用层</strong>：对应 <strong>OSI 参考模型</strong> 中的会话层、表示层和应用层）</li>
<li><strong>TCP/IP</strong> 由于得到广泛应用而成为事实上的国际标准</li>
</ul>
<p><strong>TCP/IP 模型</strong> 的层次结构如下图所示：</p>
<p></p>
<p><strong>TCP/IP 模型</strong> 与 <strong>OSI 模型</strong> 的不同点在于 <strong>网络接口层</strong> 和 <strong>应用层</strong>，可以理解为 <strong>TCP/IP 模型</strong> 中这两层涵盖了 <strong>OSI 协议</strong> 中多层的功能：</p>
<p></p>
<p>学习计算机网络时，我们往往采取折中的办法，即综合 <strong>OSI 参考模型</strong> 和 <strong>TCP/IP 模型</strong> 的优点，采用一种如下图所示的只有 <strong>5 层协议</strong> 的体系结构，即我们所熟知的【物理层、数据链路层、网络层、传输层和应用层】。</p>
<h3>三、协议数据单元</h3>
<p>在网络中，<strong>协议数据单元</strong>（<strong>PDU</strong>，Protocol Data Unit）是指在某一层协议中传输的数据单元。每一层在接收来自上一层的数据时，都会在其头部添加控制信息（称为首部 Header），然后将其当作一个新的 PDU 交给下一层处理。这就是所谓的 <strong>封装</strong> 过程。</p>
<p></p>
<p>| OSI 层级     | PDU 名称                                                     |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">物理层</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02-%E7%89%A9%E7%90%86%E5%B1%82.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02-%E7%89%A9%E7%90%86%E5%B1%82.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>通信概念</h2>
<h3>一、接口特性</h3>
<p>物理层定义了设备之间如何通过电缆、无线等物理媒介进行通信。物理层具有以下四种 <strong>接口特性</strong>：</p>
<ul>
<li>机械特性：描述物理连接设备的外部物理形态和接口规范，主要包括：
<ul>
<li>接口的形状（如RJ45、USB等）</li>
<li>接口的引脚数量和排列顺序</li>
<li>电缆的类型（双绞线、光纤、同轴电缆等）</li>
</ul>
</li>
<li>功能特性：说明各个接口引脚具体的功能，例如：
<ul>
<li>哪个引脚负责发送数据（Tx）</li>
<li>哪个引脚负责接收数据（Rx）</li>
<li>哪些引脚用于控制信号，如握手（RTS/CTS）</li>
</ul>
</li>
<li>过程特性：定义了在数据传输过程中，各种物理信号是如何协作完成数据通信的过程，例如：
<ul>
<li>传输起始与终止的方式</li>
<li>信号同步的机制</li>
<li>比特之间如何区分（串行或并行）</li>
</ul>
</li>
<li>电气特性：规定了物理层信号的 电气属性，包括：
<ul>
<li>电压的幅值（高电平/低电平）</li>
<li>电流大小</li>
<li>信号的传输速率和传输距离</li>
<li>信号的上升沿、下降沿</li>
</ul>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>通信概念</h2>
<h3>一、接口特性</h3>
<p>物理层定义了设备之间如何通过电缆、无线等物理媒介进行通信。物理层具有以下四种 <strong>接口特性</strong>：</p>
<ul>
<li>机械特性：描述物理连接设备的外部物理形态和接口规范，主要包括：
<ul>
<li>接口的形状（如RJ45、USB等）</li>
<li>接口的引脚数量和排列顺序</li>
<li>电缆的类型（双绞线、光纤、同轴电缆等）</li>
</ul>
</li>
<li>功能特性：说明各个接口引脚具体的功能，例如：
<ul>
<li>哪个引脚负责发送数据（Tx）</li>
<li>哪个引脚负责接收数据（Rx）</li>
<li>哪些引脚用于控制信号，如握手（RTS/CTS）</li>
</ul>
</li>
<li>过程特性：定义了在数据传输过程中，各种物理信号是如何协作完成数据通信的过程，例如：
<ul>
<li>传输起始与终止的方式</li>
<li>信号同步的机制</li>
<li>比特之间如何区分（串行或并行）</li>
</ul>
</li>
<li>电气特性：规定了物理层信号的 电气属性，包括：
<ul>
<li>电压的幅值（高电平/低电平）</li>
<li>电流大小</li>
<li>信号的传输速率和传输距离</li>
<li>信号的上升沿、下降沿</li>
</ul>
</li>
</ul>

<h3>二、通信指标</h3>
<h4>2.1 信道</h4>
<p>与 <strong>信道</strong> 相关的概念有四个，需要能够辨别这几个名词：</p>
<ul>
<li><strong>信道 (Channel)</strong>：是指进行信息传输的媒介或路径。这可能是一个物理的媒介，例如电缆，或者是无线的，如无线电波。</li>
<li><strong>信号 (Signal)</strong>：是载有信息的物理现象。例如，电信号、光信号或无线电波。</li>
<li><strong>信源 (Source)</strong>：产生或发送信息的设备或实体。</li>
<li><strong>信宿 (Sink or Destination)</strong>：是指接收信息的设备或实体。</li>
</ul>
<p></p>
<h4>2.2 码元</h4>
<p>一个 <strong>码元</strong>（symbol）就是一个脉冲信号，一个脉冲信号有可能携带 1bit 数据，也有可能携带 2bit 数据、4bit 数据。</p>
<p>那么怎么实现一个脉冲信号就能携带多个 bit 数据呢？我们可以通过 <strong>调制技术</strong> 来实现，比如设置模拟信号中信号的频率、相位、<strong>振幅</strong> 等。</p>
<p>举个例子：把 <strong>振幅</strong> 分成四种，低（00）、中（01）、高（10）、很高（11），这样我发一个脉冲信号，它的振幅是低，那就说明发送的是 00（也就是 2bit），它的振幅是中（01），发送的就是 01（也就是 2bit）… 以此类推</p>
<p></p>
<h4>2.3 波特</h4>
<p>波特（Baud）是数据通信中的一个术语，用来表示符号（或码元）传输速率。具体来说，<strong>波特率</strong>（Baud rate）指的是每秒钟传输的码元（symbol）的数量。</p>
<p>码元和 <strong>波特率</strong>：一个码元可以携带一个或多个比特的信息。<strong>波特率</strong>是指每秒钟传输多少个这样的码元。例如，如果 <strong>波特率</strong> 为 1000 波特，这意味着每秒可以传输 1000 个码元。</p>
<p><strong>波特率</strong> 与 <strong>比特率</strong>：<strong>波特率</strong>和<strong>比特率</strong>的关系取决于每个码元携带的比特数。</p>
<ul>
<li>一个码元能携带 1bit 数据，那么 <strong>比特率</strong> = <strong>波特率</strong>。</li>
<li>一个码元能携带 2bit 数据，那么 <strong>比特率</strong> = 2 倍的 <strong>波特率</strong>。</li>
<li>一个码元能携带 4bit 数据，那么 <strong>比特率</strong> = 4 倍的 <strong>波特率</strong>。</li>
</ul>
<p></p>
<h4>2.4 速率</h4>
<p><strong>速率</strong>（Rate）是指连接到计算机网络上的节点在数字信道上传送数据的速率，也称数据传输速率、数据率或比特率，单位为 b/s（比特／秒）或 bit/s（有时也写为 bps )。</p>
<p>当数据率较高时，可用 kb/s（k = 103 ）、Mb/s（M = 106 ）或 Gb/s（G = 109 ）表示。通常把最高数据传输速率称为 <strong>带宽</strong>。</p>
<p><strong>速率</strong>可以用两种指标来衡量：</p>
<ul>
<li><strong>比特率</strong>：每秒传输的比特数量</li>
<li><strong>波特率</strong>：每秒传输的波特数量</li>
</ul>
<p>一个码元可以包含多个比特，如果一个码元携带 <em>n</em> 比特的信息量，则 <strong>波特率</strong> M 对应的 <strong>比特率</strong> 为 <em>M**n</em> bit/s</p>
<h4>2.5 带宽</h4>
<p><strong>带宽</strong>（Bandwidth）在通信领域中，指通信线路能够通过的信号频率范围，单位为赫兹（Hz）。 在计算机网络中，<strong>带宽</strong>通常被引申为通信线路的数据传输能力，即数字信道所能达到的 <strong>最大数据传输速率</strong>，其单位为比特每秒（b/s）。</p>
<p><strong>例子</strong>：如果家里的宽带带宽是 <strong>100Mb/s</strong>，表示网络在理想情况下，每秒最多可以传输 <strong>100兆比特</strong> 的数据，相当于大约 <strong>12.5MB/s</strong> 的下载速度。</p>
<p>在考题中偶尔涉及到带宽和吞吐量的区别：</p>
<ul>
<li><strong>带宽</strong>：理论上的最大传输速率，就像是一条高速公路的最大车道数。</li>
<li><strong>吞吐量</strong>：实际传输速率，受到网络拥塞、协议开销、设备性能等因素影响，往往低于带宽。</li>
</ul>
<p><strong>举例</strong>：虽然网络带宽是 100Mb/s，但在高峰时段可能只能达到 70Mb/s，这 70Mb/s 就是实际的吞吐量。</p>
<h4>2.6 时延</h4>
<p><strong>时延</strong>（Delay）指数据（一个报文或分组）从网络（或链路）的一端传送到另一端所需要的总时间，它由 4 个部分构成，分别为：发送时延、传播时延、处理时延和排队时延。</p>
<p></p>
<ol>
<li>
<p><strong>发送时延</strong>：也称 <strong>传输时延</strong>。节点将分组的所有比特推向（传输）链路所需的时间，即从发送分组的第一个比特算起，到该分组的最后一个比特发送完毕所需的时间。</p>
<ul>
<li>发送时延 = 分组长度 (bit) / 发送速率 (bit/s)</li>
</ul>
</li>
<li>
<p><strong>传播时延</strong>：电磁波在信道（传输介质）中传播一定的距离需要花费的时间，即一个比特从链路的一端传播到另一端所需的时间。</p>
<ul>
<li>传播时延 = 信道长度 (m) / 电磁波在信道上的传播速率 (m/s)</li>
</ul>
</li>
<li>
<p><strong>处理时延</strong>：数据在交换结点为存储转发而进行的一些必要的处理所花费的时间。例如，分析分组的首部、从分组中提取数据部分、进行差错检验或查找适当的路由等。</p>
</li>
<li>
<p><strong>排队时延</strong>：分组在进入路由器后要先在输入队列中排队等待处理。路由器确定转发端口后，还要在输出队列中排队等待转发，这就产生了 <strong>排队时延</strong>。</p>
</li>
</ol>
<p>因此，数据在网络中经历的总时延就是以上 4 部分时延之和：总时延＝发送时延＋传播时延＋处理时延＋排队时延。</p>
<p>注意：需要区分 <strong>传输时延</strong> 和 <strong>传播时延</strong>。<strong>传输时延</strong>是路由器将分组推出所需的时间，是分组长度和链路传输速率的函数。<strong>传播时延</strong>是一个比特从一台路由器传播至另一台路由器所需的时间，是两台路由器之间距离的函数，而与分组长度或链路传输速率无关。</p>
<h4>2.7 时延带宽积</h4>
<p><strong>时延带宽积</strong>（Bandwidth-Delay Product，简称 BDP）指发送端发送的第一个比特即将到达终点时，发送端已经发出了多少个比特，因此又称以比特为单位的链路长度，即：<strong>时延带宽积=传播时延×信道带宽</strong></p>
<p>如下图所示，考虑一个代表链路的圆柱形管道，其长度表示链路的传播时延，横截面积表示链路带宽，则 <strong>时延带宽积</strong> 表示该管道可以容纳的比特数量。</p>
<p></p>
<h3>三、奈奎斯特定理</h3>
<p></p>
<p><strong>奈奎斯特定理</strong> 说明了在 <strong>无噪声干扰、带宽有限</strong> 的理想低通信道中的数据极限传输速率。当实际传输速率小于等于该速率时，可以实现无码间串扰的数据传输。</p>
<p>奈奎斯特定理的 <strong>核心思想</strong> 是： 即使在没有噪声的理想信道中，信道的带宽仍然限制了其数据传输能力。为了避免相邻码元之间的干扰（即码间串扰），每秒钟最多只能传输有限数量的码元，这个数量与带宽直接相关。</p>
<p></p>
<p>其中：</p>
<ul>
<li><em>C</em> 是信道容量，单位是比特每秒 (bps)，表示无噪声条件下的最大传输速率；</li>
<li><em>W</em> 是信道带宽，单位是赫兹 (Hz)，表示信道允许通过的最高频率范围；</li>
<li><em>V</em> 是每个码元可采用的不同离散电平数量；</li>
<li>log2 <em>V</em> 表示每个码元可以携带的比特数（因为 <em>V</em> 种电平可以表示 log2<em>V</em> 比特信息）；</li>
<li>2<em>W</em> 表示每秒最多传输的码元数（波特率，baud/s）。</li>
</ul>
<p>公式中的含义：</p>
<ol>
<li>带宽 (<em>W</em>) 越大，单位时间内可传输的码元数越多；</li>
<li>每个码元的电平数 (<em>V</em>) 越多，所携带的信息量越大。</li>
</ol>
<p><em>因此，在理想无噪声信道中，<strong>极限传输速率取决于带宽和码元的离散电平数</strong>。</em></p>
<h3>四、香浓定理</h3>
<p></p>
<p><strong>香农定理</strong> 说明了在 <strong>有噪音干扰、带宽有限</strong> 的信道中的数据极限传输速率，当实际传输速率小于等于改速率时，可以做到不产生误差。</p>
<p>香农定理的 <strong>核心思想</strong> 是： 即使信道中存在噪声，只要信息传输速率低于某个极限值（即信道容量），就一定可以通过某种编码方式实现几乎无差错的传输。这个极限值取决于信道的带宽和 <strong>信噪比</strong>。</p>
<p></p>
<p>其中：</p>
<ul>
<li><em>C</em> 是信道容量，单位是比特每秒 (bps)，表示信道理论上的最大传输速率。</li>
<li><em>B</em> 是信道带宽，单位是赫兹 (Hz)，表示信道可用的频率范围。</li>
<li><em>S</em> 是信号功率，表示信号的强度。</li>
<li><em>N</em> 是噪声功率，表示信道中噪声的强度。</li>
<li><em>N</em>/<em>S</em> 是 <strong>信噪比</strong>（Signal-to-Noise Ratio, SNR），通常以线性形式表示（不是分贝 dB）。</li>
</ul>
<p>公式中的含义：</p>
<ol>
<li>带宽 ( <em>B</em> ) 越大，信道容量 ( <em>C</em> ) 越大：这意味着更宽的信道可以传输更多的数据。</li>
<li><strong>信噪比</strong> ( <em>N</em>/<em>S</em> ) 越大，信道容量 ( <em>C</em> ) 越大：这意味着信号相对于噪声越强，传输速率就越高。</li>
</ol>
<p></p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">数据链路层</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/03-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/03-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>组帧</h2>
<p>数据链路层的主要功能之一就是 <strong>组帧</strong>。</p>
<p>帧（frame）代表数据链路层的数据发送单位，在接收到来自于网络层的报文（packet）时如何为其添加帧头和帧尾，并且以何种方式进行 <strong>帧定界</strong>（接收方区别连续不同的帧）。</p>

<p><strong>组帧</strong>的关键就在于 <strong>帧定界</strong>，也就是对于接收方来说，它能够以某种方式区分连续收到的不同帧。
从这个角度出发，<strong>组帧</strong> 方式可以被分为以下几种：</p>
<h3>一、字符计数法</h3>]]></summary>
    <content type="html"><![CDATA[
<h2>组帧</h2>
<p>数据链路层的主要功能之一就是 <strong>组帧</strong>。</p>
<p>帧（frame）代表数据链路层的数据发送单位，在接收到来自于网络层的报文（packet）时如何为其添加帧头和帧尾，并且以何种方式进行 <strong>帧定界</strong>（接收方区别连续不同的帧）。</p>

<p><strong>组帧</strong>的关键就在于 <strong>帧定界</strong>，也就是对于接收方来说，它能够以某种方式区分连续收到的不同帧。
从这个角度出发，<strong>组帧</strong> 方式可以被分为以下几种：</p>
<h3>一、字符计数法</h3>
<p><strong>字符计数法</strong> 是在帧的首部设置一个计数字段，用来指示该帧中包含的字符（或字节）数量。</p>
<p>当接收方开始读取一帧时，首先读取位于 <strong>帧首部的计数字段</strong>。通过该字段的数值，接收方即可知道该 <strong>帧的总长度</strong>（即后续应读取的字符数）。随后，接收方按照得到的长度继续读取剩余的数据，直至完整地接收完本帧。</p>
<p></p>
<h3>二、首位定界字符法</h3>
<p>首位定界字符法即 <strong>使用特殊控制字符标志帧的开始和结束</strong>。</p>
<p>但是使用这种方式可能出现如下问题：就是 <strong>首位定界字符</strong> 可能会在帧内部出现，这个时候就会造成歧义。</p>
<p>所以当特殊字符出现在帧的数据部分时，需要用 <strong>转义字符</strong> <code>ESC</code> 来对特殊字符进行转义，同样，<code>ESC</code> 出现在数据部分同样需要转义。</p>

<p>以上图为例，假设我们使用 <strong>FLAG</strong> 作为 <strong>首位定界字符</strong> 的话（注意这里 FLAG 只是字符名称，不是表示字符是 FLAG），那么当 FLAG 出现在数据部分时，我们需要对 FLAG 进行转义，需要注意的是，因为我们使用 <strong>ESC</strong> 作为转义字符，所以当数据中出现 <strong>ESC</strong> 时，我们也需要对转义字符自己进行转义。</p>
<h3>三、零比特填充法</h3>
<p><strong>零比特填充法</strong>（Bit Stuffing）与首位定界字符法思路类似。</p>
<p>用 <code>01111110</code> 作为一个新的数据帧的开头，这里的关键在于要对数据帧内容中与 <code>01111110</code> 相同的部分进行转义，转义的方式如下：</p>
<ul>
<li>在发送方：
<ul>
<li>每当数据中出现 连续 5 个 <code>'1'</code> 时，</li>
<li>就自动插入一个 <code>'0'</code>，避免形成 6 个连续的 <code>'1'</code>（即避免形成 <code>01111110</code>）。</li>
</ul>
</li>
<li>在接收方：
<ul>
<li>每当检测到 连续 5 个 <code>'1'</code> 后跟着一个 <code>'0'</code>，就去掉这个 <code>'0'</code>，还原原始数据。</li>
<li>在传送的比特流中可以传送任意比特组合，而不会引起对帧边界的判断错误。<strong>零比特填充法</strong> 很容易由硬件来实现，<em>性能优于字符填充法</em>。</li>
</ul>
</li>
</ul>
<p>对于 <strong>零比特填充法</strong>，需要记住 <code>01111110</code> 这种开头的比特填充方式以及具体如何进行转义。</p>

<h3>四、违规编码法</h3>
<p><strong>违规编码法</strong>（Physcial Layer Coding Violations）使用特殊电平进行定界。比如，<a href="https://www.csgraduates.com/computer_network/physical/encoding/" target="_blank" rel="noopener noreferrer"><strong>曼彻斯特编码</strong></a> 将数据比特“1”编码为“高 - 低”电平，将比特“0”编码为 “低-高” 电平对，而 “高-高” 电平对和 “低-低” 电平对是没有被使用的，所以可以用这两个电平进行帧定界。</p>

]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">网络层</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/04-%E7%BD%91%E7%BB%9C%E5%B1%82.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/04-%E7%BD%91%E7%BB%9C%E5%B1%82.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>IP</h2>
<p>在现实生活中，我们通过“国家‑省份‑城市‑街道‑小区‑楼栋‑门号”等层级信息来定位一个具体地点，例如 中国‑北京市‑海淀区‑某街道‑某小区‑某栋‑某户。</p>
<p>在计算机网络里，定位一台主机同样需要使用唯一的地址，这个地址就是 <strong>IP 地址</strong>。IP（Internet Protocol）直译为“互联网协议”，它既提供了主机的标识，又规定了数据在网络中的传输方式。</p>
<p>仅有地址并不能保证数据能够顺利从源端到达目的端。互联网是一张由无数路由器、交换机等网络设备相互连接而成的全球性网络。从 <strong>一个机器</strong> 到 <strong>另一个机器</strong> 的通信，往往要经过多级转发。如何在众多可能的路径中找到一条通向正确目的地的路线，就需要 <strong>IP 协议</strong> 与路由协议共同配合完成。后续章节我们会逐步剖析这一过程的细节。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>IP</h2>
<p>在现实生活中，我们通过“国家‑省份‑城市‑街道‑小区‑楼栋‑门号”等层级信息来定位一个具体地点，例如 中国‑北京市‑海淀区‑某街道‑某小区‑某栋‑某户。</p>
<p>在计算机网络里，定位一台主机同样需要使用唯一的地址，这个地址就是 <strong>IP 地址</strong>。IP（Internet Protocol）直译为“互联网协议”，它既提供了主机的标识，又规定了数据在网络中的传输方式。</p>
<p>仅有地址并不能保证数据能够顺利从源端到达目的端。互联网是一张由无数路由器、交换机等网络设备相互连接而成的全球性网络。从 <strong>一个机器</strong> 到 <strong>另一个机器</strong> 的通信，往往要经过多级转发。如何在众多可能的路径中找到一条通向正确目的地的路线，就需要 <strong>IP 协议</strong> 与路由协议共同配合完成。后续章节我们会逐步剖析这一过程的细节。</p>
<p>目前 IP 协议有两个版本：</p>
<ol>
<li><strong>IPv4（Internet Protocol Version 4）</strong></li>
<li><strong>IPv6（Internet Protocol Version 6）</strong></li>
</ol>
<p>本文的重点在于深入理解 IPv4 的工作原理和细节。</p>
<h3>一、IPv4地址格式</h3>
<p>IPv4 地址由 4 个字节（即 <strong>32 位</strong>）构成，例如：<code>11000000.10101000.00000100.00000010</code> 就是一个典型的 IPv4 地址的二进制形式。</p>
<h4>1.1 点分十进制</h4>
<p>由于二进制表示不便于人类阅读，IPv4 通常采用 <strong>点分十进制</strong> 的方式进行表示。</p>
<p>在点分十进制中，<strong>每个字节用十进制数表示</strong>，并以点号分隔 4 个字节。例如，上述二进制地址对应的点分十进制形式为 <code>192.168.4.2</code>。</p>
<p></p>
<h4>1.2 网络号与主机号</h4>
<p>IP 地址的设计本质上是为了在互联网中唯一标识一台设备，因此通常被划分为两个部分：</p>
<ul>
<li><strong>网络号（Network ID）</strong>：用于标识设备所在的网络。</li>
<li><strong>主机号（Host ID）</strong>：用于标识该网络中的具体主机。</li>
</ul>

<p>网络号负责确定目标网络，主机号用于在该网络中定位到具体设备。</p>
<h4>1.3 特殊地址</h4>
<p>在 IP 地址的划分中，有些 <strong>主机号</strong> 是保留的，不能被用于分配给普通设备：</p>
<ul>
<li><strong>主机号全为 0</strong>：表示网络本身，不能用于主机。</li>
<li><strong>主机号全为 1</strong>：表示该网络中的广播地址，用于向网络内所有主机发送信息。</li>
</ul>
<p>此外，还有以下两个特殊的全局地址：</p>
<ul>
<li><strong><code>0.0.0.0</code></strong>：表示“本机”，通常用于设备尚未获得 IP 地址时的占位。</li>
<li><strong><code>255.255.255.255</code></strong>：称为“本地广播地址”，用于向本地网络中的所有设备广播数据。</li>
</ul>
<h3>二、IPv4首部</h3>
<p>IP 协议位于 OSI 7 层模型的网络层，其承载上层（传输层）的数据，对其进行 <strong>封装</strong>，然后传递给下层（数据链路层）进行进一步的处理。</p>
<p>封装的具体过程就是为 传输层的数据 加上 IP 协议的首部的二进制表示，IPv4 的首部的 逻辑格式 如下图所示，其中包含多个字段，长度通常为 <strong>20 个字节</strong>。</p>

<p>这一小节简单介绍各个字段，帮助大家建立一个粗略的了解，部分字段的细节我会在后面几个小节详解说明。</p>
<ol>
<li>版本（Version）：
<ul>
<li>4 位字段，用于指定 IP 协议版本，IPv4 的版本为 4。</li>
</ul>
</li>
<li>头部长度（Header Length）：
<ul>
<li>4 位字段，用于指示 IPv4 首部的长度，以 4 字节为单位。由于 IPv4 首部的固定部分长度为 20 字节，因此这个字段的值通常是 5（即该字段二进制表示为 <code>0101</code>，<code>5 * 4（4 字节为单位） = 20</code>，最终表示的长度为 20）。</li>
</ul>
</li>
<li>服务类型（Type of Service）：
<ul>
<li>8 位字段，用于指定数据报的服务质量（Quality of Service，QoS），包括优先级、延迟、吞吐量等。</li>
</ul>
</li>
<li>总长度（Total Length）：
<ul>
<li>16 位字段，指定整个 IPv4 数据报（包括首部和数据部分）的总长度，以字节为单位。最大值为 <em>65535 字节</em>。</li>
</ul>
</li>
<li>标识（Identification）：
<ul>
<li>16 位字段，用于唯一标识数据报。通常在数据报分片时用于重新组装数据报。</li>
</ul>
</li>
<li>标志（Flags）：3 位字段，包括以下标志：
<ul>
<li>最左边位：保留为 0，未使用。</li>
<li>DF（Don’t Fragment）：
<ul>
<li>如果设置为 1，表示数据报不允许分片。当路由器发现需要分片才能转发时，则路由器会丢弃该数据报，并发送一个 ICMP 错误消息（“Fragmentation Needed and DF Set”）返回给发送方，告知需要分片但不允许分片。</li>
<li>如果设置为 0，标识允许分片，路由器在传输过程中如果需要，可以将数据报分片，以确保数据报能够通过传输链路。</li>
</ul>
</li>
<li>MF（More Fragments）：
<ul>
<li>如果设置为 1，还有更多的分片；</li>
<li>如果设置为 0，表示当前分片是对应数据报的最后一个分片，或者表示当前数据报根本没有分片。</li>
</ul>
</li>
</ul>
</li>
<li>片偏移（Fragment Offset）：
<ul>
<li>13 位字段，用于指示数据报分片的位置。以 8 字节为单位，表示相对于原始数据报的偏移量。</li>
</ul>
</li>
<li>生存时间（Time to Live，TTL）：
<ul>
<li>8 位字段，指定数据报在网络中可存在的最大时间（跳数），每经过一个路由器，TTL 减 1，当 TTL 减至 0 时，数据报被丢弃。</li>
</ul>
</li>
<li>协议（Protocol）：
<ul>
<li>8 位字段，指定上层协议，表示数据报的载荷是由哪个协议处理。例如，6 表示 TCP，17 表示 UDP。</li>
</ul>
</li>
<li>首部校验和（Header Checksum）：
<ul>
<li>16 位字段，用于检测 IPv4 首部的错误。</li>
</ul>
</li>
<li>源 IP 地址（Source IP Address）：
<ul>
<li>32 位字段，指定数据报的发送者的 IP 地址。</li>
</ul>
</li>
<li>目标 IP 地址（Destination IP Address）：
<ul>
<li>32 位字段，指定数据报的接收者的 IP 地址。</li>
</ul>
</li>
<li>选项（Options）：
<ul>
<li>可选字段，长度可变，用于包含一些额外的信息。IPv4 首部中的选项字段通常很少被使用。</li>
</ul>
</li>
</ol>
<h4>2.1 分片和相关字段</h4>
<p>简而言之，IP 数据报的最大长度为 <em>65535 字节</em>，这是因为其“总长度”字段占 16 位，所能表示的最大无符号整数为 65535。然而，数据链路层（如以太网）的 <strong>MTU</strong>（最大传输单元）往往远小于该值，例如以太网的 <strong>MTU</strong> 通常为 <em>1500 字节</em>。</p>
<p>因此，当 IP 数据报长度超过底层链路的 MTU 时，就需要将其拆分成多个更小的部分进行传输，这一过程称为 <strong>IP 分片（IP Fragmentation）</strong>。关于分片的详细内容可参考：<a href="https://www.csgraduates.com/computer_network/network/ip/#ip-%E6%95%B0%E6%8D%AE%E6%8A%A5%E5%88%86%E7%89%87" target="_blank" rel="noopener noreferrer">IP 数据报分片</a>。</p>

<p>在进行分片时，会引出两个关键问题：</p>
<ol>
<li><strong>如何区分不同数据报的分片？</strong></li>
</ol>
<p>比如，假设 packet A 被分片为 A1、A2、A3，而 packet B 被分片为 B1、B2，我们如何知道 A1 属于 packet A 而不是 packet B？</p>
<ol start="2">
<li><strong>如何将同一数据报的多个分片重新组合为原始数据？</strong></li>
</ol>
<p>为了解决这些问题，IP 协议在首部中设计了以下两个重要字段：</p>
<ul>
<li><strong>Identification（标识符）</strong>：为每一个 IP 数据报分配一个唯一的标识值，使接收方能够识别属于同一个数据报的所有分片。</li>
<li><strong>Fragment Offset（分片偏移量）</strong>：指明当前分片在原始数据报中的位置，单位为 8 字节（即偏移值乘以 8 即为实际字节偏移量），用于在接收端正确地重组数据报。</li>
</ul>
<p>通过这两个字段，接收方可以准确地将来自不同数据报的分片加以区分，并将同一数据报的所有分片按照正确顺序重新组装起来，恢复出原始的 IP 数据报。</p>
<h4>2.2 差错校验字段</h4>
<p>IP 首部的 checksum 为 IP 协议的差错校验字段，用于检验 IP 首部在传输的过程中是否发生错误，接下来我会告诉你如何通过该字段进行校验。</p>
<p>当一个 IP 数据报被创建时，发送端设备会计算 IP 头部的校验和，并填充 IP 数据报中的 <strong>checksum 字段</strong>。</p>
<p>当 <strong>路由器</strong> 和 <strong>目标机器</strong> 在收到数据报时会重新计算首部校验和，并将计算得到的校验和和接收到的 IP 数据报中的 checksum 进行比较。如果 <strong>不一致</strong> 的话，则说明 IP 数据报中的某些数据在传输的过程中出现变动，就需要 <strong>丢弃</strong> 该 IP 数据报。</p>

<p>需要注意的是，当 IP 数据报 经过某个路由器时，路由器需要 <strong>重新计算</strong> 并填充 checksum 字段，因为 IP 数据报中的某些字段在经过路由器时会被改变（比如 TTL 会减 1 等）。</p>
<p>一般而言，对于校验和，了解到以上程度即可，如果你好奇校验和究竟是如何计算且学有余力的话，可以查看 <a href="https://www.csgraduates.com/misc/ip_checksum/" target="_blank" rel="noopener noreferrer">checksum 校验和计算方式</a>。</p>
<h4>2.3 TTL</h4>
<p>TTL（Time To Live）用于控制 IP 分组的 <strong>生命周期</strong>，发送方在发送 IP 分组时会设定一个 TTL 值，这个值是不固定的，但是一般是 32、64、128 或 255 这四个值中的一个。</p>
<p>当 IP 分组经过 <strong>路由器</strong> 时，路由器会自动 IP 分组中的 <strong>TTL 值减 1</strong>，路由器 发现其 <strong>TTL = 0</strong>，则路由器会 <strong>丢弃</strong> 该 IP 分组，并且返回一个 <a href="https://www.csgraduates.com/computer_network/network/icmp/" target="_blank" rel="noopener noreferrer">ICMP</a> “Time Exceed” 消息。</p>

<h3>三、IPv4分类寻址</h3>
<p>在互联网早期，IP 地址采用了 <strong>分类寻址</strong>（Classful Addressing）。具体而言，就是根据 IP 地址的 <strong>网络号的前几位</strong> 将地址分为 A、B、C、D、E 五类。</p>
<p></p>
<p>在分类寻址中，如果给定一个 IP 地址，我们可以马上判断出该 IP 地址属于哪一类网络（根据前几位的值），以及该 IP 地址的 <strong>网络编号</strong> 和 <strong>主机编号</strong> 是多少。</p>
<p>| 类别 | 起始二进制 | 起始地址  | 结束地址        | 默认子网掩码  | 网络号长度 | 主机号长度 | 用途              |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">传输层</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/05-%E4%BC%A0%E8%BE%93%E5%B1%82.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/05-%E4%BC%A0%E8%BE%93%E5%B1%82.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>TCP</h2>
<h3>一、TCP特点</h3>
<ul>
<li><strong>面向连接</strong>：发送数据前后需要分别通过三次握手和四次挥手进行连接的建立和断开。</li>
<li><strong>可靠交付</strong>：保证数据传输的无差错、不丢失、不重复、有序。</li>
<li><strong>面向字节流</strong>：以滑动窗口的形式对字节按照顺序进行发送和接收。</li>
<li><strong>全双工</strong>：通信双方在一个 TCP 连接中都可以发送和接收数据。</li>
</ul>
<h3>二、TCP首部</h3>

<ol>
<li>
<p><strong>源端口号</strong>（Source Port）：16 位字段，指示发送端的端口号。</p>
</li>
<li>
<p><strong>目标端口号</strong>（Destination Port）：16 位字段，指示接收端的端口号。</p>
</li>
<li>
<p><strong>序列号</strong>（Sequence Number）：32 位字段，用于标识 TCP 报文段中第一个数据字节的序列号。这个字段用于实现 TCP 的可靠性机制，如数据的按序传递和重传。</p>
</li>
<li>
<p><strong>确认号</strong>（Acknowledgment Number）：32 位字段，如果设置了 <strong>ACK</strong> 标志位，该字段包含了期望接收的下一个数据字节的序列号。这个字段用于确认已经成功接收的数据。</p>
</li>
<li>
<p><strong>首部长度</strong>（Header Length）：4 位字段，指示 TCP 首部的长度，以 32 位字为单位。这个字段用于指示首部的长度，因为 TCP 首部长度可以变化，根据选项的存在而变化。</p>
</li>
<li>
<p><strong>保留</strong>（Reserved）：6 位字段，保留供未来使用，目前必须设置为 0。</p>
</li>
<li>
<p>控制标志位</p>
<p>（Flags）：TCP 报文段的控制标志，共有 6 个标志位，它们分别是：</p>
<ul>
<li><strong>URG</strong>（紧急指针有效位）：用于指示紧急数据。</li>
<li><strong>ACK</strong>（确认位）：用于指示确认号字段有效。</li>
<li><strong>PSH</strong>（推送位）：用于指示接收端应立即交付数据给应用层，而不需要等待缓冲区满。</li>
<li><strong>RST</strong>（复位位）：用于强制释放连接，重置连接状态。</li>
<li><strong>SYN</strong>（同步位）：用于建立连接，用于初始化序列号。</li>
<li><strong>FIN</strong>（终止位）：用于关闭连接。</li>
</ul>
</li>
<li>
<p><strong>窗口大小</strong>（Window Size）：16 位字段，指示发送端的可用接收窗口大小。接收端可以根据这个字段的值来告诉发送端可以发送多少数据而不会导致拥塞。</p>
</li>
<li>
<p><strong>校验和</strong>（Checksum）：16 位字段，用于检测 TCP 首部和数据部分的传输中的错误。</p>
</li>
<li>
<p><strong>紧急指针</strong>（Urgent Pointer）：16 位字段，仅当 <strong>URG</strong> 标志位设置时才有效。用于指示紧急数据的末尾位置。</p>
</li>
<li>
<p><strong>选项</strong>（Options）：可选字段，用于包含一些额外的控制信息，如最大报文段长度、时间戳等。长度可变，最长可达 40 字节。</p>
</li>
<li>
<p><strong>填充</strong>（Padding）：根据选项字段的长度而变化，用于确保 TCP 首部的总长度是 32 位的倍数。</p>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<h2>TCP</h2>
<h3>一、TCP特点</h3>
<ul>
<li><strong>面向连接</strong>：发送数据前后需要分别通过三次握手和四次挥手进行连接的建立和断开。</li>
<li><strong>可靠交付</strong>：保证数据传输的无差错、不丢失、不重复、有序。</li>
<li><strong>面向字节流</strong>：以滑动窗口的形式对字节按照顺序进行发送和接收。</li>
<li><strong>全双工</strong>：通信双方在一个 TCP 连接中都可以发送和接收数据。</li>
</ul>
<h3>二、TCP首部</h3>

<ol>
<li>
<p><strong>源端口号</strong>（Source Port）：16 位字段，指示发送端的端口号。</p>
</li>
<li>
<p><strong>目标端口号</strong>（Destination Port）：16 位字段，指示接收端的端口号。</p>
</li>
<li>
<p><strong>序列号</strong>（Sequence Number）：32 位字段，用于标识 TCP 报文段中第一个数据字节的序列号。这个字段用于实现 TCP 的可靠性机制，如数据的按序传递和重传。</p>
</li>
<li>
<p><strong>确认号</strong>（Acknowledgment Number）：32 位字段，如果设置了 <strong>ACK</strong> 标志位，该字段包含了期望接收的下一个数据字节的序列号。这个字段用于确认已经成功接收的数据。</p>
</li>
<li>
<p><strong>首部长度</strong>（Header Length）：4 位字段，指示 TCP 首部的长度，以 32 位字为单位。这个字段用于指示首部的长度，因为 TCP 首部长度可以变化，根据选项的存在而变化。</p>
</li>
<li>
<p><strong>保留</strong>（Reserved）：6 位字段，保留供未来使用，目前必须设置为 0。</p>
</li>
<li>
<p>控制标志位</p>
<p>（Flags）：TCP 报文段的控制标志，共有 6 个标志位，它们分别是：</p>
<ul>
<li><strong>URG</strong>（紧急指针有效位）：用于指示紧急数据。</li>
<li><strong>ACK</strong>（确认位）：用于指示确认号字段有效。</li>
<li><strong>PSH</strong>（推送位）：用于指示接收端应立即交付数据给应用层，而不需要等待缓冲区满。</li>
<li><strong>RST</strong>（复位位）：用于强制释放连接，重置连接状态。</li>
<li><strong>SYN</strong>（同步位）：用于建立连接，用于初始化序列号。</li>
<li><strong>FIN</strong>（终止位）：用于关闭连接。</li>
</ul>
</li>
<li>
<p><strong>窗口大小</strong>（Window Size）：16 位字段，指示发送端的可用接收窗口大小。接收端可以根据这个字段的值来告诉发送端可以发送多少数据而不会导致拥塞。</p>
</li>
<li>
<p><strong>校验和</strong>（Checksum）：16 位字段，用于检测 TCP 首部和数据部分的传输中的错误。</p>
</li>
<li>
<p><strong>紧急指针</strong>（Urgent Pointer）：16 位字段，仅当 <strong>URG</strong> 标志位设置时才有效。用于指示紧急数据的末尾位置。</p>
</li>
<li>
<p><strong>选项</strong>（Options）：可选字段，用于包含一些额外的控制信息，如最大报文段长度、时间戳等。长度可变，最长可达 40 字节。</p>
</li>
<li>
<p><strong>填充</strong>（Padding）：根据选项字段的长度而变化，用于确保 TCP 首部的总长度是 32 位的倍数。</p>
</li>
</ol>
<h3>三、三次握手</h3>

<p>TCP 通过 <strong>三次握手</strong> 建立连接，其具体过程如上图所示，每次握手的状态变化和字段解释如下：</p>
<p><strong>第一次握手（客户端 → 服务端）</strong></p>
<ul>
<li>客户端状态变化： <code>CLOSED</code> → <code>SYN-SENT</code></li>
<li>客户端发送： 一个带有 <code>SYN=1</code> 的包，请求建立连接，并选择一个初始 <strong>序列号</strong> <code>seq = x</code></li>
<li>服务端状态： <code>LISTEN</code>，等待连接</li>
</ul>
<p><strong>第二次握手（服务端 → 客户端）</strong></p>
<ul>
<li>服务端状态变化： <code>LISTEN</code> → <code>SYN-RECEIVED</code></li>
<li>服务端收到SYN包后，回应一个 SYN + ACK包：
<ul>
<li><code>SYN = 1</code>：表示服务端也同意建立连接</li>
<li><code>ACK = 1</code>：确认客户端的 <strong>SYN</strong></li>
<li><code>seq = y</code>：服务端自己的初始 <strong>序列号</strong></li>
<li><code>ack = x+1</code>：确认号是客户端 <strong>序列号</strong> + 1</li>
</ul>
</li>
</ul>
<p><strong>第三次握手（客户端 → 服务端）</strong></p>
<ul>
<li>客户端状态变化： <code>SYN-SENT</code> → <code>ESTABLISHMENT</code></li>
<li>客户端收到服务端的SYN + ACK后，回应一个ACK包：
<ul>
<li><code>ACK = 1</code>：确认服务端的 <strong>SYN</strong></li>
<li><code>ack = y+1</code>：确认号是服务端 <strong>序列号 + 1</strong></li>
</ul>
</li>
</ul>
<p>这三次握手的 <strong>主要目的</strong> 是：</p>
<ol>
<li>客户端确认服务端可达（第一次握手）</li>
<li>服务端确认客户端可达，并携带自己的 <strong>序列号</strong>（第二次握手）</li>
<li>客户端再次确认服务端的响应，确保双向通信建立（第三次握手）</li>
</ol>

<h3>四、四次挥手</h3>

<p><strong>第一次挥手：客户端发起关闭请求</strong></p>
<ul>
<li>客户端状态变化： <code>ESTABLISHMENT</code> → <code>FIN-WAIT-1</code></li>
<li>客户端动作： 应用层调用 <code>close()</code>，客户端发送 <code>FIN=1, seq=u</code>，表示不再发送数据了，但仍可以接收数据</li>
</ul>
<p><strong>第二次挥手：服务端确认关闭请求</strong></p>
<ul>
<li>服务端状态变化： <code>ESTABLISHMENT</code> → <code>CLOSE-WAIT</code></li>
<li>服务端动作：
<ul>
<li>收到 <code>FIN</code> 后，发送 <code>ACK=1, seq=v, ack=u+1</code> 表示确认</li>
<li>通知上层应用准备关闭</li>
</ul>
</li>
<li>客户端状态变化： <code>FIN-WAIT-1</code> → <code>FIN-WAIT-2</code></li>
</ul>
<p><strong>第三次挥手：服务端发起关闭请求</strong></p>
<ul>
<li>服务端动作：
<ul>
<li>应用层处理完毕，发送 <code>FIN=1, ACK=1, seq=w, ack=u+1</code></li>
</ul>
</li>
<li>服务端状态变化： <code>CLOSE-WAIT</code> → <code>LAST-ACK</code></li>
<li>客户端动作： 收到该 <code>FIN</code> 报文后，进入 <code>TIME-WAIT</code> 状态</li>
</ul>
<p><strong>第四次挥手：客户端确认服务端关闭</strong></p>
<ul>
<li>客户端动作： 发送 <code>ACK=1, seq=u+1, ack=w+1</code></li>
<li>客户端状态变化： <code>TIME-WAIT</code> → <strong>等待 2 个最大报文生存时间</strong>（<strong>2×MSL</strong>）后 → <code>CLOSED</code></li>
<li>服务端状态变化： 收到 ACK 后 → <code>CLOSED</code></li>
</ul>

<h3>五、滑动窗口机制</h3>

<p>上图展示了 <strong>滑动窗口</strong> 的基本结构。滑动窗口其实是一个“移动的视口”，它同时描述了 <strong>发送方</strong> 正在等待确认的已发送数据，以及 <strong>接收方</strong> 已经接收并准备好继续接收的空闲空间。换句话说，窗口中的每一个字节都是<strong>当前正在传输</strong>的字节，它们在整个数据流中占据一个连续的区段。</p>
<ol>
<li><strong>发送方</strong> 根据窗口大小，将窗口范围内的数据一次性发送出去，而不必等到每个报文段的确认返回。</li>
<li>接收方在收到这些报文段后，会向发送方发送ACK（确认）报文。该 ACK 包含两个重要信息：
<ul>
<li>已成功接收的序列号（用来让发送方确认哪些数据已经安全到达）。</li>
<li><strong>接收窗口大小</strong>（即接收方当前还能接收的字节数），该值写在 ACK 报文的窗口字段中。</li>
</ul>
</li>
<li><strong>发送方</strong> 在收到 ACK 后，滑动窗口向前移动，窗口左端排除已确认的数据，右端随即腾出新的空间。此时，发送方就可以继续发送后续的数据。</li>
</ol>
<h4>5.1 绝对下标和序列号</h4>
<p>可以把 TCP 发送的数据想象成一条<strong>无限长的字节流</strong>，每个字节在这条流中都有一个唯一的位置，这个位置就是<strong>绝对下标（absolute index）</strong>。它从连接开始不断递增，本质上是一个“不会回绕的理想编号”。</p>
<p>但 TCP 报文头部的 <strong>Sequence Number（seqno）</strong> 只有 <strong>32 位</strong>，因此它不可能直接表示这个无限增长的绝对位置，而是采用了一个<strong>取模映射</strong>的方式。</p>




<p>可以用一句话总结整个机制：</p>
<blockquote>
<p>TCP 用 <strong>absolute index</strong> 管理真实的数据流顺序，用 <strong>seqno（32位）</strong> 在网络上传输，通过 <strong>滑动窗口的位置</strong> 消除回绕带来的歧义。</p>
</blockquote>
<p>更具体地：</p>
<ul>
<li>发送方
<ul>
<li>用 absolute index 组织数据</li>
<li>映射成 seqno 发出去</li>
<li>维护发送窗口（哪些还没被 ACK）</li>
</ul>
</li>
<li>接收方
<ul>
<li>收到 seqno</li>
<li>根据窗口位置还原 absolute index</li>
<li>决定是否接收、缓存、ACK</li>
</ul>
</li>
</ul>
<h4>5.2 发送和接收窗口</h4>

<p>TCP 的 <strong>发送窗口</strong> 可以按照逻辑划分为四个部分：</p>
<ol>
<li>已经发送并且被确认的数据（字节流）</li>
<li>已经发送但还没有被确认</li>
<li>尚且还没有发送</li>
<li>暂时不可以发送</li>
</ol>
<p>其中第 2、3 个部分构成 TCP 的发送窗口，当发送方收到 <strong>ackno</strong> 在第 2 个部分内的确认报文时，调整滑动窗口的大小后向前移动滑动窗口，并且发送接下来可以发送的数据。</p>

<p>TCP 的 <strong>接收窗口</strong> 可以按照逻辑划分为四个部分：</p>
<ol>
<li>已经被应用层接收的数据</li>
<li>已经被 TCP 接收，但是还没有被应用层接收的数据</li>
<li>还没有接收到的数据</li>
<li>还不可以接收到的数据</li>
</ol>
<h4>5.3 窗口大小</h4>
<p>在 TCP 传输过程中，窗口的概念决定了发送方能够“在等待确认之前”一次性发送多少数据。常见的窗口有三类：</p>
<ul>
<li><strong>发送窗口（swnd，send window）</strong></li>
<li><strong>接收窗口（rwnd，receive window）</strong></li>
<li><strong>拥塞窗口（cwnd，congestion window）</strong></li>
</ul>

<p>下面分别说明这三种窗口的含义、它们是如何相互影响的，以及在 TCP 运行期间会受到哪些因素的调节。</p>
<p></p>
<p></p>
<p></p>
<p></p>
<h4>5.4 窗口移动过程</h4>
<p>TCP 可以看成在一条连续的<strong>字节流</strong>上维护一个“滑动窗口”，窗口表示<strong>当前允许发送且尚未确认的数据范围</strong>。</p>
<ul>
<li><strong>初始状态</strong>： 发送方根据接收方通告的窗口大小，确定一个发送窗口 <code>[左边界, 右边界)</code>，并一次性发送窗口内的数据（按序列号对应的字节序列）。</li>
<li><strong>收到 ACK</strong>： 接收方确认已正确接收的数据（ACK = 下一个期望字节的序列号）。</li>
<li>窗口右移（滑动）： 发送方收到 ACK 后：
<ul>
<li>将窗口左边界移动到 ACK 指示的位置（已确认的数据被“移出窗口”）</li>
<li>窗口整体向前滑动</li>
<li>右边界随之扩展（如果接收窗口允许）</li>
</ul>
</li>
<li><strong>继续发送</strong>： 新进入窗口的字节可以继续发送，实现“流水线式”传输，而无需逐个等待确认。</li>
</ul>
<p>本质就是一句话：</p>
<blockquote>
<p><strong>ACK 推动窗口向前滑动，释放发送空间，从而实现连续高效的数据传输。</strong></p>
</blockquote>

<h4>5.5 流量控制</h4>
<p><strong>流量控制</strong>（TCP Transmission Control Protocol）是一种端到端的机制，旨在协调发送方和接收方之间的数据传输速率，防止接收方因处理能力或缓冲区限制而被压垮，从而避免数据包的丢失和重传。流量控制的核心目标是保证数据的可靠交付，同时尽可能高效地利用可用的网络带宽。</p>
<p>在 TCP 中，流量控制通过 <strong>滑动窗口机制</strong> 实现，具体过程如下：</p>
<ol>
<li><strong>接收方通告窗口大小</strong>
接收方根据自身的处理速度、可用缓存空间以及当前的负载，计算出一个 <strong>窗口大小</strong>（Receiver Window），并在每个 ACK 报文中将该值告知发送方。窗口大小代表接收方在收到下一个 ACK 之前，能够接受的最大未确认字节数。</li>
<li><strong>发送方依据窗口限制发送数据</strong>
发送方在发送数据时，必须确保已发送且尚未被确认的字节总量不超过接收方通告的窗口大小。若窗口为零，发送方会暂停发送新数据，只等待接收方释放缓冲区并更新窗口；此时若仍需要保持连接活跃，发送方会周期性发送 <strong>Zero‑Window Probe</strong>（零窗口探测）报文，以探测对方是否已恢复接收能力。</li>
<li><strong>窗口的动态调整</strong>
随着接收方处理数据并释放缓存，窗口大小会在后续的 ACK 中被重新通告，发送方随即可以利用增加的窗口发送更多数据。这个过程在整个连接期间持续循环，使得发送速率始终与接收方的实际承载能力保持同步。</li>
</ol>
<p>需要注意的是，<strong>流量控制</strong> 关注的是单个连接内部的发送/接收平衡，而<strong>拥塞控制</strong> 则针对网络整体的拥塞状态（例如链路容量、路径上的竞争）进行调节，两者相互独立但常常协同工作，以实现端到端的可靠与高效传输。</p>
<p></p>
<h3>六、可靠传输机制</h3>
<p>TCP 的 <strong>可靠传输</strong> 通过多种机制共同实现，下文将对三个关键机制进行介绍。</p>
<h4>6.1 序列号和确认号</h4>
<p><strong>序列号</strong>（seqno, sequence number）和 <strong>确认号</strong>（ackno, acknowledge number）是 TCP 首部的两个字段，TCP 协议通过 <strong>序列号</strong> 来记录目前已经发送了哪些数据，通过 <strong>确认号</strong> 记录哪些数据已经被接收方所接收。</p>
<p>发送方发送 <strong>序列号</strong> 和 接收方返回 <strong>确认号</strong> 的交互可能存在以下几种情况：</p>
<ul>
<li>如果发送的数据段丢失了，接收方不会发送更新的 <strong>确认号</strong>，这会最终导致发送方超时并重传丢失的数据段。</li>
<li>如果数据段到达了接收方，但是是乱序的，接收方将持续发送最后一个正确 <strong>序列号</strong> 的 <strong>确认号</strong>，提示发送方其中有数据段需要重新传输。</li>
<li>如果数据段到达了接收方，并且是按顺序的，接收方发送一个新的 <strong>确认号</strong>，提示发送方到目前为止的所有数据都已正确接收。</li>
</ul>
<h4>6.2 超时重传</h4>
<p>TCP 是一种 <strong>可靠传输协议</strong>，它要确保发送的数据 <strong>被对方接收并确认</strong>。但网络中可能发生：</p>
<ul>
<li>包丢失（网络拥堵）</li>
<li>ACK 丢失（确认丢了）</li>
<li>延迟很大（RTT 不稳定）</li>
</ul>
<p>为了应对这些情况，TCP 协议在发送一个 <strong>数据段</strong>（segment）时，会为每一个发送的 segment 设置一个 <strong>重传定时器</strong>。</p>
<p>如果某个 segment 的定时器超时了，就说明发送方在 <strong>超时时间阈值</strong> 内没有接收到该 segment 的确认，发送方就会触发 <strong>超时重传</strong>（Retransmission Timeout），重新发送超时的 segment。</p>

<h4>6.3 校验和</h4>
<p>TCP 首部包含一个 <strong>校验和</strong>（Checksum）字段，用于检测数据在传输过程中的任何变化。如果 <strong>接收方</strong> 检测到校验和错误，该数据段会被 <strong>丢弃</strong>，然后接收方会要求发送方 <strong>重传</strong> 该数据段。</p>
<p>TCP 的校验和计算方法和 <a href="https://www.csgraduates.com/computer_network/network/ip/#%E5%B7%AE%E9%94%99%E6%A0%A1%E9%AA%8C%E5%AD%97%E6%AE%B5" target="_blank" rel="noopener noreferrer">IP 校验和计算方法</a> 一致，不过两者校验的范围和目的有所不同。</p>
<p>其 IP 校验和只针对 IP 头部进行校验，主要用于检测数据在传输过程中由于网络故障等原因造成的错误。
而 TCP 校验和不仅要校验 TCP 头部，还要校验 TCP 载荷（即数据部分）。因此，TCP 校验和能提供 <strong>更全面的错误检测</strong>。</p>
<h3>七、拥塞控制</h3>
<p><strong>拥塞控制</strong>（tcp）指的是 tcp 限制传输数据的速率，进而防止注入过多的数据到网络中，进而造成网络链路过载。</p>
<p>大家需要了解，tcp 不是一个 “自私” 的算法，一段链路上可以同时包含很多 tcp 连接，tcp 的拥塞控制的目的是尽量去实现一个 <strong>总体的最优</strong>，而不是个体的最优。当 tcp 检测到数据传输出现拥塞之时，即一段时间内没有接收到一些确认，它就会降低自己传输数据的速率。</p>
<h4>7.1 慢开始</h4>
<p><strong>慢开始</strong> 是 TCP 连接开始时的一个阶段，相较于直接以较高的速率发送数据，慢开始会以一个较低的速率开始，然后 <strong>逐步试探</strong> 当前网络传输的能力，以指数的速率增加发送速率。慢开始的流程如下：</p>
<ul>
<li><strong>初始化</strong>：当一个 TCP 连接开始时，拥塞窗口 <code>cwnd</code> 设置为一个很小的值，通常是 <code>1MSS</code> （最大段大小）。</li>
<li><strong>指数增长</strong>：对于每个收到的 <code>ACK</code>，<code>cwnd</code> 会增加一个 <code>MSS</code>。这意味着每个 <code>RTT</code>（往返时间）<code>cwnd</code> 都会翻倍，导致了指数增长。</li>
<li><strong>转换阈值</strong>：当 <code>cwnd</code> 达到 <code>ssthresh</code>（慢开始阈值）时，TCP 会从慢开始模式转换到拥塞避免模式。</li>
</ul>


<h4>7.2 拥塞避免</h4>
<p>当 TCP 进入拥塞避免（Congestion Avoidance）阶段后，拥塞窗口（<code>cwnd</code>）的增长方式从慢启动的指数增长改为 <strong>线性增长</strong>。</p>
<p>具体来说：每收到一个 ACK，<code>cwnd</code> 增加 <code>1/cwnd</code> 个 MSS（最大报文段长度）。由于在一个往返时间（RTT）内会收到大约 <code>cwnd</code> 个 ACK，这等价于在每个 RTT 结束时 <code>cwnd</code> 只增长约 <strong>1 MSS</strong>。这种“每 RTT 加 1 MSS”的线性增长可以避免窗口迅速膨胀，引起网络拥塞。</p>
<p></p>
<p>TCP 通过两种方式 <strong>检测网络是否出现拥塞</strong>：</p>
<ol>
<li><strong>超时（Timeout）</strong>：发送的数据在预期的时间内没有收到相应的 ACK，说明该段可能已经丢失。</li>
<li><strong>三个冗余 ACK（Triple Duplicate ACK）</strong>：连续收到三个冗余的 ACK，表明网络中有数据段在传输过程中被丢弃，但后续的 ACK 仍然能够到达。</li>
</ol>
<p></p>
<p>一旦检测到上述任意一种情况，TCP 认为网络已经发生拥塞，并执行如下处理：</p>
<ul>
<li>将慢启动阈值（<code>ssthresh</code>）设置为当前 <code>cwnd</code> 的 <strong>一半</strong>（<code>ssthresh = cwnd / 2</code>），以限制后续的窗口增长速度。</li>
<li>将拥塞窗口 <code>cwnd</code> 重新设为 <strong>1 MSS</strong>，相当于回到最保守的状态。</li>
<li>随后进入 <strong>慢启动（Slow Start）</strong> 阶段，重新探测网络的可用带宽。</li>
</ul>
<p>通过上述线性增长与灵活的拥塞检测/恢复机制，TCP 能够在保持高吞吐量的同时，尽可能避免网络过载，从而实现可靠且高效的端到端传输。</p>
<h4>7.3 快速重传</h4>
<p>在传统的 TCP 实现中，<strong>重传计时器</strong>负责触发超时重传：只要计时器到期而仍未收到对应的数据段的 ACK，发送方就会重新发送该段。在高带宽‑低时延的网络环境下，这种“等计时器”的方式往往效率低下，因为计时器的超时时间往往远大于实际的往返时延（RTT），导致数据恢复延迟。</p>
<p>在 <strong>快速重传</strong>（Fast Retransmission），当发送方 <strong>连续收到三个冗余的 ACK</strong> 时，说明网络中已经有一个 <strong>数据段丢失</strong>，而后续的 ACK 只能确认已经成功到达的后续段。此时，TCP 就会 <strong>立即重传</strong> 那个被认定为丢失的段，而不必等到重传计时器超时，这一过程被称为快速重传。</p>

<p>触发快速重传后，TCP 会切换到 <strong>快速恢复</strong>（Fast Recovery）阶段。该阶段的核心目标是：</p>
<ol>
<li><strong>防止拥塞窗口（cwnd）骤降到 1 MSS</strong>，从而避免吞吐量剧烈下降；</li>
<li><strong>利用已经收到的重复 ACK</strong> 来“填补”因丢包而空出的窗口，保持管道尽可能饱和。</li>
</ol>
<p>在快速重传和快速恢复中，<strong>cwnd 的变化过程</strong> 如下：</p>
<ol>
<li>
<p>快速重传触发后</p>
<ul>
<li><code>ssthresh ← cwnd / 2</code></li>
<li><code>cwnd ← ssthresh + 3·MSS</code></li>
</ul>
</li>
<li>
<p>快速恢复期间</p>
<p>（每收到一个重复 ACK）</p>
<ul>
<li><code>cwnd ← cwnd + MSS</code></li>
<li>这种线性增长相当于“用已经确认的 ACK 为窗口“买票”，使得发送方能够继续发送新数据，而不会因为单个丢包而立刻停滞。</li>
</ul>
</li>
<li>
<p>退出快速恢复</p>
<p>（收到一个新的、非重复的 ACK）</p>
<ul>
<li>该 ACK 表明丢失的数据段已经被成功重传并得到确认。</li>
<li><code>cwnd ← ssthresh</code>（即把窗口恢复到慢启动阈值）</li>
<li>随后进入 <strong>拥塞避免</strong>（Congestion Avoidance）阶段，cwnd 以后将以 <strong>每 RTT 增加 1 MSS</strong> 的速度线性增长。</li>
</ul>
</li>
</ol>


<p><strong>总结</strong>：</p>
<ul>
<li>当 <code>cwnd &lt; ssthresh</code> 时，使用 <strong>慢开始</strong> 算法，<code>cwnd</code> 以指数增长</li>
<li>当 <code>cwnd &gt;= ssthresh</code> 时，使用 <strong>拥塞避免</strong> 算法，<code>cwnd</code> 线性增长</li>
<li>当在 RTO内没有收到发送的某个分组的确认时
<ul>
<li>如果启动了快速恢复，则设置 <code>cwnd = ssthresh = cwnd / 2</code>，开始使用拥塞控制算法</li>
<li>如果没有启动快速恢复，则设置 <code>ssthresh = cwnd / 2</code>, <code>cwnd = 1</code>，开始使用 <strong>慢开始</strong> 算法</li>
</ul>
</li>
<li>如果启用了快速重传，并且收到 3 个与先前重复的 ACK（总共收到 4 个相同的 ACK），则不用等待超时器 <strong>RTO</strong> 结束，可以马上重传该数据包，<code>cwnd</code> 可能会减少（这里不考察）</li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">应用层</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/06-%E5%BA%94%E7%94%A8%E5%B1%82.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/06-%E5%BA%94%E7%94%A8%E5%B1%82.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>网络应用模型</h2>
<p></p>
<h3>一、C/S模型</h3>
<p>C/S（Client Server）模型：中心化、依赖服务器，适合稳定服务场景。</p>
<ul>
<li>核心特点：<strong>客户端</strong> （用户设备，如电脑、手机）向 <strong>服务器</strong> （提供服务的专用设备）请求资源或服务，服务器响应并提供支持。</li>
<li>通信方式：基于 <strong>“请求-响应”</strong>，客户端主动发起，服务器被动应答。</li>
<li>架构：<strong>中心化</strong>，服务器是核心枢纽，客户端依赖服务器获取服务。</li>
<li><strong>典型例子</strong>：浏览网页（浏览器与 Web 服务器）、收发邮件（邮件客户端与邮件服务器）。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>网络应用模型</h2>
<p></p>
<h3>一、C/S模型</h3>
<p>C/S（Client Server）模型：中心化、依赖服务器，适合稳定服务场景。</p>
<ul>
<li>核心特点：<strong>客户端</strong> （用户设备，如电脑、手机）向 <strong>服务器</strong> （提供服务的专用设备）请求资源或服务，服务器响应并提供支持。</li>
<li>通信方式：基于 <strong>“请求-响应”</strong>，客户端主动发起，服务器被动应答。</li>
<li>架构：<strong>中心化</strong>，服务器是核心枢纽，客户端依赖服务器获取服务。</li>
<li><strong>典型例子</strong>：浏览网页（浏览器与 Web 服务器）、收发邮件（邮件客户端与邮件服务器）。</li>
</ul>
<h3>二、P2P模型</h3>
<p>P2P（Peer to Peer）：分布式、节点平等，适合资源共享和去中心化场景。</p>
<ul>
<li>核心特点：网络中 <strong>设备对等</strong>，既是客户端又可作服务器，共同协作共享资源。</li>
<li>通信方式：设备直接互联，<strong>点对点通信</strong>，无需中心服务器。</li>
<li>架构：<strong>分布式，去中心化</strong>，资源分散在各节点，网络更灵活。</li>
<li><strong>典型例子</strong>：文件共享（如 BitTorrent）、音视频通话（如 Skype）、区块链（如比特币）。</li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">计算机网络</title>
    <id>https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/</id>
    <link href="https://studynotes-90w.pages.dev/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84.html" target="_blank">计算机网络体系结构</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02-%E7%89%A9%E7%90%86%E5%B1%82.html" target="_blank">物理层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/03-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82.html" target="_blank">数据链路层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/04-%E7%BD%91%E7%BB%9C%E5%B1%82.html" target="_blank">网络层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/05-%E4%BC%A0%E8%BE%93%E5%B1%82.html" target="_blank">传输层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/06-%E5%BA%94%E7%94%A8%E5%B1%82.html" target="_blank">应用层</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84.html" target="_blank">计算机网络体系结构</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02-%E7%89%A9%E7%90%86%E5%B1%82.html" target="_blank">物理层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/03-%E6%95%B0%E6%8D%AE%E9%93%BE%E8%B7%AF%E5%B1%82.html" target="_blank">数据链路层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/04-%E7%BD%91%E7%BB%9C%E5%B1%82.html" target="_blank">网络层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/05-%E4%BC%A0%E8%BE%93%E5%B1%82.html" target="_blank">传输层</a></li>
<li><a href="/notes/00-%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/04-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/06-%E5%BA%94%E7%94%A8%E5%B1%82.html" target="_blank">应用层</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">产品思维</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/01-%E4%BA%A7%E5%93%81%E6%80%9D%E7%BB%B4.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/01-%E4%BA%A7%E5%93%81%E6%80%9D%E7%BB%B4.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把「加一个导出按钮」做成一份能过评审的方案</h2>
<p><strong>场景</strong>：一套面向中小电商的订单中台，运营在群里提需求：「订单列表加个导出 Excel，每周都要用。」两周后是大促，研发只有前端 1 人、后端 1 人，本期 5 个工作日，权限模型不能动。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>时间</td>
<td>5 个工作日内给出结论，做或不做都要有理由</td>
</tr>
<tr>
<td>人力</td>
<td>前端 1 人、后端 1 人，没有专职数据分析师</td>
</tr>
<tr>
<td>兼容</td>
<td>本期不能改角色与权限模型</td>
</tr>
<tr>
<td>历史</td>
<td>半年前做过「报表中心」，上线后月活不到 30 人</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把「加一个导出按钮」做成一份能过评审的方案</h2>
<p><strong>场景</strong>：一套面向中小电商的订单中台，运营在群里提需求：「订单列表加个导出 Excel，每周都要用。」两周后是大促，研发只有前端 1 人、后端 1 人，本期 5 个工作日，权限模型不能动。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">商业模式与竞争</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/02-%E5%95%86%E4%B8%9A%E6%A8%A1%E5%BC%8F%E4%B8%8E%E7%AB%9E%E4%BA%89.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/02-%E5%95%86%E4%B8%9A%E6%A8%A1%E5%BC%8F%E4%B8%8E%E7%AB%9E%E4%BA%89.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一款工具型 SaaS 重做定价结构</h2>
<p><strong>场景</strong>：一款项目管理 SaaS，做了 4 年，只有一档价格：99 元/人/月，功能全包。近 12 个月新增付费客户数停滞，销售说「小团队嫌贵，大客户嫌便宜」。董事会要求 18 个月内现金流打平。</p>
<blockquote>
<p>本案例是构造场景：客户数、金额、流失率都用于演示计算口径，不对应任何真实公司，比例也不要直接套用到别的业务。</p>
</blockquote>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>数据</td>
<td>只有 12 个月的成交与流失记录，没有完整的获客渠道成本</td>
</tr>
<tr>
<td>人力</td>
<td>销售 3 人、客户成功 1 人，本期不能扩编</td>
</tr>
<tr>
<td>产品</td>
<td>6 个月内不改核心功能范围，只允许做权限与用量限制</td>
</tr>
<tr>
<td>合同</td>
<td>存量客户本期内不强制涨价，续费时才切换</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一款工具型 SaaS 重做定价结构</h2>
<p><strong>场景</strong>：一款项目管理 SaaS，做了 4 年，只有一档价格：99 元/人/月，功能全包。近 12 个月新增付费客户数停滞，销售说「小团队嫌贵，大客户嫌便宜」。董事会要求 18 个月内现金流打平。</p>
<blockquote>
<p>本案例是构造场景：客户数、金额、流失率都用于演示计算口径，不对应任何真实公司，比例也不要直接套用到别的业务。</p>
</blockquote>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">产品认知</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/01-%E4%BA%A7%E5%93%81%E6%80%9D%E7%BB%B4.html" target="_blank">产品思维</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/02-%E5%95%86%E4%B8%9A%E6%A8%A1%E5%BC%8F%E4%B8%8E%E7%AB%9E%E4%BA%89.html" target="_blank">商业模式与竞争</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/01-%E4%BA%A7%E5%93%81%E6%80%9D%E7%BB%B4.html" target="_blank">产品思维</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/01-%E4%BA%A7%E5%93%81%E8%AE%A4%E7%9F%A5/02-%E5%95%86%E4%B8%9A%E6%A8%A1%E5%BC%8F%E4%B8%8E%E7%AB%9E%E4%BA%89.html" target="_blank">商业模式与竞争</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">用户研究</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/01-%E7%94%A8%E6%88%B7%E7%A0%94%E7%A9%B6.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/01-%E7%94%A8%E6%88%B7%E7%A0%94%E7%A9%B6.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：查清「新用户 7 日留存下滑」的真实原因</h2>
<p>下面用一套示例数据把流程走完。数字是示例，可直接复用的是步骤、判断口径和验收标准。</p>
<p><strong>场景</strong>：一款团队协作工具，注册后 7 日留存从 31% 降到 22%。团队已经得出判断：「引导流程太长，用户没耐心。」两周后准备重做 onboarding。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>时间</td>
<td>2 周内给出结论，赶在改版排期之前</td>
</tr>
<tr>
<td>人力</td>
<td>1 名研究员兼产品，没有专职数据分析师</td>
</tr>
<tr>
<td>技术</td>
<td>埋点已冻结，本迭代不能加新事件</td>
</tr>
<tr>
<td>预算</td>
<td>访谈礼金 14 份，问卷无付费样本渠道</td>
</tr>
<tr>
<td>目标</td>
<td>判断「重做引导」是否是对的方向，并给出可执行的改动清单</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：查清「新用户 7 日留存下滑」的真实原因</h2>
<p>下面用一套示例数据把流程走完。数字是示例，可直接复用的是步骤、判断口径和验收标准。</p>
<p><strong>场景</strong>：一款团队协作工具，注册后 7 日留存从 31% 降到 22%。团队已经得出判断：「引导流程太长，用户没耐心。」两周后准备重做 onboarding。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">需求分析与优先级</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/02-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/02-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<blockquote>
<p>说明：以下为脱敏后的示例场景，客户与数字仅用于演示判断过程，不代表行业统计。</p>
</blockquote>
<h2>一、工程案例：把 47 条需求压到一个季度能交付的范围</h2>
<p><strong>场景</strong>：一套 B 端协同产品，需求池积了 47 条。销售每天在群里催「这个客户要，那个客户也要」，团队上一季度按「谁催得急」排期，做了 12 个需求，收入没涨，新用户上手时间反而从 30 分钟涨到 45 分钟。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>人力</td>
<td>前端 3 人、后端 3 人，本季度不能加人</td>
</tr>
<tr>
<td>容量</td>
<td>30% 人力用于线上维护与故障，可做新需求的只有约 70%</td>
</tr>
<tr>
<td>周期</td>
<td>一个季度 3 个迭代，每个迭代 2 周</td>
</tr>
<tr>
<td>合同</td>
<td>2 家客户有定制条款，需在本季度给出处理方案</td>
</tr>
<tr>
<td>目标</td>
<td>需求池从 47 条收敛到可交付范围，并让销售能接受「不做」的理由</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<blockquote>
<p>说明：以下为脱敏后的示例场景，客户与数字仅用于演示判断过程，不代表行业统计。</p>
</blockquote>
<h2>一、工程案例：把 47 条需求压到一个季度能交付的范围</h2>
<p><strong>场景</strong>：一套 B 端协同产品，需求池积了 47 条。销售每天在群里催「这个客户要，那个客户也要」，团队上一季度按「谁催得急」排期，做了 12 个需求，收入没涨，新用户上手时间反而从 30 分钟涨到 45 分钟。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">用户故事与验收</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/03-%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E4%B8%8E%E9%AA%8C%E6%94%B6.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/03-%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E4%B8%8E%E9%AA%8C%E6%94%B6.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把「批量处理订单」拆成三个能开发的故事</h2>
<p><strong>场景</strong>：一套仓储后台，仓库管理员在订单列表里逐条点「发货」。大促期间一天 300 单，点完要 40 多分钟，还经常点错行。客服转来需求原话：「能不能批量处理订单，现在一条条点太慢了。」</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>迭代</td>
<td>2 周一个迭代，本期只有 1 个迭代</td>
</tr>
<tr>
<td>人力</td>
<td>前端 1 人、后端 1 人、测试 1 人</td>
</tr>
<tr>
<td>范围</td>
<td>本期只做「批量发货」，批量取消、批量打印排后</td>
</tr>
<tr>
<td>兼容</td>
<td>订单状态机不能改，旧版列表页仍在使用</td>
</tr>
<tr>
<td>数据</td>
<td>单次最多 200 条，超过需提示分批</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把「批量处理订单」拆成三个能开发的故事</h2>
<p><strong>场景</strong>：一套仓储后台，仓库管理员在订单列表里逐条点「发货」。大促期间一天 300 单，点完要 40 多分钟，还经常点错行。客服转来需求原话：「能不能批量处理订单，现在一条条点太慢了。」</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">用户 与 需求</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/01-%E7%94%A8%E6%88%B7%E7%A0%94%E7%A9%B6.html" target="_blank">用户研究</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/02-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7.html" target="_blank">需求分析与优先级</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/03-%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E4%B8%8E%E9%AA%8C%E6%94%B6.html" target="_blank">用户故事与验收</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/01-%E7%94%A8%E6%88%B7%E7%A0%94%E7%A9%B6.html" target="_blank">用户研究</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/02-%E9%9C%80%E6%B1%82%E5%88%86%E6%9E%90%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7.html" target="_blank">需求分析与优先级</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/02-%E7%94%A8%E6%88%B7%E4%B8%8E%E9%9C%80%E6%B1%82/03-%E7%94%A8%E6%88%B7%E6%95%85%E4%BA%8B%E4%B8%8E%E9%AA%8C%E6%94%B6.html" target="_blank">用户故事与验收</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">PRD</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/01-PRD.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/01-PRD.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一个订单后台写 PRD 并组织一次评审</h2>
<p><strong>场景</strong>：一家做企业采购的团队，要把订单后台从「Excel + 聊天工具」迁进系统。本期只做一个模块：订单改价与批量导出。使用方是运营（发起改价）、财务（对账）、主管（审批）三类角色，日订单量在几千到一万之间（以实际数据为准）。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>开发窗口 3 周，后端 1 人、前端 1 人、测试 0.5 人；</li>
<li>旧系统有三年前的历史订单，字段缺失，不能全量迁移；</li>
<li>财务的对账口径已经固定，任何改价必须留痕、可追溯到人；</li>
<li>上线不能停服，先灰度两个仓，再全量。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一个订单后台写 PRD 并组织一次评审</h2>
<p><strong>场景</strong>：一家做企业采购的团队，要把订单后台从「Excel + 聊天工具」迁进系统。本期只做一个模块：订单改价与批量导出。使用方是运营（发起改价）、财务（对账）、主管（审批）三类角色，日订单量在几千到一万之间（以实际数据为准）。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>开发窗口 3 周，后端 1 人、前端 1 人、测试 0.5 人；</li>
<li>旧系统有三年前的历史订单，字段缺失，不能全量迁移；</li>
<li>财务的对账口径已经固定，任何改价必须留痕、可追溯到人；</li>
<li>上线不能停服，先灰度两个仓，再全量。</li>
</ul>
<p><strong>交付定义</strong>：开发能据此拆任务，测试能据此写用例，评审能据此做出「做 / 不做 / 砍什么」的决定。三者有一个不成立，文档就还没写完。</p>
<h3>1.1 问题、目标与证据</h3>
<p>| 项 | 内容 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">评审与协作</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/02-%E8%AF%84%E5%AE%A1%E4%B8%8E%E5%8D%8F%E4%BD%9C.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/02-%E8%AF%84%E5%AE%A1%E4%B8%8E%E5%8D%8F%E4%BD%9C.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一次 90 分钟的评审压到 45 分钟并做出三个决策</h2>
<p><strong>场景</strong>：支付流程要改版，新增企业转账和拆单支付。上一次同类评审开了 90 分钟，结束时没有人说得清「到底定了什么」，开发按自己的理解做了两周，联调时才发现财务的对账口径没对齐。</p>
<p><strong>本次约束</strong>：</p>
<ul>
<li>老板只给 45 分钟，且只能参加前 20 分钟；</li>
<li>涉及支付网关、财务、客服三方外部依赖，任何一方没对齐都会卡在上线前；</li>
<li>开发窗口两周，评审后第二天必须开工；</li>
<li>本次必须解决三个问题：企业转账是否本期做、拆单退款由谁发起、对账文件由谁生成。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一次 90 分钟的评审压到 45 分钟并做出三个决策</h2>
<p><strong>场景</strong>：支付流程要改版，新增企业转账和拆单支付。上一次同类评审开了 90 分钟，结束时没有人说得清「到底定了什么」，开发按自己的理解做了两周，联调时才发现财务的对账口径没对齐。</p>
<p><strong>本次约束</strong>：</p>
<ul>
<li>老板只给 45 分钟，且只能参加前 20 分钟；</li>
<li>涉及支付网关、财务、客服三方外部依赖，任何一方没对齐都会卡在上线前；</li>
<li>开发窗口两周，评审后第二天必须开工；</li>
<li>本次必须解决三个问题：企业转账是否本期做、拆单退款由谁发起、对账文件由谁生成。</li>
</ul>
<p><strong>目标</strong>：会议结束时，三个问题都有明确结论、有责任人、有复核时间；没结论的进入问题池并写清「缺什么信息」。</p>
<h3>1.1 会前先定「要决定什么」</h3>
<p>评审不是「讲一遍方案」，而是「收集反对意见并做决定」。所以会前第一件事不是写 PPT，而是把要决策的问题写成可选项。</p>
<p>| 待决问题 | 选项 | 推荐 | 影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">文档 与 交付</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/01-PRD.html" target="_blank">PRD</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/02-%E8%AF%84%E5%AE%A1%E4%B8%8E%E5%8D%8F%E4%BD%9C.html" target="_blank">评审与协作</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/01-PRD.html" target="_blank">PRD</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/03-%E6%96%87%E6%A1%A3%E4%B8%8E%E4%BA%A4%E4%BB%98/02-%E8%AF%84%E5%AE%A1%E4%B8%8E%E5%8D%8F%E4%BD%9C.html" target="_blank">评审与协作</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">指标体系</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/01-%E6%8C%87%E6%A0%87%E4%BD%93%E7%B3%BB.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/01-%E6%8C%87%E6%A0%87%E4%BD%93%E7%B3%BB.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一个协作工具搭指标树，判断增长是真是假</h2>
<p><strong>场景</strong>：一个 B 端协作 SaaS，免费版 + 按席位付费。最近两个季度 DAU 在涨，但付费转化和续费没有同步变化，客诉里「通知太多」的反馈变多。团队每天只看一张 DAU 曲线，老板要求下季度汇报一套能解释「增长来自哪里」的指标。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>埋点已有两年，中间改过一次「活跃」的定义，历史数据不能直接拼；</li>
<li>数据团队只有 1 个人，不能为每个问题都新建宽表；</li>
<li>销售按席位收费，收入口径与「活跃用户数」不是一回事；</li>
<li>下季度要决定是否继续投入推送拉活，必须给出可验证的判断。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一个协作工具搭指标树，判断增长是真是假</h2>
<p><strong>场景</strong>：一个 B 端协作 SaaS，免费版 + 按席位付费。最近两个季度 DAU 在涨，但付费转化和续费没有同步变化，客诉里「通知太多」的反馈变多。团队每天只看一张 DAU 曲线，老板要求下季度汇报一套能解释「增长来自哪里」的指标。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>埋点已有两年，中间改过一次「活跃」的定义，历史数据不能直接拼；</li>
<li>数据团队只有 1 个人，不能为每个问题都新建宽表；</li>
<li>销售按席位收费，收入口径与「活跃用户数」不是一回事；</li>
<li>下季度要决定是否继续投入推送拉活，必须给出可验证的判断。</li>
</ul>
<p><strong>目标</strong>：产出一棵能落到 SQL 的指标树、一份口径字典、三层看板，以及「什么情况下停止推送」的决策规则。</p>
<h3>1.1 先定决策场景，再选指标</h3>
<p>指标不是越多越好，而是「为哪个决定服务」。先把要做的决定列出来，再倒推需要什么数。</p>
<p>| 决策 | 需要的指标 | 不需要的指标 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">数据分析与实验</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/02-%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E5%AE%9E%E9%AA%8C.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/02-%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E5%AE%9E%E9%AA%8C.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：用现有埋点判断新功能是否该继续投入</h2>
<p><strong>场景</strong>：协作工具上线了「自动化规则」：当任务状态变化时，自动通知、自动建子任务。上线 4 周，周使用率很低（以实际数据为准，假设只有个位数百分比）。老板问：下个版本继续投入做模板和条件分支，还是把人力撤回去。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>没有上线前的对照组，功能是全量发布的；</li>
<li>埋点只覆盖 Web 端，移动端没有上报；</li>
<li>数据团队排期一周，下个版本两周后定稿；</li>
<li>功能本身不复杂，但入口深、需要先建规则再触发。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：用现有埋点判断新功能是否该继续投入</h2>
<p><strong>场景</strong>：协作工具上线了「自动化规则」：当任务状态变化时，自动通知、自动建子任务。上线 4 周，周使用率很低（以实际数据为准，假设只有个位数百分比）。老板问：下个版本继续投入做模板和条件分支，还是把人力撤回去。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>没有上线前的对照组，功能是全量发布的；</li>
<li>埋点只覆盖 Web 端，移动端没有上报；</li>
<li>数据团队排期一周，下个版本两周后定稿；</li>
<li>功能本身不复杂，但入口深、需要先建规则再触发。</li>
</ul>
<p><strong>约束带来的边界</strong>：只能回答 Web 用户里「不知道 / 不需要 / 不好用 / 没场景」的比例，答不了移动端有没有需求；没有对照组，就不能直接说功能带来了留存。</p>
<p><strong>目标</strong>：不是证明「功能好不好」，而是回答「使用率低是因为不知道、不需要、不好用，还是没场景」，并给出继续/缩小/砍掉的决策和验证方式。</p>
<h3>1.1 把模糊问题拆成可回答的问题</h3>
<p>| 模糊问题 | 可回答的问题 | 需要的数 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">指标 与 数据</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/01-%E6%8C%87%E6%A0%87%E4%BD%93%E7%B3%BB.html" target="_blank">指标体系</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/02-%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E5%AE%9E%E9%AA%8C.html" target="_blank">数据分析与实验</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/01-%E6%8C%87%E6%A0%87%E4%BD%93%E7%B3%BB.html" target="_blank">指标体系</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/04-%E6%8C%87%E6%A0%87%E4%B8%8E%E6%95%B0%E6%8D%AE/02-%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E4%B8%8E%E5%AE%9E%E9%AA%8C.html" target="_blank">数据分析与实验</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">路线图与版本规划</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/01-%E8%B7%AF%E7%BA%BF%E5%9B%BE%E4%B8%8E%E7%89%88%E6%9C%AC%E8%A7%84%E5%88%92.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/01-%E8%B7%AF%E7%BA%BF%E5%9B%BE%E4%B8%8E%E7%89%88%E6%9C%AC%E8%A7%84%E5%88%92.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一个 B 端产品做下季度路线图并对外沟通</h2>
<p><strong>场景</strong>：一个审批流 SaaS，研发 12 人（8 开发、2 测试、1 设计、1 产品）。上季度路线图排了 12 个功能，实际完成 7 个；销售拿着路线图向客户承诺「下季度都有」，结果两次失信；团队连续加班，线上事故也变多。下季度不能再扩编，还要接两个大客户的定制诉求和一个合规改造节点。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>产能固定，12 人不变；</li>
<li>两个大客户的要求互相冲突，不能都进主线；</li>
<li>合规改造有硬性截止时间，不能延期；</li>
<li>技术债已经影响到发布速度，必须预留时间；</li>
<li>销售需要一个可以对外说的版本，但不能变成逐条承诺。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一个 B 端产品做下季度路线图并对外沟通</h2>
<p><strong>场景</strong>：一个审批流 SaaS，研发 12 人（8 开发、2 测试、1 设计、1 产品）。上季度路线图排了 12 个功能，实际完成 7 个；销售拿着路线图向客户承诺「下季度都有」，结果两次失信；团队连续加班，线上事故也变多。下季度不能再扩编，还要接两个大客户的定制诉求和一个合规改造节点。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>产能固定，12 人不变；</li>
<li>两个大客户的要求互相冲突，不能都进主线；</li>
<li>合规改造有硬性截止时间，不能延期；</li>
<li>技术债已经影响到发布速度，必须预留时间；</li>
<li>销售需要一个可以对外说的版本，但不能变成逐条承诺。</li>
</ul>
<p><strong>目标</strong>：产出一份「有目标、有分层、有缓冲、有砍单顺序」的路线图，以及一份销售能用的对外口径。</p>
<h3>1.1 先盘产能，不先列功能</h3>
<p>| 项 | 计算 | 结果 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">敏捷与项目管理</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/02-%E6%95%8F%E6%8D%B7%E4%B8%8E%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/02-%E6%95%8F%E6%8D%B7%E4%B8%8E%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一个连续延期的迭代拉回正轨</h2>
<p><strong>场景</strong>：一个 6 人团队（4 开发、1 测试、1 设计兼部分产品工作），连续 5 个迭代计划 10 个故事，实际完成 5–6 个。客户版本还有 3 周到期（约 1–2 个迭代），团队已经在连续加班，线上缺陷还在增加。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>不能扩编，也不能把测试外包；</li>
<li>客户版本有一个硬性交付日，不能整体延期；</li>
<li>有两个外部接口依赖，对方排期未定；</li>
<li>历史上插单频繁，平均每个迭代 3–4 个；</li>
<li>团队对「故事点」的理解不一致，估算经常吵。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一个连续延期的迭代拉回正轨</h2>
<p><strong>场景</strong>：一个 6 人团队（4 开发、1 测试、1 设计兼部分产品工作），连续 5 个迭代计划 10 个故事，实际完成 5–6 个。客户版本还有 3 周到期（约 1–2 个迭代），团队已经在连续加班，线上缺陷还在增加。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>不能扩编，也不能把测试外包；</li>
<li>客户版本有一个硬性交付日，不能整体延期；</li>
<li>有两个外部接口依赖，对方排期未定；</li>
<li>历史上插单频繁，平均每个迭代 3–4 个；</li>
<li>团队对「故事点」的理解不一致，估算经常吵。</li>
</ul>
<p><strong>目标</strong>：先用 1–2 个迭代保住客户版本的核心范围，再用三个迭代让计划量与实际完成量基本对齐（通常以完成率 80% 以上为参考，按团队历史波动调整），不靠加班换速度。</p>
<h3>1.1 先用数据描述现状</h3>
<p>| 指标 | 取法 | 现状（示例） |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">规划 与 迭代</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/01-%E8%B7%AF%E7%BA%BF%E5%9B%BE%E4%B8%8E%E7%89%88%E6%9C%AC%E8%A7%84%E5%88%92.html" target="_blank">路线图与版本规划</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/02-%E6%95%8F%E6%8D%B7%E4%B8%8E%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86.html" target="_blank">敏捷与项目管理</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/01-%E8%B7%AF%E7%BA%BF%E5%9B%BE%E4%B8%8E%E7%89%88%E6%9C%AC%E8%A7%84%E5%88%92.html" target="_blank">路线图与版本规划</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/05-%E8%A7%84%E5%88%92%E4%B8%8E%E8%BF%AD%E4%BB%A3/02-%E6%95%8F%E6%8D%B7%E4%B8%8E%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86.html" target="_blank">敏捷与项目管理</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">B 端产品设计</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/01-B%E7%AB%AF%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/01-B%E7%AB%AF%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一家制造企业设计多租户工单系统的权限模型</h2>
<p><strong>场景</strong>：一家制造企业，集团加 3 个工厂、2 个售后团队，共约 1200 人（示例数据量）。工单现在靠 Excel 和邮件流转，采购已经选定一套多租户 SaaS 工单系统，要求 6 周上线，<strong>不改代码，只做配置</strong>。约束条件写在合同附件里：</p>
<ul>
<li>集团运营看全部工单汇总；厂长只看本厂；售后工程师只看自己负责的客户；财务能看金额，但不能改工单状态。</li>
<li>成本价、客户联系人手机号只对指定角色可见。</li>
<li>单张工单金额超过 5000 元走厂长审批，超过 20000 元再加财务总监；客户投诉工单要售后经理与质量经理会签。</li>
<li>客户 IT 要求 SSO 登录，审计日志保留 1 年（示例），上线前与旧系统并行两周。</li>
<li>历史工单 18 万条，附件约 40 万个，要从旧系统迁移。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一家制造企业设计多租户工单系统的权限模型</h2>
<p><strong>场景</strong>：一家制造企业，集团加 3 个工厂、2 个售后团队，共约 1200 人（示例数据量）。工单现在靠 Excel 和邮件流转，采购已经选定一套多租户 SaaS 工单系统，要求 6 周上线，<strong>不改代码，只做配置</strong>。约束条件写在合同附件里：</p>
<ul>
<li>集团运营看全部工单汇总；厂长只看本厂；售后工程师只看自己负责的客户；财务能看金额，但不能改工单状态。</li>
<li>成本价、客户联系人手机号只对指定角色可见。</li>
<li>单张工单金额超过 5000 元走厂长审批，超过 20000 元再加财务总监；客户投诉工单要售后经理与质量经理会签。</li>
<li>客户 IT 要求 SSO 登录，审计日志保留 1 年（示例），上线前与旧系统并行两周。</li>
<li>历史工单 18 万条，附件约 40 万个，要从旧系统迁移。</li>
</ul>
<p>目标不是「把功能做全」，而是产出一套<strong>可复用的权限模型、审批流和验收表</strong>。做完这一单，后面 20 个同行业客户只换组织树和阈值，不再开代码分支。</p>
<p>这一单的交付物固定为五份：组织与租户边界表、功能/数据/字段三张权限表、审批流配置表、迁移对账报告、验收记录。每份都要能被下一个人直接拿去复用，而不是只存在实施顾问的电脑里。</p>
<p><strong>先做权限模型的原因</strong>：B 端项目最常见的返工不是功能少，而是权限太粗。第一版只有「管理员 / 普通用户」，第二个客户就会提出「销售只看自己、主管看团队、财务看全部但只能改金额」。一旦为客户写分支，后面每个客户都要维护一条分支，产品再也回不到主线。</p>
<p><strong>动手前确认</strong>：组织架构表含汇报线；岗位清单与兼岗情况；旧系统字段、状态机、附件存放方式；客户编码规则；SSO 协议是 OIDC 还是 SAML；审计保留期限与导出要求。本节金额、阈值、比例均为示例。</p>
<p>下面出现的存储表与模型设计属于平台侧工作，不是为这个客户改代码；给客户交付时只动配置。两者混在一起看，容易把「产品要支持多租户」误解成「这一单要写多租户代码」。</p>
<h3>1.1 组织、租户与数据边界</h3>
<p>先分清五个概念。它们经常被混成一张「部门表」，导致后面权限、报表、计费全部缠在一起。</p>
<p>| 概念 | 回答的问题 | 本项目的取值 | 变更频率 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">SaaS 与商业化</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/02-SaaS%E4%B8%8E%E5%95%86%E4%B8%9A%E5%8C%96.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/02-SaaS%E4%B8%8E%E5%95%86%E4%B8%9A%E5%8C%96.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一家项目管理 SaaS 重做计费模型与续费整改</h2>
<p><strong>场景</strong>：一家做项目管理工具的 SaaS 公司，30 人，800 个付费租户，ARR 示例 1200 万元，MRR 示例 100 万元（年初），NRR 88%，毛利率 62.6%（均为示例）。现有计费只有一个维度：<strong>按席位 99 元/人/月</strong>（示例）。全年新签约约 128 个租户（月均约 11 个），但老客户降级与流失把新增吃掉，年末 MRR 只涨到 104 万元，一年增长 4%。</p>
<p>三个具体问题摆在桌面上：</p>
<ul>
<li>大客户把账号共享给全公司，只买 20 个席位，实际 200 人用；按席位收不到钱。</li>
<li>自动化任务与 API 调用是真实成本，但重度用户和轻度用户付一样的钱。</li>
<li>账单只有一行「本月席位费」，客户问「为什么比上月多 3000 元」，客服答不出来。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一家项目管理 SaaS 重做计费模型与续费整改</h2>
<p><strong>场景</strong>：一家做项目管理工具的 SaaS 公司，30 人，800 个付费租户，ARR 示例 1200 万元，MRR 示例 100 万元（年初），NRR 88%，毛利率 62.6%（均为示例）。现有计费只有一个维度：<strong>按席位 99 元/人/月</strong>（示例）。全年新签约约 128 个租户（月均约 11 个），但老客户降级与流失把新增吃掉，年末 MRR 只涨到 104 万元，一年增长 4%。</p>
<p>三个具体问题摆在桌面上：</p>
<ul>
<li>大客户把账号共享给全公司，只买 20 个席位，实际 200 人用；按席位收不到钱。</li>
<li>自动化任务与 API 调用是真实成本，但重度用户和轻度用户付一样的钱。</li>
<li>账单只有一行「本月席位费」，客户问「为什么比上月多 3000 元」，客服答不出来。</li>
</ul>
<p>目标：8 周上线新计费系统；12 个月内 NRR 到 100% 以上、毛利率到 75%；<strong>老客户不立即涨价</strong>；账单必须能逐项复算。</p>
<p><strong>先做收入拆解的原因</strong>：NRR 低有很多种原因，可能是获客不对、激活不足、降级、被动流失。不拆开就做「涨价」，往往会把还能救的客户先推走。</p>
<p><strong>动手前确认</strong>：近 24 个月的合同、账单、收款流水；每个租户的席位、用量、工单量；云资源与第三方成本能否按租户归集；销售是否有私下折扣承诺。</p>
<p><strong>要交付的五样东西</strong>：新价格书（三档 + 超额单价）、合同附件（计费单位、封顶、调价、数据导出）、可下钻的账单模板、老客户迁移方案、12 项验收清单。没有这五样，所谓「上线新计费」只是改了个价格页。</p>
<blockquote>
<p>本节出现的金额、比例、折扣、套餐额度均为示例，只用于说明算法，不代表任何厂商的真实报价；实际数字以公司财务与合同为准。</p>
</blockquote>
<h3>1.1 收入桥：把 NRR 拆成四个动作</h3>
<p>MRR 不是「上月加本月新签」这么简单。期初与期末之间只有四个动作：新签、扩容、降级、流失。留存类指标（NRR、GRR）通常按 <strong>12 个月</strong>看，也可以按季度，但同一张报表里周期必须一致；下面这张桥是一年的桥，不能把月度数字直接当年度 NRR。</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>期初 MRR（年初）              100.0 万</span></span>
<span class="line"><span>+ 新签（New）                 +16.0 万   约 128 个租户 × ARPU 1250 元</span></span>
<span class="line"><span>+ 扩容（Expansion）            +8.0 万</span></span>
<span class="line"><span>- 降级（Contraction）          -8.0 万   约 32 个中客户</span></span>
<span class="line"><span>- 流失（Churn）               -12.0 万   约 120 个租户 × ARPU 1000 元</span></span>
<span class="line"><span>= 期末 MRR（年末）            104.0 万</span></span>
<span class="line"><span></span></span>
<span class="line"><span>NRR = (100 + 8 - 8 - 12) / 100 = 88%</span></span>
<span class="line"><span>GRR = (100 - 8 - 12) / 100     = 80%</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意 NRR <strong>不含新签</strong>。新签是增长，不是留存；把新签算进 NRR，会让一条正在漏水的船看起来在加速。</p>
<p>| 指标 | 公式 | 回答的问题 | 本案例（示例） |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">B端产品</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/01-B%E7%AB%AF%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1.html" target="_blank">B端产品设计</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/02-SaaS%E4%B8%8E%E5%95%86%E4%B8%9A%E5%8C%96.html" target="_blank">SaaS与商业化</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/01-B%E7%AB%AF%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1.html" target="_blank">B端产品设计</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/06-B%E7%AB%AF%E4%BA%A7%E5%93%81/02-SaaS%E4%B8%8E%E5%95%86%E4%B8%9A%E5%8C%96.html" target="_blank">SaaS与商业化</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">AI 产品决策</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/01-AI%E4%BA%A7%E5%93%81%E5%86%B3%E7%AD%96.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/01-AI%E4%BA%A7%E5%93%81%E5%86%B3%E7%AD%96.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：评估客服场景该不该上大模型，并给出成本上限</h2>
<p><strong>场景</strong>：一家 SaaS 公司的客服团队约 46 人（按满负荷折算），每月约 6 万次会话（示例），人工平均处理时长 8 分钟，人力成本按 1.2 万元/人月（示例）。老板给的目标很直接：「上大模型，替代一半人工。」团队已经试过两个模型，demo 效果不错，但没人能回答三个问题：<strong>哪些会话能交给模型、错误率到什么程度可以上线、每月最多花多少钱</strong>。</p>
<p>约束条件：</p>
<ul>
<li>客户对话可能含手机号、合同信息，不能发给未签约的第三方模型服务。</li>
<li>回答必须能引用知识库原文，不能只说「根据文档」。</li>
<li>退款、账号安全、合同变更三类会话必须转人工，不允许模型直接给结论。</li>
<li>上线窗口 10 周，先灰度 5% 流量，指标不达标就回滚。</li>
<li>成本上限由业务给出：单次会话的 AI 相关成本不超过人工成本的 20%。</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：评估客服场景该不该上大模型，并给出成本上限</h2>
<p><strong>场景</strong>：一家 SaaS 公司的客服团队约 46 人（按满负荷折算），每月约 6 万次会话（示例），人工平均处理时长 8 分钟，人力成本按 1.2 万元/人月（示例）。老板给的目标很直接：「上大模型，替代一半人工。」团队已经试过两个模型，demo 效果不错，但没人能回答三个问题：<strong>哪些会话能交给模型、错误率到什么程度可以上线、每月最多花多少钱</strong>。</p>
<p>约束条件：</p>
<ul>
<li>客户对话可能含手机号、合同信息，不能发给未签约的第三方模型服务。</li>
<li>回答必须能引用知识库原文，不能只说「根据文档」。</li>
<li>退款、账号安全、合同变更三类会话必须转人工，不允许模型直接给结论。</li>
<li>上线窗口 10 周，先灰度 5% 流量，指标不达标就回滚。</li>
<li>成本上限由业务给出：单次会话的 AI 相关成本不超过人工成本的 20%。</li>
</ul>
<p>目标不是「上一个 AI 客服」，而是产出一张<strong>场景决策矩阵、一套评测集、一份成本测算表和一张上线门槛表</strong>。做完之后，老板能看到「能省多少、要花多少、风险在哪」，而不是只看一个 demo。</p>
<p><strong>先做任务分层的原因</strong>：客服不是一个任务，是十几个意图的集合。密码重置和退款争议的错误成本差几个数量级，用同一个模型、同一个准确率指标去评估，结论一定是错的。</p>
<p><strong>动手前确认</strong>：近 3 个月会话抽样；知识库文档的版本与权限；工单系统的转人工接口；模型服务的数据条款；客服团队谁能抽出两天做标注。本节金额、比例、阈值均为示例。</p>
<h3>1.1 会话分层与错误成本</h3>
<p>先按「意图」拆，不按「渠道」拆。渠道决定接入方式，意图决定能不能用 AI。</p>
<p>| 意图 | 占比 | 现有解决方式 | AI 适合度 | 错误成本 | 结论 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">AI 产品度量与成本</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/02-AI%E4%BA%A7%E5%93%81%E5%BA%A6%E9%87%8F%E4%B8%8E%E6%88%90%E6%9C%AC.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/02-AI%E4%BA%A7%E5%93%81%E5%BA%A6%E9%87%8F%E4%B8%8E%E6%88%90%E6%9C%AC.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一个 AI 写作助手建立单位经济模型并压成本</h2>
<p><strong>场景</strong>：一个 AI 写作助手，月活 2 万，付费用户 3000，混合 ARPU 39 元/月（示例），月收入 11.7 万元。毛利率只有 42%，财务要求 4 周内看到成本结构，并把毛利率拉到 70% 以上。约束是<strong>不能降质量</strong>：盲测结果不差于基线（低 2 个百分点以内按抽样波动处理，超过即视为下降），事实错误率不能上升。</p>
<p>现有数据很粗：只记录了每天的总 token 数和模型账单，没有按任务、用户、租户归集。团队知道「模型贵」，但不知道贵在哪一类任务、哪一类用户，也不知道优化后会不会把质量改坏。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一个 AI 写作助手建立单位经济模型并压成本</h2>
<p><strong>场景</strong>：一个 AI 写作助手，月活 2 万，付费用户 3000，混合 ARPU 39 元/月（示例），月收入 11.7 万元。毛利率只有 42%，财务要求 4 周内看到成本结构，并把毛利率拉到 70% 以上。约束是<strong>不能降质量</strong>：盲测结果不差于基线（低 2 个百分点以内按抽样波动处理，超过即视为下降），事实错误率不能上升。</p>
<p>现有数据很粗：只记录了每天的总 token 数和模型账单，没有按任务、用户、租户归集。团队知道「模型贵」，但不知道贵在哪一类任务、哪一类用户，也不知道优化后会不会把质量改坏。</p>
<p>目标不是「换个便宜模型」，而是产出四样东西：<strong>任务单元定义、成本拆解表、分群成本表、质量回归门槛</strong>。做完之后，任何一次模型或 Prompt 改动，都能回答「成本降了多少、质量有没有掉、哪些用户在补贴哪些用户」。</p>
<p><strong>先定义任务单元的原因</strong>：按「API 调用」算成本会漏掉重试、检索、后处理；按「用户」算又太粗，无法定位问题。只有按「一次完整生成」算，才能同时对上产品体验和财务账单。</p>
<p><strong>动手前确认</strong>：近 60 天请求日志是否带 <code>request_id</code>；模型账单能否按日期与模型版本拆分；付费与免费用户的用量是否分开；有没有一套可复跑的质量评测集。</p>
<blockquote>
<p>本节所有单价、用量、比例、门槛均为示例，只用于说明计算方法；模型单价、计费规则与缓存折扣以实际供应商账单为准。</p>
</blockquote>
<h3>1.1 定义任务单元</h3>
<p>一次「生成」不是一次模型调用。用户点一次「生成文案」，背后可能是：意图识别、大纲、正文、润色、事实校验，共 3 到 5 次调用。</p>
<p>| 层次 | 单位 | 用途 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">AI产品</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/01-AI%E4%BA%A7%E5%93%81%E5%86%B3%E7%AD%96.html" target="_blank">AI产品决策</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/02-AI%E4%BA%A7%E5%93%81%E5%BA%A6%E9%87%8F%E4%B8%8E%E6%88%90%E6%9C%AC.html" target="_blank">AI产品度量与成本</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/01-AI%E4%BA%A7%E5%93%81%E5%86%B3%E7%AD%96.html" target="_blank">AI产品决策</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/07-AI%E4%BA%A7%E5%93%81/02-AI%E4%BA%A7%E5%93%81%E5%BA%A6%E9%87%8F%E4%B8%8E%E6%88%90%E6%9C%AC.html" target="_blank">AI产品度量与成本</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">上线与发布</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/01-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E5%8F%91%E5%B8%83.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/01-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E5%8F%91%E5%B8%83.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：一次灰度发布从上线清单到复盘</h2>
<p><strong>场景</strong>：一个多租户 SaaS 的报表模块，把「同步导出 Excel」改成「异步任务 + 完成后邮件与站内信通知」。改动跨前端导出按钮与进度页、后端新增 <code>report_job</code> 表、<code>report</code> 表加三个可空列、一个常驻 worker、一家第三方邮件服务。日活约 8000，付费客户 120 家。</p>
<p><strong>约束</strong>（这些约束决定方案，不是背景装饰）：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>来源</th>
<th>对方案的影响</th>
</tr>
</thead>
<tbody>
<tr>
<td>不能停机</td>
<td>客户 9:00–18:00 在用，合同 SLA 99.9%</td>
<td>只能滚动发布，不开维护窗口</td>
</tr>
<tr>
<td>迁移只增不减</td>
<td>新列可空、有默认值，老代码能忽略</td>
<td>不删列、不改类型、不重命名</td>
</tr>
<tr>
<td>人力 4 人</td>
<td>1 运维、2 后端、1 前端</td>
<td>灰度压到 4 批，观察靠看板不靠人盯</td>
</tr>
<tr>
<td>3 家大客户要提前告知</td>
<td>合同写明重大变更提前 7 天</td>
<td>通知走客户成功，不走群公告</td>
</tr>
<tr>
<td>导出是高频动作</td>
<td>日均约 1.2 万次</td>
<td>出问题不是「少个功能」，是核心流程断</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：一次灰度发布从上线清单到复盘</h2>
<p><strong>场景</strong>：一个多租户 SaaS 的报表模块，把「同步导出 Excel」改成「异步任务 + 完成后邮件与站内信通知」。改动跨前端导出按钮与进度页、后端新增 <code>report_job</code> 表、<code>report</code> 表加三个可空列、一个常驻 worker、一家第三方邮件服务。日活约 8000，付费客户 120 家。</p>
<p><strong>约束</strong>（这些约束决定方案，不是背景装饰）：</p>
<p>| 约束 | 来源 | 对方案的影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">增长与运营</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/02-%E5%A2%9E%E9%95%BF%E4%B8%8E%E8%BF%90%E8%90%A5.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/02-%E5%A2%9E%E9%95%BF%E4%B8%8E%E8%BF%90%E8%90%A5.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：一次留存下滑的结构诊断与 30 天动作</h2>
<blockquote>
<p>本文所有数字均为<strong>示例</strong>，仅用于说明口径与算法，<strong>以实际数据为准</strong>，不代表任何真实产品。</p>
</blockquote>
<p><strong>场景</strong>：一个协作笔记工具，月新增注册约 4 万（示例）。近 3 个月 7 日留存从 26.6% 掉到 19.4%，投放预算没变，但获客结构变了：信息流从 20% 升到 60%。管理层的要求是「下周就看到数字抬头」。</p>
<p><strong>约束</strong>（决定了动作的优先级，不是背景）：</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：一次留存下滑的结构诊断与 30 天动作</h2>
<blockquote>
<p>本文所有数字均为<strong>示例</strong>，仅用于说明口径与算法，<strong>以实际数据为准</strong>，不代表任何真实产品。</p>
</blockquote>
<p><strong>场景</strong>：一个协作笔记工具，月新增注册约 4 万（示例）。近 3 个月 7 日留存从 26.6% 掉到 19.4%，投放预算没变，但获客结构变了：信息流从 20% 升到 60%。管理层的要求是「下周就看到数字抬头」。</p>
<p><strong>约束</strong>（决定了动作的优先级，不是背景）：</p>
<p>| 约束 | 来源 | 对动作的影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">上线 与 运营</title>
    <id>https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/</id>
    <link href="https://studynotes-90w.pages.dev/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/01-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E5%8F%91%E5%B8%83.html" target="_blank">上线与发布</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/02-%E5%A2%9E%E9%95%BF%E4%B8%8E%E8%BF%90%E8%90%A5.html" target="_blank">增长与运营</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/01-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E5%8F%91%E5%B8%83.html" target="_blank">上线与发布</a></li>
<li><a href="/notes/01-%E4%BA%A7%E5%93%81/08-%E4%B8%8A%E7%BA%BF%E4%B8%8E%E8%BF%90%E8%90%A5/02-%E5%A2%9E%E9%95%BF%E4%B8%8E%E8%BF%90%E8%90%A5.html" target="_blank">增长与运营</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">视觉基础</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/01-%E8%A7%86%E8%A7%89%E5%9F%BA%E7%A1%80.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/01-%E8%A7%86%E8%A7%89%E5%9F%BA%E7%A1%80.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一套 B 端后台定间距、字号、颜色三套 token，并落到 CSS 变量</h2>
<p><strong>场景</strong>：一套跑了三年的工单系统，前端 4 人、后端 3 人，没有设计系统。37 个页面里数出 14 种字号、15 种间距、11 种灰色。设计师每开一张新稿都要重新决定「这里用几号字」，开发每接一个需求都要从截图里吸色。目标：两周内产出间距、字号、颜色三套 token，落成 CSS 变量，先覆盖工单列表、工单详情、新建工单、登录、报表 5 个页面。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>业务不停，只能增量替换；旧页面允许暂时保留硬编码，新代码禁止写裸值</li>
<li>本期只做浅色模式；token 结构要给深色留位置，避免下一季度推倒重来</li>
<li>组件库自研，没有现成的 token 构建链路，只能靠 CSS 自定义属性</li>
<li>设计师 1 人，前端每周只能配合 2 天</li>
<li>验收按 WCAG 2.2 AA 执行（以官方当前版本为准）：正文 4.5:1，大字、控件边界 3:1</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一套 B 端后台定间距、字号、颜色三套 token，并落到 CSS 变量</h2>
<p><strong>场景</strong>：一套跑了三年的工单系统，前端 4 人、后端 3 人，没有设计系统。37 个页面里数出 14 种字号、15 种间距、11 种灰色。设计师每开一张新稿都要重新决定「这里用几号字」，开发每接一个需求都要从截图里吸色。目标：两周内产出间距、字号、颜色三套 token，落成 CSS 变量，先覆盖工单列表、工单详情、新建工单、登录、报表 5 个页面。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>业务不停，只能增量替换；旧页面允许暂时保留硬编码，新代码禁止写裸值</li>
<li>本期只做浅色模式；token 结构要给深色留位置，避免下一季度推倒重来</li>
<li>组件库自研，没有现成的 token 构建链路，只能靠 CSS 自定义属性</li>
<li>设计师 1 人，前端每周只能配合 2 天</li>
<li>验收按 WCAG 2.2 AA 执行（以官方当前版本为准）：正文 4.5:1，大字、控件边界 3:1</li>
</ul>
<p><strong>为什么先做这三套</strong>：颜色决定「能不能看清」，字号决定「能不能读到」，间距决定「能不能看出分组」。这三件事覆盖了日常返工的大头；圆角、阴影、动效可以后补，它们不影响信息是否可读。</p>
<p><strong>交付物（5 项，缺一项不算完成）</strong>：</p>
<p>| # | 产出物 | 确认人 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">设计原则</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/02-%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/02-%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一条核心流程做启发式走查，交付可复测的整改清单</h2>
<p><strong>场景</strong>：一套 B 端审批系统的「新建审批」流程，上线半年，客服每周收到 20 多条「填不明白」的反馈。流程本身不复杂：选类型、填金额与事由、传附件、选审批人、提交。但用户会在某个字段卡住，反复提交失败，最后打电话问客服。产品经理的诉求是「把体验优化一下」，没有具体方向。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>后端不能改，本轮只动前端结构、校验与文案</li>
<li>两周内交付，设计师 1 人、产品 1 人、前端 1 人配合</li>
<li>不能做大规模埋点改造，只能用现有日志 + 小样本测试</li>
<li>整改必须能排优先级，不能给出一张 80 条、没人做得完的清单</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一条核心流程做启发式走查，交付可复测的整改清单</h2>
<p><strong>场景</strong>：一套 B 端审批系统的「新建审批」流程，上线半年，客服每周收到 20 多条「填不明白」的反馈。流程本身不复杂：选类型、填金额与事由、传附件、选审批人、提交。但用户会在某个字段卡住，反复提交失败，最后打电话问客服。产品经理的诉求是「把体验优化一下」，没有具体方向。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>后端不能改，本轮只动前端结构、校验与文案</li>
<li>两周内交付，设计师 1 人、产品 1 人、前端 1 人配合</li>
<li>不能做大规模埋点改造，只能用现有日志 + 小样本测试</li>
<li>整改必须能排优先级，不能给出一张 80 条、没人做得完的清单</li>
</ul>
<p><strong>为什么用走查而不是直接改</strong>：「体验不好」是结论，不是问题。走查的价值是把「用户填不明白」拆成「哪个页面、哪一步、什么现象、违反哪条规律、证据是什么」，拆到能排期、能验收的粒度。</p>
<h3>1.1 第一步：锁定范围与任务</h3>
<p>走查最怕范围失控。先把流程拆成三个用户任务，每个任务一条可判定的成功标准：</p>
<p>| 任务 | 起点 | 成功标准 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">设计风格谱系</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/03-%E8%AE%BE%E8%AE%A1%E9%A3%8E%E6%A0%BC%E8%B0%B1%E7%B3%BB.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/03-%E8%AE%BE%E8%AE%A1%E9%A3%8E%E6%A0%BC%E8%B0%B1%E7%B3%BB.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一条开发者工具产品定风格，交付 token 与两页样例</h2>
<p><strong>场景</strong>：一套 API 调试工具，用户是后端与前端开发者，控制台平均每天使用 1–2 小时；另有一个官网负责获客。早期版本照着某开源项目抄了一套深色界面，结果控制台「看着像半成品」，官网「看着像内部工具」。品牌主色已经定了（蓝紫 <code>#4F46E5</code>），不能改。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>主色不动，只能调整明度、饱和度与用法</li>
<li>设计 1 人、前端 2 人，没有插画师，图片素材只有产品截图</li>
<li>必须支持浅色与深色两套，开发者会在夜间使用</li>
<li>官网与控制台共用一套骨架，避免两套维护</li>
<li>本轮不做品牌重塑，只定视觉语言与组件样例</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一条开发者工具产品定风格，交付 token 与两页样例</h2>
<p><strong>场景</strong>：一套 API 调试工具，用户是后端与前端开发者，控制台平均每天使用 1–2 小时；另有一个官网负责获客。早期版本照着某开源项目抄了一套深色界面，结果控制台「看着像半成品」，官网「看着像内部工具」。品牌主色已经定了（蓝紫 <code>#4F46E5</code>），不能改。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>主色不动，只能调整明度、饱和度与用法</li>
<li>设计 1 人、前端 2 人，没有插画师，图片素材只有产品截图</li>
<li>必须支持浅色与深色两套，开发者会在夜间使用</li>
<li>官网与控制台共用一套骨架，避免两套维护</li>
<li>本轮不做品牌重塑，只定视觉语言与组件样例</li>
</ul>
<p><strong>为什么先定风格再定组件</strong>：组件的圆角、阴影、密度、字重全都由风格决定。先做组件再补风格，会出现「按钮是简约风、卡片是新粗野」的拼装感，返工成本更高。</p>
<h3>1.1 第一步：三个约束打分</h3>
<p>风格不是选美，是在约束里找可行解。三项各打 1–5 分：</p>
<p>| 约束 | 问题 | 本案评分 | 推论 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">设计基础</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/01-%E8%A7%86%E8%A7%89%E5%9F%BA%E7%A1%80.html" target="_blank">视觉基础</a></li>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/02-%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.html" target="_blank">设计原则</a></li>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/03-%E8%AE%BE%E8%AE%A1%E9%A3%8E%E6%A0%BC%E8%B0%B1%E7%B3%BB.html" target="_blank">设计风格谱系</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/01-%E8%A7%86%E8%A7%89%E5%9F%BA%E7%A1%80.html" target="_blank">视觉基础</a></li>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/02-%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99.html" target="_blank">设计原则</a></li>
<li><a href="/notes/02-UI/01-%E8%AE%BE%E8%AE%A1%E5%9F%BA%E7%A1%80/03-%E8%AE%BE%E8%AE%A1%E9%A3%8E%E6%A0%BC%E8%B0%B1%E7%B3%BB.html" target="_blank">设计风格谱系</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">交互设计</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/01-%E4%BA%A4%E4%BA%92%E8%AE%BE%E8%AE%A1.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/01-%E4%BA%A4%E4%BA%92%E8%AE%BE%E8%AE%A1.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一条采购申请流程的交互说明补全并交付</h2>
<p><strong>场景</strong>：一套内部采购系统，申请流程是「选类型 → 填明细 → 上传报价 → 选审批人 → 提交」。设计稿只有五张正常态页面，开发按图做完，上线后问题集中爆发：用户重复提交、审批人默认错、提交超时后不知道成没成、被驳回后要重填全部内容。产品要求「两周内把交互补全」，不改后端主流程。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>后端暂时没有幂等键，重复提交只能靠前端拦截，并推动后端补</li>
<li>需要兼容仍在使用的旧版浏览器，不能用较新的 API</li>
<li>桌面端为主，但部门负责人会在手机上审批</li>
<li>交互说明要能直接给开发和测试用，不能写成设计理念</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一条采购申请流程的交互说明补全并交付</h2>
<p><strong>场景</strong>：一套内部采购系统，申请流程是「选类型 → 填明细 → 上传报价 → 选审批人 → 提交」。设计稿只有五张正常态页面，开发按图做完，上线后问题集中爆发：用户重复提交、审批人默认错、提交超时后不知道成没成、被驳回后要重填全部内容。产品要求「两周内把交互补全」，不改后端主流程。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>后端暂时没有幂等键，重复提交只能靠前端拦截，并推动后端补</li>
<li>需要兼容仍在使用的旧版浏览器，不能用较新的 API</li>
<li>桌面端为主，但部门负责人会在手机上审批</li>
<li>交互说明要能直接给开发和测试用，不能写成设计理念</li>
</ul>
<p><strong>为什么要补交互说明</strong>：设计稿回答「长什么样」，不回答「什么条件下显示什么、点了发生什么、失败怎么办」。这些不写清楚，开发只能猜，测试也没法写用例，最后靠上线后收集投诉来补。</p>
<h3>1.1 第一步：盘点任务与路径</h3>
<p>先不画界面，列出用户真正要完成的事：</p>
<p>| 任务 | 触发 | 成功标准 | 高频异常 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">页面结构与状态</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/02-%E9%A1%B5%E9%9D%A2%E7%BB%93%E6%9E%84%E4%B8%8E%E7%8A%B6%E6%80%81.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/02-%E9%A1%B5%E9%9D%A2%E7%BB%93%E6%9E%84%E4%B8%8E%E7%8A%B6%E6%80%81.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一个工单列表页的六种状态画全并交付</h2>
<p><strong>场景</strong>：一套客服工单系统，列表页是使用频率最高的界面。设计稿只有一张「有数据」的图，开发照着做完，上线后问题不断：新用户进来看到空白，以为系统坏了；搜索无结果也显示「暂无数据」，用户不知道该清筛选；接口报错时页面一片白，客服只能刷新；没权限的账号看到空列表，反复找主管确认。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>表格组件是自研的，改结构成本高，本轮只补状态与文案</li>
<li>没有虚拟滚动，超过 500 行会卡，先用分页控制</li>
<li>移动端只做只读查看，不做编辑</li>
<li>设计 1 人、前端 1 人，两周交付</li>
<li>列表页与详情页必须共用同一套状态定义，文案和矩阵不能各写一套</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一个工单列表页的六种状态画全并交付</h2>
<p><strong>场景</strong>：一套客服工单系统，列表页是使用频率最高的界面。设计稿只有一张「有数据」的图，开发照着做完，上线后问题不断：新用户进来看到空白，以为系统坏了；搜索无结果也显示「暂无数据」，用户不知道该清筛选；接口报错时页面一片白，客服只能刷新；没权限的账号看到空列表，反复找主管确认。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>表格组件是自研的，改结构成本高，本轮只补状态与文案</li>
<li>没有虚拟滚动，超过 500 行会卡，先用分页控制</li>
<li>移动端只做只读查看，不做编辑</li>
<li>设计 1 人、前端 1 人，两周交付</li>
<li>列表页与详情页必须共用同一套状态定义，文案和矩阵不能各写一套</li>
</ul>
<p><strong>为什么状态要先画</strong>：页面结构决定「信息放哪」，状态决定「没有信息时放什么」。只画有数据态，等于只设计了系统正常运行时的那一半。</p>
<h3>1.1 第一步：判定页面类型</h3>
<p>工单列表是「集合视图 + 可批量操作」，所以骨架按列表页来：筛选区、批量操作栏、表格、分页。<strong>不要在这个页面里塞复杂表单</strong>，那是详情页或独立表单页的职责。</p>
<h3>1.2 第二步：搭骨架</h3>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>页面标题：工单列表                    [导出] [新建工单]</span></span>
<span class="line"><span>├── 搜索框（工单号 / 标题 / 客户）</span></span>
<span class="line"><span>├── 常用筛选：状态下拉 · 优先级 · 负责人 · 时间范围</span></span>
<span class="line"><span>├── 更多筛选（折叠）：来源 · 标签 · SLA 状态</span></span>
<span class="line"><span>├── 批量操作栏（选中后出现）：已选 3 项  [批量分配] [批量关闭]</span></span>
<span class="line"><span>├── 表格</span></span>
<span class="line"><span>│   ├── 表头：勾选 · 工单号 · 标题 · 状态 · 优先级 · 负责人 · 更新时间 · 操作</span></span>
<span class="line"><span>│   ├── 数据行：可选中、行内操作不超过 3 个</span></span>
<span class="line"><span>│   └── 分页：共 1,204 条 · 20/页 · 跳到第 N 页</span></span>
<span class="line"><span>└── 空态 / 加载态 / 错误态（占据表格区域）</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><strong>骨架里要预留状态的位置</strong>。状态不是弹层，它占据表格区域，尺寸和表格一致，切换时页面不跳动。</p>
<h3>1.3 第三步：枚举状态</h3>
<p>六个基础状态，加三个叠加状态：</p>
<p>| # | 状态 | 触发条件 | 用户该看到什么 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">交互 与 信息架构</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/01-%E4%BA%A4%E4%BA%92%E8%AE%BE%E8%AE%A1.html" target="_blank">交互设计</a></li>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/02-%E9%A1%B5%E9%9D%A2%E7%BB%93%E6%9E%84%E4%B8%8E%E7%8A%B6%E6%80%81.html" target="_blank">页面结构与状态</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/01-%E4%BA%A4%E4%BA%92%E8%AE%BE%E8%AE%A1.html" target="_blank">交互设计</a></li>
<li><a href="/notes/02-UI/02-%E4%BA%A4%E4%BA%92%E4%B8%8E%E4%BF%A1%E6%81%AF%E6%9E%B6%E6%9E%84/02-%E9%A1%B5%E9%9D%A2%E7%BB%93%E6%9E%84%E4%B8%8E%E7%8A%B6%E6%80%81.html" target="_blank">页面结构与状态</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">设计系统与组件</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/01-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F%E4%B8%8E%E7%BB%84%E4%BB%B6.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/01-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F%E4%B8%8E%E7%BB%84%E4%BB%B6.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给 40 个页面的后台建最小设计系统并迁移 3 个核心组件</h2>
<p><strong>场景</strong>：一个 6 人前端团队维护的后台产品，40 多个页面，技术栈是 React + TypeScript + Ant Design（版本以团队和官方当前版本为准），设计侧用 Figma。当前状态：按钮有 7 种样式（3 种圆角、4 种蓝），弹窗有 3 套实现，表格分页有 4 种写法，每开一个新页面都要重新讨论一次标题字号。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>没有专职的设计系统团队，两个迭代（10 个工作日）里只能挤出约 6 人天</li>
<li>业务不能停，40 个页面不可能一次性重写</li>
<li>设计侧只有 1 名设计师，Figma 组件库已有，但命名和变体都没有收敛</li>
<li>不引入新的组件库，继续用 AntD，只在其上做一层收敛</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给 40 个页面的后台建最小设计系统并迁移 3 个核心组件</h2>
<p><strong>场景</strong>：一个 6 人前端团队维护的后台产品，40 多个页面，技术栈是 React + TypeScript + Ant Design（版本以团队和官方当前版本为准），设计侧用 Figma。当前状态：按钮有 7 种样式（3 种圆角、4 种蓝），弹窗有 3 套实现，表格分页有 4 种写法，每开一个新页面都要重新讨论一次标题字号。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>没有专职的设计系统团队，两个迭代（10 个工作日）里只能挤出约 6 人天</li>
<li>业务不能停，40 个页面不可能一次性重写</li>
<li>设计侧只有 1 名设计师，Figma 组件库已有，但命名和变体都没有收敛</li>
<li>不引入新的组件库，继续用 AntD，只在其上做一层收敛</li>
</ul>
<p><strong>目标</strong>：拿到三个可交付的结果——一套能落地的 token、3 个高频组件的统一 API、一条能拦住新增硬编码的 CI 规则。组件数量不是目标。</p>
<p><strong>交付物</strong>：</p>
<ol>
<li><code>tokens/</code> 下三层 token（JSON 源文件 + 生成的 CSS 变量），每个变量有用途说明</li>
<li>3 个组件的规格页：anatomy、尺寸、状态矩阵、变体表、API 表、do / don't</li>
<li>旧 → 新映射表与例外清单，按批次标注负责人和完成标志</li>
<li>一份验收清单，每条都能由设计或前端当场判定（见 1.7）</li>
</ol>
<h3>1.1 第一步：盘点（0.5 人天）</h3>
<p>先量化「乱」在哪里，否则做完无法证明收益。</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 颜色硬编码分布</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rhoE</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '#[0-9a-fA-F]{3,8}'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.css'</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.scss'</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">tr</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'A-F'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'a-f'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">uniq</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">head</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -30</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># AntD 组件直接引用量</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "from 'antd'"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "&#x3C;Button"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "&#x3C;Modal"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 疑似重复封装</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">find</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -iname</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "*button*"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -iname</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "*modal*"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -iname</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "*table*"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \)</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -print</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>盘点的产出不是一份长报告，而是三张短表：</p>
<p>| 表 | 记录什么 | 用途 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">Design Token</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/02-Design%20Token.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/02-Design%20Token.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一套 Figma 变量映射成 CSS 变量并接入主题切换</h2>
<p><strong>场景</strong>：一个 B2B SaaS 产品，后台是 Vite + React + CSS Modules + Ant Design 5，官网是 Next.js。设计侧在 Figma 里维护变量，代码侧有 73 种十六进制颜色、19 种间距、6 种圆角。深色模式是两年前手写的一套 <code>.dark</code> 覆盖，刷新时先白一下，弹窗和下拉菜单经常不跟随。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>7 周内完成，不能停业务，只能渐进迁移</li>
<li>设计侧只维护 Figma 变量，不接受再手工维护一份 CSS</li>
<li>需要浅色/深色 × 主品牌/白标品牌 × 舒适/紧凑两种密度</li>
<li>后台是 SPA，官网是 SSR，两边共用同一套 token</li>
<li>现有组件大量直接写 hex，不能一次性全改</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一套 Figma 变量映射成 CSS 变量并接入主题切换</h2>
<p><strong>场景</strong>：一个 B2B SaaS 产品，后台是 Vite + React + CSS Modules + Ant Design 5，官网是 Next.js。设计侧在 Figma 里维护变量，代码侧有 73 种十六进制颜色、19 种间距、6 种圆角。深色模式是两年前手写的一套 <code>.dark</code> 覆盖，刷新时先白一下，弹窗和下拉菜单经常不跟随。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>7 周内完成，不能停业务，只能渐进迁移</li>
<li>设计侧只维护 Figma 变量，不接受再手工维护一份 CSS</li>
<li>需要浅色/深色 × 主品牌/白标品牌 × 舒适/紧凑两种密度</li>
<li>后台是 SPA，官网是 SSR，两边共用同一套 token</li>
<li>现有组件大量直接写 hex，不能一次性全改</li>
</ul>
<p><strong>目标</strong>：建立一份 DTCG JSON 作为唯一来源，自动生成 CSS 变量、TypeScript 常量和 Tailwind 主题；三层 token 边界清楚；主题切换不闪白；存量代码按模块迁移。</p>
<p><strong>交付物</strong>：</p>
<ol>
<li><code>tokens/core.json</code>：唯一来源，含三层 token 与别名</li>
<li>生成与校验脚本，接到 CI：构建、比对、失败即阻断</li>
<li>三份产物：<code>tokens.css</code>、<code>tokens.ts</code>、<code>theme.css</code></li>
<li>主题切换约定：CSR 的内联脚本，SSR 的 cookie 读写</li>
<li>迁移清单与 lint 规则：哪些模块已迁、哪些还在写 hex</li>
</ol>
<h3>1.1 第一步：盘点（0.5 周）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 颜色硬编码分布</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rhoE</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '#[0-9a-fA-F]{3,8}'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.css'</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">tr</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'A-F'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'a-f'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">uniq</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">head</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -40</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 现有暗色覆盖的规模</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "data-theme\|\.dark"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/styles</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.css'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 内联颜色</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rnE</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'style=\{\{[^}]*color'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>盘点的结果要写成数字，不写感受：</p>
<p>| 项 | 盘点结果 | 结论 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">与代码的映射</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/03-%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%9A%84%E6%98%A0%E5%B0%84.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/03-%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%9A%84%E6%98%A0%E5%B0%84.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把 68 个 Figma 组件映射到 React 组件库并压住 40 页改版的走查偏差</h2>
<p><strong>场景</strong>：一个中后台产品改版，40 个页面，2 名设计师、5 名前端，周期 7 周。设计侧 Figma 组件库有 68 个组件，代码侧是 Ant Design 5 加 41 个自研封装。上一次改版上线后走查记录 187 条偏差，返工 2 周，主要问题是颜色、圆角、hover 态和空态。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>本次只改 22 个页面，其余 18 个页面后续迭代，映射表要能延续</li>
<li>7 周内完成，设计和开发各占一半时间</li>
<li>设计团队在另一个时区，交接必须异步可查，不能靠口头</li>
<li>设计侧的变量体系刚建立，组件命名只统一了一半</li>
<li>Code Connect 与 Dev Mode 的能力随套餐和版本变化，具体以官方当前版本为准</li>
<li>没有专门的像素比对平台，先用现有 CI 和截图工具</li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把 68 个 Figma 组件映射到 React 组件库并压住 40 页改版的走查偏差</h2>
<p><strong>场景</strong>：一个中后台产品改版，40 个页面，2 名设计师、5 名前端，周期 7 周。设计侧 Figma 组件库有 68 个组件，代码侧是 Ant Design 5 加 41 个自研封装。上一次改版上线后走查记录 187 条偏差，返工 2 周，主要问题是颜色、圆角、hover 态和空态。</p>
<p><strong>约束</strong>：</p>
<ul>
<li>本次只改 22 个页面，其余 18 个页面后续迭代，映射表要能延续</li>
<li>7 周内完成，设计和开发各占一半时间</li>
<li>设计团队在另一个时区，交接必须异步可查，不能靠口头</li>
<li>设计侧的变量体系刚建立，组件命名只统一了一半</li>
<li>Code Connect 与 Dev Mode 的能力随套餐和版本变化，具体以官方当前版本为准</li>
<li>没有专门的像素比对平台，先用现有 CI 和截图工具</li>
</ul>
<p><strong>目标</strong>：在开发前建立一张可执行的映射表、一份缺项即打回的交接清单、一套三端共用的状态词表，把走查偏差压到 20 条以内。</p>
<p>前五步各占一周，交接与走查压在后两周；门禁不通过就退回补件，不进入开发队列。</p>
<h3>1.1 第一步：双边盘点（1 周）</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 代码侧组件使用量</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rhoE</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "&#x3C;App[A-Z][A-Za-z]+"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">uniq</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 代码侧组件文件</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">find</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/components</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -name</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "*.tsx"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 原生标签与第三方组件的残留</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "&#x3C;table\|&#x3C;button"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --include=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">'*.tsx'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wc</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -l</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>盘点的产出是一张差距表，不是组件清单：</p>
<p>| 项 | 数量 | 处理方式 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">设计系统</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/01-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F%E4%B8%8E%E7%BB%84%E4%BB%B6.html" target="_blank">设计系统与组件</a></li>
<li>[Design Token](./02-Design Token.html)</li>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/03-%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%9A%84%E6%98%A0%E5%B0%84.html" target="_blank">与代码的映射</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/01-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F%E4%B8%8E%E7%BB%84%E4%BB%B6.html" target="_blank">设计系统与组件</a></li>
<li>[Design Token](./02-Design Token.html)</li>
<li><a href="/notes/02-UI/03-%E8%AE%BE%E8%AE%A1%E7%B3%BB%E7%BB%9F/03-%E4%B8%8E%E4%BB%A3%E7%A0%81%E7%9A%84%E6%98%A0%E5%B0%84.html" target="_blank">与代码的映射</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">Figma 核心</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/01-Figma%E6%A0%B8%E5%BF%83.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/01-Figma%E6%A0%B8%E5%BF%83.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把 12 页散稿改造成支持暗色的组件化文件</h2>
<p><strong>场景</strong>：一套已上线的运营后台，12 个页面，全部由矩形和文字拼成。颜色直接填十六进制，同一档灰色出现了 6 个值；间距靠手动拖，按钮有 7 种圆角；没有任何组件。产品要求三周内加暗色模式，并在同一套稿上继续加 20 个页面。团队 1 名设计、2 名前端。</p>
<p><strong>为什么必须做</strong>：按现状加暗色，等于把 12 页重画一遍；下一轮改主色，还要再改 40 多处。更麻烦的是，设计稿和代码各有一份色值，谁也说不清哪个是准的。这次改造的目标不是「把稿子画漂亮」，而是把文件变成<strong>改一处、全站生效</strong>的结构，并且这套结构能被下一个项目直接复制。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把 12 页散稿改造成支持暗色的组件化文件</h2>
<p><strong>场景</strong>：一套已上线的运营后台，12 个页面，全部由矩形和文字拼成。颜色直接填十六进制，同一档灰色出现了 6 个值；间距靠手动拖，按钮有 7 种圆角；没有任何组件。产品要求三周内加暗色模式，并在同一套稿上继续加 20 个页面。团队 1 名设计、2 名前端。</p>
<p><strong>为什么必须做</strong>：按现状加暗色，等于把 12 页重画一遍；下一轮改主色，还要再改 40 多处。更麻烦的是，设计稿和代码各有一份色值，谁也说不清哪个是准的。这次改造的目标不是「把稿子画漂亮」，而是把文件变成<strong>改一处、全站生效</strong>的结构，并且这套结构能被下一个项目直接复制。</p>
<p><strong>动手前确认</strong>：先复制一份文件做改造，原文件保留只读。改造期间新需求继续在原文件上做，避免两边同时改同一页。</p>
<h3>1.1 主线（按顺序执行，不要跳步）</h3>
<p><strong>① 盘点现状（半天）</strong></p>
<p>不先数，就不知道要改多少。把五个数写进一张基线表，改造前后各记一次：</p>
<p>| 指标 | 改造前 | 目标 | 说明 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">Figma 协作与交付</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/02-Figma%E5%8D%8F%E4%BD%9C%E4%B8%8E%E4%BA%A4%E4%BB%98.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/02-Figma%E5%8D%8F%E4%BD%9C%E4%B8%8E%E4%BA%A4%E4%BB%98.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：18 个页面的后台改版按模块交付，走查 P1 控制在 5 条内</h2>
<p><strong>场景</strong>：一套 B 端后台改版，5 个模块、18 个页面，1 名设计、2 名前端，周期 3 周。设计和开发在两个城市，只能异步沟通，每天最多一次 15 分钟站会。目标是上线前设计走查 P0 为 0、P1 不超过 5 条，且每条都能直接被开发修掉。</p>
<p><strong>为什么必须做</strong>：上一版只往群里发了一个链接。开发做到一半来问「空态在哪」，走查时发现 3 个状态没做、12 处间距不是 token、2 个图标糊了，返工 4 天。问题不在设计画得不好，而在<strong>交付物没有把该说的说完</strong>。这次要把「开发来问」变成「开发查表」。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：18 个页面的后台改版按模块交付，走查 P1 控制在 5 条内</h2>
<p><strong>场景</strong>：一套 B 端后台改版，5 个模块、18 个页面，1 名设计、2 名前端，周期 3 周。设计和开发在两个城市，只能异步沟通，每天最多一次 15 分钟站会。目标是上线前设计走查 P0 为 0、P1 不超过 5 条，且每条都能直接被开发修掉。</p>
<p><strong>为什么必须做</strong>：上一版只往群里发了一个链接。开发做到一半来问「空态在哪」，走查时发现 3 个状态没做、12 处间距不是 token、2 个图标糊了，返工 4 天。问题不在设计画得不好，而在<strong>交付物没有把该说的说完</strong>。这次要把「开发来问」变成「开发查表」。</p>
<p><strong>动手前确认</strong>：开发侧是否有 Dev Mode 席位和文件权限；组件库当前版本是否已发布；测试环境是否有真实数据；谁对「能不能上线」拍板。这四件事任何一件没确认，后面的节奏都会断。</p>
<h3>1.1 主线（按顺序执行，不要跳步）</h3>
<p><strong>① 启动对齐（第 1 天，90 分钟）</strong></p>
<p>不是听产品讲需求，是把下面六件事逐条确认并写下来：</p>
<p>| 项 | 要问出的结果 | 没确认的后果 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">Figma工程化</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/01-Figma%E6%A0%B8%E5%BF%83.html" target="_blank">Figma核心</a></li>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/02-Figma%E5%8D%8F%E4%BD%9C%E4%B8%8E%E4%BA%A4%E4%BB%98.html" target="_blank">Figma协作与交付</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/01-Figma%E6%A0%B8%E5%BF%83.html" target="_blank">Figma核心</a></li>
<li><a href="/notes/02-UI/04-Figma%E5%B7%A5%E7%A8%8B%E5%8C%96/02-Figma%E5%8D%8F%E4%BD%9C%E4%B8%8E%E4%BA%A4%E4%BB%98.html" target="_blank">Figma协作与交付</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">可用性测试</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/01-%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/01-%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：5 人完成一次下单流程测试，并产出可执行的问题分级</h2>
<p><strong>场景</strong>：一个电商站点，数据看板显示「进入结算 → 支付成功」的转化在收货地址这一步掉了 30%，但不知道原因。产品和设计各有一套猜测：有人说是地址表单字段太多，有人说是优惠券入口太显眼。决定用 5 名真实用户做一次形成性测试：准备 2 天、执行 2 天，最后一场结束后 48 小时内出报告。</p>
<p><strong>为什么必须做</strong>：埋点只能告诉你「在哪一步掉」，不能告诉你「用户当时在想什么」。猜测驱动的改版很容易改错地方——把表单从 8 个字段减到 6 个，结果用户仍然卡在「区/县」的联动上。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：5 人完成一次下单流程测试，并产出可执行的问题分级</h2>
<p><strong>场景</strong>：一个电商站点，数据看板显示「进入结算 → 支付成功」的转化在收货地址这一步掉了 30%，但不知道原因。产品和设计各有一套猜测：有人说是地址表单字段太多，有人说是优惠券入口太显眼。决定用 5 名真实用户做一次形成性测试：准备 2 天、执行 2 天，最后一场结束后 48 小时内出报告。</p>
<p><strong>为什么必须做</strong>：埋点只能告诉你「在哪一步掉」，不能告诉你「用户当时在想什么」。猜测驱动的改版很容易改错地方——把表单从 8 个字段减到 6 个，结果用户仍然卡在「区/县」的联动上。</p>
<p><strong>约束</strong>：没有实验室，全部远程主持；用户分散在三个城市；不能装插件，只能用浏览器和系统录屏；每人 45 分钟；预算只够 5 人。<strong>约束越多，越要把任务和记录做扎实，而不是靠人数补。</strong></p>
<p><strong>动手前确认</strong>：录屏与录音的知情同意话术；测试账号能走通支付沙箱；每个用户一份独立优惠券；备用会议链接；一名记录员（主持人不兼记录）。</p>
<h3>1.1 主线（按顺序执行，不要跳步）</h3>
<p><strong>① 把模糊疑问改成可回答的研究问题（1 小时）</strong></p>
<p>| 模糊疑问 | 改成研究问题 | 靠什么回答 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">可访问性</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/02-%E5%8F%AF%E8%AE%BF%E9%97%AE%E6%80%A7.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/02-%E5%8F%AF%E8%AE%BF%E9%97%AE%E6%80%A7.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：对 8 个核心页面做 WCAG 2.2 AA 走查，先修前三类问题</h2>
<p><strong>场景</strong>：一套 B 端后台，采购合同要求「符合 WCAG 2.2 AA」。8 个核心页面要在两周内完成走查和第一轮修复，没有专职无障碍工程师：1 名设计师和 1 名前端各投入一半时间，QA 配合复测，合计约 11 人天。第一次自动化扫描报了 63 条，逐条修不现实。</p>
<p><strong>为什么必须做</strong>：合同只是表面原因。客服近三个月反复收到「Tab 键没反应」「弹窗关不掉」的工单，说明键盘用户已经在流失。63 条里大量重复，真正影响任务的是少数几类。<strong>先按类修，再按条清</strong>，两周内才能看到可验证的改善。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：对 8 个核心页面做 WCAG 2.2 AA 走查，先修前三类问题</h2>
<p><strong>场景</strong>：一套 B 端后台，采购合同要求「符合 WCAG 2.2 AA」。8 个核心页面要在两周内完成走查和第一轮修复，没有专职无障碍工程师：1 名设计师和 1 名前端各投入一半时间，QA 配合复测，合计约 11 人天。第一次自动化扫描报了 63 条，逐条修不现实。</p>
<p><strong>为什么必须做</strong>：合同只是表面原因。客服近三个月反复收到「Tab 键没反应」「弹窗关不掉」的工单，说明键盘用户已经在流失。63 条里大量重复，真正影响任务的是少数几类。<strong>先按类修，再按条清</strong>，两周内才能看到可验证的改善。</p>
<p><strong>约束</strong>：不改整体视觉风格；不引入新框架；测试数据要覆盖空值、超长、无权限；读屏只有 macOS 的 VoiceOver 和 Windows 的 NVDA 可用。</p>
<p><strong>动手前确认</strong>：浏览器矩阵；两个读屏工具能启动；测试账号覆盖管理员与只读角色；能造出空数据和错误状态；修复分支与发布窗口。</p>
<h3>1.1 主线（按顺序执行，不要跳步）</h3>
<p><strong>① 定范围与抽样（半天）</strong></p>
<p>8 个页面要覆盖八类结构，不能只挑登录页：</p>
<p>| 类型 | 页面 | 为什么必须包含 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">可用性 与 无障碍</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/01-%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95.html" target="_blank">可用性测试</a></li>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/02-%E5%8F%AF%E8%AE%BF%E9%97%AE%E6%80%A7.html" target="_blank">可访问性</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/01-%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95.html" target="_blank">可用性测试</a></li>
<li><a href="/notes/02-UI/05-%E5%8F%AF%E7%94%A8%E6%80%A7%E4%B8%8E%E6%97%A0%E9%9A%9C%E7%A2%8D/02-%E5%8F%AF%E8%AE%BF%E9%97%AE%E6%80%A7.html" target="_blank">可访问性</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">响应式与多端</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/01-%E5%93%8D%E5%BA%94%E5%BC%8F%E4%B8%8E%E5%A4%9A%E7%AB%AF.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/01-%E5%93%8D%E5%BA%94%E5%BC%8F%E4%B8%8E%E5%A4%9A%E7%AB%AF.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一个后台列表页从 1440 适配到 768 与 375 三档</h2>
<p><strong>场景</strong>：工单系统后台的「工单列表」页。桌面 1440 宽下是「左侧导航 240 + 筛选栏 280 + 表格 8 列」。业务要求同一套前端代码覆盖三类终端：桌面 1440（客服坐席）、平板 768（主管在会议室看进度）、手机 375（一线客服在外面处理紧急工单）。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
<th>影响</th>
</tr>
</thead>
<tbody>
<tr>
<td>只有一套代码</td>
<td>不做独立 App，不做 m. 域名</td>
<td>布局必须靠 CSS 断点与结构替换</td>
</tr>
<tr>
<td>老组件库</td>
<td>表格组件不支持列隐藏配置</td>
<td>只能在页面层包一层</td>
</tr>
<tr>
<td>375 上的真实任务</td>
<td>只看「我的待办」并处理</td>
<td>批量操作、导出、报表一律不做</td>
</tr>
<tr>
<td>排期</td>
<td>设计 3 人天，前端 5 人天</td>
<td>不允许重做一套移动端页面</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一个后台列表页从 1440 适配到 768 与 375 三档</h2>
<p><strong>场景</strong>：工单系统后台的「工单列表」页。桌面 1440 宽下是「左侧导航 240 + 筛选栏 280 + 表格 8 列」。业务要求同一套前端代码覆盖三类终端：桌面 1440（客服坐席）、平板 768（主管在会议室看进度）、手机 375（一线客服在外面处理紧急工单）。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 | 影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">移动端设计</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/02-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E8%AE%BE%E8%AE%A1.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/02-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E8%AE%BE%E8%AE%A1.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把一条审批流做成能交付的移动端 H5</h2>
<p><strong>场景</strong>：一套已上线两年的审批系统，桌面端是 1440 的三栏布局。业务要求「手机上能审批」，不做 App，只做 H5，嵌在企业微信工作台里。范围是 3 个页面 + 3 个浮层：待办列表、我的申请、审批详情，以及通过确认、驳回抽屉、更多操作。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
<th>设计上的后果</th>
</tr>
</thead>
<tbody>
<tr>
<td>容器是企业微信</td>
<td>顶部有平台导航条，底部可能有平台工具栏</td>
<td>自己的导航只能从第二层开始</td>
</tr>
<tr>
<td>设备跨度</td>
<td>企业微信里 iOS 与 Android 都有，宽度从 320 到 430</td>
<td>按 375 出图，用 320 / 360 / 430 三档做极值检查</td>
</tr>
<tr>
<td>用户场景</td>
<td>会议间隙、通勤路上、被消息打断</td>
<td>必须支持中断恢复、单手操作</td>
</tr>
<tr>
<td>数据</td>
<td>单条审批最多 40 个字段，事由可能 500 字</td>
<td>详情必须分组折叠</td>
</tr>
<tr>
<td>交付</td>
<td>设计 4 人天，前端 6 人天</td>
<td>不引入新手势，不做自定义动画</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把一条审批流做成能交付的移动端 H5</h2>
<p><strong>场景</strong>：一套已上线两年的审批系统，桌面端是 1440 的三栏布局。业务要求「手机上能审批」，不做 App，只做 H5，嵌在企业微信工作台里。范围是 3 个页面 + 3 个浮层：待办列表、我的申请、审批详情，以及通过确认、驳回抽屉、更多操作。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 | 设计上的后果 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">多端 与 适配</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/01-%E5%93%8D%E5%BA%94%E5%BC%8F%E4%B8%8E%E5%A4%9A%E7%AB%AF.html" target="_blank">响应式与多端</a></li>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/02-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E8%AE%BE%E8%AE%A1.html" target="_blank">移动端设计</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/01-%E5%93%8D%E5%BA%94%E5%BC%8F%E4%B8%8E%E5%A4%9A%E7%AB%AF.html" target="_blank">响应式与多端</a></li>
<li><a href="/notes/02-UI/06-%E5%A4%9A%E7%AB%AF%E4%B8%8E%E9%80%82%E9%85%8D/02-%E7%A7%BB%E5%8A%A8%E7%AB%AF%E8%AE%BE%E8%AE%A1.html" target="_blank">移动端设计</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">设计评审与走查</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/01-%E8%AE%BE%E8%AE%A1%E8%AF%84%E5%AE%A1%E4%B8%8E%E8%B5%B0%E6%9F%A5.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/01-%E8%AE%BE%E8%AE%A1%E8%AF%84%E5%AE%A1%E4%B8%8E%E8%B5%B0%E6%9F%A5.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：组织一次上线前的设计走查并推动修复</h2>
<p><strong>场景</strong>：订单中心改版，涉及 12 个页面（订单列表、订单详情、退款申请、退款审核、发货、物流、发票、售后记录等），前端已提测，计划 5 天后上线。设计只有 1 人，前端 3 人，测试 2 人。上次改版上线后视觉与交互问题集中爆发，这次要求「上线前一次走完，问题闭环」。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
<th>影响</th>
</tr>
</thead>
<tbody>
<tr>
<td>时间</td>
<td>提测后、上线前，只有 3 个工作日</td>
<td>不能全量细查，必须分批</td>
</tr>
<tr>
<td>人力</td>
<td>设计 1 人、前端 3 人、测试 2 人</td>
<td>走查不能只靠设计</td>
</tr>
<tr>
<td>环境</td>
<td>测试环境数据是脱敏的旧数据</td>
<td>需要提前造边界数据</td>
</tr>
<tr>
<td>范围</td>
<td>12 个页面，含 4 个弹层流程</td>
<td>弹层必须单独看</td>
</tr>
<tr>
<td>标准</td>
<td>已有设计系统，但组件版本落后一版</td>
<td>部分偏差是系统问题，不是实现问题</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：组织一次上线前的设计走查并推动修复</h2>
<p><strong>场景</strong>：订单中心改版，涉及 12 个页面（订单列表、订单详情、退款申请、退款审核、发货、物流、发票、售后记录等），前端已提测，计划 5 天后上线。设计只有 1 人，前端 3 人，测试 2 人。上次改版上线后视觉与交互问题集中爆发，这次要求「上线前一次走完，问题闭环」。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 | 影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">数据驱动设计</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/02-%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/02-%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一条注册漏斗做埋点方案并验证一次改版</h2>
<p><strong>场景</strong>：一个 B2B SaaS 的试用注册页，从「进入注册页」到「注册成功」的转化率长期在 38% 左右。产品团队判断是「表单太长」，砍掉了「公司规模」「职位」两个字段，改版后转化率 39%，几乎没动。第二次改版前，要求先补齐埋点、用数据定位，再做一次可验证的实验。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
<th>影响</th>
</tr>
</thead>
<tbody>
<tr>
<td>流量</td>
<td>日均进入注册页约 2400 人</td>
<td>大改动可分实验，小改动样本不够</td>
</tr>
<tr>
<td>埋点现状</td>
<td>只有页面曝光与「注册成功」，点击与失败原因全缺</td>
<td>必须补埋点，且要兼容历史数据</td>
</tr>
<tr>
<td>归因</td>
<td>多渠道投放，来源参数不统一</td>
<td>分群口径要先统一</td>
</tr>
<tr>
<td>排期</td>
<td>埋点 3 天，观察 2 周，实验 2 周</td>
<td>不能边改边看</td>
</tr>
<tr>
<td>合规</td>
<td>收集手机号、邮箱，需告知与脱敏</td>
<td>参数里不能带明文个人信息</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一条注册漏斗做埋点方案并验证一次改版</h2>
<p><strong>场景</strong>：一个 B2B SaaS 的试用注册页，从「进入注册页」到「注册成功」的转化率长期在 38% 左右。产品团队判断是「表单太长」，砍掉了「公司规模」「职位」两个字段，改版后转化率 39%，几乎没动。第二次改版前，要求先补齐埋点、用数据定位，再做一次可验证的实验。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 | 影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">协作 与 度量</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/01-%E8%AE%BE%E8%AE%A1%E8%AF%84%E5%AE%A1%E4%B8%8E%E8%B5%B0%E6%9F%A5.html" target="_blank">设计评审与走查</a></li>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/02-%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1.html" target="_blank">数据驱动设计</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/01-%E8%AE%BE%E8%AE%A1%E8%AF%84%E5%AE%A1%E4%B8%8E%E8%B5%B0%E6%9F%A5.html" target="_blank">设计评审与走查</a></li>
<li><a href="/notes/02-UI/08-%E5%8D%8F%E4%BD%9C%E4%B8%8E%E5%BA%A6%E9%87%8F/02-%E6%95%B0%E6%8D%AE%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1.html" target="_blank">数据驱动设计</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">动效设计</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/01-%E5%8A%A8%E6%95%88%E8%AE%BE%E8%AE%A1.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/01-%E5%8A%A8%E6%95%88%E8%AE%BE%E8%AE%A1.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：给一个筛选抽屉定动效参数并交付给前端</h2>
<p><strong>场景</strong>：后台改版，工单列表的筛选从「常驻侧栏」改成「右侧抽屉」。第一版由前端随手实现：<code>transition: all 0.3s linear</code>，遮罩与抽屉同时开始、同时结束。上线后反馈集中在三点——「弹出来很生硬」「关的时候像卡了一下」「低端笔记本上会抖」。</p>
<p><strong>约束</strong>：</p>
<table>
<thead>
<tr>
<th>约束</th>
<th>具体内容</th>
<th>影响</th>
</tr>
</thead>
<tbody>
<tr>
<td>一套 token</td>
<td>全站动效统一从变量取</td>
<td>不能给单个弹层写死数值</td>
</tr>
<tr>
<td>设备跨度</td>
<td>客服笔记本（集显）+ 设计部 MacBook</td>
<td>必须按低端设备验收</td>
</tr>
<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>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：给一个筛选抽屉定动效参数并交付给前端</h2>
<p><strong>场景</strong>：后台改版，工单列表的筛选从「常驻侧栏」改成「右侧抽屉」。第一版由前端随手实现：<code>transition: all 0.3s linear</code>，遮罩与抽屉同时开始、同时结束。上线后反馈集中在三点——「弹出来很生硬」「关的时候像卡了一下」「低端笔记本上会抖」。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 | 影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">图标与插画</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/02-%E5%9B%BE%E6%A0%87%E4%B8%8E%E6%8F%92%E7%94%BB.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/02-%E5%9B%BE%E6%A0%87%E4%B8%8E%E6%8F%92%E7%94%BB.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把 180 个来源混乱的图标收成一套可交付资产</h2>
<p><strong>场景</strong>：一个运营了两年的 SaaS 后台，图标来自三个时期：早期从素材站下载的线性图标、一次改版引入的面性图标、开发临时用 emoji 顶替的状态图标。同一个页面里出现 4 种描边粗细、3 种风格、2 种尺寸，法务在版权审查时还发现部分素材授权不明。</p>
<p><strong>约束</strong>：</p>
<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>React + SVG Sprite</td>
<td>图标必须能被 <code>currentColor</code> 着色</td>
</tr>
<tr>
<td>覆盖面</td>
<td>现有 180 个图标，含 12 个业务专用图形</td>
<td>通用图标换库，专用图形自绘</td>
</tr>
<tr>
<td>兼容</td>
<td>需要支持深色模式</td>
<td>不允许导出多套配色</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把 180 个来源混乱的图标收成一套可交付资产</h2>
<p><strong>场景</strong>：一个运营了两年的 SaaS 后台，图标来自三个时期：早期从素材站下载的线性图标、一次改版引入的面性图标、开发临时用 emoji 顶替的状态图标。同一个页面里出现 4 种描边粗细、3 种风格、2 种尺寸，法务在版权审查时还发现部分素材授权不明。</p>
<p><strong>约束</strong>：</p>
<p>| 约束 | 具体内容 | 影响 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">动效 与 资产</title>
    <id>https://studynotes-90w.pages.dev/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/</id>
    <link href="https://studynotes-90w.pages.dev/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/01-%E5%8A%A8%E6%95%88%E8%AE%BE%E8%AE%A1.html" target="_blank">动效设计</a></li>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/02-%E5%9B%BE%E6%A0%87%E4%B8%8E%E6%8F%92%E7%94%BB.html" target="_blank">图标与插画</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[
<h2>本目录笔记</h2>
<ul>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/01-%E5%8A%A8%E6%95%88%E8%AE%BE%E8%AE%A1.html" target="_blank">动效设计</a></li>
<li><a href="/notes/02-UI/07-%E5%8A%A8%E6%95%88%E4%B8%8E%E8%B5%84%E4%BA%A7/02-%E5%9B%BE%E6%A0%87%E4%B8%8E%E6%8F%92%E7%94%BB.html" target="_blank">图标与插画</a></li>
</ul>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">HTML</title>
    <id>https://studynotes-90w.pages.dev/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/01-HTML.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/01-HTML.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把商品列表页做成可访问、可提交的静态页面</h2>
<p><strong>场景</strong>：花店「山野花房」要一个商品列表页：6 个在售商品、按关键词与分类筛选、每件商品能直接发起询价。没有构建工具、没有框架，交付 <code>index.html</code> + <code>base.css</code> + <code>assets/</code>，后端只给两个接口：<code>GET /search</code> 与 <code>POST /api/inquiry</code>。硬指标是断网、禁用 JS、只用键盘三种情况下页面都还能用。</p>
<p><strong>为什么必须做</strong>：这一页把 HTML 的五个高风险区一次踩全——文档骨架、语义结构、图片替代文本、表单数据模型、原生校验。任何一处写错都不会报错，只会在上线后变成「搜索抓不到」「手机上字小得看不清」「后端收不到字段」这类没人认领的问题。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把商品列表页做成可访问、可提交的静态页面</h2>
<p><strong>场景</strong>：花店「山野花房」要一个商品列表页：6 个在售商品、按关键词与分类筛选、每件商品能直接发起询价。没有构建工具、没有框架，交付 <code>index.html</code> + <code>base.css</code> + <code>assets/</code>，后端只给两个接口：<code>GET /search</code> 与 <code>POST /api/inquiry</code>。硬指标是断网、禁用 JS、只用键盘三种情况下页面都还能用。</p>
<p><strong>为什么必须做</strong>：这一页把 HTML 的五个高风险区一次踩全——文档骨架、语义结构、图片替代文本、表单数据模型、原生校验。任何一处写错都不会报错，只会在上线后变成「搜索抓不到」「手机上字小得看不清」「后端收不到字段」这类没人认领的问题。</p>
<p><strong>动手前确认</strong>：Node 18+（跑校验器）、Chrome 或 Safari 当前稳定版、一个空目录。先建 <code>shop/</code>，后文所有相对路径都以它为根；图片用任意同比例 JPG 占位（复制改名即可），文件名与代码一致。</p>
<h3>1.1 目录与文档骨架</h3>
<p>文件只有三类：<code>index.html</code>、<code>base.css</code>、<code>assets/</code>。<code>assets/</code> 里 6 件商品各一对同图不同宽度的 JPG，下文以玫瑰为例：<code>rose-400.jpg</code>、<code>rose-800.jpg</code>，其余 5 件同理（<code>lily-400.jpg</code> 等）。</p>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;!</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">DOCTYPE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> html</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">html</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> lang</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"zh-CN"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> charset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"utf-8"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"viewport"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"width=device-width, initial-scale=1"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">title</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>鲜花预订 | 山野花房&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">title</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"description"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"当季鲜花每周直采，北京同城次日达，支持到店自提。"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">link</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> rel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stylesheet"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"base.css"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">body</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"skip-link"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#main"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>跳到主内容&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  &#x3C;!-- header / main / footer 见下面各段 --></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">body</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">html</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>四个位置不能动：<code>&lt;!DOCTYPE html&gt;</code> 在第一行；<code>charset</code> 在 <code>head</code> 最前面（必须落在文件前 1024 字节内）；<code>viewport</code> 紧跟其后；<code>title</code> 每页单独写。<code>lang=&quot;zh-CN&quot;</code> 让读屏选中文语音、让浏览器判断断行与字体，不是装饰。</p>
<h3>1.2 页头与导航</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">header</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"site-header"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"brand"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"/"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>山野花房&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">nav</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"主导航"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#goods"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>全部商品&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#filter"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>筛选&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#inquiry"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>询价&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">nav</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">header</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>nav</code> 只包主要导航，页脚的小链接组不必再套一个。锚点 <code>#goods</code> 的目标必须是页面里真实存在且唯一的 <code>id</code>。<code>aria-label</code> 在页面有多个导航区时才必要，写上便于以后扩展。</p>
<h3>1.3 商品列表</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">main</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"main"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>当季鲜花&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>每周一凌晨从昆明直采，北京同城次日达。&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"goods"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-labelledby</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"goods-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"goods-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>本周在售&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"goods"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"card"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">img</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> src</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"assets/rose-400.jpg"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">               srcset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"assets/rose-400.jpg 400w, assets/rose-800.jpg 800w"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">               sizes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"(min-width: 768px) 33vw, 100vw"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">               width</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"400"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> height</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"300"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> loading</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"lazy"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">               alt</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"深红色玫瑰，一束二十枝，牛皮纸包装"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"/goods/rose"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>赤霞玫瑰&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>20 枝 / 束，花径约 6cm，附带保鲜剂。&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"199"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥199&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">data</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">> &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">del</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥259&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">del</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      &#x3C;!-- 其余 5 张结构相同，只换 src、srcset、alt、标题、价格 --></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>三处决定成败：<code>ul &gt; li &gt; article</code> 是列表的标准结构，<code>article</code> 表示「单独拿出来也完整的一张商品卡」；<code>width</code> / <code>height</code> 写图片的原始像素尺寸，浏览器据此算出宽高比、提前占位，图片慢加载时页面不跳；<code>alt</code> 写「看到什么」，纯装饰花纹用 <code>alt=&quot;&quot;</code> 明确让读屏跳过。</p>
<h3>1.4 筛选表单：GET 查询</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"filter"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-labelledby</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"filter-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"filter-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>筛选&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> action</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"/search"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> method</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"get"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> role</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"search"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"q"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>关键词&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"search"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"q"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"q"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> placeholder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"玫瑰 / 百合 / 满天星"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> autocomplete</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"off"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"category"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>分类&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">select</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"category"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"category"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">""</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>全部&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"rose"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>玫瑰&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"lily"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>百合&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">select</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"max-price"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>最高价（元）&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"number"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"max-price"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"max_price"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">             min</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"50"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> max</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"999"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> step</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"10"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"300"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"submit"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>筛选&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"/"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>清空条件&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>筛选是「读」操作，用 <code>GET</code>：参数进 URL，能收藏、能分享、刷新不重复提交。<code>role=&quot;search&quot;</code> 让读屏把这块标成搜索区。清空条件用链接回 <code>/</code>，不用 <code>type=&quot;reset&quot;</code>——reset 只回到 HTML 里写的默认值（最高价仍是 300），不是清空。</p>
<h3>1.5 询价表单：POST 提交</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"inquiry"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-labelledby</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"inquiry-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"inquiry-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>询价&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"inquiry-hint"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>提交后 2 小时内回电，仅工作日 9:00–18:00。&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> action</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"/api/inquiry"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> method</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"post"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> enctype</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"multipart/form-data"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">fieldset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">legend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>联系方式&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">legend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>称呼&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"text"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> required</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> maxlength</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"20"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> autocomplete</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"phone"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>手机号&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tel"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"phone"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"phone"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> required</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">               inputmode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"numeric"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> autocomplete</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tel"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">               pattern</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"1[3-9][0-9]{9}"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-describedby</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"phone-hint"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">small</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"phone-hint"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>11 位中国大陆手机号，用于回电&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">small</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">fieldset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">fieldset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">legend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>需求&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">legend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"item"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>商品&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">select</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"item"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"item"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> required</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">""</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>请选择&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"rose"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>赤霞玫瑰&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"lily"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>白香水百合&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">option</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">select</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"qty"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>数量（束）&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"number"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"qty"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"qty"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> min</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"1"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> max</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"50"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> step</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"1"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"1"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> required</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ref"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>参考图&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"file"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ref"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ref"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> accept</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"image/*"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"note"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>备注&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">textarea</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"note"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"note"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> rows</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"4"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> maxlength</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"300"</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">                  placeholder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"卡片留言、忌用花材、配送时间"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">textarea</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">fieldset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"checkbox"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"agree"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"agree"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"yes"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> required</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"agree"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>同意仅将以上信息用于本次询价&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">input</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"hidden"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"source"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"goods-list"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"submit"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>提交询价&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"reset"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>重填&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">form</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>表单四个固定件：<code>action</code> 决定去哪、<code>method</code> 决定怎么去、<code>name</code> 决定字段名、<code>value</code> 决定字段值。上传文件必须 <code>enctype=&quot;multipart/form-data&quot;</code>，否则后端只收到文件名。<code>required</code>、<code>type</code>、<code>min</code> / <code>max</code>、<code>pattern</code> 由浏览器直接校验，不写 JS 也能拦住空值和格式错误。</p>
<h3>1.6 规格表与页脚</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-labelledby</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"spec-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"spec-title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>花材与养护&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">caption</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>主要花材保鲜期（室温 20℃、每日换水）&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">caption</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">thead</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> scope</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"col"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>花材&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> scope</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"col"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>瓶插期&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> scope</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"col"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>换水频率&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">thead</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tbody</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> scope</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"row"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>玫瑰&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>5–7 天&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>每日&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> scope</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"row"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>百合&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>7–10 天&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>每两日&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> scope</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"row"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>满天星&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10–14 天&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>每三日&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tbody</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">footer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    山野花房 · 北京市朝阳区某某路 1 号 ·</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tel:+8613800000000"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>138</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">&#x26;#8209;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">0000</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">&#x26;#8209;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">0000&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">> ·</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"mailto:hi@example.com"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>hi@example.com&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">address</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">small</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>© 2026 山野花房 · 京 ICP 备 00000000 号&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">small</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">footer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>&lt;caption&gt;</code> 是表格标题，读屏进入表格会先念它；<code>scope</code> 告诉读屏表头在行上还是列上。<code>&lt;address&gt;</code> 只用于「最近的文章或整个页面的联系方式」，不是随便的地址文本。号码里的连字符写成 <code>&amp;#8209;</code>（不换行连字符）：普通 <code>-</code> 会被当成换行点把号码拆开，<code>html-validate</code> 的 <code>tel-non-breaking</code> 规则也会直接报错。</p>
<h3>1.7 最小样式与本地运行</h3>
<p><code>base.css</code> 只解决可读性与焦点可见，不承担设计：</p>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">*</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> *</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">::before</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> *</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">::after</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { box-sizing: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">border-box</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">body</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { max-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">72</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">ch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; margin: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">24</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 64</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">       font: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.6</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> system-ui</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#ABB2BF">-apple-system</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"PingFang SC"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">sans-serif</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; color: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">1f2937</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">img</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { max-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; height: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.skip-link</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { position: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">absolute</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; left: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; top: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">-48</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; background: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">fff</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.skip-link</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:focus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { top: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:focus-visible</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { outline: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> #</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">1a73e8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; outline-offset: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">block</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; margin-top: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> shop</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">python3</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -m</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> http.server</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 8000</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">     # 打开 http://localhost:8000</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --yes</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> html-validate@9.7.1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> index.html</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &#x26;&#x26; </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "exit=</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B">$?</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>@9.7.1</code> 写死版本：<code>html-validate</code> 的规则集随小版本变化，今天报 0 条不保证半年后还是 0 条，验收要可复现。</p>
<p>必须用 <code>http://</code> 打开，不要双击 <code>file://</code>：相对路径行为不同，<code>fetch</code> 与部分表单提交也会被浏览器拦。</p>
<p><code>python3 -m http.server</code> 只是静态服务器，没有 <code>/search</code> 与 <code>/api/inquiry</code>：提交筛选后地址栏会变成 <code>/search?...</code> 但页面 404，询价提交会得到 501（<code>POST</code> 不被支持）。这是预期结果，验收只看 URL 查询串与 Network → Payload；要联调再起一个能响应这两个路径的后端桩。</p>
<h3>1.8 验收（11 项全过才算交付）</h3>
<p>| # | 检查项 | 命令或检查 | 通过标准 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
  <entry>
    <title type="text">CSS</title>
    <id>https://studynotes-90w.pages.dev/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/02-CSS.html</id>
    <link href="https://studynotes-90w.pages.dev/notes/04-%E5%89%8D%E7%AB%AF/01-HTML%E4%B8%8ECSS/02-CSS.html"/>
    <updated>2026-10-27T16:31:46.000Z</updated>
    <summary type="html"><![CDATA[
<h2>一、工程案例：把后台仪表盘做成三档响应式、跟随系统深浅色的页面</h2>
<p><strong>场景</strong>：一个 8 人 SaaS 团队的后台首页：顶部栏、左侧菜单、4 张指标卡、一张最近订单表。不用 UI 库、不用框架，交付 <code>admin.html</code> + <code>admin.css</code>，要求 360px 手机、768px 平板、1440px 桌面三档都成立；跟随系统深浅色；键盘能走完全程；用户开启「减少动态效果」时不做位移动画。</p>
<p><strong>为什么必须做</strong>：后台页面最容易死在「数据一多就撑破」「手机上表格把整页顶宽」「深色模式下一块白底刺眼」这三件事上。它们都不是某个属性写错，而是布局模型、层叠规则、主题变量没有一起设计。这一节把这三件事一次做完，后面加页面只需复用变量与骨架。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>一、工程案例：把后台仪表盘做成三档响应式、跟随系统深浅色的页面</h2>
<p><strong>场景</strong>：一个 8 人 SaaS 团队的后台首页：顶部栏、左侧菜单、4 张指标卡、一张最近订单表。不用 UI 库、不用框架，交付 <code>admin.html</code> + <code>admin.css</code>，要求 360px 手机、768px 平板、1440px 桌面三档都成立；跟随系统深浅色；键盘能走完全程；用户开启「减少动态效果」时不做位移动画。</p>
<p><strong>为什么必须做</strong>：后台页面最容易死在「数据一多就撑破」「手机上表格把整页顶宽」「深色模式下一块白底刺眼」这三件事上。它们都不是某个属性写错，而是布局模型、层叠规则、主题变量没有一起设计。这一节把这三件事一次做完，后面加页面只需复用变量与骨架。</p>
<p><strong>动手前确认</strong>：Chrome 或 Safari 当前稳定版、DevTools 的设备模式与 Rendering 面板（模拟 <code>prefers-color-scheme</code> 与 <code>prefers-reduced-motion</code>）。先把内容写进 HTML，再按「骨架 → 区块 → 响应式 → 主题」的顺序加 CSS。</p>
<h3>1.1 HTML 骨架</h3>
<div class="language-html line-numbers-mode" data-highlighter="shiki" data-ext="html" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-html"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;!</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">DOCTYPE</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> html</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">html</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> lang</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"zh-CN"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> charset</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"utf-8"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">meta</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"viewport"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"width=device-width, initial-scale=1"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">title</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>AdminPro · 仪表盘&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">title</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">link</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> rel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stylesheet"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"admin.css"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">head</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">body</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"skip-link"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#main"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>跳到主内容&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"layout"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">header</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar__brand"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>AdminPro&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar__title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>仪表盘&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar__user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar__avatar"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>张&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar__name"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>张伟&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">header</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">aside</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"sidebar"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">nav</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"侧边导航"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"sidebar__menu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"sidebar__link is-active"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-current</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"page"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>仪表盘&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"sidebar__link"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>订单管理&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"sidebar__link"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>用户管理&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"sidebar__link"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> href</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"#"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>系统设置&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">li</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">nav</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">aside</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">main</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"content"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> id</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"main"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stats"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> aria-label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"关键指标"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__label"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>今日订单&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__value"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>1,280&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__trend stat-card__trend--up"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>↑ 12.5%&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__label"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>销售额&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__value"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥86,400&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__trend stat-card__trend--up"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>↑ 8.2%&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__label"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>新增用户&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__value"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>312&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__trend stat-card__trend--down"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>↓ 3.1%&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__label"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>转化率&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__value"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>4.8%&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"stat-card__trend stat-card__trend--up"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>↑ 0.6%&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">p</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">article</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"table-panel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"table-panel__title"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>最近订单&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"table-wrap"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">table</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"data-table"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">thead</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>订单号&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>客户&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>金额&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>状态&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>时间&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">thead</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tbody</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260001&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>李娜&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥1,299&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--success"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>已完成&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 09:32&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260002&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>王强&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥399&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--pending"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>待发货&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 10:05&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260003&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>赵敏&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥2,680&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--warning"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>售后中&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 10:48&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260004&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>陈晨&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥899&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--success"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>已完成&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 11:12&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260005&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>周涛&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥5,299&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--pending"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>待发货&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 11:40&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260006&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>吴敏&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥268&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--warning"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>售后中&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 12:03&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260007&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>郑凯&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥1,680&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--success"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>已完成&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 12:26&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">              &#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>#20260008&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>孙丽&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>¥76&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"tag tag--pending"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>待发货&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">span</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>10-11 13:05&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">>&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">tbody</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">          &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">section</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  &#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">div</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">body</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">html</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">></span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>以上 HTML 与后面的 CSS 片段合起来就是完整交付：把 1.2–1.9 的代码按编号顺序粘进同一个 <code>admin.css</code>，与 <code>admin.html</code> 放在同一目录，双击打开或用 <code>npx --yes serve .</code> 起一个静态服务即可验收。片段之间有覆盖关系（例如 <code>.content</code> 的 <code>padding</code> 由断点接管），顺序不能调换。</p>
<h3>1.2 设计令牌与深色主题</h3>
<p>所有颜色、圆角、间距先收进自定义属性。组件只引用变量，不写死颜色，主题切换才有落点。</p>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    color-scheme: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">light</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> dark</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --c-bg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">f3f4f6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;      </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">ffffff</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --c-text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">1f2937</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;    </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-muted</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">6b7280</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">e5e7eb</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;  </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">1a73e8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --c-primary-weak</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">26</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">115</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">232</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.12</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --c-success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">047857</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-danger</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">b91c1c</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-warning</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">92400e</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --radius</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --shadow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 3</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.08</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    --topbar-h</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">56</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--sidebar-w</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">220</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--gap</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">@media</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (prefers-color-scheme: dark) {</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">    :root</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        color-scheme: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">dark</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        --c-bg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">0f172a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;     </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">1e293b</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        --c-text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">e2e8f0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;   </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-muted</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">94a3b8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        --c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">334155</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">7cb0ff</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        --c-primary-weak</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">124</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">176</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">255</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.16</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        --c-success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">6ee7b7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-danger</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">fca5a5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-warning</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">#</span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">fcd34d</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        --shadow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 3</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>color-scheme</code> 让滚动条、输入框、日期选择器跟随深浅色；只改自定义属性而不写它，原生控件仍会是白底。</p>
<h3>1.3 重置与基础排版</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">*</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> *</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">::before</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> *</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">::after</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { box-sizing: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">border-box</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">html</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">-webkit-text-size-adjust</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">body</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    margin: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; min-height: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">svh</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-bg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    font: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.875</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.6</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> system-ui</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#ABB2BF">-apple-system</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"PingFang SC"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Microsoft YaHei"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">sans-serif</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">h1</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> h2</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> h3</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> p</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> ul</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { margin: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">ul</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; list-style: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">none</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { color: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">inherit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; text-decoration: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">none</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">img</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> svg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">block</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; max-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">button</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> input</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> select</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> textarea</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { font: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">inherit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; color: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">inherit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:focus-visible</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { outline: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); outline-offset: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>body</code> 的 <code>font</code> 简写同时设定字号与行高；<code>button</code> 不会自动继承字体，必须单独声明，否则按钮文字会变成浏览器默认的 13px 系统字体。</p>
<h3>1.4 Grid 骨架与三档断点</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.layout</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">grid</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    grid-template-columns: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">minmax</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    grid-template-rows: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--topbar-h</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">auto</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    grid-template-areas: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "sidebar"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "content"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    min-height: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">svh</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  { grid-area: topbar; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.sidebar</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    grid-area: sidebar;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); border-bottom: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    overflow-x: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.sidebar__menu</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">flex</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; gap: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    grid-area: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">grid</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; gap: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--gap</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); align-content: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">start</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">@media</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (min-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">768</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .layout</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        grid-template-columns: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">180</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> minmax</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        grid-template-rows: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--topbar-h</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        grid-template-areas: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"topbar topbar"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "sidebar content"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .sidebar</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { border-right: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); border-bottom: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; overflow: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">visible</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .sidebar__menu</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { flex-direction: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">column</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">@media</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (min-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1200</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .layout</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { grid-template-columns: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--sidebar-w</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">minmax</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .content</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">28</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 32</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; gap: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">24</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>手机端不是把侧栏藏起来，而是把它变成顶栏下方的一排横向滚动菜单——纯 CSS 就可用，不需要一个点了没反应的 ☰ 按钮。<code>minmax(0, 1fr)</code> 防止内容的最小宽度把网格列撑破。</p>
<h3>1.5 顶栏</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">flex</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; align-items: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">center</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; gap: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    height: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--topbar-h</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); border-bottom: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar__brand</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { font-weight: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">700</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); letter-spacing: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.3</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar__title</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.9375</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-weight: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">500</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-muted</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar__user</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  { display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">flex</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; align-items: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">center</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; gap: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; margin-left: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar__avatar</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">inline-flex</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; align-items: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">center</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; justify-content: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">center</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; height: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">30</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; border-radius: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">50</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.8125</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">@media</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (max-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">479</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) { </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.topbar__name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">none</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; } }</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>margin-left: auto</code> 把用户区推到最右，比 <code>justify-content: space-between</code> 更灵活：前者只吃左侧剩余空间，后者会把所有项目分成两组推向两端。</p>
<p>顶栏这里不写 <code>position: sticky</code>：它只占 56px 的网格行，粘性元素在自己的包含块里没有可移动距离，写了也不会吸顶。确实要固定顶栏，就把它移出 <code>.layout</code>，或改用 <code>position: fixed</code> 并给内容补上 <code>padding-top</code>。</p>
<h3>1.6 指标卡</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stats</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">grid</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    grid-template-columns: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">repeat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">auto-fill</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">minmax</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">150</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">));</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    gap: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stat-card</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    border: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); border-radius: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--radius</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); box-shadow: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--shadow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stat-card__label</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-muted</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.8125</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stat-card__value</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { margin: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.5</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-weight: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">700</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; line-height: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-variant-numeric: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">tabular-nums</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stat-card__trend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.75</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stat-card__trend--up</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">   { color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.stat-card__trend--down</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-danger</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">@media</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (min-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1200</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) {</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .stats</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { grid-template-columns: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">repeat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">minmax</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">fr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)); }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>auto-fill</code> + <code>minmax(150px, 1fr)</code> 让 360px 宽排 2 列、平板排 3 列；桌面在 1200px 断点显式固定四列，因为同样的宽度 <code>auto-fill</code> 会排出 5 列。这条覆盖必须写在本节 <code>.stats</code> 基础样式之后，否则基础样式反而把它盖掉。<code>align-content: start</code> 防止内容不满一屏时被 Grid 拉伸摊开。</p>
<h3>1.7 表格与状态标签</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.table-panel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); border: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    border-radius: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--radius</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); box-shadow: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--shadow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); overflow: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">hidden</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.table-panel__title</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">14</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.9375</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-weight: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">600</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; border-bottom: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.table-wrap</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { max-height: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">min</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">60</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">vh</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">360</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); overflow: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">auto</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.data-table</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; min-width: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">520</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; border-collapse: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">separate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; border-spacing: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.data-table</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> th</span><span style="--shiki-light:#A626A4;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> .data-table</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; text-align: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">left</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; white-space: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">nowrap</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    border-bottom: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.data-table</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> thead</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> th</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    position: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">sticky</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; top: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; z-index: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-bg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-muted</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    font-weight: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">500</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.8125</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.data-table</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> tbody</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> tr</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:hover</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-bg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.data-table</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> tbody</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> tr</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:last-child</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> td</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { border-bottom: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.tag</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">inline-block</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; border-radius: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">999</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; font-size: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.75</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">rem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.tag--success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">185</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">129</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.16</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.tag--pending</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary-weak</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.tag--warning</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">217</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">119</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.16</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-warning</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>table-wrap</code> 同时承担两件事：窄屏横向滚动，以及给表头的 <code>position: sticky</code> 提供滚动容器。表头必须有<strong>不透明</strong>背景，否则数据行会从下面透出来；表头用 <code>border-collapse: separate</code> 配 <code>border-spacing: 0</code>，避免 <code>collapse</code> 下合并边框由表格绘制、滚动时与单元格错位。<code>min-width</code> 取 520px：768px 档的内容区约 548px，正好放得下，360px 档则必然横向滚动。示例给了 8 行数据，容器高度封顶到 360px，所以纵向一定出现滚动，第 6 项验收才有得看。</p>
<h3>1.8 侧栏菜单</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.sidebar__link</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    display: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">block</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">7</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; border-radius: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">999</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-muted</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); white-space: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">nowrap</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    transition: </span><span style="--shiki-light:#000000;--shiki-dark:#FFFFFF">background</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0.15</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">s</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> ease</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">color</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0.15</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">s</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> ease</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.sidebar__link</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:hover</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-bg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-text</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.sidebar__link.is-active</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary-weak</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); color: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-primary</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); font-weight: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">500</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>.sidebar</code> 与 <code>.sidebar__menu</code> 的底色、边框、横排样式放在 1.4 的断点之前，桌面端那两条覆盖才压得住：同特异性下后写的赢，顺序一颠倒，桌面侧栏就会多出一条下边框和横向滚动。</p>
<p>选中态用 <code>.is-active</code> 与 <code>aria-current=&quot;page&quot;</code> 双标记：前者给眼睛，后者给读屏。只改颜色不够，色弱用户可能分不出选中项。</p>
<h3>1.9 焦点、跳过链接与动效偏好</h3>
<div class="language-css line-numbers-mode" data-highlighter="shiki" data-ext="css" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-css"><span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.skip-link</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    position: </span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">fixed</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; left: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; top: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">-48</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; z-index: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">100</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    padding: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 12</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; background: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-surface</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">);</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    border: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> solid</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> var</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">--c-border</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); border-radius: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">.skip-link</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:focus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { top: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">@media</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (prefers-reduced-motion: no-preference) {</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .stat-card</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { transition: transform </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.18</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">s</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> ease</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, box-shadow </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.18</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">s</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> ease</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; }</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">    .stat-card</span><span style="--shiki-light:#986801;--shiki-dark:#56B6C2">:hover</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { transform: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">translateY</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">-2</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); box-shadow: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 8</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 24</span><span style="--shiki-light:#986801;--shiki-dark:#E06C75">px</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> rgba</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.12</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">); }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>把动效写进 <code>no-preference</code> 而不是在 <code>reduce</code> 里逐个关掉：默认无动画，用户允许时才加。这比 <code>animation: none !important</code> 干净，也不会漏掉后来新增的动画。</p>
<h3>1.10 验收（10 项全过才算交付）</h3>
<p>| # | 检查项 | 命令或检查 | 通过标准 |
|</p>
]]></content>
    <published>2026-10-27T16:31:46.000Z</published>
  </entry>
</feed>