From 0f762339b68dd64006483f7b49694799e6a53e2a Mon Sep 17 00:00:00 2001 From: dhb52 Date: Tue, 28 May 2024 00:56:01 +0800 Subject: [PATCH] =?UTF-8?q?wip(sj=5F1.0.0):=20=E6=B7=BB=E5=8A=A0ImportUtil?= =?UTF-8?q?s,ExportUtils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/web/controller/JobController.java | 53 ++----------------- .../web/service/impl/JobServiceImpl.java | 2 +- .../snailjob/server/web/util/ExportUtils.java | 25 +++++++++ .../snailjob/server/web/util/ImportUtils.java | 49 +++++++++++++++++ 4 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ExportUtils.java create mode 100644 snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java index b9ec97902..ef3710ae6 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/JobController.java @@ -1,12 +1,7 @@ package com.aizuda.snailjob.server.web.controller; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.lang.Assert; import com.aizuda.snailjob.common.core.annotation.OriginalControllerReturnValue; import com.aizuda.snailjob.common.core.exception.SnailJobCommonException; -import com.aizuda.snailjob.common.core.util.JsonUtil; -import com.aizuda.snailjob.server.common.exception.SnailJobServerException; -import com.aizuda.snailjob.server.common.util.DateUtils; import com.aizuda.snailjob.server.web.annotation.LoginRequired; import com.aizuda.snailjob.server.web.annotation.RoleEnum; import com.aizuda.snailjob.server.web.model.base.PageResult; @@ -15,13 +10,9 @@ import com.aizuda.snailjob.server.web.model.request.JobRequestVO; import com.aizuda.snailjob.server.web.model.request.JobUpdateJobStatusRequestVO; import com.aizuda.snailjob.server.web.model.response.JobResponseVO; import com.aizuda.snailjob.server.web.service.JobService; -import com.fasterxml.jackson.databind.JsonNode; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validation; -import jakarta.validation.Validator; -import jakarta.validation.ValidatorFactory; +import com.aizuda.snailjob.server.web.util.ExportUtils; +import com.aizuda.snailjob.server.web.util.ImportUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -29,7 +20,6 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Set; @@ -42,7 +32,6 @@ import java.util.Set; @RequestMapping("/job") public class JobController { - private static final List FILE_EXTENSIONS = List.of("json"); @Autowired private JobService jobService; @@ -117,31 +106,7 @@ public class JobController { if (file.isEmpty()) { throw new SnailJobCommonException("请选择一个文件上传"); } - - // 保存文件到服务器 - String suffix = FileUtil.getSuffix(file.getOriginalFilename()); - if (!FILE_EXTENSIONS.contains(suffix)) { - throw new SnailJobCommonException("文件类型错误"); - } - - JsonNode node = JsonUtil.toJson(file.getBytes()); - - List requestList = JsonUtil.parseList(JsonUtil.toJsonString(node), - JobRequestVO.class); - requestList.forEach(vo -> vo.setId(null)); - - Assert.notEmpty(requestList, () -> new SnailJobServerException("导入数据不能为空")); - - // 校验参数是否合法 - requestList.forEach(vo ->{ - ValidatorFactory vf = Validation.buildDefaultValidatorFactory(); - Validator validator = vf.getValidator(); - Set> set = validator.validate(vo); - for (final ConstraintViolation violation : set) { - throw new SnailJobCommonException(violation.getMessage()); - } - }); - + List requestList = ImportUtils.parseList(file, JobRequestVO.class); jobService.importJobs(requestList); } @@ -150,17 +115,7 @@ public class JobController { @OriginalControllerReturnValue public ResponseEntity exportGroup(@RequestBody Set jobIds) { String jobsJson = jobService.exportJobs(jobIds); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - // 设置下载时的文件名称 - String fileName = String.format("job-%s.json", DateUtils.toNowFormat(DateUtils.PURE_DATETIME_MS_PATTERN)); - String disposition = "attachment; filename=" + - new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); - headers.add(HttpHeaders.CONTENT_DISPOSITION, disposition); - return ResponseEntity.ok() - .headers(headers) - .body(jobsJson); + return ExportUtils.doExport(jobsJson); } } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/JobServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/JobServiceImpl.java index 567a3a5db..359710697 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/JobServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/JobServiceImpl.java @@ -251,7 +251,7 @@ public class JobServiceImpl implements JobService { @Transactional(rollbackFor = Exception.class) @Override public void importJobs(List requestList) { - requestList.forEach(vo -> saveJob(vo)); + requestList.forEach(this::saveJob); } @Override diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ExportUtils.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ExportUtils.java new file mode 100644 index 000000000..2e11d40af --- /dev/null +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ExportUtils.java @@ -0,0 +1,25 @@ +package com.aizuda.snailjob.server.web.util; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; + +import java.nio.charset.StandardCharsets; + +public class ExportUtils { + + public static ResponseEntity doExport(String json) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + // 设置下载时的文件名称, 由前端重命名 + String fileName = "export.json"; + String disposition = "attachment; filename=" + + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); + headers.add(HttpHeaders.CONTENT_DISPOSITION, disposition); + return ResponseEntity.ok() + .headers(headers) + .body(json); + } + +} diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java new file mode 100644 index 000000000..5a8ccb098 --- /dev/null +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/util/ImportUtils.java @@ -0,0 +1,49 @@ +package com.aizuda.snailjob.server.web.util; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Assert; +import com.aizuda.snailjob.common.core.exception.SnailJobCommonException; +import com.aizuda.snailjob.common.core.util.JsonUtil; +import com.aizuda.snailjob.server.common.exception.SnailJobServerException; +import com.fasterxml.jackson.databind.JsonNode; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validation; +import jakarta.validation.Validator; +import jakarta.validation.ValidatorFactory; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.List; +import java.util.Set; + +public class ImportUtils { + + private static final List FILE_EXTENSIONS = List.of("json"); + + public static @NotNull List parseList(MultipartFile file, Class clazz) throws IOException { + // 保存文件到服务器 + String suffix = FileUtil.getSuffix(file.getOriginalFilename()); + if (!FILE_EXTENSIONS.contains(suffix)) { + throw new SnailJobCommonException("文件类型错误"); + } + + JsonNode node = JsonUtil.toJson(file.getBytes()); + List requestList = JsonUtil.parseList(JsonUtil.toJsonString(node), clazz); + Assert.notEmpty(requestList, () -> new SnailJobServerException("导入数据不能为空")); + + // 校验参数是否合法 + requestList.forEach(vo -> { + ValidatorFactory vf = Validation.buildDefaultValidatorFactory(); + Validator validator = vf.getValidator(); + Set> rules = validator.validate(vo); + rules.forEach(rule -> { + throw new SnailJobCommonException(rule.getMessage()); + }); + }); + + return requestList; + } +} + +