Browse Source

update

tags/v0
zhaohe 9 months ago
parent
commit
2f22e58f10
  1. 57
      src/main/java/a8k/controler/filemgr/FileMgrController.java
  2. 101
      src/main/java/a8k/service/app/appdata/FileMgrService.java
  3. 7
      src/main/resources/static/background/js/bootstrap.min.css
  4. 7
      src/main/resources/static/background/js/bootstrap.min.js
  5. 2
      src/main/resources/static/background/js/jquery-3.5.1.min.js
  6. 74
      src/main/resources/templates/filemgr/index.html

57
src/main/java/a8k/controler/filemgr/FileMgrController.java

@ -64,13 +64,12 @@
// src/main/java/a8k/controller/FileMgrController.java
package a8k.controler.filemgr;
import a8k.constant.FilePathConstant;
import a8k.service.app.appdata.FileMgrService;
import cn.hutool.core.net.URLDecoder;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.ContentDisposition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
@ -80,6 +79,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
@ -89,6 +89,10 @@ import java.util.List;
@RequestMapping("/filemgr")
public class FileMgrController {
@Resource
FileMgrService fileMgrService;
record FileGroup(String name, List<FileInfo> files) {
}
@ -96,47 +100,34 @@ public class FileMgrController {
}
FileGroup buidOptFileGroup() {
List<FileInfo> files = fileMgrService.getOptReportList().stream()
.map(fileName -> new FileInfo(fileMgrService.getOptReportFilePath(fileName), fileName))
.toList();
return new FileGroup("光学报告", files);
}
@GetMapping("/index")
public String fileDownloadPage(Model model) {
// Mock data for file groups and files
List<FileGroup> fileGroups = List.of(
new FileGroup("Group 1", List.of(new FileInfo("runenv/files/optReport/20241112152609.txt", "File1.txt"), new FileInfo("", "File2.txt"))),
new FileGroup("Group 2", List.of(new FileInfo("", "File3.txt"), new FileInfo("", "File4.txt")))
buidOptFileGroup()
);
model.addAttribute("fileGroups", fileGroups);
return "filemgr/index.html";
}
// @GetMapping("/download/{fileId}")
// public ResponseEntity<Resource> downloadFile(@RequestParam("file") MultipartFile file) {
// String realpath = String.format(FilePathConstant.FILE_DOWNLOAD_PATH + "/%s", path);
// String contentDisposition = ContentDisposition
// .builder("attachment")
// .filename(path) // Use the original filename
// .build().toString();
// return ResponseEntity.ok()
// .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
// .body(new FileSystemResource(realpath));
// }
//
// @GetMapping("/download/{path}")
// @ResponseBody
// public ResponseEntity<Resource> download(@PathVariable String path) {
// log.info("Download file: {}", path);
// // String realpath = String.format(FilePathConstant.FILE_DOWNLOAD_PATH + "/%s", path);
// String contentDisposition = ContentDisposition
// .builder("attachment")
// .filename(path) // Use the original filename
// .build().toString();
// return ResponseEntity.ok()
// .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)
// .body(new FileSystemResource(path));
// }
@GetMapping("/download/**")
@ResponseBody
public ResponseEntity<Resource> download(HttpServletRequest request) {
public ResponseEntity<org.springframework.core.io.Resource> download(HttpServletRequest request) {
String path = request.getRequestURI().substring("/filemgr/download/".length());
//转义地址中空格TODO:支持处理中文文件名
// path = path.replaceAll("%20", " ");
path = URLDecoder.decode(path, StandardCharsets.UTF_8);
String fileName = Paths.get(path).getFileName().toString();
log.info("Download file:{} path:{}", fileName, path);
@ -144,7 +135,7 @@ public class FileMgrController {
String contentDisposition = ContentDisposition
.builder("attachment")
.filename(fileName) // Use the original filename
.filename(fileName, StandardCharsets.UTF_8) // Use the original filename
.build().toString();
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition)

101
src/main/java/a8k/service/app/appdata/FileMgrService.java

@ -10,32 +10,79 @@ import a8k.constant.FilePathConstant;
import a8k.service.dao.type.OptRawScanData;
import a8k.service.dao.type.a8kidcard.zenum.A8kOptType;
import a8k.utils.ZDateUtils;
import cn.hutool.core.io.FileUtil;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Slf4j
@Component
public class FileMgrService {
//
// EXT
//
public void clearOptReport() {
File dir = new File(FilePathConstant.FILE_OPT_REPORT_PATH);
if (dir.exists() && dir.listFiles() != null) {
Arrays.stream(Objects.requireNonNull(dir.listFiles())).forEach(File::delete);
}
}
public List<String> getOptReportList() {
File dir = new File(FilePathConstant.FILE_OPT_REPORT_PATH);
if (!dir.exists()) {
dir.mkdir();
}
return Arrays.asList(Objects.requireNonNull(dir.list()));
}
public String getOptReportFilePath(String fileName) {
return String.format("%s/%s", FilePathConstant.FILE_OPT_REPORT_PATH, fileName);
}
public String storageOptReport(String projName, Integer projId, OptScanResult optScanResult) throws IOException {
File dir = new File(FilePathConstant.FILE_OPT_REPORT_PATH);
dir.mkdir();
//FileName
String fileName = String.format("%s-%s-%s.txt", projName, optScanResult.rawData.optType, ZDateUtils.toID(optScanResult.rawData.scanDate));
String filePath = String.format("%s/%s", FilePathConstant.FILE_OPT_REPORT_PATH, fileName);
File file = new File(filePath);
FileWriter writer = new FileWriter(file.getAbsolutePath());
String content = createOptReportContent(projName, projId, optScanResult);
writer.write(content);
writer.close();
return file.getAbsolutePath();
}
//
// PRIVATE
//
private String createOptReportContent(String projName, Integer projId, OptScanResult optScanResult) {
StringBuilder sb = new StringBuilder();
sb.append("日期").append("\n");
sb.append("Date").append("\n");
sb.append(ZDateUtils.toDateString(optScanResult.rawData.scanDate)).append("\n");
sb.append("项目名称").append("\n");
sb.append("ProjName").append("\n");
sb.append(projName).append("\n");
sb.append("项目ID").append("\n");
sb.append("ProjId").append("\n");
sb.append(projId).append("\n");
sb.append("光学类型").append("\n");
sb.append("OptType").append("\n");
sb.append(optScanResult.rawData.optType).append("\n");
sb.append("发射增益").append("\n");
sb.append("lasterGain").append("\n");
sb.append(optScanResult.rawData.lasterGain).append("\n");
sb.append("接收增益").append("\n");
sb.append("scanerGain").append("\n");
sb.append(optScanResult.rawData.scanGain).append("\n");
sb.append("\n");
@ -107,7 +154,7 @@ public class FileMgrService {
sb.append("\n");
sb.append("解析后的数据(250个点)").append("\n");
sb.append("AfterAnalysPoint(250)").append("\n");
for (int i = 0; i < 250; i++) {
if (i < optScanResult.analysResult.resultData.length) {
sb.append(optScanResult.analysResult.resultData[i]).append("\n");
@ -117,7 +164,7 @@ public class FileMgrService {
}
sb.append("\n");
sb.append("原始数据(1200个点)").append("\n");
sb.append("RawData(1200)").append("\n");
for (int i = 0; i < 1200; i++) {
if (i < optScanResult.rawData.rawData.length) {
sb.append(optScanResult.rawData.rawData[i]).append("\n");
@ -130,21 +177,6 @@ public class FileMgrService {
}
public String createOptReport(String projName, Integer projId, OptScanResult optScanResult) throws IOException {
File dir = new File(FilePathConstant.FILE_OPT_REPORT_PATH);
dir.mkdir();
String path = String.format("%s/%s.txt", FilePathConstant.FILE_OPT_REPORT_PATH, ZDateUtils.toID(optScanResult.rawData.scanDate));
File file = new File(path);
FileWriter writer = new FileWriter(file.getAbsolutePath());
String content = createOptReportContent(projName, projId, optScanResult);
writer.write(content);
writer.close();
return file.getAbsolutePath();
}
public void createFakeOptReport() throws IOException {
OptRawScanData data = new OptRawScanData();
data.id = 1;
@ -183,18 +215,19 @@ public class FileMgrService {
optScanResult.rawData = data;
optScanResult.analysResult = optAlgoAnalysResult;
String path = createOptReport("Fake", 1, optScanResult);
String path = storageOptReport("Fake( xxxx)", 1, optScanResult);
log.info("createFakeOptReport success {}", path);
}
// public static void main(String[] args) {
// FileMgrService fileMgrService = new FileMgrService();
// try {
// fileMgrService.createFakeOptReport();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
public static void main(String[] args) {
FileMgrService fileMgrService = new FileMgrService();
try {
fileMgrService.createFakeOptReport();
log.info("{}", fileMgrService.getOptReportList());
} catch (IOException e) {
e.printStackTrace();
}
}
}

7
src/main/resources/static/background/js/bootstrap.min.css
File diff suppressed because it is too large
View File

7
src/main/resources/static/background/js/bootstrap.min.js
File diff suppressed because it is too large
View File

2
src/main/resources/static/background/js/jquery-3.5.1.min.js
File diff suppressed because it is too large
View File

74
src/main/resources/templates/filemgr/index.html

@ -4,20 +4,78 @@
<head>
<meta charset="UTF-8">
<title>文件管理</title>
<link href="/background/js/bootstrap.min.css" rel="stylesheet">
<style>
body {
padding: 20px;
}
h1 {
margin-bottom: 20px;
}
.file-group {
margin-bottom: 20px;
}
.file-group h2 {
margin-bottom: 10px;
}
.file-group .file {
margin-bottom: 5px;
}
.file-group .file button {
width: 100%;
}
.download-title {
font-size: 2em;
color: #007bff;
text-align: left;
margin-bottom: 30px;
}
</style>
</head>
<body>
<h1>文件下载</h1>
<div>
<div th:each="group : ${fileGroups}">
<h2 th:text="${group.name}"></h2>
<div th:each="file : ${group.files}">
<a th:href="@{'/filemgr/download/' + ${file.filePath}}">
<button>
<div class="container">
<h1 class="download-title">文件下载</h1>
<div th:each="group : ${fileGroups}" class="file-group">
<h2 th:text="${group.name}" class="text-primary"></h2>
<div th:each="file : ${group.files}" class="file">
<a th:href="@{'/filemgr/download/' + ${file.filePath}}" class="btn btn-outline-primary download-link">
<span th:text="${file.name}"></span>
</button>
</a>
</div>
</div>
</div>
<!-- Notification Modal -->
<div class="modal fade" id="notificationModal" tabindex="-1" role="dialog" aria-labelledby="notificationModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="notificationModalLabel">通知</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
文件下载成功
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
<script src="/background/js/jquery-3.5.1.min.js"></script>
<script src="/background/js/bootstrap.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var downloadLinks = document.querySelectorAll('.download-link');
downloadLinks.forEach(function(link) {
link.addEventListener('click', function() {
$('#notificationModal').modal('show');
});
});
});
</script>
</body>
</html>
Loading…
Cancel
Save