感谢您对 Codex2API 项目的关注!本指南将帮助您了解如何参与项目贡献。
- Go 1.21 或更高版本
- Node.js 18 或更高版本
- Docker 和 Docker Compose
- Git
- Fork 并克隆仓库
git clone https://github.com/YOUR_USERNAME/codex2api.git
cd codex2api
git remote add upstream https://github.com/james-6-23/codex2api.git- 安装后端依赖
go mod download
go mod verify- 安装前端依赖
cd frontend
npm ci
cd ..- 配置环境
cp .env.example .env
# 编辑 .env 配置本地数据库(或使用 SQLite 模式)- 构建前端
cd frontend && npm run build && cd ..- 启动服务
# 方式1: 本地运行
go run .
# 方式2: Docker 模式
docker compose -f docker-compose.local.yml up -d --build我们遵循标准的 Go 代码规范:
- 使用 gofmt 格式化代码
gofmt -w .- 使用 golint 检查
go install golang.org/x/lint/golint@latest
golint ./...- 使用 go vet 静态分析
go vet ./...- 代码风格要求
- 使用驼峰命名法(CamelCase)
- 导出的函数和类型必须添加注释
- 错误处理优先,避免忽略错误
- 使用有意义的变量名
// 好的示例
// GetAccountByID 根据 ID 获取账号信息
func GetAccountByID(ctx context.Context, id int64) (*Account, error) {
if id <= 0 {
return nil, fmt.Errorf("invalid account id: %d", id)
}
// ...
}
// 不好的示例
func getaccount(id int64) *Account {
// 忽略错误
db.Query("SELECT * FROM accounts WHERE id = ?", id)
// ...
}- ESLint 配置
cd frontend
npm run lint- 代码风格
- 使用 2 空格缩进
- 使用单引号
- 末尾分号可选
- 最大行长度 100 字符
codex2api/
├── admin/ # 管理后台 API 处理器
├── auth/ # 账号池和调度逻辑
├── cache/ # 缓存抽象层
├── config/ # 配置加载
├── database/ # 数据库访问层
├── proxy/ # 代理转发和翻译
├── frontend/ # React 前端
│ ├── src/
│ │ ├── components/ # UI 组件
│ │ ├── pages/ # 页面组件
│ │ └── locales/ # 国际化
├── docs/ # 文档
└── main.go # 入口文件
我们使用 Conventional Commits 规范:
<type>(<scope>): <subject>
<body>
<footer>
| 类型 | 说明 | 示例 |
|---|---|---|
feat |
新功能 | feat(scheduler): 添加快速调度器 |
fix |
修复 Bug | fix(auth): 修复账号冷却时间计算错误 |
docs |
文档更新 | docs(api): 更新 API 文档 |
style |
代码格式 | style: 格式化代码 |
refactor |
重构 | refactor(proxy): 优化请求执行器 |
test |
测试相关 | test(auth): 添加调度器单元测试 |
chore |
构建/工具 | chore: 更新依赖 |
feat(api): 添加账号批量导入功能
- 支持 TXT 和 JSON 格式导入
- 添加 SSE 进度推送
- 自动去重和验证
Fixes #123
# 从 main 分支创建特性分支
git checkout main
git pull upstream main
git checkout -b feature/your-feature-name分支命名规范:
feature/- 新功能fix/- Bug 修复docs/- 文档更新refactor/- 代码重构
# 提交代码
git add .
git commit -m "feat: 添加某某功能"
# 推送到你的 Fork
git push origin feature/your-feature-name- 访问你的 Fork 页面
- 点击 "Compare & pull request"
- 填写 PR 描述:
## 描述
简要描述这个 PR 的目的
## 变更类型
- [ ] Bug 修复
- [ ] 新功能
- [ ] 文档更新
- [ ] 代码重构
## 测试
- [ ] 添加了单元测试
- [ ] 手动测试通过
- [ ] 所有现有测试通过
## 相关 Issue
Fixes #123- 维护者会进行代码审查
- 根据反馈进行修改
- 确保 CI 检查通过
- PR 被批准后会被合并
- 可选择 Squash 合并保持提交历史整洁
# 运行所有测试
go test ./...
# 运行特定包测试
go test ./auth/...
# 带覆盖率
go test -cover ./...
# 生成覆盖率报告
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out- 测试文件命名:
xxx_test.go - 测试函数命名:
TestFunctionName - 使用表格驱动测试
func TestCalculateScore(t *testing.T) {
tests := []struct {
name string
account *Account
expected float64
}{
{
name: "healthy account",
account: &Account{HealthTier: Healthy},
expected: 100,
},
{
name: "banned account",
account: &Account{HealthTier: Banned},
expected: 0,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := CalculateScore(tt.account)
if result != tt.expected {
t.Errorf("got %v, want %v", result, tt.expected)
}
})
}
}# 启动测试环境
docker compose -f docker-compose.test.yml up -d
# 运行集成测试
go test -tags=integration ./...
# 清理
docker compose -f docker-compose.test.yml down| 文档 | 路径 | 说明 |
|---|---|---|
| API 文档 | docs/API.md |
API 端点说明 |
| 部署文档 | docs/DEPLOYMENT.md |
部署指南 |
| 配置文档 | docs/CONFIGURATION.md |
配置说明 |
| 架构文档 | docs/ARCHITECTURE.md |
架构设计 |
| 故障排查 | docs/TROUBLESHOOTING.md |
问题排查 |
| 贡献指南 | docs/CONTRIBUTING.md |
本文件 |
- 使用 Markdown 格式
- 添加目录便于导航
- 代码块标明语言类型
- 使用表格展示参数
添加新 API 时,需要更新:
docs/API.md- 端点说明admin/handler.go或proxy/handler.go- 代码注释- 如有必要,更新 README.md
MAJOR.MINOR.PATCH- MAJOR: 不兼容的 API 变更
- MINOR: 向下兼容的功能添加
- PATCH: 向下兼容的问题修复
- 更新版本号
- 更新 CHANGELOG.md
- 创建 Git Tag
- 构建并推送镜像
# 创建发布
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
# CI 会自动构建并推送镜像- 尊重所有参与者
- 欢迎新手,耐心解答问题
- 专注于建设性的技术讨论
- 遵守开源社区规范
感谢您的贡献!