Переглянути джерело

日志管理功能代码提交

jingyuanchao 1 рік тому
батько
коміт
6373d6de52

+ 4 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java

@@ -2,6 +2,7 @@ package com.xunmei.system.api;
 
 import com.xunmei.common.core.constant.ServiceNameConstants;
 import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.file.dto.FileDownloadDto;
 import com.xunmei.common.core.domain.file.dto.FileUploadByByteDto;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
 import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
@@ -111,4 +112,7 @@ public interface RemoteFileService {
 
     @GetMapping(value = "/file/checkFileExit")
     List<String> checkFileExit(@RequestParam("serverName") String serverName);
+
+    @PostMapping(value = "/file/downloadLogData", consumes = MediaType.APPLICATION_JSON_VALUE)
+    Response downloadLogData(@RequestBody FileDownloadDto req);
 }

+ 6 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java

@@ -2,6 +2,7 @@ package com.xunmei.system.api.factory;
 
 import com.alibaba.fastjson2.JSON;
 import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.file.dto.FileDownloadDto;
 import com.xunmei.common.core.domain.file.dto.FileUploadByByteDto;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
 import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
@@ -119,6 +120,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             public List<String> checkFileExit(String serverName) {
                 return new ArrayList<>();
             }
+
+            @Override
+            public Response downloadLogData(FileDownloadDto req) {
+                return null;
+            }
         };
     }
 }

+ 17 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/file/dto/FileDownloadDto.java

@@ -0,0 +1,17 @@
+package com.xunmei.common.core.domain.file.dto;
+
+import lombok.Data;
+
+/**
+ * @author jingyuanchao
+ * @date 2024/10/11 10:05
+ */
+@Data
+public class FileDownloadDto {
+
+    private String fileName;
+
+    private String filePath;
+
+    private String serverName;
+}

+ 9 - 1
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java

@@ -2,6 +2,7 @@ package com.xunmei.file.controller;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.file.dto.FileDownloadDto;
 import com.xunmei.common.core.domain.file.dto.FileUploadByByteDto;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
 import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
@@ -258,5 +259,12 @@ public class SysFileController {
     List<String> checkFileExit(@RequestParam("serverName") String serverName){
         return sysFileService.checkFileExit(serverName);
     }
-
+    @PostMapping(value = "/downloadLogData")
+    void downloadLogData(@RequestBody FileDownloadDto req,HttpServletResponse response){
+        try {
+            sysFileService.downloadLogData(req,response);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
 }

+ 4 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java

@@ -1,5 +1,6 @@
 package com.xunmei.file.service;
 
+import com.xunmei.common.core.domain.file.dto.FileDownloadDto;
 import com.xunmei.common.core.domain.file.dto.FileUploadByByteDto;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
 import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
@@ -87,4 +88,7 @@ public interface ISysFileService
     void uploadFileByte(FileUploadByByteDto fileUploadByByteDto);
 
     List<String> checkFileExit(String serverName);
+
+    void downloadLogData(FileDownloadDto req, HttpServletResponse response);
+
 }

+ 20 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

@@ -14,6 +14,7 @@ import com.lowagie.text.pdf.PdfPTable;
 import com.lowagie.text.pdf.PdfWriter;
 import com.xunmei.common.core.constant.CacheConstants;
 import com.xunmei.common.core.domain.IdName;
+import com.xunmei.common.core.domain.file.dto.FileDownloadDto;
 import com.xunmei.common.core.domain.file.dto.FileUploadByByteDto;
 import com.xunmei.common.core.domain.registerbook.dto.CoreRegisterBookPdfExportDto;
 import com.xunmei.common.core.domain.registerbook.dto.ExportPdfDto;
@@ -35,6 +36,7 @@ import com.xunmei.system.api.domain.SafeCheckTaskRegisterBookVo;
 import com.xunmei.system.api.vo.SysOrgVO;
 import io.netty.util.internal.StringUtil;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.text.StringEscapeUtils;
 import org.apache.tools.zip.ZipEntry;
@@ -1052,4 +1054,22 @@ public class LocalSysFileServiceImpl implements ISysFileService {
         }
     }
 
