<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Spec - 分类 - 菠菜眾長</title><link>https://lruihao.cn/categories/spec/</link><description>Spec - 分类 - 菠菜眾長</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><managingEditor>1024@lruihao.cn (Lruihao)</managingEditor><webMaster>1024@lruihao.cn (Lruihao)</webMaster><lastBuildDate>Sat, 04 Feb 2023 16:04:42 +0800</lastBuildDate><atom:link href="https://lruihao.cn/categories/spec/" rel="self" type="application/rss+xml"/><item><title>中文技术文档的写作规范</title><link>https://lruihao.cn/posts/document-style-guide/</link><pubDate>Sat, 04 Feb 2023 16:04:42 +0800</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/document-style-guide/</guid><description><![CDATA[<blockquote>
<p>以下参考来源：阮一峰的 <a href="https://github.com/ruanyf/document-style-guide"target="_blank" rel="external nofollow noopener noreferrer">中文技术文档的写作规范<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
</blockquote>
<p>英语世界里，文档非常受重视，许多公司和组织都有自己的文档规范，清楚地规定写作要求，比如<a href="https://www.microsoftpressstore.com/store/microsoft-manual-of-style-9780735648715"target="_blank" rel="external nofollow noopener noreferrer">微软<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>、<a href="http://styleguide.mailchimp.com/"target="_blank" rel="external nofollow noopener noreferrer">MailChimp<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>、<a href="https://help.apple.com/asg/mac/2013/ASG_2013.pdf"target="_blank" rel="external nofollow noopener noreferrer">Apple<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>、<a href="https://www.amazon.com/dp/B003P8QDFU/ref=dp-kindle-redirect?_encoding=UTF8&amp;btkr=1"target="_blank" rel="external nofollow noopener noreferrer">Yahoo<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>、<a href="https://docs.docker.com/opensource/doc-style/"target="_blank" rel="external nofollow noopener noreferrer">docker<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>、<a href="https://struts.apache.org/docs/documentation-style-guide.html"target="_blank" rel="external nofollow noopener noreferrer">Struts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 等等（维基百科有一份完整的<a href="https://en.wikipedia.org/wiki/List_of_style_guides"target="_blank" rel="external nofollow noopener noreferrer">清单<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>）。<a href="https://github.com/ruanyf/document-style-guide/blob/master/docs/reference.md"target="_blank" rel="external nofollow noopener noreferrer">中文的<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>也有不少，但都不令人满意，要么太简单，要么不太适用。</p>
<p>对于开发者来说，在工作中也需要适当地产出一些技术文档，但是很多人都不知道怎么写文档，都是凭着感觉写。</p>
<p>对于开发的系统、软件而言，系统用词的准确性和统一性也显得十分重要。</p>
<p>参考上面的规范，于是有了下面一份中文技术文档的写作规范。</p>
<h2 id="标题">标题</h2>
<h3 id="层级">层级</h3>
<p>标题分为四级。</p>
<ul>
<li>一级标题：文章的标题</li>
<li>二级标题：文章主要部分的大标题</li>
<li>三级标题：二级标题下面一级的小标题</li>
<li>四级标题：三级标题下面某一方面的小标题</li>
</ul>
<p>下面是示例。</p>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># 一级标题
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl"><span class="gu">## 二级标题
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">### 三级标题
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">#### 四级标题</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>注：最多支持六级，但是同论文写作一样，层级太深，会使得整体显得杂乱无章，当确实需要更深层级时，应另起新篇单独论述。</p>
</blockquote>
<h3 id="原则">原则</h3>
<p>（1）一级标题下，不能直接出现三级标题。</p>
<p>示例：下面的文章结构，缺少二级标题。</p>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gh"># 一级标题
</span></span></span><span class="line"><span class="cl"><span class="gh"></span>
</span></span><span class="line"><span class="cl">### 三级标题</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）标题要避免孤立编号（即同级标题只有一个）。</p>
<p>示例：下面的文章结构，<code>二级标题 A</code>只包含一个三级标题，完全可以省略<code>三级标题 A</code>。</p>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## 二级标题 A
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">### 三级标题 A
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">## 二级标题 B</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）下级标题不重复上一级标题的名字。</p>
<p>示例：下面的文章结构，二级标题与下属的三级标题同名，建议避免。</p>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## 概述
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">### 概述</span></span></code></pre></td></tr></table>
</div>
</div><p>（4）谨慎使用四级标题，尽量避免出现，保持层级的简单，防止出现过于复杂的章节。</p>
<p>如果三级标题下有并列性的内容，建议只使用项目列表（Item list）。</p>
<p>示例：下面的结构二要好于结构一。结构一适用的场景，主要是较长篇幅的内容。</p>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">结构一
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 三级标题
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">#### 四级标题 A
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">#### 四级标题 B
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">#### 四级标题 C
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl">结构二
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 三级标题
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="ge">**</span>（1）A**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">**</span>（2）B**
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="ge">**</span>（3）C**</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="文本">文本</h2>
<h3 id="字间距">字间距</h3>
<p>（1）全角中文字符与半角英文字符之间，应有一个半角空格。</p>
<div class="highlight" id="id-6"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：本文介绍如何快速启动Windows系统。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：本文介绍如何快速启动 Windows 系统。</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）全角中文字符与半角阿拉伯数字之间，有没有半角空格都可，但必须保证风格统一，不能两种风格混杂。</p>
<div class="highlight" id="id-7"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">正确：2011年5月15日，我订购了5台笔记本电脑与10台平板电脑。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：2011 年 5 月 15 日，我订购了 5 台笔记本电脑与 10 台平板电脑。</span></span></code></pre></td></tr></table>
</div>
</div><p>半角的百分号，视同阿拉伯数字。</p>
<div class="highlight" id="id-8"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">正确：今年我国经济增长率是6.5%。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：今年我国经济增长率是 6.5%。</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）英文单位若不翻译，单位前的阿拉伯数字与单位符号之间，应留出适当的空隙。</p>
<div class="highlight" id="id-9"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例1：一部容量为 16 GB 的智能手机
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">例2：1 h = 60 min = 3,600 s</span></span></code></pre></td></tr></table>
</div>
</div><p>（4）半角英文字符和半角阿拉伯数字，与全角标点符号之间不留空格。</p>
<div class="highlight" id="id-10"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：他的电脑是 MacBook Air 。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：他的电脑是 MacBook Air。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="句子">句子</h3>
<p>（1）避免使用长句。</p>
<p>不包含任何标点符号的单个句子，或者以逗号分隔的句子构件，长度尽量保持在 20 个字以内；20 ～ 29 个字的句子，可以接受；30 ～ 39 个字的句子，语义必须明确，才能接受；多于 40 个字的句子，任何情况下都不能接受。</p>
<div class="highlight" id="id-11"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：本产品适用于从由一台服务器进行动作控制的单一节点结构到由多台服务器进行动作控制的并行处理程序结构等多种体系结构。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：本产品适用于多种体系结构。无论是由一台服务器（单一节点结构），还是由多台服务器（并行处理结构）进行动作控制，均可以使用本产品。</span></span></code></pre></td></tr></table>
</div>
</div><p>逗号分割的长句，总长度不应该超过 100 字或者正文的 3 行。</p>
<p>（2）尽量使用简单句和并列句，避免使用复合句。</p>
<div class="highlight" id="id-12"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">并列句：他昨天生病了，没有参加会议。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">复合句：那个昨天生病的人没有参加会议。</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）同样一个意思，尽量使用肯定句表达，不使用否定句表达。</p>
<div class="highlight" id="id-13"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：请确认没有接通装置的电源。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：请确认装置的电源已关闭。</span></span></code></pre></td></tr></table>
</div>
</div><p>（4）避免使用双重否定句。</p>
<div class="highlight" id="id-14"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：没有删除权限的用户，不能删除此文件。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：用户必须拥有删除权限，才能删除此文件。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="写作风格">写作风格</h3>
<p>（1）尽量不使用被动语态，改为使用主动语态。</p>
<div class="highlight" id="id-15"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：假如此软件尚未被安装，
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：假如尚未安装这个软件，</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）不使用非正式的语言风格。</p>
<div class="highlight" id="id-16"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：Lady Gaga 的演唱会真是酷毙了，从没看过这么给力的表演！！！
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：无法参加本次活动，我深感遗憾。</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）不使用冷僻、生造或者文言文的词语，而要使用现代汉语的常用表达方式。</p>
<div class="highlight" id="id-17"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：这是唯二的快速启动的方法。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：这是仅有的两种快速启动的方法。</span></span></code></pre></td></tr></table>
</div>
</div><p>（4）用对“的”、“地”、“得”。</p>
<div class="highlight" id="id-18"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">她露出了开心的笑容。
</span></span><span class="line"><span class="cl">（形容词＋的＋名词）
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">她开心地笑了。
</span></span><span class="line"><span class="cl">（副词＋地＋动词）
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">她笑得很开心。
</span></span><span class="line"><span class="cl">（动词＋得＋副词）</span></span></code></pre></td></tr></table>
</div>
</div><p>（5）使用代词时（比如“其”、“该”、“此”、“这”等词），必须明确指代的内容，保证只有一个含义。</p>
<div class="highlight" id="id-19"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：从管理系统可以监视中继系统和受其直接控制的分配系统。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：从管理系统可以监视两个系统：中继系统和受中继系统直接控制的分配系统。</span></span></code></pre></td></tr></table>
</div>
</div><p>（6）名词前不要使用过多的形容词。</p>
<div class="highlight" id="id-20"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：此设备的使用必须在接受过本公司举办的正式的设备培训的技师的指导下进行。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：此设备必须在技师的指导下使用，且指导技师必须接受过由本公司举办的正式设备培训。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="英文处理">英文处理</h3>
<p>（1）英文原文如果使用了复数形式，翻译成中文时，应该将其还原为单数形式。</p>
<div class="highlight" id="id-21"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">英文：...information stored in random access memory (RAMs)...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">中文：⋯⋯存储在随机存取存储器（RAM）里的信息⋯⋯</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）外文缩写可以使用半角圆点(<code>.</code>)表示缩写。</p>
<div class="highlight" id="id-22"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">U.S.A.
</span></span><span class="line"><span class="cl">Apple, Inc.</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）表示中文时，英文省略号（<code>...</code>）应改为中文省略号（<code>⋯⋯</code>）。</p>
<div class="highlight" id="id-23"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">英文：5 minutes later...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">中文：5 分钟过去了⋯⋯</span></span></code></pre></td></tr></table>
</div>
</div><p>（4）英文书名或电影名改用中文表达时，双引号应改为书名号。</p>
<div class="highlight" id="id-24"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">英文：He published an article entitled &#34;The Future of the Aviation&#34;.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">中文：他发表了一篇名为《航空业的未来》的文章。</span></span></code></pre></td></tr></table>
</div>
</div><p>（5）第一次出现英文词汇时，在括号中给出中文标注。此后再次出现时，直接使用英文缩写即可。</p>
<div class="highlight" id="id-25"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">IOC（International Olympic Committee，国际奥林匹克委员会）。这样定义后，便可以直接使用“IOC”了。</span></span></code></pre></td></tr></table>
</div>
</div><p>（6）专有名词中每个词第一个字母均应大写，非专有名词则不需要大写。</p>
<div class="highlight" id="id-26"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">“American Association of Physicists in Medicine”（美国医学物理学家协会）是专有名词，需要大写。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">“online transaction processing”（在线事务处理）不是专有名词，不应大写。</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="段落">段落</h2>
<h3 id="原则-1">原则</h3>
<ul>
<li>一个段落只能有一个主题，或一个中心句子。</li>
<li>段落的中心句子放在段首，对全段内容进行概述。后面陈述的句子为中心句子服务。</li>
<li>一个段落的长度不能超过七行，最佳段落长度小于等于四行。</li>
<li>段落的句子语气要使用陈述和肯定语气，避免使用感叹语气。</li>
<li>段落之间使用一个空行隔开。</li>
<li>段落开头不要留出空白字符。</li>
</ul>
<h3 id="引用">引用</h3>
<p>引用第三方内容时，应注明出处。</p>
<div class="highlight" id="id-27"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">One man’s constant is another man’s variable. — Alan Perlis</span></span></code></pre></td></tr></table>
</div>
</div><p>如果是全篇转载，请在全文开头显著位置注明作者和出处，并链接至原文。</p>
<div class="highlight" id="id-28"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">本文转载自 WikiQuote</span></span></code></pre></td></tr></table>
</div>
</div><p>使用外部图片时，必须在图片下方或文末标明来源。</p>
<div class="highlight" id="id-29"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">本文部分图片来自 Wikipedia</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="数值">数值</h2>
<h3 id="半角数字">半角数字</h3>
<p>阿拉伯数字一律使用半角形式，不得使用全角形式。</p>
<div class="highlight" id="id-30"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：这件商品的价格是１０００元。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：这件商品的价格是 1000 元。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="千分号">千分号</h3>
<p>数值为千位以上，应添加千分号（半角逗号）。</p>
<div class="highlight" id="id-31"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">XXX 公司的实收资本为 ￥1,258,000 人民币。</span></span></code></pre></td></tr></table>
</div>
</div><p>对于 4 位的数值，千分号是选用的，比如<code>1000</code>和<code>1,000</code>都可以接受。对于 4 位以上的数值，应添加千分号。</p>
<h3 id="货币">货币</h3>
<p>货币应为阿拉伯数字，并在数字前写出货币符号，或在数字后写出货币中文名称。</p>
<div class="highlight" id="id-32"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">$1,000
</span></span><span class="line"><span class="cl">1,000 美元</span></span></code></pre></td></tr></table>
</div>
</div><p>英文的货币名称，建议参考国际标准 <a href="https://en.wikipedia.org/wiki/ISO_4217"target="_blank" rel="external nofollow noopener noreferrer">ISO 4217<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>。</p>
<h3 id="数值范围">数值范围</h3>
<p>表示数值范围时，用波浪线（<code>～</code>）或一字线（<code>—</code>）连接。参见《标点符号》一节的“连接号”部分。</p>
<p>带有单位或百分号时，两个数字建议都要加上单位或百分号。</p>
<div class="highlight" id="id-33"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">132 kg～234 kg
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">67%～89%</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="变化程度的表示法">变化程度的表示法</h3>
<p>数字的增加要使用“增加了”、“增加到”。“了”表示增量，“到”表示定量。</p>
<div class="highlight" id="id-34"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">增加到过去的两倍
</span></span><span class="line"><span class="cl">（过去为一，现在为二）
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">增加了两倍
</span></span><span class="line"><span class="cl">（过去为一，现在为三）</span></span></code></pre></td></tr></table>
</div>
</div><p>数字的减少要使用“降低了”、“降低到”。“了”表示增量，“到”表示定量。</p>
<div class="highlight" id="id-35"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">降低到百分之八十
</span></span><span class="line"><span class="cl">（定额是一百，现在是八十）
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">降低了百分之八十
</span></span><span class="line"><span class="cl">（原来是一百，现在是二十）</span></span></code></pre></td></tr></table>
</div>
</div><p>不能用“降低 N 倍”或“减少 N 倍”的表示法，要用“降低百分之几”或“减少百分之几”。因为减少（或降低）一倍表示数值原来为一百，现在等于零。</p>
<h2 id="标点符号">标点符号</h2>
<h3 id="原则-2">原则</h3>
<p>（1）中文语句的标点符号，均应该采取全角符号，这样可以与全角文字保持视觉的一致。</p>
<p>（2）如果整句为英文，则该句使用英文/半角标点。</p>
<p>（3）句号、问号、叹号、逗号、顿号、分号和冒号不得出现在一行之首。</p>
<p>（4）点号（句号、逗号、顿号、分号、冒号）不得出现在标题的末尾，而标号（引号、括号、破折号、省略号、书名号、着重号、间隔号、叹号、问号）可以。</p>
<h3 id="句号">句号</h3>
<p>（1）中文语句的结尾处应该用全角句号（<code>。</code>）。</p>
<p>（2）句子末尾用括号加注时，句号应在括号之外。</p>
<div class="highlight" id="id-36"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：关于文件的输出，请参照第 1.3 节（见第 26 页。）
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：关于文件的输出，请参照第 1.3 节（见第 26 页）。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="逗号">逗号</h3>
<p>（1）逗号（<code>，</code>）表示句子内部的一般性停顿。</p>
<p>（2）注意避免“一逗到底”，即整个段落除了结尾，全部停顿都使用逗号。</p>
<h3 id="顿号">顿号</h3>
<p>（1）句子内部的并列词，应该用全角顿号(<code>、</code>) 分隔，而不用逗号，即使并列词是英语也是如此。</p>
<div class="highlight" id="id-37"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：我最欣赏的科技公司有 Google, Facebook, 腾讯, 阿里和百度等。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）英文句子中，并列词语之间使用半角逗号（<code>,</code>）分隔。</p>
<div class="highlight" id="id-38"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：Microsoft Office includes Word, Excel, PowerPoint, Outlook and other components.</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）中文句子内部的并列词，最后一个尽量使用（<code>和</code>）来连接，使句子读起来更加连贯，下面两个句子都可以，第二个更优。</p>
<div class="highlight" id="id-39"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">正确：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里，以及百度等。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="分号">分号</h3>
<p>（1）分号（<code>；</code>）表示复句内部并列分句之间的停顿。</p>
<h3 id="引号">引号</h3>
<p>（1）引用时，应该使用全角双引号（<code>“ ”</code>），注意前后双引号不同。</p>
<div class="highlight" id="id-40"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：许多人都认为客户服务的核心是“友好”和“专业”。</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）引号里面还要用引号时，外面一层用双引号，里面一层用单引号（<code>‘ ’</code>），注意前后单引号不同。</p>
<div class="highlight" id="id-41"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：鲍勃解释道：“我要放音乐，可萨利说，‘不行！’。”</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="括号">括号</h3>
<p>（1）补充说明时，使用全角圆括号（<code>（）</code>），括号前后不加空格。</p>
<div class="highlight" id="id-42"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：请确认所有的连接（电缆和接插件）均安装牢固。</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）几种括号的中英文名称。</p>
<table>
<thead>
<tr>
<th></th>
<th style="text-align:center">英文</th>
<th style="text-align:center">中文</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>{ }</code></td>
<td style="text-align:center">braces 或 curly brackets</td>
<td style="text-align:center">大括号</td>
</tr>
<tr>
<td><code>[ ]</code></td>
<td style="text-align:center">square brackets 或 brackets</td>
<td style="text-align:center">方括号</td>
</tr>
<tr>
<td><code>&lt; &gt;</code></td>
<td style="text-align:center">angled brackets</td>
<td style="text-align:center">尖括号</td>
</tr>
<tr>
<td><code>( )</code></td>
<td style="text-align:center">parentheses</td>
<td style="text-align:center">圆括号</td>
</tr>
</tbody>
</table>
<h3 id="冒号">冒号</h3>
<p>（1）全角冒号（<code>：</code>）常用在需要解释的词语后边，引出解释和说明。</p>
<div class="highlight" id="id-43"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：请确认以下几项内容：时间、地点、活动名称和来宾数量。</span></span></code></pre></td></tr></table>
</div>
</div><p>（2）表示时间时，应使用半角冒号（<code>:</code>）。</p>
<div class="highlight" id="id-44"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：早上 8:00</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="省略号">省略号</h3>
<p>（1）省略号（<code>⋯⋯</code>）表示语句未完、或者语气的不连续。</p>
<p>（2）省略号占两个汉字空间、包含六个省略点，不要使用<code>。。。</code>或<code>...</code>等非标准形式。</p>
<p>（3）省略号不应与“等”这个词一起使用。</p>
<div class="highlight" id="id-45"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：我们为会餐准备了香蕉、苹果、梨…等各色水果。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：我们为会餐准备了各色水果，有香蕉、苹果、梨⋯⋯
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：我们为会餐准备了香蕉、苹果、梨等各色水果。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="感叹号">感叹号</h3>
<p>（1）应该使用平静的语气叙述，尽量避免使用感叹号（<code>！</code>）。</p>
<p>（2）不得多个感叹号连用，比如<code>！！</code>和<code>!!!</code>。</p>
<h3 id="破折号">破折号</h3>
<p>（1）破折号<code>————</code>一般用于进一步解释。</p>
<p>（2）破折号应占两个汉字的位置。如果破折号本身只占一个汉字的位置，那么前后应该留出一个半角空格。</p>
<div class="highlight" id="id-46"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：直觉————尽管它并不总是可靠的————告诉我，这事可能出了些问题。
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">例句：直觉 —— 尽管它并不总是可靠的 —— 告诉我，这事可能出了些问题。</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="连接号">连接号</h3>
<p>（1）连接号用于连接两个类似的词。</p>
<p>（2）以下场合应该使用直线连接号（<code>-</code>），占一个半角字符的位置。</p>
<ul>
<li>两个名词的复合</li>
<li>图表编号</li>
</ul>
<div class="highlight" id="id-47"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：氧化-还原反应
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">例句：图 1-1</span></span></code></pre></td></tr></table>
</div>
</div><p>（3）数值范围（例如日期、时间或数字）应该使用波浪连接号（<code>～</code>）或一字号（<code>—</code>），占一个全角字符的位置。</p>
<div class="highlight" id="id-48"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：2009 年～2011 年</span></span></code></pre></td></tr></table>
</div>
</div><p>注意，波浪连接号前后两个值都建议加上单位。</p>
<p>（4）波浪连接号也可以用汉字“至”代替。</p>
<div class="highlight" id="id-49"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">例句：周围温度：-20 °C 至 -10 °C</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="文档体系">文档体系</h2>
<h3 id="结构">结构</h3>
<p>软件手册是一部完整的书，建议采用下面的结构。</p>
<ul>
<li><strong>简介</strong>（Introduction）：[必备] [文件] 提供对产品和文档本身的总体的、扼要的说明</li>
<li><strong>快速上手</strong>（Getting Started）：[可选] [文件] 如何最快速地使用产品</li>
<li><strong>入门篇</strong>（Basics）：[必备] [目录] 又称“使用篇”，提供初级的使用教程
<ul>
<li><strong>环境准备</strong>（Prerequisite）：[必备] [文件] 软件使用需要满足的前置条件</li>
<li><strong>安装</strong>（Installation）：[可选] [文件] 软件的安装方法</li>
<li><strong>设置</strong>（Configuration）：[必备] [文件] 软件的设置</li>
</ul>
</li>
<li><strong>进阶篇</strong>（Advanced)：[可选] [目录] 又称“开发篇”，提供中高级的开发教程</li>
<li><strong>API</strong>（Reference）：[可选] [目录|文件] 软件 API 的逐一介绍</li>
<li><strong>FAQ</strong>：[可选] [文件] 常见问题解答</li>
<li><strong>附录</strong>（Appendix）：[可选] [目录] 不属于教程本身、但对阅读教程有帮助的内容
<ul>
<li><strong>Glossary</strong>：[可选] [文件] 名词解释</li>
<li><strong>Recipes</strong>：[可选] [文件] 最佳实践</li>
<li><strong>Troubleshooting</strong>：[可选] [文件] 故障处理</li>
<li><strong>ChangeLog</strong>：[可选] [文件] 版本说明</li>
<li><strong>Feedback</strong>：[可选] [文件] 反馈方式</li>
</ul>
</li>
</ul>
<p>下面是两个真实范例，可参考。</p>
<ul>
<li><a href="https://redux.js.org/introduction/getting-started"target="_blank" rel="external nofollow noopener noreferrer">Redux 手册<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="http://flight-manual.atom.io/"target="_blank" rel="external nofollow noopener noreferrer">Atom 手册<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>
<h3 id="文件名">文件名</h3>
<p>文档的文件名不得含有空格。</p>
<p>文件名必须使用半角字符，不得使用全角字符。这也意味着，中文不能用于文件名。</p>
<div class="highlight" id="id-50"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：名词解释.md
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：glossary.md</span></span></code></pre></td></tr></table>
</div>
</div><p>文件名建议只使用小写字母，不使用大写字母。</p>
<div class="highlight" id="id-51"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">错误：TroubleShooting.md
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：troubleshooting.md</span></span></code></pre></td></tr></table>
</div>
</div><p>为了醒目，某些说明文件的文件名，可以使用大写字母，比如<code>README</code>、<code>LICENSE</code>。</p>
<p>文件名包含多个单词时，单词之间建议使用半角的连词线（<code>-</code>）分隔。</p>
<div class="highlight" id="id-52"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">不佳：advanced_usage.md
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">正确：advanced-usage.md</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="参考链接">参考链接</h2>
<ul>
<li><a href="https://www.taodocs.com/p-51273.html"target="_blank" rel="external nofollow noopener noreferrer">产品手册中文写作规范<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by 华为</li>
<li><a href="http://guide.daocloud.io/dcs/%e5%86%99%e4%bd%9c%e8%a7%84%e8%8c%83%e5%92%8c%e6%a0%bc%e5%bc%8f%e8%a7%84%e8%8c%83-9153803.html"target="_blank" rel="external nofollow noopener noreferrer">写作规范和格式规范<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by DaoCloud</li>
<li><a href="http://www.hitachi-tc.co.jp/company/thesis/thesis.pdf"target="_blank" rel="external nofollow noopener noreferrer">技术写作技巧在日汉翻译中的应用<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by 刘方</li>
<li><a href="https://www.lengoo.de/documents/styleguides/lengoo_styleguide_ZH.pdf"target="_blank" rel="external nofollow noopener noreferrer">简体中文规范指南<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by lengoo</li>
<li><a href="https://open.leancloud.cn/copywriting-style-guide.html"target="_blank" rel="external nofollow noopener noreferrer">文档风格指南<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by LeanCloud</li>
<li><a href="https://docs.google.com/document/d/1R8lMCPf6zCD5KEA8ekZ5knK77iw9J-vJ6vEopPemqZM/edit"target="_blank" rel="external nofollow noopener noreferrer">豌豆荚文案风格指南<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by 豌豆荚</li>
<li><a href="https://github.com/sparanoid/chinese-copywriting-guidelines"target="_blank" rel="external nofollow noopener noreferrer">中文文案排版指北<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by sparanoid</li>
<li><a href="http://w3c.github.io/clreq/"target="_blank" rel="external nofollow noopener noreferrer">中文排版需求<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by W3C</li>
<li><a href="http://www.ruanyifeng.com/blog/2017/02/filename-should-be-lowercase.html"target="_blank" rel="external nofollow noopener noreferrer">为什么文件名要小写？<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by 阮一峰</li>
<li><a href="https://developers.google.com/style/"target="_blank" rel="external nofollow noopener noreferrer">Google Developer Documentation Style Guide<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, by Google</li>
<li><a href="http://www.moe.gov.cn/ewebeditor/uploadfile/2015/01/13/20150113091154536.pdf"target="_blank" rel="external nofollow noopener noreferrer">出版物上数字用法的规定（国家标准 GBT15835－2011）<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://zh.wikisource.org/zh-hans/GB_3100-1993_%e5%9b%bd%e9%99%85%e5%8d%95%e4%bd%8d%e5%88%b6%e5%8f%8a%e5%85%b6%e5%ba%94%e7%94%a8"target="_blank" rel="external nofollow noopener noreferrer">GB 3100-1993 国际单位制及其应用<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://github.com/DavidAnson/vscode-markdownlint"target="_blank" rel="external nofollow noopener noreferrer">markdownlint<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, VSCode 插件</li>
<li><a href="https://github.com/vinta/pangu.js"target="_blank" rel="external nofollow noopener noreferrer">pangu.js<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>, 盘古之白系列插件</li>
</ul>]]></description></item><item><title>语义版本控制（SemVer）</title><link>https://lruihao.cn/posts/semver/</link><pubDate>Sat, 13 Aug 2022 13:32:03 +0800</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/semver/</guid><description><![CDATA[<div class="featured-image">
        <img src="/images/featured-image.png" referrerpolicy="no-referrer">
      </div><div class="details admonition tip open">
    <div class="details-summary admonition-title">
      <i class="icon fa-solid fa-lightbulb fa-fw" aria-hidden="true"></i>摘要<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i>
    </div>
    <div class="details-content">
      <div class="admonition-content"><p>版本格式：<code>MAJOR.MINOR.PATCH</code>，版本号递增规则如下：</p>
