# 系统公共模块 系统公共模块主要对集群中的基础公共工具进行封装,现阶段对如需模块进行封装: ## common-core 基础核心组件 对系统中的基础服务实体进行定义,基础的工具类进行定义.例如: ### TreeUtil 自定义树形结构实体转换,可以将A对象结构具有树形关系的list转换成B对象的树形结构, 可以自定义A B两个对象之间的映射关系例如: 将Dept映射到OptionTree对象: ```javascript //Dept 类 public class Dept extends BaseEntity { private Long deptId; private Long parentId; private String ancestors; @NotBlank(message = "部门名称不能为空!") private String deptName; @NotBlank(message = "显示顺序不能为空!") private String orderNum; @NotBlank(message = "负责人不能为空!") private String leader; @NotNull(message = "负责人id不能为空!") private Long leaderId; } //OptionTree 目标对象 @Builder @NoArgsConstructor @AllArgsConstructor public class OptionTree implements Serializable { /** * 节点ID */ private Object value; /** * 节点名称 */ private String label; /** * 子节点 */ @JsonInclude(JsonInclude.Include.NON_EMPTY) private List children; } //转换代码 List optionTreeList = TreeUtil.build(deptList,OptionTree.class,(config)->{ config.setIdField("deptId"); config.setOption("deptId","deptName"); }); ``` 并且TreeUtil可以通过config进行自定义配置,配置项如下: - 是否启用BeanUtils.copyProperties方法进行字段的copy(默认为ture) - 父级关系字段名称定义 - id字段定义 - tree子级字段定义 - mapper其余字段关系映射 - exclude排除字段 ## common-dubbo 对dubbo的基础依赖 ## common-log 自定义操作日志模块,完成使用自定义注解实现操作日志的记录 ```javascript @ApiOperation("新增部门") @PostMapping @PreAuthorize("@ss.hasPermission('admin:dept:add')") @Log(title = "新增部门",businessType = BusinessType.INSERT) public Result add(@RequestBody @Validated Dept dept){ if (UserConstants.DEPT_DISABLE.equals(deptService.checkDeptNameUnique(dept))){ return Result.error("新增部门: "+ dept.getDeptName() +"'失败,部门名称以存在!"); } deptService.saveDept(dept); return Result.ok(); } ``` 通过LogAspect实现当前注解的apo切面,切面中将操作的日志封装成一个操作日志对象,然后使用spring的事件发布机制发布这个日志操作对象,再使用OperationLogListener异步监听到发布的事件,再通过rpc远程调用到umps中的日志存储接口,将当前对象落地到数据库 `@Log`注解参数说明 |参数 | 类型 | 默认 | 描述| | :-- | :-- | :-- | :-- | | title | String | 空 | 日志记录名称 | | businessType | BusinessType | OTHER | 功能,具体操作有 OTHER,INSERT,UPDATE,DELETE,GRANT,EXPORT,IMPORT,FORCE,GENCODE,CLEAN,BIND | | operatorType | OperateType | MANAGE | 操作人类别 | | isSaveRequestData | boole | 空 | 是否保存请求的参数 | ## common-mybatis 为了更加方便的使用系统分页,我们对mybatis的pageHelper做了一些封装 ### PageUtils类 ```javascript /** * 分页工具类 * * @author Clay * @date 2022/10/30 */ public class PageUtils extends PageHelper { /** * 设置请求分页 */ public static void startPage() { Page page = TableSupport.buildPageRequest(); Integer pageNum = page.getPageNum(); Integer pageSize = page.getPageSize(); String orderBy = SqlUtil.escapeOrderBySql(page.getOrderBy()); Boolean reasonable = page.getReasonable(); PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); } /** * 开始的Size * * @param page * @return */ public static Integer getStartSize(Page page) { return (page.getPageNum() - 1) * page.getPageNum(); } public static Integer getStartSize() { Page page = TableSupport.buildPageRequest(); return (page.getPageNum() - 1) * page.getPageSize(); } /** * 获取到分页后的数据信息 * * @param list * @param * @return */ public static TableDataInfo getDataTable(List list) { if (null == list) { return new TableDataInfo<>(new ArrayList<>(), 0); } TableDataInfo tableDataInfo = new TableDataInfo<>(); tableDataInfo.setRows(list); tableDataInfo.setTotal(getTotal(list)); return tableDataInfo; } /** * 获取到分页的总数 * * @param list * @return */ public static Long getTotal(List list) { long total = new PageInfo<>(list).getTotal(); clearPage(); return total; } /** * 转换为TableDataInfo对象 * * @param list * @param count * @param * @return */ public static TableDataInfo convertDataTable(List list, Long count) { if (null == list) { return new TableDataInfo<>(new ArrayList<>(), 0); } TableDataInfo tableDataInfo = new TableDataInfo<>(); tableDataInfo.setRows(list); tableDataInfo.setTotal(count); return tableDataInfo; } /** * 清理分页的线程变量 */ public static void clearPage() { PageHelper.clearPage(); } } ``` ### 分页操作 只需要在执行SQL的Mapper之前调用`PageUtils.startPage()`方法,然后调用SQL执行方法,再使用获取到的数组调用PageUtils.getDataTable(list)方法获取到封装好的返回结果对象即。 ## common-file 在集群环境下,文件不能够单独放置在某一个单一节点执行,需要集中存储起来,我们提供了阿里云的oss,自建服务的minio以及轻量化的ftp三种模式 ### 使用 1. 将依赖引入到对应的pom.xml中 2. 在yml文件中配置好信息 ```yml file: store: minio: endpoint: endpoint bucket: bucket access-key: access-key secret-key: secret-key@2023 aliyun: endpoint: endpoint #AccessId 和 AccessKey access-key-id: access-key-id secret-access-key: secret-access-key #创建的Bucket bucket: bucket ftp: address: address port: port username: username password: password encoding: UTF-8 # 静态资源路径 asset: asset # 公共文件资源 pubfiles: pubfiles # 需要保密的文件资源 prifiles: prifiles ``` ## common-redis 使redis使用FastJson序列化,对RedisTemplate进行进一步的函数封装 ## common-security 集群中最核心的部分,spring security 安全校验封装,自定义PermissionService实现spring security自定校验方法,实现自定义校验逻辑,使用Inner注解实现集群内rpc远程调用接口的区分 ## common-swagger swagger接口文档配置,通过SwaggerConfig类从nacos中获取到当前服务对应的swagger配置信息,生成当前服务的swagger接口文档数据,配合gateway swagger聚合生成集群的swagger聚合文档