<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://bosprimigenious.site/feed.xml" rel="self" type="application/atom+xml" /><link href="https://bosprimigenious.site/" rel="alternate" type="text/html" hreflang="zh-CN" /><updated>2026-05-29T11:09:45+00:00</updated><id>https://bosprimigenious.site/feed.xml</id><title type="html">Bosprimigenious</title><subtitle>张恒基 — BUPT · 全栈 &amp; AI 工程 · TextGuard · NeurIPS 2026 Under Review
</subtitle><entry><title type="html">WenZhenGuardian 团队开发规范</title><link href="https://bosprimigenious.site/blog/guifan/" rel="alternate" type="text/html" title="WenZhenGuardian 团队开发规范" /><published>2025-12-04T12:00:00+00:00</published><updated>2025-12-04T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/guifan</id><content type="html" xml:base="https://bosprimigenious.site/blog/guifan/"><![CDATA[<p>WenZhenGuardian 团队开发规范
一、分支规范
✔ 默认分支</p>

<p>main：稳定版本，只存放已测试、可部署代码
⚠ 禁止直接在 main 上开发</p>

<p>✔ 开发分支</p>

<p>每个成员开发功能必须新建功能分支：</p>

<p>feature/<功能名>
bugfix/<修复内容>
hotfix/<紧急修复>
refactor/<重构内容></重构内容></紧急修复></修复内容></功能名></p>

<p>示例：</p>

<p>✔ 2. 加入 GitHub Actions</p>

<h1 id="wenzhenguardian-团队开发规范">WenZhenGuardian 团队开发规范</h1>

<hr />

<h2 id="一分支规范">一、分支规范</h2>

<ul>
  <li><strong>默认分支</strong>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">main</code>：稳定版本，只存放已测试、可部署代码</li>
      <li>⚠️ 禁止直接在 <code class="language-plaintext highlighter-rouge">main</code> 上开发</li>
    </ul>
  </li>
  <li><strong>开发分支（每个成员必须新建）</strong>
    <ul>
      <li><code class="language-plaintext highlighter-rouge">feature/&lt;功能名&gt;</code></li>
      <li><code class="language-plaintext highlighter-rouge">bugfix/&lt;修复内容&gt;</code></li>
      <li><code class="language-plaintext highlighter-rouge">hotfix/&lt;紧急修复&gt;</code></li>
      <li><code class="language-plaintext highlighter-rouge">refactor/&lt;重构内容&gt;</code></li>
    </ul>
  </li>
</ul>

<h1 id="wenzhenguardian-团队开发规范详尽版">WenZhenGuardian 团队开发规范（详尽版）</h1>

<blockquote>
  <p>目的：统一团队协作流程，减少合并冲突，提高代码质量与交付效率。优先保证 <code class="language-plaintext highlighter-rouge">main</code> 分支始终可部署。</p>
</blockquote>

<hr />

<h2 id="一分支规范详尽bushi不详尽">一、分支规范（详尽）（bushi）（不详尽）</h2>

<p>总体原则：</p>

<ul>
  <li>保持 <code class="language-plaintext highlighter-rouge">main</code>（或 <code class="language-plaintext highlighter-rouge">release</code>）为稳定、可部署分支；所有开发活动在临时分支完成并通过 PR 合并。</li>
  <li>分支命名应可读、可追溯、短小且语义化，便于审查和 CI 跟踪。</li>
  <li>说人话就是，大家千万不要懂main分支</li>
  <li>然后可以看看如何创建新分支，每个人有自己的分支</li>
</ul>

<p>推荐分支类型与用途：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">main</code>：生产/部署分支，仅可通过合并 PR 更新（受分支保护策略管控）。</li>
  <li><code class="language-plaintext highlighter-rouge">develop</code>（可选）：汇总短期开发成果的集成分支；团队较大或需要持续集成时建议使用。若使用此分支，Feature 分支应合并到 <code class="language-plaintext highlighter-rouge">develop</code>，release 从 <code class="language-plaintext highlighter-rouge">develop</code> 发出并合并回 <code class="language-plaintext highlighter-rouge">main</code> 与 <code class="language-plaintext highlighter-rouge">develop</code>。</li>
  <li><code class="language-plaintext highlighter-rouge">feature/&lt;短描述&gt;</code>：新功能分支，仅包含一个明确的功能点或任务（如 <code class="language-plaintext highlighter-rouge">feature/login-oauth</code>）。</li>
  <li><code class="language-plaintext highlighter-rouge">bugfix/&lt;短描述&gt;</code>：用于修复开发中发现但不紧急的问题（合并到 <code class="language-plaintext highlighter-rouge">develop</code> 或 <code class="language-plaintext highlighter-rouge">main</code> 视流程而定）。</li>
  <li><code class="language-plaintext highlighter-rouge">hotfix/&lt;短描述&gt;</code>：用于线上紧急问题，直接从 <code class="language-plaintext highlighter-rouge">main</code> 创建，修复后需合并回 <code class="language-plaintext highlighter-rouge">main</code> 和 <code class="language-plaintext highlighter-rouge">develop</code>（若存在）。</li>
  <li><code class="language-plaintext highlighter-rouge">release/&lt;x.y.z&gt;</code>（可选）：准备发布的分支，用于最后的集成测试与版本号调整，测试通过后合并回 <code class="language-plaintext highlighter-rouge">main</code> 并打 tag。</li>
  <li><code class="language-plaintext highlighter-rouge">refactor/&lt;短描述&gt;</code>：仅用于重构，要求在 PR 中说明不改变外部行为。</li>
</ul>

<p>分支命名规范（示例）：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>feature/auth-jwt
bugfix/login-redirect
hotfix/critical-500
refactor/api-client
release/1.2.0
</code></pre></div></div>

<p>常见操作命令（示例）：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 从远程更新本地 main</span>
git checkout main
git pull origin main

<span class="c"># 创建 feature 分支</span>
git checkout <span class="nt">-b</span> feature/auth-jwt

<span class="c"># 在分支上工作、提交、推送</span>
git add <span class="nb">.</span>
git commit <span class="nt">-m</span> <span class="s2">"feat(auth): add JWT login"</span>
git push <span class="nt">-u</span> origin feature/auth-jwt
</code></pre></div></div>

<p>PR 与合并策略：</p>

<p><strong>合并到main分支必须经过bosprimigenious审核</strong></p>

<ul>
  <li>所有分支合并到 <code class="language-plaintext highlighter-rouge">main</code>（或 <code class="language-plaintext highlighter-rouge">develop</code>）必须通过 Pull Request。PR 要求至少一个代码评审者通过（人数可在分支保护中设置）。</li>
  <li>CI 必须通过（lint/format/tests）才能合并。</li>
  <li>合并方式建议：
    <ul>
      <li>对于保留历史：使用 <code class="language-plaintext highlighter-rouge">Merge commit</code>（默认），有利于保留上下文；</li>
      <li>对于整洁历史：可使用 <code class="language-plaintext highlighter-rouge">Squash and merge</code>，把多次提交合并为一次有意义提交；</li>
      <li>不建议在公共分支上强制 <code class="language-plaintext highlighter-rouge">rebase</code>，以避免复杂的历史重写风险。</li>
    </ul>
  </li>
</ul>

<p>冲突处理（简单流程）：</p>

<ol>
  <li>拉取远端最新目标分支：<code class="language-plaintext highlighter-rouge">git fetch origin</code>，切换目标分支并 <code class="language-plaintext highlighter-rouge">git pull</code>。</li>
  <li>在自己的分支执行 <code class="language-plaintext highlighter-rouge">git merge origin/main</code>（或 <code class="language-plaintext highlighter-rouge">origin/develop</code>），解决冲突并 <code class="language-plaintext highlighter-rouge">git add</code> 冲突文件。</li>
  <li><code class="language-plaintext highlighter-rouge">git commit</code>（必要时），再 <code class="language-plaintext highlighter-rouge">git push</code> 到远程分支，PR 会自动更新。</li>
</ol>

<p>示例：从 <code class="language-plaintext highlighter-rouge">main</code> 合并到 feature 并解决冲突：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout feature/auth-jwt
git fetch origin
git merge origin/main
<span class="c"># 解决冲突后</span>
git add conflicted_file.py
git commit <span class="nt">-m</span> <span class="s2">"fix: resolve merge conflicts with main"</span>
git push
</code></pre></div></div>

<p>分支生命周期建议：</p>

<ul>
  <li>Feature 分支：短生命周期（建议不超过 2 周），长时间分支增加冲突风险。</li>
  <li>Hotfix：创建后尽快修复并合并回 <code class="language-plaintext highlighter-rouge">main</code> 与 <code class="language-plaintext highlighter-rouge">develop</code>，打上补丁版本号。</li>
  <li>Release：用于最终集成测试，不应在 release 分支上新增新功能。</li>
</ul>

<p>权限与分支保护（建议在 GitHub 上配置）：</p>

<ul>
  <li>对 <code class="language-plaintext highlighter-rouge">main</code> 启用 Branch protection：
    <ul>
      <li>勾选：Require pull request before merging</li>
      <li>勾选：Require status checks to pass before merging（选中 CI 检查）</li>
      <li>勾选：Require approvals（最少 1 或 2 位审查者）</li>
      <li>可选：Restrict who can push to matching branches（仅允许管理员或 CI 推送）</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="二提交信息git-commit规范简洁但强制">二、提交信息（Git Commit）规范（简洁但强制）</h2>

<p>规则：</p>

<ul>
  <li>格式：<code class="language-plaintext highlighter-rouge">&lt;type&gt;(&lt;scope&gt;): &lt;short summary&gt;</code>，例如：<code class="language-plaintext highlighter-rouge">feat(auth): add JWT login</code></li>
  <li>常用 type：<code class="language-plaintext highlighter-rouge">feat</code>、<code class="language-plaintext highlighter-rouge">fix</code>、<code class="language-plaintext highlighter-rouge">docs</code>、<code class="language-plaintext highlighter-rouge">style</code>、<code class="language-plaintext highlighter-rouge">refactor</code>、<code class="language-plaintext highlighter-rouge">test</code>、<code class="language-plaintext highlighter-rouge">chore</code></li>
  <li>每个提交的 summary 不超过 72 个字符；需要详细描述时在 body 中说明。示例：</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>feat(auth): add JWT login

- 支持 access/refresh token
- 增加 token 刷新路由
</code></pre></div></div>

<p>Git 提交示例命令：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add changed_file.py
git commit <span class="nt">-m</span> <span class="s2">"feat(api): add inference endpoint"</span>
</code></pre></div></div>

<hr />

<h2 id="三pull-requestpr模板与评审要点">三、Pull Request（PR）模板与评审要点</h2>

<p>在仓库中添加 <code class="language-plaintext highlighter-rouge">.github/PULL_REQUEST_TEMPLATE.md</code> 可强制 PR 填写必要信息。建议内容：</p>

<ul>
  <li><strong>概述</strong>：做了什么？</li>
  <li><strong>变更类型</strong>：<code class="language-plaintext highlighter-rouge">feat</code>/<code class="language-plaintext highlighter-rouge">fix</code>/<code class="language-plaintext highlighter-rouge">docs</code>/<code class="language-plaintext highlighter-rouge">chore</code> 等</li>
  <li><strong>为何需要</strong>：问题背景或需求来源</li>
  <li><strong>如何测试</strong>：复现步骤、测试用例或截图</li>
  <li><strong>关联 issue</strong>：若有关联 issue 请列出</li>
</ul>

<p>评审要点清单：</p>

<ul>
  <li>功能实现是否完整（边界/错误处理）</li>
  <li>测试覆盖是否充足（unit/integration）</li>
  <li>代码是否风格一致并通过 lint</li>
  <li>是否存在性能/安全隐患</li>
  <li>文档/注释是否更新</li>
</ul>

<hr />

<h2 id="四ci-与自动化建议概要这个我自己也没懂其实还在学习">四、CI 与自动化建议（概要）这个我自己也没懂，其实，还在学习</h2>

<p>建议在 <code class="language-plaintext highlighter-rouge">main</code>/<code class="language-plaintext highlighter-rouge">develop</code> 的 PR 检查中加入以下 CI：</p>

<ul>
  <li>代码风格：<code class="language-plaintext highlighter-rouge">black</code>（Python）、<code class="language-plaintext highlighter-rouge">Prettier</code>（JS）</li>
  <li>静态检查：<code class="language-plaintext highlighter-rouge">flake8</code>（Python）、<code class="language-plaintext highlighter-rouge">ESLint</code>（JS）</li>
  <li>测试：单元测试、关键集成测试</li>
  <li>构建或类型检查：<code class="language-plaintext highlighter-rouge">mypy</code>（可选）、<code class="language-plaintext highlighter-rouge">tsc</code>（如使用 TS）</li>
</ul>

<p>可用动作：<code class="language-plaintext highlighter-rouge">.github/workflows/ci.yml</code> 配置自动在每个 PR 运行上述检查并把结果作为合并前必须通过的状态检查。</p>

<hr />

<h2 id="五分支与版本管理实战示例完整流程">五、分支与版本管理实战示例（完整流程）</h2>

<p>场景：你完成了登录功能，需要把它合并到主线并发布到测试环境。</p>

<p>流程：</p>

<ol>
  <li>本地创建 feature 分支并开发：</li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout <span class="nt">-b</span> feature/login-oauth
<span class="c"># 开发、提交多次</span>
git push <span class="nt">-u</span> origin feature/login-oauth
</code></pre></div></div>

<ol>
  <li>
    <p>打开 GitHub 创建 PR（目标分支 <code class="language-plaintext highlighter-rouge">develop</code> 或 <code class="language-plaintext highlighter-rouge">main</code>），填写 PR 模板。</p>
  </li>
  <li>
    <p>CI 运行，审查者 review 并提出修改意见 → 按照建议修复并 push。</p>
  </li>
  <li>
    <p>CI 全部通过并获得审批，合并方式选择 <code class="language-plaintext highlighter-rouge">Squash and merge</code>（使历史清晰）。</p>
  </li>
  <li>
    <p>若合并到 <code class="language-plaintext highlighter-rouge">main</code>，在合并后打 tag 发布：</p>
  </li>
</ol>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout main
git pull origin main
git tag <span class="nt">-a</span> v1.2.0 <span class="nt">-m</span> <span class="s2">"Release v1.2.0"</span>
git push origin v1.2.0
</code></pre></div></div>

<ol>
  <li>若使用 <code class="language-plaintext highlighter-rouge">develop</code>，请确保把变更合并回 <code class="language-plaintext highlighter-rouge">main</code>（并发 release 流程）。</li>
</ol>

<hr />

<h2 id="六最佳实践与常见问题">六、最佳实践与常见问题</h2>

<ul>
  <li>保持分支短小，频繁与主线同步，减少冲突成本。</li>
  <li>每次 PR 聚焦单一目的（Bug 修复、一个 feature、重构），避免“大而全”的 PR。</li>
  <li>对二进制/大文件使用 Git LFS 或将其置于模型仓库/对象存储，不要直接放到 Git 仓库中。</li>
  <li>对数据与模型（&gt;100MB）使用外部存储，并在仓库中提供下载脚本或配置说明。</li>
</ul>

<p>常见问题：</p>

<ul>
  <li>Q：合并冲突太多怎么办？
    <ul>
      <li>A：把主线改动拉到本地分支（<code class="language-plaintext highlighter-rouge">git merge origin/main</code>），按文件逐一解决，鼓励小步提交与更频繁的合并。</li>
    </ul>
  </li>
  <li>Q：谁可以合并 PR？
    <ul>
      <li>A：通过分支保护设置（Require approvals）来限制，通常要求至少一位有写权限的 reviewer 批准。</li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="七附常用-git-命令速查表">七、附：常用 Git 命令速查表</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># 克隆
git clone &lt;repo&gt;

# 查看远程
git remote -v

# 创建并切换分支
git checkout -b feature/xxx

# 提交
git add .
git commit -m "feat: ..."

# 推送分支
git push -u origin feature/xxx

# 合并远端 main 到当前分支
git fetch origin
git merge origin/main

# 删除远端分支
git push origin --delete feature/old
</code></pre></div></div>

<ul>
  <li>剩下的看看git使用指南+配套大模型问问得了，够用了。</li>
</ul>

<hr />]]></content><author><name></name></author><category term="notes" /><category term="team" /><category term="workflow" /><summary type="html"><![CDATA[WenZhenGuardian 团队开发规范 一、分支规范 ✔ 默认分支]]></summary></entry><entry><title type="html">项目复盘怎么写</title><link href="https://bosprimigenious.site/blog/project-review/" rel="alternate" type="text/html" title="项目复盘怎么写" /><published>2025-10-19T12:00:00+00:00</published><updated>2025-10-19T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/project-review</id><content type="html" xml:base="https://bosprimigenious.site/blog/project-review/"><![CDATA[<h1 id="项目复盘怎么写">项目复盘怎么写</h1>

<p>项目复盘不是流水账。好的复盘应该让别人快速看懂：你做了什么、为什么这样做、遇到了什么问题、最后学到了什么。</p>

<h2 id="推荐结构">推荐结构</h2>

<p>可以按这个模板写：</p>

<pre><code class="language-txt">1. 项目背景
2. 技术栈
3. 我的职责
4. 核心功能
5. 难点与解决方案
6. 最终效果
7. 反思与改进
</code></pre>

<h2 id="项目背景">项目背景</h2>

<p>背景不用写太长，重点回答：</p>

<ul>
  <li>这个项目解决什么问题？</li>
  <li>使用者是谁？</li>
  <li>为什么需要做？</li>
</ul>

<p>例如：为了降低团队开发规范执行成本，做一个自动检查提交和分支规则的工具。</p>

<h2 id="我的职责">我的职责</h2>

<p>不要只写“参与开发”。可以写得具体一点：</p>

<ul>
  <li>负责前端页面搭建。</li>
  <li>负责登录和权限模块。</li>
  <li>负责后端接口设计。</li>
  <li>负责 CI 和部署脚本。</li>
</ul>

<p>具体职责能体现个人贡献。</p>

<h2 id="难点写法">难点写法</h2>

<p>难点最好按“问题 -&gt; 分析 -&gt; 方案 -&gt; 结果”写。</p>

<p>示例：</p>

<pre><code class="language-txt">问题：项目卡片图片高度不一致，导致列表布局跳动。
分析：图片原始尺寸不统一，缺少固定比例容器。
方案：使用 aspect-ratio 固定 16:9，并用 object-fit: cover。
结果：卡片高度稳定，页面扫描体验更好。
</code></pre>

<h2 id="反思不要空">反思不要空</h2>

<p>反思可以写：</p>

<ul>
  <li>哪些设计后期证明是正确的。</li>
  <li>哪些地方可以更早抽象。</li>
  <li>哪些流程应该自动化。</li>
  <li>如果重做一次会怎么改。</li>
</ul>

<h2 id="最终建议">最终建议</h2>

<p>项目复盘要少写口号，多写事实。越具体，越能体现工程能力。</p>]]></content><author><name></name></author><category term="notes" /><category term="project" /><category term="review" /><summary type="html"><![CDATA[项目复盘怎么写]]></summary></entry><entry><title type="html">调试问题的基本方法</title><link href="https://bosprimigenious.site/blog/debugging/" rel="alternate" type="text/html" title="调试问题的基本方法" /><published>2025-09-03T12:00:00+00:00</published><updated>2025-09-03T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/debugging</id><content type="html" xml:base="https://bosprimigenious.site/blog/debugging/"><![CDATA[<h1 id="调试问题的基本方法">调试问题的基本方法</h1>

<p>调试不是靠感觉乱改。越复杂的问题，越要先缩小范围，再验证假设。</p>

<h2 id="先复现">先复现</h2>

<p>不能稳定复现的问题，很难真正修好。先记录：</p>

<ul>
  <li>在哪个页面或命令中出现。</li>
  <li>输入了什么数据。</li>
  <li>期望结果是什么。</li>
  <li>实际结果是什么。</li>
  <li>控制台或日志有没有报错。</li>
</ul>

<p>复现步骤越短，问题越容易定位。</p>

<h2 id="看第一处错误">看第一处错误</h2>

<p>很多报错会连锁出现。不要只看最后一行，先找第一处异常。</p>

<p>前端常看：</p>

<ul>
  <li>浏览器 Console</li>
  <li>Network 请求</li>
  <li>Vue / React devtools</li>
</ul>

<p>后端常看：</p>

<ul>
  <li>服务日志</li>
  <li>请求参数</li>
  <li>数据库记录</li>
  <li>环境变量</li>
</ul>

<h2 id="二分定位">二分定位</h2>

<p>如果不知道哪次改动引入了问题，可以用二分思路：</p>

<ul>
  <li>回到上一个正常版本。</li>
  <li>一半一半恢复改动。</li>
  <li>找到最小出错范围。</li>
</ul>

<p>Git 里也可以用 <code class="language-plaintext highlighter-rouge">git bisect</code>，但日常手动二分也很有效。</p>

<h2 id="加日志要有信息量">加日志要有信息量</h2>

<p>不要只写：</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">here</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<p>更好的写法：</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">submit payload</span><span class="dl">"</span><span class="p">,</span> <span class="nx">payload</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">api response</span><span class="dl">"</span><span class="p">,</span> <span class="nx">response</span><span class="p">);</span>
</code></pre></div></div>

<p>日志要能回答“程序现在拿到了什么数据”。</p>

<h2 id="每次只改一个变量">每次只改一个变量</h2>

<p>调试时一次改太多东西，很难知道到底是哪一处生效。先提出假设，再做最小修改验证。</p>

<h2 id="修完要补记录">修完要补记录</h2>

<p>建议在 PR 或提交信息里写清楚：</p>

<ul>
  <li>问题现象</li>
  <li>根因</li>
  <li>修复方式</li>
  <li>验证方法</li>
</ul>

<p>这样下次遇到类似问题时，可以直接查历史。</p>]]></content><author><name></name></author><category term="notes" /><category term="debugging" /><category term="workflow" /><summary type="html"><![CDATA[调试问题的基本方法]]></summary></entry><entry><title type="html">API 接口设计笔记</title><link href="https://bosprimigenious.site/blog/api-design/" rel="alternate" type="text/html" title="API 接口设计笔记" /><published>2025-08-14T12:00:00+00:00</published><updated>2025-08-14T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/api-design</id><content type="html" xml:base="https://bosprimigenious.site/blog/api-design/"><![CDATA[<h1 id="api-接口设计笔记">API 接口设计笔记</h1>

<p>接口设计最重要的是稳定和清楚。前后端协作时，接口文档写得越模糊，联调时越容易互相猜。</p>

<h2 id="url-命名">URL 命名</h2>

<p>资源用名词，不要用动词堆路径：</p>

<pre><code class="language-txt">GET    /api/projects
GET    /api/projects/:id
POST   /api/projects
PATCH  /api/projects/:id
DELETE /api/projects/:id
</code></pre>

<p>动作由 HTTP 方法表达，路径表达资源。</p>

<h2 id="请求参数">请求参数</h2>

<p>列表查询常见参数：</p>

<pre><code class="language-txt">page=1
pageSize=20
keyword=xxx
category=frontend
</code></pre>

<p>复杂筛选条件要提前约定字段名和类型，不要等联调时临时加。</p>

<h2 id="响应格式">响应格式</h2>

<p>建议统一结构：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"code"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ok"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>分页可以这样：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"code"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w">
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ok"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"items"</span><span class="p">:</span><span class="w"> </span><span class="p">[],</span><span class="w">
    </span><span class="nl">"total"</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span><span class="p">,</span><span class="w">
    </span><span class="nl">"page"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
    </span><span class="nl">"pageSize"</span><span class="p">:</span><span class="w"> </span><span class="mi">20</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="错误处理">错误处理</h2>

<p>错误信息要能帮助定位问题：</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"code"</span><span class="p">:</span><span class="w"> </span><span class="mi">40001</span><span class="p">,</span><span class="w">
  </span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"invalid project title"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>不要只返回 <code class="language-plaintext highlighter-rouge">error</code> 或 <code class="language-plaintext highlighter-rouge">failed</code>。</p>

<h2 id="字段命名">字段命名</h2>

<p>同一个项目里要统一风格：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">camelCase</code>：<code class="language-plaintext highlighter-rouge">createdAt</code></li>
  <li><code class="language-plaintext highlighter-rouge">snake_case</code>：<code class="language-plaintext highlighter-rouge">created_at</code></li>
</ul>

<p>前端项目常用 <code class="language-plaintext highlighter-rouge">camelCase</code>，数据库常用 <code class="language-plaintext highlighter-rouge">snake_case</code>。如果需要转换，最好在接口层统一处理。</p>

<h2 id="文档最少写什么">文档最少写什么</h2>

<ul>
  <li>URL</li>
  <li>方法</li>
  <li>请求参数</li>
  <li>响应示例</li>
  <li>错误码</li>
  <li>权限要求</li>
</ul>

<p>接口不是后端一个人的东西，而是前后端共同维护的契约。</p>]]></content><author><name></name></author><category term="notes" /><category term="api" /><category term="backend" /><summary type="html"><![CDATA[API 接口设计笔记]]></summary></entry><entry><title type="html">MarkDown 介绍</title><link href="https://bosprimigenious.site/blog/markdown/" rel="alternate" type="text/html" title="MarkDown 介绍" /><published>2025-07-08T12:00:00+00:00</published><updated>2025-07-08T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/markdown</id><content type="html" xml:base="https://bosprimigenious.site/blog/markdown/"><![CDATA[<h1 id="markdown-零基础教学笔记">Markdown 零基础教学笔记</h1>

<p>Markdown 是一种轻量级的标记语言，常用于写作文档、博客、技术文档等。其语法简洁，易于学习，广泛应用于 GitHub、博客、论坛等平台。</p>

<h2 id="一基本语法">一、基本语法</h2>

<h3 id="1-标题">1. 标题</h3>

<p>Markdown 使用 <code class="language-plaintext highlighter-rouge">#</code> 来表示标题。<code class="language-plaintext highlighter-rouge">#</code> 的数量决定了标题的级别。</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gh"># 一级标题</span>

<span class="gu">## 二级标题</span>

<span class="gu">### 三级标题</span>

<span class="gu">#### 四级标题</span>

<span class="gu">##### 五级标题</span>

<span class="gu">###### 六级标题</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="notes" /><category term="markdown" /><summary type="html"><![CDATA[Markdown 零基础教学笔记]]></summary></entry><entry><title type="html">Python 虚拟环境笔记</title><link href="https://bosprimigenious.site/blog/python-env/" rel="alternate" type="text/html" title="Python 虚拟环境笔记" /><published>2025-07-08T12:00:00+00:00</published><updated>2025-07-08T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/python-env</id><content type="html" xml:base="https://bosprimigenious.site/blog/python-env/"><![CDATA[<h1 id="python-虚拟环境笔记">Python 虚拟环境笔记</h1>

<p>Python 项目最常见的问题之一是依赖混乱。虚拟环境的作用就是把不同项目的依赖隔离开，避免 A 项目升级包以后把 B 项目搞坏。</p>

<h2 id="创建虚拟环境">创建虚拟环境</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python <span class="nt">-m</span> venv .venv
</code></pre></div></div>

<p>推荐把虚拟环境放在项目根目录，命名为 <code class="language-plaintext highlighter-rouge">.venv</code>。</p>

<h2 id="激活环境">激活环境</h2>

<p>macOS / Linux：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">source</span> .venv/bin/activate
</code></pre></div></div>

<p>Windows PowerShell：</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">.</span><span class="n">\.venv\Scripts\Activate.ps1</span><span class="w">
</span></code></pre></div></div>

<p>激活后，终端前面通常会出现 <code class="language-plaintext highlighter-rouge">(.venv)</code>。</p>

<h2 id="安装依赖">安装依赖</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>requests
pip <span class="nb">install</span> <span class="nt">-r</span> requirements.txt
</code></pre></div></div>

<p>保存依赖：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip freeze <span class="o">&gt;</span> requirements.txt
</code></pre></div></div>

<h2 id="退出环境">退出环境</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>deactivate
</code></pre></div></div>

<h2 id="常见问题">常见问题</h2>

<h3 id="pip-装到了系统环境">pip 装到了系统环境</h3>

<p>先确认：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>which python
which pip
</code></pre></div></div>

<p>如果路径不在 <code class="language-plaintext highlighter-rouge">.venv</code> 里，说明虚拟环境没有激活。</p>

<h3 id="requirements-太乱">requirements 太乱</h3>

<p><code class="language-plaintext highlighter-rouge">pip freeze</code> 会把所有间接依赖也写进去。小项目可以接受，大项目建议使用 <code class="language-plaintext highlighter-rouge">pyproject.toml</code>、<code class="language-plaintext highlighter-rouge">uv</code> 或 Poetry 管理依赖。</p>

<h3 id="python-版本不一致">Python 版本不一致</h3>

<p>虚拟环境不会自动解决 Python 解释器版本问题。创建环境前要先确认：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python <span class="nt">--version</span>
</code></pre></div></div>

<h2 id="项目建议">项目建议</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">.venv/</code> 加到 <code class="language-plaintext highlighter-rouge">.gitignore</code>。</li>
  <li>提交 <code class="language-plaintext highlighter-rouge">requirements.txt</code> 或 <code class="language-plaintext highlighter-rouge">pyproject.toml</code>。</li>
  <li>README 写清楚 Python 版本和启动命令。</li>
  <li>CI 中也按同样步骤安装依赖。</li>
</ul>

<p>环境问题越早规范，后面协作越省时间。</p>]]></content><author><name></name></author><category term="notes" /><category term="python" /><category term="environment" /><summary type="html"><![CDATA[Python 虚拟环境笔记]]></summary></entry><entry><title type="html">Npm 使用指南</title><link href="https://bosprimigenious.site/blog/npm/" rel="alternate" type="text/html" title="Npm 使用指南" /><published>2025-07-07T12:00:00+00:00</published><updated>2025-07-07T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/npm</id><content type="html" xml:base="https://bosprimigenious.site/blog/npm/"><![CDATA[<h1 id="npm-使用笔记">npm 使用笔记</h1>

<h2 id="一npm-核心概念">一、npm 核心概念</h2>

<h3 id="1-包管理结构">1. 包管理结构</h3>

<ul>
  <li><strong>项目目录 (Project Directory)</strong>：包含 <code class="language-plaintext highlighter-rouge">package.json</code> 文件的文件夹。</li>
  <li><strong>node_modules 文件夹</strong>：存放项目依赖包的文件夹。</li>
  <li><strong>package.json 文件</strong>：记录项目的元数据、依赖包、脚本等信息。</li>
</ul>

<h3 id="2-安装与管理依赖">2. 安装与管理依赖</h3>

<ul>
  <li><strong>安装项目依赖</strong>：<code class="language-plaintext highlighter-rouge">npm install</code>，安装 <code class="language-plaintext highlighter-rouge">package.json</code> 中列出的所有依赖。</li>
  <li><strong>安装指定包</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt;</code>，安装一个或多个包，并将它们加入到 <code class="language-plaintext highlighter-rouge">node_modules</code>。</li>
  <li><strong>安装指定版本的包</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt;@&lt;版本号&gt;</code>，如 <code class="language-plaintext highlighter-rouge">npm install react@17.0.0</code>。</li>
  <li><strong>保存到依赖列表</strong>：使用 <code class="language-plaintext highlighter-rouge">--save</code>（默认）或 <code class="language-plaintext highlighter-rouge">--save-dev</code> 标志。
    <ul>
      <li><code class="language-plaintext highlighter-rouge">--save</code>：将包作为生产依赖安装。</li>
      <li><code class="language-plaintext highlighter-rouge">--save-dev</code>：将包作为开发依赖安装。</li>
    </ul>
  </li>
</ul>

<h3 id="3-升级与卸载依赖">3. 升级与卸载依赖</h3>

<ul>
  <li><strong>升级所有依赖</strong>：<code class="language-plaintext highlighter-rouge">npm update</code>，根据 <code class="language-plaintext highlighter-rouge">package.json</code> 更新所有依赖包。</li>
  <li><strong>卸载依赖</strong>：<code class="language-plaintext highlighter-rouge">npm uninstall &lt;包名&gt;</code>，卸载指定的依赖包。</li>
</ul>

<h2 id="二常用命令行操作">二、常用命令行操作</h2>

<h3 id="1-安装与启动项目">1. 安装与启动项目</h3>

<ul>
  <li><strong>初始化项目</strong>：<code class="language-plaintext highlighter-rouge">npm init</code> 或 <code class="language-plaintext highlighter-rouge">npm init -y</code>（跳过交互式初始化，使用默认配置）。</li>
  <li><strong>启动本地开发服务器</strong>：<code class="language-plaintext highlighter-rouge">npm start</code>，通常会启动 <code class="language-plaintext highlighter-rouge">package.json</code> 中的 <code class="language-plaintext highlighter-rouge">start</code> 脚本。</li>
</ul>

<h3 id="2-npm-脚本">2. npm 脚本</h3>

<ul>
  <li><strong>运行脚本</strong>：<code class="language-plaintext highlighter-rouge">npm run &lt;script-name&gt;</code>，例如运行 <code class="language-plaintext highlighter-rouge">npm run build</code> 或 <code class="language-plaintext highlighter-rouge">npm run test</code>。</li>
  <li><strong>查看脚本列表</strong>：<code class="language-plaintext highlighter-rouge">npm run</code>，列出所有可执行的脚本。</li>
</ul>

<h3 id="3-安装开发依赖与生产依赖">3. 安装开发依赖与生产依赖</h3>

<ul>
  <li><strong>安装开发依赖</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt; --save-dev</code>，例如安装 <code class="language-plaintext highlighter-rouge">webpack</code>。</li>
  <li><strong>安装生产依赖</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt; --save</code> 或不带任何标志。</li>
</ul>

<h3 id="4-缓存操作">4. 缓存操作</h3>

<ul>
  <li><strong>清除缓存</strong>：<code class="language-plaintext highlighter-rouge">npm cache clean --force</code>，清除 npm 缓存。</li>
</ul>

<h2 id="三npm-高级使用笔记">三、npm 高级使用笔记</h2>

<h3 id="1-版本管理">1. 版本管理</h3>

<ul>
  <li><strong>安装最新版本</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt;@latest</code>，安装最新版本的包。</li>
  <li><strong>查看当前安装包的版本</strong>：<code class="language-plaintext highlighter-rouge">npm list &lt;包名&gt;</code>，查看已安装的包及其版本。</li>
  <li><strong>查看全局安装的包</strong>：<code class="language-plaintext highlighter-rouge">npm list -g</code>。</li>
</ul>

<h3 id="2-本地和全局安装">2. 本地和全局安装</h3>

<ul>
  <li><strong>全局安装</strong>：<code class="language-plaintext highlighter-rouge">npm install -g &lt;包名&gt;</code>，全局安装工具包（例如 <code class="language-plaintext highlighter-rouge">eslint</code>, <code class="language-plaintext highlighter-rouge">typescript</code>）。</li>
  <li><strong>卸载全局包</strong>：<code class="language-plaintext highlighter-rouge">npm uninstall -g &lt;包名&gt;</code>。</li>
</ul>

<h3 id="3-版本回退与修复">3. 版本回退与修复</h3>

<ul>
  <li><strong>安装指定版本的包</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt;@&lt;版本号&gt;</code>，回退到指定版本的包。</li>
  <li><strong>查看包的版本历史</strong>：<code class="language-plaintext highlighter-rouge">npm info &lt;包名&gt;</code>，查看包的版本信息和历史。</li>
</ul>

<h3 id="4-packagejson-配置">4. package.json 配置</h3>

<ul>
  <li><strong>指定依赖版本范围</strong>：在 <code class="language-plaintext highlighter-rouge">package.json</code> 中，依赖版本可以使用不同的符号：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">^</code>：允许自动安装小版本更新（例如 <code class="language-plaintext highlighter-rouge">^1.2.3</code> 可以安装 <code class="language-plaintext highlighter-rouge">1.x.x</code> 版本）。</li>
      <li><code class="language-plaintext highlighter-rouge">~</code>：只允许安装修复版本更新（例如 <code class="language-plaintext highlighter-rouge">~1.2.3</code> 可以安装 <code class="language-plaintext highlighter-rouge">1.2.x</code> 版本）。</li>
      <li><code class="language-plaintext highlighter-rouge">*</code>：允许安装任意版本。</li>
      <li><code class="language-plaintext highlighter-rouge">&gt;=</code>：指定版本及其以上版本。</li>
      <li><code class="language-plaintext highlighter-rouge">&lt;=</code>：指定版本及其以下版本。</li>
    </ul>
  </li>
</ul>

<h3 id="5-发布与管理-npm-包">5. 发布与管理 npm 包</h3>

<ul>
  <li><strong>发布到 npm 仓库</strong>：
    <ol>
      <li>使用 <code class="language-plaintext highlighter-rouge">npm login</code> 登录 npm 帐号。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">npm publish</code> 发布包。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">npm version &lt;new-version&gt;</code> 更新版本号。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">npm deprecate &lt;包名&gt;@&lt;版本&gt;</code> 标记不再使用的版本。</li>
    </ol>
  </li>
</ul>

<h3 id="6-npm-模块的依赖管理">6. npm 模块的依赖管理</h3>

<ul>
  <li><strong>查看依赖树</strong>：<code class="language-plaintext highlighter-rouge">npm ls</code>，查看项目中所有安装的依赖和子依赖。</li>
  <li><strong>查看依赖的包信息</strong>：<code class="language-plaintext highlighter-rouge">npm info &lt;包名&gt;</code>，查看包的详细信息（例如版本、作者、文档链接等）。</li>
</ul>

<h2 id="四常用配置命令">四、常用配置命令</h2>

<h3 id="1-配置-npm-默认参数">1. 配置 npm 默认参数</h3>

<ul>
  <li><strong>更改默认的 registry</strong>：<code class="language-plaintext highlighter-rouge">npm config set registry &lt;新地址&gt;</code>，更改默认的 npm registry。</li>
  <li><strong>查看配置</strong>：<code class="language-plaintext highlighter-rouge">npm config list</code>，列出当前的 npm 配置。</li>
  <li><strong>更改默认的包缓存路径</strong>：<code class="language-plaintext highlighter-rouge">npm config set cache &lt;路径&gt;</code>，指定缓存目录。</li>
</ul>

<h3 id="2-配置项目脚本">2. 配置项目脚本</h3>

<ul>
  <li><strong>指定 npm start 脚本</strong>：在 <code class="language-plaintext highlighter-rouge">package.json</code> 文件的 <code class="language-plaintext highlighter-rouge">scripts</code> 部分，指定 <code class="language-plaintext highlighter-rouge">start</code> 脚本。</li>
</ul>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"scripts"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"start"</span><span class="p">:</span><span class="w"> </span><span class="s2">"node app.js"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"build"</span><span class="p">:</span><span class="w"> </span><span class="s2">"webpack"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h3 id="3-配置安装的路径">3. 配置安装的路径</h3>

<ul>
  <li><strong>指定安装包的路径</strong>：<code class="language-plaintext highlighter-rouge">npm install &lt;包名&gt; --prefix &lt;路径&gt;</code>，将包安装到指定目录。</li>
</ul>

<h2 id="五npm-性能优化">五、npm 性能优化</h2>

<p>并行安装依赖：使用 <code class="language-plaintext highlighter-rouge">npm ci</code> 来更快地安装依赖，尤其是用于 <code class="language-plaintext highlighter-rouge">CI/CD</code> 环境。</p>

<p>离线安装：使用 <code class="language-plaintext highlighter-rouge">npm install --offline</code>，仅使用缓存中的包进行安装。</p>

<h2 id="六整理建议">六、整理建议</h2>

<p>使用 <code class="language-plaintext highlighter-rouge">npm audit</code> 来检测项目的安全性，确保依赖项没有已知的漏洞。</p>

<p>使用 <code class="language-plaintext highlighter-rouge">npm outdated</code> 来检查是否有过时的依赖，确保项目使用最新版本的包。</p>

<p>使用 <code class="language-plaintext highlighter-rouge">npm ci</code> 来进行自动化部署，它比 <code class="language-plaintext highlighter-rouge">npm install</code> 更加快速且可靠。</p>

<h2 id="选读">选读</h2>

<p><code class="language-plaintext highlighter-rouge">npm </code>官方文档：<code class="language-plaintext highlighter-rouge">https://docs.npmjs.com</code></p>

<p><code class="language-plaintext highlighter-rouge">npm </code>使用最佳实践：保持 <code class="language-plaintext highlighter-rouge">package.json</code> 的清晰与简洁，避免多余的依赖和重复的版本范围。</p>]]></content><author><name></name></author><category term="notes" /><category term="npm" /><category term="tools" /><summary type="html"><![CDATA[npm 使用笔记]]></summary></entry><entry><title type="html">Git 使用指南</title><link href="https://bosprimigenious.site/blog/git/" rel="alternate" type="text/html" title="Git 使用指南" /><published>2025-07-06T12:00:00+00:00</published><updated>2025-07-06T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/git</id><content type="html" xml:base="https://bosprimigenious.site/blog/git/"><![CDATA[<h1 id="git-使用笔记">Git 使用笔记</h1>

<h2 id="一git-核心概念">一、Git 核心概念</h2>

<h3 id="1-仓库结构">1. 仓库结构</h3>

<ul>
  <li><strong>工作区 (Working Tree)</strong>：当前操作的文件目录。</li>
  <li><strong>暂存区 (Staging Area)</strong>：存放已暂存修改的文件（通过 <code class="language-plaintext highlighter-rouge">git add</code>）。</li>
  <li><strong>版本库 (Repository)</strong>：存储所有提交的历史版本（通过 <code class="language-plaintext highlighter-rouge">git commit</code>）。</li>
</ul>

<h3 id="2-版本创建流程">2. 版本创建流程</h3>

<ol>
  <li><strong>工作区修改 → 暂存区</strong>
    <ul>
      <li>使用命令：<code class="language-plaintext highlighter-rouge">git add &lt;文件/目录&gt;</code>，如 <code class="language-plaintext highlighter-rouge">git add .</code> 或 <code class="language-plaintext highlighter-rouge">git add README.md</code>，将文件添加到暂存区。</li>
    </ul>
  </li>
  <li><strong>暂存区 → 版本库</strong>
    <ul>
      <li>使用命令：<code class="language-plaintext highlighter-rouge">git commit -m "版本描述"</code>，提交暂存区的修改并生成一个新版本。</li>
    </ul>
  </li>
</ol>

<h3 id="3-仓库同步操作">3. 仓库同步操作</h3>

<ul>
  <li><strong>推送到远程仓库</strong>：<code class="language-plaintext highlighter-rouge">git push</code></li>
  <li><strong>拉取远程仓库更新</strong>：<code class="language-plaintext highlighter-rouge">git pull</code></li>
  <li><strong>克隆远程仓库到本地</strong>：<code class="language-plaintext highlighter-rouge">git clone &lt;仓库地址&gt;</code></li>
  <li><strong>记得末尾的<code class="language-plaintext highlighter-rouge">.git</code></strong></li>
</ul>

<h2 id="二远程仓库操作">二、远程仓库操作</h2>

<h3 id="1-配置-ssh-密钥免密推送这个可以之间看gitee或者github上有写">1. 配置 SSH 密钥（免密推送）(这个可以之间看Gitee或者Github上有写)</h3>

<ul>
  <li>生成密钥：<code class="language-plaintext highlighter-rouge">ssh-keygen -t rsa -b 4096 -C "xxx@email.com"</code></li>
  <li>查看公钥：<code class="language-plaintext highlighter-rouge">cat ~/.ssh/id_rsa.pub</code></li>
  <li>测试连接：<code class="language-plaintext highlighter-rouge">ssh -T git@gitee.com</code> （如成功提示“Welcome to Gitee.com, YourName！”）</li>
</ul>

<h3 id="2-关联远程仓库推荐先用vscode登录github账号后再连接就不需要每次推送都输入密钥">2. 关联远程仓库（推荐先用vscode登录Github账号后再连接就不需要每次推送都输入密钥）</h3>

<ul>
  <li>查看当前关联的远程地址：<code class="language-plaintext highlighter-rouge">git remote -v</code></li>
  <li>设置远程地址：<code class="language-plaintext highlighter-rouge">git remote add origin &lt;远程仓库URL&gt;</code></li>
  <li>修改远程地址：<code class="language-plaintext highlighter-rouge">git remote set-url origin &lt;新URL&gt;</code></li>
</ul>

<h3 id="3-克隆远程仓库到本地">3. <strong>克隆远程仓库到本地</strong></h3>

<ul>
  <li>使用 <code class="language-plaintext highlighter-rouge">git clone</code> 命令从远程仓库获取代码：
<code class="language-plaintext highlighter-rouge">git clone</code> <远程仓库URL> <目标目录></目标目录></远程仓库URL></li>
</ul>

<h3 id="4-推送与拉取">4. 推送与拉取</h3>

<ul>
  <li>第一次推送并设置上游分支：<code class="language-plaintext highlighter-rouge">git push -u origin master</code></li>
  <li>后续推送：<code class="language-plaintext highlighter-rouge">git push</code></li>
  <li>拉取远程更新：<code class="language-plaintext highlighter-rouge">git pull</code></li>
</ul>

<h2 id="三常用命令行操作">三、常用命令行操作</h2>

<h3 id="1-目录管理">1. 目录管理</h3>

<ul>
  <li>创建单级目录：<code class="language-plaintext highlighter-rouge">mkdir myfolder</code>（感觉<code class="language-plaintext highlighter-rouge">New-Item</code>更加好用一点）</li>
  <li>递归创建多级目录（Linux/macOS）：<code class="language-plaintext highlighter-rouge">mkdir -p a/b/c</code>
    <ul>
      <li><strong>注意</strong>：PowerShell 不支持 <code class="language-plaintext highlighter-rouge">-p</code> 参数，需逐级创建。</li>
    </ul>
  </li>
  <li>创建文件：
    <ul>
      <li>PowerShell：<code class="language-plaintext highlighter-rouge">New-Item -Path "filename.txt" -ItemType File</code></li>
      <li>Bash：<code class="language-plaintext highlighter-rouge">echo "" &gt; filename.txt</code>（创建空文件）</li>
    </ul>
  </li>
</ul>

<h3 id="2-git-分支操作">2. Git 分支操作</h3>

<ul>
  <li>切换分支：<code class="language-plaintext highlighter-rouge">git checkout &lt;branch-name&gt;</code></li>
  <li>创建新分支并切换：<code class="language-plaintext highlighter-rouge">git checkout -b &lt;branch-name&gt;</code></li>
</ul>

<h2 id="四关键注意事项">四、关键注意事项</h2>

<ul>
  <li><strong>权限问题</strong>：推送和拉取操作需要有远程仓库的读写权限。对于私有项目，需配置 SSH 或使用账号密码。（见二、2.）</li>
  <li><strong>PowerShell 特性</strong>：
    <ul>
      <li><code class="language-plaintext highlighter-rouge">mkdir</code> 不支持 <code class="language-plaintext highlighter-rouge">-p</code> 参数，需要逐级创建目录。</li>
      <li>使用 <code class="language-plaintext highlighter-rouge">echo &gt; filename</code> 时，可能会出现“等待输入状态”，直接按回车即可。</li>
    </ul>
  </li>
</ul>

<h2 id="五操作流程图解">五、操作流程图解</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>工作区 → (git add) → 暂存区 → (git commit) → 版本库 → (git push) → 远程仓库
↑ |
└─── (git pull) ───────┘
</code></pre></div></div>

<h2 id="六整理建议">六、整理建议</h2>

<ul>
  <li>初次使用 Git 时，优先配置 SSH 密钥。</li>
  <li>修改文件后，严格按照 <code class="language-plaintext highlighter-rouge">add → commit → push</code> 流程操作。</li>
  <li>在 Linux 终端中创建多级目录时可以使用 <code class="language-plaintext highlighter-rouge">mkdir -p</code>，更为简便。</li>
</ul>

<h3 id="选读">*<strong><em>选读</em></strong></h3>

<h1 id="git-高阶使用笔记">Git 高阶使用笔记</h1>

<h2 id="一分支管理branch">一、分支管理（Branch）</h2>

<h3 id="1-创建和切换分支">1. 创建和切换分支</h3>

<h1 id="创建并切换到新分支">创建并切换到新分支</h1>

<p><code class="language-plaintext highlighter-rouge">git checkout -b dev</code></p>

<h1 id="切换到已有分支">切换到已有分支</h1>

<p><code class="language-plaintext highlighter-rouge">git checkout master</code></p>

<h3 id="2-查看分支">2. 查看分支</h3>

<p><code class="language-plaintext highlighter-rouge">git branch</code> 查看本地分支</p>

<p><code class="language-plaintext highlighter-rouge">git branch -r</code> 查看远程分支</p>

<p><code class="language-plaintext highlighter-rouge">git branch -a</code> 查看所有分支（本地 + 远程）</p>

<h3 id="3-删除分支">3. 删除分支</h3>

<p><code class="language-plaintext highlighter-rouge">git branch -d dev</code> 删除本地分支（已合并）</p>

<p><code class="language-plaintext highlighter-rouge">git branch -D dev</code> 强制删除本地分支</p>

<p><code class="language-plaintext highlighter-rouge">git push origin --delete dev</code> 删除远程分支</p>

<h3 id="4-分支合并">4. 分支合并</h3>

<h1 id="在-master-分支下合并-dev">在 master 分支下合并 dev</h1>

<p><code class="language-plaintext highlighter-rouge">git checkout master</code>
<code class="language-plaintext highlighter-rouge">git merge dev</code></p>

<h3 id="5-分支与远程关联">5. 分支与远程关联</h3>

<h1 id="将本地分支与远程同名分支建立关联">将本地分支与远程同名分支建立关联</h1>

<p><code class="language-plaintext highlighter-rouge">git push -u origin dev</code></p>

<h2 id="二版本回退与撤销">二、版本回退与撤销</h2>

<h3 id="1-查看提交记录">1. 查看提交记录</h3>

<p><code class="language-plaintext highlighter-rouge">git log</code> 查看提交历史</p>

<p><code class="language-plaintext highlighter-rouge">git log --oneline</code> 简洁显示历史记录</p>

<p><code class="language-plaintext highlighter-rouge">git log --graph</code> 可视化分支结构</p>

<h3 id="2-回退到上一个提交">2. 回退到上一个提交</h3>

<p><code class="language-plaintext highlighter-rouge">git reset --hard HEAD^</code> 回退一个版本</p>

<p><code class="language-plaintext highlighter-rouge">git reset --hard &lt;commit-id&gt;</code> 回退到指定提交</p>

<h3 id="3-撤销-add">3. 撤销 add</h3>

<p><code class="language-plaintext highlighter-rouge">git reset HEAD &lt;file&gt;</code> 把文件从暂存区移出工作区</p>

<h3 id="4-撤销修改">4. 撤销修改</h3>

<p><code class="language-plaintext highlighter-rouge">git checkout -- &lt;file&gt;</code> 放弃工作区的修改</p>

<h1 id="下面的没写完不想写了">下面的没写完，不想写了</h1>

<h2 id="三标签tag">三、标签（Tag）</h2>

<p><code class="language-plaintext highlighter-rouge">git tag v1.0</code> 创建标签
git tag -a v1.0 -m “说明” 带注释标签</p>

<p>git push origin v1.0
git push origin –tags # 推送所有标签</p>

<p>git tag -d v1.0
git push origin :refs/tags/v1.0 # 删除远程标签</p>

<p>四、忽略文件配置（.gitignore）
.gitignore 文件用于指定 Git 在提交时应忽略的文件和目录。</p>

<p>示例：
gitignore
复制
编辑</p>

<h1 id="忽略-node_modules-文件夹">忽略 node_modules 文件夹</h1>

<p>node_modules/</p>

<h1 id="忽略所有-log-文件">忽略所有 .log 文件</h1>

<p>*.log</p>

<h1 id="忽略所有-dist-文件夹">忽略所有 dist 文件夹</h1>

<p>dist/</p>

<h1 id="忽略所有临时文件">忽略所有临时文件</h1>

<p>*.tmp
五、Git Stash（临时存储）</p>

<ol>
  <li>保存当前修改
bash
复制
编辑
git stash # 保存未提交的修改
git stash save “描述” # 带描述地保存</li>
  <li>查看和恢复
bash
复制
编辑
git stash list # 查看所有 stash
git stash apply # 应用最近一次的 stash
git stash pop # 应用并删除最近的 stash
git stash apply stash@{1} # 应用指定 stash
六、解决冲突
当多个分支合并时若有文件内容冲突：</li>
</ol>

<p>Git 会标记冲突位置（«««&lt;、=======、»»»&gt;）</p>

<p>手动编辑文件解决冲突</p>

<p>重新添加到暂存区并提交：</p>

<p>bash
复制
编辑
git add <冲突文件>
git commit -m "解决合并冲突"
七、Git 常用配置命令
bash
复制
编辑</冲突文件></p>

<h1 id="配置用户名和邮箱提交作者">配置用户名和邮箱（提交作者）</h1>

<p>git config –global user.name “Your Name”
git config –global user.email “you@example.com”</p>

<h1 id="查看配置信息">查看配置信息</h1>

<p>git config –list</p>

<h1 id="设置默认编辑器">设置默认编辑器</h1>

<p>git config –global core.editor “code –wait” # VSCode</p>

<h1 id="设置默认分支名称git-228">设置默认分支名称（Git 2.28+）</h1>

<p>git config –global init.defaultBranch main
八、Git 状态和差异
bash
复制
编辑
git status # 查看当前文件状态
git diff # 比较工作区与暂存区差异
git diff –cached # 比较暂存区与版本库的差异
git diff HEAD # 比较工作区与最新提交的差异
九、Git 清理操作
bash
复制
编辑</p>

<h1 id="清除未追踪文件慎用">清除未追踪文件（慎用）</h1>

<p>git clean -f</p>

<h1 id="清除未追踪文件和目录">清除未追踪文件和目录</h1>

<p>git clean -fd</p>

<h1 id="清除-gitignore-中忽略的文件">清除 .gitignore 中忽略的文件</h1>

<p>git clean -fx
十、工作流建议
每个新功能或修复新建分支开发，避免在 master 或 main 上直接开发。</p>

<p>常用分支命名规范：</p>

<p>feature/功能名</p>

<p>bugfix/问题修复</p>

<p>hotfix/紧急修复</p>

<p>release/版本发布</p>

<p>提交信息清晰简洁，如：</p>

<p>makefile
复制
编辑
feat: 新增注册功能
fix: 修复登录页空白问题
refactor: 重构请求逻辑
十一、附录：Git 提交信息规范（Angular 风格）
类型 说明
feat 新功能
fix 修复 bug
docs 文档修改
style 格式修改，不影响功能
refactor 重构代码
test 添加测试
chore 构建流程、工具等辅助修改</p>]]></content><author><name></name></author><category term="notes" /><category term="git" /><category term="tools" /><summary type="html"><![CDATA[Git 使用笔记]]></summary></entry><entry><title type="html">Jekyll 与 al-folio 博客维护笔记</title><link href="https://bosprimigenious.site/blog/jekyll-al-folio/" rel="alternate" type="text/html" title="Jekyll 与 al-folio 博客维护笔记" /><published>2025-06-22T12:00:00+00:00</published><updated>2025-06-22T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/jekyll-al-folio</id><content type="html" xml:base="https://bosprimigenious.site/blog/jekyll-al-folio/"><![CDATA[<h1 id="jekyll-与-al-folio-博客维护笔记">Jekyll 与 al-folio 博客维护笔记</h1>

<p>这个站点基于 Jekyll 和 al-folio。日常维护主要是写 Markdown、调整 front matter、跑本地构建确认没有破坏页面。</p>

<h2 id="文章文件命名">文章文件命名</h2>

<p>文章放在 <code class="language-plaintext highlighter-rouge">_posts/</code>：</p>

<pre><code class="language-txt">_posts/2025-07-14-jekyll-al-folio.md
</code></pre>

<p>文件名格式是：</p>

<pre><code class="language-txt">YYYY-MM-DD-slug.md
</code></pre>

<p>日期会影响文章排序，slug 建议用英文，避免链接里出现编码问题。</p>

<h2 id="front-matter">front matter</h2>

<p>每篇文章开头都有一段 YAML：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<span class="na">layout</span><span class="pi">:</span> <span class="s">post</span>
<span class="na">title</span><span class="pi">:</span> <span class="s">文章标题</span>
<span class="na">date</span><span class="pi">:</span> <span class="s">2025-06-22 12:00:00</span>
<span class="na">tags</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">jekyll</span><span class="pi">,</span> <span class="nv">blog</span><span class="pi">]</span>
<span class="na">categories</span><span class="pi">:</span> <span class="s">notes</span>
<span class="na">permalink</span><span class="pi">:</span> <span class="s">/blog/example/</span>
<span class="nn">---</span>
</code></pre></div></div>

<p>其中：</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">layout</code> 决定页面模板。</li>
  <li><code class="language-plaintext highlighter-rouge">title</code> 是文章标题。</li>
  <li><code class="language-plaintext highlighter-rouge">date</code> 决定排序。</li>
  <li><code class="language-plaintext highlighter-rouge">tags</code> 用于标签聚合。</li>
  <li><code class="language-plaintext highlighter-rouge">permalink</code> 决定最终访问路径。</li>
</ul>

<h2 id="本地构建">本地构建</h2>

<p>常用命令：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundle <span class="nb">exec </span>jekyll build <span class="nt">--baseurl</span> /al-folio
</code></pre></div></div>

<p>构建通过后，再看 <code class="language-plaintext highlighter-rouge">_site/</code> 生成结果是否符合预期。</p>

<h2 id="写作建议">写作建议</h2>

<ul>
  <li>标题直接说主题，不要太抽象。</li>
  <li>一篇文章解决一个问题。</li>
  <li>命令用代码块包起来。</li>
  <li>重要步骤写清楚前提条件。</li>
  <li>遇到坑要写“现象、原因、解决方式”。</li>
</ul>

<h2 id="适合补充的内容">适合补充的内容</h2>

<ul>
  <li>工具使用笔记：Git、npm、Docker、Shell。</li>
  <li>项目复盘：背景、技术栈、难点、收获。</li>
  <li>环境配置：Node、Ruby、Python、数据库。</li>
  <li>团队协作规范：分支、提交、PR、CI。</li>
</ul>

<p>博客不是一次写完的文档，更像持续整理的知识库。先写能用的，再慢慢补细节。</p>]]></content><author><name></name></author><category term="notes" /><category term="jekyll" /><category term="al-folio" /><summary type="html"><![CDATA[Jekyll 与 al-folio 博客维护笔记]]></summary></entry><entry><title type="html">GitHub Actions CI 笔记</title><link href="https://bosprimigenious.site/blog/github-actions/" rel="alternate" type="text/html" title="GitHub Actions CI 笔记" /><published>2025-05-18T12:00:00+00:00</published><updated>2025-05-18T12:00:00+00:00</updated><id>https://bosprimigenious.site/blog/github-actions</id><content type="html" xml:base="https://bosprimigenious.site/blog/github-actions/"><![CDATA[<h1 id="github-actions-ci-笔记">GitHub Actions CI 笔记</h1>