<ol>
<li><code>MAJOR</code>: <strong>主版本号</strong>，当你做了不兼容的 API 修改</li>
<li><code>MINOR</code>: <strong>次版本号</strong>，当你做了向下兼容的功能性新增</li>
<li><code>PATCH</code>: <strong>修订号</strong>，当你做了向下兼容的问题修正</li>
</ol>
<p>先行版本号及版本编译信息可以加到 <code>MAJOR.MINOR.PATCH</code> 的后面，作为延伸。</p>
</div>
    </div>
  </div>
<h2 id="格式">格式</h2>
<p>基本的语法格式如下，更多请参考 <a href="https://semver.org/#backusnaur-form-grammar-for-valid-semver-versions"target="_blank" rel="external nofollow noopener noreferrer">Backus–Naur Form Grammar for Valid SemVer Versions<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;valid semver&gt; ::= &lt;version core&gt;
</span></span><span class="line"><span class="cl">                 | &lt;version core&gt; &#34;-&#34; &lt;pre-release&gt;
</span></span><span class="line"><span class="cl">                 | &lt;version core&gt; &#34;+&#34; &lt;build&gt;
</span></span><span class="line"><span class="cl">                 | &lt;version core&gt; &#34;-&#34; &lt;pre-release&gt; &#34;+&#34; &lt;build&gt;</span></span></code></pre></td></tr></table>
</div>
</div><p>范例：</p>
<p></p>
<table>
<thead>
<tr>
<th>代码状态</th>
<th>等级</th>
<th>规则</th>
<th>版本样例</th>
</tr>
</thead>
<tbody>
<tr>
<td>首次发布</td>
<td>新品发布</td>
<td>以 1.0.0 开始</td>
<td>1.0.0</td>
</tr>
<tr>
<td>bug 修复，向后兼容</td>
<td>补丁版本发布</td>
<td>变更第三位数字</td>
<td>1.0.1</td>
</tr>
<tr>
<td>新功能，向后兼容</td>
<td>次版本发布</td>
<td>变更第二位数字，并且第三位数字重置为 0</td>
<td>1.1.0</td>
</tr>
<tr>
<td>重大变更，不向后兼容</td>
<td>主版本发布</td>
<td>变更第一位数字，并且第二位，第三位数字重置为 0</td>
<td>2.0.0</td>
</tr>
</tbody>
</table>
<div class="details admonition question open">
    <div class="details-summary admonition-title">
      <i class="icon fa-solid fa-question-circle fa-fw" aria-hidden="true"></i>“v1.2.3” 是一个语义化版本号吗？<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i>
    </div>
    <div class="details-content">
      <div class="admonition-content">“v1.2.3” 并不是的一个语义化的版本号。<br>
