library-picturebook-activity/java 后端开发规范.md
En 48fc71b41d fix: 前后端接口对齐修复
- 修复 sys-config 接口参数对齐(configKey/configValue)
- 添加 dict 字典项管理 API
- 修复 logs 接口参数格式(批量删除/清理日志)
- 添加 request.ts postForm/putForm 方法支持

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 18:53:24 +08:00

14 KiB
Raw Blame History

Java 后端开发规范

制定背景

提供一套可复用的标准化开发规范,适用于 Spring Boot 企业级应用开发。

核心原则

  1. OpenAPI 规范驱动 - 前后端通过接口规范对齐,零沟通成本
  2. 类型安全优先 - TypeScript 强制类型校验,早发现早修复
  3. 约定大于配置 - 统一代码风格和目录结构,降低认知负担
  4. 自动化优先 - 能自动化的绝不手动(代码生成、部署、测试)
  5. 三层架构分离 - Controller、Service、Mapper 职责清晰

一、技术栈规范

后端技术栈

组件 技术选型 版本 说明
框架 Spring Boot 3.2+ 基于 Java 17
持久层 MyBatis-Plus 3.5+ 简化 CRUD
对象映射 MapStruct 1.5+ VO/Entity 转换
数据库连接池 Alibaba Druid 1.2+ 数据库连接池 + 监控
安全 Spring Security + JWT - 无状态认证
API 文档 Knife4j (SpringDoc) 4.x OpenAPI 3.0
数据库 MySQL 8.0+ 关系型数据库
迁移 Flyway - 版本化数据库变更
校验 Hibernate Validator - JSR-303 参数校验
缓存 Redis + Spring Data Redis - 缓存、会话存储
日志 Logback - 结构化日志
JSON FastJSON 2.x JSON 序列化
工具类 Hutool 5.x 常用工具集合
文件存储 阿里云 OSS - 对象存储

二、项目结构规范

后端目录结构

主要模块包括 common公共模块、controller控制器层、service服务层、mapper数据访问层、entity实体类、dto数据传输对象、enums枚举类。资源配置包括 application 配置文件、Flyway 迁移脚本、日志配置、MyBatis XML。


三、三层架构规范

各层职责

层级 职责 数据接收 数据返回
Controller 接收请求、参数校验、调用 Service、返回响应 DTO/Request VO/Response
Service 处理业务逻辑、事务控制 DTO/Entity Entity
Mapper 数据库 CRUD 操作 Entity/条件 Entity

核心规范

  1. Service/Mapper 层必须使用实体类 - Service↔Mapper 之间只用 Entity禁止 DTO/VO 转换
  2. 转换只在 Controller 层发生 - Entity ↔ VO 转换统一在 Controller 层处理
  3. Service 继承 IService - 所有 Service 接口继承 MyBatis-Plus 的 IService
  4. 查询接口默认分页 - 所有返回列表的查询接口,默认进行分页处理

查询方式选择

场景 推荐方式
单表按 ID 查询 通用方法 getById(id)
单表条件查询 QueryWrapper list(wrapper) / getOne(wrapper)
单表分页查询 QueryWrapper + Page page(new Page<>(p, s), wrapper)
单表统计 QueryWrapper count(wrapper)
两表联查 自定义 SQL mapper.selectWithXxx()
三表及以上 自定义 SQL
聚合统计 自定义 SQL
动态复杂条件 自定义 SQL(XML)

消除魔法值规范

核心原则:禁止在代码中使用魔法值,所有状态、类型、常量必须使用枚举定义