<p>CI 的目标是让项目每次提交后自动检查。最基础的 CI 不需要很复杂，只要能跑格式化、lint、测试和构建，就已经能挡住很多低级问题。</p>

<h2 id="工作流文件位置">工作流文件位置</h2>

<p>GitHub Actions 的配置放在：</p>

<pre><code class="language-txt">.github/workflows/*.yml
</code></pre>

<p>例如：</p>

<pre><code class="language-txt">.github/workflows/ci.yml
</code></pre>

<h2 id="一个-node-项目的基础-ci">一个 Node 项目的基础 CI</h2>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">name</span><span class="pi">:</span> <span class="s">CI</span>

<span class="na">on</span><span class="pi">:</span>
  <span class="na">push</span><span class="pi">:</span>
    <span class="na">branches</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">main</span><span class="pi">]</span>
  <span class="na">pull_request</span><span class="pi">:</span>

<span class="na">jobs</span><span class="pi">:</span>
  <span class="na">test</span><span class="pi">:</span>
    <span class="na">runs-on</span><span class="pi">:</span> <span class="s">ubuntu-latest</span>
    <span class="na">steps</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
      <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/setup-node@v4</span>
        <span class="na">with</span><span class="pi">:</span>
          <span class="na">node-version</span><span class="pi">:</span> <span class="m">20</span>
          <span class="na">cache</span><span class="pi">:</span> <span class="s">npm</span>
      <span class="pi">-</span> <span class="na">run</span><span class="pi">:</span> <span class="s">npm ci</span>
      <span class="pi">-</span> <span class="na">run</span><span class="pi">:</span> <span class="s">npm run lint</span>
      <span class="pi">-</span> <span class="na">run</span><span class="pi">:</span> <span class="s">npm test</span>
      <span class="pi">-</span> <span class="na">run</span><span class="pi">:</span> <span class="s">npm run build</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">npm ci</code> 比 <code class="language-plaintext highlighter-rouge">npm install</code> 更适合 CI，因为它严格按 lockfile 安装。</p>

<h2 id="常见触发方式">常见触发方式</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">push</code>：推送到指定分支时触发。</li>
  <li><code class="language-plaintext highlighter-rouge">pull_request</code>：提交 PR 时触发。</li>
  <li><code class="language-plaintext highlighter-rouge">workflow_dispatch</code>：允许手动触发。</li>
  <li><code class="language-plaintext highlighter-rouge">schedule</code>：定时任务。</li>
</ul>

<h2 id="加缓存">加缓存</h2>

<p><code class="language-plaintext highlighter-rouge">actions/setup-node</code> 自带 npm 缓存能力：</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">with</span><span class="pi">:</span>
  <span class="na">node-version</span><span class="pi">:</span> <span class="m">20</span>
  <span class="na">cache</span><span class="pi">:</span> <span class="s">npm</span>
</code></pre></div></div>

<p>这能减少重复下载依赖的时间。</p>

<h2 id="分支保护">分支保护</h2>

<p>CI 真正有用，需要和分支保护配合：</p>

<ul>
  <li>main 分支禁止直接 push。</li>
  <li>PR 必须通过 CI。</li>
  <li>至少一个 reviewer approve。</li>
</ul>

<p>否则 CI 只是提示，不会真正阻止坏代码进入主分支。</p>

<h2 id="排错思路">排错思路</h2>

<p>CI 失败时先看第一处报错，不要只看最后一行。常见原因包括依赖版本不一致、环境变量缺失、测试依赖本地文件、脚本在 Linux 下路径大小写错误。</p>]]></content><author><name></name></author><category term="notes" /><category term="github-actions" /><category term="ci" /><summary type="html"><![CDATA[GitHub Actions CI 笔记]]></summary></entry></feed>