proxy-backend-api-design
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseAPI 设计规范
API设计规范
URL 约定
URL 约定
管理后台:/admin-api/{模块}/{实体}/{操作}
用户端: /app-api/{模块}/{实体}/{操作}- 实体名用 kebab-case(如 、
dict-type)order-item - 不使用复数形式
管理后台:/admin-api/{模块}/{实体}/{操作}
用户端: /app-api/{模块}/{实体}/{操作}- 实体名采用 kebab-case 格式(例如 、
dict-type)order-item - 不使用复数形式
HTTP 方法映射
HTTP 方法映射
| 操作 | 方法 | URL | 说明 |
|---|---|---|---|
| 创建 | | | |
| 修改 | | | |
| 删除 | | | |
| 批量删除 | | | |
| 单条查询 | | | |
| 分页 | | | Query String |
| 列表 | | | Query String |
| 导出 | | | 无 |
| 操作 | 方法 | URL | 说明 |
|---|---|---|---|
| 创建 | | | |
| 修改 | | | |
| 删除 | | | |
| 批量删除 | | | |
| 单条查询 | | | |
| 分页 | | | Query String |
| 列表 | | | Query String |
| 导出 | | | 无 |
Controller 模板
Controller 模板
java
@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));
}
}java
@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 设计
| VO 类型 | 后缀 | 用途 |
|---|---|---|
| 分页请求 | | 继承 |
| 保存请求 | | 创建+更新共用( |
| 响应 | | 详情/列表/分页返回 |
| 精简响应 | | 下拉选项等轻量返回 |
| VO 类型 | 后缀 | 用途 |
|---|---|---|
| 分页请求 | | 继承 |
| 保存请求 | | 创建+更新共用( |
| 响应 | | 详情/列表/分页返回 |
| 精简响应 | | 下拉选项等轻量返回 |
VO 规则
VO 规则
- 创建和更新共用
SaveReqVO - 必填字段用 /
@NotNull+@NotBlankmessage - 所有字段必须有 注解
@Schema - 入参必须 校验
@Valid - 禁止 Controller 直接接收 DO
- DO -> VO 用
BeanUtils.toBean()
- 创建和更新共用
SaveReqVO - 必填字段用 /
@NotNull+@NotBlankmessage - 所有字段必须有 注解
@Schema - 入参必须 校验
@Valid - 禁止 Controller 直接接收 DO
- DO -> VO 用
BeanUtils.toBean()
响应格式
响应格式
json
{ "code": 0, "msg": "", "data": { ... } }分页:
{ "code": 0, "data": { "total": 100, "list": [...] } }json
{ "code": 0, "msg": "", "data": { ... } }分页:
{ "code": 0, "data": { "total": 100, "list": [...] } }Swagger 注解
Swagger 注解
- Controller:
@Tag(name = "管理后台 - xxx") - 方法:
@Operation(summary = "xxx") - 参数:
@Parameter(name, description, required, example) - VO 字段:
@Schema(description, requiredMode, example) - description 用中文,必填标注 ,提供
REQUIREDexample
- Controller:
@Tag(name = "管理后台 - xxx") - 方法:
@Operation(summary = "xxx") - 参数:
@Parameter(name, description, required, example) - VO 字段:
@Schema(description, requiredMode, example) - description 使用中文,必填项标注 ,并提供
REQUIRED示例example
错误码
错误码
java
// 格式:1-{模块编号}-{实体编号}-{序号}
ErrorCode {ENTITY}_NOT_EXISTS = new ErrorCode(1_0XX_0YY_000, "当前{实体}不存在");java
// 格式:1-{模块编号}-{实体编号}-{序号}
ErrorCode {ENTITY}_NOT_EXISTS = new ErrorCode(1_0XX_0YY_000, "当前{实体}不存在");权限码格式
权限码格式
{模块}:{实体}:{操作}{模块}:{实体}:{操作}