Skip to content

接口设计约定

本文说明 art-design-pro-server 的接口设计约定。它适合在新增接口、排查响应结构、补权限码或维护 Swagger 文档时阅读。

接口基础约定

后端接口默认使用统一前缀和 URI 版本:

text
/api/v1/**

常见接口形态:

text
GET    /api/v1/<resource>
POST   /api/v1/<resource>
PATCH  /api/v1/<resource>/:id
DELETE /api/v1/<resource>/:id

项目中也存在少量特殊用途接口,例如健康检查、通知流、文件访问等,应按具体控制器实现为准。

Controller、DTO、Service 分工

层级职责
Controller定义路由、HTTP 方法、Swagger 标注、权限声明、参数入口
DTO定义请求参数、校验规则和 Swagger schema
Service编排业务逻辑、调用 Prisma、处理业务状态
Repository在复杂模块中封装可复用的数据访问逻辑

建议 Controller 保持薄层,只做请求入口和响应出口,不承载复杂业务流程。

统一响应结构

普通接口返回值会被 TransformInterceptor 包装为:

json
{
  "code": 200,
  "msg": "请求成功",
  "data": {}
}

可用 @SuccessMessage() 自定义成功消息:

ts
@SuccessMessage('创建成功')

特殊接口如果需要保留原始响应结构,可以使用 @SkipTransform()

参数校验

全局 ValidationPipe 已启用:

ts
{
  whitelist: true,
  forbidNonWhitelisted: true,
  transform: true
}

这意味着:

  • DTO 中没有声明的字段会被拒绝。
  • 请求参数会按 DTO 类型尝试转换。
  • 新增接口时应优先补 DTO,而不是在 Service 中手动解析任意对象。

权限声明

接口权限使用 @ApiPermission() 声明:

ts
@ApiPermission(API_PERMISSION_CODES.USER.CREATE)

权限码统一维护在:

text
src/modules/api-permissions/api-permissions.constants.ts

新增需要授权的接口时,建议同步确认:

  • 控制器方法是否声明了权限码。
  • 权限码是否加入常量定义。
  • 初始化或同步脚本是否能写入对应权限数据。
  • 前端按钮权限、接口调用和后端权限码是否能对应。

错误处理

异常由 AllExceptionFilter 统一转换。常见映射包括:

异常来源返回行为
HttpException按异常状态码和消息返回
Prisma 唯一约束冲突返回冲突提示
Prisma 外键或记录不存在返回可读业务提示
JWT 过期或无效返回未授权状态
未知异常非生产环境返回异常消息,生产环境返回通用错误

接口中不建议直接拼接临时响应结构。优先抛出 Nest 标准异常或返回业务数据,让全局过滤器和拦截器处理统一格式。

Swagger 约定

后端在 Swagger 启用时挂载到:

text
/docs

新增接口时建议补齐:

  • @ApiTags()
  • @ApiOperation()
  • @ApiResponse() 或相关响应说明
  • DTO 上的字段说明
  • 需要鉴权的接口补 @ApiBearerAuth()

新增接口检查清单

新增接口完成后,建议确认:

  • 路由路径、HTTP 方法和版本前缀符合当前约定。
  • DTO 校验覆盖必填字段、枚举、分页、时间范围等参数。
  • Service 中业务逻辑清晰,复杂查询已拆到 repository 或专门 service。
  • 权限码、Swagger、默认数据或同步脚本已按需要补齐。
  • 前端 src/api 中有对应封装,页面没有绕过统一请求层。

根据 MIT 许可证发布