增加文件过滤功能, 同一存储器支持多条规则, 支持通配符.

This commit is contained in:
zhaojun1998
2020-08-15 17:48:07 +08:00
parent 544a3d3eb2
commit b31982b788
5 changed files with 152 additions and 0 deletions

View File

@@ -2,8 +2,10 @@ package im.zhaojun.zfile.controller.admin;
import im.zhaojun.zfile.model.dto.DriveConfigDTO;
import im.zhaojun.zfile.model.entity.DriveConfig;
import im.zhaojun.zfile.model.entity.FilterConfig;
import im.zhaojun.zfile.model.support.ResultBean;
import im.zhaojun.zfile.service.DriveConfigService;
import im.zhaojun.zfile.service.FilterConfigService;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -26,6 +28,8 @@ public class DriveController {
@Resource
private DriveConfigService driveConfigService;
@Resource
private FilterConfigService filterConfigService;
/**
* 获取所有驱动器列表
@@ -107,4 +111,15 @@ public class DriveController {
}
@GetMapping("/drive/{id}/filters")
public ResultBean getFilters(@PathVariable("id") Integer id) {
return ResultBean.success(filterConfigService.findByDriveId(id));
}
@PostMapping("/drive/{id}/filters")
public ResultBean saveFilters(@RequestBody List<FilterConfig> filter, @PathVariable("id") Integer driveId) {
filterConfigService.batchSave(filter, driveId);
return ResultBean.success();
}
}

View File

@@ -6,9 +6,12 @@ import im.zhaojun.zfile.exception.NotExistFileException;
import im.zhaojun.zfile.model.constant.ZFileConstant;
import im.zhaojun.zfile.model.dto.FileItemDTO;
import im.zhaojun.zfile.model.dto.SystemFrontConfigDTO;
import im.zhaojun.zfile.model.entity.DriveConfig;
import im.zhaojun.zfile.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.model.support.FilePageModel;
import im.zhaojun.zfile.model.support.ResultBean;
import im.zhaojun.zfile.service.DriveConfigService;
import im.zhaojun.zfile.service.FilterConfigService;
import im.zhaojun.zfile.service.SystemConfigService;
import im.zhaojun.zfile.service.base.AbstractBaseFileService;
import im.zhaojun.zfile.util.FileComparator;
@@ -47,6 +50,9 @@ public class FileController {
@Resource
private DriveConfigService driveConfigService;
@Resource
private FilterConfigService filterConfigService;
/**
* 滚动加载每页条数.
*/
@@ -117,6 +123,9 @@ public class FileController {
return ResultBean.error("此文件夹需要密码.", ResultBean.REQUIRED_PASSWORD);
}
}
// 过滤掉表达式中不存在的数据.
fileItemList.removeIf(next -> filterConfigService.filterResultIsHidden(driveId, StringUtils.concatUrl(next.getPath(), next.getName())));
return ResultBean.successData(getSortedPagingData(fileItemList, page));
}

View File

@@ -0,0 +1,27 @@
package im.zhaojun.zfile.model.entity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
/**
* @author zhaojun
*/
@Entity(name = "FILTER_CONFIG")
@Data
public class FilterConfig {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer driveId;
private String expression;
}

View File

@@ -0,0 +1,27 @@
package im.zhaojun.zfile.repository;
import im.zhaojun.zfile.model.entity.FilterConfig;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author zhaojun
*/
@Repository
public interface FilterConfigRepository extends JpaRepository<FilterConfig, Integer> {
/**
* 获取驱动器下的所有规则
* @param driveId 驱动器 ID
*/
List<FilterConfig> findByDriveId(Integer driveId);
/**
* 根据驱动器 ID 删除其所有的规则
* @param driveId 驱动器 ID
*/
void deleteByDriveId(Integer driveId);
}

View File

@@ -0,0 +1,74 @@
package im.zhaojun.zfile.service;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import im.zhaojun.zfile.model.entity.FilterConfig;
import im.zhaojun.zfile.repository.FilterConfigRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
/**
* @author zhaojun
*/
@Slf4j
@Service
public class FilterConfigService {
@Resource
private FilterConfigRepository filterConfigRepository;
public List<FilterConfig> findByDriveId(Integer driveId) {
return filterConfigRepository.findByDriveId(driveId);
}
@Transactional(rollbackFor = Exception.class)
public void batchSave(List<FilterConfig> filterConfigList, Integer driveId) {
filterConfigRepository.deleteByDriveId(driveId);
filterConfigRepository.saveAll(filterConfigList);
}
/**
* 指定驱动器下的文件名称, 根据过滤表达式判断是否会显示, 如果符合任意一条表达式, 则不显示, 反之则显示.
* @param driveId
* 驱动器 ID
* @param fileName
* 文件名
* @return 是否显示
*/
public boolean filterResultIsHidden(Integer driveId, String fileName) {
List<FilterConfig> filterConfigList = findByDriveId(driveId);
for (FilterConfig filterConfig : filterConfigList) {
String expression = filterConfig.getExpression();
if (StrUtil.isEmpty(expression)) {
return false;
}
try {
PathMatcher pathMatcher = FileSystems.getDefault().getPathMatcher("glob:" + expression);
boolean match = pathMatcher.matches(Paths.get(fileName));
if (match) {
return true;
}
log.debug("regex: {}, name {}, contains: {}", expression, fileName, match);
} catch (Exception e) {
log.debug("regex: {}, name {}, parse error, skip expression", expression, fileName);
}
}
return false;
}
}