This commit is contained in:
mangomqy
2025-11-13 02:54:06 +00:00
commit c5e51ed069
254 changed files with 54901 additions and 0 deletions

View File

@ -0,0 +1,189 @@
# API 命名规范统一修复总结
## 📋 问题描述
前后端 API 字段命名风格不一致,导致前后端交互失败:
- **后端 Go JSON tags**: 使用 `snake_case` (如 `cluster_id`, `ca_data`)
- **OpenAPI 规范**: 使用 `camelCase` (如 `clusterId`, `caData`)
- **前端生成代码**: 使用 `camelCase`与后端实际返回的JSON不匹配
- **前端手写代码**: 为了临时修复,手动使用 `snake_case`
## ✅ 解决方案
**选择方案B**: 统一使用 `snake_case` 作为业务数据字段命名规范
### 命名规范标准
1. **OpenAPI 自身规范字段**: 保持 `camelCase` (如 `operationId`, `requestBody`)
2. **业务数据字段**: 统一使用 `snake_case` (与后端 Go JSON tags 一致)
### 优势
- ✅ 保持后端代码不变,降低改动成本
- ✅ Go 的 JSON 序列化默认就是字段名,使用 snake_case 更符合 Go 生态
- ✅ 前端自动生成的代码与后端完全匹配
- ✅ 无需手动维护类型定义
## 🔧 修改内容
### 1. 后端 DTO (保持不变)
```go
// backend/internal/adapter/input/http/dto/cluster_dto.go
type CreateClusterRequest struct {
Name string `json:"name" binding:"required"`
Host string `json:"host" binding:"required"`
CAData string `json:"ca_data"` // ✅ snake_case
CertData string `json:"cert_data"` // ✅ snake_case
KeyData string `json:"key_data"` // ✅ snake_case
Token string `json:"token"`
Description string `json:"description"`
}
type ClusterResponse struct {
ID string `json:"id"`
Name string `json:"name"`
// ...
CreatedAt string `json:"created_at"` // ✅ snake_case
UpdatedAt string `json:"updated_at"` // ✅ snake_case
}
```
### 2. OpenAPI 规范修改
**修改文件**: `backend/docs/openapi.yaml`
#### 修改的 Schema
1. **CreateClusterRequest**
- `caData``ca_data`
- `certData``cert_data`
- `keyData``key_data`
2. **UpdateClusterRequest**
- `caData``ca_data`
- `certData``cert_data`
- `keyData``key_data`
3. **ClusterResponse**
- `createdAt``created_at`
- `updatedAt``updated_at`
4. **RegistryResponse**
- `createdAt``created_at`
- `updatedAt``updated_at`
5. **UserResponse**
- `createdAt``created_at`
- `updatedAt``updated_at`
6. **InstanceResponse**
- `clusterId``cluster_id`
- `registryId``registry_id` ✅ (新增字段)
- `repository` ✅ (新增字段)
### 3. 前端生成代码
重新生成前端 TypeScript API 客户端:
```bash
bash scripts/sync-openapi-frontend.sh
```
**生成结果**:
- ✅ 7 个 API 文件
- ✅ 25 个 Model 文件
- ✅ 完全匹配后端 JSON 字段命名
**示例生成代码**:
```typescript
// frontend/src/api/generated/models/create-cluster-request.ts
export interface CreateClusterRequest {
'name': string;
'host': string;
'ca_data'?: string; // ✅ snake_case
'cert_data'?: string; // ✅ snake_case
'key_data'?: string; // ✅ snake_case
'token'?: string;
}
// frontend/src/api/generated/models/instance-response.ts
export interface InstanceResponse {
'id'?: string;
'name'?: string;
'namespace'?: string;
'cluster_id'?: string; // ✅ snake_case
'registry_id'?: string; // ✅ snake_case
'repository'?: string;
// ...
}
```
## 📊 影响范围
### 已修改
1.`backend/docs/openapi.yaml` - OpenAPI 规范
2.`frontend/src/api/generated/*` - 自动生成的 TypeScript 代码
### 无需修改
1. ✅ 后端 Go DTO 代码 - 保持原有 snake_case
2. ✅ 前端手写的临时修复代码 - 现在可以使用生成的代码替换
## 🎯 后续工作
### 可选优化(前端)
前端中手写的类型定义现在可以删除,直接使用生成的代码:
**需要清理的文件**:
- `frontend/src/core/types/index.ts` - 包含手写的 snake_case 类型
- `frontend/src/core/api/instance.api.ts` - 包含手写的接口定义
- `frontend/src/core/api/unified-api.ts` - 包含手写的接口定义
**推荐做法**:
直接导入并使用自动生成的类型:
```typescript
import {
ClusterResponse,
CreateClusterRequest,
InstanceResponse
} from '@/api/generated';
```
## ✅ 验证
### 字段命名一致性检查
| 字段 | 后端 JSON | OpenAPI | 前端生成 | 状态 |
|------|-----------|---------|----------|------|
| `ca_data` | ✅ | ✅ | ✅ | 一致 |
| `cert_data` | ✅ | ✅ | ✅ | 一致 |
| `key_data` | ✅ | ✅ | ✅ | 一致 |
| `cluster_id` | ✅ | ✅ | ✅ | 一致 |
| `registry_id` | ✅ | ✅ | ✅ | 一致 |
| `created_at` | ✅ | ✅ | ✅ | 一致 |
| `updated_at` | ✅ | ✅ | ✅ | 一致 |
## 📝 注意事项
1. **OpenAPI 规范字段仍使用 camelCase**: 如 `operationId`, `requestBody` 等元字段
2. **业务数据字段统一 snake_case**: 所有 schemas 中的属性
3. **前端需更新代码**: 如果有直接使用手写类型的地方,需要切换到生成的类型
## 🔗 相关文件
- OpenAPI 规范: `backend/docs/openapi.yaml`
- 生成脚本: `scripts/sync-openapi-frontend.sh`
- 前端生成代码: `frontend/src/api/generated/`
- 后端 DTO: `backend/internal/adapter/input/http/dto/`
---
**修复日期**: 2025-11-10
**修复人**: AI Assistant
**影响版本**: OCDP v1.0.0