skills/kevinqpeng/proxy-skills/proxy-backend-api-design

proxy-backend-api-design

SKILL.md

API 设计规范

URL 约定

管理后台:/admin-api/{模块}/{实体}/{操作}
用户端:  /app-api/{模块}/{实体}/{操作}
  • 实体名用 kebab-case(如 dict-typeorder-item
  • 不使用复数形式

HTTP 方法映射

操作 方法 URL 说明
创建 POST /create @RequestBody
修改 PUT /update @RequestBody
删除 DELETE /delete?id=1 @RequestParam
批量删除 DELETE /delete-list?ids=1,2 @RequestParam
单条查询 GET /get?id=1 @RequestParam
分页 GET /page Query String
列表 GET /list / /list-all-simple Query String
导出 GET /export-excel CommonResult

Controller 模板

@Tag(name = "管理后台 - {实体名}")
@RestController
@RequestMapping("/{模块}/{实体-kebab}")
@Validated
public class {Entity}Controller {

    @Resource
    private {Entity}Service {entity}Service;

    @PostMapping("/create")
    @Operation(summary = "创建{实体名}")
    @PreAuthorize("@ss.hasPermission('{模块}:{实体}:create')")
    public CommonResult<Long> create{Entity}(@Valid @RequestBody {Entity}SaveReqVO createReqVO) {
        return success({entity}Service.create{Entity}(createReqVO));
    }

    @PutMapping("/update")
    @Operation(summary = "修改{实体名}")
    @PreAuthorize("@ss.hasPermission('{模块}:{实体}:update')")
    public CommonResult<Boolean> update{Entity}(@Valid @RequestBody {Entity}SaveReqVO updateReqVO) {
        {entity}Service.update{Entity}(updateReqVO);
        return success(true);
    }

    @DeleteMapping("/delete")
    @Operation(summary = "删除{实体名}")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('{模块}:{实体}:delete')")
    public CommonResult<Boolean> delete{Entity}(@RequestParam("id") Long id) {
        {entity}Service.delete{Entity}(id);
        return success(true);
    }

    @GetMapping("/get")
    @Operation(summary = "获得{实体名}详情")
    @Parameter(name = "id", description = "编号", required = true, example = "1024")
    @PreAuthorize("@ss.hasPermission('{模块}:{实体}:query')")
    public CommonResult<{Entity}RespVO> get{Entity}(@RequestParam("id") Long id) {
        return success(BeanUtils.toBean({entity}Service.get{Entity}(id), {Entity}RespVO.class));
    }

    @GetMapping("/page")
    @Operation(summary = "获得{实体名}分页")
    @PreAuthorize("@ss.hasPermission('{模块}:{实体}:query')")
    public CommonResult<PageResult<{Entity}RespVO>> get{Entity}Page(@Valid {Entity}PageReqVO pageReqVO) {
        return success(BeanUtils.toBean({entity}Service.get{Entity}Page(pageReqVO), {Entity}RespVO.class));
    }
}

VO 设计

VO 类型 后缀 用途
分页请求 PageReqVO 继承 PageParam,分页查询入参
保存请求 SaveReqVO 创建+更新共用(id 更新时必传)
响应 RespVO 详情/列表/分页返回
精简响应 SimpleRespVO 下拉选项等轻量返回

VO 规则

  • 创建和更新共用 SaveReqVO
  • 必填字段用 @NotNull/@NotBlank + message
  • 所有字段必须有 @Schema 注解
  • 入参必须 @Valid 校验
  • 禁止 Controller 直接接收 DO
  • DO -> VO 用 BeanUtils.toBean()

响应格式

{ "code": 0, "msg": "", "data": { ... } }

分页:{ "code": 0, "data": { "total": 100, "list": [...] } }

Swagger 注解

  • Controller: @Tag(name = "管理后台 - xxx")
  • 方法: @Operation(summary = "xxx")
  • 参数: @Parameter(name, description, required, example)
  • VO 字段: @Schema(description, requiredMode, example)
  • description 用中文,必填标注 REQUIRED,提供 example

错误码

// 格式:1-{模块编号}-{实体编号}-{序号}
ErrorCode {ENTITY}_NOT_EXISTS = new ErrorCode(1_0XX_0YY_000, "当前{实体}不存在");

权限码格式

{模块}:{实体}:{操作}(create/update/delete/query/export)

Weekly Installs
4
First Seen
3 days ago
Installed on
opencode4
gemini-cli4
antigravity4
claude-code4
github-copilot4
codex4