Selaa lähdekoodia

新增文件操作

jiashun 4 vuotta sitten
vanhempi
commit
2e8e3f44b7
28 muutettua tiedostoa jossa 417 lisäystä ja 102 poistoa
  1. 80 19
      src/main/java/com/macro/mall/tiny/common/util/MyFileUtils.java
  2. 21 0
      src/main/java/com/macro/mall/tiny/modules/business/controller/BLineController.java
  3. 3 6
      src/main/java/com/macro/mall/tiny/modules/business/controller/BTowerController.java
  4. 121 7
      src/main/java/com/macro/mall/tiny/modules/business/controller/FileController.java
  5. 21 0
      src/main/java/com/macro/mall/tiny/modules/business/dto/FileDownloadParam.java
  6. 31 0
      src/main/java/com/macro/mall/tiny/modules/business/model/BFileDetail.java
  7. 6 0
      src/main/java/com/macro/mall/tiny/modules/business/model/BLine.java
  8. 6 0
      src/main/java/com/macro/mall/tiny/modules/business/model/BTower.java
  9. 0 15
      src/main/java/com/macro/mall/tiny/modules/business/service/BDirectoryService.java
  10. 4 0
      src/main/java/com/macro/mall/tiny/modules/business/service/BLineService.java
  11. 1 1
      src/main/java/com/macro/mall/tiny/modules/business/service/BTowerService.java
  12. 11 0
      src/main/java/com/macro/mall/tiny/modules/business/service/FileService.java
  13. 3 1
      src/main/java/com/macro/mall/tiny/modules/business/service/impl/AsyncHandler.java
  14. 1 1
      src/main/java/com/macro/mall/tiny/modules/business/service/impl/BDirectoryCacheServiceImpl.java
  15. 0 37
      src/main/java/com/macro/mall/tiny/modules/business/service/impl/BDirectoryServiceImpl.java
  16. 23 1
      src/main/java/com/macro/mall/tiny/modules/business/service/impl/BLineServiceImpl.java
  17. 5 7
      src/main/java/com/macro/mall/tiny/modules/business/service/impl/BTowerServiceImpl.java
  18. 33 0
      src/main/java/com/macro/mall/tiny/modules/business/service/impl/FileServiceImpl.java
  19. 3 2
      src/main/java/com/macro/mall/tiny/modules/ums/dto/UmsAdminLoginParam.java
  20. 4 0
      src/main/java/com/macro/mall/tiny/modules/ums/model/UmsAdmin.java
  21. 3 0
      src/main/java/com/macro/mall/tiny/modules/ums/model/UmsAdminLoginLog.java
  22. 3 0
      src/main/java/com/macro/mall/tiny/modules/ums/model/UmsMenu.java
  23. 3 0
      src/main/java/com/macro/mall/tiny/modules/ums/model/UmsResource.java
  24. 3 0
      src/main/java/com/macro/mall/tiny/modules/ums/model/UmsResourceCategory.java
  25. 3 0
      src/main/java/com/macro/mall/tiny/modules/ums/model/UmsRole.java
  26. 3 0
      src/main/java/com/macro/mall/tiny/security/util/AuthUtil.java
  27. 15 2
      src/main/resources/mapper/business/BLineMapper.xml
  28. 7 3
      src/main/resources/mapper/business/BTowerMapper.xml

+ 80 - 19
src/main/java/com/macro/mall/tiny/common/util/MyFileUtils.java

@@ -6,12 +6,14 @@ import com.macro.mall.tiny.config.UploadConfig;
 import com.macro.mall.tiny.domain.AdminUserDetails;
 import com.macro.mall.tiny.modules.business.model.BDirectory;
 import com.macro.mall.tiny.modules.business.model.BFile;
+import com.macro.mall.tiny.modules.business.model.BFileDetail;
 import com.macro.mall.tiny.security.util.AuthUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
@@ -101,15 +103,23 @@ public class MyFileUtils {
         return "";
     }
 
