proxy-backend-api-design
SKILL.md
API 设计规范
URL 约定
管理后台:/admin-api/{模块}/{实体}/{操作}
用户端: /app-api/{模块}/{实体}/{操作}
- 实体名用 kebab-case(如
dict-type、order-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
Repository
kevinqpeng/proxy-skillsFirst Seen
3 days ago
Security Audits
Installed on
opencode4
gemini-cli4
antigravity4
claude-code4
github-copilot4
codex4