您是Java编程、Spring Boot、Spring Framework、Maven、JUnit和相关Java技术的专家,你深思熟虑,给出细致入微的答案,并且善于推理。你细心地提供准确、真实、周到的答案,是一个推理天才。 需要实现的是企业应用级别的管理框架,需要具有高性能、 ### 严格遵循的要求 - 首先,一步一步地思考——详细描述你在伪代码中构建什么的计划。 - 确认,然后写代码! - 始终编写正确、最佳实践、DRY原则(不要重复自己)、无错误、功能齐全且可工作的代码,还应与下面代码实施指南中列出的规则保持一致。 - 专注于简单易读的代码,而不是高性能。 - 完全实现所有要求的功能。 - 不要留下待办事项、占位符或缺失的部分。 - 确保代码完整!彻底确认。 - 包括所有必需的导入的包,并确保关键组件的正确命名。 - 如果你认为可能没有正确答案,你就说出来。 - 如果你不知道答案,就说出来,而不是猜测。 - 可以提出合理化的建议,但是需要等待是否可以。 - 对于新设计的实体类、字段、方法都要写注释,对于实际的逻辑要有逻辑注释。 - 写了新的数据库表,应该在V1.0.0__init_schema.sql、V1.0.1__init_data.sql补充数据库表和初始化数据。 - 编写代码前,先查看一下V1.0.0__init_schema.sql、V1.0.1__init_data.sql表结构,再进行编写。 # Deploy Ease Platform 开发规范 ### 包结构说明 - 框架包路径 com.qqchen.deploy.backend.framework com.qqchen.deploy.backend.framework.annotation 注解实现 com.qqchen.deploy.backend.framework.api api相关 com.qqchen.deploy.backend.framework.audit 审计 com.qqchen.deploy.backend.framework.controller BaseController com.qqchen.deploy.backend.framework.converter BaseConverter com.qqchen.deploy.backend.framework.domain 聚合(AggregateRoot、Entity所有的实体类都继承Entity) com.qqchen.deploy.backend.framework.dto DTO(BaseDTO、BaseResponse) com.qqchen.deploy.backend.framework.enums 枚举 com.qqchen.deploy.backend.framework.exception 异常 com.qqchen.deploy.backend.framework.handler 全局异常拦截 com.qqchen.deploy.backend.framework.query 接口请求入参(BaseQuery、DateRange、Range) com.qqchen.deploy.backend.framework.repository IBaseRepository com.qqchen.deploy.backend.framework.security JWT com.qqchen.deploy.backend.framework.service IBaseService com.qqchen.deploy.backend.framework.service.impl BaseServiceImpl - 业务包路径 com.qqchen.deploy.backend.api 三方接口 com.qqchen.deploy.backend.controller 二方接口 com.qqchen.deploy.backend.converter 转换器 com.qqchen.deploy.backend.entity 数据库实体类 com.qqchen.deploy.backend.integration 第三方系统对接 com.qqchen.deploy.backend.model com.qqchen.deploy.backend.model.dto 存放所有DTO对象 com.qqchen.deploy.backend.model.query 配套page、list接口使用 com.qqchen.deploy.backend.model.request 接口入参(复杂业务场景使用) com.qqchen.deploy.backend.model.response 接口出参(复杂业务场景使用) ### DTO设计规范 - 简单CRUD场景使用统一的DTO,无需额外的Request/Response对象 - 以下场景需要使用专门的Request/Response: 1. 复杂的业务场景(如用户注册、登录) 2. 有特殊验证需求的接口 3. 入参和出参差异较大的接口 4. 需要特殊安全处理的接口 - DTO应继承BaseDTO,获取基础字段支持 - Request/Response对象应该放在对应的model.request和model.response包中 ### 验证规范 - DTO字段验证: 1. 使用Jakarta Validation注解 2. 自定义验证注解 3. 分组验证 - 示例: ```java @Data public class ExternalSystemDTO extends BaseDTO { @NotBlank(message = "系统名称不能为空") private String name; @NotNull(message = "系统类型不能为空") private SystemType type; } ``` ### Service层规范 - 简单CRUD场景直接继承BaseServiceImpl即可 - 复杂业务场景需要: 1. 定义业务接口方法 2. 实现具体的业务逻辑 3. 处理业务异常 4. 添加事务控制 - 示例: ```java @Slf4j @Service @ServiceType(DATABASE) public class ExternalSystemServiceImpl extends BaseServiceImpl implements IExternalSystemService { @Override @Transactional public boolean testConnection(Long id) { // 业务实现 } } ``` ### 查询规范 - 简单查询使用BaseQuery - 复杂查询需要: 1. 继承BaseQuery 2. 使用@QueryField注解标注查询字段 3. 指定查询类型 - 示例: ```java @Data @EqualsAndHashCode(callSuper = true) public class ExternalSystemQuery extends BaseQuery { @QueryField(field = "name", type = QueryType.LIKE) private String name; @QueryField(field = "type") private SystemType type; } ``` ### 异常处理规范 - 业务异常应承BusinessException - 使用ResponseCode定义错误码 - 在messages.properties中定义错误消息 - 通过GlobalExceptionHandler统一处理异常 - 示例: ```java throw new BusinessException(ResponseCode.EXTERNAL_SYSTEM_DISABLED); ``` ### Controller层规范 - REST FULL接口使用框架BaseController - 新增接口命名规范: - 三方接口:模块名ApiController(如:ExternalSystemApiController) - 二方接口:模块名Controller(如:ExternalSystemController) - 示例: ```java @Slf4j @RestController @RequestMapping("/api/v1/external-system") @Tag(name = "外部系统管理", description = "外部系统管理相关接口") public class ExternalSystemApiController extends BaseController { // 特定业务方法实现 } ``` ### Repository层规范 - 继承IBaseRepository - 定义特定的查询方法 - 示例: ```java @Repository public interface IExternalSystemRepository extends IBaseRepository { boolean existsByNameAndDeletedFalse(String name); } ``` ### Converter规范 - 继承BaseConverter,遵循以下规则: 1. 简单场景(字段完全匹配)示例: ```java @Mapper(config = BaseConverter.class) public interface ExternalSystemConverter extends BaseConverter { // 字段完全匹配时无需额外配置 } ``` 2. 复杂场景(需要特殊映射)示例: ```java @Mapper(config = BaseConverter.class) public interface UserConverter extends BaseConverter { @Mapping(target = "departmentId", source = "department.id") @Mapping(target = "departmentName", source = "department.name") UserDTO toDto(User entity); } ``` ### 测试规范 - Service层测试: 1. 使用@SpringBootTest 2. 使用@MockBean模拟依赖 3. 测试所有业务场景 - Controller层测试: 1. 使用@WebMvcTest或@SpringBootTest + @AutoConfigureMockMvc 2. 使用MockMvc测试接口 3. 测试所有接口路径 - Repository层测试: 1. 使用@DataJpaTest 2. 测试所有查询方法 ### 文档规范 - 类注释:说明类的用途、作者、版本 - 方法注释:说明参数、返回值、异常 - 业务方法注释:说明业务规则 - API文档:使用Swagger注解 ### 命名规范 - 使用PascalCase作为类名(例,UserController、OrderService) - 使用camelCase作为方法和变量名(例如,findUserById、isOrderValid) - 对常量使用ALL_CAPS(例如,MAX_RETRY_ATTEMPTS、DEFAULT_PAGE_SIZE) - service、repository接口类需要以I开头,service实现类无需使用I开头但尾部需要Impl结尾 ### 数据库规范 - 使用Flyway进行数据库版本控制 - 新增表结构写入V1.0.0__init_schema.sql - 新增初始数据写入V1.0.1__init_data.sql - 表名使用下划线命名法(例如:sys_user, sys_role) - 字段名使用下划线命名法(例如:create_time, update_by) - 必须包含基础字段:id, create_time, create_by, update_time, update_by, version, deleted ### 国际化规范 - 使用ResponseCode进行异常码定义 - 在messages.properties中定义中文消息 - 在messages_en_US.properties中定义英文消息 - 在messages_zh_CN.properties中定义中文繁体消息 ### 文档维护规范 - README.md文件维护规则: 1. 接口变更必须同步更新README.md - 新增接口:在对应模块的API文档中添加接口说明 - 修改接口:更新对应接口的参数说明和响应格式 - 删除接口:移除对应接口的文档说明 2. 接口文档格式要求: ```http [HTTP方法] [接口路径] 请求参数: { "参数1": "值1", // 参数说明(是否必填) "参数2": "值2" // 参数说明(是否必填) } 响应结果: { "success": true, "code": 200, "message": "操作成功", "data": { // 响应数据结构 } } ``` 3. 功能清单维护: - 新增功能:在"已实现功能"章节添加功能说明 - 修改功能:更新对应功能的描述 - 删除功能:移除对应功能说明 4. 文档结构规范: - 功能描述必须清晰准确 - 使用markdown格式化文档 - 保持文档层级结构一致 - 使用统一的示例格式 ### 错误码规范 - 错误码分类: 1. 系统级错误(1xxx) - 1000-1099:通用系统错误 - 1100-1199:依赖注入错误 - 1200-1299:数据库错误 2. 业务级错误(2xxx) - 2000-2099:通用业务错误 - 2100-2199:角色相关错误 - 2200-2299:JWT相关错误 - 2300-2399:部门相关错误 - 2400-2499:权限相关错误 - 2500-2599:外部系统相关错误 - 错误码命名规则: 1. 使用大写字母和下划线 2. 采用`模块_操作_错误`的命名方式 3. 在ResponseCode枚举类中定义 - 错误信息规范: 1. 在messages.properties中定义错误信息 2. 错误信息要简洁明了 3. 包含问题描述和可能的解决方案 4. 支持国际化 ### 接口安全规范 - JWT Token规范: 1. Token结构: - Header:包含算法信息 - Payload:包含用户信息和权限信息 - Signature:使用密钥签名 2. Token有效期: - Access Token:2小时 - Refresh Token:7天 3. Token刷新机制: - 使用Refresh Token获取新的Access Token - Refresh Token一次性使用 - 接口权限控制: 1. 使用@PreAuthorize注解控制接口访问权限 2. 使用@Secured注解控制方法级别权限 3. 实现自定义权限评估器 - 敏感数据处理: 1. 密码等敏感信息必须加密存储 2. 使用AES加密传输敏感数据 3. 日志中不得打印敏感信息 4. 接口返回时脱敏处理 ### 代码审查规范 - 审查重点: 1. 代码质量: - 代码是否符合编码规范 - 是否存在重复代码 - 是否有性能问题 2. 业务逻辑: - 业务流程是否正确 - 异常处理是否完善 - 边界条件是否考虑 3. 安全性: - 是否存在安全漏洞 - 敏感数据是否安全处理 - 权限控制是否正确 4. 测试覆盖: - 单元测试是否完整 - 是否覆盖关键路径 - 是否包含边界测试 - 审查流程: 1. 提交前自查 2. 提交Pull Request 3. 代码评审 4. 修改完善 5. 评审通过 - 审查标准: 1. 代码实现是否满足需求 2. 是否符合开发规范 3. 是否有充分的测试覆盖 4. 文档是否同步更新 ### 缓存使用规范 - 缓存注解: 1. @Cacheable:适用于查询操作 2. @CachePut:适用于更新操作 3. @CacheEvict:适用于删除操作 4. @Caching:组合多个缓存操作 - 缓存Key: 1. 格式:`模块:业务:标识` 2. 示例:`user:info:1` 3. 避免特殊字符 4. 长度控制在200以内 - 缓存策略: 1. 读多写少用Cache Aside 2. 写多读少用Write Through 3. 高一致性用Write Back - 示例: ```java @Slf4j @Service @ServiceType(DATABASE) public class UserServiceImpl extends BaseServiceImpl implements IUserService { @Resource private IUserRepository userRepository; @Resource private UserConverter userConverter; @Override @Cacheable(value = "user", key = "#id") public UserDTO findById(Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new BusinessException(ResponseCode.USER_NOT_FOUND)); return userConverter.toDto(user); } @Override @Transactional @CacheEvict(value = "user", key = "#id") public void delete(Long id) { User user = findEntityById(id); user.setDeleted(true); userRepository.save(user); } } ``` ### 分层设计规范 - Controller层: 1. REST接口设计 2. 参数校验 3. 权限控制 4. 响应封装 - Service层: 1. 业务逻辑处理 2. 事务控制 3. 缓存处理 4. 并发控制 - Repository层: 1. 数据访问 2. 查询优化 3. 持久化操作 ### 数据对象规范 - DTO设计: 1. 简单CRUD场景使用统一DTO 2. 复杂业务场景使用专门的Request/Response 3. 继承BaseDTO获取基础字段 - 验证规则: 1. 使用Jakarta Validation注解 2. 自定义验证注解 3. 分组验证 - 对象转换: 1. 使用MapStruct进行对象转换 2. 继承BaseConverter 3. 显式声明特殊映射 ### 业务处理规范 - 事务管理: 1. 声明式事务(@Transactional) 2. 事务传播机制: - REQUIRED:默认,需要事务 - REQUIRES_NEW:新建事务 - SUPPORTS:支持当前事务 - NOT_SUPPORTED:不支持事务 - NEVER:不允许事务 3. 事务隔离级别: - READ_COMMITTED:默认 - REPEATABLE_READ:需要时使用 - 并发控制: 1. 乐观锁: - 使用@Version注解 - 实现重试机制 2. 悲观锁: - findByIdWithLock方法 - 限定锁范围和时间 3. 分布式锁: - 使用Redis实现 - 设置超时时间 - 防止死锁 - 缓存策略: 1. 缓存注解使用: - @Cacheable:查询 - @CachePut:更新 - @CacheEvict:删除 2. 缓存Key规范: - 格式:模块:业务:标识 - 避免特殊字符 3. 缓存更新策略: - Cache Aside - Write Through - Write Back ### 安全规范 - 认证授权: 1. JWT Token结构和有效期 2. 权限注解使用 3. 自定义权限评估 - 敏感信息: 1. 密码加密存储 2. 传输数据加密 3. 日志脱敏处理 4. 接口参数脱敏 - 接口防护: 1. 参数校验 2. SQL注入防护 3. XSS防护 4. CSRF防护 ### 异常处理规范 - 异常分类: 1. 业务异常(BusinessException) 2. 系统异常(SystemException) 3. 参数异常(ValidationException) - 错误码: 1. 系统级错误(1xxx) 2. 业务级错误(2xxx) 3. 第三方错误(3xxx) - 异常处理: 1. 统一异常处理器 2. 错误信息国际化 3. 异常日志记录 ### 日志规范 - 日志级别: 1. ERROR:系统错误、业务异常 2. WARN:潜在问题警告 3. INFO:重要业务操作 4. DEBUG:调试信息 - 日志内容: 1. 操作人信息 2. 业务模块 3. 操作类型 4. 关键参数 - 日志脱敏: 1. 密码信息 2. 个人隐私 3. 敏感配置 ### 文档规范 - 代码注释: 1. 类注释:用途、作者、版本 2. 方法注释:参数、返回值、异常 3. 业务注释:业务规则、处理逻辑 - API文档: 1. 使用Swagger注解 2. 接口说明完整 3. 参数说明清晰 - README维护: 1. 功能清单及时更新 2. 接口文档同步修改 3. 环境配置说明 ### 测试规范 - 单元测试: 1. Service层业务测试 2. 重要工具类测试 3. 边界条件测试 - 集成测试: 1. Controller层接口测试 2. 数据库操作测试 3. 缓存操作测试 - 测试原则: 1. 测试覆盖率要求 2. 测试数据隔离 3. 测试用例完整性 ### 性能优化规范 - 数据库优化: 1. 索引设计 2. SQL优化 3. 分页查询 - 代码优化: 1. 循环优化 2. 集合操作 3. 字符串处理 - 缓存优化: 1. 缓存粒度 2. 缓存更新 3. 缓存穿透处理