本规范基于项目现有代码实现,定义了API接口的设计原则和标准。所有API必须遵循RESTful设计理念,确保接口的一致性、可维护性和易用性。
R<T>格式。路径结构:
/{resource}/{action} 或 /{resource}/{id}/{action}/geo/nearest, /get_openid, /user_info控制器映射:
@RequestMapping("/{module}")定义模块路径@GetMapping, @PostMapping等注解Content-Type:
application/json@RequestBody注解接收JSON数据参数传递:
@RequestParam@RequestBody@PathVariable(项目中暂未使用)统一响应类:R<T>
{
"code": Integer, // 状态码
"message": String, // 响应消息
"data": T // 响应数据,可为空
}
成功响应:
R.success(code, message, data)构造失败响应:
R.fail(code, message)构造成功状态码:
SuccessResultCode枚举中失败状态码:
ErrorCode枚举中异常状态码:
ErrorCode枚举中认证方式:
Authorization: Bearer <token>(AuthInterceptor 优先解析该方式)X-Token 或 token headerAuthInterceptor 当前实现通过请求头解析 token(Authorization、X-Token、token),并不直接读取请求 body。若需要从 body 中提取 token,请在 Controller 层明确定义并处理。拦截器配置:
AuthInterceptor 负责 Token 校验并在校验通过后把 currentUserId/currentUserRole 放入 request attribute/、/get_openid、/v3/api-docs/**, /swagger-ui/**, /doc.html, /webjars/**, /favicon.ico 等(参见 WebMvcConfig 的 excludePathPatterns)Token管理:
TokenService生成和校验TokenuserId放入request属性全局异常处理器:CustomExceptionHandler
BindException:参数绑定异常ConstraintViolationException:约束违反异常CustomException:自定义业务异常Exception:未知异常异常响应:
R.fail(code, message)格式分页类:Page<T>
{
"pageNum": int, // 当前页码
"pageSize": int, // 每页大小
"total": long, // 总记录数
"list": List<T> // 数据列表
}
分页插件:使用pagehelper实现分页
application.yml中CorsConfig
CorsConfig.addCorsMappings 当前对所有路径 /** 开放跨域(本地开发场景),并允许源 http://localhost:3000。*(允许所有请求头)并暴露头 X-Custom-Header, X-Token, Authorization 给前端文档工具:使用 Knife4j / springdoc-openapi(基于 OpenAPI 3)
Knife4jConfig 中配置了 OpenAPI 的基本信息(title、description、version)并通过 GroupedOpenApi 扫描包 work.baiyun.chronicdiseaseapp。http://localhost:8080,版本号在 OpenAPI info 中设置为 v1。/doc.html(Knife4j UI)或 springdoc 的 /v3/api-docs。字段描述:
@Schema注解描述请求/响应字段示例:
@Schema(description = "更新用户信息请求")
public class UpdateUserInfoRequest {
@Schema(description = "头像(可选)")
private String avatar;
}
/v1/、/v2/)说明:项目使用雪花算法(Snowflake)生成的主键/业务 ID 为 64 位长整型(BIGINT / Long),在前端 JavaScript 中直接使用 Number 类型可能会发生精度丢失。为避免前端显示与处理错误,API 层对外响应时应把此类 ID 以字符串形式返回。
要点:
String(响应侧)。请求参数可继续使用 Long/BigInt(后端解析/校验)。string,并在说明中写明其实际在数据库/业务中的原始类型为 Long/BIGINT。示例(响应 VO 与转换):
public class PhysicalDataResponse {
@Schema(description = "记录ID,数据库类型为BIGINT,JSON返回为字符串")
private String id; // 对外返回 String
// ... 其他字段
}
// 服务层转换示例
PhysicalDataResponse r = new PhysicalDataResponse();
BeanUtils.copyProperties(record, r);
if (record.getId() != null) {
r.setId(record.getId().toString());
}
兼容性与说明: