Spring boot 后端项目公共基础模块的理解学习
我们再开发后端代码的时候都会遇到工程化的问题这个时候将公共的基础设施挪出来分包就非常有必要就是我们的公共基础模块。一、模块概述common是我的项目中的公共基础模块提供所有业务共享的基础设施。该模块不依赖任何业务模块被所有其他模块依赖目录结构common/├── src/main/java/com/aryi/common/│ ├── annotation/ # 自定义注解│ │ └── DataScope.java│ ├── config/ # 配置类│ │ └── JacksonConfig.java│ ├── entity/ # 实体类│ │ └── BaseEntity.java│ ├── exception/ # 异常处理│ │ ├── BusinessException.java│ │ └── GlobalExceptionHandler.java│ ├── result/ # 返回结果封装│ │ ├── Result.java│ │ └── PageResult.java│ └── util/ # 工具类│ └── RsaUtils.java└── pom.xml二、类关系核心类关系Controller层的所有模块都会依赖于common层中的统一返回ResultT、PageResultT、业务异常BusinessException等等这些类来帮助我们更好的去处理后端的功能和逻辑接下来我来详细说说我的公共基础设施层都是怎么去使用的实体继承类BaseEntityBaseEntity作为所有业务实体的父类提供通用的字段和行为。使用MyBatis Plus的注解实现自动填充和逻辑删除通过继承此类所有实体都将获得统一的审计字段和序列化支持。设计的目的1.统一实体结构减少重复代码2.自动填充创建/更新时间爱和操作人3.统一逻辑删除实现id: 主键自增策略 createTime: 创建时间插入时自动填充 updateTime: 更新时间插入和更新时自动填充 createBy: 创建人ID插入时自动填充 updateBy: 更新人ID插入和更新时自动填充 deleted: 删除标识0-未删除1-已删除逻辑删除配置与数据流向JacksonConfig全局配置类 与 DataScope数据权限过滤注解JacksonConfig统一配置Java 8日期时间类型序列化/反序列化格式避免前端接收日期格式不一致的问题。配置后所有通过Jackson序列化的LocalDateTime和LocalDate都会统一使用指定格式。主要解决的问题1.LocalDateTime默认序列化为数组格式[2024, 1, 1, 12, 0, 0]2.前端日期格式不统一导致解析失败3.时区问题导致的时间差LocalDateTime → 2024-01-01 12:00:00 LocalDate → 2024-01-01DataScope用于标记需要进行数据权限控制的Mapper方法配合MyBatis Plus拦截器实现数据范围过滤。通过部门标和用户表的别名动态拼接WHERE条件实现不同角色看到不同数据的需求典型应用场景管理员查看所有数据部门管理员查看本部门数据普通用户仅查看自己的数据// 统一实体结构 → 减少重复代码 // 自动填充时间/操作人 → 减轻开发负担 // 逻辑删除 → 数据安全可恢复 {code DataScope(deptAlias d, userAlias u)} ListSysUser selectUserList(SysUser user);业务异常类(BusinessExeption用于封装业务逻辑层抛出的异常携带自定义错误码和错误信息。与GlobalExceptionHandler配合使用实现异常的统一处理和友好返回。设计特点1.继承RuntimeExcetion无需强制try-catch2.携带错误码自定义错误状态3.通过Getter注解自动生成getter方法参数校验失败如用户名已存在 业务规则不满足如余额不足 资源不存在如用户不存在全局异常处理器GlobalExceptionHandler 使用RestControllerAdvice注解统一捕获并处理Controller层抛出的所有异常。将异常转换为统一的Result格式返回给前端避免之间暴露堆栈信息同时提供友好的错误提示处理的异常类型1.BusinessException业务异常携带自定义错误码和信息2.NotLoginException未登录异常(Sa-Token)3.NotPermissionERxception无权限异常4.NotRoleException无角色异常5.MethodArgumentNotValidException参数校验异常Valid6.BindException参数绑定异常7.RuntimeException运行时异常8.IllegalArgumentExeption非法参数异常9.Exception兜底异常处理// 参数校验失败 throw new BusinessException(用户名已存在); // 业务规则不满足 throw new BusinessException(400, 余额不足); // 资源不存在 throw new BusinessException(404, 用户不存在);统一返回结果类Result所有Controller接口的统一返回格式封装响应码、响应信息和响应数据。提供静态工厂方法简化返回结果的创建字段说明1.code响应码200表示成功其他表示失败2.message响应信息描述操作结果3.data响应数据泛型类型可包含任意数据结构返回格式示例 // 成功无数据 { code: 200, message: 操作成功, data: null } // 成功有数据 { code: 200, message: 操作成功, data: { ... } } // 失败默认错误码 { code: 500, message: 操作失败, data: null } // 失败自定义错误码 { code: 400, message: 参数校验失败, data: null } // 查询成功 return Result.ok(user); // 删除成功 return Result.ok(); // 参数校验失败 return Result.fail(400, 用户名不能为空);分页返回结果类PageResult统一封装分页查询结果提供多种静态工厂方法便捷创建实例。与MyBatis Plus的IPage接口无缝对接简化分页结果的处理。字段说明list当前页数据列表total总记录数page当前页码pageSize每页条数// 从MyBatis Plus分页 IPageUser page userMapper.selectPage(new Page(1, 10), wrapper); return Result.ok(PageResult.of(page)); // 返回空结果 return Result.ok(PageResult.empty());RSA加解密工具类RsaUtils提供RSA非对称加密和解密功能支持分段加密处理大数据。以及AESRSA混合加密方案推荐用于大数据加密场景。核心特性1.标准RSA加密公钥加密、私钥解密私钥加密、公钥解密2.分段加密支持超过RSA单次加密限制的数据3.混合加密AES加密数据 RSA加密AES密钥兼顾安全性和性能4.密钥长度2048为标准安全级别技术参数1.RSA密钥长度2048位2.AES密钥长度256位3.加密模式RSA/ECB/PKCS1Padding4.AES模式AES/GCM/NoPadding带认证的加密5.编码Base64// 登录密码加密传输 // 敏感数据存储加密 // API接口数据加密 // 前后端密钥交换我的公共基础层的设计模式统一返回模式全局异常处理模式实体类继承模式总结基本每次写些新项目这些公共基础都会写写博客也是为了节省时间