-    public static List<BFile> getSonPaths(String basePath, boolean auth) {
-        return getSonPaths(basePath, null, auth);
+    public static List<BFile> getSonFiles(String basePath, AdminUserDetails userDetails) {
+        boolean access = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
+        return getSonFiles(basePath, null, access);
     }
 
-    public static List<BFile> getSonPaths(String basePath, FilenameFilter filter, boolean auth) {
+    public static List<BFile> getSonFiles(String basePath, boolean auth) {
+        return getSonFiles(basePath, null, auth);
+    }
+
+    public static List<BFile> getSonFiles(String basePath, FilenameFilter filter, boolean auth) {
         if (StringUtils.isBlank(basePath)) return Lists.newArrayList();
-        File file = new File(basePath);
-        if (file.exists() && file.isDirectory()) {
-            File[] sonFiles = filter == null ? file.listFiles() : file.listFiles(filter);
+        File oriDic = new File(basePath);
+        if (!oriDic.exists() || oriDic.isFile() || (!auth && oriDic.getName().startsWith(String.valueOf(UploadConfig.AUTH_STR)))) {
+            return Lists.newArrayList();
+        }
+        if (oriDic.exists() && oriDic.isDirectory()) {
+            File[] sonFiles = filter == null ? oriDic.listFiles() : oriDic.listFiles(filter);
             if (sonFiles == null) return Lists.newArrayList();
             return Arrays.stream(sonFiles)
                     .filter(son -> auth || !son.getName().startsWith("~"))
@@ -118,6 +128,9 @@ public class MyFileUtils {
                         sonFile.setName(son.getName());
                         sonFile.setPath(son.getPath());
                         sonFile.setIsDirectory(son.isDirectory() ? 1 : 0);
+                        if (son.isDirectory()) {
+                            sonFile.setSubFile(getSonFiles(son.getPath(), filter, auth));
+                        }
                         return sonFile;
                     })
                     .collect(Collectors.toList());
@@ -126,15 +139,15 @@ public class MyFileUtils {
     }
 
     /**
-     *@describe 获取根目录下的所有文件夹
-     *@param    userDetails
-     *@return   com.macro.mall.tiny.modules.business.model.BDirectory
-     *@author   gjs
-     *@since    J7.23.0
-     *@date     2021/4/2
+     * @param userDetails
+     * @return com.macro.mall.tiny.modules.business.model.BDirectory
+     * @describe 获取根目录下的所有文件夹
+     * @author gjs
+     * @date 2021/4/2
+     * @since J7.23.0
      */
     public static BDirectory getRootDirectory(AdminUserDetails userDetails) {
-        final boolean access = AuthUtil.checkAccess(userDetails, "/visit");
+        final boolean access = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
         final File rootDirectory = new File(UploadConfig.powerPath);
         return getAllAuthDirectory(rootDirectory, access);
     }
@@ -144,26 +157,74 @@ public class MyFileUtils {
             return null;
         }
         final String fileName = file.getName();
-        List<BDirectory> subDirectory = Lists.newArrayList();
+        List<BDirectory> subDirectory = null;
         boolean hasFile = false;
 
         final File[] subFiles = file.listFiles((dir, name) -> access || !name.startsWith(String.valueOf(UploadConfig.AUTH_STR)));
         if (subFiles != null && subFiles.length > 0) {
             for (File subFile : subFiles) {
-                if (!subFile.isDirectory() && !hasFile) {
+                if (subFile.isFile()) {
                     hasFile = true;
-                } else if (subFile.isDirectory()) {
-                    subDirectory.add(getAllAuthDirectory(subFile, access));
+                    break;
                 }
             }
+            subDirectory = Arrays.stream(subFiles)
+                    .filter(subFile -> file.isDirectory())
+                    .map(subFile -> getAllAuthDirectory(subFile, access))
+                    .collect(Collectors.toList());
         }
-
         final BDirectory thisFile = new BDirectory();
         thisFile.setName(fileName);
         thisFile.setPath(file.getPath());
-        thisFile.setSubDirectory(subDirectory);
+        thisFile.setSubDirectory(subDirectory == null ? Lists.newArrayList() : subDirectory);
         thisFile.setHasFile(hasFile ? 1 : 0);
 
         return thisFile;
     }
+
+    public static List<BFileDetail> getFileDetailList(String path, AdminUserDetails userDetails) {
+        if (StringUtils.isBlank(path)) return Lists.newArrayList();
+        boolean access = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
+        File oriDic = new File(path);
+        if (!oriDic.exists() || oriDic.isFile() || (!access && oriDic.getName().startsWith(String.valueOf(UploadConfig.AUTH_STR)))) {
+            return Lists.newArrayList();
+        }
+        File[] subFiles = oriDic.listFiles((dir, name) -> access || !name.startsWith(String.valueOf(UploadConfig.AUTH_STR)));
+        if (subFiles == null) return Lists.newArrayList();
+        return Arrays.stream(subFiles)
+                .filter(File::isFile)
+                .map(file -> {
+                    BFileDetail fileDetail = new BFileDetail();
+                    fileDetail.setName(file.getName());
+                    fileDetail.setPath(file.getPath());
+                    fileDetail.setUploadTime(new Date(file.lastModified()));
+                    String fileName = file.getName();
+                    int lastIndexOf = fileName.lastIndexOf(".");
+                    fileDetail.setType(lastIndexOf == -1 ? null : fileName.substring(lastIndexOf + 1));
+                    fileDetail.setSize(getPrettySize(file.length()));
+                    return fileDetail;
+                }).collect(Collectors.toList());
+    }
+
+    private static String getPrettySize(long size) {
+        long rest;
+        if (size < 1024) {
+            return size + "B";
+        } else {
+            size /= 1024;
+        }
+        if (size < 1024) {
+            return size + "KB";
+        } else {
+            rest = size % 1024;
+            size /= 1024;
+        }
+        if (size < 1024) {
+            size = size * 100;
+            return size / 100 + "." + rest * 100 / 1024 % 100 + "MB";
+        } else {
+            size = size * 100 / 1024;
+            return size / 100 + "." + size % 100 + "GB";
+        }
+    }
 }

+ 21 - 0
src/main/java/com/macro/mall/tiny/modules/business/controller/BLineController.java

@@ -2,11 +2,14 @@ package com.macro.mall.tiny.modules.business.controller;
 
 
 import com.macro.mall.tiny.common.api.CommonResult;
+import com.macro.mall.tiny.domain.AdminUserDetails;
+import com.macro.mall.tiny.modules.business.model.BFile;
 import com.macro.mall.tiny.modules.business.model.BLine;
 import com.macro.mall.tiny.modules.business.service.BLineService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 
 import javax.websocket.server.PathParam;
@@ -28,6 +31,15 @@ public class BLineController {
     @Autowired
     private BLineService lineService;
 
+
+    @ApiOperation("按照ID获取线路")
+    @RequestMapping(value = "/{id}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<BLine> getItem(@PathVariable Long id) {
+        BLine line = lineService.getById(id);
+        return CommonResult.success(line);
+    }
+
     @ApiOperation("获取线路列表")
     @RequestMapping(value = "/list", method = RequestMethod.GET)
     @ResponseBody
@@ -43,5 +55,14 @@ public class BLineController {
         List<BLine> lineList = lineService.findByKey(key);
         return CommonResult.success(lineList);
     }
+
+    @ApiOperation("获取线路文件资料")
+    @RequestMapping(value = "/getFile/{id}", method = RequestMethod.GET)
+    @ResponseBody
+    public CommonResult<List<BFile>> getFile(@PathVariable Long id) {
+        AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        List<BFile> data = lineService.getFile(id, userDetails);
+        return CommonResult.success(data);
+    }
 }
 

+ 3 - 6
src/main/java/com/macro/mall/tiny/modules/business/controller/BTowerController.java

@@ -9,12 +9,9 @@ import com.macro.mall.tiny.modules.business.service.BTowerService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 
-import java.security.Principal;
 import java.util.List;
 import java.util.Map;
 
@@ -43,11 +40,11 @@ public class BTowerController {
     }
 
     @ApiOperation("获取电塔文件资料")
-    @RequestMapping(value = "/getData/{id}", method = RequestMethod.GET)
+    @RequestMapping(value = "/getFile/{id}", method = RequestMethod.GET)
     @ResponseBody
-    public CommonResult<Map<String, List<BFile>>> getData(@PathVariable Long id) {
+    public CommonResult<Map<String, List<BFile>>> getFile(@PathVariable Long id) {
         AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        Map<String, List<BFile>> data = towerService.getData(id, userDetails);
+        Map<String, List<BFile>> data = towerService.getFile(id, userDetails);
         return CommonResult.success(data);
     }
 

+ 121 - 7
src/main/java/com/macro/mall/tiny/modules/business/controller/FileController.java

@@ -1,27 +1,39 @@
 package com.macro.mall.tiny.modules.business.controller;
 
 import com.macro.mall.tiny.common.api.CommonResult;
+import com.macro.mall.tiny.config.UploadConfig;
 import com.macro.mall.tiny.domain.AdminUserDetails;
+import com.macro.mall.tiny.modules.business.dto.FileDownloadParam;
 import com.macro.mall.tiny.modules.business.dto.FileUploadParam;
 import com.macro.mall.tiny.modules.business.model.BDirectory;
-import com.macro.mall.tiny.modules.business.service.BDirectoryService;
+import com.macro.mall.tiny.modules.business.model.BFile;
+import com.macro.mall.tiny.modules.business.model.BFileDetail;
 import com.macro.mall.tiny.modules.business.service.FileService;
+import com.macro.mall.tiny.security.util.AuthUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import javax.websocket.server.PathParam;
+import java.io.*;
 import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
 
 /**
  * 大文件上传
@@ -35,8 +47,8 @@ public class FileController {
     @Autowired
     private FileService fileService;
 
-    @Autowired
-    private BDirectoryService directoryService;
+    @Value("${system.charset:gbk}")
+    private String charset;
 
 
     /**
@@ -97,7 +109,109 @@ public class FileController {
     @GetMapping("/getAllDirectory")
     public CommonResult<BDirectory> getDirectory() {
         AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-        final BDirectory directory = directoryService.getDirectory(userDetails);
+        final BDirectory directory = fileService.getRootDirectory(userDetails);
         return CommonResult.success(directory);
     }
+
+    /**
+     *@describe 获取文件夹下全被文件详细接口
+     *@param    path
+     *@return   com.macro.mall.tiny.common.api.CommonResult<java.util.List<com.macro.mall.tiny.modules.business.model.BFileDetail>>
+     *@author   gjs
+     *@since    J7.23.0
+     *@date     2021/4/5
+     */
+    @ApiOperation("获取文件夹下全部文件详细接口")
+    @GetMapping("/getFileDetail")
+    public CommonResult<List<BFileDetail>> getFileDetail(@RequestParam @PathParam(value = "path") String path) {
+        AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        List<BFileDetail> fileDetailList = fileService.getFileDetailList(path, userDetails);
+        return CommonResult.success(fileDetailList);
+    }
+
+    @ApiOperation("获取文件夹下全部文件/文件夹")
+    @GetMapping("/getFile")
+    public CommonResult<List<BFile>> getFile(@RequestParam @PathParam(value = "path") String path) {
+        AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        List<BFile> fileDetailList = fileService.getFileList(path, userDetails);
+        return CommonResult.success(fileDetailList);
+    }
+
+    @ApiOperation("文件下载接口")
+    @GetMapping("/download")
+    public void downLoad(HttpServletResponse response, @RequestParam @PathParam(value = "path") String path) throws Exception {
+        AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        boolean access = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
+        if (path.startsWith(String.valueOf(UploadConfig.AUTH_STR))&&!access) return;
+        File file = new File(path);
+        if (file.exists()) { //判断文件父目录是否存在
+            String fileName = file.getName();
+            response.setContentType("application/form-data");
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
+            response.setHeader("Access-Control-Expose-Headers", "content-Disposition");
+            try(FileInputStream fileInputStream = new FileInputStream(file)){
+                try (BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream)) {
+                    try (OutputStream outputStream = response.getOutputStream()){
+                        byte[] buffer = new byte[1024];
+                        int read = bufferedInputStream.read(buffer);
+                        while (read != -1) {
+                            outputStream.write(buffer);
+                            read = bufferedInputStream.read(buffer);
+                        }
+
+                    }
+                }
+            }
+        }
+    }
+
+    @ApiOperation("多文件压缩下载接口")
+    @PostMapping("/multiFileZipDownload")
+    public void multiFileZipDownload(HttpServletResponse response, @Validated @RequestBody FileDownloadParam fileDownloadParam) throws Exception {
+        AdminUserDetails userDetails = (AdminUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        boolean access = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
+        OutputStream outputStream = response.getOutputStream();
+        ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream, Charset.forName(charset));
+        response.setContentType("multipart/form-data");
+        response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileDownloadParam.getName(), "UTF-8"));
+        response.setHeader("Access-Control-Expose-Headers", "content-Disposition");
+        try {
+            for (String path : fileDownloadParam.getFileList()) {
+                Path file = Paths.get(path);
+                String fileName = file.getFileName().toString();
+                if (fileName.startsWith(String.valueOf(UploadConfig.AUTH_STR)) && !access) {
+                    continue;
+                }
+                if (Files.isDirectory(file)) {
+                    continue;
+                }
+                try (InputStream inputStream = Files.newInputStream(file)) {
+                    // 创建一个压缩项,指定名称
+                    int count = file.getNameCount();
+                    StringBuilder filePathSB = new StringBuilder();
+                    for (int i = 2; i < count - 1; i++) {
+                        filePathSB.append(file.getName(i)).append("/");
+                    }
+                    String filePath = filePathSB.toString() + fileName;
+                    ZipEntry zipEntry = new ZipEntry(filePath);
+                    // 添加到压缩流
+                    zipOutputStream.putNextEntry(zipEntry);
+                    // 写入数据
+                    int len;
+                    byte[] buffer = new byte[1024 * 10];
+                    while ((len = inputStream.read(buffer)) > 0) {
+                        zipOutputStream.write(buffer, 0, len);
+                    }
+                    zipOutputStream.flush();
+                }
+                // 完成所有压缩项的添加
+                zipOutputStream.closeEntry();
+            }
+        } finally {
+            zipOutputStream.close();
+            outputStream.close();
+        }
+    }
+
 }