+    //D:/xunmei/uploadPath\/log\10.87.21.155\/soc-host/socketDeviceStatusInfo\2024-10-09-0.log
+    @Override
+    public void downloadLogData(FileDownloadDto req, HttpServletResponse response) {
+        final String fileName = this.localFilePath + File.separator + LOGS_DIR + File.separator + req.getServerName() + File.separator + req.getFilePath() + File.separator + req.getFileName();
+        final File file = new File(fileName);
+        if (!file.exists()) {
+            throw new RuntimeException("文件不存在");
+        }
+        try (InputStream inputStream = new FileInputStream(file)) {
+            byte[] bytes = IOUtils.toByteArray(inputStream);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(req.getFileName(), "UTF-8"));
+            response.setContentLength(bytes.length);
+            response.getOutputStream().write(bytes);
+        } catch (Exception e) {
+            throw new RuntimeException("文件下载失败");
+        }
+    }
 }

+ 8 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/controller/SysServerController.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 
 /**
@@ -78,4 +79,11 @@ public class SysServerController extends BaseController {
         sysServerService.transferLog(req);
         return success();
     }
+
+    @ApiOperation(value = "转存目标服务器上的日志")
+    @PostMapping("/downloadLogData")
+    public AjaxResult downloadLogData(TransferLogDto req, HttpServletResponse response) {
+        sysServerService.downloadLogData(req,response);
+        return success();
+    }
 }

+ 3 - 0
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/ISysServerService.java

@@ -9,6 +9,7 @@ import com.xunmei.system.dto.server.TransferLogDto;
 import com.xunmei.system.vo.server.CheckListVo;
 import com.xunmei.system.vo.server.SysServerPageVo;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -77,4 +78,6 @@ public interface ISysServerService extends IService<SysServer> {
     List<CheckListVo> getServerList(Long serverId);
 
     void transferLog(TransferLogDto req);
+
+    void downloadLogData(TransferLogDto req, HttpServletResponse response);
 }

+ 39 - 1
soc-modules/soc-modules-system/src/main/java/com/xunmei/system/service/impl/SysServerServiceImpl.java

@@ -11,6 +11,7 @@ import com.alibaba.fastjson2.TypeReference;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.file.dto.FileDownloadDto;
 import com.xunmei.common.core.domain.file.dto.FileUploadByByteDto;
 import com.xunmei.common.core.thread.ThreadPoolConfig;
 import com.xunmei.common.core.util.BeanHelper;
@@ -27,6 +28,7 @@ import com.xunmei.system.service.ISysServerService;
 import com.xunmei.system.vo.server.CheckListVo;
 import com.xunmei.system.vo.server.FileInfoVo;
 import com.xunmei.system.vo.server.SysServerPageVo;
+import feign.Response;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
@@ -34,7 +36,8 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.io.File;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -203,6 +206,41 @@ public class SysServerServiceImpl extends ServiceImpl<SysServerMapper, SysServer
         }
     }
 
+    @Override
+    public void downloadLogData(TransferLogDto req, HttpServletResponse response) {
+        final SysServer sysServer = getById(req.getServerId());
+        final String serverIp = sysServer.getServerIp();
+        FileDownloadDto dto=new FileDownloadDto();
+        dto.setServerName(serverIp);
+        dto.setFilePath(req.getParentPath().split("logs")[1]);
+        dto.setFileName(req.getPath());
+        final Response result = fileService.downloadLogData(dto);
+        InputStream inputStream = null;
+        BufferedInputStream bufferedInputStream = null;
+        BufferedOutputStream bufferedOutputStream = null;
+        try {
+            //把流返回到前端
+            Response.Body body = result.body();
+            inputStream = body.asInputStream();
+            bufferedInputStream = new BufferedInputStream(inputStream);
+            bufferedOutputStream = new BufferedOutputStream(response.getOutputStream());
+            response.setHeader("Content-Type", "application/octet-stream;charset=UTF-8");
+            response.addHeader("Content-Length", "" + body.length());
+            response.setHeader("Content-Disposition", result.headers().get("Content-Disposition").toString().replace("[", "").replace("]", ""));
+            int length = 0;
+            byte[] temp = new byte[1024 * 10];
+            while ((length = bufferedInputStream.read(temp)) != -1) {
+                bufferedOutputStream.write(temp, 0, length);
+            }
+            bufferedOutputStream.flush();
+            bufferedOutputStream.close();
+            bufferedInputStream.close();
+            inputStream.close();
+        } catch (IOException e) {
+
+            throw new RuntimeException(e);
+        }
+    }
     /**
      * 查询服务器维护
      *