docs: 扩展接口分域与维护原则文档

- 补充接口分域架构(四大核心域)
- 补充接口 URL 规范和禁止事项
- 补充 Swagger 注解规范和变更流程
- 补充版本管理策略和跨域处理原则
- 补充 Swagger UI 地址和 OpenAPI 导出
This commit is contained in:
lzh
2026-04-07 19:55:13 +08:00
parent c5d100f1d4
commit a1c34b4c83

View File

@@ -0,0 +1,226 @@
# 01-接口分域与维护原则
本文档定义 AIOT 系统 API 接口的组织原则、文档维护责任边界,以及接口变更的协作流程。
**核心原则**:接口文档优先按**业务域**维护,而非按页面或客户端维护。因为页面会变、客户端会增,但领域边界相对稳定。
---
## 一、接口分域架构
### 1.1 四大核心域
| 域标识 | 对应微服务 | 职责范围 | 负责人 |
|--------|-----------|---------|--------|
| `system` | `module-system` | 用户、角色、菜单、部门、租户、字典 | 后端架构组 |
| `infra` | `module-infra` | 文件管理、定时任务、代码生成、消息推送 | 后端架构组 |
| `ops` | `module-ops` | 工单、巡检、保洁、安保、排班、考勤 | Ops 业务组 |
| `iot` | `module-iot` | 设备、物模型、规则引擎、告警、MQTT 桥接 | IoT 业务组 |
### 1.2 接口 URL 规范
所有接口必须遵循 RESTful 风格,并按域组织路径:
```
GET /api/system/users # 用户列表
POST /api/system/users # 创建用户
GET /api/system/users/{id} # 用户详情
PUT /api/system/users/{id} # 更新用户
DELETE /api/system/users/{id} # 删除用户
GET /api/ops/tickets # 工单列表
POST /api/ops/tickets/{id}/dispatch # 派单(业务操作)
POST /api/ops/tickets/{id}/confirm # 确认到岗(业务操作)
GET /api/iot/devices # 设备列表
POST /api/iot/devices/{id}/reboot # 重启设备(业务操作)
```
**禁止事项**
-`/api/getUserList` - 非 RESTful
-`/api/ticket/updateStatus` - 动词在 URL 中,应使用 `/api/tickets/{id}/status`
-`/api/opsAndIot/xxx` - 跨域接口应拆分或通过事件驱动
---
## 二、接口文档维护责任
### 2.1 Swagger 注解是唯一的真理源
**所有接口必须在 Controller 方法上完整标注 Swagger 注解**
```java
@RestController
@RequestMapping("/ops/tickets")
@Tag(name = "工单管理", description = "工单 CRUD 及状态流转")
public class TicketController {
@PostMapping("/dispatch")
@Operation(summary = "派单", description = "将工单派发给指定保洁员")
@PreAuthorize("@ss.hasPermi('ops:ticket:dispatch')")
public CommonResult<Long> dispatchTicket(@RequestBody @Valid TicketDispatchReqVO reqVO) {
// ...
}
}
```
**必填注解**
- `@Tag` - 接口分组(对应域)
- `@Operation(summary = ..., description = ...)` - 接口用途
- `@Parameter` / `@Schema` - 参数说明
- `@ApiResponse` - 返回码说明(特别是业务错误码)
### 2.2 接口变更流程
```
开发者修改接口
更新 Swagger 注解
提交 MR → 自动触发 Swagger 文档生成
前端/移动端负责人 Review 文档
确认无破坏性变更后合并
```
**破坏性变更定义**(需提前通知所有调用方):
- 删除或重命名已有字段
- 修改字段类型(如 `String``Integer`
- 增加必填参数
- 修改接口路径或 HTTP 方法
**非破坏性变更**(可直接发布):
- 新增可选参数
- 新增接口
- 增加返回字段
---
## 三、为什么不按页面维护接口文档
### 3.1 错误示例
```
❌ 按页面组织:
- 保洁管理页面接口
- 获取保洁员列表
- 创建保洁员
- 编辑保洁员
- 工单列表页面接口
- 获取工单列表
- 工单详情
```
**问题**
1. 同一个 `/api/ops/cleaners` 接口可能被保洁管理页面、工单派发页面、排班页面同时使用
2. 新增一个移动端页面时,接口文档需要重复维护
3. 页面重构或合并时,接口文档需要大量调整
### 3.2 正确示例
```
✅ 按业务域组织:
- ops 域
- 保洁员管理
- GET /api/ops/cleaners - 保洁员列表
- POST /api/ops/cleaners - 创建保洁员
- PUT /api/ops/cleaners/{id} - 更新保洁员
- 工单管理
- GET /api/ops/tickets - 工单列表
- POST /api/ops/tickets/{id}/dispatch - 派单
```
**优势**
1. 接口与页面解耦,一个接口服务多个客户端
2. 领域边界清晰,便于微服务拆分
3. 新增客户端(如小程序)时,直接引用已有域文档
---
## 四、接口版本管理
### 4.1 版本号位置
当需要发布不兼容的接口变更时,使用 URL 路径版本号:
```
GET /api/v1/ops/tickets # 旧版本
GET /api/v2/ops/tickets # 新版本(字段结构变化)
```
**禁止使用**
- ❌ Query 参数版本:`/api/ops/tickets?version=2`
- ❌ Header 版本:`X-API-Version: 2`(不利于缓存和调试)
### 4.2 版本共存策略
- 新版本发布后,旧版本至少保留 **3 个月** 过渡期
- 在网关层监控旧版本接口的调用量,提前通知调用方迁移
- 过渡期结束后,在网关层返回 `410 Gone` 并引导升级
---
## 五、跨域接口处理
### 5.1 禁止跨域直接调用
```java
// ❌ 错误ops 服务直接调用 iot 服务的 Feign Client
@Autowired
private IotDeviceClient deviceClient;
public void dispatchTicket() {
// 直接调用 IoT 服务
deviceClient.getDeviceStatus(deviceId);
}
```
**问题**
- 微服务之间产生强耦合
- 无法独立部署和扩展
- 故障传播IoT 服务宕机拖垮 Ops 服务)
### 5.2 正确做法:事件驱动
```java
// ✅ 正确:通过消息队列解耦
// Ops 服务发布事件
applicationEventPublisher.publishEvent(new TicketDispatchedEvent(ticketId, deviceId));
// IoT 服务监听事件并处理
@EventListener
public void onTicketDispatched(TicketDispatchedEvent event) {
// 处理设备相关逻辑
}
```
---
## 六、接口文档访问
### 6.1 Swagger UI 地址
| 环境 | 地址 |
|------|------|
| 开发环境 | `http://localhost:48080/swagger-ui.html` |
| 测试环境 | `http://test-api.example.com/swagger-ui.html` |
| 生产环境 | **不开放**(通过内部文档平台查看) |
### 6.2 导出 OpenAPI 规范
```bash
# 导出 YAML 格式
curl http://localhost:48080/v3/api-docs -o openapi.yaml
# 导出 JSON 格式
curl http://localhost:48080/v3/api-docs -o openapi.json
```
---
## 七、相关文档
- [00-支撑平台总览.md](../00-支撑平台总览.md)
- [01-统一网关入口规范.md](../01-统一网关入口规范.md)
- [08-数据库/01-数据域划分与表关系思路.md](../08-数据库/01-数据域划分与表关系思路.md)