+ 21 - 0
src/main/java/com/macro/mall/tiny/modules/business/dto/FileDownloadParam.java

@@ -0,0 +1,21 @@
+package com.macro.mall.tiny.modules.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Data
+public class FileDownloadParam {
+
+    @NotEmpty
+    @ApiModelProperty(value = "下载文件名称(*.zip)", required = true)
+    private String name;
+
+    @NotEmpty
+    @ApiModelProperty(value = "下载的文件路径列表", required = true)
+    private List<String> fileList;
+}

+ 31 - 0
src/main/java/com/macro/mall/tiny/modules/business/model/BFileDetail.java

@@ -0,0 +1,31 @@
+package com.macro.mall.tiny.modules.business.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "BFileDetail文件对象", description = "文件详细对象")
+public class BFileDetail {
+
+    @ApiModelProperty(value = "文件名称")
+    private String name;
+
+    @ApiModelProperty(value = "文件详细路径")
+    private String path;
+
+    @ApiModelProperty(value = "文件类型")
+    private String type;
+
+    @ApiModelProperty(value = "文件大小")
+    private String size;
+
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "上传时间")
+    private Date uploadTime;
+}

+ 6 - 0
src/main/java/com/macro/mall/tiny/modules/business/model/BLine.java

@@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+import java.util.Date;
 import java.util.List;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -45,4 +47,8 @@ public class BLine implements Serializable {
     @ApiModelProperty(value = "包含铁塔")
     @TableField(exist = false)
     private List<BTower> towerList;
+
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
 }

