cloud-security-wiki/docs/module/common/README.md

239 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 系统公共模块
系统公共模块主要对集群中的基础公共工具进行封装,现阶段对如需模块进行封装:
## 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聚合文档