场景 规范
状态字段 使用枚举定义(如 CommonStatusEnum
类型字段 使用枚举定义(如 UserTypeEnum
常量值 使用常量类或接口定义
错误码 使用枚举定义(如 ErrorCode

枚举设计规范:

  • 枚举类统一存放在 enums 包下
  • 枚举包含 codedesc 字段,便于前端展示
  • 提供 getCode()getDesc()valueOfCode() 方法
  • 数据库存储 code,代码中使用枚举

四、ORM 实体类规范

1. 表名命名规范

所有数据库表必须添加业务模块前缀,格式为 t_{模块}_{表名}

模块分类 前缀 示例
用户模块 t_user_ t_user, t_user_role
系统模块 t_sys_ t_sys_config, t_sys_log
业务模块 t_biz_ t_biz_order, t_biz_product
权限模块 t_auth_ t_auth_role, t_auth_menu

2. 表名与实体类名对应规范

表名与实体类名必须保持一致,仅允许下划线与驼峰的区别:

表名(下划线命名) 实体类名(驼峰命名)
t_auth_role AuthRole
t_user_role UserRole
t_sys_config SysConfig

3. 不使用外键约束规范

  • 数据库表之间不使用 FOREIGN KEY 外键约束
  • 表与表之间的关联关系通过代码逻辑控制
  • 关联查询通过 JOIN 或应用层组装实现

4. 多对多关系中间表命名规范

核心原则:中间表名必须清晰表达两个关联实体的关系

  • 标准命名格式:t_{实体 A}_{实体 B}
  • 按字母顺序或业务逻辑顺序排列
  • 不使用 relationrellink 等冗余词
  • 实体类名直接使用两个实体名的组合(如 ParentStudent

5. 基础实体类

所有实体类继承 BaseEntity,包含公共字段:

字段 类型 说明 自动填充
id Long 主键 ID自增 数据库自增
createBy String 创建人 插入时
createTime LocalDateTime 创建时间 插入时
updateBy String 更新人 更新时
updateTime LocalDateTime 更新时间 更新时
deleted Integer 逻辑删除标识 -

6. 审计字段规范

所有数据库表必须包含审计字段,用于追踪数据变更历史:

审计字段 类型 说明 必填
create_by VARCHAR(50) 创建人账号
create_time DATETIME 创建时间
update_by VARCHAR(50) 更新人账号
update_time DATETIME 更新时间
deleted TINYINT 逻辑删除标识0-未删除1-已删除)

规范要求:

  • 审计字段通过 MyBatis-Plus FieldFill 自动填充
  • 禁止在业务代码中手动设置审计字段
  • 生产环境审计字段不得为空

五、日志规范

1. 日志语言规范(重要)

所有日志打印内容必须使用中文

场景 推荐格式 示例
操作开始 "开始{操作}{关键参数}" 开始创建用户用户名zhangsan
操作成功 "{操作}成功,{关键结果}" 用户创建成功ID: 123
操作失败 "{操作}失败,{关键参数}" 用户删除失败ID: 123
查询操作 "{动作}{对象}{关键参数}" 查询用户ID: 123
状态检查 "{对象}不存在/已存在,{关键参数}" 用户不存在ID: 123
异常日志 "{操作}异常,{关键参数}" + e 创建用户异常ID: 123 + e

2. 日志级别使用场景

级别 使用场景
ERROR 系统异常,需要人工介入(数据库连接失败、第三方服务调用失败)
WARN 业务异常,可预期的错误(参数校验失败、资源不存在)
INFO 重要的业务操作记录(用户登录、订单创建、支付完成)
DEBUG 调试信息开发时使用方法入参、SQL 执行结果)

3. TraceId 链路追踪规范

  • 使用 MDCMapped Diagnostic Context实现 TraceId 链路追踪
  • 通过 AOP 切面在请求入口自动生成 TraceId 并放入 MDC
  • 请求结束时清除 MDC防止内存泄漏
  • 日志格式包含 [%X{traceId}] 实现全链路追踪

4. 环境差异化日志配置

环境 日志策略
开发/测试环境 全量记录DEBUG 级别包含所有业务日志、SQL 日志、调试信息
生产环境 精简记录INFO/WARN 级别),仅记录:请求日志、错误堆栈、错误 SQL、关键业务操作

5. AOP 日志实现规范

  • 使用 @Aspect 定义日志切面,拦截 Controller 层所有方法
  • 请求日志包含TraceId、请求方法、请求路径、IP、耗时
  • 异常日志包含TraceId、异常类型、异常消息、堆栈信息
  • 生产环境关闭 DEBUG 日志,避免性能损耗和日志膨胀

六、统一响应格式

1. 响应类定义

Result 统一响应类包含 code状态码、message消息、data数据、timestamp时间戳字段。

2. 错误码枚举

错误码 说明
200 成功
400 请求参数错误
401 未登录或 Token 已过期
403 没有访问权限
404 资源不存在
500 系统内部错误

3. 全局异常处理器

  • 使用 @RestControllerAdvice 定义全局异常处理器
  • 业务异常返回对应错误码
  • 系统异常统一返回 500

七、多环境配置规范

1. 配置文件目录结构

配置文件包括 application.yml主配置、application-dev.yml开发环境、application-test.yml测试环境、application-prod.yml生产环境

2. 环境配置对比

配置项 开发环境 (dev) 测试环境 (test) 生产环境 (prod)
数据库 本地 MySQL 测试服务器 生产服务器
SQL 日志 开启 开启 关闭
Swagger 开启 开启 关闭
Flyway Clean 允许 禁止 禁止
JWT 密钥 默认值 默认值 必须环境变量
Redis 连接池 默认 默认 优化配置

3. 环境切换方式

  • 方式一:环境变量 export SPRING_PROFILES_ACTIVE=prod
  • 方式二:命令行参数 java -jar project.jar --spring.profiles.active=prod

八、工具类使用规范

1. 工具函数存放位置

场景 存放位置
多个地方调用≥2 处) 统一工具类(如 CommonUtil
仅在一个地方调用 Service 层内部私有方法
业务无关的通用工具 独立工具类(如 DateUtil, FileUtil

2. 工具类设计原则

  • 私有构造 - 防止实例化
  • 静态方法 - 所有方法都是 static
  • 无状态 - 工具类不应持有状态
  • 线程安全 - 工具方法必须是线程安全的
  • 充分注释 - 每个方法都要有 JavaDoc 注释

3. 工具类命名规范

类型 命名格式 示例
通用工具类 XxxUtil CommonUtil, DateUtil, FileUtil
业务工具类 XxxHelper UserHelper, OrderHelper
转换工具类 XxxConverter EntityConverter, DtoConverter

九、MapStruct 对象映射规范

1. Maven 依赖

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version>
</dependency>

2. 使用规范

  • 定义 Converter 接口,使用 @Mapper 注解
  • 接口方法用于 Entity ↔ VO 之间的转换
  • 在 Controller 层调用 Converter 进行对象转换
  • 禁止在 Service 层和 Mapper 层进行 DTO/VO 转换

3. 命名规范

类型 命名格式 示例
对象映射接口 XxxConverterXxxMapStruct UserConverter, OrderConverter

十、Hutool 工具类使用

常用工具方法

  • 生成 UUID不带横杠IdUtil.fastSimpleUUID()
  • 密码加密BCryptSecureUtil.bcrypt(password)
  • 密码校验:SecureUtil.bcryptVerify(password, encrypted)
  • 手机号验证:Validator.isMatchRegex("^1[3-9]\\d{9}$", phone)
  • 手机号脱敏:DesensitizedUtil.mobilePhone(phone)

十、Swagger/Knife4j 配置规范

1. 接口文档访问

  • Knife4j UI: http://localhost:8080/doc.html
  • OpenAPI JSON: http://localhost:8080/v3/api-docs

2. Controller 层注解

  • 使用 @Tag 注解标注控制器
  • 使用 @Operation 注解标注接口
  • 使用 @Schema 注解标注 DTO 字段

十一、工具函数使用规范

核心原则:工具函数必须集中管理,禁止在 Controller 层直接编写工具方法

工具函数存放位置

场景 存放位置
多个地方调用≥2 处) 统一工具类(如 CommonUtil
仅在一个地方调用 Service 层内部私有方法
业务无关的通用工具 独立工具类(如 DateUtil, FileUtil

工具类命名规范

类型 命名格式 示例
通用工具类 XxxUtil CommonUtil, DateUtil, FileUtil
业务工具类 XxxHelper UserHelper, OrderHelper
转换工具类 XxxConverter EntityConverter, DtoConverter

十二、限流规范

技术选型

方案 适用场景
Redis 滑动窗口 推荐:全局限流
自定义注解 + AOP 推荐:特殊接口限流

常见限流场景建议值

接口类型 时间窗口 最大请求数 说明
登录接口 60 秒 10 防止暴力破解
验证码/短信 60 秒 3-5 防止短信轰炸
文件上传 60 秒 30 防止资源滥用
普通业务接口 60 秒 100-1000 根据业务调整
导出接口 60 秒 5-10 防止服务器过载

十三、FastJSON 配置规范

JSON 工具类

  • toJson(Object) - 对象转 JSON 字符串
  • parseObject(String, Class) - JSON 字符串转对象
  • parseArray(String, Class) - JSON 字符串转列表

十四、阿里云 OSS 文件上传规范

OSS 配置

配置项包括 endpoint、access-key-id、access-key-secret、bucket-name、url-prefix均通过环境变量注入。

文件命名规范

  • 使用日期目录:yyyy/MM/dd/
  • 使用 UUID 文件名,避免重名冲突

附录:快速参考

表名命名规范

  • t_user_* - 用户模块
  • t_sys_* - 系统模块
  • t_biz_* - 业务模块
  • t_auth_* - 权限模块

Redis Key 命名规范

  • auth:token:{token} - 用户 Token
  • user:info:{userId} - 用户信息缓存
  • dict:{type} - 数据字典
  • lock:{resource}:{id} - 分布式锁
  • rate_limit:{key} - 限流计数器

核心配置速查

配置项 环境变量
活跃环境 SPRING_PROFILES_ACTIVE
数据库地址 DB_HOST
数据库密码 DB_PASSWORD
Redis 地址 REDIS_HOST
Redis 密码 REDIS_PASSWORD
JWT 密钥 JWT_SECRET
OSS AccessKey OSS_ACCESS_KEY_ID
OSS Secret OSS_ACCESS_KEY_SECRET