PageSourceSearch

https://gowind.cloud/assets/contribution.html-DtEFhDqC.js

js gowind.cloud collected 2026-10-05 22:12:42 UTC 83,725 bytes, 384 lines download raw bytes

1import{_ as s,c as a,a as e,o as l}from"./app-B7HVJ7q3.js";const i={};function p(t,n){return l(),a("div",null,[...n[0]||(n[0]=[e(`<h1 id="贡献指南" tabindex="-1"><a class="header-anchor" href="#贡献指南"><span>贡献指南</span></a></h1><p>感谢您对 GoWind 项目的兴趣!本指南将帮助您了解如何为项目做出贡献。</p><h2 id="目录" tabindex="-1"><a class="header-anchor" href="#目录"><span>目录</span></a></h2><ul><li><a href="#%E8%B4%A1%E7%8C%AE%E6%96%B9%E5%BC%8F">贡献方式</a></li><li><a href="#%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E8%AE%BE%E7%BD%AE">开发环境设置</a></li><li><a href="#%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83">代码规范</a></li><li><a href="#%E6%8F%90%E4%BA%A4%E6%B5%81%E7%A8%8B">提交流程</a></li><li><a href="#pull-request-%E6%8C%87%E5%8D%97">Pull Request 指南</a></li><li><a href="#%E6%8A%A5%E5%91%8A-bug">报告 Bug</a></li><li><a href="#%E5%8A%9F%E8%83%BD%E5%BB%BA%E8%AE%AE">功能建议</a></li><li><a href="#%E8%AE%B8%E5%8F%AF%E8%AF%81">许可证</a></li></ul><hr><h2 id="贡献方式" tabindex="-1"><a class="header-anchor" href="#贡献方式"><span>贡献方式</span></a></h2><p>我们欢迎以下形式的贡献:</p><h3 id="_1-代码贡献" tabindex="-1"><a class="header-anchor" href="#_1-代码贡献"><span>1. 代码贡献</span></a></h3><ul><li>实现新功能</li><li>修复已知 Bug</li><li>优化性能</li><li>改进代码质量</li></ul><h3 id="_2-文档贡献" tabindex="-1"><a class="header-anchor" href="#_2-文档贡献"><span>2. 文档贡献</span></a></h3><ul><li>编写或改进文档</li><li>完善 API 注释</li><li>翻译文档</li><li>补充使用示例</li></ul><h3 id="_3-测试贡献" tabindex="-1"><a class="header-anchor" href="#_3-测试贡献"><span>3. 测试贡献</span></a></h3><ul><li>编写单元测试</li><li>编写集成测试</li><li>发现并报告 Bug</li><li>提供测试用例</li></ul><h3 id="_4-社区贡献" tabindex="-1"><a class="header-anchor" href="#_4-社区贡献"><span>4. 社区贡献</span></a></h3><ul><li>在 GitHub Issues 中回答问题</li><li>参与 Discussions 讨论</li><li>分享使用经验和最佳实践</li><li>推荐给更多用户</li></ul><hr><h2 id="开发环境设置" tabindex="-1"><a class="header-anchor" href="#开发环境设置"><span>开发环境设置</span></a></h2><h3 id="第一步-fork-项目" tabindex="-1"><a class="header-anchor" href="#第一步-fork-项目"><span>第一步:Fork 项目</span></a></h3><p>访问 <a href="https://github.com/tx7do/go-wind-admin" target="_blank" rel="noopener noreferrer">GoWind Admin 仓库</a>,点击右上角的 <strong>Fork</strong> 按钮。</p><h3 id="第二步-克隆您的-fork" tabindex="-1"><a class="header-anchor" href="#第二步-克隆您的-fork"><span>第二步:克隆您的 Fork</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token function">git</span> clone https://github.com/YOUR_USERNAME/go-wind-admin.git</span>
2<span class="line"><span class="token builtin class-name">cd</span> go-wind-admin</span>
3<span class="line"></span>
4<span class="line"><span class="token comment"># 添加上游仓库</span></span>
5<span class="line"><span class="token function">git</span> remote <span class="token function">add</span> upstream https://github.com/tx7do/go-wind-admin.git</span>
6<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第三步-创建功能分支" tabindex="-1"><a class="header-anchor" href="#第三步-创建功能分支"><span>第三步:创建功能分支</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 拉取最新代码</span></span>
7<span class="line"><span class="token function">git</span> fetch upstream</span>
8<span class="line"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> feature/your-feature-name upstream/main</span>
9<span class="line"></span>
10<span class="line"><span class="token comment"># 或者修复 Bug</span></span>
11<span class="line"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> fix/your-bug-fix upstream/main</span>
12<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第四步-安装依赖" tabindex="-1"><a class="header-anchor" href="#第四步-安装依赖"><span>第四步:安装依赖</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 后端依赖</span></span>
13<span class="line"><span class="token builtin class-name">cd</span> backend</span>
14<span class="line">go mod download</span>
15<span class="line"><span class="token function">make</span> init</span>
16<span class="line"><span class="token function">make</span> cli</span>
17<span class="line"></span>
18<span class="line"><span class="token comment"># 前端依赖</span></span>
19<span class="line"><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/frontend</span>
20<span class="line"><span class="token function">pnpm</span> <span class="token function">install</span></span>
21<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第五步-启动开发环境" tabindex="-1"><a class="header-anchor" href="#第五步-启动开发环境"><span>第五步:启动开发环境</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 终端 1: 启动后端服务</span></span>
22<span class="line"><span class="token builtin class-name">cd</span> backend</span>
23<span class="line">gow run admin</span>
24<span class="line"></span>
25<span class="line"><span class="token comment"># 终端 2: 启动前端开发服务</span></span>
26<span class="line"><span class="token builtin class-name">cd</span> frontend</span>
27<span class="line"><span class="token function">pnpm</span> dev:antd</span>
28<span class="line"></span>
29<span class="line"><span class="token comment"># 终端 3: 运行测试(可选)</span></span>
30<span class="line"><span class="token builtin class-name">cd</span> backend</span>
31<span class="line"><span class="token function">make</span> <span class="token builtin class-name">test</span></span>
32<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><hr><h2 id="代码规范" tabindex="-1">
32<a class="header-anchor" href="#代码规范"><span>代码规范</span></a></h2><h3 id="后端代码规范-go" tabindex="-1"><a class="header-anchor" href="#后端代码规范-go"><span>后端代码规范(Go)</span></a></h3><h4 id="命名规范" tabindex="-1"><a class="header-anchor" href="#命名规范"><span>命名规范</span></a></h4><div class="language-go line-numbers-mode" data-highlighter="prismjs" data-ext="go"><pre><code><span class="line"><span class="token comment">// 包名:小写,不使用下划线</span></span>
33<span class="line"><span class="token keyword">package</span> mypackage</span>
34<span class="line"></span>
35<span class="line"><span class="token comment">// 常量:PascalCase</span></span>
36<span class="line"><span class="token keyword">const</span> <span class="token punctuation">(</span></span>
37<span class="line">    MaxConnections <span class="token operator">=</span> <span class="token number">100</span></span>
38<span class="line">    DefaultTimeout <span class="token operator">=</span> <span class="token number">30</span></span>
39<span class="line"><span class="token punctuation">)</span></span>
40<span class="line"></span>
41<span class="line"><span class="token comment">// 函数名:PascalCase(导出)或 camelCase(私有)</span></span>
42<span class="line"><span class="token keyword">func</span> <span class="token function">GetUserByID</span><span class="token punctuation">(</span>id <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>User<span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
43<span class="line">    <span class="token comment">// ...</span></span>
44<span class="line"><span class="token punctuation">}</span></span>
45<span class="line"></span>
46<span class="line"><span class="token keyword">func</span> <span class="token function">fetchUserData</span><span class="token punctuation">(</span>id <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>userData<span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
47<span class="line">    <span class="token comment">// ...</span></span>
48<span class="line"><span class="token punctuation">}</span></span>
49<span class="line"></span>
50<span class="line"><span class="token comment">// 变量名:camelCase</span></span>
51<span class="line"><span class="token keyword">var</span> <span class="token punctuation">(</span></span>
52<span class="line">    userName <span class="token builtin">string</span></span>
53<span class="line">    userAge  <span class="token builtin">int</span></span>
54<span class="line"><span class="token punctuation">)</span></span>
55<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="代码格式化" tabindex="-1"><a class="header-anchor" href="#代码格式化"><span>代码格式化</span></a></h4><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment">
55# 使用 gofmt 格式化代码</span></span>
56<span class="line">gofmt <span class="token parameter variable">-w</span> <span class="token builtin class-name">.</span></span>
57<span class="line"></span>
58<span class="line"><span class="token comment"># 或者使用 go fmt 命令</span></span>
59<span class="line">go <span class="token function">fmt</span> ./<span class="token punctuation">..</span>.</span>
60<span class="line"></span>
61<span class="line"><span class="token comment"># 检查代码风格问题</span></span>
62<span class="line">golangci-lint run</span>
63<span class="line"></span>
64<span class="line"><span class="token comment"># 自动修复某些问题</span></span>
65<span class="line">golint ./<span class="token punctuation">..</span>. <span class="token operator">|</span> <span class="token function">head</span> <span class="token parameter variable">-20</span></span>
66<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="代码注释" tabindex="-1"><a class="header-anchor" href="#代码注释"><span>代码注释</span></a></h4><div class="language-go line-numbers-mode" data-highlighter="prismjs" data-ext="go"><pre><code><span class="line"><span class="token comment">// GetUserByID 根据用户 ID 获取用户信息</span></span>
67<span class="line"><span class="token comment">// 返回用户对象和可能的错误</span></span>
68<span class="line"><span class="token keyword">func</span> <span class="token function">GetUserByID</span><span class="token punctuation">(</span>id <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token operator">*</span>User<span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
69<span class="line">    <span class="token comment">// 首先查询缓存</span></span>
70<span class="line">    <span class="token keyword">if</span> cached <span class="token operator">:=</span> cache<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span> cached <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span></span>
71<span class="line">        <span class="token keyword">return</span> cached<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>User<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">nil</span></span>
72<span class="line">    <span class="token punctuation">}</span></span>
73<span class="line">    </span>
74<span class="line">    <span class="token comment">// 从数据库查询</span></span>
75<span class="line">    user<span class="token punctuation">,</span> err <span class="token operator">:=</span> db<span class="token punctuation">.</span><span class="token function">Query</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span></span>
76<span class="line">    <span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span></span>
77<span class="line">        <span class="token keyword">return</span> <span class="token boolean">nil</span><span class="token punctuation">,</span> fmt<span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">&quot;failed to query user: %w&quot;</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span></span>
78<span class="line">    <span class="token punctuation">}</span></span>
79<span class="line">    </span>
80<span class="line">    <span class="token comment">// 缓存结果</span></span>
81<span class="line">    cache<span class="token punctuation">.</span><span class="token function">Set</span><span class="token punctuation">(</span>id<span class="token punctuation">,</span> user<span class="token punctuation">)</span></span>
82<span class="line">    <span class="token keyword">return</span> user<span class="token punctuation">,</span> <span class="token boolean">nil</span></span>
83<span class="line"><span class="token punctuation">}</span></span>
84<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="错误处理" tabindex="-1"><a class="header-anchor" href="#错误处理"><span>错误处理</span></a></h4><div class="language-go line-numbers-mode" data-highlighter="prismjs" data-ext="go"><pre><code><span class="line"><span class="token comment">// ❌ 不推荐:忽略错误</span></span>
85<span class="line"><span class="token boolean">_</span> <span class="token operator">=</span> json<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token operator">&amp;</span>obj<span class="token punctuation">)</span></span>
86<span class="line"></span>
87<span class="line"><span class="token comment">// ✅ 推荐:处理错误</span></span>
88<span class="line"><span class="token keyword">if</span> err <span class="token operator">:=</span> json<span class="token punctuation">.</span><span class="token function">Unmarshal</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> <span class="token operator">&amp;</span>obj<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span></span>
89<span class="line">    <span class="token keyword">return</span> fmt<span class="token punctuation">.</span><span class="token function">
89Errorf</span><span class="token punctuation">(</span><span class="token string">&quot;failed to unmarshal data: %w&quot;</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span></span>
90<span class="line"><span class="token punctuation">}</span></span>
91<span class="line"></span>
92<span class="line"><span class="token comment">// ✅ 使用错误包装</span></span>
93<span class="line">err <span class="token operator">:=</span> <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
94<span class="line"><span class="token keyword">if</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span></span>
95<span class="line">    <span class="token keyword">return</span> fmt<span class="token punctuation">.</span><span class="token function">Errorf</span><span class="token punctuation">(</span><span class="token string">&quot;operation failed: %w&quot;</span><span class="token punctuation">,</span> err<span class="token punctuation">)</span></span>
96<span class="line"><span class="token punctuation">}</span></span>
97<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="前端代码规范-typescript-vue" tabindex="-1"><a class="header-anchor" href="#前端代码规范-typescript-vue"><span>前端代码规范(TypeScript/Vue)</span></a></h3><h4 id="文件结构" tabindex="-1"><a class="header-anchor" href="#文件结构"><span>文件结构</span></a></h4><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code><span class="line">src/</span>
98<span class="line">├── components/        # 公共组件</span>
99<span class="line">│   ├── Button.vue</span>
100<span class="line">│   └── Modal.vue</span>
101<span class="line">├── views/            # 页面组件</span>
102<span class="line">│   ├── Dashboard.vue</span>
103<span class="line">│   └── UserList.vue</span>
104<span class="line">├── stores/           # Pinia 状态管理</span>
105<span class="line">│   └── userStore.ts</span>
106<span class="line">├── services/         # API 服务</span>
107<span class="line">│   └── userService.ts</span>
108<span class="line">├── types/            # TypeScript 类型定义</span>
109<span class="line">│   └── user.ts</span>
110<span class="line">└── utils/            # 工具函数</span>
111<span class="line">    └── format.ts</span>
112<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="命名规范-1" tabindex="-1"><a class="header-anchor" href="#命名规范-1"><span>命名规范</span></a></h4><div class="language-typescript line-numbers-mode" data-highlighter="prismjs" data-ext="ts"><pre><code><span class="line"><span class="token comment">// 组件文件:PascalCase</span></span>
113<span class="line"><span class="token comment">// components/UserCard.vue</span></span>
114<span class="line"></span>
115<span class="line"><span class="token comment">// 页面文件:PascalCase</span></span>
116<span class="line"><span class="token comment">// views/UserDetail.vue</span></span>
117<span class="line"></span>
118<span class="line"><span class="token comment">
118// 工具文件:camelCase</span></span>
119<span class="line"><span class="token comment">// utils/formatDate.ts</span></span>
120<span class="line"></span>
121<span class="line"><span class="token comment">// 类型定义:PascalCase</span></span>
122<span class="line"><span class="token keyword">interface</span> <span class="token class-name">User</span> <span class="token punctuation">{</span></span>
123<span class="line">    id<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span></span>
124<span class="line">    name<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span></span>
125<span class="line"><span class="token punctuation">}</span></span>
126<span class="line"></span>
127<span class="line"><span class="token keyword">type</span> <span class="token class-name">UserRole</span> <span class="token operator">=</span> <span class="token string">&#39;admin&#39;</span> <span class="token operator">|</span> <span class="token string">&#39;user&#39;</span> <span class="token operator">|</span> <span class="token string">&#39;guest&#39;</span><span class="token punctuation">;</span></span>
128<span class="line"></span>
129<span class="line"><span class="token comment">// 常量:UPPER_SNAKE_CASE</span></span>
130<span class="line"><span class="token keyword">const</span> <span class="token constant">MAX_RETRIES</span> <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span></span>
131<span class="line"><span class="token keyword">const</span> <span class="token constant">API_BASE_URL</span> <span class="token operator">=</span> <span class="token string">&#39;https://api.example.com&#39;</span><span class="token punctuation">;</span></span>
132<span class="line"></span>
133<span class="line"><span class="token comment">// 函数和变量:camelCase</span></span>
134<span class="line"><span class="token keyword">function</span> <span class="token function">getUserData</span><span class="token punctuation">(</span>userId<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
135<span class="line">    <span class="token comment">// ...</span></span>
136<span class="line"><span class="token punctuation">}</span></span>
137<span class="line"></span>
138<span class="line"><span class="token keyword">const</span> userData <span class="token operator">=</span> <span class="token generic-function"><span class="token function">ref</span><span class="token generic class-name"><span class="token operator">&lt;</span>User <span class="token operator">|</span> <span class="token keyword">null</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
139<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="代码格式化-1" tabindex="-1"><a class="header-anchor" href="#代码格式化-1"><span>代码格式化</span></a></h4><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment">
139# 使用 ESLint 检查代码</span></span>
140<span class="line"><span class="token function">pnpm</span> lint</span>
141<span class="line"></span>
142<span class="line"><span class="token comment"># 使用 Prettier 格式化代码</span></span>
143<span class="line"><span class="token function">pnpm</span> <span class="token function">format</span></span>
144<span class="line"></span>
145<span class="line"><span class="token comment"># 修复 ESLint 问题</span></span>
146<span class="line"><span class="token function">pnpm</span> lint:fix</span>
147<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="vue3-规范" tabindex="-1"><a class="header-anchor" href="#vue3-规范"><span>Vue3 规范</span></a></h4><div class="language-typescript line-numbers-mode" data-highlighter="prismjs" data-ext="ts"><pre><code><span class="line"><span class="token comment">// ✅ 推荐:使用 &lt;script setup&gt; 语法</span></span>
148<span class="line"><span class="token operator">&lt;</span>script setup</span>
149<span class="line">lang <span class="token operator">=</span> <span class="token string">&quot;ts&quot;</span> <span class="token operator">&gt;</span></span>
150<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span>ref<span class="token punctuation">,</span> computed<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">&#39;vue&#39;</span></span>
151<span class="line"><span class="token keyword">import</span> <span class="token keyword">type</span> <span class="token punctuation">{</span>User<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">&#39;@/types/user&#39;</span></span>
152<span class="line"></span>
153<span class="line"><span class="token keyword">const</span> userName <span class="token operator">=</span> <span class="token generic-function"><span class="token function">ref</span><span class="token generic class-name"><span class="token operator">&lt;</span><span class="token builtin">string</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token string">&#39;&#39;</span><span class="token punctuation">)</span></span>
154<span class="line"><span class="token keyword">const</span> userList <span class="token operator">=</span> <span class="token generic-function"><span class="token function">ref</span><span class="token generic class-name"><span class="token operator">&lt;</span>User<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token operator">&gt;</span></span></span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
155<span class="line"></span>
156<span class="line"><span class="token keyword">const</span> filteredList <span class="token operator">=</span> <span class="token function">computed</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
157<span class="line">    <span class="token keyword">return</span> userList<span class="token punctuation">.</span>value<span class="token punctuation">.</span><span class="token function">filter</span><span class="token punctuation">(</span>user <span class="token operator">=&gt;</span></span>
158<span class="line">        user<span class="token punctuation">.</span>name<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span>userName<span class="token punctuation">.</span>value<span class="token punctuation">)</span></span>
159<span class="line">    <span class="token punctuation">)</span></span>
160<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span></span>
161<span class="line"></span>
162<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">handleSubmit</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
163<span class="line">    <span class="token comment">// 处理提交</span></span>
164<span class="line"><span class="token punctuation">}</span></span>
165<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span></span>
166<span class="line"></span>
167<span class="line"><span class="token operator">&lt;</span> template <span class="token operator">&gt;</span></span>
168<span class="line"><span class="token operator">&lt;</span>div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">&quot;user-container&quot;</span> <span class="token operator">&gt;</span></span>
169<span class="line"><span class="token operator">&lt;</span>input v <span class="token operator">-</span> model <span class="token operator">=</span> <span class="token string">&quot;userName&quot;</span></span>
170<span class="line">placeholder <span class="token operator">=</span> <span class="token string">&quot;搜索用户&quot;</span> <span class="token operator">/</span> <span class="token operator">&gt;</span></span>
171<span class="line">    <span class="token operator">&lt;</span>ul<span class="token operator">&gt;</span></span>
172<span class="line">
172        <span class="token operator">&lt;</span>li v <span class="token operator">-</span></span>
173<span class="line"><span class="token keyword">for</span><span class="token operator">=</span> <span class="token string">&quot;user in filteredList&quot;</span> <span class="token operator">:</span></span>
174<span class="line">key <span class="token operator">=</span> <span class="token string">&quot;user.id&quot;</span> <span class="token operator">&gt;</span></span>
175<span class="line">    <span class="token punctuation">{</span></span>
176<span class="line"><span class="token punctuation">{</span></span>
177<span class="line">    user<span class="token punctuation">.</span>name</span>
178<span class="line"><span class="token punctuation">}</span></span>
179<span class="line"><span class="token punctuation">}</span></span>
180<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>li<span class="token operator">&gt;</span></span>
181<span class="line"><span class="token operator">&lt;</span> <span class="token operator">/</span>ul<span class="token operator">&gt;</span></span>
182<span class="line"><span class="token operator">&lt;</span> <span class="token operator">/</span>div<span class="token operator">&gt;</span></span>
183<span class="line"><span class="token operator">&lt;</span> <span class="token operator">/</span>template<span class="token operator">&gt;</span></span>
184<span class="line"></span>
185<span class="line"><span class="token operator">&lt;</span> style</span>
186<span class="line">scoped <span class="token operator">&gt;</span></span>
187<span class="line"><span class="token punctuation">.</span></span>
188<span class="line">user <span class="token operator">-</span> container</span>
189<span class="line"><span class="token punctuation">{</span></span>
190<span class="line">    padding<span class="token operator">:</span> <span class="token number">20</span></span>
191<span class="line">    px<span class="token punctuation">;</span></span>
192<span class="line"><span class="token punctuation">}</span></span>
193<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>style<span class="token operator">&gt;</span></span>
194<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="typescript-规范" tabindex="-1"><a class="header-anchor" href="#typescript-规范"><span>TypeScript 规范</span></a></h4><div class="language-typescript line-numbers-mode" data-highlighter="prismjs" data-ext="ts"><pre><code><span class="line"><span class="token comment">// 总是明确指定类型</span></span>
195<span class="line"><span class="token keyword">interface</span> <span class="token class-name">UserResponse</span> <span class="token punctuation">{</span></span>
196<span class="line">    code<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">;</span></span>
197<span class="line">    message<span class="token operator">:</span> <span class="token builtin">string</span><span class="token punctuation">;</span></span>
198<span class="line">    data<span class="token operator">:</span> User <span class="token operator">|</span> <span class="token keyword">null</span><span class="token punctuation">;</span></span>
199<span class="line"><span class="token punctuation">}</span></span>
200<span class="line"></span>
201<span class="line"><span class="token comment">// ✅ 推荐</span></span>
202<span class="line"><span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">getUserData</span><span class="token punctuation">(</span>id<span class="token operator">:</span> <span class="token builtin">number</span><span class="token punctuation">)</span><span class="token operator">:</span> <span class="token builtin">Promise</span><span class="token operator">&lt;</span>User <span class="token operator">|</span> <span class="token keyword">null</span><span class="token operator">&gt;</span> <span class="token punctuation">{</span></span>
203<span class="line">    <span class="token keyword">try</span> <span class="token punctuation">{</span></span>
204<span class="line">
204        <span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token string">/api/users/</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">\${</span>id<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">\`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
205<span class="line">        <span class="token keyword">const</span> data<span class="token operator">:</span> UserResponse <span class="token operator">=</span> <span class="token keyword">await</span> response<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
206<span class="line">        <span class="token keyword">return</span> data<span class="token punctuation">.</span>data<span class="token punctuation">;</span></span>
207<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>error<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
208<span class="line">        <span class="token builtin">console</span><span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">&#39;Failed to fetch user:&#39;</span><span class="token punctuation">,</span> error<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
209<span class="line">        <span class="token keyword">return</span> <span class="token keyword">null</span><span class="token punctuation">;</span></span>
210<span class="line">    <span class="token punctuation">}</span></span>
211<span class="line"><span class="token punctuation">}</span></span>
212<span class="line"></span>
213<span class="line"><span class="token comment">// ❌ 不推荐</span></span>
214<span class="line"><span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">getUserData</span><span class="token punctuation">(</span>id<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
215<span class="line">    <span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span><span class="token punctuation">(</span><span class="token template-string"><span class="token template-punctuation string">\`</span><span class="token string">/api/users/</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">\${</span>id<span class="token interpolation-punctuation punctuation">}</span></span><span class="token template-punctuation string">\`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
216<span class="line">    <span class="token keyword">return</span> response<span class="token punctuation">.</span><span class="token function">json</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
217<span class="line"><span class="token punctuation">}</span></span>
218<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="protobuf-规范" tabindex="-1"><a class="header-anchor" href="#protobuf-规范"><span>
218Protobuf 规范</span></a></h3><div class="language-protobuf line-numbers-mode" data-highlighter="prismjs" data-ext="protobuf"><pre><code><span class="line"><span class="token comment">// 包名:小写</span></span>
219<span class="line"><span class="token keyword">package</span> api<span class="token punctuation">.</span>v1<span class="token punctuation">;</span></span>
220<span class="line"></span>
221<span class="line"><span class="token comment">// 消息名:PascalCase</span></span>
222<span class="line"><span class="token keyword">message</span> <span class="token class-name">CreateUserRequest</span> <span class="token punctuation">{</span></span>
223<span class="line">    <span class="token comment">// 字段名:snake_case</span></span>
224<span class="line">    <span class="token builtin">string</span> user_name <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
225<span class="line">    <span class="token builtin">string</span> user_email <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span></span>
226<span class="line">    <span class="token builtin">int32</span> user_age <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span></span>
227<span class="line"><span class="token punctuation">}</span></span>
228<span class="line"></span>
229<span class="line"><span class="token comment">// 服务名:PascalCase</span></span>
230<span class="line"><span class="token keyword">service</span> <span class="token class-name">UserService</span> <span class="token punctuation">{</span></span>
231<span class="line">    <span class="token keyword">rpc</span> <span class="token function">GetUser</span><span class="token punctuation">(</span><span class="token class-name">GetUserRequest</span><span class="token punctuation">)</span> <span class="token keyword">returns</span> <span class="token punctuation">(</span><span class="token class-name">GetUserResponse</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
232<span class="line">    <span class="token keyword">rpc</span> <span class="token function">CreateUser</span><span class="token punctuation">(</span><span class="token class-name">CreateUserRequest</span><span class="token punctuation">)</span> <span class="token keyword">returns</span> <span class="token punctuation">(</span><span class="token class-name">CreateUserResponse</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
233<span class="line"><span class="token punctuation">}</span></span>
234<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><hr><h2 id="提交流程" tabindex="-1"><a class="header-anchor" href="#提交流程"><span>提交流程</span></a></h2><h3 id="第一步-开发代码" tabindex="-1"><a class="header-anchor" href="#第一步-开发代码"><span>第一步:开发代码</span></a></h3><p>在本地开发分支上实现您的功能或修复。</p><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 查看修改的文件</span></span>
235<span class="line"><span class="token function">git</span> status</span>
236<span class="line"></span>
237<span class="line"><span class="token comment"># 查看具体修改</span></span>
238<span class="line"><span class="token function">git</span> <span class="token function">diff</span></span>
239<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第二步-运行测试和检查" tabindex="-1"><a class="header-anchor" href="#第二步-运行测试和检查"><span>第二步:运行测试和检查</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 后端</span></span>
240<span class="line"><span class="token builtin class-name">cd</span> backend</span>
241<span class="line"><span class="token function">make</span> <span class="token builtin class-name">test</span>
241      <span class="token comment"># 运行单元测试</span></span>
242<span class="line"><span class="token function">make</span> lint      <span class="token comment"># 代码检查</span></span>
243<span class="line"><span class="token function">make</span> cover     <span class="token comment"># 测试覆盖率</span></span>
244<span class="line"></span>
245<span class="line"><span class="token comment"># 前端</span></span>
246<span class="line"><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/frontend</span>
247<span class="line"><span class="token function">pnpm</span> <span class="token builtin class-name">test</span>      <span class="token comment"># 运行测试</span></span>
248<span class="line"><span class="token function">pnpm</span> lint      <span class="token comment"># 代码检查</span></span>
249<span class="line"><span class="token function">pnpm</span> build     <span class="token comment"># 构建检查</span></span>
250<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第三步-提交代码" tabindex="-1"><a class="header-anchor" href="#第三步-提交代码"><span>第三步:提交代码</span></a></h3><p>使用规范的 Commit 消息格式(遵循 Conventional Commits):</p><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span></span>
251<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">&quot;type(scope): description&quot;</span></span>
252<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="commit-消息格式" tabindex="-1"><a class="header-anchor" href="#commit-消息格式"><span>Commit 消息格式</span></a></h4><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code><span class="line">&lt;type&gt;(&lt;scope&gt;): &lt;subject&gt;</span>
253<span class="line"></span>
254<span class="line">&lt;body&gt;</span>
255<span class="line"></span>
256<span class="line">&lt;footer&gt;</span>
257<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="类型-type" tabindex="-1"><a class="header-anchor" href="#类型-type"><span>类型(type)</span></a></h4><ul><li><code>feat</code>: 新功能</li><li><code>fix</code>: Bug 修复</li><li><code>docs</code>: 文档改动</li><li><code>style</code>: 代码风格改动(格式化、分号等)</li><li><code>refactor</code>: 代码重构(不涉及功能改动)</li><li><code>perf</code>: 性能改进</li><li><code>test</code>: 测试相关</li><li><code>chore</code>: 构建、依赖、工具等改动</li><li><code>ci</code>: CI/CD 配置改动</li></ul><h4 id="例子" tabindex="-1"><a class="header-anchor" href="#例子"><span>例子</span></a></h4><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 新增用户模块的获取功能</span></span>
258<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">&quot;feat(user): add get user by id endpoint&quot;</span></span>
259<span class="line"></span>
260<span class="line"><span class="token comment"># 修复权限检查的 Bug</span></span>
261<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">&quot;fix(auth): correct permission validation logic&quot;</span></span>
262<span class="line"></span>
263<span class="line"><span class="token comment"># 更新快速开始文档</span></span>
264<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">&quot;docs(readme): update quick start guide&quot;</span></span>
265<span class="line"></span>
266<span class="line"><span class="token comment"># 优化数据库查询性能</span></span>
267<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">&quot;perf(db): optimize user query with indexes&quot;</span></span>
268<span class="line"></span>
269<span class="line"><span class="token comment"># 详细的提交消息</span></span>
270<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">&quot;feat(user): add user pagination support</span>
271<span class="line"></span>
272<span class="line">- Add page and limit query parameters</span>
273<span class="line">- Add total count in response</span>
274<span class="line">- Add pagination metadata</span>
275<span class="line"></span>
276<span class="line">Closes #123&quot;</span></span>
277<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第四步-推送代码" tabindex="-1"><a class="header-anchor" href="#第四步-推送代码"><span>第四步:推送代码</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 推送到你的 Fork</span></span>
278<span class="line"><span class="token function">git</span>
278 push origin feature/your-feature-name</span>
279<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="第五步-创建-pull-request" tabindex="-1"><a class="header-anchor" href="#第五步-创建-pull-request"><span>第五步:创建 Pull Request</span></a></h3><p>在 GitHub 上创建 Pull Request。</p><hr><h2 id="pull-request-指南" tabindex="-1"><a class="header-anchor" href="#pull-request-指南"><span>Pull Request 指南</span></a></h2><h3 id="pr-标题规范" tabindex="-1"><a class="header-anchor" href="#pr-标题规范"><span>PR 标题规范</span></a></h3><p>使用相同的格式作为 Commit 消息:</p><div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code><span class="line">feat(admin): add user management page</span>
280<span class="line"></span>
281<span class="line">fix(auth): resolve login failure issue</span>
282<span class="line"></span>
283<span class="line">docs: update installation guide</span>
284<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="pr-描述模板" tabindex="-1"><a class="header-anchor" href="#pr-描述模板"><span>PR 描述模板</span></a></h3><div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code><span class="line"><span class="token title important"><span class="token punctuation">##</span> 描述</span></span>
285<span class="line"></span>
286<span class="line">请简要描述您的更改内容。</span>
287<span class="line"></span>
288<span class="line"><span class="token title important"><span class="token punctuation">##</span> 相关 Issue</span></span>
289<span class="line"></span>
290<span class="line">Closes #123</span>
291<span class="line"></span>
292<span class="line"><span class="token title important"><span class="token punctuation">##</span> 变更类型</span></span>
293<span class="line"></span>
294<span class="line"><span class="token list punctuation">-</span> [ ] Bug 修复</span>
295<span class="line"><span class="token list punctuation">-</span> [ ] 新功能</span>
296<span class="line"><span class="token list punctuation">-</span> [ ] Breaking 改动</span>
297<span class="line"><span class="token list punctuation">-</span> [ ] 文档改动</span>
298<span class="line"></span>
299<span class="line"><span class="token title important"><span class="token punctuation">##</span> 如何测试</span></span>
300<span class="line"></span>
301<span class="line">请描述测试步骤:</span>
302<span class="line"></span>
303<span class="line"><span class="token list punctuation">1.</span> 打开页面 ...</span>
304<span class="line"><span class="token list punctuation">2.</span> 点击按钮 ...</span>
305<span class="line"><span class="token list punctuation">3.</span> 验证 ...</span>
306<span class="line"></span>
307<span class="line"><span class="token title important"><span class="token punctuation">##</span> 截图(如适用)</span></span>
308<span class="line"></span>
309<span class="line">如果是 UI 改动,请附上截图。</span>
310<span class="line"></span>
311<span class="line"><span class="token title important"><span class="token punctuation">##</span> 检查清单</span></span>
312<span class="line"></span>
313<span class="line"><span class="token list punctuation">-</span> [ ] 我已遵循项目的代码规范</span>
314<span class="line"><span class="token list punctuation">-</span> [ ] 我已更新相关文档</span>
315<span class="line"><span class="token list punctuation">-</span> [ ] 我已添加必要的测试</span>
316<span class="line"><span class="token list punctuation">-</span> [ ] 所有测试都通过了</span>
317<span class="line"><span class="token list punctuation">-</span> [ ] 没有引入新的警告或错误</span>
318<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="pr-审核标准" tabindex="-1"><a class="header-anchor" href="#pr-审核标准"><span>PR 审核标准</span></a></h3><p>我们会从以下几个方面审核 PR:</p><ol><li><strong>功能正确性</strong> - 代码是否实现了预期功能</li><li><strong>代码质量</strong> - 代码是否遵循规范,易于维护</li><li><strong>性能影响</strong> - 是否会影响系统性能</li><li><strong>向后兼容性</strong> - 是否会破坏现有功能</li><li><strong>测试覆盖</strong> - 是否有充分的测试</li><li><strong>文档完整性</strong> - 是否更新了相关文档</li></ol><h3 id="pr-合并要求" tabindex="-1"><a class="header-anchor" href="#pr-合并要求"><span>PR 合并要求</span></a></h3><p>PR 需要满足以下条件才能合并:</p><ul><li>✅ 至少 2 个维护者的批准</li><li>✅ 所有 CI 检查通过</li><li>✅ 无冲突</li><li>✅ 代码审核意见已解决</li></ul><hr><h2 id="报告-bug" tabindex="-1"><a class="header-anchor" href="#报告-bug"><span>报告 Bug</span></a></h2><h3 id="提交-bug-报告" tabindex="-1"><a class="header-anchor" href="#提交-bug-报告"><span>提交 Bug 报告</span></a></h3><p>在 <a href="https://github.com/tx7do/go-wind-admin/issues" target="_blank" rel="noopener noreferrer">GitHub Issues</a> 中创建新 issue。</p><h3 id="bug-报告模板" tabindex="-1"><a class="header-anchor" href="#bug-报告模板"><span>Bug 报告模板</span></a></h3><div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code><span class="line"><span class="token title important"><span class="token punctuation">##</span> Bug 描述</span></span>
319<span class="line"></span>
320<span class="line">清晰简洁地描述 Bug 是什么。</span>
321<span class="line"></span>
322<span class="line"><span class="token title important"><span class="token punctuation">##</span> 重现步骤</span></span>
323<span class="line"></span>
324<span class="line">重现 Bug 的步骤:</span>
325<span class="line"></span>
326<span class="line"><span class="token list punctuation">1.</span> 打开...</span>
327<span class="line"><span class="token list punctuation">2.</span> 点击...</span>
328<span class="line"><span class="token list punctuation">3.</span> 看到错误...</span>
329<span class="line"></span>
330<span class="line"><span class="token title important"><span class="token punctuation">##</span> 预期行为</span></span>
331<span class="line"></span>
332<span class="line">应该发生什么。</span>
333<span class="line"></span>
334<span class="line"><span class="token title important"><span class="token punctuation">##</span> 实际行为</span></span>
335<span class="line"></span>
336<span class="line">实际发生了什么。</span>
337<span class="line"></span>
338<span class="line"><span class="token title important"><span class="token punctuation">##</span> 环境信息</span></span>
339<span class="line"></span>
340<span class="line"><span class="token list punctuation">-</span> OS: [e.g. macOS 12.0]</span>
341<span class="line"><span class="token list punctuation">-</span> Go 版本: [e.g. 1.20]</span>
342<span class="line"><span class="token list punctuation">-</span> Node 版本: [e.g. 18.0]</span>
343<span class="line"><span class="token list punctuation">-</span> 浏览器: [e.g. Chrome 100]</span>
344<span class="line"></span>
345<span class="line"><span class="token title important"><span class="token punctuation">##</span> 错误日志</span></span>
346<span class="line"></span>
347<span class="line">如果有错误日志,请粘贴到这里。</span>
348<span class="line"></span>
349<span class="line"><span class="token title important"><span class="token punctuation">##</span> 附加信息</span></span>
350<span class="line"></span>
351<span class="line">任何其他相关信息。</span>
352<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="bug-报告建议" tabindex="-1"><a class="header-anchor" href="#bug-报告建议"><span>Bug 报告建议</span></a></h3><ul><li>搜索已存在的 issues,避免重复报告</li><li>提供能够重现 Bug 的最小示例</li><li>包含完整的错误栈跟踪</li><li>提供您的环境信息</li><li>如果可能,提供修复建议</li></ul><hr><h2 id="功能建议" tabindex="-1"><a class="header-anchor" href="#功能建议"><span>功能建议</span></a></h2><h3 id="提交功能建议" tabindex="-1"><a class="header-anchor" href="#提交功能建议"><span>提交功能建议</span></a></h3><p>在 <a href="https://github.com/tx7do/go-wind-admin/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a> 中发起讨论,或创建标记为 <code>enhancement</code> 的 Issue。</p><h3 id="功能建议模板" tabindex="-1"><a class="header-anchor" href="#功能建议模板"><span>功能建议模板</span></a></h3><div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code><span class="line"><span class="token title important"><span class="token punctuation">##</span> 功能描述</span></span>
353<span class="line"></span>
354<span class="line">您希望添加什么功能?</span>
355<span class="line"></span>
356<span class="line"><span class="token title important"><span class="token punctuation">##</span> 使用场景</span></span>
357<span class="line"></span>
358<span class="line">这个功能解决什么问题或带来什么好处?</span>
359<span class="line"></span>
360<span class="line"><span class="token title important"><span class="token punctuation">##</span> 建议的实现</span></span>
361<span class="line"></span>
362<span class="line">您有什么实现思路吗?</span>
363<span class="line"></span>
364<span class="line"><span class="token title important"><span class="token punctuation">##</span> 相关功能</span></span>
365<span class="line"></span>
366<span class="line">这与现有的哪些功能相关?</span>
367<span class="line"></span>
368<span class="line"><span class="token title important"><span class="token punctuation">##</span> 附加信息</span></span>
369<span class="line"></span>
370<span class="line">任何其他信息或参考资料。</span>
371<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="功能建议指南" tabindex="-1"><a class="header-anchor" href="#功能建议指南"><span>功能建议指南</span></a></h3><ul><li>描述使用场景和业务价值</li><li>提供尽可能详细的需求说明</li><li>如果可能,提供样例或原型</li><li>考虑与现有功能的一致性</li><li>考虑对性能和兼容性的影响</li></ul><hr><h2 id="开发工具和资源" tabindex="-1"><a class="header-anchor" href="#开发工具和资源"><span>开发工具和资源</span></a></h2><h3 id="推荐的开发工具" tabindex="-1"><a class="header-anchor" href="#推荐的开发工具"><span>推荐的开发工具</span></a></h3><h4 id="后端" tabindex="-1"><a class="header-anchor" href="#后端"><span>后端</span></a></h4><ul><li><strong>IDE</strong>: VS Code (+ Go 扩展) / GoLand</li><li><strong>调试</strong>: Delve 调试器</li><li><strong>性能分析</strong>: pprof</li><li><strong>代码检查</strong>: golangci-lint</li><li><strong>文档</strong>: godoc</li></ul><h4 id="前端" tabindex="-1"><a class="header-anchor" href="#前端"><span>前端</span></a></h4><ul><li><strong>IDE</strong>: VS Code (+ Volar 扩展) / WebStorm</li><li><strong>调试</strong>: Vue DevTools</li><li><strong>性能分析</strong>: Chrome DevTools</li><li><strong>代码检查</strong>: ESLint / Prettier</li><li><strong>文档</strong>: VuePress</li></ul><h3 id="有用的命令" tabindex="-1"><a class="header-anchor" href="#有用的命令"><span>有用的命令</span></a></h3><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code><span class="line"><span class="token comment"># 后端</span></span>
372<span class="line"><span class="token function">make</span>
372 build      <span class="token comment"># 构建二进制文件</span></span>
373<span class="line"><span class="token function">make</span> <span class="token builtin class-name">test</span>       <span class="token comment"># 运行测试</span></span>
374<span class="line"><span class="token function">make</span> lint       <span class="token comment"># 代码检查</span></span>
375<span class="line"><span class="token function">make</span> proto      <span class="token comment"># 生成 API 代码</span></span>
376<span class="line"><span class="token function">make</span> <span class="token function">watch</span>      <span class="token comment"># 热加载开发</span></span>
377<span class="line"></span>
378<span class="line"><span class="token comment"># 前端</span></span>
379<span class="line"><span class="token function">pnpm</span> dev:antd   <span class="token comment"># 开发环境</span></span>
380<span class="line"><span class="token function">pnpm</span> build:antd <span class="token comment"># 生产构建</span></span>
381<span class="line"><span class="token function">pnpm</span> <span class="token builtin class-name">test</span>       <span class="token comment"># 运行测试</span></span>
382<span class="line"><span class="token function">pnpm</span> lint       <span class="token comment"># 代码检查</span></span>
383<span class="line"><span class="token function">pnpm</span> <span class="token function">format</span>     <span class="token comment"># 格式化代码</span></span>
384<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="学习资源" tabindex="-1"><a class="header-anchor" href="#学习资源"><span>学习资源</span></a></h3><ul><li><a href="https://golang.org/doc/" target="_blank" rel="noopener noreferrer">Go 官方文档</a></li><li><a href="https://vuejs.org/" target="_blank" rel="noopener noreferrer">Vue3 官方文档</a></li><li><a href="https://go-kratos.dev/" target="_blank" rel="noopener noreferrer">Kratos 框架文档</a></li><li><a href="https://entgo.io/" target="_blank" rel="noopener noreferrer">Ent ORM 文档</a></li><li><a href="https://developers.google.com/protocol-buffers" target="_blank" rel="noopener noreferrer">Protocol Buffers 文档</a></li></ul><hr><h2 id="社区行为准则" tabindex="-1"><a class="header-anchor" href="#社区行为准则"><span>社区行为准则</span></a></h2><h3 id="我们的承诺" tabindex="-1"><a class="header-anchor" href="#我们的承诺"><span>我们的承诺</span></a></h3><p>在参与本项目和社区时,我们承诺营造一个开放、友好、尊重和包容的环境。</p><h3 id="我们的标准" tabindex="-1"><a class="header-anchor" href="#我们的标准"><span>我们的标准</span></a></h3><p>以下行为是被鼓励的:</p><ul><li>使用欢迎和包容的语言</li><li>尊重不同的意见和经验</li><li>接受建设性批评</li><li>关注对社区最有利的事情</li><li>对其他社区成员表示同情</li></ul><p>以下行为是不可接受的:</p><ul><li>骚扰、侮辱或歧视性评论</li><li>针对个人的人身攻击</li><li>发布他人私人信息,如地址或电子邮件</li><li>不适当的性语言或图像</li><li>其他可能被合理认为不适当的行为</li></ul><h3 id="执行" tabindex="-1"><a class="header-anchor" href="#执行"><span>执行</span></a></h3><p>项目维护者有责任阐明可接受行为的标准,并对不可接受的行为采取适当和公平的纠正措施。</p><p>对于违反本行为准则的行为,可以通过联系项目团队(<a href="mailto:[email protected]" target="_blank" rel="noopener noreferrer">[email protected]</a>)报告。</p><hr><h2 id="faq" tabindex="-1"><a class="header-anchor" href="#faq"><span>FAQ</span></a></h2><h3 id="q-我应该从哪个分支创建-pr" tabindex="-1"><a class="header-anchor" href="#q-我应该从哪个分支创建-pr"><span>Q: 我应该从哪个分支创建 PR?</span></a></h3><p>A: 始终从 <code>main</code> 分支创建 PR。确保您的分支已同步最新的上游代码。</p><h3 id="q-我的-pr-被拒绝了-我应该怎么做" tabindex="-1"><a class="header-anchor" href="#q-我的-pr-被拒绝了-我应该怎么做"><span>Q: 我的 PR 被拒绝了,我应该怎么做?</span></a></h3><p>A: 查看审核意见,进行必要的更改,然后推送新的提交。PR 会自动更新。</p><h3 id="q-多长时间能得到审核反馈" tabindex="-1"><a class="header-anchor" href="#q-多长时间能得到审核反馈"><span>Q: 多长时间能得到审核反馈?</span></a></h3><p>A: 通常在 1-3 天内,但可能因项目优先级而异。</p><h3 id="q-如何追踪我的-pr-进度" tabindex="-1"><a class="header-anchor" href="#q-如何追踪我的-pr-进度"><span>Q: 如何追踪我的 PR 进度?</span></a></h3><p>A: 关注 PR 评论和状态。您也可以在 GitHub 项目面板上查看进度。</p><h3 id="q-我可以在-pr-合并前做出多个提交吗" tabindex="-1"><a class="header-anchor" href="#q-我可以在-pr-合并前做出多个提交吗"><span>
384Q: 我可以在 PR 合并前做出多个提交吗?</span></a></h3><p>A: 可以,但建议定期推送。如果提交历史过于冗长,我们可能会要求您在合并前进行 squash。</p><hr><h2 id="获得帮助" tabindex="-1"><a class="header-anchor" href="#获得帮助"><span>获得帮助</span></a></h2><p>如果您有任何疑问或需要帮助:</p><ul><li>📧 邮件:<a href="mailto:[email protected]" target="_blank" rel="noopener noreferrer">[email protected]</a></li><li>💬 讨论:<a href="https://github.com/tx7do/go-wind-admin/discussions" target="_blank" rel="noopener noreferrer">GitHub Discussions</a></li><li>📖 文档:<a href="https://gowind.cloud" target="_blank" rel="noopener noreferrer">官方文档</a></li><li>🐛 反馈:<a href="https://github.com/tx7do/go-wind-admin/issues" target="_blank" rel="noopener noreferrer">GitHub Issues</a></li></ul><hr><h2 id="许可证" tabindex="-1"><a class="header-anchor" href="#许可证"><span>许可证</span></a></h2><p>通过对本项目的贡献,您同意您的贡献将根据 MIT 许可证获得许可。</p><hr><p>感谢您的贡献!🎉</p>`,144)])])}const o=s(i,[["render",p]]),r=JSON.parse('{"path":"/guide/contribution.html","title":"贡献指南","lang":"en-US","frontmatter":{},"headers":[{"level":2,"title":"目录","slug":"目录","link":"#目录","children":[]},{"level":2,"title":"贡献方式","slug":"贡献方式","link":"#贡献方式","children":[{"level":3,"title":"1. 代码贡献","slug":"_1-代码贡献","link":"#_1-代码贡献","children":[]},{"level":3,"title":"2. 文档贡献","slug":"_2-文档贡献","link":"#_2-文档贡献","children":[]},{"level":3,"title":"3. 测试贡献","slug":"_3-测试贡献","link":"#_3-测试贡献","children":[]},{"level":3,"title":"4. 社区贡献","slug":"_4-社区贡献","link":"#_4-社区贡献","children":[]}]},{"level":2,"title":"开发环境设置","slug":"开发环境设置","link":"#开发环境设置","children":[{"level":3,"title":"第一步:Fork 项目","slug":"第一步-fork-项目","link":"#第一步-fork-项目","children":[]},{"level":3,"title":"第二步:克隆您的 Fork","slug":"第二步-克隆您的-fork","link":"#第二步-克隆您的-fork","children":[]},{"level":3,"title":"第三步:创建功能分支","slug":"第三步-创建功能分支","link":"#第三步-创建功能分支","children":[]},{"level":3,"title":"第四步:安装依赖","slug":"第四步-安装依赖","link":"#第四步-安装依赖","children":[]},{"level":3,"title":"第五步:启动开发环境","slug":"第五步-启动开发环境","link":"#第五步-启动开发环境","children":[]}]},{"level":2,"title":"代码规范","slug":"代码规范","link":"#代码规范","children":[{"level":3,"title":"后端代码规范(Go)","slug":"后端代码规范-go","link":"#后端代码规范-go","children":[]},{"level":3,"title":"前端代码规范(TypeScript/Vue)","slug":"前端代码规范-typescript-vue","link":"#前端代码规范-typescript-vue","children":[]},{"level":3,"title":"Protobuf 规范","slug":"protobuf-规范","link":"#protobuf-规范","children":[]}]},{"level":2,"title":"提交流程","slug":"提交流程","link":"#提交流程","children":[{"level":3,"title":"第一步:开发代码","slug":"第一步-开发代码","link":"#第一步-开发代码","children":[]},{"level":3,"title":"第二步:运行测试和检查","slug":"第二步-运行测试和检查","link":"#第二步-运行测试和检查","children":[]},{"level":3,"title":"第三步:提交代码","slug":"第三步-提交代码","link":"#第三步-提交代码","children":[]},{"level":3,"title":"第四步:推送代码","slug":"第四步-推送代码","link":"#第四步-推送代码","children":[]},{"level":3,"title":"第五步:创建 Pull Request","slug":"第五步-创建-pull-request","link":"#第五步-创建-pull-request","children":[]}]},{"level":2,"title":"Pull Request 指南","slug":"pull-request-指南","link":"#pull-request-指南","children":[{"level":3,"title":"PR 标题规范","slug":"pr-标题规范","link":"#pr-标题规范","children":[]},{"level":3,"title":"PR 描述模板","slug":"pr-描述模板","link":"#pr-描述模板","children":[]},{"level":3,"title":"PR 审核标准","slug":"pr-审核标准","link":"#pr-审核标准","children":[]},{"level":3,"title":"PR 合并要求","slug":"pr-合并要求","link":"#pr-合并要求","children":[]}]},{"level":2,"title":"报告 Bug","slug":"报告-bug","link":"#报告-bug","children":[{"level":3,"title":"提交 Bug 报告","slug":"提交-bug-报告","link":"#提交-bug-报告","children":[]},{"level":3,"title":"Bug 报告模板","slug":"bug-报告模板","link":"#bug-报告模板","children":[]},{"level":3,"title":"Bug 报告建议","slug":"bug-报告建议","link":"#bug-报告建议","children":[]}]},{"level":2,"title":"功能建议","slug":"功能建议","link":"#功能建议","children":[{"level":3,"title":"提交功能建议","slug":"提交功能建议","link":"#提交功能建议","children":[]},{"level":3,"title":"功能建议模板","slug":"功能建议模板","link":"#功能建议模板","children":[]},{"level":3,"title":"功能建议指南","slug":"功能建议指南","link":"#功能建议指南","children":[]}]},{"level":2,"title":"开发工具和资源","slug":"开发工具和资源","link":"#开发工具和资源","children":[{"level":3,"title":"推荐的开发工具","slug":"推荐的开发工具","link":"#推荐的开发工具","children":[]},{"level":3,"title":"有用的命令","slug":"有用的命令","link":"#有用的命令","children":[]},{"level":3,"title":"学习资源","slug":"学习资源","link":"#学习资源","children":[]}]},{"level":2,"title":"社区行为准则","slug":"社区行为准则","link":"#社区行为准则","children":[{"level":3,"title":"我们的承诺","slug":"我们的承诺","link":"#我们的承诺","children":[]},{"level":3,"title":"我们的标准","slug":"我们的标准","link":"#我们的标准","children":[]},{"level":3,"title":"执行","slug":"执行","link":"#执行","children":[]}]},{"level":2,"title":"FAQ","slug":"faq","link":"#faq","children":[{"level":3,"title":"Q: 我应该从哪个分支创建 PR?","slug":"q-我应该从哪个分支创建-pr","link":"#q-我应该从哪个分支创建-pr","children":[]},{"level":3,"title":"Q: 我的 PR 被拒绝了,我应该怎么做?","slug":"q-我的-pr-被拒绝了-我应该怎么做","link":"#q-我的-pr-被拒绝了-我应该怎么做","children":[]},{"level":3,"title":"Q: 多长时间能得到审核反馈?","slug":"q-多长时间能得到审核反馈","link":"#q-多长时间能得到审核反馈","children":[]},{"level":3,"title":"Q: 如何追踪我的 PR 进度?","slug":"q-如何追踪我的-pr-进度","link":"#q-如何追踪我的-pr-进度","children":[]},{"level":3,"title":"Q: 我可以在 PR 合并前做出多个提交吗ï¼
384Ÿ","slug":"q-我可以在-pr-合并前做出多个提交吗","link":"#q-我可以在-pr-合并前做出多个提交吗","children":[]}]},{"level":2,"title":"获得帮助","slug":"获得帮助","link":"#获得帮助","children":[]},{"level":2,"title":"许可证","slug":"许可证","link":"#许可证","children":[]}],"git":{"updatedTime":1772289817000,"contributors":[{"name":"Bobo","username":"Bobo","email":"[email protected]","commits":2,"url":"https://github.com/Bobo"}],"changelog":[{"hash":"d3a6075ed8caa8954aed0ff7e540c5d9ed785126","time":1772289817000,"email":"[email protected]","author":"Bobo","message":"chore: update contact information and improve documentation links"},{"hash":"48ae7a86b35e61a13ffe0124c52b548b1ea79ff4","time":1772190364000,"email":"[email protected]","author":"Bobo","message":"docs: add contribution and FAQ guides"}]},"filePathRelative":"guide/contribution.md"}');export{o as comp,r as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.