239 lines
7.0 KiB
Markdown
239 lines
7.0 KiB
Markdown
# 系统公共模块
|
||
系统公共模块主要对集群中的基础公共工具进行封装,现阶段对如需模块进行封装:
|
||
|
||
## 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<OptionTree> children;
|
||
}
|
||
|
||
//转换代码
|
||
List<OptionTree> 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<Void> 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 <T>
|
||
* @return
|
||
*/
|
||
public static <T> TableDataInfo<T> getDataTable(List<T> list) {
|
||
if (null == list) {
|
||
return new TableDataInfo<>(new ArrayList<>(), 0);
|
||
}
|
||
TableDataInfo<T> 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 <T>
|
||
* @return
|
||
*/
|
||
public static <T> TableDataInfo<T> convertDataTable(List<T> list, Long count) {
|
||
if (null == list) {
|
||
return new TableDataInfo<>(new ArrayList<>(), 0);
|
||
}
|
||
TableDataInfo<T> 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聚合文档
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|