+ 6 - 0
src/main/java/com/macro/mall/tiny/modules/business/model/BTower.java

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -51,4 +53,8 @@ public class BTower implements Serializable {
 
     @ApiModelProperty(value = "纬度")
     private BigDecimal lat;
+
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+    private Date createTime;
 }

+ 0 - 15
src/main/java/com/macro/mall/tiny/modules/business/service/BDirectoryService.java

@@ -1,15 +0,0 @@
-package com.macro.mall.tiny.modules.business.service;
-
-import com.macro.mall.tiny.domain.AdminUserDetails;
-import com.macro.mall.tiny.modules.business.model.BDirectory;
-
-/**
- * @author gjs
- * @description
- * @date 2021/4/2 9:30
- */
-public interface BDirectoryService {
-
-    BDirectory getDirectory(AdminUserDetails userDetails);
-
-}

+ 4 - 0
src/main/java/com/macro/mall/tiny/modules/business/service/BLineService.java

@@ -1,5 +1,7 @@
 package com.macro.mall.tiny.modules.business.service;
 
+import com.macro.mall.tiny.domain.AdminUserDetails;
+import com.macro.mall.tiny.modules.business.model.BFile;
 import com.macro.mall.tiny.modules.business.model.BLine;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -18,4 +20,6 @@ public interface BLineService extends IService<BLine> {
     List<BLine> getLineList();
 
     List<BLine> findByKey(String key);
+
+    List<BFile> getFile(Long id, AdminUserDetails userDetails);
 }

