1、DynamicRule实现新增、删除、修改、id查询、分页查询功能。并在crud时与ProtectObject关联。
2、StaticRule添加批量导入、模板文件下载功能,使用sqlSessionWrapper重写批量删除 3、WhiteList添加模板文件下载功能
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
package com.realtime.protection.server.rule.dynamicrule;
|
||||
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.realtime.protection.configuration.entity.rule.dynamicrule.DynamicRuleObject;
|
||||
import com.realtime.protection.configuration.response.ResponseResult;
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("dynamicrule")
|
||||
@Slf4j
|
||||
public class DynamicRuleController {
|
||||
|
||||
private final DynamicRuleService dynamicRuleService;
|
||||
|
||||
public DynamicRuleController(DynamicRuleService dynamicRuleService) {
|
||||
this.dynamicRuleService = dynamicRuleService;
|
||||
}
|
||||
|
||||
// 新增 要关联防护对象!!!!
|
||||
@RequestMapping("/new")
|
||||
public ResponseResult newDynamicRuleObject(@RequestBody @Valid DynamicRuleObject dynamicRuleObject) {
|
||||
log.info("新增动态规则: {}", dynamicRuleObject);
|
||||
//调用service新增
|
||||
Integer dynamicRuleObjectId = dynamicRuleService.newDynamicRuleObject(dynamicRuleObject);
|
||||
return ResponseResult.ok().
|
||||
setData("dynamic_rule_id", dynamicRuleObjectId)
|
||||
.setData("dynamic_rule_name", dynamicRuleObject.getDynamicRuleName())
|
||||
.setData("success", true);
|
||||
}
|
||||
|
||||
//以excel文件方式批量导入,但动态规则没有这个需求
|
||||
@PostMapping("/upload")
|
||||
public ResponseResult uploadFile(MultipartFile uploadFile) throws IOException {
|
||||
EasyExcel.read(uploadFile.getInputStream(), DynamicRuleObject.class,
|
||||
new DynamicRuleDataListener(dynamicRuleService)).sheet().doRead();
|
||||
return ResponseResult.ok();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//id删除
|
||||
@RequestMapping("/{dynamicRuleId}/delete")
|
||||
public ResponseResult deleteDynamicRuleObject(@PathVariable Integer dynamicRuleId ) {
|
||||
log.info("删除动态规则: {}", dynamicRuleId);
|
||||
//调用service删除
|
||||
dynamicRuleService.deleteDynamicRuleObject(dynamicRuleId);
|
||||
|
||||
return ResponseResult.ok();
|
||||
}
|
||||
|
||||
//批量删除
|
||||
@RequestMapping("/delete")
|
||||
public ResponseResult deleteDynamicRuleObjects(@RequestBody List<Integer> dynamicRuleIds) {
|
||||
log.info("批量删除动态规则: {}", dynamicRuleIds);
|
||||
//调用service删除
|
||||
|
||||
return ResponseResult.ok()
|
||||
.setData("success",dynamicRuleService.deleteDynamicRuleObjects(dynamicRuleIds));
|
||||
}
|
||||
|
||||
//修改
|
||||
@RequestMapping("/{dynamicRuleId}/update")
|
||||
public ResponseResult updateDynamicRuleObject(@PathVariable Integer dynamicRuleId,
|
||||
@RequestBody @Valid DynamicRuleObject dynamicRuleObject) {
|
||||
log.info("修改动态规则: {}:{}",
|
||||
dynamicRuleId, dynamicRuleObject.getDynamicRuleName());
|
||||
|
||||
dynamicRuleService.updateDynamicRuleObject(dynamicRuleId, dynamicRuleObject);
|
||||
|
||||
return ResponseResult.ok()
|
||||
.setData("dynamic_rule_id", dynamicRuleId)
|
||||
.setData("success", true);
|
||||
}
|
||||
|
||||
//id查询
|
||||
@RequestMapping("/{dynamicRuleId}/query")
|
||||
public ResponseResult queryDynamicRuleObjectById(@PathVariable Integer dynamicRuleId) {
|
||||
log.info("查询动态规则: {}", dynamicRuleId);
|
||||
//调用service查询
|
||||
return ResponseResult.ok()
|
||||
.setData("dynamic_rule", dynamicRuleService.queryDynamicRuleById(dynamicRuleId));
|
||||
}
|
||||
|
||||
//分页查询
|
||||
@RequestMapping("/query")
|
||||
public ResponseResult queryDynamicRuleObject(@RequestParam(value = "dynamic_rule_name", required = false) String dynamicRuleName,
|
||||
@RequestParam(value = "dynamic_rule_id", required = false) Integer dynamicRuleId,
|
||||
@RequestParam(value = "page", defaultValue = "1") Integer page,
|
||||
@RequestParam(value = "page_size", defaultValue = "10") Integer pageSize) {
|
||||
log.info("分页查询动态规则: {}:{}:{}:{}", dynamicRuleName, dynamicRuleId, page, pageSize);
|
||||
//调用service查询
|
||||
return ResponseResult.ok()
|
||||
.setData("dynamic_rule_list", dynamicRuleService.queryDynamicRuleObject(dynamicRuleName, dynamicRuleId, page, pageSize));
|
||||
}
|
||||
|
||||
//详情查看?? 查看什么
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.realtime.protection.server.rule.dynamicrule;
|
||||
|
||||
import com.alibaba.excel.context.AnalysisContext;
|
||||
import com.alibaba.excel.read.listener.ReadListener;
|
||||
import com.alibaba.excel.util.ListUtils;
|
||||
import com.realtime.protection.configuration.entity.rule.dynamicrule.DynamicRuleObject;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Slf4j
|
||||
public class DynamicRuleDataListener implements ReadListener<DynamicRuleObject> {
|
||||
private static final int batchCount = 100;
|
||||
private final List<DynamicRuleObject> cachedDataList
|
||||
= ListUtils.newArrayListWithExpectedSize(batchCount);
|
||||
|
||||
private final DynamicRuleService dynamicRuleService;
|
||||
|
||||
public DynamicRuleDataListener(DynamicRuleService dynamicRuleService) {
|
||||
this.dynamicRuleService = dynamicRuleService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invoke(DynamicRuleObject object, AnalysisContext analysisContext) {
|
||||
log.info("解析到一条数据:{}", object.toString());
|
||||
cachedDataList.add(object);
|
||||
if (cachedDataList.size() > batchCount) {
|
||||
saveData();
|
||||
cachedDataList.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
|
||||
saveData();
|
||||
}
|
||||
|
||||
/**
|
||||
* 加上存储数据库
|
||||
*/
|
||||
private void saveData() {
|
||||
log.info("{}条数据,开始存储数据库!", cachedDataList.size());
|
||||
Boolean success = dynamicRuleService.newDynamicRuleObjects(cachedDataList);
|
||||
log.info("存储数据库成功!");
|
||||
if (!success) {
|
||||
throw new RuntimeException("Error reading data in /proobj/new");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.realtime.protection.server.rule.dynamicrule;
|
||||
|
||||
import com.realtime.protection.configuration.entity.defense.object.ProtectObject;
|
||||
import com.realtime.protection.configuration.entity.rule.dynamicrule.DynamicRuleObject;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface DynamicRuleMapper {
|
||||
|
||||
//新建动态规则
|
||||
void newDynamicRule(@Param("object") DynamicRuleObject dynamicRuleObject);
|
||||
|
||||
//新建动态规则与保护对象关联
|
||||
void newDynamicRulProtectObjectConcat(long dynamicRuleId, Integer protectObjectId);
|
||||
|
||||
void deleteDynamicRuleObject( Integer dynamicRuleId);
|
||||
|
||||
DynamicRuleObject queryDynamicRuleById(Integer dynamicRuleId);
|
||||
|
||||
List<ProtectObject> queryProtectObjectByRuleId(Integer dynamicRuleId);
|
||||
|
||||
void updateDynamicRuleObject(@Param("dynamicRuleId") Integer dynamicRuleId,@Param("object") DynamicRuleObject dynamicRuleObject);
|
||||
|
||||
void newDynamicRules(List<DynamicRuleObject> dynamicRuleObjects);
|
||||
|
||||
void deleteDynamicRules(List<Integer> dynamicRuleIds);
|
||||
|
||||
List<DynamicRuleObject> queryDynamicRuleObject(String dynamicRuleName, Integer dynamicRuleId, Integer page, Integer pageSize);
|
||||
|
||||
void deleteDynamicRuleProtectObjectConcat(Integer dynamicRuleId);
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
package com.realtime.protection.server.rule.dynamicrule;
|
||||
|
||||
import com.alibaba.excel.util.ListUtils;
|
||||
import com.realtime.protection.configuration.entity.rule.dynamicrule.DynamicRuleObject;
|
||||
import com.realtime.protection.configuration.utils.SqlSessionWrapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
@Service
|
||||
public class DynamicRuleService {
|
||||
private final DynamicRuleMapper dynamicRuleMapper;
|
||||
private final SqlSessionWrapper sqlSessionWrapper;
|
||||
|
||||
public DynamicRuleService(DynamicRuleMapper dynamicRuleMapper, SqlSessionWrapper sqlSessionWrapper) {
|
||||
|
||||
this.sqlSessionWrapper = sqlSessionWrapper;
|
||||
this.dynamicRuleMapper = dynamicRuleMapper;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Integer newDynamicRuleObject(DynamicRuleObject dynamicRule) {
|
||||
dynamicRuleMapper.newDynamicRule(dynamicRule);
|
||||
|
||||
Integer dynamicRuleId = dynamicRule.getDynamicRuleId();
|
||||
|
||||
dynamicRule.getProtectObjectIds().forEach(
|
||||
protectObjectId -> dynamicRuleMapper.newDynamicRulProtectObjectConcat(dynamicRuleId, protectObjectId));
|
||||
|
||||
|
||||
return dynamicRuleId;
|
||||
}
|
||||
|
||||
//批量新建多个动态规则
|
||||
public Boolean newDynamicRuleObjects(List<DynamicRuleObject> DynamicRuleList) {
|
||||
Function<DynamicRuleMapper, Function<List<DynamicRuleObject>, Boolean>> newDynamicRuleFunction =
|
||||
mapper -> list -> {
|
||||
if (list == null || list.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<DynamicRuleObject> DynamicRuleIdBatch = ListUtils.newArrayListWithExpectedSize(100);
|
||||
for (DynamicRuleObject dynamicRule : DynamicRuleList) {
|
||||
dynamicRule.setDynamicRuleCreateTime(LocalDateTime.now());
|
||||
DynamicRuleIdBatch.add(dynamicRule);
|
||||
if (DynamicRuleIdBatch.size() < 100) {
|
||||
continue;
|
||||
}
|
||||
//mapper指的就是外层函数输入的参数,也就是WhiteListMapper
|
||||
mapper.newDynamicRules(DynamicRuleIdBatch);
|
||||
DynamicRuleIdBatch.clear();
|
||||
}
|
||||
if (!DynamicRuleIdBatch.isEmpty()) {
|
||||
mapper.newDynamicRules(DynamicRuleIdBatch);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
//实现事务操作
|
||||
return sqlSessionWrapper.startBatchSession(DynamicRuleMapper.class, newDynamicRuleFunction, DynamicRuleList);
|
||||
}
|
||||
|
||||
|
||||
public void deleteDynamicRuleObject(Integer dynamicRuleId) {
|
||||
//不需要使用 join
|
||||
//在数据库中设置了级联删除 ON DELETE CASCADE,在删除在从父表中删除数据时自动删除子表中的数据
|
||||
dynamicRuleMapper.deleteDynamicRuleObject(dynamicRuleId);
|
||||
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public DynamicRuleObject queryDynamicRuleById(Integer dynamicRuleId) {
|
||||
|
||||
//查询DynamicRule
|
||||
DynamicRuleObject dynamicRuleObject = dynamicRuleMapper.queryDynamicRuleById(dynamicRuleId);
|
||||
//查询DynamicRule关联的ProtectObject
|
||||
dynamicRuleObject.setProtectObjects(dynamicRuleMapper.queryProtectObjectByRuleId(dynamicRuleId));
|
||||
|
||||
return dynamicRuleObject;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void updateDynamicRuleObject(Integer dynamicRuleId, DynamicRuleObject dynamicRuleObject) {
|
||||
//更新DynamicRule
|
||||
dynamicRuleObject.setDynamicRuleModifyTime(LocalDateTime.now());
|
||||
dynamicRuleMapper.updateDynamicRuleObject(dynamicRuleId, dynamicRuleObject);
|
||||
if (dynamicRuleObject.getProtectObjectIds() == null || dynamicRuleObject.getProtectObjectIds().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
//删除DynamicRule关联的ProtectObject
|
||||
dynamicRuleMapper.deleteDynamicRuleProtectObjectConcat(dynamicRuleId);
|
||||
//新增DynamicRule关联的ProtectObject
|
||||
dynamicRuleObject.getProtectObjectIds().forEach(
|
||||
protectObjectId -> dynamicRuleMapper.newDynamicRulProtectObjectConcat(dynamicRuleId, protectObjectId));
|
||||
}
|
||||
|
||||
// 批量删除
|
||||
public Boolean deleteDynamicRuleObjects(List<Integer> dynamicRuleIds) {
|
||||
Function<DynamicRuleMapper, Function<List<Integer>, Boolean>> deleteDynamicRuleFunction =
|
||||
mapper -> list -> {
|
||||
if (list == null || list.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<Integer> DynamicRuleIdBatch = ListUtils.newArrayListWithExpectedSize(100);
|
||||
for (Integer dynamicRuleId : dynamicRuleIds) {
|
||||
DynamicRuleIdBatch.add(dynamicRuleId);
|
||||
if (DynamicRuleIdBatch.size() < 100) {
|
||||
continue;
|
||||
}
|
||||
//mapper指的就是外层函数输入的参数,也就是WhiteListMapper
|
||||
mapper.deleteDynamicRules(DynamicRuleIdBatch);
|
||||
DynamicRuleIdBatch.clear();
|
||||
}
|
||||
if (!DynamicRuleIdBatch.isEmpty()) {
|
||||
mapper.deleteDynamicRules(DynamicRuleIdBatch);
|
||||
}
|
||||
return true;
|
||||
};
|
||||
//实现事务操作
|
||||
return sqlSessionWrapper.startBatchSession(DynamicRuleMapper.class, deleteDynamicRuleFunction, dynamicRuleIds);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//分页查询基础的动态规则,暂时不返回关联的保护对象
|
||||
public List<DynamicRuleObject> queryDynamicRuleObject(String dynamicRuleName, Integer dynamicRuleId, Integer page, Integer pageSize) {
|
||||
return dynamicRuleMapper.queryDynamicRuleObject(dynamicRuleName, dynamicRuleId, page, pageSize);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user