但是，在语义化版本号之前增加前缀 “v” 是用来表示版本号的常用做法。<br>
在版本控制系统中，将 “version” 缩写为 “v” 是很常见的。<br>
比如：<code>git tag v1.2.3 -m &quot;Release version 1.2.3&quot;</code> 中，标签是 “v1.2.3”，语义化版本号是 “1.2.3”。</div>
    </div>
  </div>
<h2 id="规范">规范</h2>
<p>以下关键词 MUST、MUST NOT、REQUIRED、SHALL、SHALL NOT、SHOULD、SHOULD NOT、 RECOMMENDED、MAY、OPTIONAL 依照 <a href="https://www.rfc-editor.org/rfc/rfc2119"target="_blank" rel="external nofollow noopener noreferrer">RFC 2119<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> 的叙述解读。</p>
<details>
  <summary>语义化版本控制规范（SemVer）</summary>
  <ol>
<li>
<p>使用语义化版本控制的软件必须（MUST）定义公共 API。该 API 可以在代码中被定义或出现于严谨的文档内。无论何种形式都应该力求精确且完整。</p>
</li>
<li>
<p>标准的版本号必须（MUST）采用 X.Y.Z 的格式，其中 X、Y 和 Z 为非负的整数，且禁止（MUST NOT）在数字前方补零。X 是主版本号、Y 是次版本号、而 Z 为修订号。每个元素必须（MUST）以数值来递增。例如：1.9.1 -&gt; 1.10.0 -&gt; 1.11.0。</p>
</li>
<li>
<p>标记版本号的软件发行后，禁止（MUST NOT）改变该版本软件的内容。任何修改都必须（MUST）以新版本发行。</p>
</li>
<li>
<p>主版本号为零（0.y.z）的软件处于开发初始阶段，一切都可能随时被改变。这样的公共 API 不应该被视为稳定版。</p>
</li>
<li>
<p>1.0.0 的版本号用于界定公共 API 的形成。这一版本之后所有的版本号更新都基于公共 API 及其修改内容。</p>
</li>
<li>
<p>修订号 Z（x.y.Z | x &gt; 0）必须（MUST）在只做了向下兼容的修正时才递增。这里的修正指的是针对不正确结果而进行的内部修改。</p>
</li>
<li>
<p>次版本号 Y（x.Y.z | x &gt; 0）必须（MUST）在有向下兼容的新功能出现时递增。在任何公共 API 的功能被标记为弃用（deprecated）时也必须（MUST）递增。也可以（MAY）在内部程序有大量新功能或改进被加入时递增，其中可以（MAY）包括修订级别的改变。每当次版本号递增时，修订号必须（MUST）归零。</p>
</li>
<li>
<p>主版本号 X（X.y.z | X &gt; 0）必须（MUST）在有任何不兼容的修改被加入公共 API 时递增。其中可以（MAY）包括次版本号及修订级别的改变。每当主版本号递增时，次版本号和修订号必须（MUST）归零。</p>
</li>
<li>
<p>先行版本号可以（MAY）被标注在修订版之后，先加上一个连接号再加上一连串以句点分隔的标识符来修饰。标识符必须（MUST）由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成，且禁止（MUST NOT）留白。数字型的标识符禁止（MUST NOT）在前方补零。先行版的优先级低于相关联的标准版本。被标上先行版本号则表示这个版本并非稳定而且可能无法满足预期的兼容性需求。范例：1.0.0-alpha、1.0.0-alpha.1、1.0.0-0.3.7、1.0.0-x.7.z.92。</p>
</li>
<li>
<p>版本编译信息可以（MAY）被标注在修订版或先行版本号之后，先加上一个加号再加上一连串以句点分隔的标识符来修饰。标识符必须（MUST）由 ASCII 字母数字和连接号 [0-9A-Za-z-] 组成，且禁止（MUST NOT）留白。当判断版本的优先层级时，版本编译信息可（SHOULD）被忽略。因此当两个版本只有在版本编译信息有差别时，属于相同的优先层级。范例：1.0.0-alpha+001、1.0.0+20130313144700、1.0.0-beta+exp.sha.5114f85。</p>
</li>
<li>
<p>版本的优先层级指的是不同版本在排序时如何比较。</p>
<ol>
<li>
<p>判断优先层级时，必须（MUST）把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较（版本编译信息不在这份比较的列表中）。</p>
</li>
<li>
<p>由左到右依序比较每个标识符，第一个差异值用来决定优先层级：主版本号、次版本号及修订号以数值比较。</p>
<p>例如：1.0.0 &lt; 2.0.0 &lt; 2.1.0 &lt; 2.1.1。</p>
</li>
<li>
<p>当主版本号、次版本号及修订号都相同时，改以优先层级比较低的先行版本号决定。</p>
<p>例如：1.0.0-alpha &lt; 1.0.0。</p>
</li>
<li>
<p>有相同主版本号、次版本号及修订号的两个先行版本号，其优先层级必须（MUST）透过由左到右的每个被句点分隔的标识符来比较，直到找到一个差异值后决定：</p>
<ol>
<li>只有数字的标识符以数值高低比较。</li>
<li>有字母或连接号时则逐字以 ASCII 的排序来比较。</li>
<li>数字的标识符比非数字的标识符优先层级低。</li>
<li>若开头的标识符都相同时，栏位比较多的先行版本号优先层级比较高。</li>
</ol>
<p>例如：1.0.0-alpha &lt; 1.0.0-alpha.1 &lt; 1.0.0-alpha.beta &lt; 1.0.0-beta &lt; 1.0.0-beta.2 &lt; 1.0.0-beta.11 &lt; 1.0.0-rc.1 &lt; 1.0.0</p>
</li>
</ol>
</li>
</ol>