+ 1 - 1
src/main/java/com/macro/mall/tiny/modules/business/service/BTowerService.java

@@ -21,5 +21,5 @@ public interface BTowerService extends IService<BTower> {
 
     long saveAndUpdate(List<BTower> towerList);
 
-    Map<String, List<BFile>> getData(Long id, AdminUserDetails userDetails);
+    Map<String, List<BFile>> getFile(Long id, AdminUserDetails userDetails);
 }

+ 11 - 0
src/main/java/com/macro/mall/tiny/modules/business/service/FileService.java

@@ -1,10 +1,14 @@
 package com.macro.mall.tiny.modules.business.service;
 
 import com.macro.mall.tiny.domain.AdminUserDetails;
+import com.macro.mall.tiny.modules.business.model.BDirectory;
+import com.macro.mall.tiny.modules.business.model.BFile;
+import com.macro.mall.tiny.modules.business.model.BFileDetail;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.security.Principal;
+import java.util.List;
 
 /**
  * @author gjs
@@ -16,4 +20,11 @@ public interface FileService {
     void upload(MultipartFile file) throws IOException;
 
     void uploadWithBlock(String name, String lineName, Long provinceId, Long size, Integer chunks, Integer chunk, MultipartFile file, AdminUserDetails userDetails) throws IOException;
+
+    BDirectory getRootDirectory(AdminUserDetails userDetails);
+
+    List<BFileDetail> getFileDetailList(String path, AdminUserDetails userDetails);
+
+    List<BFile> getFileList(String path, AdminUserDetails userDetails);
+
 }

+ 3 - 1
src/main/java/com/macro/mall/tiny/modules/business/service/impl/AsyncHandler.java

@@ -84,7 +84,7 @@ public class AsyncHandler {
             String username = userDetails.getUsername();
             UmsAdmin umsAdmin = adminService.getAdminByUsername(username);
             Long userId = umsAdmin.getId();
-            boolean canCover = AuthUtil.checkAccess(userDetails, "/cover");
+            boolean canCover = AuthUtil.checkAccess(userDetails, AuthUtil.COVER);
             // 查看是否为线路创建者
             QueryWrapper<BLine> wrapper = new QueryWrapper<>();
             wrapper.lambda().eq(BLine::getName, lineName);
@@ -95,6 +95,7 @@ public class AsyncHandler {
                 newLine.setCreatorId(userId);
                 newLine.setName(lineName);
                 newLine.setProvinceId(provinceId);
+                newLine.setCreateTime(new Date());
                 lineService.save(newLine);
                 line = newLine;
 
@@ -153,6 +154,7 @@ public class AsyncHandler {
                                 tower.setLon(lon);
                                 tower.setLat(lat);
                                 tower.setLineId(finalLine.getId());
+                                tower.setCreateTime(new Date());
                                 return tower;
                             }).collect(Collectors.toList());
                             towerService.saveAndUpdate(towerList);

+ 1 - 1
src/main/java/com/macro/mall/tiny/modules/business/service/impl/BDirectoryCacheServiceImpl.java

@@ -26,7 +26,7 @@ public class BDirectoryCacheServiceImpl implements BDirectoryCacheService {
     private String REDIS_KEY_DIRECTORY;
 
     private String getKey(AdminUserDetails userDetails) {
-        final boolean access = AuthUtil.checkAccess(userDetails, "/visit");
+        final boolean access = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
         return REDIS_DATABASE + ":" + REDIS_KEY_DIRECTORY + ":" + (access ? 1 : 0);
     }
 

+ 0 - 37
src/main/java/com/macro/mall/tiny/modules/business/service/impl/BDirectoryServiceImpl.java

@@ -1,37 +0,0 @@
-package com.macro.mall.tiny.modules.business.service.impl;
-
-import cn.hutool.core.collection.CollUtil;
-import com.macro.mall.tiny.common.util.MyFileUtils;
-import com.macro.mall.tiny.domain.AdminUserDetails;
-import com.macro.mall.tiny.modules.business.model.BDirectory;
-import com.macro.mall.tiny.modules.business.service.BDirectoryCacheService;
-import com.macro.mall.tiny.modules.business.service.BDirectoryService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * @author gjs
- * @description
- * @date 2021/4/2 9:32
- */
-@Service
-public class BDirectoryServiceImpl implements BDirectoryService {
-
-    @Autowired
-    BDirectoryCacheService directoryCacheService;
-
-    @Override
-    public BDirectory getDirectory(AdminUserDetails userDetails) {
-        BDirectory directory = directoryCacheService.getDirectory(userDetails);
-        if (directory != null) {
-            return directory;
-        }
-        directory = MyFileUtils.getRootDirectory(userDetails);
-        if (directory != null) {
-            directoryCacheService.setDirectory(userDetails, directory);
-        } else {
-            directoryCacheService.setDirectory(userDetails, new BDirectory());
-        }
-        return directory;
-    }
-}

