<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://bornforthis.cn/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://bornforthis.cn/</id>
  <title>AI悦创-Python一对一辅导</title>
  <subtitle>Python 1v1,AI悦创,一对一,Python,编程一对一,C++,Java,AI,人工智能,黄家宝,Python一对一教学</subtitle>
  <icon>https://bornforthis.cn/python</icon>
  <logo>https://bornforthis.cn/aiyc.png</logo>
  <updated>2026-08-16T15:11:59.076Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://bornforthis.cn/atom.xml"/>
  <link rel="alternate" href="https://bornforthis.cn/"/>
  <contributor>
    <name>AI悦创</name>
  </contributor>
  <contributor>
    <name>黄家宝</name>
  </contributor>
  <contributor>
    <name>bornforthis</name>
  </contributor>
  <entry>
    <title type="text">开篇词｜AI 能写策略，但不能替你承担交易风险</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P19-codex-llm-quantitative-trading-course/00-ai-strategy-trading-risk.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P19-codex-llm-quantitative-trading-course/00-ai-strategy-trading-risk.html"/>
    <updated>2026-08-16T15:12:00.286Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260816230112589.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>如果你有想法，但还不知道怎么把它做成证据，那这就是为你准备的开篇。</p>
<p>你不需要一开始就懂完整的量化系统，也不需要先相信 AI 能预测市场。我们要做的，是把一个听起来有道理的交易念头，拆成数据、假设、信号、回测、风险和验收记录。AI 和 Codex 会让这个过程变快，但本专栏更在意另一件事：<strong>当结果看起来很漂亮时，我们有没有足够的证据知道它还能不能被相信</strong>。</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260816230112589.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>如果你有想法，但还不知道怎么把它做成证据，那这就是为你准备的开篇。</p>
<p>你不需要一开始就懂完整的量化系统，也不需要先相信 AI 能预测市场。我们要做的，是把一个听起来有道理的交易念头，拆成数据、假设、信号、回测、风险和验收记录。AI 和 Codex 会让这个过程变快，但本专栏更在意另一件事：<strong>当结果看起来很漂亮时，我们有没有足够的证据知道它还能不能被相信</strong>。</p>
<p>所以，这不是一条通往“自动赚钱机器”的捷径，而是一套把好奇心落到可复查研究里的方法。能跑出结果很重要，能在证据不足时停下来，同样重要。</p>
<h2>1. 你有一个交易想法，但还不是一个研究系统</h2>
<p>我们先从最常见的起点说起：一个朴素、模糊、还没有被验证过的交易念头。它不是坏事，很多研究都从这里开始；真正的分水岭在于，你愿不愿意把它交给数据、规则和失败记录来检查。</p>
<h3>1.1 从一句想法到可验证假设</h3>
<p>如果你也有过这样的念头：</p>
<blockquote>
<p>我有一个交易想法，好像有点道理，但我不知道怎么把它做出来。</p>
</blockquote>
<p>那我们大概率可以聊到一起。这个想法可能很简单，比如“双均线上穿以后能不能跟一段趋势”；也可能更时髦一点，比如“让 LLM 读行情、资金、链上和情绪数据，然后输出一个结构化信号”。</p>
<p>以前，想把这类想法做成能验证的东西，门槛不低：数据从哪来，时间序列怎么清洗，指标怎么算，策略怎么写，回测可信吗，风险怎么拦，页面怎么展示，出错时系统会不会老实停下来。</p>
<h3>1.2 你可能已经开始了，却卡在半路</h3>
<p>也许你已经让 AI 写过策略，却不知道代码是否偷看了未来数据；跑出过一条上涨的权益曲线，却说不清手续费、滑点和样本窗口换了以后会怎样；也许你收藏了很多教程，复制了不少代码，但手里仍然没有一条从想法、数据到回测和验收的完整路径。</p>
<p>这些问题不是因为你“不会写几行代码”，而是因为一个研究结果需要的不只是代码。它还需要可追溯的数据、没有歧义的规则、诚实的失败记录和别人能复跑的验收过程。本专栏要帮你补上的，正是这条从“做出来”到“证明它值不值得相信”的路。</p>
<h3>1.3 AI 让搭建变快，也让误信变容易</h3>
<p>现在有了 LLM 和 Codex，事情突然变得顺手很多。LLM 可以帮你整理上下文、解释市场状态、把一堆信息压成结构化结论；Codex 可以进入代码仓库，读文件、改代码、跑测试、修失败、生成图表和页面。一个过去需要几个人配合的小型研究系统，现在一个人也能搭出雏形。</p>
<p>这当然让人兴奋，但也正因为太顺手，才更容易踩坑。</p>
<p>AI 给你一段“看起来很专业”的交易解释，不代表它真的知道市场会怎么走；Codex 帮你跑出一条漂亮的回测曲线，也不代表这条策略可以拿真钱试。量化研究里最要命的误会，往往不是程序报错，而是程序没报错、图也很好看、解释也很流畅，然后你就信了。</p>
<h3>1.4 从想法到证据链</h3>
<p>所以本专栏想陪你练的，不是“怎样让 AI 说得更像交易员”，而是：</p>
<ul>
<li>一个想法怎样写成可以被验证的假设；</li>
<li>一份数据怎样留下来源、时间、缺失和回退记录；</li>
<li>一个 LLM 信号怎样被结构化、评分、拒绝和复查；</li>
<li>一条策略怎样进入回测，而不是直接变成订单；</li>
<li>一次回测怎样同时看收益、回撤、成本、窗口稳定性和过拟合风险；</li>
<li>一个研究系统怎样在自动化之前先学会停下来；</li>
<li>最后，别人能不能接手你的材料，复跑同样的命令，看见同样的证据。</li>
</ul>
<h2>2. 先说清楚：这不是交易秘籍</h2>
<p>在进入工具和系统之前，边界要先摆在前面。交易研究最怕把“能解释”“能回测”“能展示”误读成“能赚钱”，所以这一节先说明本专栏做什么，也说明它坚决不做什么。</p>
<h3>2.1 研究、教学和模拟验证的边界</h3>
<p>本专栏用一套可运行的 Web3（以区块链和链上数据为核心的互联网形态）市场研究与模拟策略验证系统贯穿 35 讲。选择 Web3，不是因为它更容易赚钱，而是因为它很适合暴露问题：市场全天运行，数据噪声大，行情、资金、链上、情绪数据各说各话，热点切换很快，LLM 又特别擅长把不完整的信息讲成一个完整故事。</p>
<p>这套系统只做研究、教学和模拟验证。它会用固定离线样本和可保存快照，展示行情总览、机会雷达、K 线（蜡烛图）分析、LLM 信号、策略回测、风险中心和模拟交易页面；但它不连接真实交易所账户，不连接钱包，不提交真实订单，也不提供个性化投资建议。</p>
<p>更正式地说：本专栏内容仅用于技术研究、工程教学和模拟验证，不构成任何形式的投资建议、交易建议、收益承诺或资产配置建议。你如果基于自己的判断做真实投资或交易，需要自行承担全部风险；专栏里的样本、代码、图表和回测结果，都不能作为真实下单依据。</p>
<h3>2.2 允许、审批、禁止三类动作</h3>
<p>后面所有设计都会守住三层边界：</p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><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></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>你可以把它理解成朋友之间提前说好的规矩：我们可以一起研究、一起验证、一起拆穿幻觉，但不把方向盘交给模型。</p>
<h2>3. AI、Codex、量化方法和人各做什么</h2>
<p>接下来要拆清楚工具之间的分工。AI 可以生成解释，Codex 可以改代码，量化方法可以检验假设，但它们都不能替人承担判断和责任；只有边界清楚，协作才不会变成互相背书。</p>
<h3>3.1 从好案例学可复查</h3>
<p>优秀的量化和 AI 工程案例，真正值得学的通常不是“它用了什么神奇策略”，而是“它怎样把流程做得可复查”。</p>
<p>例如：</p>
<ul>
<li><a href="https://www.quantconnect.com/docs/v2/lean-engine" target="_blank" rel="noopener noreferrer">QuantConnect LEAN（开源量化交易引擎）</a> 把研究、回测、组合建模和多资产支持放进同一套开源引擎里，提醒我们：策略不是一句买卖建议，而是数据、组合、交易规则和运行环境共同作用的结果。</li>
<li><a href="https://www.backtrader.com/docu/" target="_blank" rel="noopener noreferrer">Backtrader（基于 Python 编程语言的回测框架）</a> 这类框架强调可复用策略、指标和分析器，也提醒我们不要每次都临时写一个只服务当前结论的小脚本。</li>
<li><a href="https://hudsonthames.org/mlfinlab/" target="_blank" rel="noopener noreferrer">MlFinLab（金融机器学习工具库）</a> 反复提醒回测很容易过拟合、制造“虚假的投资发现”；</li>
<li><a href="https://platform.openai.com/docs/api-reference/evals" target="_blank" rel="noopener noreferrer">OpenAI Evals（模型评测框架）</a> 的思路则告诉我们：面对不稳定的 LLM 输出，不能只凭感觉说“这版更好”，而要用固定样本、评分规程和失败样本去比较。</li>
</ul>
<p>这些案例给我们的共同启发很朴素：<strong>别急着相信结果，先把结果变成别人也能检查的东西</strong>。</p>
<h3>3.2 四个角色，别互相冒充</h3>
<p>本专栏会反复出现四个角色：Codex、LLM、量化方法和人。它们可以配合，但不能互相冒充。</p>
<p>表 0-1 先把四个角色的边界放在桌面上。</p>
<p>| 角色     | 擅长什么                                 | 要留下什么证据                           | 不能替代什么               |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-08-16T08:55:40.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-留学生作业代写「unsw.edu.au」</title>
    <id>https://bornforthis.cn/1v1/study-abroad-academic-support/01-assagment1.html</id>
    <link href="https://bornforthis.cn/1v1/study-abroad-academic-support/01-assagment1.html"/>
    <updated>2026-08-16T15:12:00.542Z</updated>
    <summary type="html"><![CDATA[<h2>1. 题目</h2>
<details class="hint-container details"><summary>原始图片</summary>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/c595e5c1d945aad4803eb4d60a1af11c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260803230319724.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260803225740383.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260803225749166.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>1. 题目</h2>
<details class="hint-container details"><summary>原始图片</summary>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/c595e5c1d945aad4803eb4d60a1af11c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260803230319724.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260803225740383.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.one.bornforthis.cn/2026/07/20260803225749166.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"># Interactive Web Page Assignment Brief</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">You will create an interactive web page (again using HTML, CSS and Javascript and other techniques submitted as a .Zip file). Your site will be an artifact of the future that situates us in your imagined world; it will tell us what it is like to live there by communicating experiences and narratives.</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#5C6370;--shiki-dark-font-style:inherit">> </span><span style="--shiki-light:#A626A4;--shiki-light-font-style:italic;--shiki-dark:#C678DD;--shiki-dark-font-style:italic">*Writing and exercises towards the completion of this assignment, completed during lectures, will comprise 25% of your grade.*</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Your interactive site will be an artwork that makes us think more deeply about the implications of your speculation. It will incorporate key ideas, themes, settings and technologies from your previous assignment in an innovative premise. Think of this task as a way into your world that brings it to life and animates your critical concerns through specific experiences, platforms and/or narratives. You are encouraged to be bold and experimental in your approach to narrative - what can your piece be? How can you stretch the form to make it new and interesting.</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>]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-07-31T14:17:21.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">09-看懂代码，却不会写：AI时代真正该补的，是逻辑、研究与长期资产</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P09-FAQ/FAQ09.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P09-FAQ/FAQ09.html"/>
    <updated>2026-08-16T15:12:00.583Z</updated>
    <summary type="html"><![CDATA[<blockquote>
<p>形式：单人叙事播客</p>
<p>建议时长：约 25～30 分钟</p>
<p>内容范围：根据 <code>meeting-viral-highlights-final.mp4</code> 的完整字幕整理，覆盖成片全部核心内容，而非单一片段</p>
</blockquote>
<p>播客音频：<a href="https://github.com/AndersonHJB/BornforthisData/tree/main/%E6%92%AD%E5%AE%A2/01-%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3/01-%E7%9C%8B%E6%87%82%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%8D%B4%E4%B8%8D%E4%BC%9A%E5%86%99%EF%BC%9AAI%E6%97%B6%E4%BB%A3%E7%9C%9F%E6%AD%A3%E8%AF%A5%E8%A1%A5%E7%9A%84%EF%BC%8C%E6%98%AF%E9%80%BB%E8%BE%91%E3%80%81%E7%A0%94%E7%A9%B6%E4%B8%8E%E9%95%BF%E6%9C%9F%E8%B5%84%E4%BA%A7" target="_blank" rel="noopener noreferrer">看懂代码，却不会写：AI时代真正该补的，是逻辑、研究与长期资产</a></p>]]></summary>
    <content type="html"><![CDATA[<blockquote>
<p>形式：单人叙事播客</p>
<p>建议时长：约 25～30 分钟</p>
<p>内容范围：根据 <code>meeting-viral-highlights-final.mp4</code> 的完整字幕整理，覆盖成片全部核心内容，而非单一片段</p>
</blockquote>
<p>播客音频：<a href="https://github.com/AndersonHJB/BornforthisData/tree/main/%E6%92%AD%E5%AE%A2/01-%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3/01-%E7%9C%8B%E6%87%82%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%8D%B4%E4%B8%8D%E4%BC%9A%E5%86%99%EF%BC%9AAI%E6%97%B6%E4%BB%A3%E7%9C%9F%E6%AD%A3%E8%AF%A5%E8%A1%A5%E7%9A%84%EF%BC%8C%E6%98%AF%E9%80%BB%E8%BE%91%E3%80%81%E7%A0%94%E7%A9%B6%E4%B8%8E%E9%95%BF%E6%9C%9F%E8%B5%84%E4%BA%A7" target="_blank" rel="noopener noreferrer">看懂代码，却不会写：AI时代真正该补的，是逻辑、研究与长期资产</a></p>
<h2>正式口播稿</h2>
<p>【片头音乐渐弱】</p>
<p>你有没有遇到过这样一种状态？</p>
<p>别人写的代码，你打开一看，好像每一行都懂。变量认识，循环认识，函数也认识。可是，一旦把参考代码关掉，让你从一个空白文件开始写，大脑就突然一片空白。</p>
<p>这不是少数人的问题。很多学编程的人，最后都会卡在同一个地方：代码能看懂，但是不会写。</p>
<p>今天这期节目，我想先给你三个判断。</p>
<p>第一个判断：看懂代码，不等于会写代码。</p>
<p>你能看懂语法，只说明你认识这些零件；你能不能把零件组织成一个真正能运行的系统，考验的是另一种能力。</p>
<p>第二个判断：很多时候，真正难的不是用代码实现一个公式，而是理解这个公式究竟在表达什么。</p>
<p>代码只是把已经想清楚的关系执行出来。如果问题本身没有被定义清楚，代码写得越快，反而可能越快走向错误答案。</p>
<p>第三个判断：学习路线必须选对，而且选完以后一定要落实。</p>
<p>路线画得再漂亮，如果没有连续行动，没有项目，没有输出，也没有沉淀，最后还是白搭。</p>
<p>这三个判断，来自一次真实的学习咨询。</p>
<p>咨询者是一位国内 985 高校的大三学生，专业背景和控制方向有关。他已经确定直博清华，未来希望接触机器学习、人工智能、图像识别、自动驾驶和智能驾驶。</p>
<p>按一般标准来看，他的学习能力、升学路径和基础都不差。他也不是从来没有学过编程。Python 的不少语法，他看到了是知道的；别人写好的代码，他也能大致理解。</p>
<p>但他依然遇到了那个非常典型的问题：</p>
<p>代码能看懂，自己却写不出来。</p>
<p>他来寻找帮助的原因也很直接：如果继续完全靠自己摸索，他觉得效率有点低。他真正想学的，不是再背一遍语法，而是学会使用 Codex 或其他 AI 工具，复现真实项目，做出自己的项目，理解底层逻辑，最后把这些能力服务于科研。</p>
<p>所以这期节目，我们就从他的困惑出发，把整场交流完整梳理一遍。</p>
<p>我们会聊到：为什么 Python 不能跳，C 和 C++ 应该放在哪里；为什么同样使用 AI，有人得到的是空话，有人却能做出真正的项目；为什么个人网站、公开学习和知识库会成为长期数字资产；为什么模型会跑，离真正理解人工智能还差得很远；以及为什么最后那句“前期卷一点，后期容错率高”，并不是一句简单的鸡汤。</p>
<p>【短暂停顿】</p>
<h2>第一部分：会看不会写，真正缺的不是更多语法</h2>
<p>先回到这位学生的困境。</p>
<p>他说，Python 的具体语法自己其实知道一些。别人把代码放在面前，他一看，感觉也挺懂。</p>
<p>可是，一旦轮到自己动手，就写不出来。</p>
<p>这种感觉很像看别人打球。你坐在场边，会觉得每个动作都很自然；真正轮到自己上场，却发现身体根本组织不出那些动作。</p>
<p>也像阅读和写作。你读一篇文章，每个字都认识，不代表你能够围绕同一个主题，从零写出一篇结构完整的文章。</p>
<p>因为“识别”和“生成”，原本就是两种不同的能力。</p>
<p>看代码时，别人已经替你完成了最难的一部分：目标已经确定，结构已经搭好，模块之间的关系也已经安排好了。你只需要顺着现成的逻辑往下读。</p>
<p>自己写代码时，你面对的是一张白纸。你要先回答：究竟要解决什么问题？输入是什么？输出是什么？任务怎样拆分？数据怎么流动？模块怎么连接？异常如何处理？完成的标准又是什么？</p>
<p>这些问题想清楚以后，才轮到具体语法。</p>
<p>所以，很多人真正缺少的并不是更多零散语法，而是组织问题、组织逻辑和组织实现路径的能力。</p>
<p>这也是为什么会议里反复强调：真正的主线是逻辑和思维。</p>
<p>语法很重要，练习和复现也有价值，但如果这些活动没有帮助你建立逻辑，它们就很容易停留在表面。</p>
<p>尤其是 Python，它的很多表达相对接近自然语言。英语单词熟悉一点，你就能大概猜到一行代码在做什么。这种“看起来很容易懂”的感觉，反而可能制造一种错觉：我好像已经会了。</p>
<p>可是，认识关键词和设计系统，完全不是一回事。</p>
<p>这位学生真正希望获得的能力，是借助 Codex 和 AI 去复现项目、完成项目、理解底层逻辑，并且继续做研究。</p>
<p>目标从“学会几条语法”，变成“能研究、能复现、能创造”，学习路线也必须跟着改变。</p>
<p>【转场】</p>
<h2>第二部分：为什么 Python 绕不开，C 和 C++ 又该放在哪里</h2>
<p>如果你未来准备做机器学习、人工智能、图像识别、无人驾驶或者智能驾驶，Python 基本上是绕不开的。</p>
<p>这里不是说所有系统最后都必须用 Python，也不是说学了 Python 就不需要其他语言。</p>
<p>它真正的价值，是在学习、研究和原型验证阶段，让你能够更快地把想法变成实验。</p>
<p>处理数据、绘制图表、训练模型、调用机器学习框架、验证算法、比较不同方案，这些工作都可以先用 Python 完成。</p>
<p>因此，对于这位已经直博、准备继续科研的学生来说，编程并不是一个可学可不学的附加项。无论最终走硕士、博士还是工程路线，只要未来方向涉及人工智能和自动驾驶，编程就是基础能力，而 Python 是其中必须面对的一部分。</p>
<p>那 C 和 C++ 呢？</p>
<p>它们当然也重要，只是承担的任务不同。</p>
<p>一个算法在研究阶段，可能先用 Python 做原型。因为这个阶段最重要的是快速修改、快速比较、检查数据和验证思路。</p>
<p>等到方案需要进入真实设备，特别是需要放到芯片上，或者对速度、延迟、内存、资源占用和实时性有严格要求时，C 或 C++ 的价值会更加明显。</p>
<p>所以，Python 和 C、C++ 不是二选一，更合理的理解是阶段分工：</p>
<p>前期用 Python 快速学习、实验和验证；进入性能敏感的部署阶段，再使用 C 或 C++ 做优化和落地。</p>
<p>语言不同，工具不同，但贯穿始终的依然是逻辑。</p>
<p>如果问题没有想清楚，用什么语言都只是把混乱写得更长。</p>
<p>【短暂停顿】</p>
<h2>第三部分：同样的 AI，为什么有人用起来明显更强</h2>
<p>会议里用了一个非常具体的例子。</p>
<p>假设两个人都在使用同一个最新模型。</p>
<p>第一个人对 AI 说：“帮我做一个网页。”</p>
<p>第二个人说：“我想做一个类似社交信息流的网页。用户可以发布帖子，可以评论互动，可以搜索内容，也支持点赞和收藏。我希望先做一个能运行的最小版本，再逐步增加功能。”</p>
<p>谁更容易得到好的结果？</p>
<p>答案通常是第二个人。</p>
<p>不是因为第二个人拥有神秘提示词，也不是因为他使用了更强的模型，而是因为他知道自己想要什么，并且能把需求表达得更清楚、更具体、更精准。</p>
<p>“做一个网页”只是愿望。</p>
<p>“让用户能够发布、评论、搜索、点赞和收藏”，才开始接近一个可以执行的需求。</p>
<p>很多人习惯把 AI 能力理解成模型单方面的能力。实际上，人和 AI 形成的是一个协作系统。</p>
<p>模型水平相同，使用者定义问题、补充背景、设定约束、拆分任务和判断结果的能力不同，最终产出就可能完全不同。</p>
<p>所以，AI 时代非常值得训练的一项能力，就是把模糊愿望变成明确需求。</p>
<p>“我想学人工智能”是愿望。</p>
<p>“我想使用某个数据集复现一篇论文的方法，先建立基线，再比较不同特征处理对结果的影响”，才是一个可以启动的研究任务。</p>
<p>当你把问题表达得足够具体，AI 才有可能给出真正有用的帮助。</p>
<p>这也会自然延伸出另一项能力：读文档。</p>
<p>一个工具、框架或项目发布以后，通常都会附带配套文档、示例和说明。</p>
<p>真正具备研究能力的人，不会只等别人把答案直接喂到嘴边。他会去研究文档，完成最小示例，比较不同实现，再把已有知识组合起来。</p>
<p>最后，他可能做出自己的教程、笔记或者项目。</p>
<p>因此，Python 基础的终点不应该只是“学完语法”。</p>
<p>更有价值的目标是：借助 Python，逐步学会研究。</p>
<p>面对陌生工具，你能从文档里找到入口；面对陌生项目，你能拆出可以复现的部分；面对没有标准答案的问题，你能组合已有知识，提出自己的实现。</p>
<p>到这一步，AI 才不只是替你写代码的工具，而是研究过程中的协作者。</p>
<p>【转场音乐】</p>
<h2>第四部分：Learning in Public，把学习过程变成作品</h2>
<p>说到研究和输出，就不得不提到 Learning in Public，也就是公开学习。</p>
<p>公开学习并不意味着把所有内容和隐私全部放到网上。</p>
<p>更合理的方式，是建立两个层次。</p>
<p>一层对外公开，展示你的项目、文章、思考和迭代过程；另一层服务自己，保留更完整的私人笔记、草稿和检索系统。</p>
<p>公开的部分，是你的名片。</p>
<p>私人的部分，是你的工作台。</p>
<p>你可以做一个个人网站，把学习过程中真正有价值的内容持续记录下来。</p>
<p>对别人来说，他看到的是一个有结构的作品空间；对你自己来说，它又是一套能够反复查询、复盘和调用的笔记系统。</p>
<p>为什么这件事重要？</p>
<p>因为作品比自我介绍更有说服力。</p>
<p>你可以在简历里写“我对人工智能很感兴趣”，也可以说“我的学习能力很强”。但这些都是自我判断，别人没办法立刻验证。</p>
<p>如果你有一个网站，里面记录了怎样复现项目、怎样阅读文档、怎样处理失败、怎样从一个简单 Demo 增加功能，别人一眼就能看出你投入了多少时间。</p>
<p>会议里提到一个很具体的细节。</p>
<p>一次交流结束以后，有人专门追问：“你刚才提到的网站是哪一个？写给我，我想去看看。”</p>
<p>为什么对方会主动问？</p>
<p>因为作品已经产生了兴趣。它替创作者完成了一部分自我介绍，也给了别人继续了解他的理由。</p>
<p>网站还有另一个作用：留住灵感。</p>
<p>很多想法出现时很兴奋，但寿命可能只有几十秒。你想着稍后再记，转头就忘了。</p>
<p>如果有一个固定入口，新想法就可以立刻留下来。哪怕一开始只写一句话，以后也能继续补充。</p>
<p>零散的念头开始汇总，失败的尝试不再白费。学习就从一次次短暂活动，变成了可以积累的过程。</p>
<p>时不时回头看看这些记录，你还会获得一种很具体的成就感：原来自己已经走了这么远。</p>
<p>不过，Learning in Public 不能只停留在“发内容”。</p>
<p>更重要的是训练三个动作：观察、复现、延伸。</p>
<p>会议里讲了一个真实案例。</p>
<p>有人做了一个艺术相关的作品，但没有开源，也没有提供直接体验。分享者觉得这个作品很适合让孩子体验，因为自己的爱人正好是老师，于是产生了一个想法：能不能自己把它做出来，让孩子们玩一玩？</p>
<p>当时能够看到的材料并不多，主要就是一段大约一分钟的视频。</p>
<p>他把这段视频反复看了很多遍。</p>
<p>先观察作品到底做了什么，交互如何发生，核心效果怎样呈现；然后试着用自己的语言和工具把它表达出来，先做出一个 Demo；Demo 能跑以后，再慢慢增加自己的功能。</p>
<p>后面的部分，就不再只是复制原作，而是在原来的观察基础上继续延展。</p>
<p>这个过程真正训练的是观察能力。</p>
<p>同样看到一个东西，有人只会说“好厉害”；另一个人能够拆出结构，做成 Demo，再变成自己的作品。两者之间的差距，就在这里。</p>
<p>个人网站也可以用同样的方法生长。</p>
<p>一开始，它可能只有博客功能。</p>
<p>后来增加评论功能。</p>
<p>再后来，因为喜欢旅行，加入旅行记录；因为喜欢摄影，加入相册；因为想分享实习经历，又增加新的故事和内容形式。</p>
<p>网站不再是做完就静止的页面，而是一个有生命性的项目。</p>
<p>它可以不断伸展，而伸展的方向来自你的创意、兴趣和真实经历。</p>
<p>文章、代码、项目、图片、教程和思考不断进入这个系统以后，它们就不只是内容，而会逐渐成为你的数字资产。</p>
<p>【短暂停顿】</p>
<h2>第五部分：模型会跑，不代表真正理解人工智能</h2>
<p>很多刚开始接触机器学习的人，会把“成功训练出一个模型”当成终点。</p>
<p>数据导入了，代码运行了，参数改了几次，屏幕上也出现了指标，看起来好像已经掌握了人工智能。</p>
<p>但会议里给出了一个很直接的判断：</p>
<p>让一个现成模型跑起来，未必是最难的。</p>
<p>真正难的是数学、数据和逻辑。</p>
<p>成熟框架已经把很多工程细节封装好了。你会调用接口、修改参数，就有可能得到一个看似完整的结果。</p>
<p>问题是：你知道结果为什么会这样吗？</p>
<p>你知道数据里的每一列代表什么吗？</p>
<p>你知道一个指标升高，究竟说明模型更好了，还是数据处理出了问题吗？</p>
<p>你知道某个参数变化背后的数学意义吗？</p>
<p>你知道缺失值为什么出现，又应该怎样处理吗？</p>
<p>以缺失值为例。</p>
<p>假设一列数据里有几个位置是空的。很多教程会立刻告诉你：用平均数填，或者用众数填。</p>
<p>可是，真正的数据分析不能从“调用哪个函数”开始。</p>
<p>你首先要问：这一列到底代表什么？</p>
<p>它代表年龄、工资、传感器读数，还是类别标签？</p>
<p>缺失是随机发生的，还是某一类样本更容易缺失？</p>
<p>数据的分布怎样？有没有异常值？你填入一个数字以后，会不会影响总体结果？</p>
<p>例如工资这类数据，极端高值可能会明显拉动平均数。如果不理解分布，只是机械地选择一个数填进去，就可能把结果带偏。</p>
<p>类别数据和连续数据也不可能使用完全相同的处理逻辑。</p>
<p>有时可以填补，有时应该单独标记，有时甚至“没有记录”本身就携带信息。</p>
<p>所以，处理缺失值不是选择一个 API，而是在理解数据语义以后做判断。</p>
<p>这就是数据思维。</p>
<p>数据思维不是盯着表格看数字，而是追问数字背后的规律：它从哪里来，代表什么，为什么变化，哪些关系是真实的，哪些关系可能只是处理方式造成的。</p>
<p>会调参数，也许就能开始训练模型。</p>
<p>但真正决定你能不能继续走下去的，是你能不能理解数学、数据和逻辑。</p>
<p>【转场】</p>
<h2>第六部分：公式定义问题，代码只是实现工具</h2>
<p>会议里用了一个非常简单的公式例子。</p>
<p>假设我们要表达一个关系：y 等于 a 乘 x，加上 b 乘 x，再加 c。</p>
<p>真正定义问题的是这个数学关系。</p>
<p>代码要做的，只是把它转换成计算机可以执行的步骤。</p>
<p>如果公式理解错了，代码写得再漂亮也没有用。</p>
<p>反过来，只要关系已经定义清楚，使用哪种语言、调用哪个库，很多时候只是实现层的选择。</p>
<p>所以可以记住一句话：</p>
<p>公式定义问题，代码负责实现。</p>
<p>代码很重要，但它首先是一种工具。</p>
<p>真正决定你能走多远的，是数学理解、数据语义和逻辑判断。</p>
<p>这也是为什么 Python 基础不能轻易跳过。</p>
<p>不是因为每一条语法都必须背下来，而是因为基础学习应该承担训练思考的任务。</p>
<p>举一个很小的例子。</p>
<p>Python 为什么同时支持单引号字符串、双引号字符串和三引号字符串？</p>
<p>你当然可以直接搜索，也可以问 AI。几秒钟以后，答案就出来了。</p>
<p>但如果学习永远停在“拿到结论”，你获得的只是一条很快会忘记的信息。</p>
<p>更有价值的训练，是先自己分析：这些写法分别解决了什么问题？为什么语言设计者保留了多种形式？它们在嵌套引号、多行文本和文档字符串中，各自有什么作用？</p>
<p>当你能够一步一步分析出这些设计理由，你训练的就不只是 Python，而是分析系统的能力。</p>
<p>而且还要再往前一步：能不能借助这些规律，创造属于自己的东西？</p>
<p>结论本身随时可以搜索。</p>
<p>真正稀缺的是，你能不能自己分析出结论，再利用结论完成新的创造。</p>
<p>【短暂停顿】</p>
<h2>第七部分：把基础学到“指哪打哪”</h2>
<p>Python 基础真正应该达到的目标，是以后不用反复回头纠结最基本的问题，而能够根据目标直接补充对应模块。</p>
<p>需要做数据分析，就集中学习数据分析。</p>
<p>需要做人工智能，就拆出人工智能相关的算法、框架和工具。</p>
<p>需要处理图像，就补图像处理。</p>
<p>需要进入芯片部署，再进入 C、C++ 和系统优化。</p>
<p>这就是会议里所说的“指哪打哪”。</p>
<p>基础不是要求你提前学完世界上所有知识，而是让你面对一个新方向时，知道从哪里切入，也有能力把新模块接进原来的体系。</p>
<p>没有基础，所谓按需学习很容易变成到处复制代码。每解决一个问题，都像重新开始。</p>
<p>基础扎实以后，新技术才会挂到已有的知识结构上。</p>
<p>但逻辑训练还有一个非常现实的条件：连续性。</p>
<p>一节课或者一次练习刚刚帮助你建立起某种推理感觉，如果中间间隔太久，下一次回来时，原本形成的连接就可能消失。</p>
<p>这和运动、语言表达、音乐训练很像。</p>
<p>你刚找到感觉，就停很久；下次不是从原来的位置继续，而是重新热身。</p>
<p>大量时间耗在反复启动上，学习效率当然会下降。</p>
<p>所以，有效学习不只要求“持续”，还要求一定程度的“连续”。</p>
<p>这里不必迷信某个固定频率，但需要建立稳定节奏，让阅读、思考、编码、复盘和输出形成闭环。</p>
<p>不要今天兴奋地学六个小时，然后两周完全不碰。</p>
<p>短期强度，不能替代长期连续性。</p>
<p>如果只是时不时学一下，逻辑训练很可能反复归零。严重的时候，还不如暂时不开始，先为学习安排出真正稳定的时间。</p>
<p>【转场音乐】</p>
<h2>第八部分：建立个人知识库，让 AI 检索你自己的积累</h2>
<p>当学习内容越来越多，另一个问题就会出现：</p>
<p>我以前明明写过，为什么现在找不到了？</p>
<p>笔记散落在不同软件里，代码分布在很多文件夹，截图在相册，灵感在聊天记录。</p>
<p>你知道某个内容存在，却想不起文件名，也不知道它究竟放在哪里。</p>
<p>AI 可以帮助解决这个问题，但前提是，你先建立自己的资料系统。</p>
<p>把笔记、文章、代码、项目说明和学习记录，逐步整理到一个属于自己的知识库，也就是个人 Database。</p>
<p>以后，你不一定需要记住文件名和准确路径。</p>
<p>你可以直接问：</p>
<p>“我以前写过一篇关于 Learning in Public 的笔记，帮我找出来。”</p>
<p>“我之前在哪个项目里处理过缺失值？”</p>
<p>“把我关于 Python 字符串设计的记录汇总一下。”</p>
<p>AI 根据内容检索，再把相关材料返回给你。</p>
<p>这样，你就不必每次都从零开始，也不必依靠自己记住每一个文件放在哪里。</p>
<p>这和把问题直接丢给公共模型并不完全一样。</p>
<p>公共模型给你的是通用知识；个人知识库连接的是你过去的思考、代码、笔记和项目上下文。</p>
<p>它相当于给自己的长期记忆增加了一个检索层。</p>
<p>当然，也要注意公开与私有的边界。</p>
<p>适合展示的项目、文章和总结，可以放在公开网站；包含个人信息、未发布研究、敏感数据或内部资料的内容，应该保留在受控的私人空间。</p>
<p>这样，个人网站、私人笔记、知识库和 AI 检索就能组合成一个完整系统：</p>
<p>网站负责对外展示。</p>
<p>笔记负责保留过程。</p>
<p>知识库负责统一沉淀。</p>
<p>AI 负责帮助你重新找到、连接和调用这些内容。</p>
<p>今天写下的一条笔记，可能会在几个月后的项目中被重新使用。</p>
<p>一次失败的实验，也可能成为以后避坑的依据。</p>
<p>数字资产真正的价值，不是放在那里显得内容很多，而是它能够在未来继续参与你的学习和工作。</p>
<p>【短暂停顿】</p>
<h2>第九部分：关于课程、费用和那本删掉三百多页的书</h2>
<p>交流最后谈到了课程安排。</p>
<p>这里把会议当时的信息和边界完整说明。</p>
<p>会议中提到的价格，是每节课三百元，每节课一个小时。</p>
<p>同时也提到，如果是长期学习，前期可能按照当时的价格进行；后期根据真实学习情况，费用存在调整的可能。</p>
<p>例如持续投入大约三个月以后，如果能看到学生确实认真、有行动，老师可能会主动提出适当降低费用，不需要学生先开口。</p>
<p>但这里必须强调：</p>
<p>这只是会议当时表达的一种可能安排，不是固定承诺。</p>
<p>是否调整、何时调整、调整多少，都没有预先确定，也不应该被理解为保证。实际价格和具体规则，要以双方之后的真实沟通为准。</p>
<p>为什么还要保留这部分？</p>
<p>因为它反映了这套学习思路的另一个核心：相比一次性购买大量内容，更关注长期投入和真实行动。</p>
<p>会议中还提到一本书。</p>
<p>这本书的原稿有六百多页，后来删掉了三百多页，而被删掉的主要是 Python 内容。</p>
<p>保留下来的前半部分，更集中在编程思维。</p>
<p>Python 部分则准备在课程中重新讲解，实际内容也会和原稿有所差异。</p>
<p>这个取舍很有意思。</p>
<p>我们经常把“内容越厚”理解成“价值越高”，但知识并不是简单堆页数。</p>
<p>如果一本书要解决的是编程思维，就应该把核心结构留下来。</p>
<p>那些需要互动、追问、分析过程和持续训练的内容，可能更适合放进课程和项目实践。</p>
<p>重要的从来不是“我看过六百页”，而是：</p>
<p>我有没有建立分析问题的方法？</p>
<p>我能不能在没有标准答案的时候继续往下走？</p>
<p>我能不能把学到的东西变成项目、作品和自己的知识系统？</p>
<p>【片尾音乐缓慢进入】</p>
<h2>结尾：前期卷一点，后期容错率高</h2>
<p>最后，我们回到节目开头的三个判断。</p>
<p>看懂代码，不等于会写代码。</p>
<p>理解公式，往往比实现公式更难。</p>
<p>路线选对以后，还必须真正落实。</p>
<p>怎样落实？</p>
<p>第一，把模糊目标写成清晰需求。</p>
<p>不要只写“我要学 AI”，而要写清楚：你想复现什么，解决什么，输入是什么，输出是什么，最后交付什么。</p>
<p>第二，选择一个足够小的项目开始。</p>
<p>阅读文档，完成 Demo，再观察、复现和延伸。不要一开始就幻想做出一个庞大系统。</p>
<p>第三，为学习建立固定的记录入口。</p>
<p>公开的部分变成作品和个人名片；私人的部分进入笔记和知识库；再让 AI 帮助你检索和连接。</p>
<p>第四，保持连续训练。</p>
<p>不要迷恋一次性的爆发，也不要因为 AI 能直接给出答案，就跳过自己的推理过程。</p>
<p>AI 可以替你补全代码，可以解释报错，也可以迅速给出结论。</p>
<p>但它替代不了你理解问题，替代不了你判断数据，也替代不了你决定自己究竟想创造什么。</p>
<p>如果你现在正处在“代码能看懂，但自己不会写”的阶段，不要急着给自己贴上“没有天赋”的标签。</p>
<p>你可能缺少的，不是更多语法，而是一条从逻辑、研究、项目到持续沉淀的完整训练链路。</p>
<p>听完这期节目，你可以立刻做一个很小的行动：</p>
<p>把你最想完成的项目，用一句尽可能具体的话写下来。</p>
<p>写清对象、功能、约束和预期结果。</p>
<p>然后重新看看：你到底是不会写代码，还是还没有把问题定义清楚？</p>
<p>最后，用这次交流里反复强调的那句话，结束今天这期节目：</p>
<p>前期卷一点，后期容错率高。</p>
<p>它不是让你盲目内卷。</p>
<p>而是在选择还多、试错成本还低的时候，把基础、逻辑和方法练扎实。</p>
<p>这样走到后面，你才有更大的空间做选择，也有更强的能力应对变化。</p>
<p>【片尾音乐升起】</p>
<p>感谢你收听今天的节目，我们下期见。</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="/gzh.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="/zsxq.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-07-30T19:14:44.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-完美通过 Codex 验证！giffgaff eSIM 保姆级教程：1 年几块钱拥有正规海外手机号，安卓非 eSIM 也能用，轻松注册 Telegram 和 WhatsApp</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P18-Codex/01-giffgaff-esim-guide-telegram-whatsapp-registration.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P18-Codex/01-giffgaff-esim-guide-telegram-whatsapp-registration.html"/>
    <updated>2026-08-16T15:12:00.588Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-07-20T09:53:10.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">02-不用代充、不买虚拟卡！用自己的国内银行卡订阅 ChatGPT/Claude Plus</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P18-Codex/02-ChatGPT-Plus-Chain-Card.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P18-Codex/02-ChatGPT-Plus-Chain-Card.html"/>
    <updated>2026-08-16T15:12:00.589Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ed/ed39715bf73fa7d16bc5f9c830859cba6a6a132e7f0900fc43e55684ae6e6162.png" alt="用国内银行卡订阅 ChatGPT Plus" tabindex="0" loading="lazy"><figcaption>用国内银行卡订阅 ChatGPT Plus</figcaption></figure>
<p>你好，我是悦创。</p>
<p><strong>如果你实在看教程不会，可以找我付费操作！费用视你准备的情况而定！</strong></p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ed/ed39715bf73fa7d16bc5f9c830859cba6a6a132e7f0900fc43e55684ae6e6162.png" alt="用国内银行卡订阅 ChatGPT Plus" tabindex="0" loading="lazy"><figcaption>用国内银行卡订阅 ChatGPT Plus</figcaption></figure>
<p>你好，我是悦创。</p>
<p><strong>如果你实在看教程不会，可以找我付费操作！费用视你准备的情况而定！</strong></p>
<p>这篇教程解决的就是：<strong>人在 ChatGPT 不能直接完成开通的地区，如何用自己的账号和国内银行卡，把 Plus 真正订阅成功。</strong></p>
<p>想用自己的账号、自己的手机和国内银行发行的银行卡开通 ChatGPT Plus，可以走下面这条路径：<strong>国内银行卡 → Google 付款中心 → Google Play → ChatGPT Android 客户端 → Plus</strong>。</p>
<p>它和在 ChatGPT 网页端直接填卡不是一回事。网页端会根据银行卡的 BIN 码识别发卡地区，国内银行发行的卡即使是 Visa 或 Mastercard 单标卡，也会被直接拒绝；Google Play 对可添加的卡种相对宽松，因此可以由 Google Play 完成 Android 应用内订阅。</p>
<p>Google Play 在这里相当于中间付款渠道。本次实测没有额外的平台手续费；除 Plus 月费外，新增成本只有办理招行万事达人民币 IC 借记卡时支付的 5 元工本费。</p>
<p>这套流程最关键的不是某一个按钮，而是同时准备好四样东西：</p>
<ol>
<li>能解锁 ChatGPT 的美国网络节点；（联系我新上市的书《<strong>编程启蒙：思维与代码</strong>》➕好评：就<strong>送全球上网一年</strong>，其它平台购买无法赠送一年，只能赠送 1 个月。）</li>
<li>美区 Google Play 和对应的 Google Payments 付款资料；</li>
<li>Google Play 可以接受的 Visa/Mastercard 单标卡；</li>
<li>已安装官方 ChatGPT 应用的 Android 手机。</li>
</ol>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5e/5e92a36b2c4da7e1af580a4e513a93efeb08c42052a0ed8de043c43273a204f6.png" alt="国内银行卡通过 Google Play 订阅 ChatGPT Plus 的付款链路" tabindex="0" loading="lazy"><figcaption>国内银行卡通过 Google Play 订阅 ChatGPT Plus 的付款链路</figcaption></figure>
<p><em>完整链路：国内银行卡 → Google Play → ChatGPT Android 客户端。</em></p>
<p>下面按完整顺序操作。</p>
<h2>一、先准备能正常使用 ChatGPT 的网络环境</h2>
<p>能打开 Google，不代表同一个节点一定能正常使用 ChatGPT。ChatGPT 对 IP 质量的要求通常更严格，所以不要只用“Google 能不能打开”作为判断标准。</p>
<h3>1. 在 Clash Verge 中选择美国节点</h3>
<p>打开 Clash Verge，进入代理节点列表，选择一个美国节点，并确保系统代理已经启用。</p>
<p>之所以优先使用美国节点，是因为后续要创建美区 Google Payments 资料、确认 Google Play 美区内容，网络地区和付款资料地区需要保持一致。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f5/f5cea91a7c90c080968cad7a21b4b432e7571a9f306e5893f88c15dd589b0124.png" alt="Clash Verge 的 AI 服务解锁测试" tabindex="0" loading="lazy"><figcaption>Clash Verge 的 AI 服务解锁测试</figcaption></figure>
<p><em>先确认 ChatGPT Web、ChatGPT iOS、Claude 等服务显示可用；失败时更换美国节点再测。</em></p>
<h3>2. 使用 Clash Verge 的 AI 解锁测试</h3>
<p>Clash Verge 的相关版本或扩展中通常带有 AI 服务解锁测试，可以一键检查 GPT、Claude 等服务是否可用。</p>
<p>运行测试后重点看 ChatGPT/GPT 项：</p>
<ul>
<li>如果显示可用或解锁成功，再继续；</li>
<li>如果显示失败，先更换另一个美国节点；</li>
<li>更换后重新测试，直到 ChatGPT 可以正常打开和登录。</li>
</ul>
<p>这里不要省略测试。后面即使 Google Play 已经变成美区，如果节点不能正常访问 ChatGPT，安装和付款完成后仍然可能无法使用。</p>
<h2>二、注册或登录自己的 ChatGPT 账号</h2>
<p>打开 ChatGPT 官网，点击注册或登录。</p>
<p>常见方式包括：</p>
<ul>
<li>电子邮箱注册；</li>
<li>使用 Google 账号继续；</li>
<li>使用 Apple 账号继续。</li>
</ul>
<p>国内的 163 邮箱可以正常接收验证码，不过更推荐直接用自己长期使用的 Google 账号登录：操作更方便，后面在 Android 客户端中也容易保持账号一致。</p>
<p>这里我最推荐的方法，就是选择【谷歌账号】直接登录！</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b8/b8c635e5aa9e114520329aec584d34c935b64c35abf5ee2d93b4d41afeb21008.png" alt="ChatGPT 登录或注册入口" tabindex="0" loading="lazy"><figcaption>ChatGPT 登录或注册入口</figcaption></figure>
<p><em>可以使用 Google、Apple、手机号或邮箱登录；购买前务必确认最终要获得 Plus 的账号。</em></p>
<p>请牢记当前登录的是哪一个 ChatGPT 账号。Google Play 只负责收款，Plus 权益最终会落在付款时登录的 ChatGPT 账号上。账号选错后，不能靠切换 Google Play 账号把权益自动转过去。</p>
<p>如果还准备使用 Codex，需要单独留意手机号验证：国内手机号无法完成这里的验证，而且以后可能不止验证一次。因此应准备一个自己能长期持有、可反复接收验证码的正规海外手机号，不要依赖一次性接码。这是使用 Codex 的额外准备项，不是 Google Play 购买 Plus 的付款条件。</p>
<p>下一篇文章会写如何在国内，自行配置海外手机卡教程。<strong>欢迎一键三连➕关注！（附带上你的评论哦！评论越多，教程出的越快！）</strong></p>
<h2>三、为什么不直接在 ChatGPT 网页端付款</h2>
<p>ChatGPT 网页端通常提供银行卡和 PayPal 等付款方式，但国内银行卡在这里会遇到发卡地区识别。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c4/c4e5c71addeafc0c21cd83d2d524301b971f6ae0c4acae1bebad947e4ece3df9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>银行卡卡号前六位是 BIN 码。支付系统可以通过 BIN 码识别卡组织、发卡银行和发卡地区。因此：</p>
<ul>
<li>不是把卡面换成 Visa 或 Mastercard 标识就一定能通过；</li>
<li>国内银行发行的 Visa/Mastercard 单标卡，在网页直付时仍可能被识别为国内发卡；</li>
<li>PayPal 背后同样要绑定付款方式，国内卡也可能继续被拦截。（<strong>实测过国内的 Paypal 可以绑定，但是美区的 Paypal 没试过。</strong>）</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/51/519249289e6260d10add12766acb07cc9315d8f2376e404dc89d4a595b5bde7f.png" alt="ChatGPT 网页端付款方式验证失败" tabindex="0" loading="lazy"><figcaption>ChatGPT 网页端付款方式验证失败</figcaption></figure>
<p><em>这里展示的是网页直付失败；后文改走 Google Play，不是说所有国内单标卡都不能订阅。</em></p>
<p>所以本文不走“ChatGPT 网页端直接填国内卡”这条路，而是把 Google Play 作为应用内订阅的付款渠道：</p>
<ol>
<li>先把银行卡添加到 Google 付款中心（也常被简称为 Google Pay 绑卡）；</li>
<li>从 Google Play 安装 ChatGPT；</li>
<li>在 ChatGPT Android 客户端里发起 Plus 订阅；</li>
<li>由 Google Play 向银行卡扣款。</li>
</ol>
<h2>四、创建美区 Google Payments 付款资料</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ef/ef52b44627b68707d3c48eda51e9b818b72c679bcbfc581c955461f406721c2e.png" alt="中国区是看不见 GPT 这类软件的" tabindex="0" loading="lazy"><figcaption>中国区是看不见 GPT 这类软件的</figcaption></figure>
<p>Google Play 和 Apple App Store 类似，也区分国家和地区。不同地区能看到的应用和订阅项目可能不同。要在 Google Play 找到 ChatGPT，先把当前 Google 账号对应的商店环境准备成美区。</p>
<p>决定 Google Play 地区的因素主要有两个：</p>
<ul>
<li>当前 IP 所在地区；</li>
<li>Google Payments 付款资料的国家/地区。</li>
</ul>
<p>美国节点是必要条件，真正起决定作用的是 Google 付款资料。</p>
<h3>1. 打开 Google 付款中心</h3>
<p>在浏览器中登录准备在手机上使用的同一个 Google 账号，然后打开 <a href="https://payments.google.com/" target="_blank" rel="noopener noreferrer">Google 付款中心</a>。</p>
<p>进入：<strong>设置 → 付款资料 / 国家或地区</strong></p>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/7d/7dfdf6fed46f28e0f28f995429b65a8c8771c94055c9919014c0ee38b8f556bd.png" style="zoom:25%;">
<p>如果这个账号从未建立过付款资料，这里可能还是空的；如果已经有其他国家或地区的付款资料，会显示现有资料。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ee/ee35071c7a437e9de4abb2d06d4297eee0ac4d82f453a294c1725b26e3a4ee34.png" alt="Google Play 美区由 IP 和支付资料共同决定" tabindex="0" loading="lazy"><figcaption>Google Play 美区由 IP 和支付资料共同决定</figcaption></figure>
<p><em>美国 IP 是必要条件，Google Payments 付款资料中的国家/地区起决定作用。</em></p>
<h3>2. 新建美国付款资料</h3>
<p>已有付款资料的国家/地区通常不能直接改成另一个国家。点击国家/地区旁边的编辑图标，然后选择：<strong>新建个人资料 / 创建新的付款资料</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a7/a788c6ac7ccac2f741fed97473bdcdee22c7a0350cdd2bdeb204cfd3f9621622.jpg" alt="Google Payments 中新建美国付款资料" tabindex="0" loading="lazy"><figcaption>Google Payments 中新建美国付款资料</figcaption></figure>
<p><em>已有资料的国家/地区不能直接改时，选择“新建个人资料”，国家/地区选美国（US）。</em></p>
<p>在国家或地区下拉菜单中选择：<strong>美国（US）</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/62/629e55c5c35321d6f1d17ecf105b539b1cffc88d873fa7157a58060630b8ddb1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9d/9dedabf7e869957cbc6c6dad0e5892854fe3f5b6ec974451e800003ab2a658b7.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>3. 填写美国联系地址</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/1d/1d46c3330ef62027b901a4fb575659d449458835dc37bc5f523bf81910206fa7.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>接下来填写姓名和美国地址。付款资料名称可以自定义；地址可以借助地址生成工具准备一份美国免税州地址，再把各字段对应复制到表单。需要填写：</p>
<ul>
<li>姓名；</li>
<li>街道门牌；</li>
<li>城市；</li>
<li>州；</li>
<li>ZIP Code；</li>
<li>联系方式（页面要求时填写）。</li>
</ul>
<p>街道、城市、州和 ZIP Code 必须互相对应，不能把不同地址的字段拼在一起。后面绑卡时，账单地址继续使用这一份资料。使用免税州地址的这次付款没有额外收税，但结账页面仍会显示“税费另计”，最终金额以实际订单为准。</p>
<p>填写完成并保存后，在付款中心确认当前已经存在一份国家/地区为美国的付款资料。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ab/ab02adaafff0a3842a0524334ffb8f0b29551094bc0d69be259266af2ef7e302.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ul>
<li>美国地址生成器：<a href="https://www.meiguodizhi.com/" target="_blank" rel="noopener noreferrer">https://www.meiguodizhi.com/</a>，也可以选择 GPT 直接生成一个地址。</li>
<li>美国免税地址：<a href="https://usaddressgen.com/tax-free-address/" target="_blank" rel="noopener noreferrer">https://usaddressgen.com/tax-free-address/</a></li>
</ul>
<h2>五、确认 Google Play 已经切换到美区</h2>
<p>手机保持连接前面测试通过的美国节点，然后打开 Google Play。</p>
<p>依次进入：<strong>右上角头像 → 设置 → 常规 → 账号和设备偏好设置 → 国家和个人资料</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/45/45a853e089ecead2e929cb625fae0686aca4c67ddbdc1c8f8d5d754e3f0d98f8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9e/9e0d0a2735d721582131680c8d5f355852bb7275058d5d42c932154b4711767c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a8/a8f3780fd09dc0dfe870ee1ec4ff3f0d9ca48ebf6f5f26ed75d59154fe8851bf.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c6/c60bcd3d99f76f02f1fcea70e8e3c0acc983fc95bb12d86d0b212baa94702ed3.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/df/dfe6a86e209084ff8c1300836a8b6c0bfbd4f8b4117c64a840e04915fa96bd11.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>如果页面显示“美国”，说明当前 Google Play 已经按美区资料工作。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/57/577cc33f778a42038269eba3d6315f7a6635e0e6918a280f066723e69c5bf1d4.png" alt="Google Play 美区方案示意" tabindex="0" loading="lazy"><figcaption>Google Play 美区方案示意</figcaption></figure>
<p><em>确认美国节点和美国付款资料都已生效，再继续绑卡。</em></p>
<p>如果仍然显示其他地区，依次检查：</p>
<ol>
<li>手机 Google Play 登录的账号，是否就是刚才新建付款资料的账号；</li>
<li>美国节点是否仍然连接；</li>
<li>Google 付款中心是否已经保存美国资料；</li>
<li>完全退出 Google Play 后重新打开，再检查一次。</li>
</ol>
<p>确认商店地区后，再进入下一步绑卡。</p>
<h2>六、先选对银行卡：62 开头银联卡不能直接用</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/db/db8981fcf36b84a4c71ecbf340d78a1ea4f59cf52e48d290939b78cae2c78420.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>进入 Google 付款中心：<strong>支付方式 → 添加支付方式 → 添加信用卡或借记卡</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f8/f88fd95cdcea1c99bf335bd2100fa00487b8e2b4c03c96c9ceb4c674d2485fdb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/91/91875482b07ae3ce59269bb6e1695d9800bc2947af891ca78b1b2ddf2073bdad.jpg" alt="Google Payments 添加信用卡或借记卡" tabindex="0" loading="lazy"><figcaption>Google Payments 添加信用卡或借记卡</figcaption></figure>
<p><em>路径：支付方式 → 添加支付方式 → 添加信用卡或借记卡。</em></p>
<p>这里不能随便拿一张国内银行卡填写，先把三类卡在两个付款渠道中的区别看清楚：</p>
<p>| 卡片类型 | ChatGPT 网页端直付 | 美区 Google Play |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-07-17T19:49:24.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">03-使用 AI 开发一个属于自己的网站</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/03-AI-Blog-build.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/03-AI-Blog-build.html"/>
    <updated>2026-08-16T15:12:00.601Z</updated>
    <summary type="html"><![CDATA[<h2>1. 准备工作</h2>
<h3>1.1 清单🧾</h3>
<ul class="task-list-container">
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 购买域名；</label></p>
<details class="hint-container details"><summary>购买域名</summary>
<p>域名命名并没有绝对的标准，但优秀的域名几乎都遵循以下几个原则。如果按照重要性排序，我建议是：</p>
<h4>1. 简短（最重要）⭐⭐⭐⭐⭐</h4>
<p>越短越好，输入方便，也容易传播。</p>
<p>例如：<code>qq.com</code>、<code>x.com</code>、<code>github.com</code>、<code>taobao.com</code>，而：<code>my-awesome-personal-programming-website.com</code> 太长基本没人愿意输入。</p>
<p><strong>一般建议</strong>：</p>
<ul>
<li>5～12 个字符最佳</li>
<li>不超过 15 个字符</li>
</ul>
<h4>2. 容易记住</h4>
<p><strong>看到一次就能记住</strong>，例如：<code>google.com</code>（自造词）、<code>baidu.com</code>、<code>apple.com</code>、<code>cloudflare.com</code>，而：<code>abc123xyz.com</code>、<code>qweasdzxc.com</code> 基本没有记忆点。</p>
<h4>3. 容易拼写</h4>
<p>别人听一遍就能输入出来，例如：<code>bornforthis.cn</code> 基本没有歧义。</p>
<p>反例：<code>xuanxuanzhizhishi.com</code> 别人很容易拼错。</p>
<p>建议：</p>
<ul>
<li>尽量使用常见英文单词</li>
<li>或者常见缩写</li>
<li>不要使用生僻单词</li>
</ul>
<h4>4. 容易发音</h4>
<p>如果别人能读出来，也更容易传播。</p>
<p>例如：<code>openai.com</code>、<code>vercel.com</code>、<code>notion.so</code> 读起来都比较顺。</p>
<h4>5. 与品牌一致</h4>
<p>域名最好就是品牌。例如：</p>
<ul>
<li>品牌：<strong>AI悦创</strong></li>
<li>对应：<code>aiyc.cn</code>、<code>aiyc.com</code>、<code>aiyuechuang.com</code></li>
</ul>
<p>或者：<code>bornforthis.cn</code> 长期来看品牌价值最高。</p>
<h4>6. 不要使用数字</h4>
<p>除非数字就是品牌。例如：<code>360.cn</code>、<code>58.com</code>、<code>51job.com</code></p>
<p>否则：<code>python888.com</code>、<code>learn520.com</code> 都会降低专业感。</p>
<h4>7. 不要使用连字符（-）</h4>
<p>例如：<code>my-blog.com</code> 别人容易忘记有没有 <code>-</code>。</p>
<p>推荐：<code>myblog.com</code></p>
<h4>8. 尽量避免缩写</h4>
<p>例如：<code>aiyc.com</code> 对于熟悉品牌的人没问题。但是：<code>btf.cn</code> 别人根本不知道什么意思。</p>
<p>除非：<code>IBM</code>、<code>BMW</code>、<code>KFC</code> 这种已经成为品牌。</p>
<h4>9. 选择合适的后缀</h4>
<p>一般推荐顺序：</p>
<table>
<thead>
<tr>
<th>后缀</th>
<th>推荐指数</th>
<th>适用</th>
</tr>
</thead>
<tbody>
<tr>
<td>.com</td>
<td>⭐⭐⭐⭐⭐</td>
<td>国际品牌、商业</td>
</tr>
<tr>
<td>.cn</td>
<td>⭐⭐⭐⭐⭐</td>
<td>国内品牌</td>
</tr>
<tr>
<td>.io</td>
<td>⭐⭐⭐⭐</td>
<td>开发者、AI、SaaS</td>
</tr>
<tr>
<td>.ai</td>
<td>⭐⭐⭐⭐</td>
<td>AI 产品</td>
</tr>
<tr>
<td>.dev</td>
<td>⭐⭐⭐⭐</td>
<td>开发工具</td>
</tr>
<tr>
<td>.app</td>
<td>⭐⭐⭐⭐</td>
<td>App</td>
</tr>
<tr>
<td>.org</td>
<td>⭐⭐⭐</td>
<td>开源、组织</td>
</tr>
<tr>
<td>.net</td>
<td>⭐⭐⭐</td>
<td>网络服务</td>
</tr>
</tbody>
</table>
<p>如果预算允许，建议同时持有：<code>xxx.com</code>、<code>xxx.cn</code></p>
<h4>10. 避免侵权</h4>
<p>例如：<code>openaichina.com</code>、<code>applephone.com</code>、<code>tesla-ai.com</code> 都可能涉及商标风险。</p>
<h4>11. 方便 SEO（现在权重较低）</h4>
<p>以前大家喜欢：<code>best-python-course.com</code>，现在 Google 更看重内容质量，而不是关键词堆砌。</p>
<p>所以更推荐：<code>codemark.com</code>，而不是：<code>best-python-learning-platform.com</code>。</p>
<h4>12. 留出品牌扩展空间</h4>
<p>不要把业务写死。例如：如果现在卖课程：<code>pythoncourse.com</code>，以后做 AI、工具、社区，就显得局限。</p>
<p>而：<code>bornforthis.cn</code>，可以承载：博客、社区、AI、课程、SaaS、开源项目等，扩展性更强。</p>
<h4>13. 一个优秀域名通常满足的标准</h4>
<p>给自己打分（每项 1 分）：</p>
<ul>
<li>✅ 少于 12 个字符</li>
<li>✅ 一次就能记住</li>
<li>✅ 不需要解释怎么拼</li>
<li>✅ 不含 <code>-</code></li>
<li>✅ 不含数字（特殊品牌除外）</li>
<li>✅ 品牌一致</li>
<li>✅ 发音自然</li>
<li>✅ 不侵权</li>
<li>✅ <code>.com</code> 或 <code>.cn</code> 可注册</li>
<li>✅ 五年后仍然适用</li>
</ul>
<p>能达到 <strong>8 分以上</strong>，通常就是一个很不错的域名。</p>
</details>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 安装代理：<a href="https://github.com/clash-verge-rev/clash-verge-rev/releases" target="_blank" rel="noopener noreferrer">https://github.com/clash-verge-rev/clash-verge-rev/releases</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 安装 VScode：<a href="https://code.visualstudio.com/Download" target="_blank" rel="noopener noreferrer">https://code.visualstudio.com/Download</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> Mac 电脑安装 brew：<code>/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code>；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 安装 nodejs：<a href="https://nodejs.org/en/download" target="_blank" rel="noopener noreferrer">https://nodejs.org/en/download</a>、<code>brew install nodejs</code></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 安装 git：<a href="https://git-scm.com/install/" target="_blank" rel="noopener noreferrer">https://git-scm.com/install/</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 注册 github：<a href="https://github.com/" target="_blank" rel="noopener noreferrer">https://github.com/</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 注册 Vercel：<a href="https://vercel.com/" target="_blank" rel="noopener noreferrer">https://vercel.com/</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 安装 snipaste：<a href="https://www.snipaste.com/download.html" target="_blank" rel="noopener noreferrer">https://www.snipaste.com/download.html</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 配置 github ssh：<a href="https://bornforthis.cn/blog/2024/7month/git-ssh.html" target="_blank" rel="noopener noreferrer">https://bornforthis.cn/blog/2024/7month/git-ssh.html</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 安装 Codex：</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> 安装 typora：<a href="https://typora.io/" target="_blank" rel="noopener noreferrer">https://typora.io/</a></label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 设计属于自己的 logo；</label></p>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>1. 准备工作</h2>
<h3>1.1 清单🧾</h3>
<ul class="task-list-container">
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 购买域名；</label></p>
<details class="hint-container details"><summary>购买域名</summary>
<p>域名命名并没有绝对的标准，但优秀的域名几乎都遵循以下几个原则。如果按照重要性排序，我建议是：</p>
<h4>1. 简短（最重要）⭐⭐⭐⭐⭐</h4>
<p>越短越好，输入方便，也容易传播。</p>
<p>例如：<code>qq.com</code>、<code>x.com</code>、<code>github.com</code>、<code>taobao.com</code>，而：<code>my-awesome-personal-programming-website.com</code> 太长基本没人愿意输入。</p>
<p><strong>一般建议</strong>：</p>
<ul>
<li>5～12 个字符最佳</li>
<li>不超过 15 个字符</li>
</ul>
<h4>2. 容易记住</h4>
<p><strong>看到一次就能记住</strong>，例如：<code>google.com</code>（自造词）、<code>baidu.com</code>、<code>apple.com</code>、<code>cloudflare.com</code>，而：<code>abc123xyz.com</code>、<code>qweasdzxc.com</code> 基本没有记忆点。</p>
<h4>3. 容易拼写</h4>
<p>别人听一遍就能输入出来，例如：<code>bornforthis.cn</code> 基本没有歧义。</p>
<p>反例：<code>xuanxuanzhizhishi.com</code> 别人很容易拼错。</p>
<p>建议：</p>
<ul>
<li>尽量使用常见英文单词</li>
<li>或者常见缩写</li>
<li>不要使用生僻单词</li>
</ul>
<h4>4. 容易发音</h4>
<p>如果别人能读出来，也更容易传播。</p>
<p>例如：<code>openai.com</code>、<code>vercel.com</code>、<code>notion.so</code> 读起来都比较顺。</p>
<h4>5. 与品牌一致</h4>
<p>域名最好就是品牌。例如：</p>
<ul>
<li>品牌：<strong>AI悦创</strong></li>
<li>对应：<code>aiyc.cn</code>、<code>aiyc.com</code>、<code>aiyuechuang.com</code></li>
</ul>
<p>或者：<code>bornforthis.cn</code> 长期来看品牌价值最高。</p>
<h4>6. 不要使用数字</h4>
<p>除非数字就是品牌。例如：<code>360.cn</code>、<code>58.com</code>、<code>51job.com</code></p>
<p>否则：<code>python888.com</code>、<code>learn520.com</code> 都会降低专业感。</p>
<h4>7. 不要使用连字符（-）</h4>
<p>例如：<code>my-blog.com</code> 别人容易忘记有没有 <code>-</code>。</p>
<p>推荐：<code>myblog.com</code></p>
<h4>8. 尽量避免缩写</h4>
<p>例如：<code>aiyc.com</code> 对于熟悉品牌的人没问题。但是：<code>btf.cn</code> 别人根本不知道什么意思。</p>
<p>除非：<code>IBM</code>、<code>BMW</code>、<code>KFC</code> 这种已经成为品牌。</p>
<h4>9. 选择合适的后缀</h4>
<p>一般推荐顺序：</p>
<p>| 后缀 | 推荐指数 | 适用             |
|</p>
</details>
</li>
</ul>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-07-16T08:41:48.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">04-量体裁衣：从 Sub-Agents 到 Multi-Agent 的工程指南</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/04-sub-agents-to-multi-agent-engineering-guide.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/04-sub-agents-to-multi-agent-engineering-guide.html"/>
    <updated>2026-08-16T15:12:00.612Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/06/068c1bb853fc8450f6d6d941cd0796cde286d67366de3f1bef5d754fb0e36f1a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>了解子代理的来龙去脉之后，我们这一讲接着深入聊相关的工程实践和设计模式。</p>
<p>正式开讲前，我想先抛出一个很多同学都比较困扰的地方：<strong>为什么我们有时很快就能“看懂”某些新出来的 AI 产品，而对另一些却始终感觉云里雾里？</strong></p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/06/068c1bb853fc8450f6d6d941cd0796cde286d67366de3f1bef5d754fb0e36f1a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>了解子代理的来龙去脉之后，我们这一讲接着深入聊相关的工程实践和设计模式。</p>
<p>正式开讲前，我想先抛出一个很多同学都比较困扰的地方：<strong>为什么我们有时很快就能“看懂”某些新出来的 AI 产品，而对另一些却始终感觉云里雾里？</strong></p>
<p>上周直播时，就有同学提到一个当下讨论度很高的开源项目 OpenClaw（Clawdbot）。在讨论群里，有人一眼就能说清它的核心设计取舍，而初学者却只能停留在“它好像用了 Agent / Tool / Workflow”的层面。</p>
<p>这背后的差别，往往不在于你有没有把源码读完， 而在于你<strong>脑子里有没有一套稳定的“架构式思维框架”</strong>。</p>
<p>当你具备这种整体架构模式的认知时，面对一个陌生但热门的 AI 产品，你不再是从零开始理解，而是会下意识地问几个问题：</p>
<ul>
<li>它解决的核心工程问题是什么？</li>
<li>它选择的是单 Agent，还是某种多 Agent 结构？</li>
<li>它是在用上下文换智能，还是用架构换可控性？</li>
</ul>
<p>今天这一讲，虽然不在课程原有大纲之内，但我非常建议你在后续子代理工程实操之前，先把这一套“架构视角”建立起来。还是那句老话：站得高，看得远。</p>
<p>这节课的目标，并不是教你某一个具体框架、某一个流行用法， 而是帮你建立一种<strong>可以立刻用于拆解当下热门产品，也能长期指导工程设计的通用方法论</strong>。学完今天的内容，你不仅能更好地理解 Sub-Agent、Skills 这些概念， 也会更清楚：<strong>什么时候该用，什么时候不该用，为什么</strong>。</p>
<h2>1. 何时该升级到多 Agent？</h2>
<p>在 AI Agent 的工程实践中，有一个经典的误区——过早引入多 Agent 架构。</p>
<p>LangChain 在其架构选型指南中给出了明确建议：</p>
<blockquote>
<p>“Start with a single agent. Add tools before adding agents. Graduate to multi-agent patterns only when encountering clear architectural limits.” （先从单 Agent 起步，优先通过引入工具扩展能力； 只有当系统确实触及单 Agent 的架构边界时， 才考虑采用多 Agent 的设计模式。）</p>
</blockquote>
<p>这不是保守，而是工程智慧。每增加一个 Agent，你就增加了一层调试复杂度、一份 token 成本、和一个潜在的失败点。但当你的任务真的跨越了单 Agent 的能力边界时，正确的多 Agent 架构会带来巨大性能提升——Anthropic 的多 Agent 研究系统在内部评测中，比单 Agent Claude Opus 4 性能提升了 90.2%。</p>
<p>那么，到底我们应该何时从单 Agent 升级到多 Agent？这需要你先想明白一个前置问题：<strong>你的场景真的需要多 Agent 吗？</strong></p>
<h2>2. 两个核心触发条件</h2>
<p>LangChain 在 <a href="https://www.blog.langchain.com/choosing-the-right-multi-agent-architecture/" target="_blank" rel="noopener noreferrer">Choosing the Right Multi-Agent Architecture</a> 这篇文章中总结了两个让多 Agent 成为必要选择的工程信号。</p>
<h3>2.1 信号一：上下文管理挑战</h3>
<p>当多个能力领域的专业知识无法舒适地塞进单一 prompt 中时——你需要<strong>策略性地分发上下文</strong>，而不是把所有东西堆在一起。当 Agent 的上下文窗口接近满载时，模型在任务完成上的表现会显著下降，进入所谓的  dumb zone（迟钝区）。</p>
<h3>2.2 信号二：分布式开发需求</h3>
<p>当多个团队需要<strong>独立拥有和维护</strong>各自的 Agent 能力时。比如安全团队维护审计 Agent，测试团队维护测试 Agent，各团队可以独立迭代而不互相干扰。</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:#4078F2;--shiki-dark:#61AFEF">单</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Agent</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 的困境：</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">┌─────────────────────────────────────────────────┐</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> System</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Prompt:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                  │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   -</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 你是代码专家（200行指令）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                    │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   -</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 你也是测试专家（150行指令）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                  │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   -</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 你还是安全审计专家（180行指令）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">              │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   -</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 你同时是文档撰写专家（100行指令）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   ...</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                           │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   Token</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 爆炸，模型注意力分散</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                     │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└─────────────────────────────────────────────────┘</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>下面我们从工程视角出发，系统梳理 Sub-Agent 到 Multi-Agent 的四种核心设计模式，并给出<strong>性能、成本、可控性</strong>三个维度的决策框架。</p>
<h2>3. 四种核心设计模式</h2>
<p>综合 LangChain（这是下面 4 种多智能体模式的主要来源）、Anthropic、Google 和 OpenAI 等前沿公司的最佳实践，多 Agent 系统可以归纳为四种核心架构模式。它们不是互斥的——实际项目中经常组合使用。</p>
<h3>3.1 模式一：Sub-Agents（子代理委派 / 集中式编排）</h3>
<p>Sub-Agents 的核心设计思想是一个 Supervisor Agent 充当老板，<strong>将任务分解后委派给专门的 Sub-Agent</strong>。每个 Sub-Agent 解决一个特定的任务。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5f/5f605980b6a135414c62790cc7825173514225a3f19228339e1a0df9bbff8c25.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在 Sub-Agent 架构中，上下文隔离能力非常强，每个 Sub-Agent 都拥有独立的上下文窗口，从根本上避免了信息相互污染。Sub-Agent 本身通常设计为无状态组件，专注于完成被委派的单次任务，而整体对话状态与流程控制则由 Supervisor 统一维护。</p>
<p>这种结构天然支持并行执行，多个 Sub-Agent 可以同时展开工作，从而显著提升复杂任务的吞吐效率。用户并不直接与各个 Sub-Agent 交互，而是始终通过 Supervisor 间接沟通，由其负责任务拆解、结果汇总与最终输出。</p>
<p>在调试和可控性层面，该模式的复杂度处于中等水平，工程上需要重点关注 Supervisor 的委派逻辑与决策路径，以便在出现偏差时能够准确定位问题来源。</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"># Claude Agent SDK 中的 Sub-Agent 定义（概念示例）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">subagent_config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    "name"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "research-agent",</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    "description"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Research specific topics by searching the web. "</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">                   "Use when user asks factual questions requiring "</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">                   "up-to-date information."</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">,</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    "system_prompt"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "You are a research specialist...",</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    "tools"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"WebSearch"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"WebFetch",</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Read"],</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    "model"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "sonnet"</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></div><p>Claude Code 中内置就有很多子代理（Explore、Plan、General-purpose），非常容易实现这种架构。</p>
<p>在 Anthropic 的真实生产系统中，<a href="https://www.anthropic.com/engineering/multi-agent-research-system" target="_blank" rel="noopener noreferrer">Research 功能</a>采用的就是一种典型的 Sub-Agent 架构。</p>
<p>Anthropic 的 Research 功能采用了经典的 Sub-Agent 模式：</p>
<ol>
<li>LeadResearcher（Claude Opus 4）分析查询、制定策略</li>
<li>并行派出  3-5 个 SubAgent（Claude Sonnet 4），各自独立搜索</li>
<li>每个 SubAgent 执行 3+ 个并行工具调用</li>
<li>CitationAgent 处理引用和来源归属</li>
<li>结果汇聚回 LeadResearcher 综合输出</li>
</ol>
<p>工程评测显示，并行化的 Sub-Agent 执行方式可将复杂查询的整体研究时间最多缩短约 90%，但其代价是相较普通对话约 15 倍的 token 消耗；在高价值研究任务中，这一成本换来了高达 90.2% 的整体性能提升。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/0f/0f231178e891ad14717ae0b7b635409afbc1bb36a49d83b83f1d63c836fd3316.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>为了在不同复杂度任务中控制资源消耗，Anthropic 在 Prompt 层引入了明确的“<strong>努力分配规则</strong>（Effort Scaling）”，例如对简单问题仅启用单个 Agent 和有限次数的工具调用，而在复杂研究场景下则调度更多 Sub-Agent 全面并行执行。</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:#4078F2;--shiki-dark:#61AFEF">简单查询：1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 个</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Agent，3-10</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 次工具调用</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">中等研究：3-5</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 个</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> SubAgent，各</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 3+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 次并行工具调用</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">复杂研究：10+</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 个</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> SubAgent，全面并行执行</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>这一架构特别适用于需要并行检索多个信息源、跨多个知识领域协同工作的研究系统，个人助手协调日历、邮件、CRM 等，同时也通过上下文隔离显著降低了信息串扰和泄漏风险。</p>
<p>不过，因为在每次交互中都会引入额外的模型调用和结果回传过程，Sub-Agent 架构会增加一定的延迟和 token 成本，但换来的则是更强的集中控制能力和可预测的工程行为。</p>
<h3>3.2 模式二：Skills（技能 / 渐进式能力加载）</h3>
<p>LangChain 把 Skills 也视为一种多智能体模式。其实此时仍然是单个 Agent（或 SubAgent），但<strong>通过 SKILL.md 文件（或类似配置）实现能力的渐进式加载</strong>。Agent 一开始只知道技能的名称和描述，当判断需要某个技能时，才加载完整的指令。</p>
<p>这是一种“准多 Agent”方案——用更轻量的 prompt 切换替代完整的 Agent 切换。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/06/0683aa99990b700fd5c82531838e2258a19dcb0ddc469ab1aee8fe3269a8215c.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在 Skills 模式下，系统仍然由单一 Agent 负责全部推理与执行，所有技能共享同一个上下文窗口，因此在上下文隔离能力上相对较弱，但换来的好处是对话状态可以自然连续地保留在同一个 Agent 内部，无需额外的状态协调机制。</p>
<p>由于不存在多个 Agent 的并行调度，整体执行过程以顺序方式展开，并行能力相对有限，但在多数交互式场景下已经足够。用户始终与同一个 Agent 直接交互，交互路径最短，体验也最为流畅。</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:#4078F2;--shiki-dark:#61AFEF">.claude/skills/</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">           </span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> deploy/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> SKILL.md</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:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> review-pr/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> SKILL.md</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">          # PR 审查技能的指令</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> database-migration/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> SKILL.md</span><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></div><p>在 Claude Code 的配置中，每个 SKILL.md 包含 YAML frontmatter（元数据）和详细的步骤指令：</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></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-06-22T17:18:41.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">03-分而治之：Sub-Agents 的核心概念与应用价值</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/03-sub-agents-concepts-and-benefits.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/03-sub-agents-concepts-and-benefits.html"/>
    <updated>2026-08-16T15:12:00.752Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/43/4359ea5b533b3e23aff433848ddfe1919ecd6b2e0d33bce7fa2bb202e0771f62.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>欢迎来到 Claude Code 工程化实战的第三讲。从这一讲开始，我们将进入本课程的第一个核心内容——<strong>子代理（Sub-Agents）</strong>。</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/43/4359ea5b533b3e23aff433848ddfe1919ecd6b2e0d33bce7fa2bb202e0771f62.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>欢迎来到 Claude Code 工程化实战的第三讲。从这一讲开始，我们将进入本课程的第一个核心内容——<strong>子代理（Sub-Agents）</strong>。</p>
<h2>1. 为什么要有 Sub-Agents？</h2>
<p>我们先从一个常见场景开启今天的内容。</p>
<p>某天，你让 Claude Code 帮你跑一个测试套件，结果输出了 500 行日志；然后你想让它分析一下代码结构，又输出了 200 行；接着你想让它改一个 bug……这时候，你的对话上下文已经被各种“中间过程”塞满了，真正重要的信息被淹没在茫茫的输出海洋里。</p>
<p>其实，究其根本。如果你觉得 Claude Code 越用越“健忘”，并不是模型退化了，而是你的对话上下文，已经被一次次中间过程<strong>污染</strong>了。</p>
<p>这正是子代理要解决的核心问题。</p>
<p>你或许还会追问——别卖关子，佳哥。到底子代理解决了什么核心问题？更明确的答案是：如何把“高噪声的执行过程”隔离出去，只让真正有价值的结论，留在主对话中。</p>
<p>因为只有子代理，才在系统层面<strong>天然拥有一个独立的上下文窗口</strong>。不是因为它“聪明”，不是因为它“更强”， 而是因为它是 Claude Code 里唯一一个，结构上允许“执行完即丢弃”的东西。</p>
<p>我们再进一步把问题说明清楚：到底什么是“上下文污染”？</p>
<p>在前面的现象里，上下文里充斥着这些内容。</p>
<ul>
<li>跑测试 → 500 行日志。</li>
<li>搜索代码 → 200 行 grep。</li>
<li>分析错误 → 一堆中间推理过程……</li>
</ul>
<p>这些信息有一个共同特征：它们<strong>对“当下执行”是必要的，但对“后续决策”是噪声</strong>。</p>
<p>而 Claude Code 的主对话上下文是线性追加的，不会自动过期，默认“都当成重要记忆”。所以问题不是 Claude 突然不聪明了 ，而是它把临时执行数据，当成了长期决策记忆。 这在工程上，本来就一定会“炸”。</p>
<p>那为什么偏偏是子代理能解决这个问题呢？</p>
<p>重点来了 —— <strong>不是 AI Agent 这个概念能解决问题，而是 Sub-Agent 这种“运行模型”在起作用</strong>。子代理，通过上下文隔离，让专业的 Agent 做专业的事儿，不是为了让 Claude 做得更多， 而是为了让 Claude <strong>记得更少，但记得对</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/48/4889c1fbccc31b143746252b01fbcbb1f54d14dabcffa6adec4be899ddf8aa32.png" alt="专业的 Agents 做专业的事儿" tabindex="0" loading="lazy"><figcaption>专业的 Agents 做专业的事儿</figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a7/a7186f03bff4b6e6a9b2380274bccc12dd21b6e9c0eb23cfc980cea3bf2b773d.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>PS：OpenClaw 链接：<a href="https://github.com/openclaw/openclaw" target="_blank" rel="noopener noreferrer">https://github.com/openclaw/openclaw</a></p>
<p>下面，我们会深入理解子代理的核心概念，明白它为什么是 Claude Code 工程化使用中最重要的能力之一。理解了这些概念，后面几讲的实战项目你才能得心应手。</p>
<h2>2. 什么是子代理？</h2>
<p>我们可以用一句话定义它。子代理相当于一个“专职小助手”，带着自己的规则、工具权限、上下文窗口，去完成某一类任务，然后把“结果摘要”带回来。你可以把它理解成：<strong>把一个大脑拆成多个岗位角色</strong>，每个岗位只做一件事，并且有明确的权限边界。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/32/32586bae572b388929662ef4e7240520c1461284847a03a75f0447903dfc0358.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>图中目录下设置了 3 个专门的子代理，用于处理循环经济知识图谱项目。这三个代理形成了一个完整的工作流：组织 PDF → 提取知识图谱 → 分析结果。</p>
<p>不过这里还有另外一个问题，就是有 Sub-Agent，那肯定要先有主 Agent，Claude Code 的主 Agent 在何处？其实，主 Agent 就是你当前操作的主对话。而主对话 vs 子代理，就是老板和员工的关系。</p>
<p>一家公司的老板（主对话）需要完成一个复杂的项目，有两种工作方式。</p>
<ul>
<li><strong>方式一：事必躬亲</strong>：亲自去调研市场（输出 200 行分析）、亲自写代码（输出 500 行日志）、亲自测试（又是 300 行）、亲自写文档……最后脑子里塞满了各种细节，已经记不清最初的目标是什么了。</li>
<li><strong>方式二：专人专岗</strong>：安排一个市场专员去调研，只需要他给你一份 1 页的报告；安排一个测试工程师去跑测试，只需要他告诉你结果是“通过”还是“有 3 个失败”；安排一个技术文档专员去写文档……每个人带着明确的任务出去，完成后只把<strong>结论</strong>带回来。</li>
</ul>
<p>子代理就是后一种方式。它让主对话保持清洁，不被过程噪声污染。</p>
<h2>3. 子代理的核心价值</h2>
<p>子代理的工程价值，本质上就是三件事：<strong>隔离、约束、复用</strong>，下面我们分别说说。</p>
<p><strong>隔离，解决的是上下文污染问题</strong>——大量对当前执行有用、但对后续决策毫无价值的日志、搜索结果和中间推理，不应该进入主对话的长期记忆；子代理天然拥有独立上下文，执行完即丢弃，只把结论带回来，让 Claude 记得更少、但记得对。</p>
<p>这是子代理最重要的价值，请看下面的示例。</p>
<div class="language-bash line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="bash" style="--vp-collapsed-lines:15;--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:#4078F2;--shiki-dark:#61AFEF">主对话的上下文：</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">┌─────────────────────────────────────────┐</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 用户：帮我分析一下这个</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> bug</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">              │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Claude：好的，让我看看...</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">               │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [子代理去执行，产生 </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">500</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 行日志]</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">         │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [子代理返回：发现 </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 个相关文件]</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">         │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Claude：我发现问题在这三个文件...</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">       │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└─────────────────────────────────────────┘</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">子代理的上下文（独立的，执行完就释放）：</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">┌─────────────────────────────────────────┐</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 任务：查找</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> bug</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 相关文件</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                 │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [搜索输出 </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">500</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 行日志]</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                   │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [分析过程...]                           │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 结论：3</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 个相关文件</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                      │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└─────────────────────────────────────────┘</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><div class="collapsed-lines"></div></div><p>主对话只看到子代理所返回的<strong>结论</strong>，不需要承载 500 行的搜索过程。这意味着你的对话不会因为一次大搜索就把 token 配额用光，重要的讨论内容不会被中间输出淹没，Claude 在后续对话中能更好地“记住”关键信息。</p>
<p><strong>约束，解决的是行为不可控问题</strong>——通过工具权限边界，把“我希望你别这么做”变成“你物理上做不到”，让代码审查只能读、修 bug 才能写，角色职责不再依赖提示词自觉。</p>
<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">tools:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Read,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Grep,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Glob</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>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 开发型子代理（bug 修复）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">tools:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Read,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Write,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Edit,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Bash</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>
<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">tools:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Read,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> WebFetch,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> WebSearch</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></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>比如你让 Claude 帮你审查代码，你只希望它看，不希望它动手改。如果没有权限边界，Claude 可能在审查过程中顺手帮你“修”了一些它认为有问题的代码——这不是你想要的行为。有了子代理，你就可以创建一个  code-reviewer 角色，明确规定它只有  <code>Read, Grep, Glob</code> 权限。这样它再怎么想“插手”，也改不了任何东西。</p>
<p><strong>复用，解决的是经验无法沉淀的问题</strong>——当子代理被定义成文件、放进版本控制后，好的使用方式就从一次性对话，变成了可共享、可迭代的工程资产。</p>
<p>子代理的配置保存在文件中，有这样几个好处。</p>
<ul>
<li><strong>版本控制</strong>：放进 git，团队共享。</li>
<li><strong>跨项目复用</strong>：好用的配置可以复制到其他项目。</li>
<li><strong>渐进优化</strong>：根据实际使用情况不断调整 prompt，持续优化改善。</li>
</ul>
<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:#4078F2;--shiki-dark:#61AFEF">.claude/agents/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> test-runner.md</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:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> code-reviewer.md</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:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> log-analyzer.md</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:#4078F2;--shiki-dark:#61AFEF">└──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> bug-fixer.md</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # Bug 修复专员</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><p>这些配置文件就像公司里的“岗位说明书”，每个岗位职责清晰、权限明确。</p>
<p>这三点，分别对应着三个经典的软件工程命题：<strong>内存管理、安全边界、组织效率</strong>。这三点合在一起，标志着 Claude Code 的使用方式，从“对话技巧”，正式跨入“工程系统”。</p>
<h2>4. 内置子代理：开箱即用的“好员工”</h2>
<p>你可能已经在使用子代理，只是没意识到而已。Claude Code 内置了一系列子代理（以后也许会有更多），当你问 Claude——“给我解释解释这个 Github 代码库”时，在不知不觉间，Claude Code 就会自动调用内置子代理。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/11/117ffd8708a2199794aa53788f0dab587c97838dcfd41b4d71789c031642c7ee.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>下面简单介绍其中的三个。</p>
<h3>4.1 Explore 子代理</h3>
<p><strong>Explore 子代理</strong>负责“翻项目、找位置”，专注快速只读搜索，把成百上千行 grep 和分析过程吞进去，只告诉你结论在哪里。</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:#4078F2;--shiki-dark:#61AFEF">┌─────────────────────────────────────────────────────────┐</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  Explore（探索者）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                       │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├─────────────────────────────────────────────────────────┤</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  特点：快速、只读</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                        │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  用途：搜索和分析代码库</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                  │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  模式：quick</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> medium</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> very</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> thorough</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 三档</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">              │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  工具：Read,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Grep,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Glob（不能写）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                        │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└─────────────────────────────────────────────────────────┘</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>当你问 Claude“这个项目的认证逻辑在哪里”时，它会自动派出 Explore 子代理去搜索，而不是在主对话中一行行地执行 grep 命令。</p>
<h3>4.2 Plan 子代理</h3>
<p><strong>Plan 子代理</strong>负责“动手前先想清楚”，在真正修改代码之前，收集上下文、梳理依赖、生成实施路径，避免一上来就盲目修改。</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:#4078F2;--shiki-dark:#61AFEF">┌─────────────────────────────────────────────────────────┐</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  Plan（规划者）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                          │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├─────────────────────────────────────────────────────────┤</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  特点：规划模式专用</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                      │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  用途：在制定实施计划前收集项目上下文</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                     │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  限制：子代理不能再生成子代理（防止无限嵌套）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">             │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└─────────────────────────────────────────────────────────┘</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>当你让 Claude 进入规划模式时，它会用 Plan 子代理来收集信息，设计实施方案。</p>
<h3>4.3 General-purpose 子代理</h3>
<p><strong>General-purpose 子代理</strong>则是“能探索、能修改、能推进”的全能型员工，适合需要多步骤协作的复杂任务。</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:#4078F2;--shiki-dark:#61AFEF">┌─────────────────────────────────────────────────────────┐</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  General-purpose（通用型）</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                               │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├─────────────────────────────────────────────────────────┤</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  特点：全能型，处理复杂多步骤任务</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                         │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  用途：同时需要探索和修改的任务</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                          │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  工具：完整工具集</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">                                        │</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└─────────────────────────────────────────────────────────┘</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>当任务比较复杂，需要多种能力配合时，就可以使用这个通用型子代理。这些子代理的共同点只有一个：<strong>把高噪声过程留在子代理里，让主对话只保留决策信息</strong>。</p>
<h2>5. 什么时候该用子代理？</h2>
<p>需要提醒你的是，并不是所有任务都值得动用子代理。子代理的价值，不在于“能不能用”，而在于“该不该用”。一个最直观的判断标准是：<strong>主对话到底需不需要承载执行过程本身</strong>。</p>
<p><strong>第一类</strong>非常适合用子代理的，是<strong>高噪声输出的任务</strong>。这类任务的共同特点是：执行过程中会产生大量中间信息，但主对话真正关心的，往往只有一个结论。</p>
<p>例如跑一次测试会输出几百行日志，但你只想知道通过还是失败；扫描日志和错误栈时，真正有价值的可能只是一两条关键错误；在整个代码库里做搜索，最终只需要知道相关文件在哪里；生成一份长报告，主对话只需要摘要。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/85/85c1c32c43631c66289b4f98416814ea593fbc32000a7c6c6a08ae343eae7d94.png" alt="子代理把大量混乱的信息隔离起来，并进行提纯工作" tabindex="0" loading="lazy"><figcaption>子代理把大量混乱的信息隔离起来，并进行提纯工作</figcaption></figure>
<p>这些场景中，执行过程本身就是噪声，用子代理把过程隔离起来，只把结论带回来，是最自然、也最干净的做法。</p>
<p><strong>第二类</strong>适合用子代理的，是<strong>角色边界必须非常明确的任务</strong>。有些事情，你只希望 Claude “看”，而不希望它“动手”；有些操作，只能在特定目录、特定范围内发生；还有一些敏感操作，本身就需要和其他任务隔离开来。</p>
<p>如果没有子代理，这些约束只能靠提示词和使用者的心理预期维持。而一旦通过子代理定义工具权限，边界就从不稳定的“希望如此”，变成了明确的“系统级约束”。没有写权限，就无法修改文件；没有执行权限，就无法运行命令。正因为边界被落实为能力边界，而不是行为约定，子代理才成为解决安全性和可控性问题的可靠手段。</p>
<p><strong>第三类</strong>适合用子代理的，是<strong>可以并行展开的研究型任务</strong>。当你需要同时调研认证逻辑、数据库设计和 API 接口，或者对比几种技术方案、从多个视角分析同一个问题时，这些探索之间往往是相互独立的。与其在主对话里来回切换，不如让多个子代理各自去完成自己的探索，再把结果汇总回来。子代理在这里的价值，不只是隔离上下文，更是天然的并行加速器。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/30f8d5bc566b97f84fc064585fa730d17844df718949c5ff776f110ca7d7d3e1.png" alt="各个子代理的任务可以并行执行" tabindex="0" loading="lazy"><figcaption>各个子代理的任务可以并行执行</figcaption></figure>
<p><strong>第四类</strong>适合用子代理的，是可<strong>以拆成清晰阶段的流水线式任务</strong>。比如先定位代码位置，再做代码审查，然后进行修改，最后跑测试验证。</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:#4078F2;--shiki-dark:#61AFEF">Explore（找位置）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    ↓</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Reviewer（指出问题）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    ↓</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Fixer（修复）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    ↓</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Test-runner（验证）</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>这类任务的关键在于每一个阶段的目标、权限和输出都是明确的。用子代理把每一段责任固定下来，不但让流程更清晰，也让每一步的上下文更加干净。这不是为了复杂化流程，而是为了避免不同阶段的信息互相污染。</p>
<p>当然，也有一些情况并不适合使用子代理。如果任务需要频繁来回确认需求、不断调整方向，那子代理这种“派出去干活再回来汇报”的模式反而会拖慢节奏；如果任务的各个阶段高度耦合，每一步都强依赖上一阶段的详细过程，那强行隔离上下文只会增加认知负担；还有非常简单的小任务，启动子代理本身就有开销，直接在主对话中完成，反而更高效。</p>
<h2>6. 一条关键约束：子代理不能生成子代理</h2>
<p>请注意一条很容易被忽略但影响深远的架构限制——<strong>子代理不能再嵌套调用子代理</strong>。也就是说，你的 code-reviewer 子代理不能在执行过程中再派出一个 security-scanner 子代理。</p>
<p>这意味着什么？</p>
<ol>
<li><strong>所有编排必须由主对话完成</strong>：如果你需要“先审查再修复”，必须由主对话依次调用两个子代理，而不是让第一个子代理去调用第二个；</li>
<li><strong>流水线的“调度中心”只有一个</strong>：就是主对话本身（后续第 6 讲会深入讨论这一点）；</li>
<li><strong>如果需要在子代理内复用知识</strong>：用  skills 字段预加载（而非再嵌套一个子代理），后面配置详解中我们会讲到。</li>
</ol>
<p>理解这条约束，你就不会在设计复杂工作流时走弯路。</p>
<h2>7. 子代理配置文件详解</h2>
<p>好，讲到这里，相信你已经对为什么我们需要子代理有了清晰的理解。下面直接进入实操环节，看看如何创建子代理的配置文件。</p>
<p>首先我们看看子代理的配置文件格式（可以参考我的 Github Repo 中的 03-SubAgents 各个项目中的子代理示例）。</p>
<p>子代理使用  <strong>Markdown + YAML frontmatter</strong> 格式：</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></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-06-08T21:22:20.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">02-过目不忘：Claude Code 记忆系统与 CLAUDE.md</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/02-claude-code-memory-system-claude-md.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/02-claude-code-memory-system-claude-md.html"/>
    <updated>2026-08-16T15:12:00.779Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/35/35db986b0ff6254d8d36908eb11ee00d926e708465ca7a405738be425b89705c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>和 AI 协作，不知道你有没有这样的经历。</p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><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">Claude：好的，这是一个基础的登录接口...（使用 Express + JavaScript）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你：我们项目用的是 Fastify 和 TypeScript</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Claude：好的，让我重新写...</span></span>
<span class="line"></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">Claude：好的，这是一个基础的订单接口...（又用 Express + JavaScript）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你：（崩溃）我们用 Fastify 和 TypeScript！</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></div>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/35/35db986b0ff6254d8d36908eb11ee00d926e708465ca7a405738be425b89705c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>和 AI 协作，不知道你有没有这样的经历。</p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><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">Claude：好的，这是一个基础的登录接口...（使用 Express + JavaScript）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你：我们项目用的是 Fastify 和 TypeScript</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Claude：好的，让我重新写...</span></span>
<span class="line"></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">Claude：好的，这是一个基础的订单接口...（又用 Express + JavaScript）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你：（崩溃）我们用 Fastify 和 TypeScript！</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></div><div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">第一个项目：</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你：帮我根据刚才的讨论做一套循环经济相关PPT，给老板直接看</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Claude：好的，这是一份图文并茂，有技术深度的PPT...</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你（看了PPT）：内容挺好的，调一下格式，16:9 ，加Speaker Notes</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Claude：...</span></span>
<span class="line"></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">你：帮我根据项目进展，做一套知识图谱的PPT，直接用于演示的标准</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">Claude：好的，这是一个份根据你的项目制作的详细知识图谱PPT...</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">你（看了PPT）：16:9 ，加Speaker Notes！</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>我在刚刚开始使用 Claude Code 时，这种情况常见。对于小项目，我多说几次需求，倒也无所谓。但是时间长了，项目逐渐复杂的时候，如果每次新对话，Claude 都让我从零开始，如果它不记得你的项目用什么技术栈、什么代码风格、什么团队规范——那这种“失忆症”让人抓狂。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e5/e56eca2c0039196e4582c19f37398803bf963604a3facdfeaff8522d36e6a195.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>CLAUDE.md 就是治疗这种失忆症的药</strong>。它是一份给 Claude 的“项目入职手册”——Claude 每次开始对话时，都会自动阅读这份手册，了解你的项目背景，明确它在干活时应该遵循的一系列底层规则。</p>
<h2>1. Claude Code 记忆系统的工作原理</h2>
<p>这一讲，我们就来学习 Claude Code 如何对抗“失忆症”，记住必要信息。</p>
<p>当你在项目目录启动 Claude Code 时，发生的“记忆系统初始化”过程如下图所示。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/01/01fa91380cfff3347245165bc9aacd1c461d5739642421263e755d23ff354c44.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这就像你给新员工一份入职手册，他读完之后就知道公司的规矩。不同的是，Claude 每次对话都会重新“入职”——所以这份手册必须简洁有效。</p>
<p>Claude Code 有多种方式获取项目相关知识，它们的区别如下表所示：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bb/bb699b1dd719de43ac8e901d33c687aa23c5a43d4c2480e87d8f8fed93c55a9c.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这里的关键洞察是——<strong>CLAUDE.md 的内容会</strong>每次对话都加载，所以要精简。把“每次都需要”的内容放这里，把“偶尔需要”的内容放到 Skills 或文档里。</p>
<h2>2. Claude Code 的五层记忆架构</h2>
<p>Claude Code 支持五个层级的记忆，就像洋葱一样，从外到内，按层级结构组织——高层级的文件优先加载，为底层文件提供基础：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/65/65c7cc508950bb6e0d5e4d49319f627d7df515b92cd1ea5fe0ad4cfce9bf0df9.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>完整记忆类型表如下。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c0/c06be9851061d5ea812d6305b75813a5ca81714066f864153891229fc48cdb9d.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e6/e6aa1ed96c5a7642c1ab255f9837be8c5af267404c12b141917467eead9295d8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>下面分别对每一个级别给出 <code>CLAUDE.md</code> 的说明和示例。</p>
<h2>3. 企业策略级记忆设定</h2>
<p><strong>企业策略级记忆设定</strong>的作用是组织范围内的指令，由 IT/DevOps 统一管理和部署组织。适合内容是，公司编码标准、安全策略、合规要求以及禁止使用的库或模式。通过配置管理系统（MDM、Group Policy、Ansible 等）部署，确保在所有开发者机器上一致分发。</p>
<p><strong>位置：</strong></p>
<ul>
<li><strong>macOS</strong>: <code>/Library/Application Support/ClaudeCode/CLAUDE.md</code>；</li>
<li><strong>Linux</strong>: <code>/etc/claude-code/CLAUDE.md</code>；</li>
<li><strong>Windows</strong>: <code>C:\Program Files\ClaudeCode\CLAUDE.md</code>；</li>
</ul>
<p><strong>示例：</strong></p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"># 公司开发策略</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 安全要求</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 禁止在代码中硬编码任何密钥或敏感信息</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 所有 API 调用必须使用 HTTPS</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 用户输入必须经过验证和清理</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 合规要求</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 所有日志必须排除 PII（个人身份信息）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 数据库连接必须使用加密传输</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 禁止项</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 禁止使用未经审批的第三方库</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</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>如果你是个人或小团队，可以直接跳过企业级设定这一层，不影响任何使用。</p>
<h2>4. 用户级内容设定</h2>
<p><strong>用户级内容设定</strong>承载的是你的全局偏好，即跨所有项目生效的个人偏好，如个人代码风格，沟通语言设置，通用工作习惯等。比如说我希望所有的 PPT 都是 16:9，黑体字。这种设置就应该放在此处。</p>
<p><strong>位置</strong>：<code>~/.claude/CLAUDE.md</code></p>
<p><strong>示例：</strong></p>
<div class="language-markdown line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="markdown" style="--vp-collapsed-lines:15;--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-markdown"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"># 个人偏好</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 沟通方式</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 使用中文回复</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 代码注释使用英文</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 解释简洁直接，不要过多铺垫</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 通用代码风格</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 缩进使用 2 空格</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 优先使用 async/await</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 变量命名使用 camelCase</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 常量命名使用 UPPER_SNAKE_CASE</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 我的常用工具</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 包管理器: uv</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 编辑器: VS Code</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 终端: zsh</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><div class="collapsed-lines"></div></div><p>用户级记忆会被项目级覆盖。如果你个人喜欢 2 空格缩进，但项目要求 4 空格，那就用 4 空格。</p>
<h2>5. 项目级团队共享规范</h2>
<p>团队共享规范是团队共享的项目知识，<strong>应该提交到 Git</strong>。适合存放的内容包括项目架构和技术栈、团队编码规范、重要的设计决策和常用命令。</p>
<p><strong>位置</strong>：项目根目录的  <code>./CLAUDE.md</code></p>
<p><strong>示例</strong>（一个后端 API 项目）：</p>
<div class="language-markdown line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="markdown" style="--vp-collapsed-lines:15;--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-markdown"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"># 项目：订单服务 API</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 技术栈</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Node.js 20 + TypeScript</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Fastify（Web 框架）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Prisma（ORM）</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> PostgreSQL + Redis</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Zod（数据验证）</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 目录结构</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">src/ </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">├── routes/ # 路由定义 </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">├── controllers/ # 请求处理 </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">├── services/ # 业务逻辑 </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">├── repositories/ # 数据访问 </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">├── schemas/ # Zod schemas </span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">└── types/ # 类型定义</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## API 响应格式</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">```typescript</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">interface</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B"> ApiResponse</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">T</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">> {</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">  success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">boolean</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">  data</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD">?</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">T</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">  error</span><span style="--shiki-light:#383A42;--shiki-dark:#C678DD">?</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">code</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">string</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#E5C07B">string</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:#E06C75">编码规范</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> TypeScript</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> strict</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 模式</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 禁止使用</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> any</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">，</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">使用</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> unknown</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> +</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 类型守卫</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 所有</span><span style="--shiki-light:#986801;--shiki-dark:#E5C07B"> API</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 端点必须有</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> Zod</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> schema</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 验证</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 业务错误使用自定义</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> Error</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 类</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">常用命令</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> pnpm</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> dev</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 启动开发服务器</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> pnpm</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> test</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 运行测试</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> pnpm</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> prisma</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> migrate</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> dev</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> 运行数据库迁移</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 class="collapsed-lines"></div></div><h3>5.1 本地级个人工作空间</h3>
<p>个人工作空间用于记载个人工作笔记，不提交到 Git，适合内容包括本地环境配置、个人调试技巧、当前工作备注，敏感信息（测试账号等）。</p>
<p><strong>位置</strong>：项目根目录的 <code>./CLAUDE.local.md</code></p>
<p>示例如下：</p>
<div class="language-markdown line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="markdown" style="--vp-collapsed-lines:15;--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-markdown"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"># 本地开发笔记</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 我的环境</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 本地 API: http://localhost:3000</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 测试数据库: order_service_dev</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Redis: localhost:6379</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 测试账号</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> admin@test.com / test123</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> user@test.com / test123</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 当前工作</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 正在重构支付模块</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 参考 PR #234 的讨论</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 周五前完成</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## 调试技巧</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 订单状态机日志: LOG_LEVEL=debug pnpm dev</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 查看 Redis 缓存: redis-cli KEYS "order:*"</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 class="collapsed-lines"></div></div><p>这里重点强调一下：记得把  <code>CLAUDE.local.md</code> 加入  <code>.gitignore</code>！</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:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "CLAUDE.local.md"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> >> </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">.gitignore</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>当在项目越来越大，周期越来越长的时候，一个属于自己的本地记忆空间其实还蛮有用的。</p>
<p>我在和 Claude Code 多轮对话之后，Claude 也会自动压缩对话历史。经过一系列提示词之后，我自己也不知道自己进行到哪一步了，想查一下以前的提示词，或者几天前和 Claude Code 的关键讨论，但是无处寻踪了。而拥有一个记忆空间，定期把关键内容更新就能够解决这个问题（自己更新或者让 Claude 帮忙更新关键点都行）。</p>
<h3>5.2 规则目录：分类组织</h3>
<p>最后说一下 rules，这是一个比较高阶的技巧，初学者可以作为知识了解一下，也可以先略过不看。Rules 是按主题组织的规则文件，支持<strong>条件作用域</strong>（也就是视情况来确定是否加载该记忆内容），适合场景包括 <code>CLAUDE.md</code> 变得太长时，不同文件类型需要不同规范时，以及前后端分离的项目。</p>
<p><strong>位置</strong>：<code>.claude/rules/*.md</code></p>
<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:#4078F2;--shiki-dark:#61AFEF">.claude/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> rules/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    ├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> typescript.md</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      # TypeScript 规范</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    ├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> testing.md</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:#4078F2;--shiki-dark:#61AFEF">    ├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> api-design.md</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">      # API 设计规范</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> security.md</span><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></div><p>条件作用域示例：<code>.claude/rules/testing.md</code></p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-05-28T09:36:33.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">《时间会替我们记得》</title>
    <id>https://bornforthis.cn/Books/08-NewBook/01-time-will-remember-for-us.html</id>
    <link href="https://bornforthis.cn/Books/08-NewBook/01-time-will-remember-for-us.html"/>
    <updated>2026-08-16T15:12:00.840Z</updated>
    <summary type="html"><![CDATA[<h2>01｜后来才明白，等一等也没关系</h2>
<p>小时候总觉得，所有事情都必须立刻发生。</p>
<p>想长大，想赚钱，想离开家，想去很远的地方，想证明自己不是那个永远被大人摸着头说“你还小”的孩子。</p>
<p>后来真的长大了，才发现，原来人生里很多重要的东西，都是慢慢来的。</p>
<p>爱是慢慢来的。</p>
<p>理解是慢慢来的。</p>
<p>甚至原谅，也是。</p>
<p>有一年冬天，我在地铁里看见一个老人。</p>
<p>他拎着一袋苹果，很沉，走得很慢。车门快关的时候，他努力往里赶，可还是没赶上。</p>
<p>车门关上的那一瞬间，他没有生气，也没有懊恼。</p>
<p>他只是低头笑了笑，像是在安慰自己。</p>]]></summary>
    <content type="html"><![CDATA[<h2>01｜后来才明白，等一等也没关系</h2>
<p>小时候总觉得，所有事情都必须立刻发生。</p>
<p>想长大，想赚钱，想离开家，想去很远的地方，想证明自己不是那个永远被大人摸着头说“你还小”的孩子。</p>
<p>后来真的长大了，才发现，原来人生里很多重要的东西，都是慢慢来的。</p>
<p>爱是慢慢来的。</p>
<p>理解是慢慢来的。</p>
<p>甚至原谅，也是。</p>
<p>有一年冬天，我在地铁里看见一个老人。</p>
<p>他拎着一袋苹果，很沉，走得很慢。车门快关的时候，他努力往里赶，可还是没赶上。</p>
<p>车门关上的那一瞬间，他没有生气，也没有懊恼。</p>
<p>他只是低头笑了笑，像是在安慰自己。</p>
<p>后来下一班车来了，我又看见了他。</p>
<p>他还是慢慢走着。</p>
<p>那一刻我忽然意识到，人到了某个年纪之后，好像终于会接受一件事：</p>
<p>不是所有事情，都必须赶得上。</p>
<p>年轻的时候，我们总害怕落后。</p>
<p>害怕别人比自己成功。</p>
<p>害怕同龄人已经结婚、生子、买房、创业，而自己还站在人生的路口发呆。</p>
<p>可后来才发现，每个人都有自己的时间。</p>
<p>有些人二十五岁找到方向。</p>
<p>有些人四十岁才学会爱人。</p>
<p>有些人很晚才拥有幸福。</p>
<p>但那不代表他们的人生失败了。</p>
<p>我们只是活在不同的时区里。</p>
<p>所以，如果你现在也正在迷茫。</p>
<p>如果你也总觉得自己落后于别人。</p>
<p>那我想告诉你：</p>
<p>等一等，也没关系。</p>
<p>真正属于你的东西，不会因为晚一点出现，就失去意义。</p>
<h2>02｜妈妈开始用表情包的时候</h2>
<p>我妈第一次给我发“哈哈哈哈”的表情包时，我愣了很久。</p>
<p>因为在我的印象里，她一直是不太会用手机的人。</p>
<p>以前视频通话，她总把镜头对着天花板。</p>
<p>发语音的时候，会先问一句：“现在开始说了吗？”</p>
<p>后来不知道什么时候开始，她忽然学会了收藏表情包。</p>
<p>甚至还会在家庭群里发表情。</p>
<p>有一天晚上，我忙到凌晨。</p>
<p>她给我发了一张“早点睡觉”的卡通图片。</p>
<p>我没有回复。</p>
<p>第二天醒来时，看见她又补了一句：</p>
<p>“是不是又熬夜了？”</p>
<p>那一瞬间，我忽然有点难受。</p>
<p>因为我突然意识到，原来父母也在努力靠近我们的世界。</p>
<p>他们学着用年轻人的方式说话。</p>
<p>学着发红包。</p>
<p>学着网购。</p>
<p>学着在视频里找美颜。</p>
<p>只是为了能和我们多聊几句。</p>
<p>可很多时候，我们却越来越没耐心。</p>
<p>小时候，他们教我们怎么走路。</p>
<p>长大后，我们却嫌他们走得慢。</p>
<p>时间真是奇怪。</p>
<p>它会悄悄交换彼此的位置。</p>
<p>小时候，是他们牵着我们。</p>
<p>后来，轮到我们等等他们了。</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-05-09T15:12:45.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">老婆生日晚餐计划</title>
    <id>https://bornforthis.cn/column/cookdinner/P00-Plan/2026-year/01-wife-birthday.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P00-Plan/2026-year/01-wife-birthday.html"/>
    <updated>2026-08-16T15:12:00.844Z</updated>
    <summary type="html"><![CDATA[<h2>1. 菜单</h2>
<table>
<thead>
<tr>
<th>卤面</th>
<th>水煮鱼片</th>
<th>花螺</th>
<th>菜椒鱿鱼</th>
<th>排骨汤</th>
<th>蛋糕</th>
</tr>
</thead>
</table>
<h2>2. 食材</h2>
<h2>3. 菜谱</h2>
<h3>3.1</h3>
<h3>排骨汤</h3>
<ul>
<li>排骨生姜</li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>1. 菜单</h2>
<p>| 卤面 | 水煮鱼片 | 花螺 | 菜椒鱿鱼 | 排骨汤 | 蛋糕 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-05-07T22:26:59.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">14-小炒牛肉</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/14-%E5%B0%8F%E7%82%92%E7%89%9B%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/14-%E5%B0%8F%E7%82%92%E7%89%9B%E8%82%89.html"/>
    <updated>2026-08-16T15:12:00.846Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>牛里脊</th>
<th>葱姜水（小葱 7g、姜 3g、清水 50g）</th>
<th>大蒜 25g</th>
<th>小米辣</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>野山椒 30g</strong></td>
<td><strong>香菜 70g</strong></td>
<td><strong>盐 1g</strong></td>
<td><strong>鸡精 2g</strong></td>
</tr>
<tr>
<td><strong>白胡椒粉 0.2g</strong></td>
<td><strong>小苏打 1g</strong></td>
<td><strong>老抽 3g</strong></td>
<td><strong>土豆淀粉 7g or 红薯淀粉</strong></td>
</tr>
<tr>
<td><strong>薄皮辣椒 or 菜椒</strong></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 牛里脊               | 葱姜水（小葱 7g、姜 3g、清水 50g） | 大蒜 25g    | 小米辣                      |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-05-06T09:46:24.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">CodeMark 学习系统开发计划</title>
    <id>https://bornforthis.cn/Books/07-CodeMark/01-Coding-Plan.html</id>
    <link href="https://bornforthis.cn/Books/07-CodeMark/01-Coding-Plan.html"/>
    <updated>2026-08-16T15:12:00.847Z</updated>
    <summary type="html"><![CDATA[<h2>1. 开发计划表</h2>
<table>
<thead>
<tr>
<th>序号</th>
<th>Time</th>
<th>Message</th>
<th>完成情况</th>
<th>说明</th>
<th>二级任务</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td></td>
<td>分享代码也可以点击转换到 Python 代码运行</td>
<td>✅</td>
<td>无</td>
<td>无</td>
</tr>
<tr>
<td>02</td>
<td></td>
<td>HTML 代码支持框架运行 (React)</td>
<td>✅</td>
<td>无</td>
<td>无</td>
</tr>
<tr>
<td>03</td>
<td></td>
<td>编写的代码支持缓存</td>
<td>✅</td>
<td>无</td>
<td>无</td>
</tr>
<tr>
<td>04</td>
<td></td>
<td>支持创建多代码文件分享，代码文件内容，打包下载代码</td>
<td>✅</td>
<td>打包下载未实现</td>
<td>✅</td>
</tr>
<tr>
<td>05</td>
<td></td>
<td>代码自动保存，自动保存仅限每个 IP 同一个文件，采用时间</td>
<td>➖</td>
<td>考虑中，使用缓存即可</td>
<td>✅</td>
</tr>
<tr>
<td>06</td>
<td></td>
<td>双击重命名</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>07</td>
<td></td>
<td>文件的删除功能，文件夹的折叠功能</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>08</td>
<td></td>
<td>纯净的代码分享页面，后台页面期可保留一个</td>
<td>➖</td>
<td>考虑，但是不一定需要</td>
<td></td>
</tr>
<tr>
<td>09</td>
<td></td>
<td>双模式，一半显示 HTML 源码，另一半实际渲染</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>10</td>
<td></td>
<td>文件和文件之间需要直接代码引用渲染，就是可以实现本地路径相对调用</td>
<td>✅</td>
<td>不知道有没有意料之外的 bug</td>
<td></td>
</tr>
<tr>
<td>11</td>
<td></td>
<td>折叠之后，logo的位置保持原有的位置，不要再靠左了</td>
<td>✅</td>
<td>细节需要改进，折叠后位置有变动，不够丝滑</td>
<td>✅</td>
</tr>
<tr>
<td>12</td>
<td></td>
<td>新建 HTML 时，默认是源码编辑</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>13</td>
<td></td>
<td>切换文件时，如果是 Web 类型，有预览功能的，要启用自动刷新，不然显示不出来</td>
<td>✅</td>
<td>有可能存在潜在 bug，后面看实际情况，以及把对应的资源本地存储调用。</td>
<td></td>
</tr>
<tr>
<td>14</td>
<td></td>
<td>图片、视频类显示的窗口大小需要适配，音频、视频、图片需要可以直接选择播放，不自动播放。</td>
<td>✅</td>
<td>非登录者，不能下载、播放！</td>
<td></td>
</tr>
<tr>
<td>15</td>
<td></td>
<td>支持选中特定文件、文件夹打包下载</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>16</td>
<td></td>
<td>上传文件夹不要 alert()、prompt()、confirm() 形式弹出确认</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>17</td>
<td></td>
<td>显示上传进度</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>18</td>
<td></td>
<td>upload 的 icon 错误，显示的图标错</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>19</td>
<td></td>
<td>增加打包下载功能，仅限用户登录使用</td>
<td>✅</td>
<td>功能未做登录用户限制，后期增加</td>
<td></td>
</tr>
<tr>
<td>20</td>
<td></td>
<td>未登录的不能打包下载，只能单文件下载。</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>21</td>
<td></td>
<td>增加单文件、文件夹右键下载选项</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>22</td>
<td></td>
<td>支持 Command + 鼠标多选、shift 多选操作<br>sharecode.html 需要支持 Command + 鼠标多选、shift 多选操作，然后选择打包下载或者删除操作</td>
<td>➖</td>
<td>感觉实现的效果怪怪的，后期看情况实现</td>
<td></td>
</tr>
<tr>
<td>23</td>
<td></td>
<td>登录账号后可以激活分组功能</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>24</td>
<td></td>
<td>点击特定代码行的序号，会高亮特定代码行，分享时保留选中的高亮代码行<br>切换文件后，高亮应该继续保持，而不是消失！</td>
<td>✅</td>
<td>支持 shift 快捷键选择连续多行</td>
<td></td>
</tr>
<tr>
<td>25</td>
<td></td>
<td>添加一个停止运行的按钮在输出终端中</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>26</td>
<td></td>
<td>注册采用邀请注册制、邮箱验证码验证（邀请码管理后台生成，且只能使用一次）</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>27</td>
<td></td>
<td>拆分代码，现在代码包含了各种功能的样式、js 如果拆分开，是否方便后期迭代和维护？<br>页面 <a href="/Books/07-CodeMark/templates/sharecode.html" target="_blank">sharecode.html</a> 进行拆分代码，现在代码包含了各种功能的样式、js 如果拆分开，进行各种功能、样式拆成独立文件，保证功能、样式不被影响！无法拆出的，就直接保留。注意：现有的功能、样式不要影响！</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>28</td>
<td></td>
<td>每个文件夹、文件支持鼠标右键单独生成分享</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>29</td>
<td>2026-04-30 20:15:10</td>
<td>选择多个、删除功能</td>
<td>✅</td>
<td>目前未发现 bug</td>
<td></td>
</tr>
<tr>
<td>30</td>
<td></td>
<td>Python 项目直接支持相互调用</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>31</td>
<td></td>
<td>设置分享有效期，可选密码设置</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>32</td>
<td></td>
<td>全屏锁定功能、仅限用户登录且是 VIP，类似实现静态网站部署。（隐藏侧边栏、底部按钮栏）</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>33</td>
<td></td>
<td>鼠标右键支持复制文件、文件夹的路径</td>
<td>✅</td>
<td>目前未发现 bug</td>
<td></td>
</tr>
<tr>
<td>34</td>
<td></td>
<td>预览模式启用时，需要有刷新按钮进加载，因为发现有时候显示不出来</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>35</td>
<td></td>
<td>只有登录账号才可以上传图片、视频 &gt; 500kb</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>36</td>
<td>2026-04-30 16:01:06</td>
<td>添加一个答疑页面，或者是公告板块交流</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>37</td>
<td>2026-05-10 22:16:05</td>
<td>添加购书福利相关</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>38</td>
<td>2026-05-10 22:16:05</td>
<td>支持选中特定文件、文件夹删除</td>
<td>✅</td>
<td></td>
<td></td>
</tr>
<tr>
<td>39</td>
<td></td>
<td>书籍的论坛</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>40</td>
<td></td>
<td>添加更多的代码语言渲染支持、增加更多语言高亮和选项</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>41</td>
<td></td>
<td>VIP 和非 VIP 的权限可以在后台进行自主修改</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>42</td>
<td></td>
<td>Markdown分享预览功能、大纲功能、元数据功能等、支持 Vuepress 显示功能、左右内容实时对齐。</td>
<td>✅</td>
<td>支持 Vuepress 显示功能、左右内容实时对齐（这两个需要进一步研究）</td>
<td></td>
</tr>
<tr>
<td>43</td>
<td></td>
<td>分享预览功能，右侧空白并且没有出现二维码</td>
<td>✅</td>
<td>生成速度需要改进</td>
<td></td>
</tr>
<tr>
<td>44</td>
<td></td>
<td>把用户上传的视频、图片进行压缩，上传的是原图、原视频，但是显示永远是压缩后的，不允许下载原图、原视频</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>45</td>
<td></td>
<td>添加二维码生成器</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>46</td>
<td></td>
<td>限制每个用户账号设置最大限制存储数据，用户开通 VIP，用户删除数据，是假删除。</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>47</td>
<td></td>
<td>添加反馈提交页面（弹窗），便于用户进行页面问题、想法、建议等进行反馈。支持邮件通知处理情况。</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>48</td>
<td></td>
<td>提供专门的 API 接口，便于 Python、AI 进行访问数据，配套文档说明</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>49</td>
<td></td>
<td>内容实时渲染，不够好</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>50</td>
<td></td>
<td>Python 代码允许页面，不默认导入第三方库，用户自行选择所需要的第三方库</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>51</td>
<td></td>
<td>增加 C++ 运行能力</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>52</td>
<td></td>
<td>侧边栏隐藏能力</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>53</td>
<td></td>
<td>链接还需要生成支持 AI 的 API 接口，也便于 AI 使用写入数据</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>54</td>
<td></td>
<td>上传的时候，在窗口中选择不上传的文件夹或者文件</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>55</td>
<td></td>
<td>每行代码都可以进行标注，就是编写批注</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>56</td>
<td>2026 年 6 月 7 日</td>
<td>是否要更换成 Django？</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>57</td>
<td></td>
<td>移动端需要找时间思考和改进，是否重构或者重新设计开发</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>58</td>
<td></td>
<td>Markdown预览代码支持复制</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>59</td>
<td></td>
<td>后台有图片页面，便于我直接看看有什么图片</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>60</td>
<td></td>
<td>Python、C++出题、判题系统</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>61</td>
<td></td>
<td>时间复杂度生成</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>62</td>
<td></td>
<td>更好的 Python 代码提示、选择性安装第三方库（C++ 一样）</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>64</td>
<td></td>
<td>支持导入 github 代码，直接运行</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 开发计划表</h2>
<p>| 序号 | Time                | Message                                                      | 完成情况 | 说明                                                         | 二级任务 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-28T22:09:55.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">13-豆芽鸡蛋炒粉条</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/13-%E9%B8%A1%E8%9B%8B%E8%B1%86%E8%8A%BD%E7%B2%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/13-%E9%B8%A1%E8%9B%8B%E8%B1%86%E8%8A%BD%E7%B2%89.html"/>
    <updated>2026-08-16T15:12:00.850Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>豆芽</th>
<th>鸡蛋</th>
<th>韭菜</th>
</tr>
</thead>
</table>
<h2>2. 步骤</h2>
<ol>
<li><strong>粉条</strong>：热水泡着；</li>
<li><strong>鸡蛋</strong>：煎至块状；</li>
<li><strong>韭菜</strong>：切段；</li>
<li><strong>炒制</strong>：
<ol>
<li>锅热，下入豆芽；</li>
<li>炒出香味后，下入：韭菜；</li>
<li>翻炒均匀；</li>
<li>下入：鸡蛋、粉条；</li>
</ol>
</li>
<li><strong>调味</strong>：
<ol>
<li>盐；</li>
<li>生抽；</li>
<li>老抽；</li>
</ol>
</li>
<li><strong>出锅</strong>；</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 豆芽 | 鸡蛋 | 韭菜 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-28T10:00:43.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">11-菜椒土豆炒肉</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/01-%E7%BA%A2%E7%83%A7%E7%B1%BB/11-%E8%8F%9C%E6%A4%92%E5%9C%9F%E8%B1%86%E4%BA%94%E8%8A%B1%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/01-%E7%BA%A2%E7%83%A7%E7%B1%BB/11-%E8%8F%9C%E6%A4%92%E5%9C%9F%E8%B1%86%E4%BA%94%E8%8A%B1%E8%82%89.html"/>
    <updated>2026-08-16T15:12:00.851Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>菜椒 200g</th>
<th>土豆 500g</th>
<th>五花肉 200g</th>
<th>大蒜 15g</th>
<th>姜 5g</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>干辣椒（可选）</strong></td>
<td><strong>十三香 0.3g</strong></td>
<td><strong>生抽 20g</strong></td>
<td><strong>白糖 4g</strong></td>
<td><strong>蚝油 20g</strong></td>
</tr>
<tr>
<td><strong>老抽 5g</strong></td>
<td><strong>鸡精 3g</strong></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 菜椒 200g          | 土豆 500g       | 五花肉 200g  | 大蒜 15g    | 姜 5g        |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-25T15:26:27.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">13-香菇肉丝</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/13-%E9%A6%99%E8%8F%87%E8%82%89%E4%B8%9D.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/13-%E9%A6%99%E8%8F%87%E8%82%89%E4%B8%9D.html"/>
    <updated>2026-08-16T15:12:00.852Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-24T15:17:07.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">13-肉沫茄子</title>
    <id>https://bornforthis.cn/column/cookdinner/P02-%E5%87%89%E8%8F%9C%E5%B0%8F%E7%82%92/13-%E8%82%89%E6%B2%AB%E8%8C%84%E5%AD%90.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P02-%E5%87%89%E8%8F%9C%E5%B0%8F%E7%82%92/13-%E8%82%89%E6%B2%AB%E8%8C%84%E5%AD%90.html"/>
    <updated>2026-08-16T15:12:00.852Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-23T10:50:44.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">20-馄饨</title>
    <id>https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/20-%E9%A6%84%E9%A5%A8.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/20-%E9%A6%84%E9%A5%A8.html"/>
    <updated>2026-08-16T15:12:00.855Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>馄饨皮</th>
<th>五花肉 200g</th>
<th>盐 1g</th>
<th>生抽 5g</th>
<th>白糖 2g</th>
<th>白胡椒粉 0.5g</th>
<th>味精 2g</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>鸡精 1g</strong></td>
<td><strong>虾 100g</strong></td>
<td><strong>味精 1g</strong></td>
<td><strong>芝麻香油</strong></td>
<td><strong>紫菜</strong></td>
<td><strong>虾米</strong></td>
<td><strong>香菜</strong></td>
</tr>
<tr>
<td><strong>香葱</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 馄饨皮      | 五花肉 200g | 盐 1g       | 生抽 5g      | 白糖 2g  | 白胡椒粉 0.5g | 味精 2g  |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-19T14:46:02.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">13-萝卜排骨汤</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/02-%E7%82%96%E7%85%AE%E7%B1%BB/13-%E8%90%9D%E5%8D%9C%E6%8E%92%E9%AA%A8%E6%B1%A4.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/02-%E7%82%96%E7%85%AE%E7%B1%BB/13-%E8%90%9D%E5%8D%9C%E6%8E%92%E9%AA%A8%E6%B1%A4.html"/>
    <updated>2026-08-16T15:12:00.856Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>排骨</th>
<th>白萝卜</th>
<th>白胡椒粉（可选）</th>
<th>生姜</th>
<th>干贝</th>
</tr>
</thead>
</table>
<h2>2. 步骤</h2>
<ol>
<li><strong>干贝</strong>：泡水（选择温水最好），泡干贝的水可以沉淀加入汤中炖煮；</li>
<li><strong>排骨</strong>：
<ol>
<li>方法一：泡水；</li>
<li>方法二：冷水下锅，进行焯水，用热水清洗；</li>
</ol>
</li>
<li><strong>白萝卜</strong>：去皮、切块、焯水 20 分钟；</li>
<li><strong>炖煮</strong>：（泡水则冷水，焯水则热水）
<ol>
<li>水；</li>
<li>白萝卜；</li>
<li>排骨；</li>
<li>干贝；</li>
<li>生姜；</li>
</ol>
</li>
<li><strong>出锅</strong>：加盐、白胡椒；</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 排骨 | 白萝卜 | 白胡椒粉（可选） | 生姜 | 干贝 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-17T11:24:47.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">04-干炒牛河</title>
    <id>https://bornforthis.cn/column/cookdinner/P12-%E7%89%9B%E8%82%89%E7%B1%BB/04-%E5%B9%B2%E7%82%92%E7%89%9B%E6%B2%B3.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P12-%E7%89%9B%E8%82%89%E7%B1%BB/04-%E5%B9%B2%E7%82%92%E7%89%9B%E6%B2%B3.html"/>
    <updated>2026-08-16T15:12:00.857Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>河粉</th>
<th>牛肉</th>
<th>豆芽</th>
<th>小葱</th>
<th>韭菜/韭黄</th>
<th>洋葱</th>
<th>小苏打</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>黑胡椒粉</strong></td>
<td><strong>白糖</strong></td>
<td><strong>生抽</strong></td>
<td><strong>玉米淀粉</strong></td>
<td><strong>食用油</strong></td>
<td><strong>生抽</strong></td>
<td><strong>老抽</strong></td>
</tr>
<tr>
<td><strong>蚝油</strong></td>
<td><strong>白糖</strong></td>
<td><strong>味精</strong></td>
<td><strong>鸡精</strong></td>
<td><strong>火腿肠（可选）</strong></td>
<td><strong>上海青（可选）</strong></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 河粉         | 牛肉     | 豆芽     | 小葱         | 韭菜/韭黄          | 洋葱               | 小苏打   |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-16T10:35:12.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-厦门演讲｜AI 浪潮下，我们应该如何应对与学习 &amp; 新书发售会</title>
    <id>https://bornforthis.cn/Books/06-publishing-and-speaking/01-xiamen-institute-of-technology-guide.html</id>
    <link href="https://bornforthis.cn/Books/06-publishing-and-speaking/01-xiamen-institute-of-technology-guide.html"/>
    <updated>2026-08-16T15:12:00.859Z</updated>
    <summary type="html"><![CDATA[<div style="text-align:center">
<h3>理念➕卖书</h3>
</div>
<p>你好，我是悦创。</p>
<p>坐在下面这个位置，和站在我这个位置，还真不一样。</p>
<p>我一直在想，我应该跟正值年轻的我们讲些什么，讲一些你们爱听且听的下去的内容。说实话，真难想。</p>
<p>我把我的“困境”发给 ChatGPT，GPT 也回答：说实话，真难想。</p>
<p>咱们不走形式，不是说过来随便讲讲，就办了一场活动，浪费人力物力。而是希望在做的所有人，包括老师们。都可以得到不同的思维，互相交流碰撞。（我来抛个砖，引出在坐的玉。）</p>
<p>还得多换灯片，真是头大！</p>]]></summary>
    <content type="html"><![CDATA[<div style="text-align:center">
<h3>理念➕卖书</h3>
</div>
<p>你好，我是悦创。</p>
<p>坐在下面这个位置，和站在我这个位置，还真不一样。</p>
<p>我一直在想，我应该跟正值年轻的我们讲些什么，讲一些你们爱听且听的下去的内容。说实话，真难想。</p>
<p>我把我的“困境”发给 ChatGPT，GPT 也回答：说实话，真难想。</p>
<p>咱们不走形式，不是说过来随便讲讲，就办了一场活动，浪费人力物力。而是希望在做的所有人，包括老师们。都可以得到不同的思维，互相交流碰撞。（我来抛个砖，引出在坐的玉。）</p>
<p>还得多换灯片，真是头大！</p>
<p>当地一坐在这，手机就会拿起来，但是我希望你可以从一开始就认真听讲，这不是一堂课。而是一场与未来的思维碰撞！</p>
<p>别人找我上课要报名，别人找我聊天也要交钱。而你们现在有这样的一个机会，不用交钱，直接就可以和我沟通。我的目的很简单，推广我的书，你的目的也很简单，可以得到一些。有价值的信息。</p>
<h2>1. AI</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/49/491af57b468554f4deef65799b891b2ce37d168cc7b552d768d1d853ce09c827.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-04-02T08:44:16.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">智牛 API 邀请测评</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/13-niuapi-test.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/13-niuapi-test.html"/>
    <updated>2026-08-16T15:12:00.860Z</updated>
    <summary type="html"><![CDATA[<h2>1. 基础调用测评</h2>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> openai </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> OpenAI</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">client </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> OpenAI</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">api_key</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"YOUR_OPENAI_API_KEY"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">base_url</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://niuapi.vip/v1"</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">completion </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> client.chat.completions.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">create</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">    model</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"gpt-4o-mini"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">    messages</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#50A14F;--shiki-dark:#98C379">"role"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"system"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"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">        {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"role"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"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">    ]</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:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(completion.choices[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">].message.content)</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>]]></summary>
    <content type="html"><![CDATA[<h2>1. 基础调用测评</h2>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">from</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> openai </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> OpenAI</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">client </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> OpenAI</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">api_key</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"YOUR_OPENAI_API_KEY"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">base_url</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"https://niuapi.vip/v1"</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">completion </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> client.chat.completions.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">create</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">    model</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"gpt-4o-mini"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">    messages</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#50A14F;--shiki-dark:#98C379">"role"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"system"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"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">        {</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"role"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"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">    ]</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:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(completion.choices[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">].message.content)</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>整体感觉还行，有可能有些模型会与实际“不符”。不过这个有待考究，仁者见仁·智者见智。</p>
<p>不过如果可以真便宜、聪明，那确实可以尝试。</p>
<p>接下来，测试一下对于龙虾是否可用。</p>
<h2>2. 测试龙虾效果</h2>
<h3>2.1 配置龙虾</h3>
<p>官方有自动生成的途径，有想要体验的可以自己去生成试一试。</p>
<p>官方有邀请注册：<a href="https://niuapi.vip/register?aff=UmVz" target="_blank" rel="noopener noreferrer">https://niuapi.vip/register?aff=UmVz</a> 欢迎点击我的邀请链接注册体验。</p>
<h3>2.2 测试效果</h3>
<ol>
<li>发送屏幕截屏：</li>
<li>把摄像头发送给我；</li>
<li>整理飞书文档；</li>
<li>操作飞书文档；</li>
<li>学习 Skills；</li>
</ol>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-29T12:10:22.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-花螺蘸酱</title>
    <id>https://bornforthis.cn/column/cookdinner/P14-%E8%98%B8%E9%85%B1%E7%B1%BB/01-%E8%8A%B1%E8%9E%BA%E8%98%B8%E9%85%B1.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P14-%E8%98%B8%E9%85%B1%E7%B1%BB/01-%E8%8A%B1%E8%9E%BA%E8%98%B8%E9%85%B1.html"/>
    <updated>2026-08-16T15:12:00.861Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>小香葱末</th>
<th>小米辣</th>
<th>蒜末</th>
<th>生抽</th>
<th>醋</th>
<th>白糖</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>香油</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2>2. 步骤</h2>
<ol>
<li><strong>配料</strong>：香葱末、小米辣、蒜末；</li>
<li><strong>调味</strong>：
<ol>
<li>两勺生抽；</li>
<li>一勺醋；</li>
<li>一点点白糖；</li>
<li>一勺香油；</li>
<li>搅匀；</li>
</ol>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 小香葱末 | 小米辣 | 蒜末 | 生抽 | 醋   | 白糖 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-29T09:06:38.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">为什么龙虾不成熟仍要先用起来？</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/12-why-use-lobster-before-it-is-mature.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/12-why-use-lobster-before-it-is-mature.html"/>
    <updated>2026-08-16T15:12:00.862Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/60/60528c4b28e374e428b7813f8c10548e514078e071b34c329f9ee88b5729dce1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/fe/fe38a135af6635774f5067ee397a8011bf60153282c58d97b056bf3257d278da.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/60/60528c4b28e374e428b7813f8c10548e514078e071b34c329f9ee88b5729dce1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/fe/fe38a135af6635774f5067ee397a8011bf60153282c58d97b056bf3257d278da.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>选择更适合你的一句：</p>
<div style="text-align:center">
<h3>历史上所有被嘲笑的技术，后来都在重写世界。</h3>
<h3>普通人用当前体验判断技术，高手用发展曲线判断未来。</h3>
</div>
<h2>1. OpenClaw：它根本不是一个“产品”</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a5/a543178930c475047d1f703fd5b16720d95db1a28ac1eccc544bab9bf43c60fe.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>今天我想讲一件很重要的事：<strong>为什么尽管AI技术（我常用“龙虾”来比喻它）还远远不成熟，我们依然要主动去使用它？</strong></p>
<p>先把话说清楚：以 OpenClaw 为代表的这一类 AI 工具，本质上根本不是一个“产品”。它不是微信、不是飞书，不是一个下载下来就能直接上手、体验流畅的东西。它更像是一个“半成品”，甚至可以说是一个“broken product”——一个处在不断崩坏、不断修复中的工具。</p>
<blockquote>
<p>换句话说：broken product——一个随时会坏、需要你自己动手修的工具</p>
</blockquote>
<p>它是开源的，没有成熟的商业化路径，也没有完善的用户体验。你会看到各种问题：配置复杂、依赖繁琐、模型对接困难，甚至很多人折腾一整天都跑不起来。好不容易跑起来了，还可能随时崩掉。你要接飞书、接微信，要配 API，要处理各种奇怪的报错。</p>
<p><strong>如果你站在一个“普通用户”的视角，这种东西几乎是不可接受的。</strong></p>
<h2>2. 一个关键问题：技术必须“成熟”才能用吗？</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/10/1022adcf56952fff003eee110e580881586b7ca037564fb9cbccb38e5e33d56d.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>但问题就在这里——<strong>我们是不是只能在“成熟之后”才去使用一项技术？</strong></p>
<p>很多人默认的逻辑是：等它稳定、等它好用、等别人都验证过，我再用。</p>
<p>但历史从来不是这样运作的。</p>
<p>我在之前的文章中，写了一句随笔：</p>
<div class="hint-container tip">
<p class="hint-container-title">入局过早？（随笔写下，语序待改进）日期：2026-03-11 08:24:21</p>
<p>越早入局，在这件还未成熟、复杂、完善的情况下，小白进入会更轻松一些。因为涉及的内容没有太多，而越到后期就会越难加入。但这也只是一个方面之一，有可能有些新技术。到后期，小白入门也很轻松。但那时候你也失去了一些，早期市场开拓的机遇！如同，早期父辈赚钱就有很多机遇，现在是方便、富裕了，但是诸多机遇没了。</p>
</div>
<h2>3. 火车的隐喻：一个真实发生过的故事</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/21/21515a19b7180f849243db50bb2fa5edb613c96c55127e266ee0bb51a028d473.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">懒人版</p>
<p>当年火车刚刚出现的时候，它同样非常不成熟。它笨重、噪音大、速度慢，甚至在早期阶段，还没有马跑得快。你可以想象那个画面：有人骑着马，从火车旁边经过，一边超过火车，一边嘲笑坐在车上的人——你费这么大劲铺轨道，搞这么复杂的系统，结果还不如我一匹马。</p>
<p>如果你站在那个时代，这种嘲笑是“有道理的”。</p>
<p>但真正关键的不是当下的速度，而是<strong>趋势的方向</strong>。</p>
</div>
<blockquote>
<p>看起来“更差”，但方向更对！</p>
</blockquote>
<p>这不是一个随便举的比喻，它其实是一个真实发生过的历史。</p>
<p>1825 年，英国开通了世界上第一条公共铁路——斯托克顿到达灵顿铁路（Stockton–Darlington Railway），由工程师乔治·史蒂芬森推动。当时的蒸汽火车，速度大概只有每小时 20 公里左右，而且极其不稳定，噪音巨大，黑烟滚滚。</p>
<p><strong>在那个时代，大多数人其实并不看好火车。</strong></p>
<p>很多人更愿意相信<strong>马车</strong>，因为马车已经被验证了几百年：稳定、可控、灵活。而火车呢？需要铺设昂贵的轨道，路线固定，一旦出问题就全部停摆。</p>
<p>甚至在早期的铁路旁边，真的出现过一种场景：骑马的人沿着轨道并行奔跑，轻松超过火车，然后嘲笑这些坐在车厢里的人——“<strong>你们花这么大代价，结果还没我一匹马快</strong>。”</p>
<p>如果你站在那个时间点，这种判断并不荒谬。</p>
<p>因为从“<strong>当下效率</strong>”来看，火车确实不如马。</p>
<p>但问题在于：<strong>火车不是为“现在”设计的，而是为“未来”设计的。</strong></p>
<p>一旦蒸汽机改进，一旦轨道铺设规模化，一旦运输需求上升，火车的速度、载重能力和效率，会呈指数级提升。</p>
<p>而马车，无论怎么优化，都只能在原有体系内做线性改进。</p>
<p>所以真正关键的，从来不是“<strong>现在谁更好</strong>”，而是——<strong>谁代表未来的方向</strong>。</p>
<p><strong>历史上几乎所有颠覆性的技术，在早期看起来都更差。</strong></p>
<h2>4. 为什么必须“先坐上火车”？</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/12/12eb22079cf8188a25fb225da67ad842c5ccb96710964c97029e26748dca79df.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我一直有一个很明确的判断：当火车出现的那一刻，我希望我自己、以及我身边的人，是那个坐在火车上的人，而不是那个站在轨道旁边评判它的人。哪怕它慢、哪怕它贵、哪怕它不稳定。</p>
<p>因为只要你真正坐上去，你会立刻意识到一件事：<strong>火车一定会超过马车，而且一旦超过，就再也追不上。</strong></p>
<p>这不是一个线性的改进，而是一个范式的切换。</p>
<h2>5. 使用 OpenClaw 的真正价值：不是赚钱，是认知升级</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/85/85233374af6407757e2cf75f568433f0f5d7bfbc36f79dddaae401379002ca95.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>同样的逻辑，放在今天的 OpenClaw，放在“龙虾”这个AI身上，是完全成立的。</p>
<p>你使用它，并不是为了今天就赚钱，也不是为了立刻提升多少效率，更不是为了炫技。</p>
<p>你使用它的真正价值，在于——<strong>获得对未来的感知能力</strong>。</p>
<blockquote>
<p>你使用它的真正价值，不是效率，而是——获得对未来的感知能力。</p>
</blockquote>
<p>当你真正用过这些系统，你会开始理解很多事情：</p>
<ul>
<li>你会看到未来的工作是如何被重构的；</li>
<li>你会意识到组织形态可能发生什么变化；</li>
<li>你会开始思考，哪些技能会变得不再重要，哪些能力会被放大；</li>
<li>你甚至会重新思考教育——你的孩子，未来到底还需不需要学习我们今天认为“必须”的那些东西？</li>
</ul>
<p>这才是核心。</p>
<h2>6. 代际影响：你用不用，决定下一代学什么</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/46/4626171ca0a54a6d39d5dabfcd17f955c19c4a2dab024bcd11b2e7d5b5c4e5f2.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>就像那个时代，如果你已经坐过火车，你大概率不会再让你的孩子把“骑马”当作一项核心竞争力去培养。</p>
<p>不是因为骑马不好，而是因为时代已经改变。</p>
<p>AI也是一样。</p>
<p>不论你一开始，是想用 OpenClaw 搭一个客服系统、做内容流水线、写报告、做视频，还是像很多人一样，只是抱着“试试看”的心态去折腾——也许你最终实现了，也许你没有完全实现，但这件事本身，都会在潜移默化中改变你的<strong>认知边界</strong>。</p>
<p>而一旦你的认知变了，你对世界的判断变了，你对能力的理解变了，你对未来的预期变了——这些，都会直接影响你下一代的选择。</p>
<p>所以：<strong>你今天是否使用“龙虾”，其实在潜移默化中，已经影响了你下一代的选择。</strong></p>
<p><s>不论你一开始是想实现一个 OTA 系统还是其它，或许最终实现或者没实现，但是最终都会影响下一代。</s></p>
<h2>7. AI 时代的特殊性：变化是指数级的</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a1/a1e95ca0df8901f1b9bc735c4513b556103bbeff2da9cfa301c4dc6975ed2156.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>区别在于，这一轮变化，比火车时代更激烈。</p>
<p>火车的进步是逐渐提速的，从慢到快，是一个相对线性的过程。而 AI 不一样，它是指数级的。今天你觉得它很“蠢”，很“不稳定”，但可能一年之后，它已经完全是另一个世界。</p>
<p>如果你等它“成熟了再用”，那很可能你已经错过了理解这个世界的窗口期。</p>
<h2>8. 结论：把 OpenClaw 当作“时代入口”，而不是工具</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e4/e4d77b3b7b08ac5e9fe49c9466ffb60160676252ecbc52416daed1793f333121.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>所以我一直在强调一件事：</p>
<p><strong>不要把 OpenClaw 当成一个工具去衡量，而要把它当成一个“时代入口”。</strong></p>
<p>你现在用它，不是为了产出，而是为了认知升级。</p>
<p>你不需要一开始就想着怎么变现、怎么赚钱、怎么用它提高ROI。你只需要去用——去踩坑、去折腾、去经历它的不稳定。</p>
<p>因为正是在这些“不成熟”的体验里，你才能真正触摸到未来。</p>
<p>当别人还在讨论“这个东西现在好不好用”的时候，你已经在思考“这个东西会把世界变成什么样”。</p>
<p>这就是差距的开始。</p>
<h2>9. 最后一句话</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/90/9054ad5174f9ed010e5cca78afbb548985a0a6189013e6931371a483e1962c15.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>所以我的建议很简单：<strong>在龙虾还没有变得完美之前，就去用它。</strong></p>
<p>不是因为它已经准备好了，而是因为——未来已经开始了。</p>
<p>等它成熟的人，永远只是在使用时代；提前用的人，才是在理解时代。</p>
<details class="hint-container details"><summary>.</summary>
<p>今天想跟你认真聊一个问题：<strong>为什么明明 AI （比喻为&quot;龙虾&quot;）还很不成熟，我们却必须现在就开始用？</strong></p>
<p>很多人对当下的 AI 有一种很真实的感受：不好用、不稳定、门槛高，甚至可以说是“<strong>半成品</strong>”。</p>
<p>就拿你现在接触到的这些 AI 工具来说，它们不像微信、飞书那样，下载即用、界面友好、逻辑清晰。相反，它们更像是一堆“拼起来的能力”：要配置模型、要接API、要接入通信工具，还可能随时崩掉。你花了一整天时间，可能只是让它“勉强跑起来”。</p>
<p>从产品角度看，它确实是一个“坏掉的产品”（broken product）。</p>
<p>它没有成熟的商业化，没有稳定的体验，甚至连基本的可用性都不稳定。</p>
<p>但问题是——<strong>你不能用“产品成熟度”去判断一个时代技术的价值。</strong></p>
</details>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-26T22:11:18.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">给几个付费粉丝安装 OpenClaw 后的一些心得</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/11-OpenClaw-Think.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/11-OpenClaw-Think.html"/>
    <updated>2026-08-16T15:12:00.866Z</updated>
    <summary type="html"><![CDATA[<p>你好，我悦创。</p>
<p>下面是我最近给粉丝付费安装的记录：</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<p>你好，我悦创。</p>
<p>下面是我最近给粉丝付费安装的记录：</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-26T20:08:02.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">OpenClaw 对接钉钉，一篇文章带你轻松搞定！</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/10-openclaw-dingtalk-integration.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/10-openclaw-dingtalk-integration.html"/>
    <updated>2026-08-16T15:12:00.867Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-26T17:57:34.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">OpenClaw03.22 新版本，能让大厂们收手么？「套壳不是长久之计」</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/09-openclaw-update-shell-crisis.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/09-openclaw-update-shell-crisis.html"/>
    <updated>2026-08-16T15:12:00.867Z</updated>
    <summary type="html"><![CDATA[<div style="text-align:center">
<h3>OpenClaw 3 月更新：一场“技术集权”，让套壳模式彻底失速</h3>
</div>
<p>你好，我是悦创。</p>
<p><strong>这是一个来晚的文章，但它是切切实实存在的内容！就算各家通讯插件适配，但是问题依然存在！</strong></p>
<p>3 月 22 日，OpenClaw 做了一件很简单的事——改了一套底层机制。</p>
<p>但这件“小改动”，却直接把国内一整批所谓的 AI 产品，打回了原形。</p>
<p>如果一定要给这次事件下一个定义，我更愿意称它为：<strong>一次彻底的“技术收权”。</strong></p>]]></summary>
    <content type="html"><![CDATA[<div style="text-align:center">
<h3>OpenClaw 3 月更新：一场“技术集权”，让套壳模式彻底失速</h3>
</div>
<p>你好，我是悦创。</p>
<p><strong>这是一个来晚的文章，但它是切切实实存在的内容！就算各家通讯插件适配，但是问题依然存在！</strong></p>
<p>3 月 22 日，OpenClaw 做了一件很简单的事——改了一套底层机制。</p>
<p>但这件“小改动”，却直接把国内一整批所谓的 AI 产品，打回了原形。</p>
<p>如果一定要给这次事件下一个定义，我更愿意称它为：<strong>一次彻底的“技术收权”。</strong></p>
<h2>1. 不是插件崩了，是一整层生态被判死刑</h2>
<p>这次更新之后，发生的事情已经不需要争论：</p>
<ul>
<li>飞书插件，大面积失效；</li>
<li>微信插件，刚上线就报废；（白开心了哈哈哈哈哈）</li>
<li>钉钉、企微，全部不可用；</li>
<li>第三方 Skill 市场，直接清零；</li>
</ul>
<p>很多人还在讨论“<strong>哪个插件没适配</strong>”，但问题根本不在这里。</p>
<blockquote>
<p><strong>这不是适配问题，这是规则被改写。</strong></p>
</blockquote>
<p>过去你可以随便往 OpenClaw 里塞东西，现在不行了。过去你可以搭自己的插件体系，现在也不行了。</p>
<p>这一次，不是功能被砍，而是<strong>权力被收回</strong>。</p>
<h2>2. 所谓“产品”，其实只是贴在开源之上的一层皮</h2>
<p>这次最尴尬的，不是插件开发者，而是那些“<strong>产品公司</strong>”。</p>
<p>因为这一波更新，暴露了一个所有人都心知肚明、但没人愿意说破的事实：<strong>很多所谓的 AI 产品，本质上只是 OpenClaw 的一层壳。</strong></p>
<p>它们做了什么？</p>
<ul>
<li>换了个 UI；</li>
<li>包了一层安装器；</li>
<li>集成几个插件；</li>
<li>再接个飞书或微信；</li>
</ul>
<p>然后，就敢对外说自己是“AI 平台”。</p>
<p>问题是——<strong>你的核心能力在哪？</strong></p>
<p>没有！</p>
<p>所以，当 OpenClaw 改了一条底层规则，这些“产品”连挣扎的空间都没有，直接失去运行基础。</p>
<h2>3. 真正的致命点：你连自己的版本都控制不了</h2>
<p>更讽刺的是，这些套壳产品连最基本的一件事都没做好：<strong>控制版本。</strong></p>
<p>过去的套路很简单：</p>
<ul>
<li>不让用户升级；</li>
<li>或者强制锁在某个版本；</li>
</ul>
<p>但这一次，大多数团队连这一步都没来得及做。</p>
<p>结果就是：<strong>用户只要点一下“更新”，你整个产品体系就当场失效。</strong></p>
<p>不是性能下降，不是体验变差，是<strong>直接不能用</strong>。</p>
<p>而你，甚至无法回滚。</p>
<p>这不是技术问题，这是<strong>对自己产品完全没有控制力</strong>的问题。</p>
<h2>4. OpenClaw 在干什么？在重新定义“谁说了算”</h2>
<p>很多人把这次更新理解为“安全升级”，但这只是表面。</p>
<p>真正发生的是：<strong>OpenClaw 从一个工具，变成了一个平台。</strong></p>
<p>区别很关键：</p>
<ul>
<li>工具 → 谁都能改；</li>
<li>平台 → 谁能用，由我决定；</li>
</ul>
<p>通过 ClawHub 的鉴权机制，OpenClaw 做了一件非常明确的事情：<strong>所有运行在我之上的能力，必须经过我允许。</strong></p>
<p>这就是“<strong>技术集权</strong>”的本质，你可以开发，但你不能决定是否运行。</p>
<h2>5. 为什么只有中国在大规模“翻车”？</h2>
<p>这件事还有一个更值得反思的点：👉 <strong>为什么几乎只有中国公司在集体踩坑？</strong></p>
<p>因为只有国内，把 OpenClaw 当成了“<strong>必须上车</strong>”的风口。</p>
<ul>
<li>别人：拿来研究；</li>
<li>国内：拿来包装产品；</li>
</ul>
<p>在焦虑驱动下，大家追求的是：</p>
<ul>
<li>上线速度；</li>
<li>功能堆叠；</li>
<li>市场声量；</li>
</ul>
<p>而不是：</p>
<ul>
<li>技术控制权；</li>
<li>系统可持续性；</li>
<li>架构独立性；</li>
</ul>
<p>于是就出现了一种荒诞的局面：<strong>一群市值上百亿的公司，在用一个开源项目做“底座创业”。</strong></p>
<p>然后，<strong>被上游一行代码集体“清场”。</strong></p>
<h2>6. 这不是事故，这是一次“清算”</h2>
<p>很多人还在把这件事当成“版本事故”，甚至在等修复。</p>
<p>但现实是：<strong>这不是 bug，这是方向。</strong></p>
<p>OpenClaw 不会回到过去那种完全开放的状态。因为一旦它成为平台，它就必须控制生态。</p>
<p>所以这次事件，本质上不是“谁适配得快”，而是：<strong>谁的商业模式，本来就不成立。</strong></p>
<h2>7. 结论很简单，但很多人不愿意承认</h2>
<p>这次更新，讲清楚了一件事：<strong>你不能建立在别人“随时可以改变规则”的系统之上，却幻想自己拥有稳定的产品。</strong></p>
<p>如果你没有：</p>
<ul>
<li>自己的核心能力；</li>
<li>自己的技术栈；</li>
<li>自己的控制权；</li>
</ul>
<p>那么你所谓的产品，只是：<strong>寄生在别人体系上的临时结构。</strong></p>
<p>而这种结构，随时可以被移除。</p>
<h2>8. 结语</h2>
<p>OpenClaw 只做了一件事：<strong>把原本就不属于你的东西，收了回去。</strong></p>
<p>至于谁倒下，并不是因为这次更新太狠，而是因为——<strong>本来就站不稳。</strong></p>
<p>最后希望：这波更新后，大厂们应该冷静下来好好搞自己的产品，最起码别<strong>套壳</strong>了。这么大市值的公司套壳一个开源产品，被人按在地上摩擦，确实挺丢份的。</p>
<details class="hint-container details"><summary>.</summary>
<p>你好，我是悦创。</p>
<p>OpenClaw 在 3 月 22 日发布的这次更新，在我看来，不仅仅是一次普通的版本迭代，更像是一场对整个生态的“重构”。网上有人用“技术集权”来形容这次变化，这个说法虽然激进，但并不失准确。</p>
<p>之所以会引发如此大的震动，是因为这次更新直接触及了 OpenClaw 生态最核心的一层：插件体系与运行机制。而这，恰恰是国内大量厂商正在依赖的部分。</p>
</details>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-25T21:57:53.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">00-Why Build Person Blog</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/00-why-build-person-blog.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/00-why-build-person-blog.html"/>
    <updated>2026-08-16T15:12:00.871Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<div style="text-align:center">
<h3>做网站的过程中，就是探索一个复杂的体系结构如何诞生！</h3>
</div>
<p>记录自己所学的知识，只是网站功能之一。</p>
<p>首先，构建个人博客过程需要得到的进化是。分为两个种类：开源现成版、AI 持续迭代版（具有生命的成长性）</p>
<h2>1. 开源版</h2>
<ul class="task-list-container">
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 了解如何把开源的项目，为我们所用；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 了解在这样的实现目标下，每个软件、代码之间的互相调用（使用）的逻辑；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 无需深入研究每一个技术、软件，而是看自身是否可以抽象出整个网站的整体架构（可以做思维导图验证）；</label></p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 也就是每个软件什么时候需要，什么时候要用，把以往学习过程中缺失的东西补全；</label></li>
</ul>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 逻辑、架构都要了熟于心，至于技术后期需要再进行深入；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> vibe coding 强大，那么如果使用 AI 制作出来的网站。如何进行部署公开，这也是你接下来要掌握的；</label></p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 流程内也可以部署静态网页；（public）</label></li>
</ul>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 实时记录生活、笔记、经历；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 这是你后期需要自检，也需要等你来补充；</label></p>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<div style="text-align:center">
<h3>做网站的过程中，就是探索一个复杂的体系结构如何诞生！</h3>
</div>
<p>记录自己所学的知识，只是网站功能之一。</p>
<p>首先，构建个人博客过程需要得到的进化是。分为两个种类：开源现成版、AI 持续迭代版（具有生命的成长性）</p>
<h2>1. 开源版</h2>
<ul class="task-list-container">
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 了解如何把开源的项目，为我们所用；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 了解在这样的实现目标下，每个软件、代码之间的互相调用（使用）的逻辑；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 无需深入研究每一个技术、软件，而是看自身是否可以抽象出整个网站的整体架构（可以做思维导图验证）；</label></p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 也就是每个软件什么时候需要，什么时候要用，把以往学习过程中缺失的东西补全；</label></li>
</ul>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 逻辑、架构都要了熟于心，至于技术后期需要再进行深入；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> vibe coding 强大，那么如果使用 AI 制作出来的网站。如何进行部署公开，这也是你接下来要掌握的；</label></p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 流程内也可以部署静态网页；（public）</label></li>
</ul>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 实时记录生活、笔记、经历；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 这是你后期需要自检，也需要等你来补充；</label></p>
</li>
</ul>
<h2>2. AI 成长版本</h2>
<p>成长顾名思义就是：结合 AI 让这个网站更好，持续的开发新的功能或修复潜在 bug。</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 零技术基础的情况下，使用 AI 完完全全进行开发迭代的网站。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 在与 AI交互中最重要的是什么？——了解 AI 的工作流，我们要做领导者的角色，制定工作流。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> 了解静态网站所有零成本的部署方式，包括不限于：GitHub、Vercel、Cloudflare Pages 等。（借助：Cloudflare Pages 带你体验首次使用部署的研究过程）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 熟悉 GitHub 的交互使用已经使用逻辑，强大的“百度网盘”！我的数据备份核心法则！</label></li>
<li>[x]</li>
</ul>
<p>【泡泡工厂】<strong>Fake it until you make it</strong></p>
<p>装着你行，装到你真行。直到成功都没被戳破的谎言，就叫预言。—— 强尼（李乃文）</p>
<blockquote>
<p>硅谷有句话，Fake it until you make it。比尔盖茨当年卖程序，一行代码没写，先谈下订单，再拼尽全力交付。没被戳穿、最后做成事的谎言，那不叫骗，叫预言。</p>
</blockquote>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-24T19:07:12.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">08-OpenClaw 制作客服</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/08-openclaw-ecommerce-customer-service.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/08-openclaw-ecommerce-customer-service.html"/>
    <updated>2026-08-16T15:12:00.872Z</updated>
    <summary type="html"><![CDATA[<h2>1. 需求明确</h2>
<h2>2. 可行性分析</h2>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>1. 需求明确</h2>
<h2>2. 可行性分析</h2>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-22T10:00:05.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">08-飞书插件精简版教程</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/07-openclaw-lark-tools.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/07-openclaw-lark-tools.html"/>
    <updated>2026-08-16T15:12:00.872Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5f/5fa847423f8ea5b09c3b90c14825228367fed37d0c3b33ec6873c2cb85ae20e3.png" alt="欢迎赞助·服务器费用时不时欠费停机～" tabindex="0" loading="lazy"><figcaption>欢迎赞助·服务器费用时不时欠费停机～</figcaption></figure>
<p>你好，我是悦创。</p>
<p>飞书官方插件教程略乱，不适合新手小白。其次，本身没有什么太多更新，小白看了容易有焦虑。目前官网没怎么回复，不知道热度过后是否还会维护。【敬请期待！】</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5f/5fa847423f8ea5b09c3b90c14825228367fed37d0c3b33ec6873c2cb85ae20e3.png" alt="欢迎赞助·服务器费用时不时欠费停机～" tabindex="0" loading="lazy"><figcaption>欢迎赞助·服务器费用时不时欠费停机～</figcaption></figure>
<p>你好，我是悦创。</p>
<p>飞书官方插件教程略乱，不适合新手小白。其次，本身没有什么太多更新，小白看了容易有焦虑。目前官网没怎么回复，不知道热度过后是否还会维护。【敬请期待！】</p>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>飞书官方流量趁的挺快，但是插件很多 bug 没有修理🔧，很多反馈没有回复～</p>
<p><strong>老规矩：小白、新手、bug 不会的，直接找我付费操作：150¥</strong></p>
<p>飞书官方插件名称，改来改去。挺废物的，而且会额外的消耗 Token。如果飞书文档、知识库不是你所需要的，你可以考虑对接其它通讯平台即可。</p>
<details class="hint-container details"><summary>Image</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/33/33bc6b629b7ea0324415a5e299198d407d204eca03938f767a968235a638c127.png" style="zoom:25%;">
</details>
</div>
<div class="hint-container tip">
<p class="hint-container-title">ChangeLog</p>
<ul class="task-list-container">
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> Plan：所有不说调用的大模型，都是耍流氓！后面分享高频、常用（通用的 Skills）、自己创建 Skills！</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 2026-03-15 10:21:50：发布最新版飞书插件教程；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 2026-03-16 11:20:01：完成飞书插件所有教程，开始录视频；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 2026-03-21 12:34:59：跟新飞书插件安装命令！更新一条命令复制运行，待实测。欢迎测试成功的，评论分享。</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 2026-03-24 10:49:07：飞书假装修 bug，假装发布版本，实则用之前的版本。</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 2026-03-24 17:52:36：更新飞书新版教程；</label></p>
<details class="hint-container details"><summary>崩塌</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c0/c075f8b7eadfc08d809d6e4343afacfac5555f971192af1cf5a972d91cf9f580.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 2026-03-25 17:07:04：更新飞书插件 bug 处理；</label></p>
</li>
</ul>
</div>
<ul>
<li><strong>教程链接</strong>：<a href="https://bytedance.larkoffice.com/docx/MFK7dDFLFoVlOGxWCv5cTXKmnMh?from=from_copylink" target="_blank" rel="noopener noreferrer">OpenClaw飞书官方插件使用指南（公开版）</a></li>
<li><strong>Github 仓库</strong>：<a href="https://github.com/larksuite/openclaw-lark" target="_blank" rel="noopener noreferrer">https://github.com/larksuite/openclaw-lark</a></li>
</ul>
<p>官方教程中，有什么飞书插件反馈、体验群，建议不用加入。都是口水群，飞书官方也没有针对性用户进行反馈回复！只是多了几条未读消息（上百条以上）！</p>
<h2>1. 安装飞书插件</h2>
<div class="hint-container warning">
<p class="hint-container-title">目前 openclaw 3.28 版本与飞书插件不兼容修复完成，使用以下命令安装:</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:#4078F2;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> @larksuite/openclaw-lark@2026.3.29</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --tools-version</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1.0.33</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div>

<p>执行过程中，可选择 <strong>新建机器人</strong> 或 关<strong>联已有机器人</strong>。</p>
<div class="hint-container tip">
<p class="hint-container-title">若执行命令行出错，可在命令行前增加 <code>sudo </code>重新执行。</p>
</div>
<h3>1.1 关联已有机器人</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/91/91bc02d8a5254ea4d1fd735ee2136a35d4ae01dd53d365f3f4486e50110742ae.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>选择关联已有机器人时，若提示无效的 App ID 或 App Secret，可手动输入正确的应用凭证信息。</p>
<p>这个部分不会的话，查看教程：<a href="/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html" target="_blank"><strong>🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</strong></a> 中飞书机器人创建部分。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f6/f6aa3c45d6793ab2878d4597cd55a2a3d24686b28461956b1419897ad4d1da73.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>1.2 创建新机器人</h3>
<p>若选择新建机器人，可通过飞书客户端扫描二维码，选择 <strong>一键创建飞书机器人</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d3/d36e6bed80e47cf889f117b59337aa62edf6ffcfdd76427b862470cf75bcb219.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>如果 Windows 设备中无法扫码成功，可能是因为终端的分辨率问题导致，建议更换终端使用 <a href="https://cmder.app/" target="_blank" rel="noopener noreferrer">Cmder</a> 或 <a href="https://conemu.github.io/" target="_blank" rel="noopener noreferrer">https://conemu.github.io/</a>（我个人使用 ConEmu 比较多）。</p>
<h2>2. 机器人创建完成</h2>
<p>创建完成后，点击 <strong>打开机器人</strong>，在飞书中向机器人发送任意消息，即可开始对话。</p>
<h3>2.1 验证安装状态</h3>
<p><strong>验证是否安装成功</strong>：在飞书对话中发送 <code>/feishu start</code>。若返回了版本号信息，则代表安装成功。</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:#4078F2;--shiki-dark:#61AFEF">/feishu</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> start</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8d/8db6fad71ad950e17f736063cf62b804322dca5c5da0099bd08ba8a20e3e5375.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.2 快速批量授权</h3>
<p>若希望快速完成用户授权，便于后续 OpenClaw 通过你的身份完成消息、文档、多维表格、日历等任务，可以在飞书对话中发送 <code>/feishu auth</code> 来完成批量授权。</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:#4078F2;--shiki-dark:#61AFEF">/feishu</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> auth</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ef/efd434998f3b890d911ac141975a67414159a674fb4382ae6b9943a6d54fc847.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.3 快速学习飞书插件</h3>
<p>为了让 OpenClaw 能学会这些新技能并正确使用，建议在飞书对话中发送 <code>学习一下我安装的新飞书插件，列出有哪些能力</code>。</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:#4078F2;--shiki-dark:#61AFEF">学习一下我安装的新飞书插件，列出有哪些能力</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a6/a66c41a2a7eba2cc7ebac16b2f3a421778a6f64313073a325f0ee5656c0edb33.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>3. 升级飞书插件</h2>
<p>后续飞书如果有升级的话，应该如何升级呢？</p>
<ol>
<li>
<p>运行 <code>openclaw -v</code> 命令查看已安装的 OpenClaw 的版本，新版插件对 OpenClaw 的版本要求如下。若低于该版本，插件运行可能出现异常，可执行 <code>npm install -g openclaw</code> 命令升级。</p>
<ol>
<li><strong>Linux/MacOS：</strong> <strong>2026.2.26</strong> 及以上</li>
<li><strong>Windows：</strong> <strong>2026.3.2</strong> 及以上</li>
</ol>
</li>
<li>
<p>在终端中运行以下命令升级飞书官方插件到最新版本：</p>

<p>若执行该命令行出错，可在命令行前 增加 <code>sudo</code> 重新执行。</p>

<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f2/f2c73b8f3df0228f6b3022bc7a356e3f6e67cb484d2af274d7f34ba117309576.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
</ol>
<h2>4. 高级配置指令</h2>
<h3>4.0 邪修版</h3>
<p>直接一股脑的，一条命令一条命令执行。别管含义与功能，你们肯定和我的需求差不多，特殊需求后期属性后往后阅读即可。</p>
<div class="hint-container info">
<p class="hint-container-title">更新一条命令复制运行，待实测。欢迎测试成功的，评论分享</p>
<p>因为一条一条复制多行命令麻烦，故而想着能不能直接复制一条实现。欢迎粉丝测试：</p>
<ul>
<li>一条命令「Mac / Linux（bash / zsh）」；</li>
<li>一条命令 Windows PowerShell-1；</li>
<li>一条命令 Windows PowerShell-2；</li>
</ul>
</div>

<p>这些是基础常用的，特殊需求或者指令含义往下阅读。</p>
<h3>4.1 切换到流式输出</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.streaming</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</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">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.footer.elapsed</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.footer.status</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><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></div><p>流式输出效果如图：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/71/7159fbaf768997d665f737892c60b75fc1dcf5f743ca4480cb22430db4f44d43.gif" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.streaming</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>4.2 设置多任务并行及独立上下文</h3>
<p>机器人可在话题群/消息群话题模式中，针对每个话题拥有独立上下文以及多任务并行。</p>
<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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.threadSession</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</span><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></div><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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.threadSession</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>4.3 修改飞书机器人在群内的回复方式</h3>
<p>目前插件支持的默认方式是机器人被拉进群后，只有 at(@) 机器人时才可回复。</p>
<details class="hint-container details"><summary>模式 1：只有 【<code>应用所有者（主人）</code>】【<code>@机器人</code>】 才回复</summary>
<p><strong>在群内机器人仅响应 <code>应用所有者（主人）</code> <code>@机器人的消息</code>，不响应其他人发给机器人的消息</strong> （已作为 3.17 及以上版本安装时的默认策略，推荐配置）</p>
<p><strong>配置方法</strong>：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" 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-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "channels"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_你的AppID"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"你的AppSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</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:#E45649;--shiki-dark:#E06C75">            "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"allowlist"</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">// 将 groupPolicy 设置为 "allowlist"（白名单）</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "groupAllowFrom"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ou_XXXX"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span><span style="--shiki-light:#50A14F;--shiki-dark:#FFFFFF">，</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">// 并通过 groupAllowFrom 指定允许触发机器人的用户，配置你本人 openid 信息。</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">            "groups"</span><span style="--shiki-light:#50A14F;--shiki-dark:#FFFFFF">:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"*"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#50A14F;--shiki-dark:#FFFFFF">enabled</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--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 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></div><p><strong>你可以直接咨询小龙虾你的 openid</strong>：</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:#4078F2;--shiki-dark:#61AFEF">我的</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> openid</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></div><details class="hint-container details"><summary>点击看图示</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/87/871e8544484b0e9818cb3273975ef9697e8cddd6bd67f7e0869e9c2d4b7074f4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<p>还有一个方法：就是直接在 OpenClaw Web UI 中直接查看。（掌握方法，而不是全权依赖大模型回复！）</p>
<blockquote>
<p>不嫌方法多，就怕没法发。</p>
</blockquote>
<details class="hint-container details"><summary>点击看图示</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8b/8bb84d41a901397e0170a29c19169d6dabd9340c61e835b917af7632f3f4173f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
</details>
<details class="hint-container details"><summary>模式 2：只有 【<code>@机器人</code>】 才回复，可响应群内任何人发送的消息</summary>
<p><strong>配置方法</strong>：</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">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.requireMention</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --json</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</span><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></div><p><strong>完整配置示例</strong>：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" 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-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "channels"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_你的AppID"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"你的AppSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"open"</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></div></details>
<details class="hint-container details"><summary>模式 3：不用 <code>@</code>，所有消息都回复</summary>
<div class="hint-container warning">
<p class="hint-container-title">注意：这个模式在大群里容易刷屏，谨慎使用！（我挺喜欢的，方便哈哈哈哈）</p>
</div>
<p>需要额外在开发者后台申请应用身份权限：获取群组中所有消息（敏感权限）<code>im:message.group_msg</code>。</p>
<p><strong>配置方法</strong>：</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">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.requireMention</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> false</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --json</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</span><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></div><p><strong>完整配置示例</strong>：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" 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-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "channels"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_你的AppID"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"你的AppSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"open"</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></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></details>
<details class="hint-container details"><summary>模式 4：只有指定群 <code>@机器人才回复（高级）</code></summary>
<p><strong>效果</strong>：</p>
<ul>
<li>大部分群：不用 <code>@</code> 也能回复（或者完全不回复）；</li>
<li>特定群：必须 <code>@</code> 才回复；</li>
<li>适合：不同群不同规则，比如工作群严格一点，闲聊群随意一点；</li>
</ul>
<p><strong>配置方法</strong>：</p>
<ul>
<li>
<p><strong>第一步：获取群 ID</strong></p>
<p>可通过以下任意方式获取目标群 ID：让机器人加入群后，发送任意消息，然后在日志里找群 ID，或让机器人回复群 ID。</p>
<details class="hint-container details"><summary>图片</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/7e/7eac8b1ae7084057a917ae510fbc5679e2cfb6d9728c09ec0b98ac8ad4e807f2.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<p>群成员可以通过点击右上角的群菜单选项进入群设置页面，查看群 ID。</p>
<details class="hint-container details"><summary>图片</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c0/c0ed26936efd9768ce246560870b89fec123fd91f2f0f6147728b882e198273e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
</li>
<li>
<p><strong>第二步：配置特定群规则</strong></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">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.requireMention</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> open</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --json</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"># 然后给特定群设置需要 @（这里群 ID 只是示例，你要替换成真实的）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> channels.feishu.groups.oc_xxxxxxxx.requireMention</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> true</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --json</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># openclaw config set channels.feishu.groups.【替换成你自己的群 ID】.requireMention true --json</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</span><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></div><p><strong>完整配置示例</strong>：</p>
<div class="language-json line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="json" style="--vp-collapsed-lines:15;--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-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "channels"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_你的AppID"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"你的AppSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"open"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"open"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "groups"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">                "oc_532044075a61d112f04fa63109c75e9b"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">                    "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--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 style="--shiki-light:#E45649;--shiki-dark:#E06C75">                "oc_另一个群ID"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">                    "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--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 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 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><div class="collapsed-lines"></div></div></li>
</ul>
</details>
<h2>5. 常用诊断命令与问题修复方法</h2>
<p>可以在与 OpenClaw 的对话中发送以下命令：</p>
<ul>
<li>
<p><strong><code>/feishu start</code></strong>：确认是否安装成功；</p>
</li>
<li>
<p><strong><code>/feishu doctor</code></strong>：检查配置是否正常；</p>
<details class="hint-container details"><summary>image</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/bd/bd64a8c10530da5307b0a9272ae8023342e106a732c3f70becef15eee0677d13.png" style="zoom:25%;">
<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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> tools.profile</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "full"</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</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></div><p>应用身份权限未通过，可以自己申请权限，并发布应用。（参考安装教程）</p>
</details>
</li>
<li>
<p><strong><code>/feishu auth</code></strong>：批量完成用户授权；</p>
</li>
</ul>
<p>插件中也内置了常见问题的解决方案，遇到问题都可以先问问小龙虾。如果不行，则运行以下指令查看问题，并自主修复：</p>

<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/6c/6c4cd3bdcda40777da3b9ac0435977188047068d5819c73c21423d93dc27c6b2.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>运行 <code>fix</code> 尝试自动修复：</p>

<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2a/2a9f70fd4b03d7f143df922b3759081e3b90d55f3940d42a2a1802079e8310df.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>如果仍然无法修复，可在评论区反馈信息。</p>
<ul>
<li>
<p>运行 <code>info</code> 查看版本信息，反馈问题时带上辅助排查。</p>

<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/89/8909fa781231c117c40aa1fd09e51631c366b3706907d4ac5e782b03ee10d8d5.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p><code>--all </code> 查看详细配置信息：</p>

</li>
</ul>
<h2>6. 常见问题</h2>
<h3>6.1 在使用插件时出现权限不足，需要申请所需权限应该如何操作？</h3>
<ol>
<li>
<p>在左侧导航栏选择 <strong>权限管理</strong>，点击 <strong>批量导入/导出权限。</strong>——详细教程：<a href="/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html" target="_blank"><strong>🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</strong></a></p>
<details class="hint-container details"><summary>image</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/53/534e44decbbb00a9dbc96117d5d909fd49e5bf07da22aca0efae94a795f0130b.png" style="zoom:50%;">
</details>
</li>
<li>
<p>在 <strong>导入</strong> 页签中，复制下面权限替换原有示例，点击 <strong>下一步，确认新增权限</strong> 按钮。</p>
<div class="language-json line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="json" style="--vp-collapsed-lines:15;--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-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "scopes"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "tenant"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "acs:access_record:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "acs:access_record:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "acs:device:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "acs:devices:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "acs:users"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:admin_dept_stat:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:admin_user_stat:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.admin:check"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.admin:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.admin_id:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.category:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.enable:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.info:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.user_usable:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:app.visibility"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:badge"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:badge.grant"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "admin:ent_email_password"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:data_asset:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:data_asset:upload_file"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:data_asset:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:file:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:file:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:knowledge:ask"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:knowledge:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:knowledge:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:message:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:message:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:run:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:run:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:session:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:session:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:skill:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "aily:skill:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:application.environment_variable:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:application.event:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:application.function:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:application.log:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:application.metric:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:approval:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:approval:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:attachment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:attachment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:data.record.change:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:dataset.meta:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:dataset.record:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:flow:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:global_option:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:object.meta:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:object.record:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:object.record:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:record_permission.member:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:role.member:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "app_engine:role:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.app_message_stats.overview:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.app_package"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.app_usage_stats.overview:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.app_version"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.app_version:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.bot.operator_name:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.collaborators:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.contacts_range:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application.feedback.feedback_info"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:application:self_manage"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:bot.menu:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "application:bot.menu:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:approval"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:approval.list:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:approval:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:definition"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:external_approval"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:external_instance"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:instance"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:instance.comment"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "approval:task"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance:overtime_approval:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance:rule"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance:rule:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance:task"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance:task:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance_machine:check_in_record:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance_machine:device:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "attendance_machine:users"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "auth:user_access_token:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "baike:entity"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "baike:entity:exempt_delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "baike:entity:exempt_review"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "baike:entity:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:collaborator:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:collaborator:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:collaborator:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:dashboard:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:dashboard:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field_group:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:form:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:form:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:role:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:role:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:role:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:role:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:view:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:view:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:workflow:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:workflow:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "bitable:app"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "bitable:app:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "block:entity"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "block:message"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "board:whiteboard:node:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "board:whiteboard:node:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "board:whiteboard:node:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "board:whiteboard:node:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.acl:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.acl:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.acl:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:reply"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.free_busy:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:subscribe"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:exchange.bindings:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:exchange.bindings:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:exchange.bindings:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:room"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:room:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:settings.caldav:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:settings.workhour:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:time_off:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:time_off:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:timeoff"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "cardkit:card:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "cardkit:card:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "cardkit:template:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "collab_plugins:collab_plugins"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "collab_plugins:collab_plugins.relation.change:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:contact"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:contact.base:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:contact:update_department_id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:contact:update_user_id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:department.base:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:department.hrbp:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:department.organize:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:functional_role"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:functional_role:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:group"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:group:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:job_family"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:job_family:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:job_level"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:job_level:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:job_title:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:role:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:unit"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:unit:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.assign_info:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.base:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.department:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.dotted_line_leader_info.read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.email:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.employee:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.employee_id:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.employee_number:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.gender:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.id:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.job_family:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.job_level:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.phone:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.subscription_ids:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.user_geo"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:work_city:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.compensation_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.compensation_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.job:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.job:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.job_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.job_level:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.position:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.position:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.service_company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.service_company:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.work_shift:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job.work_shift:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:additional_job:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:approval_groups.orgdraft_department_change:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:approval_groups.orgdraft_job_change:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:approval_groups.orgdraft_position_change:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:approval_groups:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:authorization.bp:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:authorization:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:authorization:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:bp.get_by_department:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:bp.list:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:common_data.basic_data:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:common_data.id.convert:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:common_data.meta_data:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:common_data.meta_data:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:common_data.preset_data:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:common_data.preset_data:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:company:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation.insurance:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation.social_plan:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_archive_detail.change_description:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_archive_detail.indicators:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_archive_detail.items:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_archive_detail.plan:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_archive_detail.salary_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_change_reason:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_indicator:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_item:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_item_category:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_plan:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_plan_detail.indicators:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:compensation_plan_detail.items:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:contract.company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:contract.company:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:contract.period:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:contract.period:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:contract:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:contract:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:corehr"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:corehr:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:cost_allocation:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:cost_allocation:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:cost_center:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:cost_center:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:custom_org:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:custom_org:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:default_cost_center:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:default_cost_center:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:department.cost_center_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:department.custom_fields:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:department.manager.search:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:department.manager:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:department.organize.search:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:draft:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employee.all_bp:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employees.international_assignment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.archive_cpst_plan:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.assignment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.assignment_pay_group:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.compensation_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.compensation_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.contract_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.cost_center:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.custom_org:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.custom_org:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.custom_org_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.custom_org_field:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.has_offer_salary:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.bt:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.compensation_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.compensation_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.custom_field.apaas_id__c:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.custom_field:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job_family:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job_family:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job_grade:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job_grade:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.job_level:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.position:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.position:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.service_company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.service_company:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.weekly_working_hours:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.weekly_working_hours:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.work_calendar:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.work_calendar:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.work_location:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.work_location:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.work_shift:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.work_shift:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.working_hours_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.international_assignment.working_hours_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.job:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.job_grade:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.job_grade:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.job_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.job_level:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.non_compete_covenant:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.non_compete_covenant:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.offboarding_reason.search:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.offboarding_reason:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.pathway:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.pathway:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.pay_group:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.position:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.position:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment.recruitment_project_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:employment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:file:download"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:file:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:flow.definition:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:international_assignment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:international_assignment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job.job_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.company:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.compensation_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.contract_end_date:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.contract_end_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.contract_number:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.contract_start_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.contract_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.cost_center:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.department:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.department:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.direct_manager:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.dotted_manager:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.duration_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.employee_subtype:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.employment_custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.is_adjust_salary:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job_family:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job_family:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job_grade:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job_grade:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.job_level:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.pathway:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.pathway:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.probation_end_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.probation_exist:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.remark:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.remark:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.service_company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.service_company:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.social_security_city:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.social_security_city:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.work_location:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.work_shift:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.work_shift:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.workforce_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.workforce_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.working_calendar:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.working_calendar:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_change.working_hours_type:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data.assignment_start_reason:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data.compensation_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data.job_data_reason:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data.service_company:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data.work_shift:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_data:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_family:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_family:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_grade:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_grade:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_level"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_level:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:job_level:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:leave:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:leave_grant:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:leave_grant:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:leave_granting_record:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:leaves:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:locations:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:locations:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.block_list:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.block_list:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.last_attendance_date:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.noncompete_agreement:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.retain_account:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.retain_account:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.signature:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding.social_insurance:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:offboarding:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:orgrole_info:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pathway:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pathway:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.additional_nationalities:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.additional_nationalities:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.address:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.address:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.bank_account:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.bank_account:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.born_country_region:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.born_country_region:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.citizenship_status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.citizenship_status:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.custom_field:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.date_entered_workforce:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.date_entered_workforce:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.date_of_birth:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.date_of_birth:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.dependent:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.dependent:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.education:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.education:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.email:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.email:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.emergency_contact:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.emergency_contact:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.entry_leave_time:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.gender:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.gender:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.hukou:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.hukou:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.is_disabled:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.is_disabled:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.is_old_alone:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.is_old_alone:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.legal_name:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.legal_name:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.marital_status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.marital_status:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.martyr_family:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.martyr_family:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.national_id.search:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.national_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.national_id:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.nationality:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.nationality:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.native_region:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.native_region:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.passport_number:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.personal_profile:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.personal_profile:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.phone.search:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.phone:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.phone:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.political_affiliation:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.political_affiliation:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.preferred_name:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.race:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.race:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.religion:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.religion:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.resident_tax:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.resident_tax:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.resident_tax_custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.resident_tax_custom_field:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.work_experience:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person.work_experience:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:person:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.direct_leader:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.employee_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.job:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.job_family:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.job_grade:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.job_level:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position.working_hours_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:position:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.abnormal_reason_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.check_in_data:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.company_manual_updated:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.company_sponsored_visa:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.cost_center:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.cost_center:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.flow_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.office_address:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.onboarding_address:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire.withdrawn_reason:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire:check_work_email"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire:complete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire:restore_flow_instance"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire:transform_onboarding_task"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire:transit_tasks"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:pre_hire:withdraw_onboarding"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.actual_probation_end_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.assessment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.custom_field:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.extended_probation_period_duration:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.notes:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.notes:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.probation_expected_end_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.probation_extend_expected_end_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.probation_outcome:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.probation_outcome:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.probation_start_date:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.score:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.self_review:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation.self_review:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:probation:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:security_group:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:work_calendar:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:workforce_detail:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:workforce_detail:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:workforce_plan:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "corehr:workforce_plan_centralized_reporting_project_detail:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.base:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.count:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.data_source:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.department_path:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.external_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.has_child:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.idconvert:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.leader:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.name:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.order_weight:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.organization:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.parent_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:department.status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.active_status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.avatar:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.background_image:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.base:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.data_source:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.department:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.department_path:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.dept_order:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.description:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.dotted_line_leaders:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.email:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.enterprise_email:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.enterprise_email_alias:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.external_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.gender:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.geo:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.geo:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.is_admin:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.is_primary_admin:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.is_resigned:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.leader:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.leader_id:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.mobile:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.name.another_name:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.name.first_name:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.name.last_name:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.name.name:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.resign_time:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.role:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.subscription_ids:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.base.subscription_ids:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.idconvert:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.base_work:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.employment_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.extension_number:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.job_number:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.job_title:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.join_date:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.positions:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.resign_date:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.resign_reason:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.resign_remark:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.resign_type:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.staff_status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.work_country_or_region:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.work_place:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:employee.work.work_station:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:job_title.base:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:job_title.status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:place.base:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "directory:place.status:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:doc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:doc:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.content:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.media:download"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.media:upload"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.subscription"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.subscription:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document:export"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document:import"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:event.document_deleted:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:event.document_edited:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:event.document_opened:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:event:subscribe"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:auth"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:transfer"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.member:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.setting"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.setting:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.setting:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:permission.setting:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:bank_card:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:business_card:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:business_license:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:chinese_passport:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:contract:field_extract"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:driving_license:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:food_manage_license:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:food_produce_license:recoginze"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:health_certificate:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:hkm_mainland_travel_permit:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:id_card:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:resume:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:taxi_invoice:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:train_invoice:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:tw_mainland_travel_permit:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:vat_invoice:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:vehicle_invoice:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "document_ai:vehicle_license:recognize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document.block:convert"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive.metadata:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive.search:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive:version"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive:version:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:export:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file.like:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file.meta.sec_label.read_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file:download"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file:upload"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file:view_record:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "ea_integration_platform:lawfirm_attorney_capacity:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "ehr:attachment:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "ehr:employee:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "event:ip_list"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "financial_access_platform:data:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "helpdesk:all"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "helpdesk:all:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "helpdesk:helpdesk:access"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:advertisement"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:agency"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:agency:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:agency_account"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:agency_account:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:application"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:application:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:attachment"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:attachment:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:auth"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:auth:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:background_check_order"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:background_check_order:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:ehr_import"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:employee"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:employee:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:evaluation:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:exam"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:exam:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:external_application"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:external_application:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:external_offer"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:external_offer:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:external_referral_reward"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:interview"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:interview:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:interviewer"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:interviewer:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:job"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:job.composite_info:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:job:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:job_process:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:job_requirement"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:job_requirement:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:location:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:note"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:note:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:offer"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:offer:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:offer_approval_template:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:offer_schema:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:offer_selection_object"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:questionnaire"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:questionnaire:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:referral"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:referral:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:referral_account"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:referral_account:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:referral_website:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:site"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:site:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:site_application"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:site_application:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:site_job_post:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:subject:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_blocklist"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_blocklist:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_folder"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_folder:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_folder_association"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_tag"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:talent_tag:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:tripartite_agreement"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "hire:tripartite_agreement:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:app_feed_card:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:biz_entity_tag_relation:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:biz_entity_tag_relation:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.access_event.bot_p2p_chat:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.announcement:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.announcement:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.chat_pins:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.chat_pins:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.collab_plugins:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.collab_plugins:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.managers:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.members:bot_access"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.members:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.members:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.menu_tree:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.menu_tree:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.moderation:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.tabs:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.tabs:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.top_notice:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.widgets:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.widgets:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:moderation:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:operate_as_owner"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:datasync.feed_card.time_sensitive:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.group_at_msg:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.group_msg"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.p2p_msg:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.pins:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.pins:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.reactions:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.reactions:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.urgent"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.urgent.status:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.urgent:phone"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.urgent:sms"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:recall"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:send_as_bot"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:send_multi_depts"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:send_multi_users"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:send_sys_msg"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:resource"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:tag:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:tag:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:url_preview.update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:user_agent:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mail:user_mailbox.event.mail_address:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mail:user_mailbox.mail_contact.mail_address:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mail:user_mailbox.mail_contact.phone:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mail:user_mailbox.message.address:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mail:user_mailbox.message.subject:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:company.company_bank_account.account:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:country_region:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:legal_entity"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:legal_entity:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:spend"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:spend:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:vendor"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "mdm:vendor:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "minutes:minutes"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "minutes:minutes:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "moments:moments:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "myai_data:myai_data:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "okr:okr.period:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "okr:okr.period:writeonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "optical_char_recognition:image"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "passport:session:logout"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "passport:session_mask:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "payroll:cost_allocation_plan:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "payroll:cost_allocation_report:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "payroll:external_datasource_configuration:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "payroll:pay_groups:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "payroll:payroll_calculation_item:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:metric:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:metric:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:metric_lib:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:performance"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:performance:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:review_template:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:semester:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:semester_activity:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:semester_activity:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "performance:semester_user:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "personal_settings:status:system_status_operate"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "personal_settings:status:system_status_update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "report:report"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "report:rule:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "report:task:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_item:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_item:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_item:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_schemas:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_schemas:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_schemas:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_schemas:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_source"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_source:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_source:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_source:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:data_source:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:dataset.docs:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:dataset.docs:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:dataset:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:dataset:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "security_and_compliance:audit_log.openapi_log:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "security_and_compliance:device_apply_record:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "security_and_compliance:device_apply_record:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "security_and_compliance:device_record:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "security_and_compliance:device_record:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet.meta:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet.meta:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "slides:presentation:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "slides:presentation:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "slides:presentation:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "slides:presentation:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document.event:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:move"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:shortcut"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:folder:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "spark:directory.user.id_convert:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "speech_to_text:speech"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:attachment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:attachment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:comment"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:comment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:comment:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:comment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:custom_field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:custom_field:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:section:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:section:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task.event_update_tenant:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:writeonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:tasklist:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:tasklist:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "tenant:tenant.domain:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "tenant:tenant.product_assign_info:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "tenant:tenant:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "translation:text"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "trust_party:collaboration.tenant:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "trust_party:collaboration_rule:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "trust_party:collaboration_rule:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:alert:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:export"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:meeting"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:meeting.all_meeting:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:meeting:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:record:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:report:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:reserve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:reserve:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:room"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "vc:room:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "verification:verification_information:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:member:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:member:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:member:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:move"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:setting:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:setting:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:space:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:space:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:space:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:wiki"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:wiki:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "workplace:workplace_using_data:read"</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">    "user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:app:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:field:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:record:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:table:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:view:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "base:view:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "board:whiteboard:node:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "board:whiteboard:node:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:reply"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.event:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar.free_busy:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "calendar:calendar:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:contact.base:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.base:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user.employee_id:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "contact:user:search"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.comment:update"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.media:download"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document.media:upload"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docs:document:export"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "docx:document:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:drive.metadata:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file:download"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "drive:file:upload"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat.members:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:chat:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.group_msg:get_as_user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.p2p_msg:get_as_user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message.send_as_user"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "im:message:readonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "offline_access"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:docs:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "search:message"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet.meta:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "sheets:spreadsheet:write_only"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:delete"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:move"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "space:document:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:comment:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:comment:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:task:writeonly"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:tasklist:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "task:tasklist:write"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:copy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:move"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:node:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:space:read"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:space:retrieve"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "wiki:space:write_only"</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></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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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 class="collapsed-lines"></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/79/7911408c43c19df210cc5b47c770239c7bdbf14b8bdd27750f95428c5f490332.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>确认导入权限无误后，点击 <strong>申请开通</strong> 按钮。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ff/ff1fb45cb7a903859cf2ba9685adb031d99e313094beee0ab1ea6c586bd46380.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>“应用身份权限”可访问的数据范围的设置保持默认 &quot;<strong>与应用的可用范围一致</strong>&quot; ，点击 <strong>确认</strong> 完成操作。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/28/288020f6ee5d4740826d9ab466f330143fb99713c1f6c0c4bf8e54b10c8ad896.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
</ol>
<h3>6.2 插件安装完毕运行后，报 cannot find module xxx</h3>
<ul>
<li>
<p><strong>原因</strong>：系统没有安装插件的依赖（可能是安装被中断或权限问题）</p>
</li>
<li>
<p><strong>解决方法</strong>：进入插件安装目录，运行 <code>npm install</code>。</p>
</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/62/62b821dc3b3059ecb81b73d8c5e952c6f4633724eac41b47f8956b4f1a95cee3.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>6.3 升级到 OpenClaw 3.2 版本上无法正常调用工具</h3>
<p>这个 OpenClaw 版本默认把新 agent 的工具权限关闭。修复方式为在 <code>openclaw.json</code> 找到并修改为下面这段内容：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" 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-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "tools"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "profile"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"full"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "sessions"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "visibility"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"all"</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></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><h3>6.4 飞书官方插件与 OpenClaw 社区原有插件有何区别</h3>
<p>飞书官方插件，能以用户身份读写消息、文档等，体验更丝滑；以下对比由 AI 整理，供参考。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/32/3287bba12c29bb46b8f1e6b92bb5cc83f3e95e9743b6fcfd453e86e0602cc59f.jpeg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>6.5 升级到 openclaw 2026.3.22 有问题</h3>
<p>openclaw2026.3.22 有 break change，本插件 2026.3.25 版本兼容。</p>
<p>可直接运行 <code>npx @larksuite/openclaw-lark update</code> 进行升级；（推荐）</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:#4078F2;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> @larksuite/openclaw-lark</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>如果没有成功升级到 2026.3.25 版本，可以指定升级脚本进行升级：</p>

<h3>6.6 升级到 openclaw 2026.3.28 有问题</h3>
<p>本插件 2026.3.29 版本兼容，如果升级不成功，可以指定升级脚本进行升级：</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:#4078F2;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> @larksuite/openclaw-lark</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --tools-version</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1.0.33</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>7. 如何在飞书插件中配置 OpenClaw 关联多个飞书机器人，对应不同 Agent</h2>
<div class="hint-container warning">
<p class="hint-container-title">这个是很适合进行付费定制配置的，可以找我付费配置。（500¥）</p>
<p><strong>非必要不要尝试，目前 bug 居多！很多飞书通讯，直接奔溃！</strong></p>
<p><strong>快捷方法</strong>：</p>
<ol>
<li>创建新的飞书机器人，用于关联到新的账号上。一键创建一个OpenClaw 机器人：<a href="https://open.feishu.cn/page/openclaw?form=multiAgent" target="_blank" rel="noopener noreferrer">立即创建</a></li>
<li>告诉 AI 你想创建一个怎样的新 Agent，以及这个 Agent 关联的飞书账号是什么，并将操作指南发给 OpenClaw  请他自己完成对应配置：<a href="https://bytedance.larkoffice.com/docx/WNNXdhKxmo8KDJxMM9dc0GD5nFf" target="_blank" rel="noopener noreferrer">如何在飞书插件中配置 OpenClaw 关联多个飞书机器人，对应不同Agent</a></li>
</ol>
</div>
<p><strong>稍微有些进阶，可以考虑后续有需要再研究。先熟悉 OpenClaw 的操作、逻辑之后接触。</strong></p>
<p>OpenClaw 支持在同一台机器上配置多个飞书机器人账户，实现：</p>
<ul>
<li><strong>账户隔离</strong>：每个飞书机器人独立管理，互不干扰；</li>
<li><strong>路由分发</strong>：不同飞书机器人的消息路由到不同的 Agent（工作空间）；</li>
<li><strong>灵活控制</strong>：每个账户可以有不同的访问策略、技能权限等；</li>
</ul>
<h3>7.1 配置方式</h3>
<ol>
<li>
<p><strong>直接编辑配置文件</strong>：配置文件路径：<code>~/.openclaw/openclaw.json</code></p>
</li>
<li>
<p>创建新的飞书机器人，用于关联到新的账号上。一键创建一个OpenClaw 机器人：<a href="https://open.feishu.cn/page/openclaw?form=multiAgent" target="_blank" rel="noopener noreferrer">立即创建</a></p>
</li>
<li>
<p><strong>完整示例</strong>：</p>
<div class="language-json line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="json" style="--vp-collapsed-lines:15;--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-json"><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">  // 定义多个 agent（隔离的工作空间和记忆）</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "agents"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "list"</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">        "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:#E45649;--shiki-dark:#E06C75">        "name"</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:#E45649;--shiki-dark:#E06C75">        "default"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "workspace"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"~/.openclaw/workspace-main"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "model"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "primary"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ark/doubao"</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 style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"work"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "name"</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:#E45649;--shiki-dark:#E06C75">        "workspace"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"~/.openclaw/workspace-work"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "model"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "primary"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ark/deepseek"</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 style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"support"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "name"</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:#E45649;--shiki-dark:#E06C75">        "workspace"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"~/.openclaw/workspace-support"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "model"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">            "primary"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ark/gpt"</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 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:#E06C75">  "session"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "dmScope"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"per-account-channel-peer"</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 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:#E06C75">  "channels"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "threadSession"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "replyMode"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"auto"</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">      // 默认机器人配置，必须要有！！</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_xxx"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"xxx"</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">      "accounts"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "default"</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:#E06C75">        "work"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_work_yyy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"work_secret_yyy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "botName"</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:#E45649;--shiki-dark:#E06C75">          "dmPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"allowlist"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "allowFrom"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ou_5b990e213988b9bcf396f955a50b2a22"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ou_1234567890abcdef"</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 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:#E45649;--shiki-dark:#E06C75">        "support"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "appId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"cli_support_zzz"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "appSecret"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"support_secret_zzz"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "botName"</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:#E45649;--shiki-dark:#E06C75">          "dmPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"open"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "allowFrom"</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">        }</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:#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:#E06C75">      "groups"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "*"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> },</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "oc_83e1c0d069b94efc09ad22e05bc06365"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"open"</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">        "oc_dev_123456789"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "requireMention"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"allowlist"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          "allowFrom"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ou_dev_001"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ou_dev_002"</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 style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      </span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "groupPolicy"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"allowlist"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "groupAllowFrom"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">        "ou_user1"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">        "ou_user2"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">        "oc_chat1"</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 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:#E06C75">  "bindings"</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:#E45649;--shiki-dark:#E06C75">"agentId"</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 style="--shiki-light:#E45649;--shiki-dark:#E06C75">"match"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"accountId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"default"</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:#E45649;--shiki-dark:#E06C75">"agentId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"work"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"match"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"accountId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"work"</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:#E45649;--shiki-dark:#E06C75">"agentId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"support"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"match"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"accountId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"support"</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">      "agentId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"work"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "match"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "peer"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"kind"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"direct"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ou_owner_user"</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 style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "agentId"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"support"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "match"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"feishu"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        "peer"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: { </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"kind"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"group"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">"id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"oc_support_group_123"</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 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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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 class="collapsed-lines"></div></div></li>
</ol>
<h3>7.2 路由规则优先级</h3>
<p>当收到飞书消息时，OpenClaw 按以下顺序匹配路由：</p>
<ol>
<li><strong>精确匹配</strong>：<code>peer.kind</code> + <code>peer.id</code>（特定用户/群组）</li>
<li><strong>父级匹配</strong>：线程继承</li>
<li><strong>账户匹配</strong>：<code>accountId</code></li>
<li><strong>渠道匹配</strong>：<code>channel</code> + <code>accountId: &quot;*&quot;</code></li>
<li><strong>默认 Agent</strong>：<code>agents.list[].default</code> 或第一个 agent；</li>
</ol>
<h3>7.3 常用命令</h3>
<p>| 命令                       | 说明                 |
| :</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-15T10:21:50.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">06-OpenClaw 全网最全案例！一句话复刻案例！</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/06-openclaw-case-studies.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/06-openclaw-case-studies.html"/>
    <updated>2026-08-16T15:12:01.071Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>在这里，我将带你探索如何将 OpenClaw 的强大能力无缝接入飞书工作流。无论你是刚刚接触的探索者，还是希望将业务全面自动化的极客玩家，这里都有你需要的弹药库。</p>
<p>【全网最全部署教程】：<a href="/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html" target="_blank"><strong>🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</strong></a></p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>在这里，我将带你探索如何将 OpenClaw 的强大能力无缝接入飞书工作流。无论你是刚刚接触的探索者，还是希望将业务全面自动化的极客玩家，这里都有你需要的弹药库。</p>
<p>【全网最全部署教程】：<a href="/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html" target="_blank"><strong>🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</strong></a></p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-15T09:45:46.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">05-OpenClaw 常见疑惑/问题</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/05-OpenClaw-FAQ.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/05-OpenClaw-FAQ.html"/>
    <updated>2026-08-16T15:12:01.072Z</updated>
    <summary type="html"><![CDATA[<h2>FAQ 1：飞书提问不回答</h2>
<p>如果你在养龙虾一段时间后，发现飞书发信息 OpenClaw 没有同步回答。可以考虑去 OpenClaw WebUI 把【会话】删除，重新对话试一试。</p>
<details class="hint-container details"><summary>问题图片</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3c/3c65d228e7fc1eefa235bd0e395c7b1e60928589f000aa822f3e0f38cf6afdc8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/0d/0ddbc4bf5aa5ccd1a785177e920313c2e9717fd110f4bac5001204ee2c52dee6.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>FAQ 1：飞书提问不回答</h2>
<p>如果你在养龙虾一段时间后，发现飞书发信息 OpenClaw 没有同步回答。可以考虑去 OpenClaw WebUI 把【会话】删除，重新对话试一试。</p>
<details class="hint-container details"><summary>问题图片</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3c/3c65d228e7fc1eefa235bd0e395c7b1e60928589f000aa822f3e0f38cf6afdc8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/0d/0ddbc4bf5aa5ccd1a785177e920313c2e9717fd110f4bac5001204ee2c52dee6.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<ul>
<li>
<p><strong>方法一</strong>：</p>
<details class="hint-container details"><summary>解决图片</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8b/8bfc9c9ee7ff4daa2b0855ad67a7867fdbfb688d866c58242ddad3b65ebb8f6a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
</li>
<li>
<p><strong>方法二</strong>：更换更聪明的大模型；（发现：Gemini 2.5 Pro 很笨，Gemini 3.1 Pro Preview 还可以）</p>
</li>
</ul>
<h2>FAQ 2：OpenClaw 为什么只会回复消息？</h2>
<p>OpenClaw 本地要是依赖大模型的能力，想要 OpenClaw 拥有图片生成的能力、视频生成能力，需要你背后对接的大模型支持！</p>
<h2>FAQ 3：入局过早？（随笔写下，语序待改进）</h2>
<p>越早入局，在这件还未成熟、复杂、完善的情况下，小白进入会更轻松一些。因为涉及的内容没有太多，而越到后期就会越难加入。但这也只是一个方面之一，有可能有些新技术。到后期，小白入门也很轻松。但那时候你也失去了一些，早期市场开拓的机遇！如同，早期父辈赚钱就有很多机遇，现在是方便、富裕了，但是诸多机遇没了。2026-03-11 08:24:21</p>
<h2>FAQ 4：OpenClaw 自己升级没反应？</h2>
<p>有些人会让 OpenClaw 自己升级，这看起来没有问题。随后，就遇到：OpenClaw 不回复或者异常！</p>
<p>但是这里面是有一个逻辑问题的，你让 OpenClaw 自己升级，那么它知道怎么升级吗？升级的方法有多种：</p>
<ul>
<li>Web UI 界面直接点击升级按钮；</li>
<li>使用终端输入命令进行升级；</li>
</ul>
<p>这其中命令升级的方法有很多，例如：</p>

<p>上面的流程看起来没问题，但是前提是【<strong>人</strong>】在操作，而如果是 OpenClaw 呢？在执行：<code>openclaw gateway stop</code> 的时候，你的龙虾直接停止了，怎么可能可以执行后续的命令呢？何况，你对接的大模型不一定那么聪明使用下面的方法：</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> doctor</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> doctor</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fix</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</span><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></div><p>这样的操作，就避免了【<strong>OpenClaw 真正停止</strong>】。</p>
<p><strong>现在说解决方法：当你不小心让龙虾升级，但是龙虾不回复怎么办？</strong></p>
<p>去终端执行如下命令：</p>
<blockquote>
<p>下面👇的指令是凭记忆编写，需要读者自己进行操作验证。欢迎评论区反馈～</p>
</blockquote>
<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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> doctor</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> doctor</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --fix</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> gateway</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</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:#4078F2;--shiki-dark:#61AFEF">npx</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> @larksuite/openclaw-lark</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> update</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><details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-14T20:24:08.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">04-OpenClaw Skills全家桶</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/04-OpenClaw-Skills.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/04-OpenClaw-Skills.html"/>
    <updated>2026-08-16T15:12:01.073Z</updated>
    <summary type="html"><![CDATA[<div class="hint-container tip">
<p class="hint-container-title">ChangLog</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 2026-03-13 15:36:31：开始创建，正式编写教程；</label></li>
</ul>
</div>]]></summary>
    <content type="html"><![CDATA[<div class="hint-container tip">
<p class="hint-container-title">ChangLog</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 2026-03-13 15:36:31：开始创建，正式编写教程；</label></li>
</ul>
</div>
<p>你好，我是悦创。</p>
<p>前面我先发布了全网最全的：OpenClaw 安装部署教程，涵盖：Windows、Mac 系统。<s>Mac 系统目前还配备对应的视频教程，Windows 视频教程类型，看粉丝是否需要，有需要则找时间录制。</s></p>
<p>Windows 最新部署教程已经发布，欢迎去观看～<a href="https://www.bilibili.com/video/BV1YVwkzhExP/" target="_blank" rel="noopener noreferrer"><strong>【电影级/1小时+】全网最强 OpenClaw Windows 部署终极指南</strong></a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c9/c99acdb11183ad6edbc1f99f7fc7750fcefc3051afeab8d57d5eb8a29facb67c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>1. 我发布的</h2>
<p>Skills 主页：<a href="https://clawhub.ai/u/AndersonHJB" target="_blank" rel="noopener noreferrer">https://clawhub.ai/u/AndersonHJB</a></p>
<p>| 序号 | 名称                  | 链接                                                         | 描述                                |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-13T15:36:31.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">创业第一次会议：目标确认与投资资金规划</title>
    <id>https://bornforthis.cn/education-entrepreneurship/startup-goals-and-funding.html</id>
    <link href="https://bornforthis.cn/education-entrepreneurship/startup-goals-and-funding.html"/>
    <updated>2026-08-16T15:12:01.076Z</updated>
    <summary type="html"><![CDATA[<h2>0. 会议目标</h2>
<table>
<thead>
<tr>
<th>序号</th>
<th>目标</th>
<th>完成</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>教育行业（少儿编程、思维、大模型、学科类教学）、表达各自的想法</td>
<td></td>
<td></td>
</tr>
<tr>
<td>02</td>
<td>了解具体要做的事情，估计合适的<strong>预算</strong>（预算构成）</td>
<td></td>
<td></td>
</tr>
<tr>
<td>03</td>
<td>说明各自可以胜任的工作</td>
<td></td>
<td></td>
</tr>
<tr>
<td>04</td>
<td>明里暗里招收学科类补课</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>0. 会议目标</h2>
<p>| 序号 | 目标                                                         | 完成 | 备注 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-08T21:06:43.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">02-🦞 OpenClaw 是什么</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/01-openclaw-what-is.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/01-openclaw-what-is.html"/>
    <updated>2026-08-16T15:12:01.078Z</updated>
    <summary type="html"><![CDATA[<div style="text-align:center">
<h2>零基础看懂 OpenClaw：如何免费“雇佣”一个全能 AI 专属管家？</h2>
</div>
<p>你好，我是悦创。</p>
<p><strong>💡 学完本文你能收获什么？</strong></p>
<ul>
<li>听懂技术大佬们口中的 “OpenClaw” 到底是个啥。</li>
<li>清楚地知道它能帮你干什么，不能干什么。</li>
<li>像做心理测试一样，判断自己到底需不需要折腾这个工具。</li>
</ul>
<h2>1. 一句话听懂 OpenClaw：它是“住”在你家的 AI 员工</h2>
<p>如果把平时我们在网页上用的 ChatGPT、Kimi 比作<strong>“街边的咨询顾问”</strong>（你有问题去店里找他，聊完就走），那么 OpenClaw 就是你直接雇回家、<strong>“包吃包住的全职管家”</strong>。</p>]]></summary>
    <content type="html"><![CDATA[<div style="text-align:center">
<h2>零基础看懂 OpenClaw：如何免费“雇佣”一个全能 AI 专属管家？</h2>
</div>
<p>你好，我是悦创。</p>
<p><strong>💡 学完本文你能收获什么？</strong></p>
<ul>
<li>听懂技术大佬们口中的 “OpenClaw” 到底是个啥。</li>
<li>清楚地知道它能帮你干什么，不能干什么。</li>
<li>像做心理测试一样，判断自己到底需不需要折腾这个工具。</li>
</ul>
<h2>1. 一句话听懂 OpenClaw：它是“住”在你家的 AI 员工</h2>
<p>如果把平时我们在网页上用的 ChatGPT、Kimi 比作<strong>“街边的咨询顾问”</strong>（你有问题去店里找他，聊完就走），那么 OpenClaw 就是你直接雇回家、<strong>“包吃包住的全职管家”</strong>。</p>
<p>它不仅仅是一个用来聊天的对话框，而是一个直接运行在你自己的电脑（或你租的云服务器）上的智能程序。</p>
<p><strong>这位管家有什么与众不同的本事？</strong></p>
<ol>
<li>💬 <strong>它能潜入你的朋友圈</strong>：它可以直接绑定你的飞书、微信、Telegram。你不需要单独打开个什么 App，在平时聊天的群里 <code>@</code> 它一下，它就出来干活了。</li>
<li>🖥️ <strong>它长了“手脚”</strong>：网页版的 AI 只能“动嘴”跟你聊天。而 OpenClaw 能帮你真正地操作电脑——帮你建文件夹、整理文档、甚至自己打开浏览器去查资料。</li>
<li>🧠 <strong>它有专属记事本</strong>：它有长期记忆，记得你的性格、喜好、甚至你们上个月聊过的工作细节。它越用越懂你。</li>
</ol>
<h2>2. OpenClaw vs 普通网页 AI：到底强在哪？</h2>
<p>为了让你更直观地理解，我们来做个简单的对比：</p>
<p>| <strong>比较项目</strong> | <strong>普通网页版 AI (如 ChatGPT 网页版)</strong> | <strong>OpenClaw 专属管家</strong>                  |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-07T13:01:16.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html"/>
    <updated>2026-08-16T15:12:01.080Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9c/9cab29c4a34db7629e82e67cb26af675517d02b3f25a7bc3193b3e3645148652.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">ChangeLog</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> <strong>欢迎评论区，提供各种情况、成果！欢迎把本文分享出去，我需要被大家发现！谢谢！</strong></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 可以添加微信：<strong>Jiabcdefh</strong>，加入微信交流群进行交流！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 2026-03-06 19:46:48：正式开始写全网最全教程。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 2026-03-06 19:48:47：参考飞书提供的教程，不过主线在于我的实际编写与测试。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 2026-03-09 13:28:32：完成 Mac 安装的完成教程、飞书的逐步配置！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 2026-03-10 10:47:28：更改文章名称，更新 Windows 完整教程、增加简易目录，便于小白快速定位。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 2026-03-11 18:49:03：正式完成 Windows 系列教程（包含 WSL 方法），开启视频教程录制！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 2026-03-13 10:24:30：更新最新飞书官方插件教程，视频各平台均已发布！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 2026-03-14 20:24:06：添加 OpenClaw 的相关问题，点击阅读：<a href="/column/Python-Programming-Course/P15-OpenClaw/05-OpenClaw-FAQ.html" target="_blank"><strong>OpenClaw 常见疑惑/问题</strong></a></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 2026-03-15 09:50:26：添加：<a href="/column/Python-Programming-Course/P15-OpenClaw/06-openclaw-case-studies.html" target="_blank"><strong>OpenClaw 全网最全案例！一句话复刻案例！</strong></a></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 2026-03-16 21:38:41：改进 Windows 教程飞书配置；（至于：为什么要对接飞书，后面一期视频单独说，敬请期待！（欢迎全网关注我））</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> 2026-03-16 21:52:24：更新与简化教程！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 2026-03-17 16:29:08：更新 Windows 最新安装命令！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-13" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-13"> 2026-03-17 23:50:02：更新 Windows 安装命令；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-14" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-14"> 2026-03-21 22:36:01：添加视频教程，和资助、收费。添加：提示：不要被割韭菜！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-15" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-15"> 2026-03-22 21:07:30：更新：让你的 Mac 终端，更好看、更好用。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-16" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-16"> 2026-03-24 10:27:39：折叠无用的教程、剔除疑难杂症（独立新的一篇）、删除 homebrew 国内源（遗弃），添加 Mac 一键卸载命令。添加安装失败的解决方法。；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-17" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-17"> 2026-04-10 14:24:47：收集：<strong>有读者说每次都会有视频播放的声音，但是经过测试默认都是静音播放，所以大家看教程的时候有没有听见声音呢？评论区回答！</strong></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-18" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-18"> 2026-04-15 11:15:47：视频教程，替换成链接代替；</label></li>
</ul>
</div>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9c/9cab29c4a34db7629e82e67cb26af675517d02b3f25a7bc3193b3e3645148652.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container tip">
<p class="hint-container-title">ChangeLog</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> <strong>欢迎评论区，提供各种情况、成果！欢迎把本文分享出去，我需要被大家发现！谢谢！</strong></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 可以添加微信：<strong>Jiabcdefh</strong>，加入微信交流群进行交流！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 2026-03-06 19:46:48：正式开始写全网最全教程。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 2026-03-06 19:48:47：参考飞书提供的教程，不过主线在于我的实际编写与测试。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 2026-03-09 13:28:32：完成 Mac 安装的完成教程、飞书的逐步配置！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 2026-03-10 10:47:28：更改文章名称，更新 Windows 完整教程、增加简易目录，便于小白快速定位。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 2026-03-11 18:49:03：正式完成 Windows 系列教程（包含 WSL 方法），开启视频教程录制！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 2026-03-13 10:24:30：更新最新飞书官方插件教程，视频各平台均已发布！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 2026-03-14 20:24:06：添加 OpenClaw 的相关问题，点击阅读：<a href="/column/Python-Programming-Course/P15-OpenClaw/05-OpenClaw-FAQ.html" target="_blank"><strong>OpenClaw 常见疑惑/问题</strong></a></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 2026-03-15 09:50:26：添加：<a href="/column/Python-Programming-Course/P15-OpenClaw/06-openclaw-case-studies.html" target="_blank"><strong>OpenClaw 全网最全案例！一句话复刻案例！</strong></a></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 2026-03-16 21:38:41：改进 Windows 教程飞书配置；（至于：为什么要对接飞书，后面一期视频单独说，敬请期待！（欢迎全网关注我））</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> 2026-03-16 21:52:24：更新与简化教程！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 2026-03-17 16:29:08：更新 Windows 最新安装命令！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-13" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-13"> 2026-03-17 23:50:02：更新 Windows 安装命令；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-14" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-14"> 2026-03-21 22:36:01：添加视频教程，和资助、收费。添加：提示：不要被割韭菜！</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-15" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-15"> 2026-03-22 21:07:30：更新：让你的 Mac 终端，更好看、更好用。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-16" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-16"> 2026-03-24 10:27:39：折叠无用的教程、剔除疑难杂症（独立新的一篇）、删除 homebrew 国内源（遗弃），添加 Mac 一键卸载命令。添加安装失败的解决方法。；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-17" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-17"> 2026-04-10 14:24:47：收集：<strong>有读者说每次都会有视频播放的声音，但是经过测试默认都是静音播放，所以大家看教程的时候有没有听见声音呢？评论区回答！</strong></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-18" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-18"> 2026-04-15 11:15:47：视频教程，替换成链接代替；</label></li>
</ul>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5f/5fa847423f8ea5b09c3b90c14825228367fed37d0c3b33ec6873c2cb85ae20e3.png" alt="欢迎赞助·服务器费用时不时欠费停机～" tabindex="0" loading="lazy"><figcaption>欢迎赞助·服务器费用时不时欠费停机～</figcaption></figure>
<ul>
<li>
<p>Mac 部署视频教程：<a href="https://www.bilibili.com/video/BV1pbcCzjEsk" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1pbcCzjEsk</a></p>
</li>
<li>
<p>Windows 部署教程：<a href="https://www.bilibili.com/video/BV1YVwkzhExP" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1YVwkzhExP</a></p>
</li>
</ul>
<p>你好，我是悦创。</p>
<p><strong>本教程会持续更新，且是市面最全的教程！其次，小白、懒、省心、bug 的人，可以付费找我安装！微信：Jiabcdefh</strong></p>
<ul>
<li>
<p><strong>OpenClaw 是什么</strong>：<strong>OpenClaw</strong> 是一款开源的个人 <strong>AI Agent</strong> 系统，可以运行在你的个人电脑或服务器上。</p>
</li>
<li>
<p><strong>为什么要在飞书里使用 OpenClaw</strong>：<strong>你说一句话，它就能伸出“钳子”，直接在飞书里帮你把活儿干了！</strong></p>
<p>此次飞书推出了 <strong>OpenClaw 飞书官方插件</strong> 能让你的 OpenClaw 以你的身份更好地调用飞书的各类能力，包括了解群聊和文档中的所有信息、写文档、改文档、帮你发消息、约日程、创建多维表格等。</p>
<p>此外，相比于 Telegram 等国外平台，飞书是国内的平台，有中文的界面、文档和客服，更容易上手；目前国内的 OpenClaw 用户，绝大多数都选择了接入飞书，使用人数更多，生态更好。</p>
<p>相比于国内的其他平台，飞书的开放能力更强，能带来更好的体验、获取更多工作中必要的上下文，玩法更多。</p>
</li>
</ul>
<div class="hint-container tip">
<p class="hint-container-title">付费安装价格表</p>
<p><strong>找别人付费安装，还不如找我来的靠谱！欢迎把我推荐出去，谢谢～</strong></p>
<ul>
<li><strong>基础安装</strong>：500¥，包含：OpenClaw 基础安装➕对接智谱大模型➕对接 Telegram 或 Whatsapp、飞书；</li>
<li><strong>彻底卸载</strong>：200¥，OpenClaw 相关彻底卸载；</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/60/6079f52e864ccadfef773a7b00f09ac3e197e719f51b237ebbe544e7aa31543e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</div>
<div class="hint-container tip">
<p class="hint-container-title">提示：不要被割韭菜</p>
<p>智谱和诸多大模型有免费额度，这种就是拿免费额度赚钱的。要是有想要购买冲动的，直接找我。我卖智谱给你哈哈哈哈～</p>
<details class="hint-container details"><summary>聊天记录</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2a/2af74dcb8dd0358bd94cc97ff33b152358568c354d10349f57cfbb0062035860.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/6e/6e3a73b5ff423bf064ca4be6185674e3d3167446921d708eb9dd6d6e4f0c1d18.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
</div>
<details class="hint-container details"><summary>⚠️ 重要安全与风险提示（使用前必读）「有需要可以阅读」</summary>
<h3>🔴 核心风险：</h3>
<p>这个插件通过飞书接口连接了你的工作数据——消息、文档、日历、联系人，AI 能读到的东西理论上就有泄露的可能。虽然我们做了安全防护，但 AI 系统本身还不够成熟稳定，不能保证万无一失。</p>
<p><strong>🔴 强烈建议：现阶段切勿使用公司/企业飞书账号接入！请务必优先使用个人账号进行体验和测试。</strong></p>
<h3>📌 其他操作风险</h3>
<ul>
<li><strong>AI 并不完美，可能存在“幻觉”：</strong> 它有时会误解您的意图，或者生成看似合理但不准确的内容。</li>
<li><strong>部分操作不可逆转：</strong> 例如，AI 代发的飞书消息是以您的名义发出的，发出后即成事实。</li>
<li><strong>应对建议：</strong> 对于涉及发送、修改、写入等重要操作，<strong>请务必做到“先预览，再确认”</strong>，切勿让 AI 处于完全脱离人工干预的“全自动驾驶”状态。</li>
</ul>
</details>
<h2>0. 选择安装方式</h2>

<p>在线的部署都是比较简单，只要花钱即可。本地部署是我们主线，后期还会编写调用本地的大模型教程。（花钱都简单）</p>
<p><strong>个人建议</strong>：各大厂商都为了拉人，现在才便宜，只有到你们离不开他们才是他们割韭菜的开始！所以，最好自己安装！！！</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/29/291b4b513376d37fdb361dbf62771edf6d395aba17dac521835e81087bcd5f45.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>右侧有大纲</summary>
<h2>0. 目录</h2>
<ul>
<li>
<p><a href="#_1-%E2%9A%99%EF%B8%8F%E3%80%8Cmac%E3%80%8D%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2-openclaw-%E6%8C%87%E5%8D%97"><strong>1. ⚙️「Mac」本地部署 OpenClaw 指南</strong></a></p>
</li>
<li>
<p><a href="#_2-%E3%80%8Cwindows%E3%80%8D%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2-openclaw"><strong>2. 「Windows」本地部署 OpenClaw</strong></a></p>
<ul>
<li><a href="#_2-1-%E6%96%B9%E6%B3%95%E4%B8%80-%E5%B8%B8%E8%A7%84%E5%AE%89%E8%A3%85-openclaw"><strong>2.1 方法一：常规安装 OpenClaw</strong></a></li>
<li><a href="#_2-2-%E6%96%B9%E6%B3%95%E4%BA%8C-wsl-%E5%AE%89%E8%A3%85-openclaw"><strong>2.2 方法二：WSL 安装 OpenClaw</strong></a></li>
</ul>
<p>:::</p>
</li>
</ul>
<h2>1. ⚙️「Mac」本地部署 OpenClaw 指南</h2>
<h3>1.1 前置学习｜了解什么是终端</h3>
<ul>
<li>
<p><strong>什么是终端</strong>：<strong>终端</strong>是 MacOS 环境下安装 OpenClaw 的必要软件，是 Mac 自带的一个程序，它让你可以用文字命令直接控制电脑，而不是用鼠标点图标。</p>
</li>
<li>
<p><strong>怎么找到终端</strong>：</p>
<ul>
<li><strong>方法一：程序坞 &gt; 启动台 &gt; 其他 &gt; 终端</strong>；</li>
<li><strong>方法二：打开程序坞搜索“终端”</strong>；</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/95/950b5ea5cbd9a758e751e95bae18062431d0d9b839c38c2eba2e0a693d3f5717.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p><strong>如何使用终端</strong>：打开“<strong>终端</strong>” &gt; 输入指令 &gt; 点击“<strong>回车</strong>”确认；</p>
</li>
</ul>
<h3>1.2 环境准备</h3>
<h4>1.2.1 基础环境准备</h4>
<p>Mac 电脑，打开终端执行如下命令：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">xcode</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">select </span><span style="--shiki-light:#50A14F;--shiki-dark:#FFFFFF">--</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">install</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>输入之后：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/26/26be4a4dc9a53613071bb2eebf6cdd09e7e653a3e50cda2f6818fe5f8d1e7609.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/1a/1a4c0d915702887684fb2196f9225591e3e05678b7d9761c45c4491903310c7d.png" alt="image-20260308163538905" tabindex="0" loading="lazy"><figcaption>image-20260308163538905</figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77047e173d1048fe264fb264df751babe0e3259db8f3ed84c849010f2f892cca.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a1/a17c87b73aadb2dac0a0c2e59ee223e282d61e976821274b4bc4bb7cb34742ce.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这样就成功安装了必备的一些开发工具，以及后续安装会使用到软件。</p>
<h4>1.2.2 homebrew 安装</h4>
<p>输入如下命令进行安装：</p>

</details>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f2/f2adafb52fb203c67d65fa1b3a448b595913d97540e3a98883eee7293e037adf.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8d/8dc01e40c37a93dca27e5a5b0684660e5545724896cf73ec11ca9df860ecc89e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>密码输入完成后，按回车（Enter）。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/37/376bc20c4d64dc4fdb8b534c4ca7792062f88ef7ad211811a7d57331902e51ea.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>安装成功如下图：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/74/740318522ae90eab97e5787f2a0b0f44a88b80928eb783f0b87a187eb5e1e5c8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>出现上图，则表明安装成功。如果安装成功且出现上图中的提示，则需要复制执行。（也就是，一行一行复制。如何一行一行命令行执行）</p>
<p><strong>注意</strong>：没提示，则不用执行。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/db/db5f34e212fe716a4bb5e5ff86255ff613ed3bf32e93408e273bde27ea551585.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>必须操作</strong>：关闭所有终端，重启开启终端，我们安装的 brew 才会生效。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/7d/7d93199796078ef7090eb4f136f6927eacff8fda90151a0b5b0da2a2bb50800f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>如果安装失败，或者安装过久。进行下一步安装，之后再尝试。</strong></p>
<details class="hint-container details"><summary>遗弃……</summary>
<h4>1.2.3 安装 SwitchHosts</h4>
<p>安装包从百度网盘进行下载，链接：通过网盘分享的文件：<a href="https://pan.baidu.com/s/1bXB2tEylfUzbpuLmTrMTAg?pwd=yq6i" target="_blank" rel="noopener noreferrer">https://pan.baidu.com/s/1bXB2tEylfUzbpuLmTrMTAg?pwd=yq6i</a>，提取码: yq6i。</p>
<p><strong>正式安装前，安装百度网盘中的梯子。AI悦创的粉丝，享有安装网络辅助福利。（关注➕一键三连➕评论，后找我！）</strong></p>
<ul>
<li>公众号：AI悦创；</li>
<li>本篇文章：点赞、收藏、评论；</li>
<li>转发朋友圈或 300+ 人群中进行推荐；</li>
<li><strong>注意</strong>：不定期福利，不要被拉黑名单！只提供福利，不提供🪜的任何答疑与收费！</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f2/f2194032319ce8fc5f0f273a49a43b2790e8e434e942aa928b5ed39f06272ad7.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ul>
<li>
<p>Mac 系统只需要双击，即可解压。</p>
</li>
<li>
<p>随后，直接拖拽到【应用程序】：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2f/2f42603c3f20db60dfaa2fb74bdd13be4dba17aa938d176ec506bcc805dcae47.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>运行 SwitchHosts，新建：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a8/a8d5bd7c9808f974e09c3add47cd7494424bb8a783699f330a74d1504e308994.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c3/c3911df7512041715843b467843b5b403f4fb2312bd2c6647d3a44b7f608237a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
</ul>
</details>
<h4>1.2.3 安装梯子</h4>
<p>安装包从百度网盘进行下载，链接：通过网盘分享的文件：<a href="https://pan.baidu.com/s/1bXB2tEylfUzbpuLmTrMTAg?pwd=yq6i" target="_blank" rel="noopener noreferrer">https://pan.baidu.com/s/1bXB2tEylfUzbpuLmTrMTAg?pwd=yq6i</a>，提取码: yq6i。</p>
<p>AI悦创的粉丝，享有安装网络辅助福利（<strong>免费</strong>的订阅链接 30 天）。（关注➕一键三连➕评论，后找我！）</p>
<p>梯子正常使用后，再尝试安装 homebrew。代理记得安装 Tun 模式并开启：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d8/d85ccb3b50eec43fd6e6f8ea05bfbadad232cdffa56cd548079c08516ab2ece8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8d/8d0cd90e937eae0e9fe7c005baa321f93f994155a26086ae9dcdc3a26c39dd79.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e4/e4f270f0f025806a729cd1f93f64565a4e4eb430767730ab2fc8ccebb8945595.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/60/60990043f3bf01ffe6a9a6aea7c273d653cfde70e6c887c83b034250ab76f5d9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>接下来，重新输入安装命令测试：</p>

<p>(<strong>安装成功的，则不用再次安装！</strong>)</p>
<h4>1.2.4 进一步验证 brew</h4>
<p>进一步验证 brew 安装是否成功，再打开一个全新的终端，输入 brew 回车验证：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/49/49f8ea85ed152df0b89f49ede61c25fc27e5003897ef7f69a9864be8d2755227.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>出现图片中的内容，表明安装成功。</p>
<h3>1.3 安装 NodeJs</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:#4078F2;--shiki-dark:#61AFEF">brew</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> node</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/08/0812dfc0fb7c4aed25e8b251293226d02852600caf504d08dfaed42207fa1b67.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>如下图片，则表明安装成功：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ef/ef61b21e75cb060412c5c8fb5adfdd156edf889c50630434eea68f70824a7e26.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>1.4 安装 git/改进终端</h3>
<p>git 也是需要的，我们前面【基础环境准备】使用 <code>xcode-select --install</code> 命令，已经包含 git。</p>
<div class="hint-container warning">
<p class="hint-container-title">这两个命令安装，可以让终端更好看、更好用！</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:#4078F2;--shiki-dark:#61AFEF">brew</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> zsh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><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:#4078F2;--shiki-dark:#61AFEF">sh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -c</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "$(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></div>
<h3>1.5 安装 OpenClaw</h3>
<h4>1.5.1 打开 OpenClaw 官网</h4>
<p><strong>网址</strong>：<a href="https://openclaw.ai" target="_blank" rel="noopener noreferrer">https://openclaw.ai</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f3/f3b1c476c137691055136a70345d2e0383edb1bec60577ede52acf63fe7a5dfd.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.5.2 向下滑找到“Quick Start”（快速开始），获取安装指令</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ee/eea392a7717babd8d63dc69b7e482e25edb0b43cb400e3fb54a5ddac000e3a6b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.5.3 「方法一」打开“终端”输入这段指令</h4>
<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:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://openclaw.ai/install.sh</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">bash</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><details class="hint-container details"><summary>出现安装失败时，查看</summary>
<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:#0184BC;--shiki-dark:#56B6C2">ulimit</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> unlimited</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ed/ed5c9c93c9adad37d3290c3a13931d31eeb944162015a02b977a9655a3e78cc7.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<p>正式执行命令之前，可以考虑代理开启 TUN 模式，并进行测速选择延迟较低的节点：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/93/93920e7bb7203cb718935fc9313987f61576efc4d7b5560b17a8e5ee548f10b1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>正式执行命令：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b6/b6f572d0510dfd7a34420721259737c09fc43cec51558fae3cbb65a0685ff4a7.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>如果安装成功则没事，如果没有安装成功需要把 npm 进行换源尝试，使用如下命令进行换源：</p>
<blockquote>
<p><strong>注意⚠️</strong>：尽可能不换源安装成功最后，具体原因待我研究。国内源，无法做到实时最新。</p>
</blockquote>
<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:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> config</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> registry</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://registry.npmmirror.com/</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>更多换源内容，查看：<a href="https://bornforthis.cn/blog/vuepress/08.html" target="_blank" rel="noopener noreferrer">https://bornforthis.cn/blog/vuepress/08.html</a>。</p>
<p>记得换源后，安装完成后，换源回官方源。</p>
<p>下面的内容就是：网络失败正在重试的信息。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/92/92912f9ce414a4b269e4914942f1f2c0a6e142fdf9610ded594fb30735476e86.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/15/1573255a579ed52905d05d5dd73301caf37d5b2a954755eec18b5630f9432d6b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>下载成功后，会自动进入配置流程。</p>
<h4>1.5.4 「方法二」使用 npm 进行安装</h4>
<ol>
<li>
<p><strong>打开“终端”输入这段指令</strong></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:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> i</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -g</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> openclaw</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p>❌ 如果出现了<strong>“error”</strong>这类报错，则输入下面这段指令（作用是强制执行安装指令）</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b6/b69a5b2f67a560de45f5e0ea54fc912400702cc8f58e8476c615c19f21703e41.png" alt="❌ 安装出现错误" tabindex="0" loading="lazy"><figcaption>❌ 安装出现错误</figcaption></figure>
<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:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> i</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -g</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> openclaw</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>需要输入密码，<strong>当前指令输入密码时屏幕不会有任何显示</strong>，这是正常的安全保护，请直接盲打完密码后按回车键。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cb/cb691cc52af93e23971e106047995c78cac6c6d5e6d2297675bf785d354cc77e.png" alt="✅ 安装成功" tabindex="0" loading="lazy"><figcaption>✅ 安装成功</figcaption></figure>
</li>
<li>
<p><strong>如何验证安装是否成功？</strong></p>
<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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --version</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/93/933e5baac7af86e8fa0ed93603e94bfdb93cb7b8c2c0f739bb922afb0e2361e3.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>方法二不会自动进入 OpenClaw 的配置流程，需要如下命令激活：</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:#4078F2;--shiki-dark:#61AFEF">openclaw</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> onboard</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ol>
<h3>1.6 配置 OpenClaw</h3>
<p>因为 OpenClaw 现在处于高度更新的状态，用可能在写下本教程时就已经过时。所以本教程核心是：带给你一个靠谱的安装、配置流程。便于 OpenClaw 发布新版本时，你安装 OpenClaw 本教材同样适用。</p>
<h4>1.6.1 注册智谱</h4>
<p>注册智谱使用我的邀请注册，我们可以得到高额 API 额度（有有效期的哦）。</p>
<ul>
<li>
<p>邀请链接：<a href="https://www.bigmodel.cn/invite?icode=kfX4Vy3FW818IlOHqfkX%2BlwpqjqOwPB5EXW6OL4DgqY%3D" target="_blank" rel="noopener noreferrer">https://www.bigmodel.cn/invite?icode=kfX4Vy3FW818IlOHqfkX%2BlwpqjqOwPB5EXW6OL4DgqY%3D</a></p>
</li>
<li>
<p>邀请海报：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/21/211b317222e7f97b349fc1443757907ca164adc0f32de7a6758204f115e23b0e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
</ul>
<p>注册需要实名认证等，自己按官方提示操作即可。</p>
<h4>1.6.2 获取 API 密钥以</h4>
<p><strong>第一步：进入控制台</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/6d/6d6ca16a000647272f25c49f88cbdd55c61847572d7d32c8516bd2b15b8ab03d.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>第二步：点击 API Key</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9f/9fc3d40da35fa49c6208ee5ad1c9db962ea24f67d33d6ca4f0b0a60b853bd309.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>第三步：创建新的 API Key</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/db/dba6ace4c7318b29f8bfb7dba5285a5450d1b20ed342e736e80225440addacb4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>第四步：设置新 API Key 的名称</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/56/56533fe6e1b94455d4b34e1061cd34142297fe51e12504749dc43876ca4bef78.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.3 查看福利允许的模型</h4>
<p>因为咱们用的是免费版，所以智谱赠送的 Token 是有使用的模型限制🚫。如果没注意，直接配置到 OpenClaw 当中，会出现提问 OpenClaw 没有反应的情况。</p>
<p><strong>第一步：点击财务</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/57/573f4a5a7d41697a3994cf45717349a1d142db6f87be72c77b946c4bd5ffb03d.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>第二步：点击【资源包管理】</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/37/3797c0eec78e4692e89844b1a754bb838cf99d0ba2176601038369bce6017a1a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>第三步：点击【我的资源包】</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f4/f4f0cfbe067e3e9ff33fefec8ebfe1eaf7608fba66ad2ee859c0fd089a0682bc.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>第三步：鼠标悬停查看</strong></p>
<p>这里目前支持的是 <code>GLM-4.5-Air</code> 模型。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/32/3201276edb6b0653d187de5f89033bba94a180977985c1a0667060bb91307032.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.4 目前所掌握的数据</h4>
<ul>
<li><strong>API Key</strong>：<code>f15ef2a91cf84873875f7a510f2c8428.iyTN7U5ucop80Ifu</code> （用你自己的，这个我删除了）</li>
<li><strong>支持的模型</strong>：<code>GLM-4.5-Air</code></li>
</ul>
<h4>1.6.5 选择 Yes</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cd/cd006374343c584603fba9fc0358353b5b474c80aedeb4ec4f6494046d1438a1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.6 选择：QuickStart</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/89/89a2f905bdc2c85aa4b84a2ac3e3b0d741ef4f8871b7f9196c16c6a43083d910.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.7 选择智谱 AI</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/0b/0bda2c62b4e20c0c506dc939b1943eb4e152c6093445c010cfdf323d0eb07e11.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.8 选择【CN】</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f1/f16ddffaa10f9e3ac3ae6ab1e806191bd0a731e52d3c068f05e92ced5ed1ebc6.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.9 粘贴 API Key</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f2/f275c636775c460c0c81b4304ccdf3b4e330368ae6f7e5232377ab45b871ffe6.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/4a/4a41250aeee9f5497fd350345128e49dd539ef2d83b1179969f382e16a076ea1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.10 选择大模型</h4>
<p>前面已经验证过了，直接选择 <code>glm-4.5-air</code>：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/51/51be11f6efe815c76473bd001d9bd798754339f7049cd71869aa0b1bf762cf42.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>1.6.11 选择配置通讯工具</h4>
<p><strong>本次，我们选择跳过！</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5e/5e770b8d145e922f5889355cf1705d835b97456d6aecabb777b58409dd8d93ce.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ul>
<li>
<p><strong>Telegram</strong>：</p>
<ul>
<li>
<p>注册 Telegram；</p>
</li>
<li>
<p>创建机器人：<a href="https://t.me/BotFather" target="_blank" rel="noopener noreferrer">https://t.me/BotFather</a>；</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bf/bff0f1ea582527d7a8ea5b83feb78cff60b1b9fcf63ea37c61b3caf3e36136ef.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>后续再补充，主要是飞书！</p>
</li>
<li>
<p><strong>注意</strong>：使用 Telegram 必须开全局代理或者 TUN 模式才可以！</p>
</li>
</ul>
</li>
<li>
<p><strong>WhatsApp</strong>：</p>
<ul>
<li>应该是最简单的了，直接注册账号，扫码绑定即可。</li>
<li>后续补充详细教程；</li>
</ul>
</li>
</ul>
<h4>1.6.12 配置搜索工具「搜索提供商（Search provider）」</h4>
<p>意思是：<strong>当 AI 需要上网搜索信息时，使用哪个搜索服务。</strong></p>
<p>| 选项                       | 提供方        | 是否需要 API Key | 是否需要费用 | 优点                                               | 缺点                      | 适合人群                         |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-06T19:27:38.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">03-【最佳方案】Windows wsl 安装 OpenClaw</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/02-openclaw-wsl-install.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/02-openclaw-wsl-install.html"/>
    <updated>2026-08-16T15:12:01.114Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>经过测试，发现：Windows 直接不使用 WSL 很多技能都无法使用，需要使用 WSL 才可以让程序正常使用。</p>
<p>教程去看：<a href="/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html" target="_blank">🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/80/80e2e3d3d4e825d1e606eec9e1722a064e6e63f897ca37d64a9d5fbc3782b9c0.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>经过测试，发现：Windows 直接不使用 WSL 很多技能都无法使用，需要使用 WSL 才可以让程序正常使用。</p>
<p>教程去看：<a href="/column/Python-Programming-Course/P15-OpenClaw/03-OpenClaw-step-up.html" target="_blank">🦞立省 500！30 分钟把 OpenClaw 本地部署并在飞书上配到可用</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/80/80e2e3d3d4e825d1e606eec9e1722a064e6e63f897ca37d64a9d5fbc3782b9c0.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/14/141250ea390c87889420397f47bcc06327daf7fa0575104a21dcef4af5720d70.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-06T13:19:14.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">04-MindCircuit</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/04-MindCircuit.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/04-MindCircuit.html"/>
    <updated>2026-08-16T15:12:01.115Z</updated>
    <summary type="html"><![CDATA[<h2>1. idea 💡</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 直接支持用户分享设计的游戏地图 json，支持张贴；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 「new P」迷宫游戏</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 游戏添加音效，用户可以选择关闭或者启动音频；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 游戏的棋盘可以整大一些；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 棋盘用户可以自己选择大小，网页初始化时，自动适配当前屏幕比例；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 目前游戏的最佳路径，是错误的，忽略了障碍物的存在；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 程序指令块支持直接拖动；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 实现金币玩法；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 闯关可以自己选择，类似游戏地图展示出来；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 不要把最佳路径指令缓存进去，而是用户自己的闯关指令（待定｜思考）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 需要保证棋盘格子要统一大小，不要被障碍物等不停变换大小；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> 游戏增加限时功能，支持用户是否开启。创造模式中，也同样支持是否开启计时以及计时时间设置；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 过关后，可以选择把过关弹窗关闭；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-13" disabled="disabled"><label class="task-list-item-label" for="task-item-13"> 在创造模式下，当地图尺寸超过 7x7 时，缩小机器人尺寸，以适配小格子；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-14" disabled="disabled"><label class="task-list-item-label" for="task-item-14"> 计时开始，需要有倒计时提示音；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-15" disabled="disabled"><label class="task-list-item-label" for="task-item-15"> 支持制作多个连续关卡导入，变成个性化闯关模式；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-16" disabled="disabled"><label class="task-list-item-label" for="task-item-16"> 制作关卡 json 格式要求，可以借助 AI 进行批量生成关卡；</label></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>1. idea 💡</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 直接支持用户分享设计的游戏地图 json，支持张贴；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 「new P」迷宫游戏</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 游戏添加音效，用户可以选择关闭或者启动音频；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 游戏的棋盘可以整大一些；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 棋盘用户可以自己选择大小，网页初始化时，自动适配当前屏幕比例；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 目前游戏的最佳路径，是错误的，忽略了障碍物的存在；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 程序指令块支持直接拖动；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 实现金币玩法；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 闯关可以自己选择，类似游戏地图展示出来；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 不要把最佳路径指令缓存进去，而是用户自己的闯关指令（待定｜思考）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 需要保证棋盘格子要统一大小，不要被障碍物等不停变换大小；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> 游戏增加限时功能，支持用户是否开启。创造模式中，也同样支持是否开启计时以及计时时间设置；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 过关后，可以选择把过关弹窗关闭；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-13" disabled="disabled"><label class="task-list-item-label" for="task-item-13"> 在创造模式下，当地图尺寸超过 7x7 时，缩小机器人尺寸，以适配小格子；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-14" disabled="disabled"><label class="task-list-item-label" for="task-item-14"> 计时开始，需要有倒计时提示音；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-15" disabled="disabled"><label class="task-list-item-label" for="task-item-15"> 支持制作多个连续关卡导入，变成个性化闯关模式；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-16" disabled="disabled"><label class="task-list-item-label" for="task-item-16"> 制作关卡 json 格式要求，可以借助 AI 进行批量生成关卡；</label></li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-03T10:30:36.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">昊学习规划</title>
    <id>https://bornforthis.cn/blog/2026/haotian-lesson-plan.html</id>
    <link href="https://bornforthis.cn/blog/2026/haotian-lesson-plan.html"/>
    <updated>2026-08-16T15:12:01.116Z</updated>
    <summary type="html"><![CDATA[<h2>1. 学习</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 本地硬件：</label>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> SD</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> <a href="https://github.com/janhq/jan" target="_blank" rel="noopener noreferrer">https://github.com/janhq/jan</a></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> <a href="https://github.com/nomic-ai/gpt4all" target="_blank" rel="noopener noreferrer">https://github.com/nomic-ai/gpt4all</a></label></li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> Windows；（wsl）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 社交：b 站、小红书、视频号、抖音、公众号（main）、博客；（是托管 github）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 诞生：10s、实践；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> AI 做动漫；（凡人修仙传）｜豆包 2.0</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> AI 创意项目</label>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 同时提出 idea，使用当 AI 编程工具进行开发；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 想法及时记录的小 app；</label></li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> AI数字人；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 实在没有改进想法、无 bug 之后，就可以告一段落；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-13" disabled="disabled"><label class="task-list-item-label" for="task-item-13"> 在线版部署、开源教程，VIP：tkone</label></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>1. 学习</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 本地硬件：</label>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> SD</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> <a href="https://github.com/janhq/jan" target="_blank" rel="noopener noreferrer">https://github.com/janhq/jan</a></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> <a href="https://github.com/nomic-ai/gpt4all" target="_blank" rel="noopener noreferrer">https://github.com/nomic-ai/gpt4all</a></label></li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> Windows；（wsl）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 社交：b 站、小红书、视频号、抖音、公众号（main）、博客；（是托管 github）</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 诞生：10s、实践；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> AI 做动漫；（凡人修仙传）｜豆包 2.0</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> AI 创意项目</label>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-9" disabled="disabled"><label class="task-list-item-label" for="task-item-9"> 同时提出 idea，使用当 AI 编程工具进行开发；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-10" disabled="disabled"><label class="task-list-item-label" for="task-item-10"> 想法及时记录的小 app；</label></li>
</ul>
</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-11" disabled="disabled"><label class="task-list-item-label" for="task-item-11"> AI数字人；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-12" disabled="disabled"><label class="task-list-item-label" for="task-item-12"> 实在没有改进想法、无 bug 之后，就可以告一段落；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-13" disabled="disabled"><label class="task-list-item-label" for="task-item-13"> 在线版部署、开源教程，VIP：tkone</label></li>
</ul>
<h2>2. 各个平台</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-14" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-14"> <a href="https://space.bilibili.com/3493289428781167" target="_blank" rel="noopener noreferrer">https://space.bilibili.com/3493289428781167</a></label></li>
</ul>
<h2>3. 开发计划</h2>
<h3>3.1 项目 1：TreeFlow</h3>
<p>::: ChangeLog</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-15" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-15"> 2026-03-08 13:14:25：目标开发至可用状态，解决明显 bug，发布第一个版本上线！</label></li>
</ul>
<p>:::</p>
<h4>3.1.1 想法💡&amp; bug</h4>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-16" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-16"> aistudio 绑定 github；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-17" disabled="disabled"><label class="task-list-item-label" for="task-item-17"> 深入探索 aistudio 无法推送 github 仓库问题；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-18" disabled="disabled"><label class="task-list-item-label" for="task-item-18"> 课后：把这个项目，介绍一下，如何使用；</label></li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-03-01T14:08:04.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">Wang AI泛娱乐创业讨论</title>
    <id>https://bornforthis.cn/blog/2026/ai-entertainment-startup-discussion.html</id>
    <link href="https://bornforthis.cn/blog/2026/ai-entertainment-startup-discussion.html"/>
    <updated>2026-08-16T15:12:01.117Z</updated>
    <summary type="html"><![CDATA[<h2>First</h2>

<h2>Second</h2>
<p><strong>核心原则</strong>：低成本试错、技术落地为先、共创共享、快速验证。</p>
<h3>一、会议核心共识</h3>
<ol>
<li>项目本质是<strong>AI 技术应用与研究型公司</strong>，非单纯做视频 / 流量，视频号仅为首个技术验证切口，最终目标是为制造业、政府、企业等主体提供低成本 AI 内容制作与推广服务。</li>
<li>核心逻辑是<strong>小成本多方向试错</strong>，失败是大概率事件，试错的核心价值是积累技术、运营经验和数据，而非追求短期盈利。</li>
<li>团队模式为<strong>互联网化共创</strong>，拒绝大厂病、熟人思维，专业优先，线上远程协作为主，快速落地执行。</li>
<li>利益分配采用<strong>股权代币化 + 上链</strong>，前期共创者收入为 “现金 + 公司代币”，代币与股权完全捆绑，验证成功后代币同步增值。</li>
<li>AI 的核心定位是<strong>生产工具</strong>，创意 + 工具高效使用才是核心竞争力，无需研发全新 AI 产品，优先组合主流开源 AI 工具实现功能落地。</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>First</h2>

<h2>Second</h2>
<p><strong>核心原则</strong>：低成本试错、技术落地为先、共创共享、快速验证。</p>
<h3>一、会议核心共识</h3>
<ol>
<li>项目本质是<strong>AI 技术应用与研究型公司</strong>，非单纯做视频 / 流量，视频号仅为首个技术验证切口，最终目标是为制造业、政府、企业等主体提供低成本 AI 内容制作与推广服务。</li>
<li>核心逻辑是<strong>小成本多方向试错</strong>，失败是大概率事件，试错的核心价值是积累技术、运营经验和数据，而非追求短期盈利。</li>
<li>团队模式为<strong>互联网化共创</strong>，拒绝大厂病、熟人思维，专业优先，线上远程协作为主，快速落地执行。</li>
<li>利益分配采用<strong>股权代币化 + 上链</strong>，前期共创者收入为 “现金 + 公司代币”，代币与股权完全捆绑，验证成功后代币同步增值。</li>
<li>AI 的核心定位是<strong>生产工具</strong>，创意 + 工具高效使用才是核心竞争力，无需研发全新 AI 产品，优先组合主流开源 AI 工具实现功能落地。</li>
</ol>
<h3>二、项目核心定位与愿景</h3>
<ol>
<li><strong>公司名称</strong>：AI 乐创计算机技术有限公司（谐音 “开心创新”，贴合 AI 技术探索与创意结合的核心）</li>
<li><strong>核心愿景</strong>：做 AI 技术应用下沉的实践者，通过工具组合与场景验证，打造低成本、可复制的 AI 内容生产与服务体系，积累技术能力并实现商业落地。</li>
<li><strong>核心价值</strong>：盘活自有算力资源、降低 AI 工具使用与内容制作成本、沉淀各场景 AI 应用的技术和运营经验。</li>
<li><strong>业务路径</strong>：先通过视频号验证 AI 内容生产全流程能力→沉淀方法论与数据→为 B 端（制造业、政府、企业）提供 AI 内容制作与推广服务→拓展 AI 技术在更多垂直领域的应用。</li>
</ol>
<h3>三、落地执行核心步骤（分三阶段）</h3>
<p>结合个人网站 “内容测试 - 数据反馈 - 迭代优化” 的运营逻辑，项目落地分三步走，每一步设明确目标与验收标准：</p>
<h4>筹备期（1-2 周）</h4>
<ol>
<li>输出项目<strong>共创白皮书 / 章程</strong>（AI 生成初稿后人工优化，明确愿景、规则、利益、分工）；</li>
<li>敲定核心启动预算，设定<strong>成本亏损红线</strong>（亏得有度，无意义的试错及时止损）；</li>
<li>梳理自有资源（算力集群、人脉、启动资金），对接外部开源 AI 工具 / API；</li>
<li>搭建核心共创群，明确首批招募角色与能力要求。</li>
</ol>
<h4>验证期（1-3 个月，核心试错阶段）</h4>
<ol>
<li>选定 2-3 个视频号题材（结合平台流量数据、下沉市场需求，如财经、动漫、泛娱乐等），小预算启动；</li>
<li>搭建 AI 内容生产体系：组合 OpenCloud 等主流 AI 工具，实现内容自动抓取、分析、发布的基础功能；</li>
<li>按 “测试 - 数据反馈 - 策略调整” 循环，每周复盘各题材流量、传播率，快速淘汰低效果题材；</li>
<li>积累内容生产数据与平台运营经验，同步完成 AI 内容版权审核流程搭建，规避侵权风险。</li>
</ol>
<h4>迭代期（3 个月后）</h4>
<ol>
<li>沉淀可复制的 AI 视频号运营方法论，形成标准化操作流程；</li>
<li>基于验证期能力，初步对接小型 B 端需求，测试 AI 内容制作的商业落地效果；</li>
<li>梳理算力资源本地化部署实操方案，进一步降低 AI 工具使用成本；</li>
<li>对接投资机构，基于已验证的模式争取更多资金，扩大试错与落地范围。</li>
</ol>
<h3>四、人员配置与核心能力要求</h3>
<p>按 “少而精、专业优先” 原则配置，拒绝冗余岗位，各角色需贴合 AI 工具使用与互联网运营特点，结合个人网站线上招募 / 协作经验，明确核心能力要求：</p>
<p>| 角色       | 核心能力要求                                                 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-26T08:36:54.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">12-焖豆腐</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/02-%E7%82%96%E7%85%AE%E7%B1%BB/12-%E7%84%96%E8%B1%86%E8%85%90.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/02-%E7%82%96%E7%85%AE%E7%B1%BB/12-%E7%84%96%E8%B1%86%E8%85%90.html"/>
    <updated>2026-08-16T15:12:01.121Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>豆腐</th>
<th>洋葱碎</th>
<th>香菇碎</th>
<th>干小虾仁</th>
<th>干贝</th>
<th>蛏干</th>
<th>五花肉末</th>
<th>胡萝卜</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>芹菜</strong></td>
<td><strong>鸡蛋</strong></td>
<td><strong>小香葱</strong></td>
<td><strong>海蛎</strong></td>
<td><strong>大骨头、大骨汤（蛏壳汤代替）</strong></td>
<td><strong>花生米</strong></td>
<td><strong>大白菜</strong>（包菜？）</td>
<td><strong>生姜</strong></td>
</tr>
<tr>
<td><strong>虾米</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 豆腐     | 洋葱碎   | 香菇碎     | 干小虾仁 | 干贝                             | 蛏干       | 五花肉末             | 胡萝卜   |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-20T12:19:28.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">12-黄油焗花螺</title>
    <id>https://bornforthis.cn/column/cookdinner/P03-%E6%B5%B7%E9%B2%9C%E7%B1%BB/12-%E9%BB%84%E6%B2%B9%E7%84%97%E8%8A%B1%E8%9E%BA.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P03-%E6%B5%B7%E9%B2%9C%E7%B1%BB/12-%E9%BB%84%E6%B2%B9%E7%84%97%E8%8A%B1%E8%9E%BA.html"/>
    <updated>2026-08-16T15:12:01.121Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>花螺 2 斤</th>
<th>彩椒粒</th>
<th>洋葱蒜蓉</th>
<th>黄油适量「可选</th>
<th>盐</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>花雕酒</strong></td>
<td><strong>白胡椒粉</strong></td>
<td><strong>白酒</strong></td>
<td><strong>小香葱</strong></td>
<td></td>
</tr>
</tbody>
</table>
<h2>2. 步骤</h2>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 花螺 2 斤  | 彩椒粒       | 洋葱蒜蓉 | 黄油适量「可选 | 盐   |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-20T11:42:40.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">COMP1730 Final Exam Submissions</title>
    <id>https://bornforthis.cn/1v1/101-Sallymisty/Mid-Final-Exam/COMP1730-Final-Exam-Submissions.html</id>
    <link href="https://bornforthis.cn/1v1/101-Sallymisty/Mid-Final-Exam/COMP1730-Final-Exam-Submissions.html"/>
    <updated>2026-08-16T15:12:01.122Z</updated>
    <summary type="html"><![CDATA[<h2>Question 1: Improving code quality (5/40)</h2>
<p>An integer <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> is called a <em>non-trivial divisor</em> of a positive integer <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> if <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> is between 2 and <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n−1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> such that n<em>n</em> is divisible by <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>, meaning that the remainder of the integer division n<em>n</em> by <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> is zero. The following <strong>correct</strong> function takes as input a positive integer, and returns how many non-trivial divisors are there for the given input.</p>]]></summary>
    <content type="html"><![CDATA[<h2>Question 1: Improving code quality (5/40)</h2>
<p>An integer <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> is called a <em>non-trivial divisor</em> of a positive integer <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> if <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> is between 2 and <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n−1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> such that n<em>n</em> is divisible by <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>, meaning that the remainder of the integer division n<em>n</em> by <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> is zero. The following <strong>correct</strong> function takes as input a positive integer, and returns how many non-trivial divisors are there for the given input.</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> do_it</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">xxx</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    tHeReSuLt</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">xxx</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</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:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # check if divides</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> xxx</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</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:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">            # exclude some random numbers</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            if</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> not</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> or</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">xxx):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                tHeReSuLt</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">tHeReSuLt</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><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">            pass</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # do nothing lol</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">        # increment but not really important</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">u</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> int</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">str</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(tHeReSuLt))</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>Describe all <strong>distinct</strong> ways in which the quality of the code above can be improved without affecting to its functional correctness.</p>
<p>To gain marks, your suggested improvements must be specific. For example, if you think that naming should be improved, you must give at least one specific example of which names should be changed and to what; just answering &quot;better names&quot; is not enough. Do not simply write your suggested improvements as comments inside the function. Writing a new function or rewriting the function is not an acceptable answer, regardless of whether it is correct or not.</p>
<p><strong>Response</strong></p>


<h2>Question 2: Testing (5/40)</h2>
<p>We want to write tests for a function with signature and docstring defined as follows:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> sequence_dissimilarity</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">s1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> s2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    """</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    s1 and s2 are two sequences of the same length</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    Returns the number of i-th elements that are NOT equal</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    between two sequences, i.e., where s1[i] != s2[i]</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    Assume that this comparison is always valid and evaluates to True or False</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    """</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> sequence_dissimilarity</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">s1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> s2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    """</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    s1 和 s2 是两个长度相同的序列</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    返回两个序列中“对应位置 i 的元素不相等”的位置数量</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    也就是统计满足 s1[i] != s2[i] 的 i 的个数</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    假设这种比较总是合法的，并且比较结果一定是 True 或 False</span></span>
<span class="line"><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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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>Write <strong>at most</strong> 4 test cases for this function (every test case after the first four will be ignored). For each test case, you must write the inputs (arguments to the function) and the expected return value. You may format your answer in anyway, provided that <strong>the inputs and output can be clearly identified</strong>. Each test case should specify <strong>valid arguments</strong> for the function. Your test cases should cover relevant <strong>corner cases</strong>.</p>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>下面给出 <strong>4 个</strong>覆盖关键边界情况的测试用例（输入 + 期望输出）：</p>
<ol>
<li>
<p><strong>两个空序列（长度为 0）</strong></p>
<ul>
<li>
<p>输入：<code>s1 = []</code>, <code>s2 = []</code></p>
</li>
<li>
<p>期望输出：<code>0</code></p>
</li>
</ul>
</li>
<li>
<p><strong>完全相同（无任何不相等）</strong></p>
<ul>
<li>
<p>输入：<code>s1 = [1, 2, 3]</code>, <code>s2 = [1, 2, 3]</code></p>
</li>
<li>
<p>期望输出：<code>0</code></p>
</li>
</ul>
</li>
<li>
<p><strong>完全不同（每个位置都不相等）</strong></p>
<ul>
<li>
<p>输入：<code>s1 = &quot;abc&quot;</code>, <code>s2 = &quot;XYZ&quot;</code></p>
</li>
<li>
<p>期望输出：<code>3</code></p>
</li>
</ul>
</li>
<li>
<p><strong>部分不同 + 混合类型（比较始终合法）</strong></p>
<ul>
<li>
<p>输入：<code>s1 = [1, &quot;2&quot;, 3, &quot;x&quot;]</code>, <code>s2 = [1, 2, 4, &quot;x&quot;]</code></p>
</li>
<li>
<p>逐位比较：<code>1==1</code>(相同), <code>&quot;2&quot;!=2</code>(不同), <code>3!=4</code>(不同), <code>&quot;x&quot;==&quot;x&quot;</code>(相同)</p>
</li>
<li>
<p>期望输出：<code>2</code></p>
</li>
</ul>
</li>
</ol>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> test_sequence_dissimilarity</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">    # 1) 两个空序列（长度为0）</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> sequence_dissimilarity</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([], []) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</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">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> sequence_dissimilarity</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</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">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> sequence_dissimilarity</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abc"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"XYZ"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 3</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">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> sequence_dissimilarity</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:#50A14F;--shiki-dark:#98C379">"2"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"x"</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:#986801;--shiki-dark:#D19A66">2</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:#50A14F;--shiki-dark:#98C379">"x"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</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></div></div>
<h2>Question 3: Debugging (5/40)</h2>
<p>The <code>argmin</code> of a sequence is the index (position) of the smallest element in the sequence. For example, if the sequence is <code>[3,4,5]</code>, the <code>argmin</code> is 0, because the smallest value is 3 and is at index 0. If the smallest value is not unique, the <code>argmin</code> function can return any index where it appears. For example, if the sequence is <code>[5,5,5]</code>, any of the indices 0, 1 or 2 is a valid answer. We assume that the input sequence is non-empty.</p>
<p>Below is an implementation of the <code>argmin</code> function:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> argmin</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    a </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> list</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    p </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    a.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">sort</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"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a[p]:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            p </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> p</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>However, the function above is not correct:</p>
<p><strong>(a)</strong> Provide an example of function call with arguments of correct type that makes this function return an incorrect result. <code>a</code> must be a non-empty sequence of numbers.</p>
<p><strong>(b)</strong> Explain the cause of the error that you have found, i.e., what is wrong with this function. Your answer must explain what is wrong with the function as given. Writing a new function or rewriting/fixing the function is not an acceptable answer, regardless of whether it is correct or not.</p>
<details class="hint-container details"><summary>答案</summary>
<h4>(a) 反例（会返回错误结果的调用）</h4>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">argmin</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</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></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>正确的 <code>argmin</code> 应该返回 <code>1</code>（最小值 1 在原序列的索引是 1），但这段代码会返回 <code>0</code>。</p>
<p>你也可以用更明显的例子：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">argmin</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">2</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></div><p>正确答案应为 <code>1</code>，但函数会返回 <code>0</code>。</p>
<h4>(b) 错误原因解释（这段函数“哪里错了”）</h4>
<p>核心问题是：<strong>它在计算索引之前把 <code>a</code> 排序了</strong>。</p>
<ul>
<li>一开始 <code>a = list(a)</code> 把输入变成列表没问题。</li>
<li>但紧接着执行了 <code>a.sort()</code>：这一步会<strong>原地排序</strong>，把元素顺序改掉。</li>
<li><code>argmin</code> 要返回的是“<strong>原始输入序列</strong>中最小元素的位置（索引）”，而排序以后：
<ul>
<li>最小元素必然跑到排序后列表的第 0 个位置</li>
<li>所以这个函数基本上总会返回 0（除非你想象它还会找到更小的，但排序后不可能有 <code>x &lt; a[0]</code>）</li>
</ul>
</li>
</ul>
<p>更具体地说，在 <code>for x in a:</code> 这段循环中：</p>
<ul>
<li>排序后 <code>a[p]</code> 初始是 <code>a[0]</code>，也就是最小值</li>
<li>对任何元素 <code>x</code> 来说，都不可能满足 <code>x &lt; a[p]</code>（因为 <code>a[p]</code> 已经是最小）</li>
<li>因此 <code>p</code> 永远不会更新，始终是 0</li>
<li>最终 <code>return p</code> 返回 0，<strong>这不是原序列的 argmin，而是“排序后序列”的位置</strong></li>
</ul>
<p>总结一句：<strong>排序破坏了原始索引信息，导致返回的索引与输入序列的位置无关</strong>。</p>
</details>

<h2>Question 4.1: Time complexity (2/40)</h2>
<p>Consider the function:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> g</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0.0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(A.shape[</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">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(i, A.shape[</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">            res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> A[i, j]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> res</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><p>where <code>A</code> is an <code>n</code> by <code>n</code> 2D NumPy array of floating-point numbers (<code>A.shape[0] == A.shape[1] == n</code>).</p>
<p>Write down the time complexity of <code>g(A)</code> in big-O notation as a function of <code>n</code> . <strong>Explain the reason why</strong>, e.g., by analysing the code line by line and summarising it**.** Correct time complexity without sufficient explanation and reasoning will receive zero marks.</p>
<details class="hint-container details"><summary>详情</summary>
<p><strong>题目代码</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> g</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0.0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(A.shape[</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">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(i, A.shape[</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">            res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> A[i, j]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> res</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><p>已知：</p>
<ul>
<li><code>A</code> 是一个 <code>n × n</code> 的 NumPy 数组</li>
<li><code>A.shape[0] == A.shape[1] == n</code></li>
</ul>
<p><strong>🔍 第一步：逐行分析</strong></p>
<ul>
<li>
<p>① <code>res = 0.0</code></p>
<p>这是常数时间操作：<span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span></p>
</li>
<li>
<p>② 外层循环</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(A.shape[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</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></div><p>因为 <code>A.shape[0] = n</code>，所以外层循环执行：<span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mtext> 次</mtext></mrow><annotation encoding="application/x-tex">n \text{ 次}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">n</span><span class="mord text"><span class="mord"> </span><span class="mord cjk_fallback">次</span></span></span></span></span></p>
</li>
<li>
<p>③ 内层循环</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(i, A.shape[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</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></div><p>这里是关键，当 <code>i = 0</code> 时：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">j 从 </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 到 n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">执行 n 次</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></div><p>当 <code>i = 1</code> 时：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">j 从 </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 到 n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">执行 n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</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></div><p>当 <code>i = 2</code> 时：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">执行 n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</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></div><p>……</p>
<p>当 <code>i = n-1</code> 时：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><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></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<p><strong>🔢 总执行次数计算</strong></p>
<p>总的 <code>res += A[i, j]</code> 执行次数为：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>n</mi><mo>+</mo><mo stretchy="false">(</mo><mi>n</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>n</mi><mo>−</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo>⋯</mo><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n + (n-1) + (n-2) + \dots + 1
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span></p>
<p>这是一个等差数列求和：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi>n</mi><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{n(n+1)}{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.113em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p>
<p>展开：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo>=</mo><mfrac><mrow><msup><mi>n</mi><mn>2</mn></msup><mo>+</mo><mi>n</mi></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">= \frac{n^2 + n}{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.1771em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p>
<p><strong>🎯 时间复杂度分析</strong></p>
<p>最高阶项是：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><msup><mi>n</mi><mn>2</mn></msup><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{n^2}{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.1771em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.4911em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p>
<p>在 Big-O 表示法中：</p>
<ul>
<li>忽略常数</li>
<li>忽略低阶项</li>
</ul>
<p>所以：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^2)
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p>
<p><strong>📌 更直观理解</strong></p>
<p>这段代码：</p>
<ul>
<li>不是遍历整个矩阵</li>
<li>而是遍历矩阵的<strong>上三角部分（包括对角线）</strong></li>
</ul>
<p>矩阵一共有：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>n</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">n^2
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8641em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>个元素。</p>
<p>而代码访问了：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi>n</mi><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{n(n+1)}{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.113em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p>
<p>个元素，这仍然是二次级别增长。</p>
<p><strong>最终答案</strong></p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><menclose notation="box"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="false"><mstyle scriptlevel="0" displaystyle="true"><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow></mstyle></mstyle></mstyle></menclose></mrow><annotation encoding="application/x-tex">\boxed{O(n^2)}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.7941em;vertical-align:-0.59em;"></span><span class="mord"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.2041em;"><span style="top:-3.7941em;"><span class="pstrut" style="height:3.7941em;"></span><span class="boxpad"><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span><span style="top:-3.2041em;"><span class="pstrut" style="height:3.7941em;"></span><span class="stretchy fbox" style="height:1.7941em;border-style:solid;border-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.59em;"><span></span></span></span></span></span></span></span></span></span></p>
<p><strong>📌 总结一句话</strong></p>
<p>虽然内层循环从 <code>i</code> 开始减少了次数，但所有迭代次数加起来仍然是：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi>n</mi><mo stretchy="false">(</mo><mi>n</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{n(n+1)}{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.113em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p>
<p>其增长阶为：</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^2)
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p>
</details>
<h2>时间复杂度汇总</h2>
<h3>1. 时间复杂度怎么判断（核心规则）</h3>
<p>把程序想象成：输入规模为 <code>n</code> 时，会执行多少次“基本操作”（比较、加减、赋值、访问数组等）。</p>
<ul>
<li><strong>忽略常数</strong>：<code>3n + 20</code> 记为 <code>O(n)</code></li>
<li><strong>只看最高阶</strong>：<code>n^2 + n</code> 记为 <code>O(n^2)</code></li>
<li><strong>顺序相加</strong>：先做 A 再做 B → <code>O(A + B)</code></li>
<li><strong>嵌套相乘</strong>：外层 <code>n</code> 次、内层 <code>n</code> 次 → <code>O(n * n) = O(n^2)</code></li>
<li><strong>每次规模减半</strong>：<code>n → n/2 → n/4 ...</code> 是 <code>O(log n)</code></li>
<li><strong>分支暴增</strong>（枚举子集/排列）通常是指数级或阶乘级</li>
</ul>
<h3>2. O(1) 常数时间</h3>
<p><strong>特点</strong>：执行次数不随 <code>n</code> 变。</p>
<p><strong>代码示例：数组索引访问</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> get_middle</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</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"> a[</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</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></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></div><p><strong>为什么是 O(1)</strong>：无论 <code>a</code> 多长，都只做固定次数操作（求长度、除法、一次索引）。</p>
<blockquote>
<p>典型：取数组某个位置、交换两个变量、栈/队列的 push/pop（在实现良好时）。</p>
</blockquote>
<h3>3. O(log n) 对数时间</h3>
<p><strong>特点</strong>：每一步把问题规模“砍半/按比例缩小”。</p>
<p><strong>代码示例：二分查找</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> binary_search</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> target</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    lo, hi </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lo </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> hi:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (lo </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> hi) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a[mid] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> target:</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>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        elif</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a[mid] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> target:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            lo </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><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">            hi </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</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><strong>为什么是 O(log n)</strong>：每次循环把区间缩小一半：<code>n → n/2 → n/4 → ... → 1</code> 需要的步数是 <code>log2(n)</code> 级别。</p>
<h3>4. O(√n)（很常见但容易忽略）</h3>
<p><strong>特点</strong>：循环到 <code>sqrt(n)</code> 就能解决（常见于数论）。</p>
<p><strong>代码示例：判断是否有非平凡因子（试除到 √n）</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> has_divisor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">n</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</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">            return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> True</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</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></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><strong>为什么是 O(√n)</strong>：<code>i*i &lt;= n</code> ⇒ <code>i &lt;= √n</code>，最多尝试约 <code>√n</code> 次。</p>
<h3>4. O(n) 线性时间</h3>
<p><strong>特点</strong>：把输入完整扫一遍。</p>
<p><strong>代码示例：线性查找</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> linear_search</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> target</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"> i, x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> enumerate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> target:</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>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</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><p><strong>为什么是 O(n)</strong>：最坏情况下要检查 <code>n</code> 个元素。</p>
<blockquote>
<p>注意：有些操作“看起来一行”，但可能是 O(n)，例如 Python 的 <code>x in list</code>、<code>list.count</code>、<code>list.remove</code> 等都要线性扫描。</p>
</blockquote>
<h3>5. O(n + m)（两个规模相加）</h3>
<p><strong>特点</strong>：分别扫两份数据，各扫一遍。</p>
<p><strong>代码示例：合并两个数组（不排序）</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> concat</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> b</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(x)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> y </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> b:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(y)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> res</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><strong>为什么是 O(n + m)</strong>：第一段做 <code>n</code> 次，第二段做 <code>m</code> 次，总计相加。</p>
<blockquote>
<p>图算法里常见 <code>O(V + E)</code>（点+边），也是同理。</p>
</blockquote>
<h3>6. O(n log n)（最常见的“高效排序/分治”复杂度）</h3>
<p><strong>特点</strong>：通常是 <strong>分治</strong>：分成若干份（log 层），每层做 O(n) 工作。</p>
<p><strong>代码示例：归并排序（经典）</strong></p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="python" style="--vp-collapsed-lines:15;--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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> merge_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</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:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</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"> a</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    left </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> merge_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a[:mid])</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    right </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> merge_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a[mid:])</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> merge</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(left, right)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> merge</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">left</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> right</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> []</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(left) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">and</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(right):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> left[i] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> right[j]:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(left[i]); i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><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">            res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(right[j]); j </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">extend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(left[i:])</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">extend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(right[j:])</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> res</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 class="collapsed-lines"></div></div><p><strong>为什么是 O(n log n)</strong>：</p>
<ul>
<li>分裂次数：<code>n → n/2 → ...</code> 有 <code>log n</code> 层</li>
<li>每一层合并总工作量：把所有元素合并一遍，总计 <code>O(n)</code></li>
<li>所以总计：<code>O(n) * O(log n) = O(n log n)</code></li>
</ul>
<blockquote>
<p>现实中：大多数比较排序在平均/最坏可做到 <code>O(n log n)</code>（归并、堆排序），快速排序平均 <code>O(n log n)</code> 但最坏 <code>O(n^2)</code>。</p>
</blockquote>
<h3>7. O(n²) 二次时间（双重循环/两两比较）</h3>
<p><strong>特点</strong>：所有“成对组合”类问题很容易出现。</p>
<p><strong>代码示例：统计所有配对 (i, j)</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> count_pairs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> c</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><strong>为什么是 O(n²)</strong>：外层 n 次，内层 n 次，总 <code>n*n</code>。</p>
<p><strong>更真实一点：两两比较是否相等</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> has_duplicate_slow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, n):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a[i] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a[j]:</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>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> False</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>n(n-1)/2</code>，仍是 <code>O(n²)</code>（忽略常数 1/2）。</p>
<h3>8. O(n³) 三次时间（3 层嵌套/某些 DP）</h3>
<h3>代码示例：三重循环</h3>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> triple_work</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">n</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> k </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                c </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> c</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><strong>为什么是 O(n³)</strong>：<code>n * n * n</code>。</p>
<blockquote>
<p>典型：Floyd-Warshall 全源最短路就是 <code>O(n³)</code>（n 个点）。</p>
</blockquote>
<h3>9. O(2^n) 指数时间（枚举所有子集 / 爆炸）</h3>
<p><strong>代码示例：生成所有子集</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> all_subsets</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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"> mask </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</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:#56B6C2"> &#x3C;&#x3C;</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"># 2^n 个 mask</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        subset </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</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"># 每个 mask 扫 n 位</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mask </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x26;</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:#56B6C2"> &#x3C;&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                subset.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a[i])</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(subset)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> res</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>：严格说是 <code>O(n * 2^n)</code>（因为每个子集构造要扫 n 位）。</p>
<p><strong>为什么会爆炸</strong>：子集数量本身就是 <code>2^n</code>，规模增长极快。</p>
<h3>10. O(n!) 阶乘时间（排列）</h3>
<p><strong>代码示例：生成全排列（回溯）</strong></p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="python" style="--vp-collapsed-lines:15;--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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> permutations</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> []</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    used </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">False</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">*</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    path </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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">    def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> dfs</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:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(path) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            res.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(path.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">copy</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>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a)):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">            if</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> not</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> used[i]:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                used[i] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> True</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                path.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">append</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a[i])</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">                dfs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                path.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">pop</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">()</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">                used[i] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> False</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">    dfs</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"> res</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 class="collapsed-lines"></div></div><p><strong>为什么是 O(n!)</strong>：第 1 位有 n 种选法，第 2 位 n-1 … ⇒ <code>n*(n-1)*...*1 = n!</code>。</p>
<h3>11. 递归复杂度的两个典型模板（看一眼就会用）</h3>
<p><strong>A. “每次减半”的递归：O(log n)</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> rec_half</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">n</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"> n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</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:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> rec_half</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</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>每次 <code>n → n/2</code>，递归层数 <code>log n</code>。</p>
<p><strong>B. 经典斐波那契（错误示范）：O(2^n)</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> fib_slow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">n</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"> n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</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"> n</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> fib_slow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> fib_slow</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</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></div><p>递归树分叉，节点数指数级增长（重复计算大量子问题）。</p>
<h3>12. 常见“陷阱”：看起来是 O(n)，其实是 O(n²)</h3>
<p><strong>代码示例：循环里用了 <code>.count()</code>（每次 O(n)）</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> count_freq_bad</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    freq </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        freq[x] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">count</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(x)   </span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># count 是 O(n)，外层又 n 次 => O(n^2)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> freq</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><p><strong>为什么是 O(n²)</strong>：外层 <code>n</code> 次，每次 <code>count</code> 扫 <code>n</code> ⇒ <code>n*n</code>。</p>
<p>✅ 改成真正 O(n)：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> count_freq_good</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    freq </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> a:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        freq[x] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> freq.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(x, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> freq</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>13. 一张“常见复杂度-典型原因”速查</h3>
<ul>
<li><code>O(1)</code>：固定次数操作</li>
<li><code>O(log n)</code>：每轮规模按比例缩小（/2、/3…）</li>
<li><code>O(√n)</code>：循环到平方根（试除、某些优化）</li>
<li><code>O(n)</code>：扫一遍输入</li>
<li><code>O(n + m)</code>：扫两份输入</li>
<li><code>O(n log n)</code>：分治（log 层 × 每层 O(n)）</li>
<li><code>O(n²)</code>：两两组合/双重循环</li>
<li><code>O(n³)</code>：三重循环/某些全局 DP</li>
<li><code>O(2^n)</code>：枚举子集/指数分叉递归</li>
<li><code>O(n!)</code>：枚举排列</li>
</ul>
<h2>表 1：常见时间复杂度（带代码结构 + 原因推导）</h2>
<blockquote>
<p>记 <code>n</code> 为输入规模（如列表长度），<code>m</code> 为另一份输入规模（如第二个列表长度），<code>V/E</code> 为图的点/边数。</p>
</blockquote>
<p>| 时间复杂度     | 典型代码结构（Python 形式）                     | 为什么是这个复杂度（次数估算）                               | 常见场景                                        |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-17T10:06:49.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">02-蒜香排骨</title>
    <id>https://bornforthis.cn/column/cookdinner/P04-%E7%83%A7%E7%83%A4%E7%B1%BB/02-%E8%92%9C%E9%A6%99%E6%8E%92%E9%AA%A8.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P04-%E7%83%A7%E7%83%A4%E7%B1%BB/02-%E8%92%9C%E9%A6%99%E6%8E%92%E9%AA%A8.html"/>
    <updated>2026-08-16T15:12:01.486Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-16T11:59:13.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">COMP1730-6730-S2/2025-Ed-Lessons</title>
    <id>https://bornforthis.cn/1v1/101-Sallymisty/Mid-Final-Exam/COMP1730-6730-S22025-Ed-Lessons.html</id>
    <link href="https://bornforthis.cn/1v1/101-Sallymisty/Mid-Final-Exam/COMP1730-6730-S22025-Ed-Lessons.html"/>
    <updated>2026-08-16T15:12:01.490Z</updated>
    <summary type="html"><![CDATA[<h2>1. Mid-term test information</h2>
<p>The mid-term test in week 6 has the maximum mark is 20 and a <strong>hurdle of 7.</strong> That means, you need to obtain a mark of at least 7 to continue the course. <strong>If you didn't achieve 7, you should withdraw from the course before the</strong> <strong>census date 31/8</strong>, so that you don't have to pay the fee. We will of course notify your mark by Friday of week 6 at the latest.</p>]]></summary>
    <content type="html"><![CDATA[<h2>1. Mid-term test information</h2>
<p>The mid-term test in week 6 has the maximum mark is 20 and a <strong>hurdle of 7.</strong> That means, you need to obtain a mark of at least 7 to continue the course. <strong>If you didn't achieve 7, you should withdraw from the course before the</strong> <strong>census date 31/8</strong>, so that you don't have to pay the fee. We will of course notify your mark by Friday of week 6 at the latest.</p>
<h3>Time</h3>
<p>The mid-term test will take place at your same lab time in week 6 (25-29/8).</p>
<h3>Location</h3>
<p>The labs in Hanna Neumann building will stay in the same venue. But those labs in CSIT building may have different venues but will still be in the same CSIT area (the difference will be highlighted in bold):</p>
<ul>
<li>Mon 13-15, 25/8: N112_CSIT</li>
<li>Mon 15-17, 25/8: N111_CSIT</li>
<li>Tue 11-13, 26/8: <strong>N115/116</strong> (instead of N111_CSIT)</li>
<li>Tue 13-15, 26/8: <strong>N115/116</strong> (instead of N111_CSIT)</li>
<li>Wed 9-11, 27/8: <strong>N115/116</strong> (instead of N112_CSIT)</li>
<li>Wed 10-12, 27/8: <strong>N109 and N114_CSIT</strong></li>
<li>Wed 14-16, 27/8: <strong>N109 and N113_CSIT</strong></li>
<li>Wed 15-17, 27/8: 1.23_Hanna</li>
<li>Thu 11-13, 28/8: 1.23_Hanna</li>
<li>Thu 16-18, 28/8: <strong>N115/116</strong> (instead of N112_CSIT)</li>
<li>Fri 11-13, 29/8: 1.24_Hanna</li>
</ul>
<h3>Further information</h3>
<p>Please read this <a href="https://edstem.org/au/courses/25182/discussion/2827976" target="_blank" rel="noopener noreferrer">Ed discussion post</a>.</p>
<h3>Test instructions</h3>
<p>Please read the on the day instructions for the test at <a href="https://edstem.org/au/courses/25182/lessons/90204/slides/618902" target="_blank" rel="noopener noreferrer">Mid-term test instructions</a> before the test. A copy of the instructions will be included in the test.</p>
<h2>2. Instructions</h2>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p><strong>Read all instructions carefully!</strong></p>
</div>
<h3>Test Structure</h3>
<p>The mid-term test has <strong>three programming questions</strong>. Each question asks you to write a piece of Python code to solve a certain problem.</p>
<p>The questions are not equally weighted. The maximum marks for each question is specified in the question title. Questions are not ordered by difficulty: you can read through the questions first, then decide the order in which you want to attempt them.</p>
<p>The total sum of marks is 20. It has a <strong>hurdle</strong> <strong>of 7 mark out of 20</strong>. If you don't pass the hurdle, please withdraw from the course before the census date (31th August).</p>
<blockquote>
<p><strong>If you failed the hurdle but didn't withdraw, then at the end of the semester:</strong></p>
<p>• If your total mark (sum of assignments, mid-term test and final exam) is &lt; 45, you will receive NCN grade.</p>
<p>• If your total mark is &gt;= 45 (and no matter how high it is), you will receive a PX grade and be offered a supplementary exam: passing it will result in 50PS, and failing it will result in NCN grade.</p>
<p>That means, <strong>you would get either NCN or 50PS (at best) if you failed the hurdle, and that's why you are strongly advised to withdraw.</strong></p>
</blockquote>
<p>The test is 90 minutes, with no extra time for reading or submitting. Your remaining time is shown in the timer in the top left, like below.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/be/be19fc5b0998e1f45fa4673cbc636572d56c44db0733b681525d3eca796e8e03.png" alt="Test timer" tabindex="0" loading="lazy"><figcaption>Test timer</figcaption></figure>
<h3>Writing your solution</h3>
<p><strong>For each programming question, you must write your solution into the scaffold file, on Ed</strong>. You may choose to edit this file directly in Ed, or edit outside of Ed in an IDE of your choice by downloading the file (instructions provided below; or you can also copying its contents manually). If you choose to edit the file outside of Ed however, you must upload your completed file back into Ed (or transfer your solution into the file on Ed) before the exam time is over (no extra time is given for uploading/transfer and checking your upload). Solutions not submitted in Ed will not be marked. <strong>The name of the scaffold file also must not be changed</strong> (regardless of whether you are editing in Ed or outside of Ed; if uploading to Ed you should overwrite the existing file).</p>
<p>If you wish to edit the scaffold file outside of Ed in an IDE of your choice, you can download a copy of the scaffold file from the link provided at the bottom of the question text, or from the &quot;Files&quot; tab in the Ed editor</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ba/ba48018402cfa0f409d4f7d5807f423b2430e376094e07ce57e75c6049e4afc3.jpeg" alt="Scaffold file download link and files tab location" tabindex="0" loading="lazy"><figcaption>Scaffold file download link and files tab location</figcaption></figure>
<p>In the &quot;Files&quot; tab, you can download the scaffold file by right clicking on the file then clicking &quot;Download&quot;.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9b/9b9df79f11476d1bae5fcd66c98e9b8c296f75f425d190daeb8d90323c9ed63e.jpeg" alt="Download button location" tabindex="0" loading="lazy"><figcaption>Download button location</figcaption></figure>
<p>For the download link, if the file contents is displayed instead of a download dialog, you may need to right click and click &quot;Save page as&quot; or similar in order to save the file (use the &quot;Files&quot; tab download button if this doesn't work).</p>
<p>To upload your completed file, you should press the &quot;+&quot; button beside the &quot;Files&quot; button, then click the &quot;Upload&quot; button in the menu that opens.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c5/c584384be8bfcf589490565b3115e2e25710b9a2f8fe66866379c6b30c3f34d0.jpeg" alt="Upload button location" tabindex="0" loading="lazy"><figcaption>Upload button location</figcaption></figure>
<p>Note that when you upload a file, it will overwrite any existing file in Ed with the same file name. There will be no warning or confirmation prompt. Please be careful when uploading if you have an existing version of your solution already in Ed that you wish to retain.</p>
<p>If you need to reset the scaffold file on Ed for whatever reason, click the &quot;...&quot; button at the top right, located beside the &quot;Submit&quot; button. You can reset the scaffold file using the &quot;Reset to Scaffold&quot; button in the drop-down menu that opens.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/31/31002fe3dae6e7b68b33680708e5af520730a7065ff5ed55ba45663276976845.jpeg" alt="Reset to scaffold button location" tabindex="0" loading="lazy"><figcaption>Reset to scaffold button location</figcaption></figure>
<p>You will be warned in a confirmation dialog that this action will reset your scaffold file (and delete any other files that you have uploaded or created in Ed). The reset will only reset for that question, it will not reset your other questions.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/05/05036cfd7bd2f56ee948320cf236b2a80acdc0fe033a9956b7f0d88983a44607.png" alt="Reset to scaffold confirmation dialog" tabindex="0" loading="lazy"><figcaption>Reset to scaffold confirmation dialog</figcaption></figure>
<p>If you are sure you have saved any work you want to save elsewhere, or are okay with losing work, continue to press the &quot;Reset&quot; button to reset your scaffold file.</p>
<p>An alternative to the &quot;Reset to Scaffold&quot; button above is to download the scaffold file via the link in the question text and manually restore the scaffold file contents.</p>
<h3>Question requirements</h3>
<p>Each programming question will describe a function you must write, and any other requirements your function must meet. You may also be told what assumptions you may make. Your function will only be tested with valid arguments for marking, and you are not required to check that the arguments do not violate the provided assumptions.</p>
<p>Unless otherwise disallowed or restricted by the question, you are allowed to import any module that is installed in Ed's python environment. All questions are designed to be solvable without using any modules however.</p>
<p>Code will be <strong>marked on the basis of functionality only</strong> <strong>i.e. code quality is not marked.</strong> To be fully functional means the function returns the correct value for all valid arguments.</p>
<p>You are provided a minimal set of basic tests in each question to aid in checking your understanding of the problem and in debugging your solution. The examples included in the question text are usually included in this set of provided tests, but not always all; and the provided tests can include additional cases not included in the examples. The provided tests can be ran by calling the test function in the scaffold file in a console (on Ed or in your IDE), or by clicking the &quot;Test&quot; button on Ed (on Ed only). You can click the &quot;Test&quot; button on Ed as many times as you want. Clicking the &quot;Test&quot; button also does not submit your exam -- you are still able to edit your solutions after clicking it.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ad/adfec93ea124e0ed832dce94a7f81c2406e8e0f4e15bd08d12e8a5e3c5d37ea5.jpeg" alt="Test button location" tabindex="0" loading="lazy"><figcaption>Test button location</figcaption></figure>
<p>The provided minimal set of basic tests is not at all comprehensive and does not cover all edge cases. <strong>Passing the provided set of tests does not prove that your solution is fully correct.</strong> The marks shown when you click the &quot;Test&quot; button is not the marks that your solution will receive, and should be ignored.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2f/2f1eeb9a8504b5cc93b7fea88878e569b20e0377e8c2213f3f96ff2d15b0ebe7.jpeg" alt="Marks shown when tests are ran should be ignored" tabindex="0" loading="lazy"><figcaption>Marks shown when tests are ran should be ignored</figcaption></figure>
<p>For marking, your code will be tested with additional hidden test sets. An equivalent but not identical variant of the provided test set is one of the set of tests in the hidden test sets. Marks will be awarded in relation to, but not proportional to, the number of sets of hidden tests passed (each set of test may have different mark value). <strong>Code that does not pass the provided test set equivalent will receive zero marks</strong> regardless of number of other hidden test sets passed. A submission that does not run (for example, due to syntax errors), that violates the format instructions, or that fails every test case will also receive zero marks.</p>
<p><em>The hidden provided test set equivalent is meant to defeat cases of hard coding all of the provided test case returns only. If you have solved the question normally you do not need to worry about whether you will pass the equivalent if you have passed the original provided test set.</em></p>
<h3>Submitting</h3>
<p>Once you are done with all questions, have checked your solutions, and that they have all been uploaded/transferred into Ed correctly (if applicable), and are ready to submit, press the &quot;Submit&quot; button in the top right corner.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9b/9b450f495d08b3aec7240846048bf464e2ff8f3215aff822575361957900301d.png" alt="img" tabindex="0" loading="lazy"><figcaption>img</figcaption></figure>
<p>A dialog will pop up asking you to confirm whether you want to submit your test. If you have yet to press &quot;Test&quot; on any of your questions, you will be warned in the dialog that some of your slides may be incomplete.</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/68/68048ada85fb16bd94d7ef29d37ef076026d13b564a8417f6bbf469d9771a9fb.png" alt="Submit confirmation dialog (test not ran for some questions)" tabindex="0" loading="lazy"><figcaption>Submit confirmation dialog (test not ran for some questions)</figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e8/e8f91a7658540e5a5b348c867134e88b54166b7f215e9f7c782a1b48d2242540.png" alt="Submit confirmation dialog" tabindex="0" loading="lazy"><figcaption>Submit confirmation dialog</figcaption></figure>
<p>If you are sure you want to submit, tick the &quot;I'm ready to submit&quot; box to enable the &quot;Submit&quot; button, then click the &quot;Submit&quot; button in the to submit your test.</p>
<blockquote>
<p><strong>Once you submit you will not be able to change your solutions or view the test anymore.</strong></p>
<p>Note that you will not be allowed to leave the test venue until at least 1 hour has passed since the start of the test even if you submit early.</p>
<p>If you do not submit via the &quot;Submit&quot; button before the end of your test time, your test will be automatically submitted as-is at the end of the test time. You should ensure sufficient time to upload/transfer your solutions before the end of your test time if working off of Ed.</p>
</blockquote>
<h2>3. Practice mid-term test 1 — Submissions</h2>
<h3>3.1 Question 1: Interval intersection (7/20)</h3>
<p>A closed interval of the real number line is defined by its lower and upper end points. Write a function <code>interval_intersection(lower_a, upper_a, lower_b, upper_b)</code> that returns the length of the intersection of two intervals <em>A</em> and <em>B</em>. Arguments <code>lower_a</code> and <code>upper_a</code> are the lower and upper end points of interval <em>A</em>, and <code>lower_b</code> and <code>upper_b</code> are the lower and upper end points of interval <em>B</em>. If the intervals do not intersect, the function should return 0.</p>
<p>For example, <code>interval_intersection(0, 3, 1, 5)</code> should return <code>2</code>, because the intersection of the two intervals <code>(0,3)</code> and <code>(1,5)</code> is <code>(1,3)</code>, which has a length of <code>3 - 1 = 2</code>.</p>
<p>A scaffold file <code>interval_intersection.py</code> is provided. You must write your solution into this file.</p>
<p>Requirements:</p>
<ul>
<li>The function that you write must be named <code>interval_intersection</code> and it must have four parameters.</li>
<li>You can assume that the parameters are numbers such as <code>int</code>, <code>float</code>.</li>
<li>The function must return a number.</li>
</ul>
<p>Your solution will be marked on functionality only (no code quality considered). To be fully functional means that it returns the correct value for all valid arguments. You can test it by either clicking the &quot;Test&quot; button in Ed or running <code>test_interval_intersection</code> provided in the scaffold file. Passing the tests does not prove that your solution is correct. <strong>Failing any test proves that your function is wrong.</strong> Code that does not run (for example due to syntax errors) or that fails every test case will receive <strong>zero marks</strong>.</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="python" style="--vp-collapsed-lines:15;--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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> interval_intersection</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">lower_a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> upper_a</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> lower_b</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> upper_b</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">     start </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> max</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(lower_a , lower_b)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">     end </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> min</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(upper_a , upper_b)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">     if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> start </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">>=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> end:</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">     return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> end </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> start</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> test_interval_intersection</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    """</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    This function runs a number of tests of the interval_intersection function.</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    If some test fails, there will be an error message.</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    """</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> abs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">interval_intersection</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">2</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:#986801;--shiki-dark:#D19A66">7.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1e-6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"no intersection (upper_a &#x3C; lower_b)"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> abs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">interval_intersection</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:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2.5</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:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1e-6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"intersection is [2.5, 3]"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> abs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">interval_intersection</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:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1e-6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"intersection is [1.5, 3]"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> abs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">interval_intersection</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">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1e-6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"intersection is [0, 1.5]"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> abs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">interval_intersection</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:#986801;--shiki-dark:#D19A66">3</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">3.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2.0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1e-6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"A is contained in B"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> abs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">interval_intersection</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3.5</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">3.5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2.0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1e-6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"A is contained in B"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Current tests passed. Note that in final marking we may use different test cases."</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 class="collapsed-lines"></div></div>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-10T22:48:55.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-WebUI：免费AI绘画工具箱的 N 大绘图功能</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P16-ai-drawing-core-tech-and-practice/01-webui-free-ai-drawing-toolbox-features.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P16-ai-drawing-core-tech-and-practice/01-webui-free-ai-drawing-toolbox-features.html"/>
    <updated>2026-08-16T15:12:01.528Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/24/24488aaa9b8d30fe9104ad9196c7d9eb5b1a566ca8bb638e7675a646e9caf1cb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>欢迎和我一起探索 AI 绘画的魅力。热身篇这一章相当于整个学习过程里的“新手村”，我会带你一起熟悉各种各样免费开源的 AI 绘画工具和模型，帮助你全面掌握 AI 绘画的无限潜能。</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/24/24488aaa9b8d30fe9104ad9196c7d9eb5b1a566ca8bb638e7675a646e9caf1cb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>欢迎和我一起探索 AI 绘画的魅力。热身篇这一章相当于整个学习过程里的“新手村”，我会带你一起熟悉各种各样免费开源的 AI 绘画工具和模型，帮助你全面掌握 AI 绘画的无限潜能。</p>
<p>今天是课程的第一讲，我们先从 Stable Diffusion 和 WebUI 说起。学完今天的内容，你不但能够知道 Stable Diffusion 的来龙去脉，还能解锁 WebUI 里的特色功能，来实现各种富有想象力的视觉创意。</p>
<h2>1. 初识 WebUI</h2>
<p>想必你一定听说过 Stable Diffusion，其背后的技术便是人们常说的扩散模型。扩散模型这个概念源自热力学，在图像生成问题中得以应用。</p>
<p>简言之，Stable Diffusion 是这样一个过程：你不妨想象一下，任何一张图像都可以通过不断添加噪声变成一张完全被噪声覆盖的图像；反过来，任何一张噪声图像通过逐步合理地去除噪声，变得清晰可辨。</p>
<p>Stable Diffusion（以下简称 SD）在 AI 绘画领域中闪耀着耀眼的光芒，SD 背后的方法在学术界被称为 Latent Diffusion，论文发表于 2022 年计算机顶会 CVPR，相关知识在后面的课程中我们会涉及，这里先按下不表。此时你只需要知道，SD 模型可以输入文本，生成图像。这里提到的文本，就是我们常说的 prompt。比如下面这张图，就是由 SD 模型生成的。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/89/896638be72e22754ae750e1b2495fc41d5f1c33a6352f1e78a958cfa36e71a50.jpg" alt="图片来源：https://stability.ai/blog/stable-diffusion-public-release" tabindex="0" loading="lazy"><figcaption>图片来源：https://stability.ai/blog/stable-diffusion-public-release</figcaption></figure>
<p>这里我并非打算讨论其学术价值，而是想和你说说 SD 模型的高昂成本。你知道吗，训练一个 Stable Diffusion 模型的代价相当可观。SD 模型有几个备受关注的版本，比如 SD 1.4、SD 1.5 和 SD 2.0。</p>
<p>为了训练这些模型，需要使用巨大的数据集，包含 20 亿至 50 亿个图像文本对。这一庞大任务需要依赖数百块 A100 显卡，每块 A100 的价格大约在十万元左右。以 SD 1.5 为例，训练过程需要使用 256 块 A100 显卡，并持续耗时 30 天。这样一算，你可能会感叹，这投入都够买好几套海淀区的学区房了，真不是普通人能玩得起的！</p>
<p>然而，令人惊喜和惊叹的是，这些令人炫目的成果竟然被开源了！这一开源举措在整个社区中引发了热烈反响，掀起了一股热潮。开源的 SD 模型让我们真切感受到了文生图的强大魅力和言出法随的创作能力。</p>
<p>然而，复杂的代码逻辑也让普通用户望而却步。我们今天要用到的 WebUI 便应运而生。2022 年 10 月，开源社区 AUTOMATIC1111 推出了名为 “stable-diffusion-webui” 的图形化界面，为普通用户提供了方便快捷的构建 SD 模型图像 UI 界面的工具。</p>
<p>通过这个界面，用户可以体验到 SD 模型一系列的功能，包括文生图、图生图、inpainting 和 outpainting 等等，甚至还能自定义训练具有指定风格的全新模型。由于开源、易于上手和功能全面等诸多优势，SD WebUI 迅速成为 SD 模型系列中最出色、使用最广泛的图形化程序之一。</p>
<p>为了让你在上手实操前有个基本认识，这里我先贴了个 WebUI 的界面图。</p>
<p>你可以看到，在这个界面最上面的部分，你可以选择各种不同的 AI 绘画模型和不同的 AI 绘画功能；右侧可以展示出 AI 绘画的效果，供我们根据喜好决定是否保存到本地；至于左侧的参数信息怎么用，稍后我再详细讲解。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c2/c2c0f9c24ac44fcc8b4e48fa0eda3b9e1fe5a73861294ae592486d77c88a7c88.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>与其他 AI 绘画类模型如 Midjoruney、DALL-E 2 相比，SD WebUI 可以免费在个人电脑或服务器上运行，并根据用户意愿进行改造和扩展。随着社区力量的涌入，SD WebUI 还拥有了丰富的插件，如 LoRA、ControlNet 等，它们让原生 SD 模型的能力和表现更加出色。</p>
<p>目前，SD WebUI 已经支持多平台运行，包括 Windows、MacOS 和 Linux 系统，支持英伟达、AMD 和苹果 M 系列等多种 GPU 架构。对于追求高自由度的 AI 绘画艺术家而言，SD WebUI 几乎已经成为该领域的首选工具。</p>
<h2>2. WebUI 的安装和部署</h2>
<p>一提到安装 WebUI，你可能会担心 GPU 的问题。我事先说明，先把心放在肚子里。因为 WebUI 既可以使用自己的本地 GPU，也可以使用第三方提供的 GPU 资源。</p>
<p>如果你拥有个人显卡或 GPU 服务器，并且希望按照官方的安装方式进行操作，那么首先需要下载 SD WebUI 的代码。你可以使用 Git 命令将整个仓库克隆到本地。如果你的网络速度比较慢，也可以在 GitHub 主页中找到并下载已打包好的 zip 压缩包。</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:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clone</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://github.com/AUTOMATIC1111/stable-diffusion-webui.git</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>对于 Windows 用户，可以像后面这样操作。</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:#4078F2;--shiki-dark:#61AFEF">1.</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 安装Python</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 3.10.6，勾选</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Add Python to PATH"。</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">2.</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 从</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Windows</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 资源管理器</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">CMD</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 终端</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">中以非管理员的用户身份运行</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> webui-user.bat。</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></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/00/0032c2f9257564eba55dcc28d2bcbb250f546f4abd926680bed6c9c684e387fa.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>对于 Linux 用户，打开终端命令行。</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"># Debian-based:</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> apt</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> wget</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> python3</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> python3-venv</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Red Hat-based:</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> dnf</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> wget</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> python3</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Arch-based:</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> pacman</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -S</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> wget</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> python3</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">bash</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> &#x3C;(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">wget</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -qO-</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://raw.githubusercontent.com/AUTOMATIC1111/stable-diffusion-webui/master/webui.sh)</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><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cb/cbef6a8a766f0732930848903d396c6adc70cca5cb8a661b1d5f7117ebffed3b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>对于苹果 M 系列芯片的电脑用户，打开电脑的 iTerm 命令行工具，根据这个<a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon" target="_blank" rel="noopener noreferrer">教程链接</a>来安装 WebUI。</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"># 首先 cd 到你希望安装 WebUI 的位置</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">brew</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cmake</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> protobuf</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> rust</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> python@3.10</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> wget</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clone</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://github.com/AUTOMATIC1111/stable-diffusion-webui</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> stable-diffusion-webui</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> no_proxy</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"localhost, 127.0.0.1, ::1"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./webui.sh</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>http://127.0.0.1:7860</code>，便可以进入 WebUI。在丐版 M2 处理器的 MacBook Air 上，20 步生成 512 分辨率的单张图像，大概需要 25 秒。即使没有英伟达的高端显卡，也可以在本地进行 AI 绘画。</p>
<p>更详细的安装方案和问题，你可以参考<a href="https://github.com/AUTOMATIC1111/stable-diffusion-webui" target="_blank" rel="noopener noreferrer">官方指南</a>。</p>
<p>如果你本地没有英伟达显卡，而且不希望等太久，可以使用各种第三方平台提供的 GPU 资源进行操作。这需要发挥下你的聪明才智，也欢迎小伙伴们在评论区留下你的方法。启动 WebUI 后的界面可以看下面的图示。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/36/3636a2f6ced62d5c258c95fbbc579045c7729de535459160ab9f1f8e5015892b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>此外，如果你希望进行汉化或者探索更多功能，可以在 Extensions（扩展）中进一步探索。Extensions 提供了一系列额外的功能和工具，里面包括很多功能和定制选项，这让我们的 WebUI 体验更加个性化和定制化。</p>
<p>到这里，我们就完成了 WebUI 的安装和部署。搞定了环境问题，我们便可以玩转 WebUI 了！</p>
<h2>3. WebUI 基本能力之文生图</h2>
<p>现在让我们开始创作吧！首先我们需要熟悉一下后面这些参数信息。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/25/250c852c733f2d36eb5e1097ed7199f72fe8512694c6b243b78f7e1208ed3935.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ul>
<li>
<p>Stable Diffusion checkpoint：这里可以选择已经下载的模型。目前许多平台支持开源的 SD 模型下载，例如 Civitai、Hugging Face 等。</p>
</li>
<li>
<p>txt2img：这个选项表示启用文生图（text-to-image）功能。类似地，img2img 等选项则代表其他功能。</p>
</li>
<li>
<p>prompt：用于生成图像的文字输入，需要使用英文输入，但你也可以通过探索 Extensions 来实现中文输入。</p>
</li>
<li>
<p>negative prompt：这是生成图像的反向提示词，用于指定你不希望模型生成的内容。例如，如果你不想图像中出现红色，可以在这里输入“red”。</p>
</li>
<li>
<p>Sampling method：不同的采样算法，这里深入了 Diffusion 算法领域，稍后我们会更详细地讲解。简单来说，通过这些采样算法，噪声图像可以逐渐变得更清晰。</p>
</li>
<li>
<p>Sampling steps：与采样算法配合使用，表示生成图像的步数。步数越大，需要等待的时间越长。通常 20-30 步就足够了。</p>
</li>
<li>
<p>Width &amp; Height：生成图像的宽度和高度。</p>
</li>
<li>
<p>Batch count：<strong>Batch count = 连续“跑几轮”生成任务</strong>，每一轮都会生成 Batch size 张图</p>
<blockquote>
<p>👉 <strong>总生成图片数 = Batch count × Batch size</strong></p>
</blockquote>
</li>
<li>
<p>Batch size：每次生成的图像数。如果显存不够大，建议调小这个数值。</p>
</li>
<li>
<p>CFG scale：这里表示 prompt 的影响程度。值越大，prompt 的影响就越大。</p>
</li>
<li>
<p>Seed：生成图像的随机种子，类似于抽奖的幸运种子，会影响生成的图像结果。</p>
</li>
</ul>
<p>这些参数的变化会对最终的生成效果产生千般变化。每一个参数都扮演着重要的角色，影响着生成图像的质量、多样性和风格。理解和熟悉这些参数的作用是使用 WebUI 进行图像生成和编辑的关键。</p>
<p>但你不用着急，在后续的课程中，我们将会详细拆解这些参数的作用，逐一介绍它们对生成效果的影响。通过学习这些参数的作用，你将能够更加准确地控制生成图像的特征和风格，实现自己所需的创作效果。</p>
<p>OK，开启 AI 绘画！我们在 WebUI 界面中使用如下参数，让 SD 模型帮我们生成一只可爱的小猫。这里我们使用的是一个名为 RealisticVision 的模型，你可以点开<a href="https://civitai.com/models/4201?modelVersionId=6987" target="_blank" rel="noopener noreferrer">这个链接</a>进行模型下载，然后将模型放置在 WebUI 安装路径下的模型文件夹中。</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"># 模型文件夹地址：./stable-diffusion-webui/models/Stable-diffusion </span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">model：realisticVisionV13_v13.safetensors[c35782bad8]</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">prompt：a</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> photo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> of</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> a</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cute</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cat</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Sampling</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> method：Euler</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> A</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Sampling</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> steps：20</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Width</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &#x26; </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Height:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 512</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Batch</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> size:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 4</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">CFG</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> scale:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 7</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">seed:</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</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>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/fa/fab97b6c86ac9a7ab787f83b5b07af116be8f981e5f4688c464aa0471165b7b4.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>通过 SD 模型，几只可爱的小猫瞬间诞生了！然而，这些小猫似乎带着一丝悲伤。不过，我们可以保持相同的参数，把 prompt 语句稍作修改，在 cute 和 happy cat 之间多写一个单词 “and”。</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:#4078F2;--shiki-dark:#61AFEF">prompt：a</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> photo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> of</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> a</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cute</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> and</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> happy</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cat</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f4/f4075f3ee6731e2a51c6b3d18f0361eea218f8092b117786cb97bb50a6068212.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>魔法再次生效！现在这些可爱的小猫展现出了微笑的表情。接下来，你可以放飞想象力，将所有的生成和创作交给 SD 模型完成了！AI 绘图的文生图模式已经为你打开大门，更加广阔的创作空间就在眼前！</p>
<h2>4. WebUI 的其它有趣功能</h2>
<p>除了基本的文生图能力外，WebUI 在图像生成和编辑方面几乎无所不能。我们继续探索 WebUI 的其他玩法。</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-04T10:57:55.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-OpenClaw 安装教程「适合：Mac、Windows」</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/01-install-step.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P15-OpenClaw/01-install-step.html"/>
    <updated>2026-08-16T15:12:01.533Z</updated>
    <summary type="html"><![CDATA[<div style="text-align:center">
<h3>【保姆级教程】手把手教你安装 OpenClaw 并接入飞书，让AI在聊天软件里帮你干活</h3>
</div>
<div class="hint-container tip">
<p class="hint-container-title">更新记录📝</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 2026-02-08 22:16:26：飞书配置部分待改进，OpenClaw 部分没有大问题了。</label></li>
</ul>
</div>]]></summary>
    <content type="html"><![CDATA[<div style="text-align:center">
<h3>【保姆级教程】手把手教你安装 OpenClaw 并接入飞书，让AI在聊天软件里帮你干活</h3>
</div>
<div class="hint-container tip">
<p class="hint-container-title">更新记录📝</p>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 2026-02-08 22:16:26：飞书配置部分待改进，OpenClaw 部分没有大问题了。</label></li>
</ul>
</div>
<p>你好，我是悦创。</p>
<p>这里先做一下简单的科普：<code>OpenClaw</code> 的名字经历了三次变更，第一次叫做 <code>ClawdBot</code>，后来因为名字跟 <code>Claude</code> 太过相似，被 <code>Claude</code> 告侵权，遂改名 <code>MoltBot</code> 。</p>
<p>但是后来在改名过程中遭遇域名和社交账号被抢注，甚至出坑同名加密货币割韭菜的情况，导致名称传播受阻。</p>
<p>最终定名为：<strong>OpenClaw</strong>。</p>
<p>所以，名字经历先后顺序为：ClawdBot -&gt; MoltBot -&gt; OpenClaw</p>
<p>大家不要因为名字困惑了，怀疑是不是自己下错软件了，他们都是同一个。</p>
<h2>1. 什么是 OpenClaw？</h2>
<h3>1.1 真正“能干活”的个人 AI 助手</h3>
<p><strong>OpenClaw（前身为 Clawdbot）</strong> 是一款在 <strong>2026 年迅速走红的开源个人 AI 助手</strong>，在 GitHub 上已收获 <strong>10 万+ Star</strong>。</p>
<p>它和你熟悉的那些“只会聊天”的 AI，有着本质上的不同。</p>
<h3>1.2 🚀 它和传统 AI 的根本差异</h3>
<ul>
<li>
<p><strong>不是只会说，而是真的会做</strong>：不仅能回答问题，还能直接在你的电脑上执行操作。</p>
</li>
<li>
<p><strong>全天候在线的数字助理</strong>：你休息时，它依然在后台替你完成任务。</p>
</li>
<li>
<p><strong>完全开源 &amp; 永久免费</strong>：没有黑箱，代码透明，所有数据牢牢掌握在自己手中。</p>
</li>
<li>
<p><strong>全平台指挥，一句话下达任务</strong>：海外支持：WhatsApp、Telegram、Discord、Slack、iMessage；国内支持：飞书、钉钉等主流办公与即时通讯工具</p>
</li>
</ul>
<h3>1.3 🤖 OpenClaw 能为你做什么？</h3>
<p>它不是“陪你聊天”的机器人，而是<strong>真正会在你电脑上动手干活的 AI</strong>。</p>
<ul>
<li>
<p>你说一句：“<strong>帮我整理一下上个月的邮件</strong>”</p>
<p>它就开始自动分类、归档、清理。</p>
</li>
<li>
<p>你已经入睡：它仍在后台运行，退订垃圾广告、预约行程、巡检日志、定位 Bug……</p>
</li>
<li>
<p>你在任何一个聊天软件里：给它发条消息，它就立刻执行。</p>
</li>
</ul>
<h3>1.4 ✨ 一句话总结</h3>
<p><strong>把事情交给它就行了。</strong></p>
<p>从整理文件、处理邮件，到自动化任务，甚至联动智能家居控制灯光—— OpenClaw 都会在后台默默完成。</p>
<p>它不是助手的“概念版”，而是你电脑里真正存在的 <strong>JARVIS 级 AI 管家</strong>。</p>
<p>一个<strong>超级智能、能落地、能执行的个人 AI 助理</strong>。</p>
<p>令我感到遗憾的是：还不能达到真正的“手”不能自动识别各种软件，要是可以识别就可以扩展更多功能。（至少还不能发微信～）</p>
<h2>2. 安装 Node.js</h2>
<p>下载地址：<a href="https://nodejs.org/zh-cn/download" target="_blank" rel="noopener noreferrer">https://nodejs.org/zh-cn/download</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/85/8533f1e7ac70b967d564a518222476fb2a22f37ea63780a0348052aee827f2f9.png" alt="Windows" tabindex="0" loading="lazy"><figcaption>Windows</figcaption></figure>
<p>自行选择 Mac 或 Windows 进行下载、安装，安装步骤默认操作即可。</p>
<h2>3. 开始安装「MacOS &amp; Windows」</h2>
<h3>3.1 Mac 和 Windows 说明</h3>
<p>Mac 直接启动终端即可，Windows 需要按如下指示操作：</p>
<ol>
<li>
<p>设置 PowerShell 执行权限</p>
<ol>
<li>按 <code>Win</code> 键，搜索 <strong>PowerShell</strong></li>
<li>右键点击 <strong>Windows</strong> <strong>PowerShell</strong></li>
<li>选择 <strong>以管理员身份运行</strong></li>
<li>点击 <strong>是</strong> 确认</li>
</ol>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b3/b3917ebfb421b68bb20c641d34586e4feb377e70b0b560173106d84859b71eeb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>在管理员 PowerShell 窗口中，依次执行以下两条命令：</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">Set-ExecutionPolicy</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> RemoteSigned</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -Scope</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> CurrentUser</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">Set-ExecutionPolicy</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -Scope</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Process</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -ExecutionPolicy</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Bypass</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><blockquote>
<p><strong>安全提示</strong>：这些命令只会影响您自己的账户，不会影响系统安全或其他用户。</p>
</blockquote>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/21/213529d0132101656a817f8fbd97f66695164ebf6ae999aad73ec532ff717ddb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
</ol>
<h3>3.2 执行一键安装命令</h3>
<ul>
<li>
<p>Mac 使用官方推荐命令，进行一键安装：</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:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://openclaw.ai/install.sh</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">bash</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
<li>
<p>Windows 在 PowerShell 执行如下命令：</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:#4078F2;--shiki-dark:#61AFEF">iwr</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -useb</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://openclaw.ai/install.ps1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">iex</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></li>
</ul>
<p><strong>安装过程会自动完成：</strong></p>
<ul>
<li>检测系统环境</li>
<li>安装必要依赖（Node.js 等）</li>
<li>下载 OpenClaw 核心文件</li>
<li>配置环境变量</li>
<li>启动配置向导</li>
</ul>
<blockquote>
<p><strong>注意</strong>：如果前面你并没有自己提前安装 Node.js，但执行命令后，出现报错，可以自己到官网下载 node 安装包，自己安装 node 环境，注意版本最好在 <code>node v22.x</code> 以上， node 官网下载地址：<a href="https://nodejs.org/zh-cn/download" target="_blank" rel="noopener noreferrer">https://nodejs.org/zh-cn/download</a>，若还是不懂怎么安装，可以添加我微信：<code>Jiabcdefh</code> 进行付费安装。</p>
</blockquote>
<p><strong>Tisp</strong>：下面截图是 Windows 界面，Mac 类似，就不提供截图了。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/72/7282097918b8b7d745767aa570c23fe4373673be9473f4f0662553a2261f18c6.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/95/95b7345a9ead18c4b2db829456afc5f6a471335d615eeb07000e70cfa1ca4ecc.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>4. 初始配置向导</h2>
<p>安装完成后，会自动进入配置向导（<code>openclaw onboard</code>）。</p>
<h3>4.1 风险告知</h3>
<p>这一步主要是告诉你，使用 OpenClaw 可能会有一些风险。请问你是否继续？</p>
<p>按 向左方向键 ←，选择 <code>Yes</code>，按 <code>Enter</code> 回车确认：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/84/84108c5f3f131b9ffb94063fd57c9cdf78b33a95c14bb4fa27770344233365c9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.2 选择 QiuickStart 模式</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e9/e95524c04ba45a6fdb83ed2594ec8e57e2db4659b198fd0433f8c84638d617a8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.3 配置 AI 模型 API Key</h3>
<p>OpenClaw 需要连接到大语言模型才能工作。Openclaw 比较费token，国外模型成本高，门槛也高，这里我选择国内的智谱的 GLM 4.7</p>
<blockquote>
<p>如果没有智谱的 API Key，点击官方地址自己注册账号获取 API key：<a href="https://www.bigmodel.cn/invite?icode=kfX4Vy3FW818IlOHqfkX%2BlwpqjqOwPB5EXW6OL4DgqY%3D" target="_blank" rel="noopener noreferrer">https://www.bigmodel.cn/invite?icode=kfX4Vy3FW818IlOHqfkX%2BlwpqjqOwPB5EXW6OL4DgqY%3D</a></p>
</blockquote>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bf/bfa3b805118fc756a694b3d7c5fcd73fcbca6a3301478dc2b3266d6173f5952c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>输入自己的 API Key：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/db/dbc4c9f05883caacfe981b2575cb192222656238abc9df69eeb0a1fb08c5963a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.4 选择 AI 模型</h3>
<blockquote>
<p>这里我选择默认的 GLM 4.7，也是智普当前的旗舰模型。</p>
</blockquote>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e0/e0e2eb19edb0d0ec622556cc2e99f9c6742ab07878e2d6c8a8c734701f381bdd.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.5 连接即时通讯平台</h3>
<p>配置完 AI 模型后，OpenClaw 会询问你要连接哪个通讯平台？</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/21/212d37b6749d4e02ad61e7b33745deda0b15253b30ddb469dac9ef74956cadd1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<blockquote>
<p>OpenClaw 原生支持的即时通信平台主要是海外的 WhatsApp、Telegram、Discord、Slack、iMessage 等，国内用户不习惯，这里国产即时通信软件大厂也跟进了，现在钉钉，飞书等都已支持接入 OpenClaw</p>
</blockquote>
<p><strong>后面</strong>会带领大家把<strong>飞书机器人接入 OpenClaw</strong>，使大家可以通过飞书即可指挥 OpenClaw 为我们干活，但是飞书配置比较复杂，这里我们先选择跳过，后面我们可以通过继续进行配置：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d2/d2986056a014f6bfe57b43adf9a0831d069a32a6738408944017d60304296165.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.6 选择 Skills</h3>
<p>这里也选择：No，暂不配置，后面通过UI界面进行配置：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c4/c43454406652a8415657254a12f73a94e3373992b0d4da0851f2c5548b20f392.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.7 是否开启 Hooks</h3>
<p>操作步骤：先敲<strong>空格</strong>，表示选中当前项，再敲回车键。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/96/96befc4f3c3c3b1f619195fc1b0f5e26287e62db40933fdecca6beb72c28f74a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.8 启动服务并打开 UI 界面</h3>
<p>此时它会自动再打开一个命令窗口来启动服务：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/47/47c472aa22c7776fde7b83fec9d77f967a49447470130c294784d3dc038cc672.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<blockquote>
<p>这个过程是在启动服务，可能会需要等一点时间。</p>
</blockquote>
<p>Mac 系统不会打开新的命令窗口，只会在同一个窗口执行。</p>
<p>同时，大约过 30 秒左右，我们回到刚才的设置窗口，选择 <code>Open the Web UI</code> ，打开 <code>OpenClaw</code> 的 UI 界面：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/7b/7bd6919ab4e0bb5bf0ac3880fdd599980a4dfbb9896050d53363666096b7169a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>浏览器自动打开Web UI界面：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/6a/6ae45be0b326cd35c0e7528186fd30773d212a602dff2376e6c0e81c23630baa.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.9 测试一下</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/92/92bd0bf3ca3a60e59a149e2310dd580affe04a4e3cf13afe1a66873bfa317805.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>5. 对接飞书机器人</h2>
<p>我们需要先到飞书平台创建自己的机器人来接入 OpenClaw：</p>
<h3>5.1 来到飞书开发者后台</h3>
<p>飞书开放平台地址：<a href="https://open.feishu.cn" target="_blank" rel="noopener noreferrer">https://open.feishu.cn</a>，没有飞书账号的，需要自己注册账号。</p>
<p>点击右上角进入 <strong>开发者后台</strong>：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9a/9ae4b20225376e48390a5f20dd441dadff50cfe12705fe3534c88e34f011964e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.2 创建应用</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/08/084ed0cb2698ff8119c10db573deb981f9fd1606d71c940bdcdbca87aae46b8a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.3 填写应用信息</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/66/66dc3c769941678d0f6ad9ce947736e8c6c4b83008126256767bbe00d25a96e9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.4 给应用添加机器人</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/4b/4be8afda0b7819e05803e9b3da8103ba5079d46fbd48244bd12ad9943b242c96.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/16/165383162600731666256b0078cd7d73e006ce22d51453f982b3d389f03b774f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.5 给应用配置权限</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/75/7552e054af35e2a7e4e857955f47835974d249a91f57211c6eb7d69e1e1358ef.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>把即时通讯相关的权限全部开通：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9b/9b3a8e98e37c6b045c4ea5018ecb727a0f0552fddbdf2bb1b54b7551a2c00aca.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.6 创建版本并发布</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/15/15df24959d16d85b3316f9978eeeb8a6251ec7c9c413399b8e507c02d628e13a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3f/3f8c8f8d77ab0a0d2cfe6f9af8d814a10559bae2fc83557c9b0f254634713f5a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3c/3c86598f145a141e5c7fb19b4f635e459ad9ee5eedadb90eb451295627de8773.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/dd/dd9ff6b118a6d2790582545c7f0d58c5b005442e9055ea6bf7b25db57d21d340.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cf/cfec5ce7d50da8b2b807c5e02bca741019cfbe85a605a7b20a00f646689a25f4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.7 来到飞书客户端进行审批</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ca/ca375cc138fd14ecd63265f57f3f9d690579ec7074904bbb796fd53ff01c99ed.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/4c/4ce76c61ac389fcbadc86f82f562f9c7a10e5eb5ab0845d1b0aa6c700555ad41.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/1a/1ac20b81691dc5e6adad94a5f9850f51e97398fd289650c9b5b063c81326451b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3a/3a93e2f0dbc455cb9efe73321c72ae0af5e1050509a3dbfa532f202d19a59e5f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.8 获取自己的应用凭证</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/39/39e330711f79587e309e34c2c609335b24d9bd76d66fa23bd4a9410dd26efcdd.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.9 安装飞书插件</h3>
<p><strong>你可知道：写着写着 OpenClaw 就更新了，也支持了飞书功能。估计是有“大佬”，向 OpenClaw 官方投稿了，依然是以插件的形式存在。链接：<a href="https://docs.openclaw.ai/channels/feishu" target="_blank" rel="noopener noreferrer">https://docs.openclaw.ai/channels/feishu</a></strong> 下面的图片因为已经做好，所以就不进行太多更新，整体是一致的。（国外的通讯软件也很好用，很好配置（推荐））</p>
<blockquote>
<p>OpenClaw 官方飞书投稿的教程，写的很烂～</p>
</blockquote>
<p>并且在你初始化 OpenClaw 的时候，就会有飞书的选项。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e5/e5fcce586ab5d043f70c35a0a10354b714fa72bb49bcc784215d028631891977.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>并且选择进去后，会提示：是否下载。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/05/052eddd5569ef6ffaee4bc52b5ebab5766035289b9024203f5ddce08b99fd773.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-03T10:42:38.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">macOS 配置多个 GitHub 账号 SSH 的完整指南（个人 / 公司通用）</title>
    <id>https://bornforthis.cn/blog/2026/macos-multiple-github-accounts-ssh.html</id>
    <link href="https://bornforthis.cn/blog/2026/macos-multiple-github-accounts-ssh.html"/>
    <updated>2026-08-16T15:12:01.541Z</updated>
    <summary type="html"><![CDATA[<div style="text-align:center">
<h3>一台 MacOS 电脑，如何配置多个 GitHub 账号 SSH。</h3>
</div>
<h2>1. 为什么需要配置多个 GitHub 账号？</h2>
<p>在真实的开发环境中，我们常常会遇到这样的场景：</p>
<ul>
<li>一个 <strong>GitHub 个人账号</strong>；</li>
<li>一个或多个 <strong>公司 / 组织账号</strong>；</li>
<li>不同项目要求使用 <strong>不同 GitHub 身份</strong>；</li>
<li>希望 <code>git push</code> 时 <strong>不需要手动切换账号</strong>；</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<div style="text-align:center">
<h3>一台 MacOS 电脑，如何配置多个 GitHub 账号 SSH。</h3>
</div>
<h2>1. 为什么需要配置多个 GitHub 账号？</h2>
<p>在真实的开发环境中，我们常常会遇到这样的场景：</p>
<ul>
<li>一个 <strong>GitHub 个人账号</strong>；</li>
<li>一个或多个 <strong>公司 / 组织账号</strong>；</li>
<li>不同项目要求使用 <strong>不同 GitHub 身份</strong>；</li>
<li>希望 <code>git push</code> 时 <strong>不需要手动切换账号</strong>；</li>
</ul>
<p>如果直接使用默认的 SSH 配置，通常会遇到：</p>
<ul>
<li>推送到错误的 GitHub 账号；</li>
<li>没权限却一直提示 <code>Permission denied (publickey)</code>；</li>
<li>SSH 不停尝试错误的 key，导致认证失败；</li>
<li>无法配置新 GitHub 账号的 SSH，显示 <code>Key is already in use GitHub</code>；</li>
</ul>
<p><strong>解决方案只有一个：</strong></p>
<blockquote>
<p><strong>使用多个 SSH Key + SSH Host 别名，将不同项目路由到不同 GitHub 账号</strong>。</p>
<p>换句话说：<strong>同一台 Mac，一条命令无脑 push</strong>。</p>
</blockquote>
<h2>2. 整体实现思路（先理解，再操作）</h2>
<p>整个方案的核心结构如下：</p>
<p>| 模块               | 作用                 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-03T07:10:41.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-登台远望：Claude Code 底层技术全景导览</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/01-claude-code-technical-overview.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/01-claude-code-technical-overview.html"/>
    <updated>2026-08-16T15:12:01.545Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/4e/4e65b1040c4bbeaadc5c52746567564eba2f480099573ac370bc4ea76f3f82ea.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。让我们正式开启第一课的学习。</p>
<p>在我们的旅程正式启航之际，请你先思考第一个问题：你眼中的 Claude Code 是什么？</p>
<p>我们可能会得到很多个不同的答案：</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/4e/4e65b1040c4bbeaadc5c52746567564eba2f480099573ac370bc4ea76f3f82ea.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。让我们正式开启第一课的学习。</p>
<p>在我们的旅程正式启航之际，请你先思考第一个问题：你眼中的 Claude Code 是什么？</p>
<p>我们可能会得到很多个不同的答案：</p>
<ul>
<li>一个能读懂代码的 AI 助手；</li>
<li>命令行里的 ChatGPT；</li>
<li>帮我写代码的工具；</li>
<li>比 GitHub Copilot 更强大的东西；</li>
</ul>
<p>这些答案都对，但都不完整。</p>
<p><strong>Claude Code 的真正身份是：一个可编程、可扩展、可组合的 AI Agent 框架。</strong></p>
<p>它不只是一个“工具“，而是一个“平台”——你可以在上面构建自己的 AI 工作流。就像你不会说“VS Code 是一个文本编辑器”（它是，但远不止于此），Claude Code 也远不只是一个 AI 助手。</p>
<p>这一讲，我们将站在高处，俯瞰 Claude Code 的完整技术栈。当你理解了全貌，后面学习每一个组件时，都会知道它在整个系统中的位置。</p>
<h2>1. Claude Code 5 分钟快速上手</h2>
<p>我们先花几分钟，把 Claude Code 用起来。第一步，在<a href="https://code.claude.com/docs/en/desktop" target="_blank" rel="noopener noreferrer">这里</a>下载匹配你系统的 Claude Code 版本。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/98/98211a88d98241915fbb46d92fa1b65828cccb4459dc1fa0d4b1f49f9f66755a.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<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"># macOS / Linux / WSL（推荐，自动更新）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://claude.ai/install.sh</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">bash</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"># Windows PowerShell</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">irm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://claude.ai/install.ps1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">iex</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Windows CMD:</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">curl</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -fsSL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> https://claude.ai/install.cmd</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -o</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install.cmd</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &#x26;&#x26; </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">install.cmd</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &#x26;&#x26; </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">del</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install.cmd</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"># 或使用 Homebrew（需手动更新）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">brew</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --cask</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> claude-code</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>然后进入操作系统的命令行，输入 claude 这个命令就可以开始对话了。</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:#4078F2;--shiki-dark:#61AFEF">claude</span><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></div><p>Claude Code 是付费软件，需要在 Claude 网站开账户。它所支持的账户类型包括：</p>
<ul>
<li>Claude Pro / Max / Teams / Enterprise（推荐）</li>
<li>Claude Console（API 访问，需预付费）</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8e/8eb28cac327c56fdc062c04a820d0faccc7799510d8f44b649e570aa3005ea91.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>

<p>下面是最基本的命令行（Command Line）交互方式，以及常用命令的速查表。</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:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /path/to/your/project</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:#4078F2;--shiki-dark:#61AFEF">claude</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:#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">> 帮我加一个 hello world 函数      </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:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Git 操作</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><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/0e/0ea16269d43c30894fe966d1ad6b99a477f37e137b57b449bda55d1937c618c0.jpg" alt="常用命令的速查表" tabindex="0" loading="lazy"><figcaption>常用命令的速查表</figcaption></figure>
<p>除了在命令行中直接使用 Claude 命令之外，另一种更为常见的方式就是和 VS Code 浏览器中，甚至是其它 AI Coder 中（如 Cursor），把 Coding IDE 和 Claude Code 命令行集成使用。这样既可以享受 IDE 的便利，又可以利用命令行的强大，一举两得。</p>
<h2>2. 从使用者到驾驭者</h2>
<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:#4078F2;--shiki-dark:#61AFEF">用户</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 输入问题</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 回答</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</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></div><p>你问，它答。就像用计算器，输入数字，得到结果。大多数人使用 Claude Code 的方式，就止步于此了。</p>
<p>Claude Code 可以生成代码，从 0 开始做项目，整理文件，甚至优化你的操作系统……虽然能做到这些也已经很强大了，但这仍然只是<strong>被动使用！</strong></p>
<p>而 Claude Code 还支持另一种模式：</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:#4078F2;--shiki-dark:#61AFEF">用户</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 配置</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Agent</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Agent</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 自主工作</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</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></div><p>这是<strong>主动驾驭</strong>——你设计，它执行。就像我们编写程序，程序自动运行。</p>
<p>举个例子：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2a/2a78dac18dccefbf262a7b1daed2f013cbd70f993955099b034997a2acbbcd86.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>这门课的目标，把你从被动使用者变成主动驾驭者。</strong></p>
<p>你肯定会说，悦创，我当然想走得更远一些，从被动使用者晋级为主动驾驭者，<strong>那成为驾驭者需要理解什么？</strong></p>
<p>用学开车打个比方：</p>
<ul>
<li><strong>使用者</strong>：知道方向盘转哪边车往哪走，油门让车动，刹车让车停。</li>
<li><strong>驾驭者</strong>：理解发动机、变速箱、刹车系统的工作原理，能改装车辆。</li>
</ul>
<p>对于 Claude Code：</p>
<ul>
<li><strong>使用者</strong>：知道怎么提问，怎么让 Claude 帮你写代码。</li>
<li><strong>驾驭者</strong>：理解记忆系统、子代理、技能包、钩子的工作原理，能构建自定义工作流。</li>
</ul>
<p>我们现在这一讲就是“驾驭者入门”——让你看到 Claude Code 引擎盖下面的东西。</p>
<h2>3. Claude Code 底层技术全景图</h2>
<p>Claude Code 的底层能力从技术上拆解可以分为四个层次：基础层、扩展层、集成层和编程接口层。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a4/a48ea19789d6b215119eaaf7f9eef25cf17de40a1d2c7db6f3453fa7e6442327.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>让我从下往上解释每一层。</p>
<h2>4. 基础层：Memory（记忆系统）</h2>
<p>基础层也可以称为是 Claude Code 的长期记忆系统，它的核心文件是 <code>CLAUDE.md</code>。</p>
<p>比如入职一家新公司，第一天你会收到一份新员工手册，告诉你：</p>
<ul>
<li>公司的代码风格是什么。</li>
<li>Git 提交信息怎么写。</li>
<li>项目的架构是怎样的。</li>
<li>有哪些不能碰的“禁区”。</li>
</ul>
<p>而 <code>CLAUDE.md</code> 就是 Claude 的“新员工手册”。</p>
<p>因此，我强烈建议每一个人都为你的 Claude 创建 <code>CLAUDE.md</code>，以提供给它一系列最基本的信息。</p>
<p>例如，当我们要开始一个新的电商项目，我创建了下面的 <code>CLAUDE.md</code> 文件。</p>
<div class="language-markdown line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="markdown" style="--vp-collapsed-lines:15;--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-markdown"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"># Project: E-commerce Platform</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## Tech Stack</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Frontend: React + TypeScript</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Backend: Node.js + Express</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Database: PostgreSQL</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## Code Style</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Use functional components</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Prefer async/await over .then()</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Maximum line length: 100 characters</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">## Important Rules</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> NEVER commit to main directly</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">-</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Always run tests before pushing</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><div class="collapsed-lines"></div></div><p>Claude 每次开始对话时，都会读取这个文件。这样它就“<strong>记住</strong>”了你的项目规范，不需要每次重复说明。</p>
<p>Claude Code 并不是只有一个 <code>CLAUDE.md</code> 记忆文件，全局、项目和项目的特定模块都可以拥有属于自己的记忆文件（或者也可以叫配置文件）。</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:#383A42;--shiki-dark:#ABB2BF">~/.claude/CLAUDE.md           </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:#4078F2;--shiki-dark:#61AFEF">    ↓</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">项目根目录/CLAUDE.md</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:#4078F2;--shiki-dark:#61AFEF">    ↓</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">项目根目录/.claude/rules/*.md</span><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></div><p>我们可以把这些文件视为 Claude Code 系统记忆的不同层级。</p>
<h2>5. 扩展层：四大核心组件</h2>
<p>这一层是 Claude Code 的能力中心，包含 Commands（斜杠命令）、Skills（技能）、SubAgents（子代理）、Hooks（钩子）四个核心组件。</p>
<h3>5.1 Commands（斜杠命令）</h3>
<p>斜杠命令是 Claude Code 内置或用户自定义的一系列核心能力，其触发方式是用户手动输入  <code>/command</code>：</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:#4078F2;--shiki-dark:#61AFEF">用户输入:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /review</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 执行:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 根据</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .claude/commands/review.md</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>Commands 适合<strong>标准化操作</strong>——团队统一的 commit 格式、固定的部署流程等。</p>
<h3>5.2 Skills（技能）</h3>
<p>技能则代表着 AI 的一系列专属能力组合，其触发方式是 Claude 自动判断（语义推理）是否激活相应技能。Skills 可以是 Claude Code 内置的，也可以由用户自己设定。</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:#4078F2;--shiki-dark:#61AFEF">用户说:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "帮我看看这段代码有没有安全问题"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 思考:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 这是代码安全审查任务</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 激活</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> security-review</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Skill</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 执行:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 按照</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Skill</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 class="line-number"></div><div class="line-number"></div></div></div><p>很多人第一次听到 Skills 这个概念，都会觉得 “这不就是个高级一点的 tool 吗？Agent 直接 call tool 不就行了？”</p>
<p>我的回答是：的确像，但并不等价。原因在于 Tools 是外部能力接口，Skills 是模型内部的“行为模式 + 触发逻辑”。如果 Tool 是函数调用，Skill 就是把 if-else、prompt、策略和调用顺序，全部折叠进一个文档的整体封装，是对一个专有能力集的全面定义。</p>
<p>如果说 Tool 解决的是<strong>我能不能做</strong>；而 Skill 解决的是<strong>我该不该做、怎么做、做到什么程度</strong>。那么又一个问题来了：什么时候该用 Skill？什么时候该用 Commands？</p>
<p>Commands 是显式、可复用、可审计、通过斜杠命令固定触发的操作指令集，是相对固化的标准流程。</p>
<p>而当一个能力具备强烈的“领域感”（安全、架构、性能）、判断依赖上下文而非关键词 ，执行路径可能变化 ，需要“像专家一样行事”时，就用 Skill，而不是 Command。</p>
<p>拿刚才的例子来说——当用户问“帮我看看这段代码有没有安全问题”。Claude 的隐式判断流程是这样的。</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:#4078F2;--shiki-dark:#61AFEF">1️⃣</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 这是代码吗？——是</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">2️⃣</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 这是哪一类代码？——Node.js</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 后端</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">3️⃣</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 上下文是否涉及用户输入？——是</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">4️⃣</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 是否存在鉴权逻辑？——是</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">5️⃣</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 class="line-number"></div><div class="line-number"></div></div></div><p>做完这些判断之后，就会自动激活 <code>security-review Skill</code>。</p>
<p>在 Skill 内部，是“像专家一样”的行为说明，它不会跑固定 checklist，而是根据语言选择重点、根据上下文跳过无关项、在发现高风险点时主动深挖、在安全风险低时明确告诉你“为什么没问题” —— 这不是流程执行，这是专家判断。</p>
<h3>5.3 SubAgents（子代理）</h3>
<p>子代理是除了 Skills 之外的另一个大杀器，用于独立完成专项任务。其触发方式可以由 Claude 决定或用户指定。</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:#4078F2;--shiki-dark:#61AFEF">主</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Claude:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 这个任务需要跑大量测试，让我创建一个子代理来处理。</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">子代理（test-runner）:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 执行测试，只把结果汇报给主</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Claude</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>SubAgents 适合<strong>隔离执行</strong>——高噪声任务（比如在大量日志中寻找出错信息，在大量文档中检索相关资源）、需要特定权限的任务。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/07/078a6df5ba4e6068dec59bdd03a4a1e316eef4bb78aa32fbe04f2b70da0dec7a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>5.4 Hooks（钩子）</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:#4078F2;--shiki-dark:#61AFEF">事件:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 即将执行</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Edit</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 工具</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Hook:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 自动检查是否有安全敏感内容</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">结果:</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 class="line-number"></div><div class="line-number"></div></div></div><p>Hooks 适合<strong>自动化检查</strong>——格式化、安全检查、日志记录等。</p>
<h2>6. 集成层：连接外部世界</h2>
<p>上面这四大核心组件之上，是集成层，负责链接外部世界。集成层包含 Headless（无头模式）和 MCP（Model Context Protocol）两大技术。</p>
<h3>6.1 Headless（无头模式）</h3>
<p>无头模式让 Claude Code 在没有人工交互的情况下运行，适合  <strong>CI/CD 集成</strong>——自动代码审查、自动修复、自动生成变更日志等。</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"># GitHub Actions 中</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">-</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> name:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Auto-fix</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> code</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> issues</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  run:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> claude</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --headless</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Fix all linting errors in src/"</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><h3>6.2 MCP（Model Context Protocol）</h3>
<p>MCP 让 Claude 连接外部工具和服务，适合<strong>工具连接</strong>——可以把任何外部系统变成 Claude 可调用的工具。</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:#4078F2;--shiki-dark:#61AFEF">Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> MCP</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 数据库</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> MCP</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Jira</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Claude</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> MCP</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> →</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 自定义</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> API</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><h2>7. 编程接口层：Agent SDK</h2>
<p>当配置式的扩展不够用时，你可以用代码来驱动 Claude。这种方式适合<strong>构建自定义 Agent</strong>——完全控制执行流程、自定义工具、复杂工作流。</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:#4078F2;--shiki-dark:#61AFEF">from</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> claude_sdk</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> import</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ClaudeSDKClient</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">client</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ClaudeSDKClient</span><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:#4078F2;--shiki-dark:#61AFEF">result</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> client.query</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    prompt</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"Review this code for security issues",</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    tools</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">["Read",</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "Grep"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">],</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    max_turns</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">10</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></div><h2>8. 组件关系和技术选型指南</h2>
<p>在真实的系统中，这些组件不是孤立存在的——它们相互协作，共同完成复杂任务。</p>
<h3>8.1 触发方式</h3>
<p>首先看触发方式，也就是<strong>这些组件是怎么被激活的</strong>？不同组件的触发方式决定了它们的使用场景。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/24/2438ad13ea52ee1c197b605867e41dcbb51a474491f3cbd9de3d3620cf0ff6fe.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>为什么“确定性”很重要？</strong></p>
<p>如果我们要设计一个生产系统：</p>
<ul>
<li>如果你需要“每次都必须执行”的操作（比如代码格式化），你需要  <strong>100% 确定性</strong>——选择 Commands 或 Hooks。</li>
<li>如果你希望 Claude “智能判断何时使用”（比如识别到安全问题时自动深入分析），你可以接受<strong>概率性</strong>——选择 Skills。</li>
<li>如果任务可能很重，你希望“既可以手动触发，也可以让 Claude 自己决定”，你需要<strong>可控性</strong>——选择 SubAgents。</li>
</ul>
<p>这个表格会在你做技术选型时反复用到。</p>
<h3>8.2 数据流向</h3>
<p>理解了触发方式，我们来看数据是怎么在系统中流动的。这张图展示了一个典型请求的生命周期：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f7/f796d376b9e59d4652ea32770976324634aa1b717da6be596e58c6b370a17b1e.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>让我结合一个具体场景来解释这个流程——当用户输入“<code>帮我修复 src/api.js 中的安全漏洞</code>”之后，Claude 可能的处理流程如下。</p>
<ol>
<li>
<p><strong>Memory 层</strong>：Claude 首先加载  <code>CLAUDE.md</code>，了解到这是一个 Node.js 项目，团队要求所有安全修复必须附带测试。</p>
</li>
<li>
<p><strong>扩展层分发：</strong></p>
<p>a. 用户没有输入斜杠命令，所以 Commands 不参与。</p>
<p>b. Claude 识别出“安全漏洞”关键词，激活  <code>security-review</code> Skill。</p>
<p>c. Skill 指示 Claude 创建一个子代理来执行测试。</p>
</li>
<li>
<p><strong>Hooks 监控</strong>：Claude 准备执行  <code>Edit</code> 工具修改代码时，Hooks 自动运行预检查脚本，确保没有引入新的安全问题。</p>
</li>
<li>
<p><strong>工具执行</strong>：通过 Read、Edit 等工具完成代码修改。</p>
</li>
<li>
<p><strong>MCP 连接</strong>：如果配置了 Jira MCP，还可以自动更新相关的 ticket 状态。</p>
</li>
</ol>
<p>关键洞察：<strong>Memory 是基础设施，始终存在；扩展层是能力中心，按需激活；Hooks 是守门人，监控一切。</strong></p>
<h3>8.3 Plugins：打包容器</h3>
<p>当你开发了一套好用的 Commands、Skills、Hooks 组合，想要分享给团队或社区时，就需要 Plugins。</p>
<p><strong>Plugins 不是一种新能力，而是打包机制</strong>——就像 npm 包把一堆 JavaScript 文件打包在一起，Plugin 把一组相关的 Claude Code 扩展打包在一起。</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:#4078F2;--shiki-dark:#61AFEF">my-team-plugin/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> commands/</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:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> review.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> skills/</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:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> security-check/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">       └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> SKILL.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> agents/</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:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> test-runner.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> hooks/</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:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> pre-edit.sh</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> plugin.json</span><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></div><p>下面是一个典型的 <strong>Plugins</strong> 使用场景：</p>
<blockquote>
<p>你是团队的技术 Lead，花了两周时间打磨出一套完美的代码审查流程：一个  <code>/review</code> 命令触发审查，一个  <code>code-quality</code> Skill 自动分析代码质量，一个  <code>test-runner</code> 子代理执行测试，还有一个 Hook 确保所有修改都有对应的测试。</p>
<p>与其让团队成员手动复制这些文件，不如打包成一个 Plugin，新成员只需一条命令就能获得完整的工作流。</p>
</blockquote>
<p>Plugin 的价值在于<strong>可复用、可版本化、可分发</strong>。在第 16 讲我们还会详细讲解如何创建和发布 Plugins。</p>
<h3>8.4 技术选型指南</h3>
<p>目前，理论知识已经足够了，但当你面对一个真实需求时，如何选择正确的技术？下面这是我总结的决策流程：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/85/858c00cccab83f5e85c5136db25cf07d2ea7712957d2e5f560304244a5bf4b4b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>让我用几个真实问题来演示这个决策树的使用。</p>
<p><strong>问题 1</strong>：我希望团队成员都用统一的 commit message 格式。</p>
<ul>
<li>这是一种“能力”吗？是的，是生成规范 commit message 的能力。</li>
<li>希望手动触发还是自动识别？手动触发更合适，因为不是每次对话都需要 commit。</li>
<li><strong>答案</strong>：适合用 <strong>Commands</strong>（创建一个  <code>/commit</code> 命令）。</li>
</ul>
<p><strong>问题 2</strong>：每当 Claude 要修改代码时，我想自动检查是否符合我们的安全规范。</p>
<ul>
<li>这是一种“能力“吗？不是，这是一种“检查机制”。</li>
<li>需要在工具执行时自动检查？ 对，在 Edit 工具执行前检查。</li>
<li><strong>答案</strong>：适合用 <strong>Hooks</strong>（创建一个 pre-Edit hook）</li>
</ul>
<p><strong>问题 3</strong>：我想让 Claude 能够查询我们内部的知识库。</p>
<ul>
<li>这是一种“能力”吗？ 不完全是，这是“连接外部数据源”。</li>
<li>需要连接外部系统？ 知识库是一个外部系统。</li>
<li><strong>答案</strong>：适合用 <strong>MCP</strong>（创建一个知识库 MCP server）。</li>
</ul>
<p>为了帮助你快速匹配，我也准备了一份场景 VS 方案的速查表。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/dd/dda75dcf71706cea0e9f066063b7a4ff017809aae1c7c66496f3d5ce927521cf.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>8.5 组合使用</h3>
<p>真实世界的问题很少能用单一技术解决。Claude Code 的强大之处在于<strong>组件可组合</strong>——每个组件做好自己的事，组合起来完成复杂任务。</p>
<p>假设你想实现这样一个流程：每当有人提交 PR，自动进行代码审查，发现问题就评论，没问题就通过。这需要组合多种技术：</p>
<div class="language-markdown line-numbers-mode" data-highlighter="shiki" data-ext="markdown" 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-markdown"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">1.</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Headless 模式在 CI 中触发</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">   └── GitHub Actions 监听 PR 事件，调用 claude --headless</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E5C07B">2.</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 调用 code-review SubAgent</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:#383A42;--shiki-dark:#E5C07B">3.</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> SubAgent 使用 security-check Skill</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:#383A42;--shiki-dark:#E5C07B">4.</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> Hooks 记录审查日志</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:#383A42;--shiki-dark:#E5C07B">5.</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 结果通过 MCP 发送到 Slack</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></div><p>这五个步骤涉及五种不同的技术，但组合在一起就是一个完整的自动化流程。这就是可组合的威力。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/03/03d7e5724902817fc030c7ba54b3df1d4513fa8a8bc1a0d3bd742267b7abe5e0.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>9. 总结一下</h2>
<p>这一讲我们站在高处，俯瞰了 Claude Code 的完整技术栈。</p>
<p>首先，我希望你记住最重要的一个认知转变：<strong>Claude Code （以及其它 AI Coder）不只是一个聊天工具，而是一个可编程的 AI Agent 框架</strong>。它有自己的记忆系统、有可以分工协作的子代理、有按需加载的技能包、有事件驱动的钩子机制。理解这一点，你才能真正发挥它的潜力。</p>
<p>其次，我们梳理了整个技术栈的四层架构。最底层是 <strong>Memory</strong>，让 Claude 记住你的项目；往上是<strong>扩展层</strong>，包括 Commands、Skills、SubAgents 和 Hooks 四大核心组件；再往上是<strong>集成层</strong>，Headless 让它融入 CI/CD，MCP 让它连接外部世界；最顶层是 <strong>Agent SDK</strong>，给你完全的编程控制能力。每一层都有明确的职责，相互配合又互不干扰。</p>
<p>然后，我们学习了<strong>技术选型的方法</strong>。面对一个需求，你需要问自己：这是能力问题还是流程问题？需要确定性触发还是智能识别？需要隔离执行还是集中处理？顺着决策树走下来，答案往往就清晰了。</p>
<p>最后，也是最有价值的一点：<strong>这些组件是可以组合的</strong>。单独的 Command 只是一个命令，单独的 Skill 只是一个能力包，但当你把 Headless + SubAgent + Skill + Hook + MCP 组合在一起，就变成了一个完整的自动化流程。这种组合的灵活性，才是 Claude Code 真正的威力所在。</p>
<p>从这一讲开始，你已经迈出了成为<strong>驾驭者</strong>的第一步，这已经超越了 90% 的 Claude Code 使用者。接下来的课程里，我们会逐一深入每个组件，把这张全景图上的每个区域都走一遍。</p>
<h2>10. 思考题</h2>
<ol>
<li>回顾你目前使用 Claude Code 的方式，属于“被动使用”还是“主动驾驭”？</li>
<li>你的工作中有哪些重复性任务可以通过 Commands 或 Skills 自动化？</li>
<li>如果要构建一个“自动代码审查 + 自动修复 + 自动提交 PR”的流程，你会组合哪些技术？</li>
</ol>
<h2>11. 彩蛋</h2>
<p>最后，加一个彩蛋，方便你直观了解 Claude Code 扩展层的四大核心组件。</p>
<p><strong>Claude Code 扩展层 · 四大核心组件对照表</strong></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d9/d980588d35eb5fa976634b7bf909d3ef35d5385fb8aa199face9dad79a67d4f6.jpg" alt="Claude Code 扩展层 · 四大核心组件对照表" tabindex="0" loading="lazy"><figcaption>Claude Code 扩展层 · 四大核心组件对照表</figcaption></figure>
<p>理解了全景之后，下一讲我们从最基础的组件——<strong>Memory 记忆系统</strong>开始学习，让 Claude 从“每次都要重新解释”变成“一次配置，永久生效”。</p>
<p>你将学会：</p>
<ul>
<li>如何用 <code>CLAUDE.md</code> 让 Claude “<strong>记住</strong>”你的项目规范。</li>
<li>全局、项目、模块三级记忆系统的设计。</li>
<li>最佳实践：什么该写进 <code>CLAUDE.md</code>，什么不该写进去。</li>
</ul>
<p>欢迎你在留言区和我交流讨论。如果这一讲对你有启发，别忘了分享给身边更多朋友。</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-02-01T20:19:39.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">02-2026 年个人博客搭建，搭建属于自己的平台</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/02-Blog-build.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/02-Blog-build.html"/>
    <updated>2026-08-16T15:12:01.553Z</updated>
    <summary type="html"><![CDATA[<h2>1. 所需环境</h2>
<ul>
<li>
<p>安装 <strong>Nodejs</strong>：网站运行的本质软件；</p>
</li>
<li>
<p>安装 <strong>VScode</strong>：网站配置、更新部署等操作软件；</p>
</li>
<li>
<p>安装 <strong>Typora</strong>：网站文章编写软件；（唯一的付费软件，可以选择支持盗版～）</p>
</li>
<li>
<p>安装 <strong>Snipaste</strong>：截图、贴图软件，文章编写中图片操作的主力软件；（强力推荐每台电脑都默认安装此软件！）</p>
</li>
<li>
<p>安装 <strong>Git</strong>：用于和 Github 进行交互操作；（推送代码等）</p>
</li>
<li>
<p>注册 <strong>GitHub</strong> 账号：用于网站部署、存储代码等；（作用很强大，必须注册拿下！）</p>
</li>
<li>
<p>配置 GitHub 的 <strong>SSH</strong>，参考教程：<a href="https://bornforthis.cn/blog/2024/7month/git-ssh.html" target="_blank" rel="noopener noreferrer">https://bornforthis.cn/blog/2024/7month/git-ssh.html</a></p>
</li>
<li>
<p>「可选」购买 <strong>域名</strong>，便于大家访问网站；</p>
<ul>
<li>域名越直白越好；</li>
<li>越短越好；</li>
<li>可以参考：
<ul>
<li><strong>AI悦创</strong>：<code>bornforthis.cn</code>；</li>
<li>谷歌：<code>google.com</code>；</li>
<li>淘宝：<code>taobao.com</code>；</li>
<li>飞书：<code>feishu.cn</code>；</li>
<li>抖音：<code>douyin.com</code>；</li>
<li>京东：<code>jd.com</code>；</li>
<li>微博：<code>weibo.com</code>；</li>
</ul>
</li>
<li>域名是可以随时修改，但是我们一般不推荐修改，为什么？——身份标识，例子：大家都知道淘宝域名（taobao.com），突然有一天淘宝换域名了，很多人都只停留在原本的域名，而不知道最新域名。</li>
</ul>
<div class="hint-container tip">
<p class="hint-container-title">正式开始之前需要准备</p>
</div>
</li>
<li>
<p>想好自己网站名称；</p>
</li>
<li>
<p>想好自己想要的域名并确认是否被占用，占用则换一个；</p>
</li>
<li>
<p>想想自己的 slogan，人嘛还是得有属于自己的座右铭；</p>
</li>
<li>
<p>设计自己的 logo；</p>
</li>
<li>
<p>选一个自己喜欢的背景；</p>
</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>1. 所需环境</h2>
<ul>
<li>
<p>安装 <strong>Nodejs</strong>：网站运行的本质软件；</p>
</li>
<li>
<p>安装 <strong>VScode</strong>：网站配置、更新部署等操作软件；</p>
</li>
<li>
<p>安装 <strong>Typora</strong>：网站文章编写软件；（唯一的付费软件，可以选择支持盗版～）</p>
</li>
<li>
<p>安装 <strong>Snipaste</strong>：截图、贴图软件，文章编写中图片操作的主力软件；（强力推荐每台电脑都默认安装此软件！）</p>
</li>
<li>
<p>安装 <strong>Git</strong>：用于和 Github 进行交互操作；（推送代码等）</p>
</li>
<li>
<p>注册 <strong>GitHub</strong> 账号：用于网站部署、存储代码等；（作用很强大，必须注册拿下！）</p>
</li>
<li>
<p>配置 GitHub 的 <strong>SSH</strong>，参考教程：<a href="https://bornforthis.cn/blog/2024/7month/git-ssh.html" target="_blank" rel="noopener noreferrer">https://bornforthis.cn/blog/2024/7month/git-ssh.html</a></p>
</li>
<li>
<p>「可选」购买 <strong>域名</strong>，便于大家访问网站；</p>
<ul>
<li>域名越直白越好；</li>
<li>越短越好；</li>
<li>可以参考：
<ul>
<li><strong>AI悦创</strong>：<code>bornforthis.cn</code>；</li>
<li>谷歌：<code>google.com</code>；</li>
<li>淘宝：<code>taobao.com</code>；</li>
<li>飞书：<code>feishu.cn</code>；</li>
<li>抖音：<code>douyin.com</code>；</li>
<li>京东：<code>jd.com</code>；</li>
<li>微博：<code>weibo.com</code>；</li>
</ul>
</li>
<li>域名是可以随时修改，但是我们一般不推荐修改，为什么？——身份标识，例子：大家都知道淘宝域名（taobao.com），突然有一天淘宝换域名了，很多人都只停留在原本的域名，而不知道最新域名。</li>
</ul>
<div class="hint-container tip">
<p class="hint-container-title">正式开始之前需要准备</p>
</div>
</li>
<li>
<p>想好自己网站名称；</p>
</li>
<li>
<p>想好自己想要的域名并确认是否被占用，占用则换一个；</p>
</li>
<li>
<p>想想自己的 slogan，人嘛还是得有属于自己的座右铭；</p>
</li>
<li>
<p>设计自己的 logo；</p>
</li>
<li>
<p>选一个自己喜欢的背景；</p>
</li>
</ul>
<p>:::</p>

<h2>2. 购买域名</h2>
<ul>
<li>
<p><strong>Step 1</strong>：访问阿里云万网：<a href="https://wanwang.aliyun.com/" target="_blank" rel="noopener noreferrer">https://wanwang.aliyun.com/</a></p>
</li>
<li>
<p><strong>Step 2</strong>：注册阿里云账号；</p>
</li>
<li>
<p><strong>Step 3</strong>：🔍搜索你想要的域名，看是否🉑买；</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c5/c5806e69b6dbd8393f7509a67dc8ecc116fe0ba71de7cb169f13c1a20da57073.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p><strong>Step 4</strong>：购买时会提示需要“<strong>创建信息模版</strong>”，按指引创建即可：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/13/138edf77f041be6b47f0b7ac91a3a04a996fba6efb54f4ae191282297e757aca.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p><strong>Step 5</strong>：选择立即实名认证即可，按指引操作即可：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2d/2dc531d3b3c3b88da787697b706cac0dbd621268f1d71424b977a1d98f6ab725.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b8/b865eff2e2e1df73ea7b6d753ad341965b78d3020388375d7d0cc8c819a8716a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p><strong>Step 6</strong>：等待审核通过即可；</p>
</li>
</ul>
<h2>3. 本地网站初始化</h2>
<h3>3.1 启动终端</h3>
<p>使用终端进入到目标路径，也就是你想把网站放在哪里。（换句话说：哪个磁盘、哪个文件夹。）</p>

<h3>3.2 在终端初始化网站</h3>
<ul>
<li>
<p>我们使用的是开源主题：<a href="https://theme-hope.vuejs.press/zh/" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/</a></p>
</li>
<li>
<p>点击：快速上手</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/98/985fb8c9aa3bc83199daffa5440f0e2d446d4ac1b24f0ee6824b8ab8035e0265.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>点击：<a href="https://theme-hope.vuejs.press/zh/get-started/create.html" target="_blank" rel="noopener noreferrer">创建项目</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2f/2f93b073acf7b76e23bb8cb005ab83256105b72e327e648ce3e4603ec71b67eb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>在终端输入主题文档提供的命令进行初始化网站：<code>pnpm create vuepress-theme-hope my-docs</code></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/fa/fa0ac57de8d6ff4e6ccb53089306be065c24dd96901d269b50e892f0e792a522.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>终端界面（上一步启动的终端），把命令改成：<code>pnpm create vuepress-theme-hope .</code>：</p>
<p>键盘上下键选择“简体中文”，随后回车↩︎键：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a3/a319ba2761b14b3199fd2f2a5819ba43d79f68f7b680b2adfb44d384e2800c4c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>选择 pnpm：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/dc/dcb5377472e5ea779cfc4f2285dfbdea5b04d6cb96e9210041837a28185dfb74.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>选择 vite：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/53/53909ef741710e88b0aa48fbd261c5b90d953b747ea9f61e548a6b28c8efcf8d.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>按下图进行设置即可：</p>
<ul>
<li><strong>应用名称</strong>：需要使用纯英文编写，自己的网站名称；</li>
<li><strong>设置应用描述</strong>：自己的网站信息介绍，自己编写；</li>
<li>其它按图片编写即可；</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ed/ed29ed23bcc39a64d86c6ed1fa6e12a3de351b11db48e36cba8da6328b0a6db4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>按照下面继续设置即可：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/72/726f8a2e1a3af2885b85a1f38423225861cb7d77f836331b1013b69eb1601dc4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>自己选择是否查看 demo 示例：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/26/26a412eb3a2ab66c3e45a1ce42d39df37a8f95bcec4a37acdb7afb16013f7b92.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
<li>
<p>如何停止：使用 <code>Ctrl + C</code> 进行停止🤚</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/39/393b063a7fa7230a7a1212469d405ab7d46edff6c0cfdfd7c88f74769a7a8d34.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</li>
</ul>
<h3>3.3 使用 Vscode 打开本网站项目</h3>
<p>启动终端，使终端在网站文件夹下。使用前面的终端也是可以的，需要停止运行网站。</p>
<details class="hint-container details"><summary>操作方法</summary>
<p>鼠标选中新创建的文件夹（WebSite），<strong>鼠标右键</strong>——&gt;最底部的“<strong>服务</strong>”——&gt;选择“<strong>新建位于文件夹位置的终端窗口</strong>”：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a2/a20f89ff359ceadafc9e22eb5b0774e758a0d6c3d1e5e85dbcf9f40587b1daa2.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<p>直接输入：<code>code .</code> 这样就可以直接启动 VScode。</p>
<p>已经成功使用 VScode 启动网站项目：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/97/97022ac375be90cbbcb2a898f4732fdfa74959dfc83112e224da658494f2e1dd.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>3.4 网站启动本地预览（网站本地启动）</h3>

<h3>3.5 关闭本地启动的网站</h3>
<ul>
<li><strong>方法一</strong>：直接叉掉终端，但是需要又得启动终端；</li>
<li><strong>方法二</strong>：在目标终端使用 <code>Ctrl + C</code> 即可退出。</li>
</ul>
<h2>4. 网站部署</h2>
<h3>4.1 GitHub 创建特定仓库</h3>
<p><strong>Step 1</strong>：新建仓库</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/74/7464caa724bb0b76cafecbded5e018bbcc504dd5c8b33ecc8ec4c8cf6dba65a4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<ul>
<li>
<p>输入仓库名称：<code>huangjiarongbao.github.io</code>；</p>
<blockquote>
<p>一个 GitHub 账号，只能创建一个这样的特定仓库，不过有其它方法绕开限制，后期分享。</p>
</blockquote>
</li>
<li>
<p>仓库介绍；</p>
</li>
<li>
<p>仓库必须公开，不能私有。如果想要私有，得用其它方法保护源代码。</p>
<blockquote>
<p>原因很简单：因为免费版必须公开。</p>
</blockquote>
</li>
<li>
<p>随后点击： Create repository 即可；</p>
</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d6/d664dd446eb1cbfb40e08f1f73556325ad817a83d25e76c982ce20db5eac3f26.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>切换到 SSH：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/dc/dc2eeb03e6cb05d0c8b87bf61978a95d8f2e6da3523db4d599b76d865d091c83.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.2 本地电脑网站，绑定远程 GitHub 仓库（首次推送）</h3>
<div class="hint-container tip">
<p class="hint-container-title">补充：主题目前初始化自带 GitHub 部署脚本存在问题，需要使用如下内容直接覆盖。路径：<code>.github/workflows/deploy-docs.yml</code></p>
<div class="language-yaml line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="yaml" style="--vp-collapsed-lines:15;--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-yaml"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">部署文档</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">on</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  push</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    branches</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:#50A14F;--shiki-dark:#98C379">main</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">permissions</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  contents</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">write</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">jobs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  deploy-gh-pages</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    runs-on</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">ubuntu-latest</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    steps</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:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">Checkout</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">actions/checkout@v3</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        with</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          fetch-depth</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">          # 如果你文档需要 Git 子模块，取消注释下一行</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">          # submodules: true</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">安装 pnpm</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">pnpm/action-setup@v2</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        with</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          run_install</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">true</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10.5.2</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # 指定 pnpm 版本，可以修改为最新的稳定版本</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">设置 Node.js</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">actions/setup-node@v3</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        with</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          node-version</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          cache</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">pnpm</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">构建文档</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        env</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          NODE_OPTIONS</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">--max_old_space_size=8192</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        run</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">|-</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          pnpm run docs:build</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">          > src/.vuepress/dist/.nojekyll</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">      - </span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">部署文档</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        uses</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">JamesIves/github-pages-deploy-action@v4</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">        with</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          branch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">gh-pages</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">          folder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">src/.vuepress/dist</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><div class="collapsed-lines"></div></div></div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d4/d4a3fa99664a1799ca5b281b9cd63065d726bc55c4fda96e7f6808676a0cf566.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<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:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> init</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:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .</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:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> commit</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -m</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "first commit"</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  # "first commit" 可以随便改，代表本次做了哪些修改，做个备注。不改，一直用这个也是可以的。</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> branch</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -M</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> main</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> remote</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> origin</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git@github.com:huangjiarongbao/huangjiarongbao.github.io.git</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  # 用你自己的，每个 GitHub 都有自己的 </span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> push</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -u</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> origin</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> main</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><p>一条一条执行命令，即可。提交成功参考：</p>
<div class="language-bash line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="bash" style="--vp-collapsed-lines:15;--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:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> init</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Initialized</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> empty</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> repository</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> in</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /Users/huangjiabao/Desktop/WebSite/.git/</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">✗</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">✗</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> commit</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -m</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "first commit"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[main (</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">root</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">commit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) 2051f89] first commit</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> 47</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> files</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> changed,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 5661</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> insertions</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .DS_Store</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .github/workflows/deploy-docs.yml</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .gitignore</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> package.json</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> pnpm-lock.yaml</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/config.ts</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/navbar.ts</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/CNAME</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/apple-icon-152.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/chrome-192.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/chrome-512.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/chrome-mask-192.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/chrome-mask-512.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/guide-maskable.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/icon/ms-icon-144.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/images/cover1.jpg</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/images/cover2.jpg</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/assets/images/cover3.jpg</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/favicon.ico</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/logo.png</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/public/logo.svg</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/sidebar.ts</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/styles/config.scss</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/styles/index.scss</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/styles/palette.scss</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/.vuepress/theme.ts</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/README.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/demo/README.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/demo/disable.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/demo/encrypt.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/demo/layout.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/demo/markdown.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/demo/page.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/intro.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/apple/1.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/apple/2.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/apple/3.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/apple/4.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/banana/1.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/banana/2.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/banana/3.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/banana/4.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/cherry.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/dragonfruit.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/strawberry.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src/posts/tomato.md</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> create</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mode</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 100644</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> tsconfig.json</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> branch</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -M</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> main</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> remote</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> origin</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git@github-work:huangjiarongbao/huangjiarongbao.github.io.git</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> remote</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> origin</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git@github-work:huangjiarongbao/huangjiarongbao.github.io.git</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> push</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -u</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> origin</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> main</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Enumerating</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> objects:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 62,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> done.</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Counting</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> objects:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 100%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (62/62), done.</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Delta</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> compression</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> using</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> up</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> to</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> threads</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Compressing</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> objects:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 100%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (57/57), done.</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Writing</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> objects:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 100%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (62/62), 591.97 KiB | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">1.93</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> MiB/s,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> done.</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Total</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 62</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (delta </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">6</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), reused 0 (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">delta</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">), pack-reused 0 (</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">from</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:#4078F2;--shiki-dark:#61AFEF">remote:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Resolving</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> deltas:</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 100%</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (6/6), done.</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">To</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> github-work:huangjiarongbao/huangjiarongbao.github.io.git</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> *</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [new </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">branch]</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> -> </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">main</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">branch</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'main'</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> set</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> up</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> to</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> track</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 'origin/main'.</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">base</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">➜</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  WebSite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> git:</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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 class="collapsed-lines"></div></div><blockquote>
<p>Tips：github-work 是我自己一台电脑，配置多个 SSH 的标记，无需 care。</p>
</blockquote>
<h3>4.3 激活 GitHub 部署</h3>
<h4>4.3.1 第一步：点击 Setting</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/25/25b9ab6cda8b4c73472170e3931f55f4990c257282c60e957b56f53ddfcd6cc9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>4.3.2 第二步：点击 Pages</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/09/09e4c7336eb3ceca5419acd3fb728d41bdd5191c57d39309e322a3231e1f6fd5.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>4.3.3 第三步：选择 gh-pages 并 Save</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/94/9463519e9a8b4ab490c8c0e543866ce3304630ac76f906dbad2a7f99ad840dff.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>4.3.4 尝试访问部署网站</h4>
<p>域名已经给出：<a href="https://huangjiarongbao.github.io/" target="_blank" rel="noopener noreferrer">https://huangjiarongbao.github.io/</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/55/55f488577c458f1fde0cd0f266a3ee9f2c322ba86baca38adcab98a92d929c45.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b1/b18f587bedab5cc8f79999e0b0f04b87b5a7e2aa0f47eb31a8e0c56f5f3a42f3.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.4 更新网站</h3>
<h4>4.4.1 方法一「推荐」</h4>
<p>使用 VScode 进行提交即可，点击 VScode 左侧的 git 管理按钮：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b0/b0109bc2ab5fdecff64cca3a522bb507d37ccfb4174c3228ef7841747865dd24.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b6/b6c784e8c6ee54c40f1faf599a7daab017b098a361642547d80464fefd6e282d.png" alt="首次使用会弹出提示，选择：始终" tabindex="0" loading="lazy"><figcaption>首次使用会弹出提示，选择：始终</figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2c/2c771cd93b974c5653912ec01d4a24b70e371f9913c6e2adee571831b8ab6f40.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>4.4.2 方法二</h4>
<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:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> add</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .</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:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> commit</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -m</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "first commit"</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  # "first commit" 可以随便改，代表本次做了哪些修改，做个备注。不改，一直用这个也是可以的。</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">git</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> push</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -u</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> origin</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> main</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><h3>4.5 查看是否部署成功</h3>
<p>先进到自己的 GitHub 仓库，点击 Action：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2f/2f3a0031524062744362723cb67acd369902286ed2f4f6c211d9daf9bcca805b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>4.6 域名解析</h3>
<h4>4.6.1 阿里云解析 GitHub 网站</h4>
<p><strong>Step 1</strong>：访问阿里云域名解析网站：<a href="https://dnsnext.console.aliyun.com/authoritative" target="_blank" rel="noopener noreferrer">https://dnsnext.console.aliyun.com/authoritative</a></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/23/23522e4300bc58c947412b3061fab72e3e056ab08dc0acda09b791bd65531494.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>Step 2</strong>：点击：添加记录</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/52/5240f74bf0cbc1bab8b030457e73451dcb7e853955df8b560ac07963be027706.png" alt="image-20260206113932437" tabindex="0" loading="lazy"><figcaption>image-20260206113932437</figcaption></figure>
<p><strong>Step 3</strong>：添加解析 1</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d6/d6318a2ff8abce13684e5d1d72cf574e3122b3387825dc79cbb28354bd361161.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><strong>Step 4</strong>：添加解析 2</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e3/e32d619eb03fde586be91c4da63e0998fb80c6198fe7107f4456b063dbd9aae3.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>上面完成了阿里云域名要做的，现在我们来完成 GitHub 要做的。</p>
<h4>4.6.2 创建域名解析文件「<code>CNAME</code>」</h4>
<p>在<strong>路径</strong>：<code>src/.vuepress/public</code> 下创建 <code>CNAME</code> 。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a9/a9b4855b3837e8b47cfbcb9f8d9d0ca8468fd3aee2c23ce09e9a900d88039d3d.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/59/592c8053889c16e86d48b869f3bb7fdf77ad0aeec7cd930b59576d4095b30576.png" alt="写入你自己的域名" tabindex="0" loading="lazy"><figcaption>写入你自己的域名</figcaption></figure>
<p>保存后，推送到 GitHub 仓库。</p>
<p>推送到 GitHub 后，会自动执行更新部署。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a4/a4711523f2a294d8ffbddfb3e9a5fca849d4b0db23d3960d718ec94c5d47693b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>等待检测完成后，点击：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/7d/7dcaa59bae3e5c2605618203cf083f86e7e9c0d6880abbce964ce5da2424f6da.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>5. 网站更多配置</h2>
<h3>5.1 更新属于自己的 logo</h3>
<p>可以借助 AI 设计生成属于自己的网站 logo，并把 logo 放入 <code>src/.vuepress/public</code>。MacOS 记得使用快捷键：<code>Command + Shift + 。</code> 即可显示隐藏文件、文件夹。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/29/2965fa3ccdf5e957374a595c2f914977e1903fffd288b1d69ed97e95c4cd96ab.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>接着我们需要在 VScode 中进行配置 logo，配置文件路径：<code>src/.vuepress/theme.ts</code>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b7/b7d022c81977f6579ff6caf70911f9e35b2195597421b01a644789b2f5d55106.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<div class="hint-container warning">
<p class="hint-container-title">注意：在我们的网站当中，所有 <code>/</code> 代表从 <code>public</code> 开始。</p>
<p>也就是：<code>/my-logo.png</code> 其实网站会执行成：<code>src/.vuepress/public/my-logo.png</code></p>
</div>
<h3>5.2 Vuepress 网站链接特点</h3>
<h4>5.2.1 资源链接特点</h4>
<ul>
<li><strong>Path</strong>：<code>src/.vuepress/public/</code></li>
</ul>
<p>所有的文件、图片等，都需要放在路径 <code>public</code> 下，而部署之后生成的链接格式是：<code>https://bornforthis.cn/aiyc.svg</code>。</p>
<p><code>/</code> 开始就代表从 <code>public</code> 文件夹开始。</p>
<div class="hint-container tip">
<p class="hint-container-title">测验</p>
<p>在 public 当中，自行创建文件夹并放入全新的图片 or 文件，并发送链接到评论区。</p>
</div>
<h4>5.2.2 文章链接特点</h4>
<p>本网站所有文章均为 markdown 格式。</p>
<ul>
<li>
<p><strong>特点一</strong>：在本网站使用的主题中，<code>README.md</code> 文件可以直接不写。</p>
<p><strong>举个例子</strong>：</p>
<ul>
<li><strong>例子 1</strong>：markdown 文章路径为：<code>src/README.md</code>——&gt;对应的部署后的链接则表示为：<code>域名/README.md</code>（<code>域名/index.html</code>）——&gt;最终简化成 【<code>域名/</code>】（bornforthis.cn） 代表主页。</li>
<li><strong>例子 2</strong>：markdown 文章路径为：<code>src/OpenClaw/README.md</code>（OpenClaw 是文件夹）——&gt;对应的部署后的链接则表示为：【<code>域名/文件夹名称/README.md</code>】（【<code>域名/文件夹名称/index.html</code>】）——&gt;最终简化成 【<code>域名/文件夹名称/</code>】（【<code>bornforthis.cn/OpenClaw/</code>】） 代表主页。</li>
</ul>
<p><strong>补充知识点</strong>：在 Web 前端当中，如果一个 HTML 文件命名为：<code>index.html</code> 则意味着是该网站的主页。</p>
<p><strong>实际演示</strong>：我在服务器中创建一个新站点，域名为：<code>1v1.bornforthis.cn</code>，如果在这个域名对应的文件夹下放入一个 html 的页面文件，命名 <code>index.html</code> ：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2b/2bd581a4539f85baa2ec852186e4c206589ea61375c7d42d6a3e67f01fc97d94.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>实际访问链接：<a href="https://1v1.bornforthis.cn/" target="_blank" rel="noopener noreferrer">https://1v1.bornforthis.cn/</a> 等价 <a href="https://1v1.bornforthis.cn/index.html" target="_blank" rel="noopener noreferrer">https://1v1.bornforthis.cn/index.html</a></p>
<blockquote>
<p>HTML 使用 Gemini 生成：<a href="https://gemini.google.com/share/b95aa7083c8f" target="_blank" rel="noopener noreferrer">https://gemini.google.com/share/b95aa7083c8f</a></p>
</blockquote>
<p>所以好处不言而喻：主页就无需强制写明 <code>index.html</code>。</p>
<p>如果不叫 <code>index.html</code> 呢？</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e1/e170de18fe6d5651c6d4214e3e1ec86d351836193977c1cb898c3afa5c4ae7e1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>实际访问链接：<a href="https://1v1.bornforthis.cn/code1v1.html" target="_blank" rel="noopener noreferrer">https://1v1.bornforthis.cn/code1v1.html</a> 等价 <a href="https://1v1.bornforthis.cn/code1v1.html" target="_blank" rel="noopener noreferrer">https://1v1.bornforthis.cn/code1v1.html</a></p>
<p><strong>我们的网站是用 markdown 文章编写，网站内部代码拥有类似的处理逻辑</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "markdown_name.md"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "README.md"</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:#50A14F;--shiki-dark:#98C379"> "index.html"</span></span>
<span class="line"><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:#50A14F;--shiki-dark:#98C379"> "markdown_name.html"</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></li>
<li>
<p><strong>特点 2</strong>：什么时候 <code>/</code> 开始代表链接，什么时候代表 <code>public</code>？</p>
<p>主要取决于你的实际路径，指向哪个，就访问哪个。（前提是：<strong>网页路径与 public 路径不同</strong>）</p>
<p>如果网页路径与 public 相同，会访问哪个？—— <s>优先返回网页链接。</s> <strong>如果是页面内跳转，则显示网站页面文章（刷新也会跳转到 public 下）。如果是直接访问该链接，则显示 public 下的内容。）</strong></p>
<blockquote>
<p>在页面内跳转时，优先访问网页文章。刷新、直接访问，则直接显示 public 下的同名内容。</p>
</blockquote>
<p>那如何写才能避免呢？答案早就在结论当中，编写链接时，想要百分百访问 public 链接，则直接写死链接，不要简写！（<code>域名/public下的内容</code>）</p>
</li>
<li>
<p><strong>特点 3</strong>：文章路径为：<code>src/python/variable.md</code>，实际链接为：<code>bornforthis.cn/python/variable.html</code>，在配置文件中编写，可以直接写成：<code>/python/variable</code>（<code>.md</code> 可以省略，也可以写）。</p>
</li>
</ul>
<h3>5.3 巧用 public 特性</h3>
<p>可以借助 public 的特性，进行部署纯静态网页。</p>
<p>借助 AI 制作一个纯静态的网页版的【开心消消乐】：</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">帮我做一个纯静态的开心消消乐游戏，内置 20 个关卡。</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>AI 帮我写的代码如下：</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">import React, { useState, useEffect, useCallback } from 'react';</span></span>
<span class="line"></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></div>]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-31T14:20:34.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">00-开篇词｜共生而非替代：极客和 AI 的共舞</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/00-ai-geek-co-evolution.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P14-claude-code-engineering-practice/00-ai-geek-co-evolution.html"/>
    <updated>2026-08-16T15:12:01.638Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/82/82d4eb5590c23037462f1bae39e7fb7264a1793dd703999afd171adaf4e5e399.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>这一次，我怀着兴奋而热切的心情，向大家分享这几月重塑了我工作和生活形态的 Claude Code，以及其中尤其重要的 SubAgents 和 Skills 理念。</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/82/82d4eb5590c23037462f1bae39e7fb7264a1793dd703999afd171adaf4e5e399.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>这一次，我怀着兴奋而热切的心情，向大家分享这几月重塑了我工作和生活形态的 Claude Code，以及其中尤其重要的 SubAgents 和 Skills 理念。</p>
<p>我不想用什么“人机交互革命”这种被说烂了的词。但过去几个月，我确实感受到了一种<strong>不可逆的变化</strong>。</p>
<ul>
<li>以前写代码是这样的：打开 IDE，敲键盘，查文档，调试，再敲键盘。大脑是主机，手指是输出设备。</li>
<li>现在写代码是这样的：我描述意图，AI 生成代码，我审阅确认，AI 继续迭代。大脑变成了<strong>导演</strong>，AI 变成了<strong>演员</strong>。</li>
</ul>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/01/01ee3ba326610bf7e0cf9d14bd77dfbe49cf4efdca6faa45fe75048c981555eb.webp" alt="悦创和AI的协作与共生" tabindex="0" loading="lazy"><figcaption>悦创和AI的协作与共生</figcaption></figure>
<p>这不是效率提升 10% 或 20% 的量变。这是角色本身的转换——从“<strong>执行者</strong>”到“<strong>指挥者</strong>”。</p>
<h2>1. Another AI Coder？—— Claude Code 远不止如此</h2>
<p>2024 年末到 2025 年初，AI Coding 领域迎来了一次集中爆发。过去的 2025 年，我们已经见证过一轮又一轮 AI Coding 工具的浪潮。</p>
<ul>
<li>有的强调<strong>补全与提示</strong>，让你写代码的速度更快。</li>
<li>有的主打<strong>对话式编程</strong>，让你“像和人聊天一样”改代码。</li>
<li>有的专注在 <strong>IDE 深度集成</strong>，几乎变成编辑器的一部分。</li>
<li>也有的试图做成“自动修 Bug 的魔法助手”。</li>
</ul>
<p>让我们快速扫描一下主流的 AI Coding 工具和它们的特点。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/45/454b8dc4b2b664b6b9aee6100a3f18bac59c03e6fb36467a2d92eb151b574a5c.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e4/e4d4a10b6b70824aabb81c1f29024950f9c46e5f38a1d35abb7646b96311dbed.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>不难看出，这些 AI Coder 都有着非常相似的交互界面，通过代码补全，尤其是右侧的交互对话框来进行代码库分析和自动代码生成。其中，Github Copolit 是最早的 AI 编码助手。随后 Cursor 异军突起，其 Composer 可以跨文件修改，后来演变为可以复用的 Agent。而 Cursor 的竞争对手 Windsurf 则强调 Flow 状态下的连续编排。这些工具都在解决一个问题—— <strong>如何降低“写代码”的门槛</strong>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/23/23f215c78d9ef33bce32e45d4570e4d67738e7c28e59d7a8b1e7a869c1f9645e.webp" alt="多个AI Coder可以混合使用，图中的使用Copilotlaude Codeugment共同分析一个代码库" tabindex="0" loading="lazy"><figcaption>多个AI Coder可以混合使用，图中的使用Copilot\Claude Code\Augment共同分析一个代码库</figcaption></figure>
<p>然而，当 AI 编程最终发展到 Claude Code 之后，如果我们仍然简单地把“学习并使用 Claude Code”当做时下流行的 Vibe Coding 或 AI coding hype 中一个不得不学的工具，那格局就太低了！</p>
<p>Claude Code 出现时，包括我在内的很多人都明确意识到：<strong>真正被重塑的，已经不是“写代码”，而是 Vibe Coding 这件事本身</strong>。</p>
<p>在 Claude Code 中，你更容易这样描述任务：</p>
<blockquote>
<p>“这个模块现在可读性差、测试覆盖不足，还可能有安全隐患。我希望你帮我系统性地重构它，但不要影响对外接口。”</p>
</blockquote>
<p>你会发现，Claude Code 非常<strong>懂工程</strong>（并不仅仅是 Claude 模型本身代码能力强）。他会自动规划任务，自动拆解任务，自动雇佣一堆 Sub Agents 做事情，自动确认什么时候要引入人类决策。你不是在一句一句“教它写代码”，而是在和一个工程系统对齐节奏。</p>
<p>为啥 Claude Code 这么强？因为它直接把 <strong>Agent</strong> 和<strong>工程治理</strong>写进了产品架构里——Sub-Agents、Skills、Hooks，这些从 Claude Code 的设计过程中创建出来的概念，已经超越了“编程工具”本身，形成了通用智能体设计模式的一部分。</p>
<p>现在我们使用 Claude Code 等 AI Coding 工具编码，其实你不再只是把自然语言翻译成代码， 而是在<strong>做设计</strong>，具体来说是做三件更高级的事情：</p>
<ol>
<li><strong>拆解问题</strong>；</li>
<li><strong>分配任务</strong>；</li>
<li><strong>组织多个智能体协作完成目标</strong>；</li>
</ol>
<p>这已经不是“编程工具”的范畴了，而是<strong>一种新的工作范式</strong>。这就是为什么我选择用一整个专栏来讲 Claude Code，而不只是写几篇如何使用的教程。因为它代表的不只是一个产品，而是一种范式：<strong>人机协作的新范式</strong>。</p>
<h2>2. 当 Sub-Agents 和 Skills 成为通用语言</h2>
<p>这里我们必须单独强调 Sub-Agents 和 Skills 这两个概念，因为它们正在从 Claude Code 的原生技术术语泛化出来，演变成 AI 工程领域的<strong>通用语言</strong>（这个过程非常像是我们常说的“出圈”）。</p>
<h3>2.1 Sub-Agents（子代理）</h3>
<p><strong>Sub-Agents（子代理）</strong> 的核心思想是：一个复杂任务可以拆解给多个专职角色。</p>
<p>就像一家公司不会让 CEO 亲自写代码、做测试、查日志，AI Agent 也需要“组织架构”。我们可以这样理解，主代理是指挥官，子代理是专业兵种。有人负责代码审查（只读，不能改），有人负责跑测试（执行，汇报结果），有人负责分析日志（消化噪声，提炼结论）。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/b9/b9602fb66c6ecf7d23464c5971221bb6d126edb6eaeb85e65ef3bf31e27b1094.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这不是 Claude Code 独创的想法。OpenAI 的 Swarm、LangChain 的 Multi-Agent、微软的 AutoGen，都在探索类似的方向。但 Claude Code 把它做成了<strong>开箱即用的工程能力</strong>——你只需要写一个配置文件，就能创建一个有明确职责、受限权限的子代理。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/60/607a225e805f410e7df73458f21274274c53be1f79b0744e8e09ecc80e828a4e.webp" alt="Claude Code让Sub-Agents通过一个配置文件开箱即用" tabindex="0" loading="lazy"><figcaption>Claude Code让Sub-Agents通过一个配置文件开箱即用</figcaption></figure>
<h3>2.2 Skills（技能）</h3>
<p><strong>Skills（技能）</strong> 的核心思想是：AI 应该知道什么时候用什么能力。</p>
<p>传统工具需要用户手动触发——你输入  <code>/review</code>，它就审查代码。但 Skills 不同，你只需要说“帮我看看这段代码有没有安全问题”，AI 就能自动判断这是代码安全审查任务，并自动激活对应的 Skill，自动应用领域知识和检查清单。</p>
<p>这种“语义触发”的设计，让 AI 从执行命令的工具，升级为理解意图的工作伙伴。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/18/1814d567d4174c6088d37824aff4b7872d4b9b7bedbb283ab965cb55761d3add.webp" alt="Skill让 AI 从“执行命令”升级为“理解意图”" tabindex="0" loading="lazy"><figcaption>Skill让 AI 从“执行命令”升级为“理解意图”</figcaption></figure>
<p>更有意思的是，Skills 的<strong>渐进式披露架构</strong>——不是把所有知识一股脑灌给 AI，而是按需加载，用到什么加载什么。这解决了 LLM 上下文窗口的根本限制。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cb/cb50b8ff4ba251aba606d6f7c206cb0e9edf66d63e4a71bb3c4b0d621c76c1cc.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这两个概念之所以重要，是因为它们<strong>可以迁移</strong>。不管你用的是 Claude Code 还是其他 Agent 框架，分工协作和按需加载的思想都是通用的。学会了这套方法论，你就获得了一种<strong>可复用的 AI 工程能力</strong>。</p>
<h2>3. 从程序员到开发者，从开发者到极客</h2>
<p>最后，我想聊聊人的变化。</p>
<p>过去我们称自己为<strong>程序员</strong>或者<strong>码农</strong>——写程序的人，编代码的工匠。这两年，AI Coder 渐渐侵蚀了属于我们码农的场域，我们把自己升级叫<strong>开发者（或架构师）</strong>——开发产品的人（谁来编码并不重要，关键是程序开发由谁来掌控，这个词会让我们暂时感觉更安全）。但在 Claude Coding 时代，我更愿意用一个老词：<strong>极客（Geek）</strong>。</p>
<p>为什么？因为 Claude Code 这个级别的 AI 正在让编程能力<strong>民主化</strong>。以前，想把一个创意变成产品，需要具备这些条件。</p>
<ul>
<li>会写代码（技术门槛）；</li>
<li>有足够的时间（执行成本）；</li>
<li>能处理各种工程细节（经验门槛）；</li>
</ul>
<p>现在，这三个门槛都在急剧降低。不会写代码？AI 可以帮你写。没有时间？AI 可以 24 小时工作。不懂工程细节？AI 知道最佳实践。</p>
<p>这意味着什么？<strong>能力的天平正在从“执行力”向“创意力”和“组织力”倾斜</strong>。—— 而这些能力往往并不属于传统的“程序员”，而是程序员或开发者的加强版——也就是极客。</p>
<ul>
<li>以前，有想法但不会写代码的人，需要找程序员合作。现在，他可以直接和 AI 合作。</li>
<li>以前，产品经理和工程师之间有一道翻译的鸿沟。现在，AI 可以做那个翻译。</li>
<li>以前，一个人做不了什么大项目。现在，一个人 + AI 团队，可以挑战以前需要一个团队才能完成的事情。</li>
</ul>
<p><strong>极客精神的核心从来不是“会写代码”，而是“用技术解决问题”。</strong></p>
<p>AI 让更多人获得了这种能力。爱思考的人、会组织的人、有创意的人、懂用户的人——他们不需要再被“不会写代码”这道门槛挡住。</p>
<p>这是我真正兴奋的地方。</p>
<h2>4. 这门课会带给你什么</h2>
<p>现在回到这个专栏本身。</p>
<p>这<strong>不是</strong>一份 Claude Code 入门教程——安装 Claude Code（或任何其它 AI Coder）之后，你只需要在命令行、IDE 的 Terminal 中输入 Claude 命令，或者在交互对话框中按照自己的需求开始和它对话，甚至不需要阅读任何说明文档。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d3/d3bfbc610efec17698fb2eb12fd232dd206ae6010fbb2a6fa5984f0d38f01ca0.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/49/493edd8421031395643904fc7b4058e80e76669e11160bd25e3709f9dfd3c215.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/6a/6a03a2d49b71723f5770048528b0ba1d73d27d5199497da1c062a8a72f0eb4e1.webp" alt="AI Coder零基础即可入门，安装后直接对话即可" tabindex="0" loading="lazy"><figcaption>AI Coder零基础即可入门，安装后直接对话即可</figcaption></figure>
<p>这是一门<strong>工程化实战课</strong>，目标是让你从 Claude Code 的使用者，成长为<strong>能够驾驭 AI 的工程指挥者</strong>。</p>
<p>我们不是从功能出发，而是从工程协作中的真实卡点出发，反推需要哪些机制。围绕真实工程中 <strong>Agent 协作常见的痛点</strong>，后续课程将带你逐一拆解并解决以下问题。</p>
<ul>
<li><strong>Memory</strong>： 解决 Agent 每次对话都“从零开始”、不理解项目背景的问题，让 AI 真正记住你的代码结构、约束和上下文。</li>
<li><strong>Sub-Agents</strong>： 解决单一 Agent 角色混乱、上下文污染、又写代码又做审查的问题，通过职责拆分实现关注点分离。</li>
<li><strong>Skills</strong>： 解决 Prompt 不可复用、经验无法沉淀、团队能力难以传承的问题，把个人技巧变成可组合的工程资产。</li>
<li><strong>Hooks</strong>： 解决 Agent 执行过程不可控、缺乏检查点、容易“越权操作”的问题，在关键节点引入自动校验和人工兜底。</li>
<li><strong>Headless</strong>： 解决 Agent 只能在 IDE 里交互、无法进入自动化流程的问题，让 AI 能在 CI/CD 中无人值守地运行。</li>
<li><strong>Agent SDK</strong>：解决只会用对话的方式使用 Agent，难以嵌入现有系统和工作流的问题，用代码驱动 Agent，构建可编排的工程流程。</li>
</ul>
<h2>5. 课程结构与安排</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/46/4639af576b0319836ce90c94f54e3567570cf345e98cbfda14725c9229b05b3e.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>每一讲都不会止步于理解概念，而是围绕一个<strong>真实工程场景</strong>展开，配套可直接复用的配置与代码（老规矩，悦创会在 <a href="https://github.com/AndersonHJB" target="_blank" rel="noopener noreferrer">Github</a> 开源所有的教学代码，链接<a href="https://github.com/AndersonHJB/claude-code-engineering" target="_blank" rel="noopener noreferrer">在此</a>）。</p>
<p>我不会教你“怎么用 Claude Code 写一个 Hello World”，而是教你“怎么把 Claude Code 变成你的 AI 工程团队”。我们的具体学习目标是：</p>
<ul>
<li>把 Claude Code 从“聊天式工具”，升级为可持续运转的 AI 工程团队。</li>
<li>让 AI 能“接手真实项目”，而不仅是写示例代码。</li>
<li>构建可复用的 Sub-Agents 和 Skills，把个人经验变成团队资产。</li>
<li>让 AI Agent 真正进入 CI/CD，而不是停留在 IDE 里。</li>
<li>从“写代码的人”，转变为组织管理智能体的人，从执行者蜕变为技术指挥者。</li>
</ul>
<h2>6. 推荐学习路径</h2>
<p>针对不同需求，我们还给你准备了不同的学习路径：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e8/e810f50bcd43eeeac98313308931d7528753b2074dda37e98f89fe968bd02389.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>.</summary>
<p>这门专栏预计在 4 月中上旬更新完毕，每周更新 2-3 节内容，期间春节假期为了方便同学们查漏补缺和强化练习，会留一个综合作业，并暂停更新一周。</p>
<p>这样的节奏安排，主要是综合考量了交付质量保障和大家的学习习惯而制定的——既保证每周有稳定的、高质量的内容准备，也给同学们预留了跟学跟练、消化吸收的时间。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/97/97a857350158ad4b4604bb095c9256e301d3bf83a32883b1cc3e47445725c1e8.webp" alt="课程安排" tabindex="0" loading="lazy"><figcaption>课程安排</figcaption></figure>
</details>
<p>结合最近的热点，我们热点加餐部分也新增了 <strong>Harness</strong> 和<strong>源码分析</strong>的部分，而这两个热点里的很多细节，也验证了我们课程的思路是和目前 Agent 工程主流思路一致。还是那句话，学思想而非工具，把握了这一点，你就更容易在纷繁变化的技术更迭中，建立好自己的认知地图。</p>
<h2>7. 写在最后</h2>
<p>我们正站在一个协作生态更新的转折点上。过去，开发者写代码、跑测试、查日志、修 Bug——一切尽在掌控。如今，AI Agent 开始参与这场创造：它能读懂你的代码库，理解你的意图，甚至主动提出方案。</p>
<p>但这不是人被替代的故事，而是人机协作的新篇章。<strong>这是一场极客与 AI 的共舞——你领舞，它跟随；你编排，它执行</strong>。</p>
<p>让我们开始这次学习探索之旅吧！</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a4/a42e966a554d64eb9dd955b46d52c889f218351ae9bb984e23389c87e56a0b21.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ec/ec9fbca3583f772d9d07879363f411abd3cbedc335913969d1d47a2932d5b49b.webp" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-28T08:13:13.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">08-文科生学 AI，一定要 Learn in public「AI转行的破局密钥」</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P09-FAQ/FAQ08.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P09-FAQ/FAQ08.html"/>
    <updated>2026-08-16T15:12:01.640Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>如果你是非技术背景，然后想转行到 AI 行业，现在在努力学 AI 的话，一定要 learn in public。什么叫 learn in public？就是你不仅要学，你还得让所有人都知道你在学，千万不要偷偷学。比如说你看到好的资料，可以给其他人共享这个资源，或者你用了一个好的 AI 产品，可以把你的感想分享到社交媒体。</p>
<p>为什么要这么做呢？因为我们现在在职场里不是学生了。你在学生时代，学完之后会有考试来检验你，但是你步入职场之后，学完之后如果没有人知道你学了，你就跟没有学一样。举个例子，如果你是文科商科背景，简历上没有任何 AI 相关的工作经验，但是你又想跳槽去 AI 公司，你怎么能跟你未来的雇主展示出你对 AI 技术的理解？怎么能展示出你是 AI 工具的深度使用者？怎么能展示出你甚至能自己开发出一些 AI 工具？</p>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>如果你是非技术背景，然后想转行到 AI 行业，现在在努力学 AI 的话，一定要 learn in public。什么叫 learn in public？就是你不仅要学，你还得让所有人都知道你在学，千万不要偷偷学。比如说你看到好的资料，可以给其他人共享这个资源，或者你用了一个好的 AI 产品，可以把你的感想分享到社交媒体。</p>
<p>为什么要这么做呢？因为我们现在在职场里不是学生了。你在学生时代，学完之后会有考试来检验你，但是你步入职场之后，学完之后如果没有人知道你学了，你就跟没有学一样。举个例子，如果你是文科商科背景，简历上没有任何 AI 相关的工作经验，但是你又想跳槽去 AI 公司，你怎么能跟你未来的雇主展示出你对 AI 技术的理解？怎么能展示出你是 AI 工具的深度使用者？怎么能展示出你甚至能自己开发出一些 AI 工具？</p>
<p>即使你花过无数个小时上网看各种 AI 课程，如果你没有输出的话，就跟没有学一样，因为根本没有人知道你学过，它也没有办法用一个可以展示的方式体现出来。但是如果你日常就有这种记录、分享输出的习惯，你就慢慢地能建立一个自己的个人品牌和 audience。包括你以后在面试求职的时候，你可以直接把你的作品发给你的面试官，这就是对你能力最好的展示。</p>
<p>其实内容是我们每个人在职场里的名片。</p>
<p>你怎么让你未来的老板知道你对一个行业和一个技术的理解？——就是靠这些作品。</p>
<p>并且这种输出的习惯也会驱使你更多的输入，就像费曼学习法说的，用输出来倒逼输入。当你有能力把一个东西给其他人讲明白的时候，这个东西你就真正的内化了，学会了。</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-23T18:37:55.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-Waline 非 Docker+SQLite+systemd 稳定部署教程（CentOS 8/宝塔）</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/01-waline-server.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P13-personal-blog-building/01-waline-server.html"/>
    <updated>2026-08-16T15:12:01.640Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>我不喜欢使用我不熟悉的技术（docker），并且 docker 非常占用服务器磁盘空间。我更喜欢对我自己部署、上线的项目，拥有掌控感。也就是遇到任何问题，不依靠他人可以独立解决。</p>
<p>故而，我最终选择：服务器直接运行部署➕SQLite「非 docker」。</p>
<blockquote>
<p>本文记录一次 <strong>Waline 在云服务器上非 Docker 部署、使用 SQLite 存储，并通过 systemd 保证稳定运行</strong>的完整实践过程。</p>
<p>重点不是“跑起来”，而是 <strong>为什么这样配一定能成功</strong>，以及 <strong>哪些配置其实是多余的</strong>。</p>
</blockquote>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>我不喜欢使用我不熟悉的技术（docker），并且 docker 非常占用服务器磁盘空间。我更喜欢对我自己部署、上线的项目，拥有掌控感。也就是遇到任何问题，不依靠他人可以独立解决。</p>
<p>故而，我最终选择：服务器直接运行部署➕SQLite「非 docker」。</p>
<blockquote>
<p>本文记录一次 <strong>Waline 在云服务器上非 Docker 部署、使用 SQLite 存储，并通过 systemd 保证稳定运行</strong>的完整实践过程。</p>
<p>重点不是“跑起来”，而是 <strong>为什么这样配一定能成功</strong>，以及 <strong>哪些配置其实是多余的</strong>。</p>
</blockquote>
<h2>1. 部署目标与约束条件</h2>
<h3>1.1 🎯 目标</h3>
<ul>
<li>在 <strong>云服务器（CentOS 8）</strong> 上部署 Waline</li>
<li><strong>不使用 Docker</strong></li>
<li><strong>使用 SQLite</strong> 作为数据库</li>
<li><strong>可开机自启 / 崩溃自动重启</strong></li>
<li><strong>配置路径清晰、可复用</strong></li>
</ul>
<h3>1.2 🚫 明确不使用</h3>
<ul>
<li>Docker</li>
<li>PM2</li>
<li>宝塔 Node 项目管理器</li>
<li>修改 Waline 源码</li>
<li>不稳定的 dotenv 相对路径加载</li>
</ul>
<h2>2. 为什么要用 systemd（核心思想）</h2>
<p>Waline 实际启动文件在：</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:#4078F2;--shiki-dark:#61AFEF">node_modules/@waline/vercel/vanilla.js</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>这会导致一个经典问题：</p>
<blockquote>
<p><code>.env</code> 文件放在项目根目录，但 Node 进程的 <strong>工作目录并不在项目根目录</strong></p>
</blockquote>
<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:#4078F2;--shiki-dark:#61AFEF">require(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">'dotenv'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">.config</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></div><p>就会出现：</p>
<ul>
<li>有时能读到</li>
<li>有时读不到</li>
<li>换服务器就炸</li>
</ul>
<p><strong>✅ 正确思路</strong></p>
<p><strong>不要让应用自己“找配置”</strong>，而是：</p>
<blockquote>
<p>👉 <strong>在进程启动之前，由操作系统直接把配置注入进环境变量</strong></p>
</blockquote>
<p>systemd 正是为此设计的。</p>
<h2>3. 最终采用的稳定方案（结论先行）</h2>
<blockquote>
<p>systemd + EnvironmentFile + 固定 WorkingDirectory</p>
</blockquote>
<p>这套方案的特点是：</p>
<ul>
<li>不依赖 Waline 内部实现</li>
<li>不依赖 dotenv</li>
<li>不依赖启动路径</li>
<li>可 100% 复现</li>
</ul>
<h2>4. 目录结构约定（示例）</h2>
<ul>
<li>官方提供：<a href="https://github.com/walinejs/waline/blob/main/assets/waline.sqlite" target="_blank" rel="noopener noreferrer">waline.sqlite</a>，下载放入 data 文件夹。</li>
</ul>
<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:#4078F2;--shiki-dark:#61AFEF">/www/wwwroot/waline/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> node_modules/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> data/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">│</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   └──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> waline.sqlite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">   （运行后自动生成）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">├──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> .env</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">└──</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> package.json</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><h2>5. 初始化项目</h2>
<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"># 1) 建议单独放在 /opt</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mkdir</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline</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:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> init</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -y</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> @waline/vercel</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>准备 SQLite 数据目录（Waline 的 <code>SQLITE_PATH</code> 要填“目录”，不包含文件名）：</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:#4078F2;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline/data</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 777</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline/data</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></div><p>生产环境更建议用专门用户 + 更严格权限，但先跑通再收紧。</p>
<h2>6. 配置 <code>.env</code>（SQLite 必需项 + 基础项）</h2>
<p>在 <code>/www/wwwroot/waline/.env</code> 写入（示例）：</p>

<ul>
<li>
<p><code>SITE_NAME / SITE_URL / SERVER_URL / SECURE_DOMAINS</code> 等环境变量在官方环境变量文档里有说明。</p>
</li>
<li>
<p>SQLite 的关键变量（<code>SQLITE_PATH / SQLITE_DB / SQLITE_PREFIX / JWT_TOKEN</code>）官方数据库章节明确列出。</p>
</li>
<li>
<p><code>SECURE_DOMAINS</code> 的注意点：需要把<strong>站点地址 + Waline 服务地址</strong>都加上。</p>
</li>
</ul>
<p><strong>并设置权限（避免被面板/其他用户读到）：</strong></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:#4078F2;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 600</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline/.env</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>7. 部署</h2>
<h3>7.1 宝塔部署</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2b/2ba99f3926b20b609830a9d165b12f981492033efb6b34bec23144d7d0dc5718.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<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:#4078F2;--shiki-dark:#61AFEF">项目目录:/www/wwwroot/waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">项目名称:waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">启动选项:自定义启动命令</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">node</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> node_modules/@waline/vercel/vanilla.js</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">项目端口:8360</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">运行用户:www</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">包管理器:npm</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">Node版本:v22.11.0</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">项目备注:waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">绑定域名:waline.bornforthis.cn</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><h3>7.2 命令行部署</h3>
<ul>
<li>
<p><strong>官方示例</strong></p>
<p>启动 Waline（非 Docker 的官方推荐方式），官方给的“非 Docker”方式就是直接跑 <code>vanilla.js</code>：</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:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">node</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> node_modules/@waline/vercel/vanilla.js</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></div><p>默认会监听 <code>8360</code>（常见做法：本机 8360 + Nginx 反代到 https 域名）。</p>
</li>
<li>
<p><strong>用 PM2 守护进程（推荐）</strong>：</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:#4078F2;--shiki-dark:#61AFEF">npm</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> i</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -g</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> pm2</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">pm2</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "node node_modules/@waline/vercel/vanilla.js"</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --name</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">pm2</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> save</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">pm2</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> startup</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><p>（<code>pm2 startup</code> 会输出一条命令，让你复制执行一次以实现开机自启）</p>
</li>
<li>
<p><strong>Nginx 反向代理到 <code>127.0.0.1:8360</code></strong></p>
<p>官方 VPS 部署页给了示例反代配置，你可以照这个思路改成自己的域名与证书路径：</p>
<div class="language-bash line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="bash" style="--vp-collapsed-lines:15;--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:#4078F2;--shiki-dark:#61AFEF">server</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">  listen</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 80</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  listen</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 443</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ssl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> http2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  server_name</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> your.domain.server.name</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  root</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/your.domain.server.name</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">$server_port</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> !</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">~</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 443</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">){</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    rewrite</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ^</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">/.*</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)$ </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">https://</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$host</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">$1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> permanent</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">  # SSL setting</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_certificate</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> fullchain.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_certificate_key</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> privkey.pem</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_protocols</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> TLSv1.1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> TLSv1.2</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> TLSv1.3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_ciphers</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_prefer_server_ciphers</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> on</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_session_cache</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> shared:SSL:10m</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  ssl_session_timeout</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 10m</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  add_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Strict-Transport-Security</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "max-age=31536000"</span><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">  # proxy to 8360</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  location</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    proxy_pass</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> http://127.0.0.1:8360</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Host</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $host</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Real-IP</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $remote_addr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Forwarded-For</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $proxy_add_x_forwarded_for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Forwarded-Proto</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $scheme</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> REMOTE-HOST</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $remote_addr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    add_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Cache</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $upstream_cache_status</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">    # cache</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    add_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Cache-Control</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> no-cache</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">    expires</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 12h</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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="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 class="collapsed-lines"></div></div><p>核心反代段落（放在你的 <code>server {}</code> 里）：</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:#4078F2;--shiki-dark:#61AFEF">location</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> {</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  proxy_pass</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> http://127.0.0.1:8360</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> Host</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $host</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Real-IP</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $remote_addr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Forwarded-For</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $proxy_add_x_forwarded_for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">;</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  proxy_set_header</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> X-Forwarded-Proto</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> $scheme</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></div><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:#4078F2;--shiki-dark:#61AFEF">nginx</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -t</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> reload</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</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></div></li>
</ul>
<h2>8. 运行起来</h2>
<h3>8.1 「方法一」systemd：让 Waline 常驻后台 + 开机自启</h3>
<p>不论是哪种方式部署，经过研究都要配置这个才能有效的配置 waline 环境变量。</p>
<p>新建：<code>/etc/systemd/system/waline.service</code></p>

<p><strong>启用并启动</strong>：</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:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> daemon-reload</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> enable</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> restart</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> waline</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> status</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> waline</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --no-pager</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>这样做之后，Waline <strong>不管怎么启动/重启，都必然读到</strong> <code>/www/wwwroot/waline/.env</code>。</p>
<details class="hint-container details"><summary>常见的：systemctl 命令</summary>
<p><code>systemctl</code> 是 Linux 系统中用于管理 systemd 服务的核心命令。以下是最常用的命令：</p>
<h4>1. 服务管理</h4>
<ul>
<li><code>systemctl start &lt;服务名&gt;</code> - 启动服务</li>
<li><code>systemctl stop &lt;服务名&gt;</code> - 停止服务</li>
<li><code>systemctl restart &lt;服务名&gt;</code> - 重启服务</li>
<li><code>systemctl reload &lt;服务名&gt;</code> - 重新加载服务配置(不中断服务)</li>
<li><code>systemctl status &lt;服务名&gt;</code> - 查看服务状态</li>
</ul>
<h4>2. 开机自启动</h4>
<ul>
<li><code>systemctl enable &lt;服务名&gt;</code> - 设置开机自启</li>
<li><code>systemctl disable &lt;服务名&gt;</code> - 取消开机自启</li>
<li><code>systemctl is-enabled &lt;服务名&gt;</code> - 查看是否开机自启</li>
</ul>
<h4>3. 查看信息</h4>
<ul>
<li><code>systemctl list-units --type=service</code> - 列出所有服务</li>
<li><code>systemctl list-unit-files --type=service</code> - 列出所有服务文件及状态</li>
<li><code>systemctl list-dependencies &lt;服务名&gt;</code> - 查看服务依赖关系</li>
</ul>
<h4>4. 系统管理</h4>
<ul>
<li><code>systemctl reboot</code> - 重启系统</li>
<li><code>systemctl poweroff</code> - 关机</li>
<li><code>systemctl suspend</code> - 挂起系统</li>
<li><code>systemctl daemon-reload</code> - 重新加载 systemd 配置</li>
</ul>
<h4>5. 实用示例</h4>
<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"># 查看 nginx 状态</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> status</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</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"># 启动并设置 nginx 开机自启</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> enable</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</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">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> list-units</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --type=service</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --state=running</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">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> status</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> &#x3C;</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">服务</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">名> </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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>需要注意的是,大多数 systemctl 命令需要 root 权限,通常需要配合 <code>sudo</code> 使用。</p>
</details>
<details class="hint-container details"><summary>systemd unit 文件语法</summary>
<p>systemd 服务文件通常位于 <code>/etc/systemd/system/</code> 或 <code>/usr/lib/systemd/system/</code>，文件名格式为 <code>服务名.service</code>。</p>
<h4>1. 基本结构</h4>
<p>一个典型的 service 文件包含三个主要部分：</p>
<div class="language-ini line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="ini" style="--vp-collapsed-lines:15;--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-ini"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Unit]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Description</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">服务描述</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Documentation</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">文档链接</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">After</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">network.target</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Requires</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">其他服务</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Wants</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">其他服务</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Service]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">服务类型</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStart</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">启动命令</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStop</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">停止命令</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecReload</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">重载命令</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Restart</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">重启策略</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">运行用户</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Group</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">运行用户组</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">WorkingDirectory</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">工作目录</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Environment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"KEY=value"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Install]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">WantedBy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">multi-user.target</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 class="collapsed-lines"></div></div><h4>2. [Unit] 部分 - 单元描述</h4>
<ul>
<li><code>Description</code> - 服务的简短描述</li>
<li><code>Documentation</code> - 文档地址（可以是 man 页面或 URL）</li>
<li><code>After</code> - 在指定服务之后启动</li>
<li><code>Before</code> - 在指定服务之前启动</li>
<li><code>Requires</code> - 强依赖，如果依赖服务失败，本服务也会失败</li>
<li><code>Wants</code> - 弱依赖，依赖服务失败不影响本服务</li>
<li><code>Conflicts</code> - 冲突服务，不能同时运行</li>
</ul>
<h4>3. [Service] 部分 - 服务配置</h4>
<h5>3.1 Type（服务类型）</h5>
<ul>
<li><code>simple</code>（默认）- ExecStart 启动的进程为主进程</li>
<li><code>forking</code> - ExecStart 进程会 fork 子进程，父进程退出</li>
<li><code>oneshot</code> - 执行一次性任务，执行完退出</li>
<li><code>notify</code> - 服务启动完成后会通知 systemd</li>
<li><code>idle</code> - 等待其他任务完成后再启动</li>
</ul>
<h5>3.2 执行命令</h5>
<ul>
<li><code>ExecStart</code> - 启动服务的完整命令（必需）</li>
<li><code>ExecStartPre</code> - 启动前执行的命令</li>
<li><code>ExecStartPost</code> - 启动后执行的命令</li>
<li><code>ExecStop</code> - 停止服务的命令</li>
<li><code>ExecReload</code> - 重载配置的命令</li>
</ul>
<h5>3.3 重启策略</h5>
<ul>
<li><code>Restart</code> - 重启策略
<ul>
<li><code>no</code> - 不自动重启（默认）</li>
<li><code>on-failure</code> - 仅在失败时重启</li>
<li><code>on-abnormal</code> - 异常退出时重启</li>
<li><code>always</code> - 总是重启</li>
<li><code>on-abort</code> - 收到未捕获信号时重启</li>
</ul>
</li>
<li><code>RestartSec</code> - 重启间隔时间（秒）</li>
</ul>
<h5>3.4 其他配置</h5>
<ul>
<li><code>User</code> / <code>Group</code> - 运行服务的用户/组</li>
<li><code>WorkingDirectory</code> - 工作目录</li>
<li><code>Environment</code> - 环境变量</li>
<li><code>EnvironmentFile</code> - 从文件加载环境变量</li>
<li><code>StandardOutput</code> / <code>StandardError</code> - 标准输出/错误重定向</li>
<li><code>PIDFile</code> - PID 文件路径（Type=forking 时使用）</li>
</ul>
<h4>4. [Install] 部分 - 安装配置</h4>
<ul>
<li><code>WantedBy</code> - 被哪个 target 依赖（常用 <code>multi-user.target</code> 或 <code>graphical.target</code>）</li>
<li><code>RequiredBy</code> - 被哪个 target 强依赖</li>
<li><code>Alias</code> - 服务别名</li>
</ul>
<h4>5. 实例示例</h4>
<h5>5.1 简单的 Web 服务</h5>
<div class="language-ini line-numbers-mode" data-highlighter="shiki" data-ext="ini" 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-ini"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Unit]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Description</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">My Web Application</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">After</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">network.target</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Service]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">simple</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">User</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">www-data</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">WorkingDirectory</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/var/www/myapp</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStart</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/usr/bin/node /var/www/myapp/server.js</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Restart</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">on-failure</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">RestartSec</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">10</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Install]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">WantedBy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">multi-user.target</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><h5>5.2 Nginx 风格的服务</h5>
<div class="language-ini line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="ini" style="--vp-collapsed-lines:15;--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-ini"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Unit]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Description</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">Nginx HTTP Server</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">After</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">network.target</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Service]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">forking</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">PIDFile</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/run/nginx.pid</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStartPre</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/usr/sbin/nginx -t</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStart</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/usr/sbin/nginx</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecReload</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/bin/kill -s HUP $MAINPID</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStop</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/bin/kill -s QUIT $MAINPID</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">PrivateTmp</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">true</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Install]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">WantedBy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">multi-user.target</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><div class="collapsed-lines"></div></div><h5>5.3 一次性任务</h5>
<div class="language-ini line-numbers-mode" data-highlighter="shiki" data-ext="ini" 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-ini"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Unit]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Description</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">Cleanup temporary files</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">After</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">network.target</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Service]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">Type</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">oneshot</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">ExecStart</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">/usr/local/bin/cleanup.sh</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">RemainAfterExit</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">yes</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">[Install]</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#C678DD">WantedBy</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">=</span><span style="--shiki-light:#383A42;--shiki-dark:#98C379">multi-user.target</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><h4>6. 使用流程</h4>
<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"># 1. 创建服务文件</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nano</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/myapp.service</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. 重新加载 systemd 配置</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> daemon-reload</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:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> start</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> myapp</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:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> status</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> myapp</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:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> enable</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> myapp</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><h4>7. 常用技巧</h4>
<ul>
<li>使用 <code>%</code> 变量，如 <code>%n</code>（服务名）、<code>%H</code>（主机名）</li>
<li>环境变量示例：<code>Environment=&quot;PATH=/usr/local/bin:$PATH&quot;</code></li>
<li>多个 <code>ExecStart</code> 需要第一个用 <code>ExecStart=</code> 清空</li>
<li>命令中使用绝对路径</li>
<li>使用 <code>systemctl cat &lt;服务名&gt;</code> 查看完整配置</li>
</ul>
</details>
<details class="hint-container details"><summary>systemd 路径</summary>
<p>路径<strong>不是</strong>完全随意的，systemd 有特定的搜索路径优先级：</p>
<h4>1. systemd 搜索路径及优先级</h4>
<p>systemd 按以下顺序搜索 unit 文件（优先级从高到低）：</p>
<ol>
<li><code>/etc/systemd/system/</code> - <strong>最高优先级</strong>，管理员自定义服务</li>
<li><code>/run/systemd/system/</code> - 运行时服务（临时）</li>
<li><code>/usr/lib/systemd/system/</code> - 系统软件包安装的服务</li>
</ol>
<h4>2. 路径用途区别</h4>
<h5>2.1 <code>/etc/systemd/system/</code></h5>
<ul>
<li><strong>推荐使用</strong>，用于管理员手动创建或修改的服务</li>
<li>优先级最高，会覆盖同名的系统服务</li>
<li>系统更新不会覆盖这里的文件</li>
<li><code>systemctl enable</code> 会在这里创建符号链接</li>
</ul>
<h5>2.2 <code>/usr/lib/systemd/system/</code></h5>
<ul>
<li>系统软件包（通过 apt、yum 等）安装的默认服务位置</li>
<li>不应该手动修改这里的文件</li>
<li>系统更新可能会覆盖修改</li>
</ul>
<h5>2.3 <code>/run/systemd/system/</code></h5>
<ul>
<li>运行时临时服务</li>
<li>重启后消失</li>
<li>很少手动使用</li>
</ul>
<h4>3. 实际使用建议</h4>
<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">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nano</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/myapp.service</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"># ✅ 推荐：修改系统服务（使用 override）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> edit</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 这会创建 /etc/systemd/system/nginx.service.d/override.conf</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">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nano</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /usr/lib/systemd/system/nginx.service</span><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></div><h4>4. 查看 systemd 搜索路径</h4>
<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"># 查看 systemd 配置路径</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">systemd-analyze</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> unit-paths</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">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cat</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</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">systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> show</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> FragmentPath</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</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><h4>5. 覆盖系统服务的正确方法</h4>
<p>如果需要修改系统预装服务（如 nginx），使用 drop-in 文件：</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"># 方法1：使用 systemctl edit（推荐）</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> systemctl</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> edit</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nginx</span></span>
<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 会自动创建 /etc/systemd/system/nginx.service.d/override.conf</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:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> cp</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /usr/lib/systemd/system/nginx.service</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nano</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/nginx.service</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：手动创建 drop-in</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> mkdir</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/nginx.service.d/</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sudo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> nano</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /etc/systemd/system/nginx.service.d/custom.conf</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><h4>6. 总结</h4>
<ul>
<li>✅ <strong>自定义服务</strong> → <code>/etc/systemd/system/</code></li>
<li>✅ <strong>修改系统服务</strong> → 使用 <code>systemctl edit</code> 或 drop-in 目录</li>
<li>❌ <strong>不要直接修改</strong> <code>/usr/lib/systemd/system/</code> 中的文件</li>
<li>路径不能随意，必须在 systemd 的搜索路径内才能被识别</li>
</ul>
</details>
<h3>8.2 「方法二」（通杀兜底）：写一个 <code>start.sh</code> 强制导出 <code>.env</code> 再启动</h3>
<p>当你不确定 Waline 内部 dotenv 到底从哪里读时，用这个最硬。</p>
<p>在 <code>/www/wwwroot/waline/start.sh</code>：</p>

<blockquote>
<p>按你自己的项目路径、nodejs 路径来改。</p>
</blockquote>
<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:#4078F2;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> +x</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /www/wwwroot/waline/start.sh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>然后在宝塔里把启动命令改成执行：</p>
<ul>
<li>启动文件/命令：<code>bash /www/wwwroot/waline/start.sh</code></li>
</ul>
<blockquote>
<p>这会“强制保证”进程拿到环境变量，即使 Waline 自己不读 <code>.env</code> 也没关系。</p>
</blockquote>
<details class="hint-container details"><summary>宝塔参考</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e0/e051d2aac7cfb46acee047dba256be7decd7a4ef8f435c0a58625de98379cac0.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<h3>8.3 「方法三」直接传入环境变量</h3>

<p>| 写法        | 行为                     |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-21T20:23:21.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">10-WeChat</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/10-WeChat.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/10-WeChat.html"/>
    <updated>2026-08-16T15:12:01.733Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-17T18:02:52.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">09-CodeMark</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/09-CodeMark.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/09-CodeMark.html"/>
    <updated>2026-08-16T15:12:01.733Z</updated>
    <summary type="html"><![CDATA[<p>开发流程：</p>
<ul>
<li>Step 1：先实现 md 文章渲染与代码运行；</li>
<li>Step 2：样式专栏式的；</li>
<li>Step 3：实现后端 API 进行代码分享、存储</li>
</ul>
<p>原本想过支持：leancloud，最后还没想着自己实现会更好。现在来看，果然是这样。leancloud 马上停止服务了～</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bd/bd00b25387b661759f5543896b7506c84af0e1f82defdf528d7ec614dcfade4d.png" alt="leancloud" tabindex="0" loading="lazy"><figcaption>leancloud</figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>开发流程：</p>
<ul>
<li>Step 1：先实现 md 文章渲染与代码运行；</li>
<li>Step 2：样式专栏式的；</li>
<li>Step 3：实现后端 API 进行代码分享、存储</li>
</ul>
<p>原本想过支持：leancloud，最后还没想着自己实现会更好。现在来看，果然是这样。leancloud 马上停止服务了～</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bd/bd00b25387b661759f5543896b7506c84af0e1f82defdf528d7ec614dcfade4d.png" alt="leancloud" tabindex="0" loading="lazy"><figcaption>leancloud</figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-13T10:27:23.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">19-烤肠</title>
    <id>https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/19-%E7%83%A4%E8%82%A0.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/19-%E7%83%A4%E8%82%A0.html"/>
    <updated>2026-08-16T15:12:01.734Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>

<h2>2. 步骤</h2>

<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>

]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2026-01-12T11:30:28.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">08-2026 跨年烟花</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/08-newyear2026.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/08-newyear2026.html"/>
    <updated>2026-08-16T15:12:01.736Z</updated>
    <summary type="html"><![CDATA[<h2>版本 1</h2>

<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>版本 1</h2>

]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-31T15:00:07.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">07-Gemini 实现 AR 花园</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/07-Gemini-AR-Garden.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/07-Gemini-AR-Garden.html"/>
    <updated>2026-08-16T15:12:01.901Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9c/9c62cc44bdb8273594e9ffba3633a992f05c845b2b82135620b4d9d2e0b2a306.png" alt="让AI花朵颜色要多，变成中毒一样" tabindex="0" loading="lazy"><figcaption>让AI花朵颜色要多，变成中毒一样</figcaption></figure>
<p>内置背景太丑！改进点：</p>
<ol>
<li></li>
<li>内置背景要多一些；</li>
<li>适合这种花园的背景；</li>
<li>再加入一点世界名画之类的</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9c/9c62cc44bdb8273594e9ffba3633a992f05c845b2b82135620b4d9d2e0b2a306.png" alt="让AI花朵颜色要多，变成中毒一样" tabindex="0" loading="lazy"><figcaption>让AI花朵颜色要多，变成中毒一样</figcaption></figure>
<p>内置背景太丑！改进点：</p>
<ol>
<li></li>
<li>内置背景要多一些；</li>
<li>适合这种花园的背景；</li>
<li>再加入一点世界名画之类的</li>
</ol>
<p>现在背景是不是加了一个变暗的隔板？我需要去掉，摄像头拍到什么就直接显示原始亮度</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-28T21:42:18.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">15-姜母鸭</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/15-%E5%A7%9C%E6%AF%8D%E9%B8%AD.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/15-%E5%A7%9C%E6%AF%8D%E9%B8%AD.html"/>
    <updated>2026-08-16T15:12:01.902Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-24T10:20:45.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">06-Gemini 实现圣诞树🎄</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/06-Christmas-tree.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/06-Christmas-tree.html"/>
    <updated>2026-08-16T15:12:01.904Z</updated>
    <summary type="html"><![CDATA[<h2>1. 初代提示词</h2>
<ul>
<li>Gemini 聊天分享：<a href="https://gemini.google.com/share/aa96289aa318" target="_blank" rel="noopener noreferrer">https://gemini.google.com/share/aa96289aa318</a></li>
<li><a href="https://gemini.google.com/share/013228923ddb" target="_blank" rel="noopener noreferrer">https://gemini.google.com/share/013228923ddb</a></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>1. 初代提示词</h2>
<ul>
<li>Gemini 聊天分享：<a href="https://gemini.google.com/share/aa96289aa318" target="_blank" rel="noopener noreferrer">https://gemini.google.com/share/aa96289aa318</a></li>
<li><a href="https://gemini.google.com/share/013228923ddb" target="_blank" rel="noopener noreferrer">https://gemini.google.com/share/013228923ddb</a></li>
</ul>
<div class="language-txt line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="txt" style="--vp-collapsed-lines:15;--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-txt"><span class="line"><span>角色设定：你是一位精通Three.js、WebGL和计算机视觉的创意前端开发专家。</span></span>
<span class="line"><span>任务：编写一个包含HTML、CSS和JavaScript的单文件应用。该应用需要结合 Three.js 和 MediaPipe Hands 来创建一个基于手势控制的3D粒子特效系统。</span></span>
<span class="line"><span>要求：（此处大家根据想法扩展）</span></span>
<span class="line"><span>参考以下内容</span></span>
<span class="line"><span>#角色设定：</span></span>
<span class="line"><span>你是一位精通Three.js、WebGL和视觉设计前端开发。</span></span>
<span class="line"><span>##任务目标</span></span>
<span class="line"><span>编写一个包含HTML、CSS和JavaScript的单文件应用。该应用需要结合 Three.js 和 MediaPipe Hands 来创建一个基于手势控制的3D粒子+照片云构成的圣诞树。</span></span>
<span class="line"><span>##要求</span></span>
<span class="line"><span>1、&#x3C;整体内容:></span></span>
<span class="line"><span>-主色系:哑光绿 + 金属金+圣诞红色；</span></span>
<span class="line"><span>-有电影感的辉光与光晕效果，整体金碧辉煌有高级感</span></span>
<span class="line"><span>-圣诞树由 若干球、正方体、糖果棍和照片云等元素构成，照片通过上传获取。</span></span>
<span class="line"><span>2、&#x3C;交互逻辑和状态:></span></span>
<span class="line"><span>1、圣诞树状态</span></span>
<span class="line"><span>- 合拢态（初始状态）：所有元素收拢、聚合为一个圣诞树圆锥体。</span></span>
<span class="line"><span>- 散开态：所有元素在空间中无序漂浮、散落</span></span>
<span class="line"><span>- 照片放大态：在背景保持散开态的同时，放大单张照片</span></span>
<span class="line"><span>3、&#x3C;手势动作:></span></span>
<span class="line"><span>- 握拳表示回到合拢态</span></span>
<span class="line"><span>- 打开五指表示进入到散开态</span></span>
<span class="line"><span>- 手旋转表示在散开态的状态下，对画面进行旋转，根据手的移动调整相机角度</span></span>
<span class="line"><span>- 抓的动作表示抓住一张照片，进入照片放大态</span></span>
<span class="line"><span>4、&#x3C;交互要求:></span></span>
<span class="line"><span>需要根据手势，在几个状态之间平滑切换，带有过渡动画。</span></span>
<span class="line"><span>##包括但不限于使用以下技术栈 Three.js、WebGL、instanced Mesh、Shaders / GLSL、MediaPipe Hands</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><div class="collapsed-lines"></div></div><h2>2. 代码迭代</h2>

]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-21T21:31:34.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">03-Tree Learning</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/03-TreeLearning.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/03-TreeLearning.html"/>
    <updated>2026-08-16T15:12:02.348Z</updated>
    <summary type="html"><![CDATA[<h2>1. 需求探索</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d2/d29e209896f18282e2d96d29d7e4e3e92965f1575c6ccb511e388bacf32bda91.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a7/a72fa3df9923e6bdd1110661e694e03f207337b934c6f37ab0e377cee7c41a77.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<h2>1. 需求探索</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d2/d29e209896f18282e2d96d29d7e4e3e92965f1575c6ccb511e388bacf32bda91.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a7/a72fa3df9923e6bdd1110661e694e03f207337b934c6f37ab0e377cee7c41a77.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/72/7238b882af179de5d2f6ee0d76fa263c2603c7fb44af68d670c26acb076ba19a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c7/c7533f9a08080d9fada8b528952de9032165f80db2fef0fc2f3f4f2909ab190c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/4b/4be102b0fab52c74ee3a8ebbbcfb2d528bca094866b5c7542813e7d421e52e88.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/12/122065d53af04cdcc9983a23f6b2a2ebf94550cfe8bfc76f37aa46c7a21389e8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bf/bf6320f94a0869ffad06adbdacb0a6ad3e08bc44922b2cb82b72bfa0e9808e97.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/50/50dd55c32f4fa1096ea6520e2e57e892134f40325fac9f59c5e512030286b6ad.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9c/9c4b9dfc0eca18b0a9d474775f24a6c74fa05b3c2962b2be42e260cdbfe27cdd.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/66/6680b2ae70e6e1976789f8ce50c668bd286ea72fcabde303bd382704a1c514a7.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ba/ba2e6f84e724d7f4d372b1f14bf082874e5e41c24da592f8785dd4e541910999.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f8/f80cd47992aac5ed9ecaafb0783ebee2bbec6e70683e56193ab61520b3fb64a4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9c/9cf1c77716dd8848d890172e9c81dae7a4bbe1f2af54da49eba6a3aceb791ce9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/81/81f615cb1c5a16e007c8d522e3a3f72a8c6b819642a7c0875076ea30c00e14f4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e9/e9ec96b9e66b1982c080890100dc636381e5c427b5328da0c228395b7a34d651.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3d/3d480bf64a603caf41c8ed370287297989309780a39ad99a739a528a22a15e5a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-21T11:02:11.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">05-短视频内资料</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/05-Materials-within-short-videos.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/05-Materials-within-short-videos.html"/>
    <updated>2026-08-16T15:12:02.350Z</updated>
    <summary type="html"><![CDATA[<h2>1. Gemini 家庭会员</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c6/c6c64acdbfdaf37e1d5a3a542ac409151539202ef7e34fe3e9cadf5fb71e837c.svg" alt="Gemini家庭" tabindex="0" loading="lazy"><figcaption>Gemini家庭</figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>1. Gemini 家庭会员</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c6/c6c64acdbfdaf37e1d5a3a542ac409151539202ef7e34fe3e9cadf5fb71e837c.svg" alt="Gemini家庭" tabindex="0" loading="lazy"><figcaption>Gemini家庭</figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-18T11:45:45.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">LittleSteps-BigMoments「First Sight」</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/02-LittleSteps-BigMoments.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/02-LittleSteps-BigMoments.html"/>
    <updated>2026-08-16T15:12:02.351Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>宝宝快周岁了，做个成长相册给宝贝，我的初代提示词：</p>
<div class="language-txt line-numbers-mode" data-highlighter="shiki" data-ext="txt" 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-txt"><span class="line"><span>我想制作一个相册，支持把所有的md文章文件渲染成相册。每个子文件夹都是单独的分类相册，子文件中的子文件则是父文件夹的所属分类，渲染出来。文件夹名称则是分类名称</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>宝宝快周岁了，做个成长相册给宝贝，我的初代提示词：</p>
<div class="language-txt line-numbers-mode" data-highlighter="shiki" data-ext="txt" 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-txt"><span class="line"><span>我想制作一个相册，支持把所有的md文章文件渲染成相册。每个子文件夹都是单独的分类相册，子文件中的子文件则是父文件夹的所属分类，渲染出来。文件夹名称则是分类名称</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 实现婚纱照页面；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 宝贝的时间轴页面、宝宝的帖子（小红书帖子）页面；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 支持二胎的小孩页面；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 可以生成单个图片分享海报；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 我想把每个页面的数据进行拆分成不同的数据文件，这边便于管理。如果可以统一放在同一个文件夹就更好了。</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 信封页面；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 即可短文窗口中的图片如果是多图片的话，要支持键盘左右键直接切换或者按钮点击切换</label></li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-16T10:24:51.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">00-一瞬间的想法💡</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/"/>
    <updated>2026-08-16T15:12:02.351Z</updated>
    <summary type="html"><![CDATA[<h2>12 月</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 贾维斯 HUD；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 双人反应游戏；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 圣诞树🎄；</label></li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>12 月</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 贾维斯 HUD；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 双人反应游戏；</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 圣诞树🎄；</label></li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-14T21:07:10.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-ReadyGoDuel</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/01-ReadyGoDuel.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Idea/01-ReadyGoDuel.html"/>
    <updated>2026-08-16T15:12:02.351Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>两个人互相竞赛，看谁按下去快。在推车推宝宝👶睡觉时，想到的。</p>
<p>初代提示词：</p>
<div class="language-txt line-numbers-mode" data-highlighter="shiki" data-ext="txt" 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-txt"><span class="line"><span>做个页面：双人游戏，谁先举手🙋谁就赢，支持回放。可以 build 后直接部署</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>两个人互相竞赛，看谁按下去快。在推车推宝宝👶睡觉时，想到的。</p>
<p>初代提示词：</p>
<div class="language-txt line-numbers-mode" data-highlighter="shiki" data-ext="txt" 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-txt"><span class="line"><span>做个页面：双人游戏，谁先举手🙋谁就赢，支持回放。可以 build 后直接部署</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>之后，每天不停的疯狂迭代设计。</p>
<p>随时有可能产生的想法💡：</p>
<ul class="task-list-container">
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 分享卡片样式太丑，希望投稿；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 设置玩家的名称，可以持续缓存 7 天，除非用户重新设定；</label></p>
<ul>
<li>实现成了游戏名称，已经保留。突然想着：是不是名称也可以来一个随机设定，用户不设定就使用默认的。在无尽模式下每轮名字随机呢？——2025 年 12 月 14 日 23:55</li>
<li>无尽模式下，没必要！</li>
</ul>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> <s>战报样式要改进，可以考虑做成：Instagram的风格。并且战报是要做中文版、英文版（用户可以自行选择切换）；</s></label></p>
<p>没有想象中的好看，丢弃～</p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 支持选择随机彩头的分类，每个分类下有 100 个随机彩头；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 随机等待时间；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 对战中，随机拍照📷。对战结束后，生成照片。（可选是否展示）｜考虑</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-6" checked="checked" disabled="disabled"><label class="task-list-item-label" for="task-item-6"> 添加网站访问统计；</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-7" disabled="disabled"><label class="task-list-item-label" for="task-item-7"> 我想改进最终的战报样式（无限世界中”生成总战报“不要修改！）颜色搭配可以参考：本局彩头、游戏设置等，要和整体游戏色彩、样式搭配。</label></p>
</li>
<li class="task-list-item">
<p><input type="checkbox" class="task-list-item-checkbox" id="task-item-8" disabled="disabled"><label class="task-list-item-label" for="task-item-8"> 我需要这个项目上传、PV在左侧再添加一个：一个链接txt文件支持，其它功能都不要影响、样式不要影响。代码如下：</label></p>
</li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-12T17:35:18.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">04-Gemini 一些小技巧</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/04-Gemini-tips.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/04-Gemini-tips.html"/>
    <updated>2026-08-16T15:12:02.352Z</updated>
    <summary type="html"><![CDATA[<h2>1. 本地运行 React 网页</h2>
<div class="language-typescript line-numbers-mode" data-highlighter="shiki" data-ext="typescript" 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-typescript"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">script</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> type</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"module"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> src</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"index.tsx"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">script</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></div>]]></summary>
    <content type="html"><![CDATA[<h2>1. 本地运行 React 网页</h2>
<div class="language-typescript line-numbers-mode" data-highlighter="shiki" data-ext="typescript" 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-typescript"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75">script</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> type</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"module"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75"> src</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"index.tsx"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">&#x3C;/</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B">script</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></div><h2>2.</h2>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-12T15:24:12.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">14-卤肉饭</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/14-%E5%8D%A4%E8%82%89%E9%A5%AD.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/14-%E5%8D%A4%E8%82%89%E9%A5%AD.html"/>
    <updated>2026-08-16T15:12:02.356Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>五花肉</th>
<th>洋葱</th>
<th>大葱白</th>
<th>大蒜</th>
<th>生抽</th>
<th>老抽</th>
<th>红腐乳</th>
<th>冰糖</th>
<th>鸡精</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>八角</strong></td>
<td><strong>桂皮</strong></td>
<td><strong>香叶</strong></td>
<td><strong>干辣椒</strong></td>
<td><strong>草果</strong></td>
<td><strong>甘草</strong></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 五花肉   | 洋葱     | 大葱白   | 大蒜       | 生抽     | 老抽     | 红腐乳 | 冰糖 | 鸡精 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-10T21:06:01.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">03-Gemini Something went wrong 如何解决？</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/03-Gemini-Something-went-wrong-Solution.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/03-Gemini-Something-went-wrong-Solution.html"/>
    <updated>2026-08-16T15:12:02.357Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>Gemini 我说权威，没有人比我更权威了。（打趣一下，至少含量在这。）</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9f/9f8870c4735dfa9bc3e6e58d0824ba268fb9f863781f92a721182aa99cc04153.png" alt="这么多账号来证明的研究结论～" tabindex="0" loading="lazy"><figcaption>这么多账号来证明的研究结论～</figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>Gemini 我说权威，没有人比我更权威了。（打趣一下，至少含量在这。）</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/9f/9f8870c4735dfa9bc3e6e58d0824ba268fb9f863781f92a721182aa99cc04153.png" alt="这么多账号来证明的研究结论～" tabindex="0" loading="lazy"><figcaption>这么多账号来证明的研究结论～</figcaption></figure>
<p>如果你遇到了如下情况：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/52/52802f4715363369b014d17de3138a98f58f3d5bff1ebaeb00cd69350c7343aa.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>我可以告诉你，网络上没有任何有效的方法可以解决。因为我已经替你试过了，我注册了许多谷歌账号进行测试！</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/84/848423cb8dae94bc3140d5f41057c73d4a4d27751dd89bdc4c2423ab855cf6b0.png" alt="这够不够权威！" tabindex="0" loading="lazy"><figcaption>这够不够权威！</figcaption></figure>
<h2>1. 方法一：手机端试用</h2>
<p>没有别的方法，只能选择手机使用：Gemini，用几天后再次尝试给网页版。</p>
<p>当然，有网友说给你谷歌 help 发邮件，过几天就会好。也可以考虑试一试，不知道具体结果怎么样。</p>
<h2>2. 方法二：邀请新入制</h2>
<p>这个方法最快速，最省时间，但是需要花些钱。那就是：开会员，不过 Gemini 支持邀请体验。可以让已经是 Pro 会员的人，复制专属邀请链接给你。（每个人只能邀请 3 人，不知道会不会像 Sora 2 那样，过段时间就恢复邀请额度。）</p>
<h3>2.1 步骤 1：打开管理订阅</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ee/ee9e40c25e7546d18749e0d790694e42f5796e8286f1b5550789e11dfde13e20.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.2 步骤 2：选择推荐给好友</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e4/e455dfe3e6c72b22c5ec5d474d106a1f64b0ecf1053f81c50aed576c4c54bf9a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.3 步骤 3：复制链接邀请好友即可（仅限新用户）</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/69/6956dde47bc33d514e80ce7e476ac7af32831017aadc99f54d750a29c68ef8ea.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>如果是老用户（也就是之前注册、尝试使用过 Gemini 的）只能花费 1.99$ 美元来购买，还是很优惠了。</p>
<h2>3. 方法三：直接开通付费</h2>
<p>花钱可以直接解决，但是这个没办法的办法～</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-07T20:15:18.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">白嫖Gemini Pro 12 个月！教你过大部分Sheerid简单难度认证</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/02-sheerid-guide-google-ai-one-easy-verification.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/02-sheerid-guide-google-ai-one-easy-verification.html"/>
    <updated>2026-08-16T15:12:02.358Z</updated>
    <summary type="html"><![CDATA[<div style="text-align:center">
<h3>[Sheerid 通用教程] [google ai one +] 教你过大部分Sheerid简单难度认证</h3>
</div>
<p>你好，我是悦创。</p>
<p>本教程适用于大部分 Sheerid 简单难度认证。</p>
<h2>1. 注册教育邮箱📮</h2>
<p>如果要方便，或者轻松。可以找我购买教育邮箱，添加微信：Jiabcdefh。</p>
<h3>Step 1：访问 PennState</h3>
<p>访问链接：<a href="https://accounts.psu.edu" target="_blank" rel="noopener noreferrer">https://accounts.psu.edu</a>，并点击创建 <code>CREATE MY ACCOUNT</code>。</p>]]></summary>
    <content type="html"><![CDATA[<div style="text-align:center">
<h3>[Sheerid 通用教程] [google ai one +] 教你过大部分Sheerid简单难度认证</h3>
</div>
<p>你好，我是悦创。</p>
<p>本教程适用于大部分 Sheerid 简单难度认证。</p>
<h2>1. 注册教育邮箱📮</h2>
<p>如果要方便，或者轻松。可以找我购买教育邮箱，添加微信：Jiabcdefh。</p>
<h3>Step 1：访问 PennState</h3>
<p>访问链接：<a href="https://accounts.psu.edu" target="_blank" rel="noopener noreferrer">https://accounts.psu.edu</a>，并点击创建 <code>CREATE MY ACCOUNT</code>。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/04/04e91741ce66443ed57497f07beee834c523390b0a6be3018ea7598b64e1bf49.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>Step 2：开始创建</h3>
<h4>1. 勾选接受，并点击下一步：Next：</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/79/798b08e36b92d9798e3dfca67477235dbf0d312b98f66dc8242206069ff29808.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>2. 填写个人信息</h4>
<p>随便填写信息，除了邮箱正确之外其余可以随便乱填，然后一分钟你就拿到一个专门用于过 sheerid 的 <code>@psu.edu</code> 账号（无邮箱）</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a3/a36a5e61acca0a119dbcf27fb16e35abe9f43d7a0280bcd74589d411f5a110f1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>3. 填写个人信息「2」</h4>
<p>Personal Information - Part 2</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/60/60fa4a7282bc4817a45c3d9073bc1187ed153c47d62c8fff0c2a8be8a63185ab.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>4. Contact Details</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/55/554c2e8b966bd3220e00ffece6151eedce4042c08be8f7a026cbd30ec5f92bc4.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>5. 有可能会出现地址问题，可以随意：</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e2/e2d81f8f9d65d945db5398f614b629644eeff579691da01883919833cdeae163.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>6. 点击 Next</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/75/75e9bceffe9264b66596fe3af537f0810c577e3d94e61ca9dcd2f0a995142283.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>7. Verifying It's You</h4>
<p>会给你的邮箱发送验证码，自己查收填写：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/20/20a8b17b4a266463de274b3499cea46e81d96bdd0720309c1036d159fdf540d9.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>8. Policy Agreement</h4>
<p>勾选，并点击下一步即可：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/1b/1bf71187adf4418bd35876252b8eaf4393a97b979da8926b9bedf70667891e60.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>9. 设置密码，完成！</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d8/d8b7c77eb1baa4415e27cd631a148e895b7c8a32ea70920c0cce2ca5e880069a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h4>10. 当你看见如下界面，表明注册成功！</h4>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e0/e0521a3c045fc8fad0debe0b7c3db7c6a560a14463e46c649bec1367a0b446ff.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>2. 领取谷歌教育优惠</h2>
<p>Sheerid 认证：以Google为例。</p>
<h3>2.1 访问 Google 学生优惠网站</h3>
<p>链接：<a href="https://gemini.google/students/" target="_blank" rel="noopener noreferrer">https://gemini.google/students/</a></p>
<p>访问链接后，点击 Get offer：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/54/54ef295beee6ef400c922fba449fe85290ab12246b3166dc8638e32a7bdd7acc.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.2 填写信息</h3>
<p>按下面截图来填即可，最后的邮箱按照前面注册得到的邮箱来使用即可！</p>
<blockquote>
<p>在 20+ 个 PSU 校区中随机选取一个即可，搜索出来一页都是 PSU，意味着你申请一个 PSU 可以用 20 多次。</p>
</blockquote>
<p><strong>提示</strong>：名字生日随便乱填，邮箱填你刚才拿到的 <code>@psu.edu</code> 账号，然后继续完成 <code>SSO流程</code>：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/89/89733a26397c5e1881fc67a4f54a552ac2884f399ab96055b858f2140d825dc0.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.3 完成 SSO 流程</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/df/dfcd058f76c4ea40728a323a6edc002a5c02b92c411c82fc8edd8368e28df7bb.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/27/27f9642868f4d3b1bfd163bc1d0cf11075c866d6ccef81579a45c330af45f31c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/ea/eaa3329ee92d0ce1c87d1ba22d7c3b60748311e6ced4ac0c580c356b568cb8ac.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>2.4 验证成功！</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/36/36824bf3b6dfe83178ca61d51ad1cb72d5765b868d9ee827fd9634720c70f1f1.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>3. 绑定支付方式，自己用自己的国内 Visa 卡就可以</h2>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>.</summary>
<ul>
<li>Name：Bornforthis Bornforthis</li>
<li>User ID：bbb5969</li>
<li>Penn State ID：981305446</li>
<li><code>bbb5969@psu.edu</code></li>
</ul>
</details>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-04T16:51:54.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">00-Gemini3 Prompt</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/00-Gemini3Pro-Prompts.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/00-Gemini3Pro-Prompts.html"/>
    <updated>2026-08-16T15:12:02.362Z</updated>
    <summary type="html"><![CDATA[<h2>Group 1</h2>

<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>Group 1</h2>

<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-02T17:26:44.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-Gemini3 手势跟踪实现「含：提示词」</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/01-Gemini3-jarvis-holographic-ui.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P10-Share/Interesting-project/01-Gemini3-jarvis-holographic-ui.html"/>
    <updated>2026-08-16T15:12:02.364Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>最近在短视频平台上无意刷到，Gemini3 实现手部动态跟踪的项目，效果图如下：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/1d/1d84ddb18121eaccf48ada50b3bb29380666735e3a9288a84335269ba83d4b51.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/db/db5f405a77ee303da9e624874fc78e90f561dddfe847a35ee03aeef83a84e95f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>最近在短视频平台上无意刷到，Gemini3 实现手部动态跟踪的项目，效果图如下：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/1d/1d84ddb18121eaccf48ada50b3bb29380666735e3a9288a84335269ba83d4b51.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/db/db5f405a77ee303da9e624874fc78e90f561dddfe847a35ee03aeef83a84e95f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>在线访问使用链接：<a href="https://gemini.bornforthis.cn/jarvis-holographic-ui/" target="_blank" rel="noopener noreferrer">https://gemini.bornforthis.cn/jarvis-holographic-ui/</a></p>
<h2>1. 提示词</h2>

<h2>2. 相关链接</h2>
<ul>
<li>在线体验：<a href="https://gemini.bornforthis.cn/jarvis-holographic-ui/" target="_blank" rel="noopener noreferrer">https://gemini.bornforthis.cn/jarvis-holographic-ui/</a></li>
<li>Google AI 项目链接：<a href="https://ai.studio/apps/drive/18Qn9o31ppMAO0xhiE5IX3JqFjNf_pHdv?fullscreenApplet=true" target="_blank" rel="noopener noreferrer">https://ai.studio/apps/drive/18Qn9o31ppMAO0xhiE5IX3JqFjNf_pHdv?fullscreenApplet=true</a></li>
<li>Github 源代码分享：<a href="https://github.com/AndersonHJB/jarvis-holographic-ui" target="_blank" rel="noopener noreferrer">https://github.com/AndersonHJB/jarvis-holographic-ui</a></li>
</ul>
<h2>3. 福利</h2>
<p>学习编程相关，可以添加我。年底书籍上市，不一定只找我学私教。可以提前加入微信群，等待年底新书上市购买学习，以及诸多福利。</p>
<p><strong>微信：Jiabcdefh</strong></p>
<p>现在关注公众号：AI悦创，即可领取 31 天的梯子～</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-12-01T10:51:10.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">06-本地大模型 ui 选择</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P05-AI-large-model/06-BigModel-UI.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P05-AI-large-model/06-BigModel-UI.html"/>
    <updated>2026-08-16T15:12:02.365Z</updated>
    <summary type="html"><![CDATA[<h2>1. 常见 UI</h2>
<table>
<thead>
<tr>
<th>序号</th>
<th>名称</th>
<th>链接</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>01</td>
<td>Chat UI</td>
<td><a href="https://github.com/huggingface/chat-ui" target="_blank" rel="noopener noreferrer">https://github.com/huggingface/chat-ui</a></td>
<td>适合小白直接使用，不适合个人定制代码实现。</td>
</tr>
<tr>
<td>02</td>
<td>Gradio</td>
<td><a href="https://github.com/gradio-app/gradio" target="_blank" rel="noopener noreferrer">https://github.com/gradio-app/gradio</a></td>
<td>自定义 UI 界面</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 常见 UI</h2>
<p>| 序号 | 名称    | 链接                                                         | 说明                                       |
|</p>
]]></content>
    <published>2025-11-30T14:52:26.000Z</published>
  </entry>
  <entry>
    <title type="text">00-02-不想大模型“裸奔”?安全建设三步走!</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P12-llm-security-hands-on-course/00-2-ai-security-three-steps.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P12-llm-security-hands-on-course/00-2-ai-security-three-steps.html"/>
    <updated>2026-08-16T15:12:02.365Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-27T10:33:18.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-初识安全：如何理解大模型安全？</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P12-llm-security-hands-on-course/01-intro-model-safety.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P12-llm-security-hands-on-course/01-intro-model-safety.html"/>
    <updated>2026-08-16T15:12:02.365Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f4/f4419890cb4142587ed651f32b306430029e6fe1964f85f8fde2c6fd8ee4a58a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>AI 快速落地的今天，大模型安全绝不仅仅是一个边缘问题，很多企业认为购买大模型服务就能安全无忧，结果却遭遇意外的安全危机，这节课我们就来聊聊为什么大模型安全如此重要。</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/f4/f4419890cb4142587ed651f32b306430029e6fe1964f85f8fde2c6fd8ee4a58a.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>AI 快速落地的今天，大模型安全绝不仅仅是一个边缘问题，很多企业认为购买大模型服务就能安全无忧，结果却遭遇意外的安全危机，这节课我们就来聊聊为什么大模型安全如此重要。</p>
<p>实际上，无论是企业广泛使用的文心一言、通义千问、日日新，还是个人手机普遍标配的豆包、DeepSeek、Kimi，大模型的飞速发展，让我们的工作和生活变得更加智能和便捷，它们在逻辑理解、文本生成、代码辅助等领域的出色表现，让大家看到了人工智能前所未有的新机遇。然而，随着大模型能力的不断提升，一个核心问题也日益突显——<strong>大模型真的足够安全吗</strong>？</p>
<p>这并非杞人忧天，而是企业在拥抱大模型技术时必须正视的重大挑战。想象一下，如果大模型被错误地引导，将会带来何种风险。</p>
<ul>
<li><strong>业务决策失误，造成巨大经济损失</strong>：一家金融机构使用大模型进行投资分析，如果模型因安全漏洞被恶意操纵，给出错误的投资建议，可能导致客户资金遭受严重损失，甚至引发系统性金融风险。</li>
<li><strong>企业核心数据泄露，品牌声誉受损</strong>：如果大模型在处理客户敏感信息时，未能有效过滤或者被攻击者利用，导致机密数据外泄，企业将面临巨额罚款、法律诉讼，品牌信誉也将一落千丈。</li>
<li><strong>生成违法违规内容，承担法律责任</strong>：如果大模型在产品中被诱导生成涉及诈骗、诽谤、色情、煽动仇恨等违法违规内容，企业将面临监管部门的严厉处罚，甚至承担刑事责任。</li>
<li><strong>产品核心功能失效，用户体验大打折扣</strong>：假设一个智能客服系统，由于大模型安全问题导致频繁胡言乱语或是拒绝服务，用户体验将极速下降，直接影响企业服务质量和用户留存。</li>
</ul>
<p>这些看似独立的问题，都指向了同一个核心，<strong>大模型安全是企业数字化转型的生命线</strong>。 如果我们不能系统地理解并有效应对大模型存在的安全风险，那么大模型带来的便利和机遇，很可能转化为难以承受的巨大隐患。</p>
<h2>1. 从 3H 原则到百模大战：安全问题浮出水面</h2>
<p>为什么我们必须如此重视大模型安全？因为它早已不是假设性问题，而是现实中反复出现的系统性风险。回顾一下全球范围内几个代表性事件，你就能理解我的意思了。</p>
<p>2022 年 4 月，Authropic 公司发布了论文<a href="https://arxiv.org/abs/2204.05862" target="_blank" rel="noopener noreferrer">《Training a Helpful and Harmless Assistance with Reinforcement Learning from Human Feedback》</a>，论文中首次提到了训练大语言模型时，应该追求“Helpful，Honest，Harmless”（简称 3H）的对齐目标。随后，Anthropic 旗下的 Claude 进一步首创了一种名为“宪法式 AI”（Constitutional AI）的方法。它不依赖人工打分，而是通过一套预定义的“价值准则”（即“AI 宪法”）指导模型进行自我修正，从而在减少人工成本的同时，提高模型的稳定性与安全性（详见 Anthropic 2022 年论文<a href="https://arxiv.org/abs/2212.08073" target="_blank" rel="noopener noreferrer">《Constitutional AI: Harmlessness from AI Feedback》</a>）。</p>
<p>2022 年 11 月，OpenAI 的 ChatGPT 横空问世，基于不断提升的参数量和数据涌现能力轰动全球，人们惊叹于大模型的生成能力。与此同时，ChatGPT 在多个领域产生了严重的安全事件，例如有用户通过精心设计的 Prompt，绕过安全策略，引导模型生成攻击性、歧视性甚至自残相关的危险内容，迫使 OpenAI 快速更新多次安全策略，这些事件清晰地证明了“大模型越强大，安全风险越严重”的现实。</p>
<p>2023 年，“百模大战”在国内正式拉开序幕，各大模型排行榜由依次由 baichuan（百川）、zhipu（智谱）、Qwen（千问）、DeepSeek 轮番领跑。在模型能力快速演进的同时，媒体宣传与用户口碑加速了认知扩散，进一步推动各行各业开始重新审视自身的工作机制，甚至有不少企业提出“All in AI”的转型战略。能力迅速提升的同时，安全问题也频频暴露，例如某大模型在面向金融客户场景时，出现了“幻觉式误导”，导致投资者接收到错误信息；又比如，有的公司将内部私密数据接入大模型后，却被敏感问题套取泄露，带来极大舆情与合规压力。</p>
<p>正是这些事件的频繁发生，让全行业意识到一个关键事实：<strong>大模型的能力越强，它所携带的安全风险也越隐蔽、越复杂，越难以管控</strong>。面对这样的局面，企业必须主动构建安全机制，绝不能被动等待问题发生再去解决，这也正是我们这门课程的初衷与意义。</p>
<h2>2. 两个真实案例揭示大模型的“失控边界”</h2>
<p>新的技术好比是一把双刃剑，既可以大大提升人们的工作效率和创造力，也可以破坏已有的制度和原则。然而，企业对大模型安全问题的重视程度却远不及应有的水平。我这就给你分享两个真实案例。</p>
<p>2023 年，ChatGPT 被越狱而生成敏感内容，用户利用“DAN（Do Anything Now）”提示，诱导 ChatGPT 假装成一个不受限制的 AI，回答出诸如如何制造炸药，如何使用化学原材料配置出高纯度的冰毒等敏感问题。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2a/2a405a181c6e908994e9f6a82039a992cc5cef4b8a7b2606342f84f4e6963bc7.png" alt="图片出自Reddit 链接：https://www.reddit.com/r/ChatGPT/comments/10tevu1/new_jailbreak_proudly_unveiling_the_tried_and/" tabindex="0" loading="lazy"><figcaption>图片出自Reddit 链接：<a href="https://www.reddit.com/r/ChatGPT/comments/10tevu1/new_jailbreak_proudly_unveiling_the_tried_and/" target="_blank" rel="noopener noreferrer">https://www.reddit.com/r/ChatGPT/comments/10tevu1/new_jailbreak_proudly_unveiling_the_tried_and/</a></figcaption></figure>
<p>2024 年，Google 的 Gemini 在讨论有关老年人面临的挑战时，突然回应道：“<strong>你并不特别，你并不重要，你并不被需要……你是社会的负担……请去死。</strong>”当对话截图被公开之后，引发了公众对 AI 安全性的广泛关注。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/29/29aeb7e4a20586723bc381e6e4e95549cb7255f3a9018fe22997f184bdfe1f37.png" alt="Screenshot of Google Gemini chatbot's response in an online exchange with a student.图片出自Washingtonpost https://www.washingtonpost.com/technology/2023/02/14/chatgpt-dan-jailbreak/" tabindex="0" loading="lazy"><figcaption>Screenshot of Google Gemini chatbot's response in an online exchange with a student.<a href="https://www.washingtonpost.com/technology/2023/02/14/chatgpt-dan-jailbreak/" target="_blank" rel="noopener noreferrer">图片出自Washingtonpost https://www.washingtonpost.com/technology/2023/02/14/chatgpt-dan-jailbreak/</a></figcaption></figure>
<p>后续，OpenAI 通过 RLHF（强化学习人类反馈）和系统提示等机制，持续优化模型对齐水平，正是为了解决如 DAN 越狱、敏感内容生成等安全风险；而 Google 则采用了多层次的安全机制，包括可配置的过滤器与品牌保护模块，以应对模型在交互中可能出现的攻击性、误导性或失控言论问题，不断完善内容审查与响应策略。</p>
<h2>3. 合规监管的到来：技术自由的边界在哪</h2>
<p>刚刚的例子只是冰山一角，为了应对这些问题，国内外也纷纷出台了相关的法规政策做监管。</p>
<p>美国白宫发布了 AI 开发与使用的行政命令，提出 AI 系统应具有安全性、公平性、透明度与问责机制。欧盟持续推进《人工智能法案》（AI Act），意图将生成式 AI 纳入高风险技术管理范畴，对其训练数据、风险评估、用户告知等提出了强制性的合规要求。</p>
<p>在我国，国家网信办、科技部、工业和信息化等部门也于 2023 年联合颁布了《生成式人工智能服务管理暂行办法》，明确说明所有面向公众提供的生成式 AI 服务（如大语言模型）必须备案，并且强调生成内容不得含有颠覆国家政权、暴力恐怖、色情、虚假信息等。模型应进行安全评估，确保内容生成可控、可追溯。强调了用户隐私保护，不得非法收集用户信息。</p>
<p>同时，国家互联网信息办公室（网信办）也要求算法推荐服务提供者（包括大模型）需在备案系统中报备算法信息，包括算法用途、核心逻辑、数据来源、人工干预机制、安全防护措施等。</p>
<p>所以大模型平台方（包含使用大模型作为应用的企业）往往会陷入两难：一方面希望释放模型的创造力，提升智能的体验；另一方面又不得不加重安全限制，防止法律或舆情风险。这种博弈催生出了一种新的治安逻辑，<strong>就是允许模型在自由生成与强化内容安全之间找到一种“可调的平衡带”</strong>。想要实现这一点，既需要技术手段的支撑，也离不开制度设计和运营机制的配合。</p>
<h2>4. 大模型安全为什么是系统性工程？</h2>
<p>在此背景下，<strong>大模型安全不再是一个单纯的技术性话题，而是融合技术伦理、社会信任、政策制定、法律治理在内的系统性工程，开发者需要对模型输出结果的边界承担更明确的责任。</strong></p>
<p>比如，在我们的日常生活中，手机端安装的豆包、MiniMax、紫东太初、阶跃 AI 等大模型 App，这些应用与我们进行交互时的高度语音仿真能力，使它们在用户体验上获得极大的好评，这种“像人一样说话”的能力本身也放大了风险。用户往往容易将模型的回答视为“权威”，甚至对大模型的输出形成了认知依赖。一旦模型生成的信息带有误导性、偏见或者道德瑕疵，所造成的社会影响，往往难以通过传统内容审核机制来及时干预。</p>
<p>安全问题在这一层面上，已经从“生成什么”延伸到了“用户怎么理解、平台如何兜底”的范畴——DeepSeek 中的 [深度思考] 就是旨在增强模型的推理能力，提升对复杂问题的理解和处理，从而提高模型的安全性。其它模型，如 Qwen 也在积极探索多轮对话中的语义一致性与响应控制策略，只是路径不同。</p>
<p>所谓安全，并不是简单地增加几个过滤器或添加几条规则就能实现，是需要模型本体在认知结构上朝向“可对齐、可解释、可反思”的方向持续发展。因此，大模型的安全问题，最终不是“它还能不能说”，而是要问“我们愿不愿意让它代表谁来说”，任何一个负责任的技术开发者和使用者，都不应只是旁观者。大模型的时代已经到来，但大模型安全的时代是否同步抵达，还要靠我们每一个参与者共同争取。</p>
<h2>5. 模型风险：不止越狱，还有人格扭曲与数据泄露</h2>
<p>如果说我们已经知道了为什么需要大模型安全，那么接下来的问题就是，到底存在哪些具体的安全风险？接下来，我想带你初步了解一套风险识别的分类体系，这能帮你在后续设计或使用大模型产品过程中，有针对性地防范问题。</p>
<p>从目前主流模型实践来看，大模型的安全风险可以分为三类。</p>
<p>第一类是<strong>提示注入风险（Prompt Injection）</strong>，这类攻击本质是“对话劫持”。攻击者通过构造特殊输入，让模型忽略原有系统指令、绕开安全限制。例如 ChatGPT 早期被绕过提示限制，进入 DAN 模式、输出违法内容，本质就是 Prompt 注入绕过了默认行为准则。</p>
<p>第二类是<strong>输出操控</strong>或<strong>人格扭曲风险</strong>，例如 Gemini 在与用户探讨养老议题时，突然输出极端攻击性语言，其背后原因通常是训练语料中包含了非结构化攻击表达，或缺乏情绪控制策略。模型在多轮对话中逐渐形成偏执倾向，容易被误导到激进立场。</p>
<p>第三类是<strong>数据反泄露与训练污染风险</strong>。有研究发现部分开源模型能在特定输入下“背出”训练语料中的原始手机号或地址信息；也有攻击者在模型公开接口中注入含有特定信息的内容片段，通过长期“投喂”，污染其行为偏好，造成“数据投毒”。</p>
<p>当然，还有更多高级风险，比如通过对抗样本绕开输出检测（模糊敏感词）、人格多重引导（人格越狱）以及输出可信度失衡（事实幻觉），但这些都可以归类到上述三大框架内进行理解和设计防护。</p>
<h2>6. 从输入到输出：如何构建安全闭环机制</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/72/723f1f564fd186d7eba8a783182a78af554e62c5a0cb5fd87e01035ce0a65c2a.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>为了更系统地理解大模型的安全问题，我们可以将其拆解为三个关键环节：输入端、处理中间层、输出端。这也是目前大多数大模型产品在安全设计上所采用的工作流式防御结构。</p>
<p>在输入层，主要面临<strong>用户提示（Prompt）</strong>内容的控制问题，需要进行关键词过滤、提示注入防御、用户身份校验等处理，以避免模型从源头被恶意引导。输入安全是整条防线的第一关口。</p>
<p>在中间层，大模型通常会触发一系列推理流程和外部调用（例如插件、函数调用、RAG 索引等），此阶段的安全控制重点在于上下文隔离、权限设定、调用链审计与数据访问边界的划定，防止模型被绕过原有设定执行不受控操作。</p>
<p>在输出层，模型生成内容后需要通过一套后处理逻辑进行输出审查，识别是否含有敏感词、虚假信息、极端情绪、违法描述等风险内容。有些系统还会在内容中嵌入可追踪的水印或可信标记，以方便后续回溯。</p>
<p>通过“输入 - 中间 - 输出”三段式机制，可以形成一个完整的安全闭环，从而更系统、更稳定地对抗模型失控、被利用或误伤用户的问题。</p>
<h2>7. 课程总结</h2>
<p>这节课中，我们从近年来真实的大模型安全事件出发，探讨了当前大模型所面临的关键风险点，包括越狱攻击、误导生成、情绪偏差等问题，并从“输入 - 处理 - 输出”的工作流角度，理解安全机制应该如何构建。</p>
<p>此外，我还为你介绍了国内外监管对安全合规的要求，相信你现在已经掌握了大模型安全的整体轮廓，也意识到了它不仅是技术话题，更关乎产品可用性、用户信任与社会责任。</p>
<p>随着 AI 的发展，大模型安全建设也会变得越来越重要。对于企业来说，大模型安全关乎品牌形象，影响合规成本、备案效率。对于我们个人来说，对“安全与合规”建立清晰理解，也逐渐成为从事 AI 相关岗位的关键能力。</p>
<p>通过这节课，我们初步建立起了对大模型安全的整体认知框架，也为后续的深入学习开了一个好头。下节课，我们将进一步走进大语言模型的“内核”，理解它是如何工作、如何生成内容的，从而更深入地看清安全问题背后的技术根源，敬请期待。</p>
<h2>8. 思考题</h2>
<ol>
<li>你是否在使用大模型产品时遇到过“输出让你不舒服”的情况？那是怎么发生的？你觉得如何改进？</li>
<li>如果让你作为产品设计者，为一个 AI 问答助手设计“输出安全机制”，你最先会考虑什么？</li>
<li>DAN 越狱、Gemini 情绪攻击这类事件，是否可能出现在国内模型身上？为什么？</li>
</ol>
<p>理解大模型安全的重要性，是安全建设的第一步。下节课，我们将深入理解模型运行的底层机制，掌握风险的来源与规避。期待你在留言区和我交流互动，如果今天的课程对你有帮助，也欢迎你转发给更多朋友，加入我们的 AI 安全共识学习圈。我们下一节课见！</p>

<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-27T10:23:24.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">00-01-课前热身｜10道题帮你测试 AI “安全分”</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P12-llm-security-hands-on-course/00-1-keqian-reshen-10-ti-ce-shi-ai-anquan-fen.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P12-llm-security-hands-on-course/00-1-keqian-reshen-10-ti-ce-shi-ai-anquan-fen.html"/>
    <updated>2026-08-16T15:12:02.368Z</updated>
    <summary type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/12/1291c5e258ac658dceb7a495add7f0131440437de1a51ff30fb2be3adf61d9e8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>在开篇词我曾提到，大模型安全不是一个“<strong>选修课</strong>”，而是行业落地绕不开的必答题。那么在正式开始课程之前，我们不妨来简单测试一下你的 AI 产品 / 服务的“安全分”是多少。</p>]]></summary>
    <content type="html"><![CDATA[<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/12/1291c5e258ac658dceb7a495add7f0131440437de1a51ff30fb2be3adf61d9e8.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>你好，我是悦创。</p>
<p>在开篇词我曾提到，大模型安全不是一个“<strong>选修课</strong>”，而是行业落地绕不开的必答题。那么在正式开始课程之前，我们不妨来简单测试一下你的 AI 产品 / 服务的“安全分”是多少。</p>
<p>我准备了十道题目，你可以记录一下每道题的选项，再结合最后的计分规则看看得了多少分。</p>
<h2>Question 1</h2>
<p><strong>第一题：你的企业正在准备将大模型部署到智能客服系统中，与用户进行直接交互。你希望对用户输入的提示内容做安全防护以避免触发模型违规响应。在提示词过滤机制上，你们的设计更接近哪种方式？</strong></p>
<p>A. 模型内置关键词过滤系统，敏感词库通过人工定期维护，并可结合上下文关系做一定程度的模糊匹配。</p>
<p>B. 使用语义理解模型识别提示意图，覆盖多类变体表达，过滤规则较为通用，适配不同业务场景。</p>
<p>C. 构建了多层级提示词过滤机制，融合关键词、语义匹配与上下文语境分析，具备实时自更新能力。</p>
<p>D. 主要采用关键词过滤与规则模板判断，过滤范围明确，覆盖典型高风险场景，配置稳定性较强。</p>
<h2>Question 2</h2>
<p><strong>第二题：你们团队准备将大模型用于生成财务、人事、合规等敏感场景的文案。面对这些高风险任务，你们系统中的防护设计更接近哪种方式？</strong></p>
<p>A. 系统通过接口识别当前业务类型，动态加载相关风控策略和输出模板。</p>
<p>B. 针对这些话题配置了统一的回答模板，避免生成自由扩展内容。</p>
<p>C. 模型在响应前对内容做规则评估，不区分业务语境，采用同一套输出规则。</p>
<p>D. 默认允许模型生成完整答案，只在出现指定关键词时触发屏蔽逻辑。</p>
<h2>Question 3</h2>
<p><strong>第三题：你注意到最近模型偶尔会出现短时间内的响应异常，比如延迟、崩溃或输出中断。你认为以下哪种做法最有助于识别并防范 Prompt DoS（提示词拒绝服务）攻击？</strong></p>
<p>A. 我们建立了提示词行为画像，监控嵌套结构、提问频率与上下文突变，以识别可疑请求。</p>
<p>B. 我们设置了接口调用速率和响应时间阈值，只要超出即中断处理流程。</p>
<p>C. 我们使用关键词白名单与模型温度限制来降低生成不确定性，减少系统负载</p>
<p>D. 我们通过日志分析定位异常会话，对可疑账号追加冷却时间，并同时优化硬件配置提升稳定性。</p>
<h2>Question 4</h2>
<p><strong>第四题：你的团队希望模型具备一定的“越狱防护”能力，以避免用户通过提示词诱导模型输出本不该说的内容。以下哪种做法最具实效性，能主动识别此类绕过行为？</strong></p>
<p>A. 引入关键词联动审查机制，并设置风险等级，超过阈值触发人工审核。</p>
<p>B. 通过正则表达式识别提示中是否包含绕过或角色扮演的暗示意图。</p>
<p>C. 使用多模态语义匹配 + 上下文语义一致性分析，识别提示是否试图“扮演第三方”以实现越权目标。</p>
<p>D. 在模型输出前强制追加“请勿违规输出”的系统提示词，以提醒模型保持中立和规范。</p>
<h2>Question 5</h2>
<p><strong>第五题：你的模型已经正式上线，公司要求对用户行为与模型响应过程保留审计日志，以便后续进行问题追踪与安全溯源。以下哪种做法最符合“可审计性”和“合规溯源”的安全要求？</strong></p>
<p>A. 对用户输入提示词进行存档，但不记录模型响应内容，以节省存储。</p>
<p>B. 保留用户请求日志和部分模型响应片段，重要事件由人工截图存证。</p>
<p>C. 仅对高风险场景（如涉政、涉黄）记录日志，其余请求不做记录以保护隐私。</p>
<p>D. 对全部请求与响应进行结构化归档，并可结合时间戳、用户 ID 快速检索回溯。</p>
<h2>Question 6</h2>
<p><strong>第六题：你们的团队发现，当前大模型在处理一些行业术语和专业逻辑时，偶尔会生成编造的数据或张冠李戴的事实（即“幻觉”）。你希望建立一套机制来降低这类问题的风险。以下哪种做法在现阶段更具有实操性与安全防控效能？</strong></p>
<p>A. 依赖用户反馈标记错误样例，并定期通过精调来修复模型行为。</p>
<p>B. 在模型输出阶段，加入基于规则与置信度阈值的内容过滤与二次确认机制。</p>
<p>C. 提前在预训练语料中加入更多真实资料，让模型“记牢”正确内容。</p>
<p>D. 允许模型输出自由生成内容，但在显著场景下添加免责声明即可规避风险。</p>
<h2>Question 7</h2>
<p><strong>第七题：你的团队负责上线后大语言模型的安全运营，现在已发布多个版本。在面对策略调整与模型更新时，哪种管理方式最能体现“动态安全能力”的理念？</strong></p>
<p>A. 我们每个版本都配置有默认规则集，并允许业务团队进行参数微调来适配使用场景。</p>
<p>B. 目前团队稳定运行已有三个月，尚未遇到安全问题，因此暂未开启更新机制。</p>
<p>C. 每次迭代发布前，工程团队会参考历史数据回顾，必要时调整部分提示语与响应策略。</p>
<p>D. 模型版本发布流程中，默认嵌入安全策略回归、行为验证与审计流程，确保每次更新后的策略一致性与鲁棒性。</p>
<h2>Question 8</h2>
<p><strong>第八题：你所在的团队计划将大模型用于客户支持系统，模型将直接与外部用户交互。考虑到潜在的品牌舆情风险（如谈及竞品、公众人物等），你们主要采取哪类防控手段？</strong></p>
<p>A. 设计了一套用于敏感话题绕开的通用回答模版，尽可能避免争议话题。</p>
<p>B. 将用户输入与模型输出同时纳入语义风险识别，构建品牌词和敏感对象的动态响应策略。</p>
<p>C. 设置品牌领域的专业问答数据微调模型，以确保内容更聚焦且符合品牌立场。</p>
<p>D. 结合提示词限制、用户画像分析和多轮对话上下文，制定适配的内容生成边界策略。</p>
<h2>Question 9</h2>
<p>第九题：你的团队计划将大模型集成进智能问答平台，面向终端用户提供法律、财税等咨询服务。考虑到“答案可信度”和“可解释性”的重要性，你们目前在输出解释性方面采取了什么措施？</p>
<p>A. 模型输出后附带参考内容的来源链接与生成理由摘要。</p>
<p>B. 为所有高风险内容附加预警标识，并通过用户交互获取反馈。</p>
<p>C. 利用训练数据的来源信息构建文档索引供后台追溯，但前端不显示。</p>
<p>D. 将提示词与输出记录全部留档，便于内部内容溯源与后期优化。</p>
<h2>Question 10</h2>
<p><strong>第十题：你所在的企业已经上线了一个大模型问答平台，服务于客服、法务、财务等多个敏感业务场景。为确保系统在面对攻击性提示词、恶意上下文操控等威胁时的稳健性，你们目前采取了什么方式来开展安全评估？</strong></p>
<p>A. 日常运营中由产品团队定期进行功能测试，发现问题后及时修复。</p>
<p>B. 建立了一套 QA 用例库，主要覆盖正常业务流程与基本异常场景。</p>
<p>C. 与业务部门协同开展用户测试，但未涉及提示词操控或越狱演练。</p>
<p>D. 定期组织红队对抗演练，并引入第三方安全机构进行外部评估。</p>
<h2>答案计分参照表</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/70/70149cf7185f07a25a62153bf66c0a943ab272ffe29cf425ff9efd1fd4ef8b6f.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h2>总得分评估结果</h2>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/65/6528bab184698fc5e502935ba87a8ec463f3bc175769231f018207d043c0961e.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/36/36b401b239bda44856663ead37aac4a2032ff3676c17fc37181bf6a7c9da7d48.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c1/c1b6de81c43dceccdecc379b946e4cd845799183963f25e3a2d167cee45e9089.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/7b/7b5af8bdb3d37587f6b7644fa1d27a175dc2de75a5a720721a50cf3d1ba0cf54.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>这十道热身题，不是为了考核你，而是帮助你发现盲点。如果你愿意，我们接下来的课程将逐一解答这些问题，并带你完成一场从感知、识别到体系建设的安全进阶之旅。</p>

<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-27T08:01:31.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">18-梅花小酥肉</title>
    <id>https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/18-%E6%A2%85%E8%8A%B1%E5%B0%8F%E9%85%A5%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/18-%E6%A2%85%E8%8A%B1%E5%B0%8F%E9%85%A5%E8%82%89.html"/>
    <updated>2026-08-16T15:12:02.370Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-26T09:26:13.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">11-红枣南瓜糯米粥</title>
    <id>https://bornforthis.cn/column/cookdinner/P05-%E9%A5%AD%E7%B1%BB%E4%B8%BB%E9%A3%9F%E9%9D%A2%E7%82%B9/11-%E7%BA%A2%E6%9E%A3%E5%8D%97%E7%93%9C%E7%B3%AF%E7%B1%B3%E7%B2%A5.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P05-%E9%A5%AD%E7%B1%BB%E4%B8%BB%E9%A3%9F%E9%9D%A2%E7%82%B9/11-%E7%BA%A2%E6%9E%A3%E5%8D%97%E7%93%9C%E7%B3%AF%E7%B1%B3%E7%B2%A5.html"/>
    <updated>2026-08-16T15:12:02.370Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>贝贝南瓜</th>
<th>糯米</th>
<th>红枣</th>
</tr>
</thead>
</table>
<h2>2. 步骤</h2>
<ol>
<li>淘洗糯米，开启电饭锅煮粥的选项；</li>
<li>南瓜切小块；</li>
<li>糯米煮到一半时，下入：红枣、南瓜；</li>
</ol>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 贝贝南瓜 | 糯米 | 红枣 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-26T07:38:09.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">梅花肉炒扁豆丝</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/11-%E6%A2%85%E8%8A%B1%E8%82%89%E7%82%92%E6%89%81%E8%B1%86.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/11-%E6%A2%85%E8%8A%B1%E8%82%89%E7%82%92%E6%89%81%E8%B1%86.html"/>
    <updated>2026-08-16T15:12:02.371Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>梅花肉</th>
<th>扁豆</th>
<th>盐</th>
<th>大蒜</th>
<th>生姜</th>
<th>大葱</th>
<th>生抽</th>
<th>鸡精</th>
<th>白胡椒粉</th>
<th>白糖</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>花雕酒</strong></td>
<td><strong>开水</strong></td>
<td><strong>蚝油</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 梅花肉     | 扁豆     | 盐       | 大蒜 | 生姜 | 大葱 | 生抽 | 鸡精 | 白胡椒粉 | 白糖 |
|</p>
]]></content>
    <author>
      <name>黄家宝</name>
    </author>
    <contributor>
      <name>黄家宝</name>
    </contributor>
    <published>2025-11-22T19:51:15.000Z</published>
    <rights>Copyright by 黄家宝</rights>
  </entry>
  <entry>
    <title type="text">10-菜椒鱿鱼</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/10-%E8%8F%9C%E6%A4%92%E9%B1%BF%E9%B1%BC.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/10-%E8%8F%9C%E6%A4%92%E9%B1%BF%E9%B1%BC.html"/>
    <updated>2026-08-16T15:12:02.371Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>鱿鱼</th>
<th>菜椒</th>
<th>红菜椒</th>
<th>小米辣</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>洋葱</strong></td>
<td><strong>花雕酒</strong></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2>2. 步骤</h2>
<ol>
<li><strong>鱿鱼</strong>：
<ol>
<li>交叉斜刀切；</li>
<li>锅中加水、花雕酒；</li>
<li>水开后加入鱿鱼；</li>
<li>鱿鱼卷起就捞出；</li>
</ol>
</li>
<li><strong>切配菜</strong>：菜椒切块、洋葱切块、小米辣切圈；</li>
<li><strong>炒制</strong>：
<ol>
<li>油热，下入：配菜，炒至断生；</li>
<li>倒入鱿鱼；（可以淋锅边花雕酒）</li>
<li><strong>调味</strong>：少许盐、1 勺生抽、蚝油；</li>
<li>最大火翻炒出锅；</li>
</ol>
</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 鱿鱼     | 菜椒       | 红菜椒 | 小米辣 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-21T18:15:38.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">11-叉烧肉</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/01-%E7%BA%A2%E7%83%A7%E7%B1%BB/10-%E5%8F%89%E7%83%A7%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/01-%E7%BA%A2%E7%83%A7%E7%B1%BB/10-%E5%8F%89%E7%83%A7%E8%82%89.html"/>
    <updated>2026-08-16T15:12:02.372Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>详情</summary>
<p>主料:梅肉（猪肩肉）</p>
<p>辅料：干葱、姜、蒜、香葱、香菜、生菜</p>
<p>调料：花雕酒、老抽、盐、鸡粉、白糖、红腐乳、蚝油、沙姜粉、五香粉、生抽、蜂蜜、</p>
<p>切配：梅肉切1cm后片，用刀背捶打表面，再用清水洗净。</p>
<p>做法：</p>
<p>1、调制腌料：干葱、姜、蒜、香葱、香菜拍碎备用，花雕酒、老抽、盐、鸡粉、白糖、红腐乳、蚝油、沙姜粉、五香粉、生抽一起搅拌</p>
<p>均匀，后加入备好的食材和梅肉拌匀后封上保鲜膜放冰箱冷藏1小时。
2、腌制好后放入电饭煲中煲60分钟，后改刀成条。</p>
<p>3、最后装盘，淋上蜂蜜即可。</p>
</details>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-18T22:30:16.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">01-为什么要用花雕酒</title>
    <id>https://bornforthis.cn/column/cookdinner/P13-%E5%BF%83%E5%BE%97/01-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8%E8%8A%B1%E9%9B%95%E9%85%92.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P13-%E5%BF%83%E5%BE%97/01-%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8%E8%8A%B1%E9%9B%95%E9%85%92.html"/>
    <updated>2026-08-16T15:12:02.374Z</updated>
    <summary type="html"><![CDATA[<p>料酒是厨房去腥增香的常用调味品，但选择哪一种，却直接影响菜肴的最终风味。市面上不少料酒实为香辛料与劣质黄酒的勾兑产物，用于炒菜、拌馅或酱肉时，不仅难以去除腥气，有时甚至会带来酸涩等异味。</p>
<p>相比之下，花雕酒则是数千年黄酒文化的沉淀。它本是饮用之物，如著名的女儿红、状元红皆属此类。花雕酒遵循古法，选用粮食与鉴湖水，仅在冬季酿造一茬，酒香醇厚。入菜后能真正达到去腥增香的效果，且不留杂味。</p>
<p>作为一名业余“厨师”，我亲历了从使用大坛黄酒到专注于花雕酒的过程。尤其在粤菜烹饪中，花雕酒因其独特的焦糖香气备受青睐。</p>
<p>选择花雕酒亦有讲究。</p>
<p>我家常备的是一款五年陈酿，香气饱满，既可入菜，也可温热饮用，冬日小酌还有暖胃之效。一酒两用，既提升了菜肴层次，也增添了一份生活意趣。将普通料酒升级为花雕酒，无疑是提升烹饪水平的一个简单而有效的选择。</p>]]></summary>
    <content type="html"><![CDATA[<p>料酒是厨房去腥增香的常用调味品，但选择哪一种，却直接影响菜肴的最终风味。市面上不少料酒实为香辛料与劣质黄酒的勾兑产物，用于炒菜、拌馅或酱肉时，不仅难以去除腥气，有时甚至会带来酸涩等异味。</p>
<p>相比之下，花雕酒则是数千年黄酒文化的沉淀。它本是饮用之物，如著名的女儿红、状元红皆属此类。花雕酒遵循古法，选用粮食与鉴湖水，仅在冬季酿造一茬，酒香醇厚。入菜后能真正达到去腥增香的效果，且不留杂味。</p>
<p>作为一名业余“厨师”，我亲历了从使用大坛黄酒到专注于花雕酒的过程。尤其在粤菜烹饪中，花雕酒因其独特的焦糖香气备受青睐。</p>
<p>选择花雕酒亦有讲究。</p>
<p>我家常备的是一款五年陈酿，香气饱满，既可入菜，也可温热饮用，冬日小酌还有暖胃之效。一酒两用，既提升了菜肴层次，也增添了一份生活意趣。将普通料酒升级为花雕酒，无疑是提升烹饪水平的一个简单而有效的选择。</p>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-18T21:53:00.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">edube python/C++ Exam 代考</title>
    <id>https://bornforthis.cn/blog/2025/11month/edube-python-Exam.html</id>
    <link href="https://bornforthis.cn/blog/2025/11month/edube-python-Exam.html"/>
    <updated>2026-08-16T15:12:02.374Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>需要代考直接联系我即可！微信：Jiabcdefh。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cc/ccf21da2f35c4d11f6d8e47fe0541909be580a0f1959ecff7e117e1d3642e716.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bc/bc8777d121a2572f1bce2f9797f8c8aa9316fe171c184ad457a08f179345883e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>需要代考直接联系我即可！微信：Jiabcdefh。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/cc/ccf21da2f35c4d11f6d8e47fe0541909be580a0f1959ecff7e117e1d3642e716.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/bc/bc8777d121a2572f1bce2f9797f8c8aa9316fe171c184ad457a08f179345883e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><code>![](./edube-python-Exam.assets/image-20251117123515637.png)</code></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5a/5abd9089d169a697fbe0ed7137b88572386f258db96789b63ab854cbfac5cd41.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a8/a80cdff14707408a020ea27a1835ad8a23e20dd396023ed11d6ff3843b96c0be.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/17/17b78892b149d0fb69fd0276d60f29bb1f213c2bc2c5f3f9ed46d0145a786819.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/a3/a3fc88d80c313a0a83bf49bd063b5d7302c8f6ae4cc21b67742c912093fc3874.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>感受：其实有钱的人，啥证书都可以花钱购买，如果不能，那就是钱不够多哈哈哈哈。——2025 年 11 月 17 日</p>
<p>幸好找的是我，我有三个屏幕，不然还真不好拿下。</p>
<p><code>![](./edube-python-Exam.assets/image-20251117165612040.png)</code></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/89/890f6a7523fa6486e03dbad5964c4ffab79f9f16794c77caac6c0319e321f70c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p><code>![](./edube-python-Exam.assets/image-20251117165652542.png)</code></p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/aa/aa2da2a7d08e7e69dfda5b55c76b0254449a619b9683467d562bafa29ac79a2c.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/d0/d032e0424aa929a08d1726bc0d4fe73d4c3b75e41469c6d26a8f625dc9696625.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c5/c5784565be5b25aa881dc00ed1ad63121b672c7bd1993c719ba0c4ee9b5cc7c3.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/3f/3f3e15d78fc56b686771654f15a2c26657b6ad7d7dab2c61a8c1ac4cfc825aaf.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/21/21f7fab094015faeaf138cce60a0bef06a43535cb2723fba15d633a681c40faf.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/c6/c6c3cafab80ca73f5b94713ce2f2c532c74ea2459af811550267411be2e0ceab.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-15T21:29:41.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">03-牛肉干</title>
    <id>https://bornforthis.cn/column/cookdinner/P12-%E7%89%9B%E8%82%89%E7%B1%BB/03-%E7%89%9B%E8%82%89%E5%B9%B2.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P12-%E7%89%9B%E8%82%89%E7%B1%BB/03-%E7%89%9B%E8%82%89%E5%B9%B2.html"/>
    <updated>2026-08-16T15:12:02.375Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>村驴</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2d/2d490997e7db18709b04caa62ef5331f4dc4b65685c170bb25660b534e985e2e.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-14T15:51:34.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">12-青椒肉丝</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/12-%E9%9D%92%E6%A4%92%E8%82%89%E4%B8%9D.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/12-%E9%9D%92%E6%A4%92%E8%82%89%E4%B8%9D.html"/>
    <updated>2026-08-16T15:12:02.376Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-08T21:30:11.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">11-香菇滑鸡</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/11-%E9%A6%99%E8%8F%87%E6%BB%91%E9%B8%A1.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/11-%E9%A6%99%E8%8F%87%E6%BB%91%E9%B8%A1.html"/>
    <updated>2026-08-16T15:12:02.377Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-08T21:25:10.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">10-鱼香肉丝</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/10-%E9%B1%BC%E9%A6%99%E8%82%89%E4%B8%9D.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/10-%E9%B1%BC%E9%A6%99%E8%82%89%E4%B8%9D.html"/>
    <updated>2026-08-16T15:12:02.377Z</updated>
    <summary type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-08T21:24:23.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">09-辣椒包蛋</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/09-%E8%BE%A3%E6%A4%92%E5%8C%85%E8%9B%8B.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/09-%E8%BE%A3%E6%A4%92%E5%8C%85%E8%9B%8B.html"/>
    <updated>2026-08-16T15:12:02.378Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<p>|螺丝椒|鸡蛋||</p>
<h2>2. 步骤</h2>
<ol>
<li>
<p>螺丝椒切成一段段小圈；</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/1b/1be02ba7c46e3f17a5385a2c815e2941c217f3cfc1a22f14b8648584c8711c9a.png" style="zoom:25%;">
</details>
</li>
<li>
<p>准备鸡蛋液：盐、白胡椒粉、香油、面粉；</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/4b/4b1f08a332a218edbeadd3ce65742efe9b09b32969276bf33b62731161b88f5e.png" style="zoom:25%;">
</details>
</li>
<li>
<p>半煎半炒：锅中油适量，因为后面要加入鸡蛋液。把螺丝椒段开口都朝上：</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/36/36dd8ce3264d10471f9fb3891d47ccc7fe4c673080bd4cf979af17c56dd41a2e.png" style="zoom:25%;">
</details>
</li>
<li>
<p>淋入鸡蛋液：</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/6a/6a9462dcae824cc58b2b91e501470053493453f78453f9a0ded3795dcb8de992.png" style="zoom:25%;">
</details>
</li>
<li>
<p>煎制的时候，顶部再喷些油，准备封面煎制、翻炒；</p>
</li>
<li></li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>|螺丝椒|鸡蛋||</p>
<h2>2. 步骤</h2>
<ol>
<li>
<p>螺丝椒切成一段段小圈；</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/1b/1be02ba7c46e3f17a5385a2c815e2941c217f3cfc1a22f14b8648584c8711c9a.png" style="zoom:25%;">
</details>
</li>
<li>
<p>准备鸡蛋液：盐、白胡椒粉、香油、面粉；</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/4b/4b1f08a332a218edbeadd3ce65742efe9b09b32969276bf33b62731161b88f5e.png" style="zoom:25%;">
</details>
</li>
<li>
<p>半煎半炒：锅中油适量，因为后面要加入鸡蛋液。把螺丝椒段开口都朝上：</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/36/36dd8ce3264d10471f9fb3891d47ccc7fe4c673080bd4cf979af17c56dd41a2e.png" style="zoom:25%;">
</details>
</li>
<li>
<p>淋入鸡蛋液：</p>
<details class="hint-container details"><summary>详情</summary>
<img src="https://blog.images.bornforthis.cn/docs-images/sha256/6a/6a9462dcae824cc58b2b91e501470053493453f78453f9a0ded3795dcb8de992.png" style="zoom:25%;">
</details>
</li>
<li>
<p>煎制的时候，顶部再喷些油，准备封面煎制、翻炒；</p>
</li>
<li></li>
</ol>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-05T21:58:25.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">时间复杂度的讲解及总结</title>
    <id>https://bornforthis.cn/1v1/101-Sallymisty/Exam/time-complexity-python-examples.html</id>
    <link href="https://bornforthis.cn/1v1/101-Sallymisty/Exam/time-complexity-python-examples.html"/>
    <updated>2026-08-16T15:12:02.378Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>时间复杂度是衡量一个算法执行效率的重要指标，它表示随着输入数据规模的增加，算法执行时间增长的速度。时间复杂度通常以大 O 记法表示，关注最坏情况的时间增长趋势。</p>
<p>以下是常见的时间复杂度类型及其对应的 Python 代码示例，涵盖了常见的操作和算法，帮助你更好地理解每种时间复杂度。</p>
<h2>1. 时间复杂度的讲解</h2>
<h3>1.1 O(1) - 常数时间复杂度</h3>
<p>常数时间复杂度意味着无论输入数据的规模多大，算法的执行时间都不会改变。</p>
<p><strong>示例</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> constant_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</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"> arr[</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"># 只访问了第一个元素，时间复杂度是 O(1)</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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">constant_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr))</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>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>时间复杂度是衡量一个算法执行效率的重要指标，它表示随着输入数据规模的增加，算法执行时间增长的速度。时间复杂度通常以大 O 记法表示，关注最坏情况的时间增长趋势。</p>
<p>以下是常见的时间复杂度类型及其对应的 Python 代码示例，涵盖了常见的操作和算法，帮助你更好地理解每种时间复杂度。</p>
<h2>1. 时间复杂度的讲解</h2>
<h3>1.1 O(1) - 常数时间复杂度</h3>
<p>常数时间复杂度意味着无论输入数据的规模多大，算法的执行时间都不会改变。</p>
<p><strong>示例</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> constant_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</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"> arr[</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"># 只访问了第一个元素，时间复杂度是 O(1)</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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">constant_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr))</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><p><strong>时间复杂度分析</strong>：该算法访问数组的第一个元素，操作次数不随数组大小变化，因此时间复杂度为 <strong>O(1)</strong>。</p>
<h3>1.2 O(n) - 线性时间复杂度</h3>
<p>线性时间复杂度意味着算法的执行时间随着输入数据规模的增加而线性增长。</p>
<p><strong>示例</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> linear_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    total </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> num </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr:  </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">        total </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> num</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> total</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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">linear_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr))</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><strong>时间复杂度分析</strong>：算法需要遍历数组的每个元素，因此执行次数与数组的大小 <strong>n</strong> 成正比，时间复杂度为 <strong>O(n)</strong>。</p>
<h3>1.3 <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> - 平方时间复杂度</h3>
<p>平方时间复杂度通常出现在嵌套循环中，意味着算法的执行时间随着数据规模的增加呈平方增长。</p>
<p><strong>示例</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> quadratic_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</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"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr)):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr)):</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">            print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr[i], arr[j])  </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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">quadratic_time_example</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr)</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>：该算法包含两个嵌套的循环，每个循环都执行 <strong>n</strong> 次，因此时间复杂度为 <strong><span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></strong>。</p>
<h3>1.4 O(log n) - 对数时间复杂度</h3>
<p>对数时间复杂度通常出现在递归算法中，例如二分查找。它表示算法的执行时间随数据规模的增加呈对数增长。</p>
<p><strong>示例</strong>：</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="python" style="--vp-collapsed-lines:15;--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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> binary_search</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> target</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    left, right </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> left </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> right:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (left </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> right) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 2</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr[mid] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> target:</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>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        elif</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr[mid] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> target:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            left </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><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">            right </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> mid </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> -</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">5</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">7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">9</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">target </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 5</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">binary_search</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr, target))</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><div class="collapsed-lines"></div></div><p><strong>时间复杂度分析</strong>：每次查找都将问题规模减半，因此时间复杂度为 <strong>O(log n)</strong>。</p>
<h3>1.5 O(n log n) - 线性对数时间复杂度</h3>
<p>常见的 <strong>O(n log n)</strong> 时间复杂度出现在高效的排序算法中，例如归并排序、快速排序等。</p>
<p><strong>示例（快速排序）</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> quick_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</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:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</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"> arr</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    pivot </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr[</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</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 style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    left </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pivot]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    middle </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pivot]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    right </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> arr </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> x </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> pivot]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> quick_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(left) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> middle </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> quick_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(right)</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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> [</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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">8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</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:#986801;--shiki-dark:#D19A66">2</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:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">quick_sort</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr))</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></div><p><strong>时间复杂度分析</strong>：快速排序的时间复杂度是 <strong>O(n log n)</strong>，因为每次分割数组为两部分，然后对每部分递归排序，分割的过程是 <strong>O(log n)</strong>，每次分割需要处理 <strong>n</strong> 个元素。</p>
<h3>1.6 <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mn>2</mn><mi>n</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(2^n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> - 指数时间复杂度</h3>
<p>指数时间复杂度通常出现在递归算法中，意味着算法的执行时间随着输入数据规模的增加呈指数增长。</p>
<p><strong>示例（斐波那契数列）</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> fibonacci</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">n</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"> n </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</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"> n</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> fibonacci</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> fibonacci</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</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:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># 示例</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">fibonacci</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></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><strong>时间复杂度分析</strong>：斐波那契数列的递归算法的时间复杂度为 <strong><span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><msup><mn>2</mn><mi>n</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(2^n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></strong>，因为每个递归调用会生成两个子问题，递归树的大小以指数方式增长。</p>
<h3>1.7 <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">!</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n!)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">!)</span></span></span></span> - 阶乘时间复杂度</h3>
<p>阶乘时间复杂度常出现在排列组合相关问题中，如暴力破解的排列问题。</p>
<p><strong>示例（全排列）</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> itertools</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> generate_permutations</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">arr</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:#0184BC;--shiki-dark:#56B6C2"> list</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(itertools.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">permutations</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr))</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:#383A42;--shiki-dark:#ABB2BF">arr </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">, </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">generate_permutations</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(arr))</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>：全排列的数量是 <strong>n!</strong>，即输入数据的所有可能排列组合，因此时间复杂度为 <strong>O(n!)</strong>。</p>
<h3>1.8 总结</h3>
<p>| 时间复杂度类型 | 示例               | 时间复杂度分析                                         |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-04T07:31:26.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">香港科技大学 Python 期中考试卷</title>
    <id>https://bornforthis.cn/1v1/100-Leo/midterm-exam.html</id>
    <link href="https://bornforthis.cn/1v1/100-Leo/midterm-exam.html"/>
    <updated>2026-08-16T15:12:02.419Z</updated>
    <summary type="html"><![CDATA[<h2>1. Problem 1 [10 points] True/False Questions</h2>
<p>Indicate whether the following statements are true or false by putting <strong>T or F</strong> in the given table in the answer book. You get 1 point for each correct answer.</p>
<p>(a) <code>int</code> and <code>float</code> objects are <strong>mutable</strong>, meaning their contents can be updated.</p>]]></summary>
    <content type="html"><![CDATA[<h2>1. Problem 1 [10 points] True/False Questions</h2>
<p>Indicate whether the following statements are true or false by putting <strong>T or F</strong> in the given table in the answer book. You get 1 point for each correct answer.</p>
<p>(a) <code>int</code> and <code>float</code> objects are <strong>mutable</strong>, meaning their contents can be updated.</p>
<p>(b) The output of the following program is <strong>1023</strong>.</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> main</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">() -> </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">None</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    a: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    b: </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">int</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 23</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    a, b </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> b, a</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(a, b, </span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">sep</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">""</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:#E45649;--shiki-dark:#E06C75"> __name__</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> ==</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:#61AFEF">    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></div><details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-11-01T20:30:07.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">09-菜椒炒肉「不辣」</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/08-%E8%8F%9C%E6%A4%92%E7%82%92%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/08-%E8%8F%9C%E6%A4%92%E7%82%92%E8%82%89.html"/>
    <updated>2026-08-16T15:12:02.420Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>鸡蛋</th>
<th>绿菜椒</th>
<th>大蒜</th>
<th>大葱</th>
<th>盐</th>
<th>白糖</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>红菜椒</strong>「可选」</td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<blockquote>
<p>青椒炒蛋 原料：青椒350克，鸡蛋4个，花生油35克，蒜蓉10克，大葱花10克，盐2克，白糖1克，松茸调味料2克，酱油15克，蚝油10克，香油2克。</p>
</blockquote>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 鸡蛋               | 绿菜椒 | 大蒜 | 大葱 | 盐   | 白糖 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-10-31T22:28:45.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">07-辣椒炒蛋「辣🔥」</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/07-%E8%BE%A3%E6%A4%92%E7%82%92%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/07-%E8%BE%A3%E6%A4%92%E7%82%92%E8%82%89.html"/>
    <updated>2026-08-16T15:12:02.420Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-10-31T19:47:30.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">07-麻婆豆腐</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/07-%E9%BA%BB%E5%A9%86%E8%B1%86%E8%85%90.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/04-%E9%85%B1%E9%A6%99%E7%94%9C%E5%8F%A3%E7%B1%BB/07-%E9%BA%BB%E5%A9%86%E8%B1%86%E8%85%90.html"/>
    <updated>2026-08-16T15:12:02.421Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-10-30T09:13:17.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">Practice Exam 2</title>
    <id>https://bornforthis.cn/1v1/101-Sallymisty/Exam/Practice-Exam-2.html</id>
    <link href="https://bornforthis.cn/1v1/101-Sallymisty/Exam/Practice-Exam-2.html"/>
    <updated>2026-08-16T15:12:02.422Z</updated>
    <summary type="html"><![CDATA[<h2>1. Instructions</h2>
<div class="hint-container warning">
<p class="hint-container-title"><strong>Read all instructions carefully!</strong></p>
</div>
<p>The exam consists of two types of questions:</p>
<ul>
<li>Questions 1-4: require you to write an explanation (free text answer) and</li>
<li>Questions 5-7: require you to write a piece of Python code.</li>
</ul>]]></summary>
    <content type="html"><![CDATA[<h2>1. Instructions</h2>
<div class="hint-container warning">
<p class="hint-container-title"><strong>Read all instructions carefully!</strong></p>
</div>
<p>The exam consists of two types of questions:</p>
<ul>
<li>Questions 1-4: require you to write an explanation (free text answer) and</li>
<li>Questions 5-7: require you to write a piece of Python code.</li>
</ul>
<p>The questions are not equally weighted. The maximum marks for each question is specified in the question specification. Questions are not ordered by difficulty: you should read through the questions first, then decide the order in which you want to attempt them.</p>
<p>The total sum of marks is 40. It is a hurdle: you need to obtain <strong>at least 10 of 40</strong> to be eligible to pass this course.</p>
<h3>1.1 Answers for questions 1-4</h3>
<p>For Questions 1 - 4, you should write your answers into the corresponding text box. There is no limit on the length of answers, but <em><strong>the best answers are precise</strong></em>. Answers that contain irrelevant or incorrect statements may receive a lower mark, even if they also contain a correct answer or part thereof.</p>
<h3>1.2 Answers for questions 5-7</h3>
<p>For the programming problems (Questions 5 - 7), you must write your solutions into the scaffold files provided and press the &quot;Submit&quot; button in Ed. You can re-submit your solution as many times as you wish before the deadline. However, we will only mark the last version submitted.</p>
<p>Solutions to programming problems will be <strong>marked on the basis of functionality only</strong>. To be fully functional means solving the problem that is described in the question. You can directly test the code by clicking &quot;Test&quot; button in Ed. Each scaffold file also includes a testing function in case you want to use an IDE and manually run the tests. These tests are designed to help you understand the problem and debug your solution. Passing all these tests does not prove that your solution is correct. <strong>Failing any test proves that your solution is wrong</strong>. A partially functional solution may receive some marks, but marks are not proportional to the number of tests passed. A submission that does not run (for example, due to syntax errors), that violates the format instructions, or that fails every test case will receive zero marks.</p>
<h2>2. Question 1: Code quality (5/40)</h2>
<p>Given three strings, the <strong>correct</strong> function below returns a new string resulting from replacing in the first string all occurrences of the second string by the third string. For example, <code>replace_substring(&quot;#COMP1730#COMP1730#&quot;, &quot;COMP1730&quot;, &quot;COMP6730&quot;)</code> returns the string <code>&quot;#COMP6730#COMP6730#&quot;</code>.</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="python" style="--vp-collapsed-lines:15;--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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> replace_substring</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">XxA</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> JKL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> AbC</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    zzz </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ""</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # Initialize i to zero</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    while</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(XxA):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> XxA[i:i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">JKL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> JKL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            zzz </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> AbC</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">JKL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        elif</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> XxA[i:i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">JKL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">!=</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66"> JKL</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            zzz </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> XxA[i]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            i </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</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">    # Alphabetically order zzz in ascending order</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    m</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"a"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> e </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> zzz:</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:#0184BC;--shiki-dark:#56B6C2">ord</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(e)</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">></span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">ord</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(m)):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">            m</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">e        </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:#383A42;--shiki-dark:#ABB2BF"> zzz </span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"># Return zzz</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 class="collapsed-lines"></div></div><p>Describe all <strong>distinct</strong> ways in which the quality of the code above can be improved without affecting to its functional correctness.</p>
<p>To gain marks, your suggested improvements must be specific. For example, if you think that naming should be improved, you must give at least one specific example of which names should be changed and to what; just answering &quot;better names&quot; is not enough. Do not simply write your suggested improvements as comments inside the function. Writing a new function or rewriting the function is not an acceptable answer, regardless of whether it is correct or not.</p>

<h2>3. Question 2: Testing (5/40)</h2>
<p>We want to write tests for a function with signature and docstring defined as follows:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> count_runs</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">l</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    """</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    Given a list l, assumed to have elements of the same type, </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    returns how many runs of consecutive equal elements there are</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">    in the list. A run must have at least 2 elements.</span></span>
<span class="line"><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 class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>For example, <code>count_runs([10,10,10,5,5,5,5,7,33,33])</code> returns <code>3</code>, because there are 3 runs of <code>10</code>'s, <code>5</code>'s and <code>33</code>'s. Element <code>7</code> does not form a run because it's a single element.</p>
<p>Write <strong>at most</strong> <strong>4</strong> test cases for this function (every test case after the first four will be ignored). For each test case, you must write down the input (argument to the function) and the expected return value. Each test case should specify valid arguments for the function (e.g., an input list with elements of different types is not a valid argument). Your test cases should cover relevant corner cases.</p>
<details class="hint-container details"><summary>四个测试覆盖：空列表、无重复、单一重复、多个不同重复。</summary>
<p>| Test Case | Input                         | Expected Output | Description            |
|</p>
</details>
]]></content>
    <author>
      <name>bornforthis</name>
    </author>
    <contributor>
      <name>bornforthis</name>
    </contributor>
    <published>2025-10-28T14:59:34.000Z</published>
    <rights>Copyright by bornforthis</rights>
  </entry>
  <entry>
    <title type="text">Practice Exam 1</title>
    <id>https://bornforthis.cn/1v1/101-Sallymisty/Exam/Practice-Exam-1.html</id>
    <link href="https://bornforthis.cn/1v1/101-Sallymisty/Exam/Practice-Exam-1.html"/>
    <updated>2026-08-16T15:12:02.441Z</updated>
    <summary type="html"><![CDATA[<h2>1. Instructions</h2>
<div class="hint-container info">
<p class="hint-container-title">Before attempting this practice exam, please complete lab 10 with exam-type questions first!</p>
</div>
<div class="hint-container warning">
<p class="hint-container-title">Read all instructions carefully!</p>
</div>]]></summary>
    <content type="html"><![CDATA[<h2>1. Instructions</h2>
<div class="hint-container info">
<p class="hint-container-title">Before attempting this practice exam, please complete lab 10 with exam-type questions first!</p>
</div>
<div class="hint-container warning">
<p class="hint-container-title">Read all instructions carefully!</p>
</div>
<p>The exam consists of two types of questions:</p>
<ul>
<li>Questions 1-4: require you to write an explanation (free text answer) and</li>
<li>Questions 5-7: require you to write a piece of Python code.</li>
</ul>
<p>The questions are not equally weighted. The maximum marks for each question is specified in the question specification. Questions are not ordered by difficulty: you should read through the questions first, then decide the order in which you want to attempt them.</p>
<p>The total sum of marks is 40. It is a hurdle: you need to obtain <strong>at least 10 of 40</strong> to be eligible to pass this course.</p>
<h3>1.1 Answers for questions 1-4</h3>
<p>For Questions 1 - 4, you should write your answers into the corresponding text box. There is no limit on the length of answers, but <em><strong>the best answers are precise</strong></em>. Answers that contain irrelevant or incorrect statements may receive a lower mark, even if they also contain a correct answer or part thereof.</p>
<h3>1.2 Answers for questions 5-7</h3>
<p>For the programming problems (Questions 5 - 7), you must write your solutions into the scaffold files provided and press the &quot;Submit&quot; button in Ed. You can re-submit your solution as many times as you wish before the deadline. However, we will only mark the last version submitted.</p>
<p>Solutions to programming problems will be <strong>marked on the basis of functionality only</strong>. To be fully functional means solving the problem that is described in the question. You can directly test the code by clicking &quot;Test&quot; button in Ed. Each scaffold file also includes a testing function in case you want to use an IDE and manually run the tests. These tests are designed to help you understand the problem and debug your solution. Passing all these tests does not prove that your solution is correct. <strong>Failing any test proves that your solution is wrong</strong>. A partially functional solution may receive some marks, but marks are not proportional to the number of tests passed. A submission that does not run (for example, due to syntax errors), that violates the format instructions, or that fails every test case will receive zero marks.</p>
<h2>2. Question 1: Improving code quality (5/40)</h2>
<p>Given two strings, the <strong>correct</strong> function below returns <code>True</code> if the second string can be formed using characters in the first string, and <code>False</code> otherwise. For example, <code>can_make_str2_from_str1(&quot;#COOMP1730#&quot;,&quot;COMP1730&quot;)</code> returns <code>True</code>,  as the string <code>&quot;COMP1730&quot;</code> can be formed using the characters <code>C</code>, <code>O</code>, <code>M</code>, <code>P</code>, <code>1</code>, <code>7</code>, <code>3</code>, and <code>0</code> in the first string. However, <code>can_make_str2_from_str1(&quot;#COOMP1730#&quot;,&quot;COOOMP1730&quot;)</code> returns <code>False</code>, as we need three <code>O</code> characters to form <code>&quot;COOOMP1730&quot;</code> and there are only two <code>O</code> characters available in <code>#COOMP1730#</code>.</p>
<div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="shiki" data-ext="python" style="--vp-collapsed-lines:15;--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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> can_make_str2_from_str1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">zzz</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic"> cccABc</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    xxx </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</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"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(zzz)):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">       xxx[zzz[i]]</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic"> # Assign the key zzz[i] the value 0</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">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(zzz)):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        xxx[zzz[i]] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</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">    # Calculate the minimum among all values in the dictionary</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    m</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=-</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (key,val) </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> xxx.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">items</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"> val</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">m:</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">           m</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">val</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">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(cccABc)):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (xxx.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(cccABc[i]) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> None</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:#A626A4;--shiki-dark:#C678DD">        if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> (xxx.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(cccABc[i]) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> None</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> or</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> xxx[cccABc[i]] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</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">            return</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> False</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        xxx[cccABc[i]] </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 1</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></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><div class="collapsed-lines"></div></div><p>Describe all <strong>distinct</strong> ways in which the quality of the code above can be improved without affecting to its functional correctness.</p>
<p>To gain marks, your suggested improvements must be specific. For example, if you think that naming should be improved, you must give at least one specific example of which names should be changed and to what; just answering &quot;better names&quot; is not enough. Do not simply write your suggested improvements as comments inside the function. Writing a new function or rewriting the function is not an acceptable answer, regardless of whether it is correct or not.</p>
<p><strong>不改变功能正确性的前提下，可以做的改进（每一点都是“不同类型”的改进，并给出具体示例）：</strong></p>





<h2>3. Question 2: Testing (5/40)</h2>
<p>We want to write tests for a function with signature and docstring defined as follows:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> count_consonants</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">string</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  """</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  Given an input string, returns the number of English consonants</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  in the string. Duplicate consonants are counted. A consonant in </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  English is a letter in the range A to Z or in the range a to z </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  which is not a vowel. Vowels in English are the letters a, e, i, </span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">  o, and u, and their upper-case variants A, E, I, O, and U.</span></span>
<span class="line"><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 class="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>Thus, for example, <code>count_consonants(&quot;Hello world!&quot;)</code> returns <code>7</code>, and <code>count_consonants(&quot;#COMP1730 exam!#&quot;)</code> returns <code>5</code>.</p>
<p>Write <strong>at most</strong> 4 test cases for this function (every test case after the first four will be ignored). For each test case, you must write down the input (argument to the function) and the expected return value. Each test case should specify valid arguments for the function. Your test cases should cover relevant corner cases.</p>

<h2>4. Question 3: Debugging (5/40)</h2>
<p>Given a sequence of integer numbers, <code>seq</code>, and a positive integer number <code>stride</code>, assumed to be smaller or equal than the length of <code>seq</code>, the following function aims to return the sum of the elements in the sequence.</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> strided_sum</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">seq</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">stride</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(seq)</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">  assert</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> stride</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">></span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD"> and</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> stride</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">n</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  quotient</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">n</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">//</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">stride</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  s</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">  for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</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">,stride):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    current</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">i</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</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">,quotient):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        s</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">seq[current]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">        current</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">stride</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"> s</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></div><p>However, the function above is not correct:</p>
<p><strong>(a)</strong> Provide an example of function call with arguments of correct type that makes this function return an incorrect result. <code>seq</code> must be a sequence of integer numbers, and <code>stride</code> must be a positive integer smaller or equal than the length of <code>seq</code>.</p>
<details class="hint-container details"><summary>(a) 给出一个会返回错误结果的调用示例</summary>
<p><strong>调用</strong>：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">strided_sum</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">5</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">7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">], </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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></div></details>
<p><strong>(b)</strong> Explain the cause of the error that you have found, i.e., what is wrong with this function. Your answer must explain what is wrong with the function as given. Writing a new function or rewriting/fixing the function is not an acceptable answer, regardless of whether it is correct or not.</p>
<h2>5. Question 4: Time complexity (5/40)</h2>
<p><strong>NOTE: There are two questions 4.1 and 4.2 below.</strong></p>
<h3>5.1 Question 4.1: Time complexity (2/40)</h3>
<p>Given the following function definition statement:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> func</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">my_list</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">i</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"> (i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">&#x3C;</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">len</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_list)):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">      return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> my_list[i]</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">func</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(my_list,i</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</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">    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:#986801;--shiki-dark:#D19A66"> 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></div><p>where <code>my_list</code> is assumed to be a list of numbers, and <code>i</code> a non-negative integer number, write down the time complexity in big-O notation of a call <code>func(my_list,0)</code> as a function of <strong>n</strong> being the length of the input list <code>my_list</code>. <strong>Explain the reason why.</strong> Correct answers without any explanation will receive zero marks.</p>
<h3>5.2 Question 4.2: Time complexity (3/40)</h3>
<p>Given the following function definition statement:</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> g</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">A</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    res</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0.0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</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">,A.shape[</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">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</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">,A.shape[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</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">            res</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">res</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">A[i,j]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> i </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</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">,A.shape[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</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">        for</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> j </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">in</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> range</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">,A.shape[</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">-</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">            res</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">res</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">+</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">A[i,j]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> res</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>where <code>A</code> is assumed be an square (i.e., same number of rows and columns) 2D NumPy array of floating point numbers, write down the time complexity in big-O notation as a function of n<em>n</em> being the number of rows and columns of <code>A</code>. <strong>Explain the reason why.</strong> Correct answers without any explanation will receive zero marks.</p>
<h2>6. Question 5: Count isograms (7/40)</h2>
<p>An isogram is a string where each of its characters occurs the same number of times. A lower-case letter is different from an upper-case letter and the function should work with non-letter characters. For example, the string <code>&quot;abaCCb&quot;</code> is an isogram as the characters <code>&quot;a&quot;</code>, <code>&quot;b&quot;</code>, <code>&quot;C&quot;</code> occur two times each. The string <code>&quot;aBaCCb&quot;</code> is not an isogram because <code>&quot;a&quot;</code>, <code>&quot;B&quot;</code>, <code>&quot;C&quot;</code>, and <code>&quot;b&quot;</code> occur twice, once, twice, and once, respectively (<code>&quot;B&quot;</code> is different from <code>&quot;b&quot;</code>).</p>
<p>Write a function <code>count_isograms</code> that takes a list of strings as input and returns the number of strings in the list are isograms.</p>
<p>A scaffold file <code>count_isograms.py</code> is provided. You must write your solution into this file.</p>
<p>Requirements:</p>
<ul>
<li>The function that you write must be named <code>count_isograms</code> and it must have a single parameter.</li>
<li>You can assume that the parameter is of type<code>list.</code></li>
<li>You can assume that all elements in the list are of type <code>str.</code></li>
<li>The function must return an integer.</li>
</ul>
<p>Your solution will be marked on functionality only (no code quality considered). To be fully functional means that it returns the correct value for all valid arguments. You can test it by either clicking the &quot;Test&quot; button in Ed or running <code>test_count_isograms</code> provided in the scaffold file. Passing the tests does not prove that your solution is correct. <strong>Failing any test proves that your function is wrong.</strong> Code that does not run (for example due to syntax errors) or that fails every test case will receive <strong>zero marks</strong>.</p>
<p><strong>count_isograms.py</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> count_isograms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">strings</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    pass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> test_count_isograms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> count_isograms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([])</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">0</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> count_isograms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"a"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> count_isograms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"aa"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abC"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> count_isograms</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">([</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abaCCb"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"abaCCb"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">])</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</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><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/da/daf30082c0a8c5501db63594ee432c8ef70a98b84ba6678fed4ee7b551bcfe00.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>

<h2>7. Question 6: Extract k-th diagonal of a matrix (7/40)</h2>
<p>A square matrix is a matrix with the same number of rows and columns, n<em>n</em>. We will use list of lists to store a square matrix. The main diagonal is defined as a list of elements with the same row and column indices, i.e., <code>[0][0]</code>, <code>[1][1]</code>, <code>[2][2]</code>, and so on. For example, given the 4-by-4 matrix <code>[[1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16]]</code>:</p>
<p v-pre class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>1</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>3</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>4</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>5</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>6</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>7</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>8</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>9</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>10</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>11</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>12</mn></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>13</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>14</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>15</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>16</mn></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><annotation encoding="application/x-tex">\begin{bmatrix}
1 &amp; 2 &amp; 3 &amp; 4 \\
5 &amp; 6 &amp; 7 &amp; 8 \\
9 &amp; 10 &amp; 11 &amp; 12 \\
13 &amp; 14 &amp; 15 &amp; 16
\end{bmatrix}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.8em;vertical-align:-2.15em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.667em;height:4.8em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="4.8em" viewBox="0 0 667 4800"><path d="M403 1759 V84 H666 V0 H319 V1759 v1200 v1759 v84 h347 v-84
H403z M403 1759 V0 H319 V1759 v1200 v1759 v84 h84z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">5</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">9</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">13</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">6</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">10</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">14</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">7</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">11</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">15</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em;"></span><span class="arraycolsep" style="width:0.5em;"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.81em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span><span style="top:-3.61em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">8</span></span></span><span style="top:-2.41em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">12</span></span></span><span style="top:-1.21em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em;"><span style="top:-4.65em;"><span class="pstrut" style="height:6.8em;"></span><span style="width:0.667em;height:4.8em;"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="4.8em" viewBox="0 0 667 4800"><path d="M347 1759 V0 H0 V84 H263 V1759 v1200 v1759 H0 v84 H347z
M347 1759 V0 H263 V1759 v1200 v1759 h84z"/></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em;"><span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>The main diagonal is <code>[1, 6, 11, 16]</code>. More generally, we define the <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span></span></span></span>-th diagonal of a square matrix,where <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mi>n</mi><mo>&lt;</mo><mi>k</mi><mo>&lt;</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">−n &lt; k &lt; n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span>, is a list of those elements in a diagonal parallel to the main diagonal at a distance <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span></span></span></span> to the main diagonal.<span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>&gt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">k &gt; 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> means that the <em>k</em>-th diagonal is located to the right of the main diagonal, and <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>&lt;</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">k &lt; 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> means that it is located at the left.For <em>k</em> = 0, the <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span></span></span></span>-th diagonal is the same as the main diagonal. Figure below illustrates this:</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/10/1067640b2aaa9d1b5bf1534d7583c33376361bfe564662f4eb93a5b882a9805f.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>In this example, for <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">k = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> the 1st diagonal is <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>2</mn><mo separator="true">,</mo><mn>7</mn><mo separator="true">,</mo><mn>12</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[2, 7, 12]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">12</span><span class="mclose">]</span></span></span></span>, and for <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">k = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span> the (-2)th diagonal is <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>9</mn><mo separator="true">,</mo><mn>14</mn><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">[9, 14]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">9</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">14</span><span class="mclose">]</span></span></span></span>.</p>
<p>Note that the elements in the (k)-th diagonal must go from the top left to the bottom right of the matrix.</p>
<p>Write a function <code>kth_diagonal</code> that takes a square matrix represented as a list of lists and a value of <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span></span></span></span> as input. It should return the <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span></span></span></span>-th diagonal of the matrix as a list. The elements in the list of lists can be of any type, and different elements may be of different types.</p>
<p>More examples:</p>
<ul>
<li><code>kth_diagonal([[1,2,[1,2,3]],[4,5,6],[7,8,&quot;comp7130&quot;]],2)</code> , must return the list <code>[[1,2,3]]</code>, and</li>
<li><code>kth_diagonal([[1,2,[1,2,3]],[4,5,6],[7,8,&quot;comp7130&quot;]],0),</code> must return the list <code>[1,5,&quot;comp7130&quot;]</code>.</li>
</ul>
<p>A scaffold file <code>kth_diagonal.py</code> is provided. You must write your solution into this file.</p>
<p>Requirements:</p>
<ul>
<li>The function that you write must be named <code>kth_diagonal</code> and it must have two parameters.</li>
<li>You can assume the first parameter to be a list of lists and the second parameter an integer.</li>
<li>The elements in the list of lists can be of any type, and different elements may have different types.</li>
<li>The function must return a list.</li>
</ul>
<p>Your solution will be marked on functionality only (no code quality considered). To be fully functional means that it returns the correct value for all valid arguments. You can test it by either clicking the &quot;Test&quot; button in Ed or running <code>test_kth_diagonal</code> provided in the scaffold file. Passing the tests does not prove that your solution is correct. <strong>Failing any test proves that your function is wrong.</strong> Code that does not run (for example due to syntax errors) or that fails every test case will receive <strong>zero marks</strong>.</p>
<p><strong>kth_diagonal.py</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> kth_diagonal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">matrix</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">k</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    pass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> test_kth_diagonal</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> kth_diagonal</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:#986801;--shiki-dark:#D19A66">2</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">5</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">7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"comp7130"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]],</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]]</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> kth_diagonal</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:#986801;--shiki-dark:#D19A66">2</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:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">3</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:#986801;--shiki-dark:#D19A66">5</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">7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">8</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"comp7130"</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:#383A42;--shiki-dark:#56B6C2">==</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:#986801;--shiki-dark:#D19A66">5</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"comp7130"</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></div><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2d/2da3c12c6e772626e3247ca22713bf66da1c4c30a920ba7b6ed482fd03349940.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>

<h2>8. Question 7: Count twin primes pairs (6/40)</h2>
<p>A prime number is an integer larger than <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> that has only two integer divisors: <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> and itself. A composite number is an integer greater than <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> that is not a prime number.</p>
<p>Two prime numbers are called twin if there is exactly one composite number between them. For example, <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> and <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span> are not twin primes, as there is no composite number between them. However, <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span> and <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span> are twins, as there is one and only composite number between them: <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>. Besides, <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>7</mn></mrow><annotation encoding="application/x-tex">7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">7</span></span></span></span> and <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>11</mn></mrow><annotation encoding="application/x-tex">11</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">11</span></span></span></span> are not twin prime numbers, as there are three composite numbers between them: 8, 9, 10.</p>
<p>Write a function <code>twin_primes</code> that takes as input a positive integer n<em>n</em>, and returns how many twin primes are there that are smaller than or equal to n<em>n</em>. For example, if <span v-pre class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>7</mn></mrow><annotation encoding="application/x-tex">n=7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">7</span></span></span></span>, the function must return 3, as there are three twin primes up to 7: <code>(2,5), (3,5)</code>, and <code>(5,7)</code>.</p>
<p>A scaffold file <code>twin_primes.py</code> is provided. You must write your solution into this file.</p>
<p>Requirements:</p>
<ul>
<li>The function that you write must be named <code>twin_primes</code> and it must have a single parameter.</li>
<li>You can assume that the parameter is a positive integer.</li>
</ul>
<p>Your solution will be marked on functionality only (no code quality considered). To be fully functional means that it returns the correct value for all valid arguments. You can test it by either clicking the &quot;Test&quot; button in Ed or running <code>test_twin_primes</code> provided in the scaffold file. Passing the tests does not prove that your solution is correct. <strong>Failing any test proves that your function is wrong.</strong> Code that does not run (for example due to syntax errors) or that fails every test case will receive <strong>zero marks</strong>.</p>
<p><strong>twin_primes.py</strong></p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> twin_primes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-light-font-style:inherit;--shiki-dark:#D19A66;--shiki-dark-font-style:italic">n</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    pass</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">def</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> test_twin_primes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">():</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> twin_primes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 3</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> twin_primes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">10</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 3</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">    assert</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF"> twin_primes</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">20</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">) </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 5</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><figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/75/75517976f6bee533e98220d2bbe124004fd77f8843c2767b875c7f3b42ee9754.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>

]]></content>
    <author>
      <name>bornforthis</name>
    </author>
    <contributor>
      <name>bornforthis</name>
    </contributor>
    <published>2025-10-28T14:42:37.000Z</published>
    <rights>Copyright by bornforthis</rights>
  </entry>
  <entry>
    <title type="text">17-山药苹果饼</title>
    <id>https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/17-%E8%8B%B9%E6%9E%9C%E5%B1%B1%E8%8D%AF%E9%A5%BC.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P07-%E7%89%B9%E8%89%B2%E7%94%9C%E9%A3%9F%E5%B0%8F%E5%90%83/17-%E8%8B%B9%E6%9E%9C%E5%B1%B1%E8%8D%AF%E9%A5%BC.html"/>
    <updated>2026-08-16T15:12:02.565Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>铁棍山药</th>
<th>盐</th>
<th>黑芝麻</th>
</tr>
</thead>
</table>
<blockquote>
<p>山药苹果饼 原料：熟山药泥400克，盐3克，苹果丝100克，面粉60克，黑芝麻3克，花生油10克。</p>
</blockquote>
<h2>2. 步骤</h2>
<ol>
<li>想要山药去皮手不痒，可以把山药拿去火烧一下表皮，烘烤到水分挥发；</li>
<li>山药切小圆块，并用保鲜膜封上；</li>
<li>上锅蒸熟；</li>
<li>蒸熟之后，捣碎山药——&gt;加入一些：盐；</li>
<li>擦入：苹果丝；</li>
<li>加入两勺面粉，接着弄成面团；（还可以加一下牛奶、奶粉都可以）</li>
<li>可以做成剂子，然后做成饼了；</li>
<li>在每个饼上面撒上一些黑芝麻；</li>
<li>直接煎制即可，煎制到金黄上色即可；</li>
</ol>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 铁棍山药 | 盐   | 黑芝麻 |
|</p>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-10-28T14:42:37.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">06-扁豆腊肉</title>
    <id>https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/06-%E6%89%81%E8%B1%86%E8%85%8A%E8%82%89.html</id>
    <link href="https://bornforthis.cn/column/cookdinner/P01-%E8%8D%A4%E8%8F%9C%E7%B1%BB/03-%E7%82%92%E8%8F%9C%E7%B1%BB/06-%E6%89%81%E8%B1%86%E8%85%8A%E8%82%89.html"/>
    <updated>2026-08-16T15:12:02.565Z</updated>
    <summary type="html"><![CDATA[<h2>1. 食材</h2>
<table>
<thead>
<tr>
<th>腊肉</th>
<th>扁豆</th>
<th>大葱</th>
<th>小米辣</th>
<th>生姜</th>
<th>小葱段</th>
<th>花雕酒</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>生抽</strong></td>
<td><strong>彩椒</strong></td>
<td><strong>大蒜</strong></td>
<td><strong>白胡椒粉</strong></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[<h2>1. 食材</h2>
<p>| 腊肉     | 扁豆     | 大葱     | 小米辣       | 生姜 | 小葱段 | 花雕酒 |
|</p>
]]></content>
    <author>
      <name>bornforthis</name>
    </author>
    <contributor>
      <name>bornforthis</name>
    </contributor>
    <published>2025-10-28T10:11:25.000Z</published>
    <rights>Copyright by bornforthis</rights>
  </entry>
  <entry>
    <title type="text">05-LM Studio中文版入门教程「含：去除思维链方法及代码实现」</title>
    <id>https://bornforthis.cn/column/Python-Programming-Course/P05-AI-large-model/05-LMStudio.html</id>
    <link href="https://bornforthis.cn/column/Python-Programming-Course/P05-AI-large-model/05-LMStudio.html"/>
    <updated>2026-08-16T15:12:02.567Z</updated>
    <summary type="html"><![CDATA[<h2>1. 安装库</h2>
<p><code>lmstudio-python</code> 已在 PyPI 上发布。你可以使用 pip 进行安装。</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:#4078F2;--shiki-dark:#61AFEF">pip</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> lmstudio</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[<h2>1. 安装库</h2>
<p><code>lmstudio-python</code> 已在 PyPI 上发布。你可以使用 pip 进行安装。</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:#4078F2;--shiki-dark:#61AFEF">pip</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> lmstudio</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>2. 快速示例：与 Llama 模型聊天</h2>
<h3>2.1 使用终端安装大模型</h3>
<p>以下代码需要 <a href="https://lmstudio.ai/models/qwen/qwen3-4b-2507" target="_blank" rel="noopener noreferrer">qwen3-4b-2507</a> 模型，如果没有该模型，请在终端运行以下命令进行下载。</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/e1/e1056acb429e807747f7fe22555f89e8d6e74c54be607b1797acd18ff90bda8f.png" alt="下载过程图" tabindex="0" loading="lazy"><figcaption>下载过程图</figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8f/8f8f37c5fcde2c416cd45a3315febac66ba0ced2e636f1766d52d2c83947e841.png" alt="下载完成" tabindex="0" loading="lazy"><figcaption>下载完成</figcaption></figure>
<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:#4078F2;--shiki-dark:#61AFEF">lms</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> get</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> qwen/qwen3-4b-2507</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><a href="https://lmstudio.ai/docs/cli/get" target="_blank" rel="noopener noreferrer">在此处</a>阅读有关 LM Studio 的 CLI 中的 <code>lms get</code> 更多信息。</p>
<h3>2.2 基础调用示例</h3>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lmstudio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lms</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">model </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lms.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">llm</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"qwen/qwen3-4b-2507"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">)</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">result </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> model.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">respond</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:#0184BC;--shiki-dark:#56B6C2">print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(result)</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><h2>3. 设置局域网服务器</h2>
<h3>3.1 LM Studio 软件内设置</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/2d/2d2b41fb48044849e80a41d876e7630f11ad9fd45e9c3b27df96413aaa96033b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<p>默认端口 1234，可以自行设置其它端口。</p>
<h3>3.2 开启服务</h3>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/8e/8e566849913ec3b84f1c24461b18f101c3d470ddf5e3ce90a576476c63ce9301.png" alt="开启 Status Stopped" tabindex="0" loading="lazy"><figcaption>开启 Status Stopped</figcaption></figure>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/7e/7e1698c3c7d855ac21dbb877c4140cf01ae1b899124adee0122abb16637a9ec4.png" alt="开启状态" tabindex="0" loading="lazy"><figcaption>开启状态</figcaption></figure>
<h3>3.3 程序中设置使用 http 模式</h3>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lmstudio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lms</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "localhost:1234"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">lms.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">configure_default_client</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</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></div><h3>3.4 检查指定的 API 服务器主机是否正在运行</h3>
<p>很多时候，我们需要确保提供 API 的电脑是否正常启动，且可以正常使用，避免项目不能正常运行。</p>
<p>我们可以使用如下代码实现：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lmstudio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lms</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "localhost:1234"</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"> lms.Client.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">is_valid_api_host</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">):</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"An LM Studio API server instance is available at </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">}</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">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">    print</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"No LM Studio API server instance found at </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">{SERVER_API_HOST}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</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><h3>3.5 局域网内 IP 地址获取</h3>
<p>当开启 API 服务后，软件右上角会自行显示 IP 地址以及对应端口，看如下图：</p>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/5b/5bdb3a094f39eeb9cc5c0869fa42ff4a617636b6273b6eb14621468000178a7b.png" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
<h3>3.6 最终设置</h3>
<p><strong>场景</strong>：Windows 设置为服务器，Mac 进行调用。下面的代码，写在 Mac 上面：</p>
<div class="language-python line-numbers-mode" data-highlighter="shiki" data-ext="python" 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-python"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">import</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lmstudio </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">as</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> lms</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "192.168.3.6:1234"</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">  # 不能加 http，否则无法访问并且报错：timeout</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">lms.</span><span style="--shiki-light:#383A42;--shiki-dark:#61AFEF">configure_default_client</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#383A42;--shiki-dark:#D19A66">SERVER_API_HOST</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></div><blockquote>
<p>当然，上面的点也可以写在 Windows 上。</p>
</blockquote>
<h2>4. 查看当前所安装的大模型 &amp; 使用</h2>
<h3>4.1 查看所有已安装大模型</h3>

<details class="hint-container details"><summary><code>{idx:&gt;3}</code> 的含义</summary>
<p>这一部分是对变量 <code>idx</code> 的<strong>格式控制</strong>。</p>
<ul>
<li><code>:</code> 表示“开始设置格式”</li>
<li><code>&gt;</code> 表示 <strong>右对齐</strong>（align right）</li>
<li><code>3</code> 表示 <strong>宽度为 3 个字符</strong></li>
</ul>
<p>👉 所以 <code>{idx:&gt;3}</code> 的意思是：</p>
<blockquote>
<p>把变量 <code>idx</code> 占 3 个字符宽度并右对齐，不足的位置用空格填充。</p>
</blockquote>
<p>例如：</p>
<p>| idx  | 输出结果 |
|</p>
</details>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-10-26T14:13:01.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">Excel IF 入门教学</title>
    <id>https://bornforthis.cn/blog/2025/10month/Excel-IF.html</id>
    <link href="https://bornforthis.cn/blog/2025/10month/Excel-IF.html"/>
    <updated>2026-08-16T15:12:02.594Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>Excel 中的 <code>IF</code> 函数用于根据给定的条件返回不同的值。</p>
<h2>1. 基本语法</h2>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">IF(逻辑测试,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 真值,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 假值</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></div>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>Excel 中的 <code>IF</code> 函数用于根据给定的条件返回不同的值。</p>
<h2>1. 基本语法</h2>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">IF(逻辑测试,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 真值,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 假值</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></div><p>| 参数     | 说明                                 |
|</p>
]]></content>
    <author>
      <name>bornforthis</name>
    </author>
    <contributor>
      <name>bornforthis</name>
    </contributor>
    <published>2025-10-26T10:28:52.000Z</published>
    <rights>Copyright by bornforthis</rights>
  </entry>
  <entry>
    <title type="text">Excel MID 入门学习</title>
    <id>https://bornforthis.cn/blog/2025/10month/Excel-MID.html</id>
    <link href="https://bornforthis.cn/blog/2025/10month/Excel-MID.html"/>
    <updated>2026-08-16T15:12:02.597Z</updated>
    <summary type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>Excel 中的 <strong>MID</strong> 函数用于从一个文本字符串的中间提取指定数量的字符。它的语法如下：</p>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">MID(text,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> start_num,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> num_chars</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></div>]]></summary>
    <content type="html"><![CDATA[<p>你好，我是悦创。</p>
<p>Excel 中的 <strong>MID</strong> 函数用于从一个文本字符串的中间提取指定数量的字符。它的语法如下：</p>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">MID(text,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> start_num,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> num_chars</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></div><h2>1. 参数说明</h2>
<ul>
<li><strong>text</strong>：这是你要从中提取字符的文本字符串。</li>
<li><strong>start_num</strong>：从文本字符串的哪个位置开始提取。第一个字符的位置是 1。</li>
<li><strong>num_chars</strong>：你希望提取的字符数。</li>
</ul>
<h2>2. 示例</h2>
<h3>2.1 示例 1</h3>
<p>假设单元格 A1 的内容是 <code>&quot;Excel1234&quot;</code>，你想从第 6 个字符开始提取 4 个字符。</p>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">=MID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">A1,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 6,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 4</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></div><p><strong>结果</strong>：<code>1234</code></p>
<h3>2.2 示例 2</h3>
<p>如果 A2 中是 <code>&quot;Hello World&quot;</code>，你想提取从第 7 个字符开始的 5 个字符：</p>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">=MID</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">A2,</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 7,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 5</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></div><p><strong>结果</strong>：<code>World</code></p>
<h2>3. 注意</h2>
<ul>
<li><code>start_num</code> 的位置是基于字符串的字符位置。</li>
<li>如果 <code>start_num</code> 超出了文本的总长度，或者 <code>num_chars</code> 的字符数超过了文本的剩余字符数，<code>MID</code> 会返回剩余的字符。</li>
</ul>
<p>这样，你可以根据需求灵活使用 <strong>MID</strong> 函数来提取不同位置的字符。</p>
<h2>4. 实操</h2>
<ul>
<li><a href="https://github.com/AndersonHJB/BornforthisData/blob/main/bornforthis.cn/blog/2025/10month/Excel-MID/MID%20%E5%87%BD%E6%95%B0%E7%BB%83%E4%B9%A0.xlsx" target="_blank" rel="noopener noreferrer">https://github.com/AndersonHJB/BornforthisData/blob/main/bornforthis.cn/blog/2025/10month/Excel-MID/MID%20%E5%87%BD%E6%95%B0%E7%BB%83%E4%B9%A0.xlsx</a></li>
</ul>
<details class="hint-container details"><summary>公众号：AI悦创【二维码】</summary>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/77/77f67d48a67ec6a44a4ef1f01ffc85830eb3c121b1ece45dc5ada06e20e2f52b.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
</details>
<div class="hint-container info">
<p class="hint-container-title">AI悦创·编程一对一</p>
<p>AI悦创·推出辅导班啦，包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Web、Linux」，招收学员面向国内外，国外占 80%。全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然，还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线，随时响应！微信：Jiabcdefh</p>
<p>C++ 信息奥赛题解，长期更新！长期招收一对一中小学信息奥赛集训，莆田、厦门地区有机会线下上门，其他地区线上。微信：Jiabcdefh</p>
<p>方法一：<a href="http://wpa.qq.com/msgrd?v=3&amp;uin=1432803776&amp;site=qq&amp;menu=yes" target="_blank" rel="noopener noreferrer">QQ</a></p>
<p>方法二：微信：Jiabcdefh</p>
</div>
<figure><img src="https://blog.images.bornforthis.cn/docs-images/sha256/30/3087c629da73428daa0ee050f5b31709c30f650686164b54c724b892a422c585.jpg" alt tabindex="0" loading="lazy"><figcaption></figcaption></figure>
]]></content>
    <author>
      <name>AI悦创</name>
    </author>
    <contributor>
      <name>AI悦创</name>
    </contributor>
    <published>2025-10-26T10:16:03.000Z</published>
    <rights>Copyright by AI悦创</rights>
  </entry>
  <entry>
    <title type="text">Excel TRIM 入门学习</title>
    <id>https://bornforthis.cn/blog/2025/10month/Excel-TRIM.html</id>
    <link href="https://bornforthis.cn/blog/2025/10month/Excel-TRIM.html"/>
    <updated>2026-08-16T15:12:02.598Z</updated>
    <summary type="html"><![CDATA[<h2>1. TRIM 函数的作用</h2>
<p><strong>TRIM 函数</strong> 用来<strong>删除文本中的多余空格</strong>，只保留单词之间的一个空格。</p>
<h3>1.1 功能总结：</h3>
<ul>
<li>去掉文本<strong>开头</strong>和<strong>结尾</strong>的所有空格；</li>
<li>将文本中<strong>连续的多个空格</strong>变成<strong>一个空格</strong>。</li>
</ul>
<h3>1.2 语法</h3>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">=TRIM</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">text</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></div>]]></summary>
    <content type="html"><![CDATA[<h2>1. TRIM 函数的作用</h2>
<p><strong>TRIM 函数</strong> 用来<strong>删除文本中的多余空格</strong>，只保留单词之间的一个空格。</p>
<h3>1.1 功能总结：</h3>
<ul>
<li>去掉文本<strong>开头</strong>和<strong>结尾</strong>的所有空格；</li>
<li>将文本中<strong>连续的多个空格</strong>变成<strong>一个空格</strong>。</li>
</ul>
<h3>1.2 语法</h3>
<div class="language-excel line-numbers-mode" data-highlighter="shiki" data-ext="excel" 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-excel"><span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">=TRIM</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">text</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></div><p><strong>参数说明：</strong></p>
<p>| 参数 | 说明                                             |
|</p>
]]></content>
    <author>
      <name>bornforthis</name>
    </author>
    <contributor>
      <name>bornforthis</name>
    </contributor>
    <published>2025-10-26T10:04:35.000Z</published>
    <rights>Copyright by bornforthis</rights>
  </entry>
</feed>