</details>
<h2 id="版本阶段">版本阶段</h2>
<ul>
<li><code>Base</code>: 设计阶段，只有相应的设计没有具体的功能实现</li>
<li><code>Alpha</code>: 软件的初级版本，基本功能已经实现，但存在较多的 bug</li>
<li><code>Bate</code>: 相对于 Alpha 已经有了很大的进步，消除了严重的 BUG，但还存在一些潜在的 BUG，还需要不断测试</li>
<li><code>RC</code>: 该版本已经相当成熟了，基本上不存在导致错误的 Bug，与即将发行的正式版本相差无几</li>
<li><code>RELEASE</code>: 最终发布版本，没有太大的问题</li>
</ul>
<p>最终发布版本（<code>RELEASE</code>）之前的所有版本，都称为先行版本（<code>pre-release</code>）。</p>
<h2 id="faqhttpssemverorglangzh-cnfaq"><a href="https://semver.org/lang/zh-CN/#faq"target="_blank" rel="external nofollow noopener noreferrer">FAQ<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></h2>
<h2 id="其他相关">其他相关</h2>
<h3 id="npm-semver">npm SemVer</h3>
<p>通常我们发布一个包到 npm 仓库时，我们的做法是先修改 <code>package.json</code> 为某个版本，然后执行 <code>npm publish</code> 命令。手动修改版本号的做法建立在你对 SemVer 规范特别熟悉的基础之上，否则可能会造成版本混乱。npm 和 yarn 两个包管理都提供了 SemVer 规范的版本控制命令：</p>
<ul>
<li><a href="https://docs.npmjs.com/cli/v8/commands/npm-version"target="_blank" rel="external nofollow noopener noreferrer">npm-version<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://classic.yarnpkg.com/en/docs/cli/version"target="_blank" rel="external nofollow noopener noreferrer">yarn version<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>
<p>npm 发包基础命令：</p>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 创建一个新的包</span>
</span></span><span class="line"><span class="cl">npm init
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 查看是否官方源</span>
</span></span><span class="line"><span class="cl">npm config get registry
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 登录</span>
</span></span><span class="line"><span class="cl">npm login
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 发布</span>
</span></span><span class="line"><span class="cl">npm publish
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 版本变化 major.minor.patch</span>
</span></span><span class="line"><span class="cl">npm version patch <span class="c1"># 升级补丁版本</span>
</span></span><span class="line"><span class="cl">npm version minor <span class="c1"># 升级小版号</span>
</span></span><span class="line"><span class="cl">npm version major <span class="c1"># 升级大版号</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 下架 [-force]</span>
</span></span><span class="line"><span class="cl">npm unpublish</span></span></code></pre></td></tr></table>
</div>
</div><p>全局设置版本号前缀</p>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># https://docs.npmjs.com/cli/v8/using-npm/config#tag-version-prefix</span>
</span></span><span class="line"><span class="cl">npm config <span class="nb">set</span> tag-version-prefix <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 全局设置版本更新 commit 提交信息</span>
</span></span><span class="line"><span class="cl"><span class="c1"># https://docs.npmjs.com/cli/v8/using-npm/config#message</span>
</span></span><span class="line"><span class="cl">npm config <span class="nb">set</span> message <span class="s2">&#34;Chore(release): %s&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>或者设置项目的 <code>.npmrc</code> 或者 <code>.yarnrc</code></p>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># .npmrc</span>
</span></span><span class="line"><span class="cl">tag-version-prefix<span class="o">=</span><span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">message</span><span class="o">=</span><span class="s2">&#34;Chore(release): %s&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># .yarnrc</span>
</span></span><span class="line"><span class="cl">version-tag-prefix <span class="s2">&#34;&#34;</span>
</span></span><span class="line"><span class="cl">version-git-message <span class="s2">&#34;Chore(release): %s&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>package.json 版本控制规则使用了一些些符号：</p>
<ul>
<li><code>^</code></li>
<li><code>~</code></li>
<li><code>&gt;</code></li>
<li><code>&gt;=</code></li>
<li><code>&lt;</code></li>
<li><code>&lt;=</code></li>
<li><code>=</code></li>
<li><code>-</code></li>
<li><code>||</code></li>
</ul>
<p>这些规则的详情如下：</p>
<ul>
<li><code>^</code>: 只会执行不更改最左边非零数字的更新。 如果写入的是 <code>^0.13.0</code>，则当运行 <code>npm update</code> 时，可以更新到 <code>0.13.1</code>、<code>0.13.2</code> 等，但不能更新到 <code>0.14.0</code> 或更高版本。 如果写入的是 <code>^1.13.0</code>，则当运行 <code>npm update</code> 时，可以更新到 <code>1.13.1</code>、<code>1.14.0</code> 等，但不能更新到 <code>2.0.0</code> 或更高版本。</li>
<li><code>~</code>: 如果写入的是 <code>〜0.13.0</code>，则当运行 <code>npm update</code> 时，会更新到补丁版本：即 <code>0.13.1</code> 可以，但 <code>0.14.0</code> 不可以。</li>
<li><code>&gt;</code>: 接受高于指定版本的任何版本。</li>
<li><code>&gt;=</code>: 接受等于或高于指定版本的任何版本。</li>
<li><code>&lt;=</code>: 接受等于或低于指定版本的任何版本。</li>
<li><code>&lt;</code>: 接受低于指定版本的任何版本。</li>
<li><code>=</code>: 接受确切的版本。</li>
<li><code>-</code>: 接受一定范围的版本。例如：<code>2.1.0 - 2.6.2</code>。</li>
<li><code>||</code>: 组合集合。例如 <code>&lt; 2.1 || &gt; 2.6</code>。</li>
</ul>
<p>可以合并其中的一些符号，例如 <code>1.0.0 || &gt;=1.1.0 &lt;1.2.0</code>，即使用 1.0.0 或从 1.1.0 开始但低于 1.2.0 的版本。</p>
<p>还有其他的规则：</p>
<ul>
<li>无符号：仅接受指定的特定版本（例如 <code>1.2.1</code>）。</li>
<li><code>latest</code>: 使用可用的最新版本。</li>
</ul>
<h3 id="版本保留">版本保留</h3>
<ol>
<li>对于大型软件，每个版本都有使用价值时，应保留所有历史版本</li>
<li>对于始终以最新版本为准的软件，则可保留至少最近的 10 个次版本</li>
</ol>
<h2 id="参考">参考</h2>
<ul>
<li><a href="https://semver.org/"target="_blank" rel="external nofollow noopener noreferrer">Semantic Versioning 2.0.0<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="http://nodejs.cn/learn/semantic-versioning-using-npm"target="_blank" rel="external nofollow noopener noreferrer">使用 npm 的语义版本控制<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>]]></description></item><item><title>Commit Message Spec</title><link>https://lruihao.cn/posts/commit-spec/</link><pubDate>Fri, 12 Aug 2022 15:37:44 +0800</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/commit-spec/</guid><description><![CDATA[<p>Commit messages are short descriptions of changes to a repository. We should follow certain standards to effectively describe changes, such as the <a href="https://www.conventionalcommits.org/en/v1.0.0-beta.4/"target="_blank" rel="external nofollow noopener noreferrer">Conventional Commits<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> specification based on the <a href="https://github.com/angular/angular/blob/68a6a07/CONTRIBUTING.md#commit"target="_blank" rel="external nofollow noopener noreferrer">Angular convention<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> that is most used on GitHub, or each development team can simplify and formulate their own commit specification. This is not only conducive to the automatic generation of Changelog in the later stage, but more importantly, when a bug occurs, the entire warehouse can be quickly checked, the problem point can be accurately located, and the version can be reverted.</p>
<h2 id="format">Format</h2>
<p><code>[{emoji} ]{type}[({module})]: {subject within 50 words}[ (#{issue/pull request})]</code></p>
<p>example:</p>
<ul>
<li>🎉 Feat: add shortcode fixit-encryptor shortcode (#123)</li>
<li>⬆️ Chore(libs): update Artalk from 2.2.12 to 2.3.4 (#150)</li>
</ul>
<h2 id="emoji">Emoji</h2>
<ul>
<li><a href="https://gitmoji.dev"target="_blank" rel="external nofollow noopener noreferrer">https://gitmoji.dev<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://github.com/maixiaojie/git-emoji-zh.git"target="_blank" rel="external nofollow noopener noreferrer">vscode plugin<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li>utools plugin <code>GitEmoji</code></li>
</ul>
<h2 id="message">Message</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Emoji</th>
<th style="text-align:left">Type</th>
<th style="text-align:left">Example</th>
<th style="text-align:left">Description (No Ambiguous)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">🎉 <br>✨</td>
<td style="text-align:left">Feat</td>
<td style="text-align:left">Feat: add {feature}</td>
<td style="text-align:left">new feature</td>
</tr>
<tr>
<td style="text-align:left">🚚</td>
<td style="text-align:left"></td>
<td style="text-align:left">Feat: adjust/migrate {feature name}, {change details}</td>
<td style="text-align:left">For the adjustment feature, it is necessary to describe the current situation (before) and after adjustment (after)</td>
</tr>
<tr>
<td style="text-align:left">🔥</td>
<td style="text-align:left"></td>
<td style="text-align:left">Feat: delete {feature name}, {deletion reason}</td>
<td style="text-align:left">If the feature is deleted, the reason for deletion must be explained</td>
</tr>
<tr>
<td style="text-align:left">🐛 <br>🚧 <br>🚨</td>
<td style="text-align:left">Fix</td>
<td style="text-align:left">Fix: fix {bug description}</td>
<td style="text-align:left">Fix known bugs</td>
</tr>
<tr>
<td style="text-align:left">🎨 <br>💄 <br>✏️</td>
<td style="text-align:left">Style</td>
<td style="text-align:left">Style: Typesetting/CSS style {optimizing content}</td>
<td style="text-align:left">Changes that do not affect code operation, such as code layout and style change</td>
</tr>
<tr>
<td style="text-align:left">♻️</td>
<td style="text-align:left">Refactor</td>
<td style="text-align:left">Refactor: override {feature name}</td>
<td style="text-align:left">It is neither a new function nor a code change to fix a bug. Simply rewriting the code of a function does not affect the function result</td>
</tr>
<tr>
<td style="text-align:left">⚡</td>
<td style="text-align:left">Perf</td>
<td style="text-align:left">Perf: improve performance {function name}, {improve content}</td>
<td style="text-align:left">Optimize code performance</td>
</tr>
<tr>
<td style="text-align:left">⏪</td>
<td style="text-align:left">Revert</td>
<td style="text-align:left">Revert: restore version {commit message of restore version}</td>
<td style="text-align:left">Restore the version of one commit</td>
</tr>
<tr>
<td style="text-align:left">✏ <br>✏️</td>
<td style="text-align:left">Docs</td>
<td style="text-align:left">Docs: revise comments/update documents</td>
<td style="text-align:left">Adjustment of documents and notes</td>
</tr>
<tr>
<td style="text-align:left">🔧</td>
<td style="text-align:left">Chore</td>
<td style="text-align:left">Chore: update plugin version</td>
<td style="text-align:left">Changes in the construction process or auxiliary tools</td>
</tr>
</tbody>
</table>]]></description></item><item><title>RESTful</title><link>https://lruihao.cn/posts/restful/</link><pubDate>Thu, 14 Nov 2019 19:06:05 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/restful/</guid><description><![CDATA[<blockquote>
<p>RESTful 是一种系统开发设计风格、原则。可视情况调整，以下参考来源 <a href="https://www.rfc-editor.org/rfc/rfc5789"target="_blank" rel="external nofollow noopener noreferrer">RFC5789<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
</blockquote>
<h2 id="noun">Noun</h2>
<ul>
<li>一般资源
通用于一律使用复数名词
例如：/books 或 /books/123。但有部分人认为应该使用单数名词，因为： /book/123 看似比 /books/123 合理。但想想文件系统的目录命名（例如 /Users 或 /Documents)，其实用复数也没问题。复数可以保持 API endpoint 的一致性，所以一般资源建议用复数。</li>
<li>唯一资源：对 client 而言只有一份的资源
通用于单数名词
例如：user 是指目前验证的使用者，使用者永远只能同时登入一个使用者</li>
</ul>
<h2 id="http-method">Http Method</h2>
<table><tbody><tr><th>Method</th><th>Idempotent</th><th>Safe</th><th>CRUD</th><th>OO</th><th>生活动词</th><th>用途</th></tr><tr><td rowspan="2">GET</td><td rowspan="2" style="text-align: center;">Y</td><td rowspan="2" style="text-align: center;">Y</td><td rowspan="2"><b>R</b>ead</td><td rowspan="2">get</td><td>get</td><td>取得资料</td></tr><tr><td>list</td><td>列出资料</td></tr><tr><td rowspan="2">POST</td><td rowspan="2"></td><td rowspan="2"></td><td rowspan="2"><b>C</b>reate</td><td rowspan="2">add</td><td>create</td><td>建立一个可以完全独立存在的实体</td></tr><tr><td>add</td><td>增加一个必须依赖于某个实体的实体</td></tr><tr><td rowspan="2">PUT</td><td rowspan="2" style="text-align: center;">Y</td><td rowspan="2"></td><td rowspan="3"><b>U</b>pdate</td><td rowspan="3">set</td><td>replace</td><td>取代一个关系，已存在时先删除后建立，不存在时直接建立</td></tr><tr><td>add</td><td>附加唯一关系，两个关系实体可以互相独立存在，且已经存在</td></tr><tr><td>PATCH</td><td></td><td></td><td>edit</td><td>编辑某个实体</td></tr><tr><td>DELETE</td><td></td><td></td><td><b>D</b>elete</td><td>remove</td><td>remove<br>delete</td><td>删除某个实体</td></tr></tbody></table>
<ul>
<li>Safe：该操作不会改变伺服器端的资源状态（而且结果可以被 cache），属于 Safe 的操作必定属于 Idempotent</li>
<li>Idempotent (幂等性)：该操作不管做 1 遍或做 n 遍，都会得到同样的资源状态结果（但不一定得到同样的返回值，例如第 2 次 DELETE 请求可能回传 404），因此 client 端可以放心 retry</li>
</ul>
<h3 id="get">GET</h3>
<blockquote>
<p>Safe：每次执行操作时，GET 只有读取 Resource，不会改变到任何的 Resource （资源，资料）<br>
Idempotent：每次执行操作时，GET 只有读取 Resource，不会改变到任何的 Resource （资源，资料），所以任何资源的任何状态都是一样的</p>
</blockquote>
<h3 id="post">POST</h3>
<blockquote>
<p>每次执行操作时，POST 都会建立一个 Resource （资源，资料）</p>
</blockquote>
<ul>
<li>
<p>Create：建立一个可以完全独立存在的实体</p>
<p>范例：建立使用者</p>
<p>执行第一次时：建立一个 name = &ldquo;李四&rdquo; 的 user，但其 id = 1，执行第二次时：建立一个 name = &ldquo;李四&rdquo; 的 user，但其 id = 2，发送同样的请求，可每次都是不同的 Resource</p>
<p>建立使用者前不需要建立任何的东西，就可以建立使用者了，使用者是可以完全独立的存在</p>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">POST</span> <span class="nn">/users</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">127.0.0.1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="g">{
</span></span></span><span class="line"><span class="cl"><span class="g"> &#34;name&#34;: &#34;李四&#34;
</span></span></span><span class="line"><span class="cl"><span class="g">}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>Add：增加一个必须依赖于某个实体的实体</p>
<p>资料结构：一对多的关系</p>
<p>范例：Add a public key on behalf of a user 增加一个代表使用者的公钥 (<a href="https://gitea.com/api/swagger#/admin/adminCreatePublicKey"target="_blank" rel="external nofollow noopener noreferrer">Gitea API<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>)</p>
<p>增加这个公钥之前，使用者必须存在，公钥必须归属于某个使用者之下，公钥跟姓名一样，使用相同电脑的公钥就会相同，但不表示是同一个使用者，故公钥也会有自己的 ID 我每次增加公钥时，都将生成不同的公钥 ID</p>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">POST</span> <span class="nn">/api/v1/admin/users/{username}/keys</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">gitea.com</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="g">{
</span></span></span><span class="line"><span class="cl"><span class="g">  &#34;key&#34;: &#34;string&#34;,
</span></span></span><span class="line"><span class="cl"><span class="g">  &#34;read_only&#34;: true,
</span></span></span><span class="line"><span class="cl"><span class="g">  &#34;title&#34;: &#34;string&#34;
</span></span></span><span class="line"><span class="cl"><span class="g">}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="put">PUT</h3>
<blockquote>
<p>Idempotent：每次执行操作时，PUT 都会取代 Resource，不管操作几次，使用者获取得 Resource 结果都是一样的</p>
<p>Replace：不论资源如何，最终的资源状态都是一样的，Resource 已存在时，或许不理会、或许先删除后建立（取代）Resource 不存在时，直接建立</p>
<p>Add：添加唯一关系，建立这个唯一关系前，两个关连实体都必须存在。在没有建立关系前，两个关连实体都可以互相独立存在
资料结构：多对多，且两个关连实体的 PK，同时也是关系实体的 PK、FK</p>
</blockquote>
<ul>
<li>
<p>范例：增加使用者与角色的关系</p>
<p>增加使用者跟角色的关系前，使用者跟角色都必须存在；增加使用者跟角色的关系前，使用者跟角色可以独立存在，
使用者 12262 跟 角色 2 的关系最多只能有一条关系（ 使用者 12262 有 角色 2)，最少没有关系（使用者 12262 没有 角色 2 ) ，执行第二次操作时，使用者 12262 跟 角色 2 的从属关系仍然存在，也不会跑出第二条 使用者 12262 跟 角色 2 的从属关系</p>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">PUT</span> <span class="nn">user/{account}/roles</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">127.0.0.1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="g">{
</span></span></span><span class="line"><span class="cl"><span class="g">  &#34;role_id&#34;: &#34;2&#34;
</span></span></span><span class="line"><span class="cl"><span class="g">}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p>范例：Follow a user 关注一个使用者 (<a href="https://gitea.com/api/swagger#/user/userCurrentPutFollow"target="_blank" rel="external nofollow noopener noreferrer">Gitea API<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>)</p>
<p>增加关注关系时，关注者与被关注者（都是使用者） 都必须存在；关注者 12262 跟被关注者 12231 的关系最多只能有一条关系（12262 关注 12231），最少没有关系（12262 不关注 12231），执行第二次操作时，关注者 12262 跟被关注者 12231 的关注关系仍然存在，也不会跑出第二条关注者 12262 跟被关注者 12231 的关注关系</p>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">PUT</span> <span class="nn">/api/v1/user/following/{username}</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">gitea.com</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="patch">PATCH</h3>
<blockquote>
<p>Edit：编辑可独立存在、且已经存在的实体，也就是产生新版本的实体，可能会影响其他 Resource</p>
</blockquote>
<ul>
<li>
<p>范例：编辑使用者</p>
<p>编辑使用者，使用者已经存在，且我们可能有纪录编辑时间、编辑人、编辑 IP，所以每次的编辑都会造成不一样的结果
第一次编辑使用者，更新时间变为 08:00，编辑人 12262，IP 172.18.0.66 第二次编辑使用者，更新时间变为 09:00，编辑人 12263，IP 172.18.0.67</p>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">PATCH</span> <span class="nn">/users/{account}</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">127.0.0.1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="g">{
</span></span></span><span class="line"><span class="cl"><span class="g">	&#34;username&#34;: &#34;李四&#34;,
</span></span></span><span class="line"><span class="cl"><span class="g">	&#34;age&#34;: &#34;18&#34;,
</span></span></span><span class="line"><span class="cl"><span class="g">	&#34;gender&#34;: &#34;male&#34;
</span></span></span><span class="line"><span class="cl"><span class="g">}</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h3 id="delete">DELETE</h3>
<blockquote>
<p>Idempotent：每次执行操作时，DELETE 都会删除相同的东西</p>
</blockquote>
<ul>
<li>
<p>范例：删除使用者</p>
<p>第一次删除使用者 12262，删除使用者 12262, 第二次删除使用者 12262，还是删除使用者 12262，只不过使用者 12262 不存在了</p>
<div class="highlight" id="id-6"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">DELETE</span> <span class="nn">/users/{account}</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Host</span><span class="o">:</span> <span class="l">127.0.0.1</span></span></span></code></pre></td></tr></table>
</div>
</div></li>
</ul>
<h2 id="http-status-code">HTTP Status Code</h2>
<p>HTTP 状态码（HTTP Status Code）是用以表示网页服务器 HTTP 响应状态的 3 位数字代码。所有状态码的第一个数字代表了响应的五种状态之一。除非另有说明，状态码是 <strong>HTTP/1.1 标准</strong>（<a href="https://www.rfc-editor.org/rfc/rfc7231"target="_blank" rel="external nofollow noopener noreferrer">RFC 7231<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>）的一部分。</p>
<p>而关于 RESTful API 的请求状态，通常有以下两种设计方案：</p>
<ul>
<li>方案一：使用 HTTP 状态码来表示请求状态，200 时返回的内容就是数据</li>
<li>方案二：所有接口都返回 200 ，在响应内容里约定错误码或错误信息</li>
</ul>
<p>在实际应用中，应据具体情景及需要进行选择与调整。</p>
<table><tbody><tr><th>方案</th><th colspan="2">优劣比较</th></tr><tr><td rowspan="2">方案一</td><td>优点</td><td>对服务端来说较为简单方便</td></tr><tr><td>缺点</td><td>客户端难以根据状态码处理复杂问题</td></tr><tr><td rowspan="2">方案二</td><td>优点</td><td>方便对返回资料进行统一处理和细微性的控制</td></tr><tr><td>缺点</td><td>相当于放弃了 HTTP 状态码的语义</td></tr></tbody></table>
<h3 id="常用-http-状态码">常用 HTTP 状态码</h3>
<table>
<thead>
<tr>
<th>Code</th>
<th>Message</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td>1XX</td>
<td>Informational response</td>
<td>此类状态码通常代表的响应都是信息性的，告诉客户端可以进行下一步操作。</td>
</tr>
<tr>
<td>100</td>
<td>Continue</td>
<td>表示服务端已接收到请求头，客户端可以继续发送请求体（如 POST 请求）。</td>
</tr>
<tr>
<td>101</td>
<td>Switching Protocols</td>
<td>表示服务端支持更优协议，让客户端在服务端更换协议后重新访问。</td>
</tr>
<tr>
<td>2XX</td>
<td>Successful</td>
<td>此类状态码通常代表请求已成功被服务端接收、理解并接受。</td>
</tr>
<tr>
<td>200</td>
<td>OK</td>
<td>表示请求成功。</td>
</tr>
<tr>
<td>201</td>
<td>Created</td>
<td>表示请求已被实现，通常是在成功创建了某个资源。</td>
</tr>
<tr>
<td>202</td>
<td>Accepted</td>
<td>表示请求已被服务端接收，但尚未进行处理。</td>
</tr>
<tr>
<td>204</td>
<td>No Content</td>
<td>表示请求成功，但不会返回任何内容。</td>
</tr>
<tr>
<td>205</td>
<td>Reset Content</td>
<td>表示请求成功，但不会返回任何内容，并且要求客户端重置表单。</td>
</tr>
<tr>
<td>3XX</td>
<td>Redirect</td>
<td>此类状态码通常代表本次请求需要客户端采取进一步操作才能完成。通常用于重定向。</td>
</tr>
<tr>
<td>300</td>
<td>Multiple Choices</td>
<td>表示请求的资源有多个供可选择，客户端可自行选择一个进行请求的重定向。</td>
</tr>
<tr>
<td>301</td>
<td>Moved Permanently</td>
<td>表示请求的资源已经永久地移动到了新位置，并且将在 Location 域中携带该资源新的 URI。</td>
</tr>
<tr>
<td>304</td>
<td>Not Modified</td>
<td>表示请求的资源无发生修改，将不会返回任何资源。</td>
</tr>
<tr>
<td>4XX</td>
<td>Client Error</td>
<td>此类状态码通常代表客户端可能出现了错误。</td>
</tr>
<tr>
<td>400</td>
<td>Bad Request</td>
<td>表示客户端发出的请求有误（格式、大小、无效的&hellip;)，服务端不能/ 不会处理该请求。</td>
</tr>
<tr>
<td>401</td>
<td>Unauthorized</td>
<td>表示客户端未能提供必要的验证，服务端拒绝提供资源。</td>
</tr>
<tr>
<td>403</td>
<td>Forbidden</td>
<td>表示服务端理解了该请求，但客户端没有足够权限以访问，遂拒绝提供该资源。</td>
</tr>
<tr>
<td>404</td>
<td>Not Found</td>
<td>表示服务端无法找到请求的资源，其可能已经暂时（永久）失效。</td>
</tr>
<tr>
<td>408</td>
<td>Request Timeout</td>
<td>表示请求超时。</td>
</tr>
<tr>
<td>409</td>
<td>Conflict</td>
<td>表示请求的资源发送了冲突，通常是 PUT 请求。</td>
</tr>
<tr>
<td>410</td>
<td>Gone</td>
<td>表示请求的资源已经永久失效，客户端不应再次请求。</td>
</tr>
<tr>
<td>411</td>
<td>Length Required</td>
<td>表示服务端拒绝在没有定义 Content-Length 头的情况下接收该请求。</td>
</tr>
<tr>
<td>5XX</td>
<td>Server Error</td>
<td>此类状态码通常代表由于服务端的原因，导致无法完成请求。</td>
</tr>
<tr>
<td>500</td>
<td>Internal Server Error</td>
<td>表示由于服务端遇到意料之外的变故，导致无法完成请求。</td>
</tr>
<tr>
<td>501</td>
<td>Not Implemented</td>
<td>表示服务端不支持完成请求所需的功能，导致无法完成请求。</td>
</tr>
<tr>
<td>502</td>
<td>Bad Gateway</td>
<td>表示作为网关或代理的服务段在执行请求时，从上游服务器获得了无效的响应。</td>
</tr>
<tr>
<td>503</td>
<td>Service Unavailable</td>
<td>表示由于某些原因（服务器超载或系统维护等），导致暂时无法完成请求。</td>
</tr>
<tr>
<td>504</td>
<td>Gatewy Timeout</td>
<td>表示作为网关或代理的服务段在执行请求时，未能及时从上游服务器获得响应。</td>
</tr>
<tr>
<td>505</td>
<td>HTTP Version Not Supported</td>
<td>表示服务端不支持请求的 HTTP 协议版本，导致无法完成请求。</td>
</tr>
</tbody>
</table>
<blockquote>
<p>以上内容参考自<a href="https://zh.wikipedia.org/zh-cn/HTTP%e7%8a%b6%e6%80%81%e7%a0%81"target="_blank" rel="external nofollow noopener noreferrer">https://zh.wikipedia.org/zh-cn/HTTP状态码<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>，
需要查看完整 HTTP 状态码请点击 <a href="https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes"target="_blank" rel="external nofollow noopener noreferrer">https://www.rfc-editor.org/rfc/rfc9110.html#name-status-codes<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
</blockquote>]]></description></item><item><title>Web 开发规则，代码规范</title><link>https://lruihao.cn/posts/dev-rules/</link><pubDate>Thu, 15 Aug 2019 18:30:31 +0000</pubDate><author>Lruihao</author><guid>https://lruihao.cn/posts/dev-rules/</guid><description><![CDATA[<h2 id="精神">精神</h2>
<ul>
<li>绝不写死代码，硬编码</li>
<li>不留不要用的、垃圾代码</li>
</ul>
<h2 id="git">Git</h2>
<ul>
<li>Master 的 BUG 必须最少且趋近于零，为最稳定的版本</li>
<li>每次 Commit 信息应该准确填写。不可模棱两可，eg: 修复 BUG、增加功能</li>
<li>禁止 Commit IDE 的 project data，e.g: .vscode</li>
<li>禁止上传垃圾代码</li>
</ul>
<blockquote>
<p>更多规则详见文档 <a href="/posts/commit-spec/">Commit 规范</a></p>
</blockquote>
<h3 id="分支branch">分支（Branch）</h3>
<ul>
<li>命名规则：应以此分支主要目的命名（修复什么 BUG，新增特定功能）</li>
<li>合并后的分支应该删除</li>
</ul>
<h3 id="commit">commit</h3>
<ul>
<li>遵循一个功能一个 commit 的原则</li>
</ul>
<h2 id="restful">Restful</h2>
<ul>
<li>
<p>资源名词站在 API 的角度思考</p>
<ul>
<li>
<p>复数名词：可以复数笔数据，回传结果为 Array</p>
<p>举例：GET/users 取得多笔使用者资料</p>
<ul>
<li>刪除，放在复数名词內，让 Router 保持一致性</li>
<li>增加，放在复数名詞內，让 Router 保持一致性</li>
</ul>
</li>
<li>
<p>单数名词：仅取得单笔数据，必须指定 PK，两两一组，回传结果为 Object
举例：GET/user/{accont} 取得单笔使用者资料，必须指定 PK</p>
</li>
</ul>
</li>
<li>
<p>URL 中一律不带 id 参数</p>
</li>
</ul>
<div class="highlight" id="id-1"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">正确范例： calendar_manager/calendar/29
</span></span><span class="line"><span class="cl">错误范例： calendar_manager/calendar/29?id=29</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>更多规则详见文档 <a href="/posts/restful/">RESTful</a></p>
</blockquote>
<h2 id="命名">命名</h2>
<ul>
<li>命名应根据内容做有意义的命名，让后续维护人员可以顾名思义！</li>
<li>即使不会发生错误，代码英文大小写也需明确区分。</li>
</ul>
<h3 id="语意">语意</h3>
<table>
<thead>
<tr>
<th style="text-align:left">类型</th>
<th style="text-align:left">命名规则</th>
<th style="text-align:left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">属性 (Attribute, Property)</td>
<td style="text-align:left">名词 user_name、userName</td>
<td style="text-align:left"></td>
</tr>
<tr>
<td style="text-align:left">方法 (Method, Function)</td>
<td style="text-align:left">动词 + 名词 getUserName、get_user_name</td>
<td style="text-align:left">常見的动词有：get、set、update、delete、remove</td>
</tr>
</tbody>
</table>
<h3 id="字母与分隔">字母与分隔</h3>
<table>
<thead>
<tr>
<th>语言</th>
<th>变量 (Variable, Parameter, Argument)</th>
<th>常量 (Constant)</th>
<th>面向对象 - 类名 (Class Name)</th>
<th>面向对象 - 成员 (mebmer)</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTML</td>
<td>全部小写，不同单词以「-」分隔<br />e.g: user-id</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>CSS、SCSS</td>
<td>全部小写，不同单词以「-」分隔，CSS 变量以「&ndash;」开头，SCSS 变量以「$」开头<br />e.g: .user-id、&ndash;header-height、$header-height</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>JavaScript</td>
<td>驼峰式命名法<br />首字小写，不同单字「首字以大写」分隔<br /> e.g: userId</td>
<td>全部大写，不同单字以「_」分隔 MAX_COUNT</td>
<td>驼峰式命名法<br />首字大写，不同单字「首字以大写」分隔<br />一个文件放一个 Class, 文件名即为 Class Name <br />e.g: User</td>
<td>驼峰式命名法<br />公有 (public) : 首字小写，不同单词「首字以大写」分隔<br />e.g: name, getName<br />私有 (private): _公有命名规则<br />e.g: _name,_getName</td>
</tr>
<tr>
<td>Vue</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Java</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>PHP</td>
<td>全部小写，不同单词以「_」分隔<br />e.g: user_id</td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>Python</td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>SQL</td>
<td>由使用者定义的：表名、字段名<br />全部小写，不同单词以「_」分隔</td>
<td>SQL 语法、函数全部大写<br />e.g: SELECT、INSERT INTO</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="通用">通用</h2>
<ul>
<li>代码编写</li>
<li><strong>每个函数应该使用块注释，注释应包含函数功能说明、参数说明</strong>。规则见：JSDoc、JavaDoc</li>
<li>不必要的代码不要写，也应禁止放到注释里面！</li>
<li>if-else 的 {} 严禁省略</li>
<li>
</li>
<li>代码规范、代码排版等可通过 eslint 等工具做统一处理</li>
</ul>
<h3 id="正确写法">正确写法</h3>
<div class="highlight" id="id-2"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">public</span> <span class="kd">function</span> <span class="nx">test</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">===</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="错误写法">错误写法</h2>
<div class="highlight" id="id-3"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="kr">public</span> <span class="kd">function</span> <span class="nx">test</span> <span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">if</span> <span class="p">(</span><span class="nx">a</span> <span class="o">===</span> <span class="nx">b</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">  <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li>代码排版
<ul>
<li>任何代码应该以 2 个 space 为一个缩进做好排版、不可使用 tab</li>
</ul>
</li>
<li>函数 (Function, Methd)
<ul>
<li>函数声明时需在函数上方加上函数注释，注释应包含函数说明、参数内容（参数类型、参数英文名称、参数说明）、返回值内容（返回值类型、返回值说明）</li>
</ul>
</li>
<li>类 (Class)
<ul>
<li>一个类（Class）的声明只能存在一个文件</li>
<li>类（Class）的声明文件，文件名必须为类名</li>
</ul>
</li>
<li>其他
<ul>
<li>连接本地任何其他资源（图片、文件、网站）皆使用相对路径，禁止使用绝对路径，非本地资源除外</li>
</ul>
</li>
</ul>
<h2 id="html">HTML</h2>
<h3 id="代码编写">代码编写</h3>
<ul>
<li>禁止在 HTML 使用 <code>&lt;style&gt;</code>、<code>&lt;script&gt;</code>，一律使用外部档案引用方式引用 CSS、JavaScript 文件</li>
<li>HTML 标签需成双成对，有头有尾</li>
<li>块级标签：<code>&lt;tag&gt;&lt;/tag&gt;</code></li>
<li>单标签：<code>&lt;tag /&gt;</code></li>
<li>禁止使用已被 HTML 舍弃的旧标签、属性，如：</li>
</ul>
<div class="highlight" id="id-4"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-html" data-lang="html"><span class="line"><span class="cl"><span class="c">&lt;!-- html tag --&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">center</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">font</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">basefont</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">s</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">strike</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">u</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">listing</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">plaintext</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="p">&lt;</span><span class="nt">xmp</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="c">&lt;!-- html attribute --&gt;</span>
</span></span><span class="line"><span class="cl">align
</span></span><span class="line"><span class="cl">bgcolor
</span></span><span class="line"><span class="cl">color</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="css">CSS</h2>
<blockquote>
<p>CSS 的定义应该独立一个 CSS 文件，禁止使用 <code>&lt;style&gt;</code> 或 <code>style</code> 属性直接在 HTML 中定义样式。</p>
</blockquote>
<h2 id="javascript">JavaScript</h2>
<blockquote>
<p>禁止使用 HTML 字串，一律使用 Dom 产生 HTML, e.g: <code>document.createDocumentFragment()</code></p>
</blockquote>
<h3 id="注释">注释</h3>
<p>JavaScript 注释应该遵循 JSDoc 的标准撰写</p>
<h4 id="全局变量-global">全局变量 (Global)</h4>
<div class="highlight" id="id-5"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/* global ZT */</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="常量-constant">常量 (Constant)</h4>
<div class="highlight" id="id-6"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 常量說明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @type {常量类型}
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-7"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 请求地址
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @type {String}
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kr">const</span> <span class="nx">REQUEST_URL</span> <span class="o">=</span> <span class="s1">&#39;http://localhost:8080&#39;</span><span class="p">;</span></span></span></code></pre></td></tr></table>
</div>
</div><h4 id="函數方法-function-method">函數、方法 (Function, Method)</h4>
<div class="highlight" id="id-8"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 函数用途说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} 参数名称参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} [选择性参数名称] 参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {参数类型} [选择性参数名称=参数预设值] 参数说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns {返回值类型} 返回值说明
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-9"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl"><span class="cm">/**
</span></span></span><span class="line"><span class="cl"><span class="cm"> * 取得使用者
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {Int} userId 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {Object} [options] 其他选项
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @param {String} [options.query=&#39;a&#39;] 查询关键词 默认为 &#39;a&#39;
</span></span></span><span class="line"><span class="cl"><span class="cm"> * @returns {Object} 使用者资料
</span></span></span><span class="line"><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">getUser</span><span class="p">(</span><span class="nx">userId</span><span class="p">,</span> <span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="nx">user</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="vue">Vue</h2>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="java">Java</h2>
<p>Java 注释应该遵循 JavaDoc 的标准撰写</p>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="php">PHP</h2>
<h3 id="前端参数取得">前端参数取得</h3>
<p>参数取得需通过 filter_input 函数取得，不得使用 _GET 、_POST</p>
<h3 id="输出到前台">输出到前台</h3>
<p>参数命名必须为：全部小写，不同单字以「_」分隔</p>
<h3 id="注解">注解</h3>
<p>PHP 注解应该遵循 PHPDoc 的标准撰写</p>
<h3 id="成员变量-member">成员变量 (Member)</h3>
<p>成员变量只的是 Class 内的成员变数，我们都会要求替成员变量增加注解说明。通常 Function 的变量除非太特别否则都不需要特别注解说明。</p>
<div class="highlight" id="id-10"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 成员变量說明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @type {类型}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-11"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @type {String}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="nv">$userId</span> <span class="o">=</span> <span class="s1">&#39;Hello&#39;</span><span class="p">;</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="函数方法-function-method">函数、方法 (Function, Method)</h3>
<div class="highlight" id="id-12"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 函数用途说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param 参数型态 参数名称 参数说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @option 参数选项类型 参数选项名称 参数选项说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @uses 全局变量 全域变数说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @returns 返回值类型 返回值说明
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>Example</strong></p>
<div class="highlight" id="id-13"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 取得使用者
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param int userId 使用者 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @param object options 其他选项
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @option string options[&#39;query&#39;] 查询关键字
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @uses $_POST[&#39;role_id&#39;] 从前端以 POST 取得角色 ID
</span></span></span><span class="line"><span class="cl"><span class="sd"> * @returns object 使用者资料
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="k">function</span> <span class="nf">getUser</span> <span class="p">(</span><span class="nv">$userId</span><span class="p">,</span> <span class="nv">$options</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// do something
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>  <span class="k">return</span> <span class="nv">$user</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">};</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="python">Python</h2>
<ul>
<li><i class="fa-regular fa-square fa-fw" aria-hidden="true"></i> 待补充</li>
</ul>
<h2 id="database">Database</h2>
<ul>
<li>禁止使用 Table Join。</li>
<li>禁止使用 Oracle Trigger。</li>
<li>禁止将查询数据库的 SQL 放在循环中查询</li>
</ul>
<h3 id="sql-撰写">SQL 撰写</h3>
<ul>
<li>属于 SQL 语法使用大写（SELECT，WHERE，INSERT etc..）</li>
<li>属于使用者自己定义的使用小写（表名 table name，字段名 column name etc..）</li>
<li>表名、字段名前后需加上 `</li>
</ul>
<p><strong>Example</strong></p>
<div class="highlight" id="id-14"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">INSERT</span><span class="w"> </span><span class="k">INTO</span><span class="w"> </span><span class="o">`</span><span class="k">user</span><span class="o">`</span><span class="w"> </span><span class="k">VALUES</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;b&#39;</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="统一用词">统一用词</h2>
<blockquote>
<p>系统中常用词，例如弹出框按钮、搜索框等，仅为举例，不限与此。</p>
</blockquote>
<table>
<thead>
<tr>
<th style="text-align:left">用词</th>
<th style="text-align:left">统一</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left">最后、最终</td>
<td style="text-align:left">最后</td>
</tr>
<tr>
<td style="text-align:left">关闭、Cancel、取消</td>
<td style="text-align:left">取消</td>
</tr>
<tr>
<td style="text-align:left">存储、保存、修改、OK、确定</td>
<td style="text-align:left">确定</td>
</tr>
<tr>
<td style="text-align:left">搜寻、查询、查找、搜索</td>
<td style="text-align:left">搜索</td>
</tr>
</tbody>
</table>
]]></description></item></channel></rss>