+ 23 - 1
src/main/java/com/macro/mall/tiny/modules/business/service/impl/BLineServiceImpl.java

@@ -1,12 +1,19 @@
 package com.macro.mall.tiny.modules.business.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.macro.mall.tiny.common.exception.Asserts;
+import com.macro.mall.tiny.common.util.MyFileUtils;
+import com.macro.mall.tiny.config.UploadConfig;
+import com.macro.mall.tiny.domain.AdminUserDetails;
+import com.macro.mall.tiny.modules.business.mapper.BProvinceMapper;
+import com.macro.mall.tiny.modules.business.model.BFile;
 import com.macro.mall.tiny.modules.business.model.BLine;
 import com.macro.mall.tiny.modules.business.mapper.BLineMapper;
+import com.macro.mall.tiny.modules.business.model.BProvince;
 import com.macro.mall.tiny.modules.business.service.BLineCacheService;
 import com.macro.mall.tiny.modules.business.service.BLineService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.macro.mall.tiny.security.util.AuthUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -30,6 +37,9 @@ public class BLineServiceImpl extends ServiceImpl<BLineMapper, BLine> implements
     @Autowired
     private BLineMapper lineMapper;
 
+    @Autowired
+    BProvinceMapper provinceMapper;
+
     @Override
     public List<BLine> getLineList() {
         List<BLine> lineList = lineCacheService.getLineList();
@@ -49,4 +59,16 @@ public class BLineServiceImpl extends ServiceImpl<BLineMapper, BLine> implements
     public List<BLine> findByKey(String key) {
         return lineMapper.findListByKey(key);
     }
+
+    @Override
+    public List<BFile> getFile(Long id, AdminUserDetails userDetails) {
+        boolean auth = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
+        BLine line = lineMapper.selectById(id);
+        if (line == null) Asserts.fail("该线路不存在,id:" + id);
+        BProvince province = provinceMapper.selectById(line.getProvinceId());
+        String basePath = UploadConfig.powerPath +
+                province.getProvince() + UploadConfig.SEPARATOR +
+                line.getName();
+        return MyFileUtils.getSonFiles(basePath, auth);
+    }
 }

+ 5 - 7
src/main/java/com/macro/mall/tiny/modules/business/service/impl/BTowerServiceImpl.java

@@ -15,13 +15,11 @@ import com.macro.mall.tiny.modules.business.model.BLine;
 import com.macro.mall.tiny.modules.business.model.BProvince;
 import com.macro.mall.tiny.modules.business.model.BTower;
 import com.macro.mall.tiny.modules.business.service.BTowerService;
-import com.macro.mall.tiny.modules.ums.service.UmsAdminService;
 import com.macro.mall.tiny.security.util.AuthUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.io.File;
 import java.io.FilenameFilter;
 import java.util.HashMap;
 import java.util.List;
@@ -53,11 +51,11 @@ public class BTowerServiceImpl extends ServiceImpl<BTowerMapper, BTower> impleme
     }
 
     @Override
