From b31982b788b9486b871f51a89bd93bff7f5d8605 Mon Sep 17 00:00:00 2001 From: zhaojun1998 Date: Sat, 15 Aug 2020 17:48:07 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E5=A2=9E=E5=8A=A0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=BF=87=E6=BB=A4=E5=8A=9F=E8=83=BD,=20=E5=90=8C?= =?UTF-8?q?=E4=B8=80=E5=AD=98=E5=82=A8=E5=99=A8=E6=94=AF=E6=8C=81=E5=A4=9A?= =?UTF-8?q?=E6=9D=A1=E8=A7=84=E5=88=99,=20=E6=94=AF=E6=8C=81=E9=80=9A?= =?UTF-8?q?=E9=85=8D=E7=AC=A6.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/DriveController.java | 15 ++++ .../zfile/controller/home/FileController.java | 9 +++ .../zfile/model/entity/FilterConfig.java | 27 +++++++ .../repository/FilterConfigRepository.java | 27 +++++++ .../zfile/service/FilterConfigService.java | 74 +++++++++++++++++++ 5 files changed, 152 insertions(+) create mode 100644 src/main/java/im/zhaojun/zfile/model/entity/FilterConfig.java create mode 100644 src/main/java/im/zhaojun/zfile/repository/FilterConfigRepository.java create mode 100644 src/main/java/im/zhaojun/zfile/service/FilterConfigService.java diff --git a/src/main/java/im/zhaojun/zfile/controller/admin/DriveController.java b/src/main/java/im/zhaojun/zfile/controller/admin/DriveController.java index 09f5612..591254e 100644 --- a/src/main/java/im/zhaojun/zfile/controller/admin/DriveController.java +++ b/src/main/java/im/zhaojun/zfile/controller/admin/DriveController.java @@ -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 filter, @PathVariable("id") Integer driveId) { + filterConfigService.batchSave(filter, driveId); + return ResultBean.success(); + } + } \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/controller/home/FileController.java b/src/main/java/im/zhaojun/zfile/controller/home/FileController.java index fc34a19..ffd7cfa 100644 --- a/src/main/java/im/zhaojun/zfile/controller/home/FileController.java +++ b/src/main/java/im/zhaojun/zfile/controller/home/FileController.java @@ -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)); } diff --git a/src/main/java/im/zhaojun/zfile/model/entity/FilterConfig.java b/src/main/java/im/zhaojun/zfile/model/entity/FilterConfig.java new file mode 100644 index 0000000..9744219 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/model/entity/FilterConfig.java @@ -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; + +} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/repository/FilterConfigRepository.java b/src/main/java/im/zhaojun/zfile/repository/FilterConfigRepository.java new file mode 100644 index 0000000..33e1c02 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/repository/FilterConfigRepository.java @@ -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 { + + /** + * 获取驱动器下的所有规则 + * @param driveId 驱动器 ID + */ + List findByDriveId(Integer driveId); + + /** + * 根据驱动器 ID 删除其所有的规则 + * @param driveId 驱动器 ID + */ + void deleteByDriveId(Integer driveId); + +} \ No newline at end of file diff --git a/src/main/java/im/zhaojun/zfile/service/FilterConfigService.java b/src/main/java/im/zhaojun/zfile/service/FilterConfigService.java new file mode 100644 index 0000000..172ab83 --- /dev/null +++ b/src/main/java/im/zhaojun/zfile/service/FilterConfigService.java @@ -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 findByDriveId(Integer driveId) { + return filterConfigRepository.findByDriveId(driveId); + } + + @Transactional(rollbackFor = Exception.class) + public void batchSave(List filterConfigList, Integer driveId) { + filterConfigRepository.deleteByDriveId(driveId); + filterConfigRepository.saveAll(filterConfigList); + } + + /** + * 指定驱动器下的文件名称, 根据过滤表达式判断是否会显示, 如果符合任意一条表达式, 则不显示, 反之则显示. + * @param driveId + * 驱动器 ID + * @param fileName + * 文件名 + * @return 是否显示 + */ + public boolean filterResultIsHidden(Integer driveId, String fileName) { + List 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; + } + +} \ No newline at end of file