-    public Map<String, List<BFile>> getData(Long id, AdminUserDetails userDetails) {
+    public Map<String, List<BFile>> getFile(Long id, AdminUserDetails userDetails) {
         if (userDetails == null) {
             Asserts.fail("查询失败,未获取到当前用户");
         }
-        boolean auth = AuthUtil.checkAccess(userDetails, "/visit");
+        boolean auth = AuthUtil.checkAccess(userDetails, AuthUtil.ACCESS);
 
         HashMap<String, List<BFile>> resultMap = new HashMap<>();
 
@@ -82,7 +80,7 @@ public class BTowerServiceImpl extends ServiceImpl<BTowerMapper, BTower> impleme
         if (StringUtils.isNotBlank(shape)) {
             SecBasePath = MyFileUtils.getAuthFilePath(basePath, DirectoryEnum.TOWER_PIC.getName(), auth);
             ThirdBasePath = MyFileUtils.getAuthFilePath(SecBasePath, shape, auth);
-            sonList = MyFileUtils.getSonPaths(ThirdBasePath, auth);
+            sonList = MyFileUtils.getSonFiles(ThirdBasePath, auth);
         } else {
             sonList = Lists.newArrayList();
         }
@@ -92,14 +90,14 @@ public class BTowerServiceImpl extends ServiceImpl<BTowerMapper, BTower> impleme
         SecBasePath = MyFileUtils.getAuthFilePath(basePath, DirectoryEnum.EARTH_WIRE_HARD_PIC.getName(), auth);
         String hardwareType = tower.getHardwareType().replace('/', ' ');
         FilenameFilter hardwareTypeFilter = (dir, name) -> name.startsWith(hardwareType) || (name.startsWith(UploadConfig.AUTH_STR + hardwareType) && auth);
-        sonList = MyFileUtils.getSonPaths(SecBasePath, hardwareTypeFilter, auth);
+        sonList = MyFileUtils.getSonFiles(SecBasePath, hardwareTypeFilter, auth);
         resultMap.put("hardwareFileList", sonList);
 
         // 获取7班组巡检照片
         SecBasePath = MyFileUtils.getAuthFilePath(basePath, DirectoryEnum.TEAM_CHECK_PIC.getName(), auth);
         String towerName = tower.getName();
         ThirdBasePath = MyFileUtils.getAuthFilePath(SecBasePath, towerName, auth);
-        sonList = MyFileUtils.getSonPaths(ThirdBasePath, auth);
+        sonList = MyFileUtils.getSonFiles(ThirdBasePath, auth);
         resultMap.put("teamCheckFileList", sonList);
 
         return resultMap;

+ 33 - 0
src/main/java/com/macro/mall/tiny/modules/business/service/impl/FileServiceImpl.java

@@ -3,6 +3,10 @@ package com.macro.mall.tiny.modules.business.service.impl;
 import com.macro.mall.tiny.common.util.MyFileUtils;
 import com.macro.mall.tiny.config.UploadConfig;
 import com.macro.mall.tiny.domain.AdminUserDetails;
+import com.macro.mall.tiny.modules.business.model.BDirectory;
+import com.macro.mall.tiny.modules.business.model.BFile;
+import com.macro.mall.tiny.modules.business.model.BFileDetail;
+import com.macro.mall.tiny.modules.business.service.BDirectoryCacheService;
 import com.macro.mall.tiny.modules.business.service.FileService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -11,6 +15,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.util.List;
 
 import static com.macro.mall.tiny.common.util.UploadUtils.*;
 
@@ -26,6 +31,9 @@ public class FileServiceImpl implements FileService {
     @Autowired
     private AsyncHandler asyncHandler;
 
+    @Autowired
+    BDirectoryCacheService directoryCacheService;
+
     /**
      * 上传文件
      *
@@ -63,4 +71,29 @@ public class FileServiceImpl implements FileService {
         }
     }
 
+    @Override
+    public BDirectory getRootDirectory(AdminUserDetails userDetails) {
+        BDirectory directory = directoryCacheService.getDirectory(userDetails);
+        if (directory != null) {
+            return directory;
+        }
+        directory = MyFileUtils.getRootDirectory(userDetails);
+        if (directory != null) {
+            directoryCacheService.setDirectory(userDetails, directory);
+        } else {
+            directoryCacheService.setDirectory(userDetails, new BDirectory());
+        }
+        return directory;
+    }
+
+    @Override
+    public List<BFileDetail> getFileDetailList(String path, AdminUserDetails userDetails) {
+        return MyFileUtils.getFileDetailList(path, userDetails);
+    }
+
+    @Override
+    public List<BFile> getFileList(String path, AdminUserDetails userDetails) {
+        return MyFileUtils.getSonFiles(path, userDetails);
+    }
+
 }

+ 3 - 2
src/main/java/com/macro/mall/tiny/modules/ums/dto/UmsAdminLoginParam.java

@@ -14,9 +14,10 @@ import javax.validation.constraints.NotEmpty;
 @EqualsAndHashCode(callSuper = false)
 public class UmsAdminLoginParam {
     @NotEmpty
-    @ApiModelProperty(value = "用户名",required = true)
+    @ApiModelProperty(value = "用户名", required = true)
     private String username;
+
     @NotEmpty
-    @ApiModelProperty(value = "密码",required = true)
+    @ApiModelProperty(value = "密码", required = true)
     private String password;
 }

+ 4 - 0
src/main/java/com/macro/mall/tiny/modules/ums/model/UmsAdmin.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -45,9 +47,11 @@ public class UmsAdmin implements Serializable {
     @ApiModelProperty(value = "备注信息")
     private String note;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "最后登录时间")
     private Date loginTime;
 

+ 3 - 0
src/main/java/com/macro/mall/tiny/modules/ums/model/UmsAdminLoginLog.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -31,6 +33,7 @@ public class UmsAdminLoginLog implements Serializable {
 
     private Long adminId;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
     private String ip;

+ 3 - 0
src/main/java/com/macro/mall/tiny/modules/ums/model/UmsMenu.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -32,6 +34,7 @@ public class UmsMenu implements Serializable {
     @ApiModelProperty(value = "父级ID")
     private Long parentId;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 

+ 3 - 0
src/main/java/com/macro/mall/tiny/modules/ums/model/UmsResource.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -29,6 +31,7 @@ public class UmsResource implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 

+ 3 - 0
src/main/java/com/macro/mall/tiny/modules/ums/model/UmsResourceCategory.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -29,6 +31,7 @@ public class UmsResourceCategory implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 

+ 3 - 0
src/main/java/com/macro/mall/tiny/modules/ums/model/UmsRole.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import java.util.Date;
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -38,6 +40,7 @@ public class UmsRole implements Serializable {
     @ApiModelProperty(value = "后台用户数量")
     private Integer adminCount;
 
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
     @ApiModelProperty(value = "创建时间")
     private Date createTime;
 

+ 3 - 0
src/main/java/com/macro/mall/tiny/security/util/AuthUtil.java

@@ -10,6 +10,9 @@ import org.springframework.security.core.GrantedAuthority;
  */
 public class AuthUtil {
 
+    public static final String COVER = "/cover";
+    public static final String ACCESS = "/visit";
+
     public static boolean checkAccess(AdminUserDetails userDetails, String resource) {
         for (GrantedAuthority authority : userDetails.getAuthorities()) {
             if (resource.equals(authority.getAuthority())) {

+ 15 - 2
src/main/resources/mapper/business/BLineMapper.xml

@@ -5,6 +5,9 @@
     <select id="findListMulti" resultMap="BaseResultMap">
         SELECT l.id,
                l.name,
+               l.province_id,
+               l.creator_id,
+               l.create_time,
                t.id            t_id,
                t.sort          t_sort,
                t.name          t_name,
@@ -12,7 +15,8 @@
                t.hardware_type t_hardware_type,
                t.line_id       t_line_id,
                t.lon           t_lon,
-               t.lat           t_lat
+               t.lat           t_lat,
+               t.create_time   t_create_time
         FROM b_line l
                  LEFT JOIN b_tower t ON l.id = t.line_id
         ORDER BY t_sort;
@@ -21,6 +25,9 @@
     <select id="findListByKey" resultMap="BaseResultMap" parameterType="string">
         SELECT l.id,
                l.name,
+               l.province_id,
+               l.creator_id,
+               l.create_time,
                t.id            t_id,
                t.sort          t_sort,
                t.name          t_name,
@@ -28,13 +35,15 @@
                t.hardware_type t_hardware_type,
                t.line_id       t_line_id,
                t.lon           t_lon,
-               t.lat           t_lat
+               t.lat           t_lat,
+               t.create_time   t_crete_time
         FROM b_line l
                  LEFT JOIN b_tower t ON l.id = t.line_id
                  LEFT JOIN b_province p on l.province_id = p.id
         WHERE l.name like concat('%', #{key}, '%')
            OR p.province like concat('%', #{key}, '%')
         ORDER BY t_sort;
+
     </select>
 
     <!-- 通用查询映射结果 -->
@@ -42,6 +51,9 @@
         <id column="id" property="id"/>
         <result column="name" property="name"/>
         <result column="province_id" property="provinceId"/>
+        <result column="province_id" property="provinceId"/>
+        <result column="creator_id" property="creatorId"/>
+        <result column="create_time" property="createTime"/>
         <collection property="towerList" ofType="com.macro.mall.tiny.modules.business.model.BTower" column="id">
             <id column="t_id" property="id"/>
             <result column="t_sort" property="sort"/>
@@ -52,6 +64,7 @@
             <result column="t_line_id" property="lineId"/>
             <result column="t_lon" property="lon"/>
             <result column="t_lat" property="lat"/>
+            <result column="t_create_time" property="createTime"/>
         </collection>
     </resultMap>
 

+ 7 - 3
src/main/resources/mapper/business/BTowerMapper.xml

@@ -10,7 +10,8 @@
         hardware_type,
         line_id,
         lon,
-        lat
+        lat,
+        create_time
         )
         VALUES
         <foreach collection="towerList" item="item" separator=",">
@@ -21,7 +22,8 @@
             #{item.hardwareType},
             #{item.lineId},
             #{item.lon},
-            #{item.lat}
+            #{item.lat},
+            #{item.createTime}
             )
         </foreach>
         ON DUPLICATE KEY UPDATE
@@ -29,7 +31,9 @@
         shape = VALUES(shape),
         hardware_type = VALUES(hardware_type),
         lon = VALUES(lon),
-        lat = VALUES(lat)
+        lat = VALUES(lat),
+        create_time = VALUES(create_time);
+
     </insert>
 
     <!-- 通用查询映射结果 -->