wip(sj_1.0.0): 添加ImportUtils,ExportUtils

This commit is contained in:
dhb52 2024-05-28 00:56:01 +08:00 committed by opensnail
parent 2dab8f45b0
commit 0f762339b6
4 changed files with 79 additions and 50 deletions

View File

@ -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<String> 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<JobRequestVO> 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<ConstraintViolation<JobRequestVO>> set = validator.validate(vo);
for (final ConstraintViolation<JobRequestVO> violation : set) {
throw new SnailJobCommonException(violation.getMessage());
}
});
List<JobRequestVO> requestList = ImportUtils.parseList(file, JobRequestVO.class);
jobService.importJobs(requestList);
}
@ -150,17 +115,7 @@ public class JobController {
@OriginalControllerReturnValue
public ResponseEntity<String> exportGroup(@RequestBody Set<Long> 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);
}
}

View File

@ -251,7 +251,7 @@ public class JobServiceImpl implements JobService {
@Transactional(rollbackFor = Exception.class)
@Override
public void importJobs(List<JobRequestVO> requestList) {
requestList.forEach(vo -> saveJob(vo));
requestList.forEach(this::saveJob);
}
@Override

View File

@ -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<String> 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);
}
}

View File

@ -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<String> FILE_EXTENSIONS = List.of("json");
public static @NotNull <VO> List<VO> parseList(MultipartFile file, Class<VO> clazz) throws IOException {
// 保存文件到服务器
String suffix = FileUtil.getSuffix(file.getOriginalFilename());
if (!FILE_EXTENSIONS.contains(suffix)) {
throw new SnailJobCommonException("文件类型错误");
}
JsonNode node = JsonUtil.toJson(file.getBytes());
List<VO> requestList = JsonUtil.parseList(JsonUtil.toJsonString(node), clazz);
Assert.notEmpty(requestList, () -> new SnailJobServerException("导入数据不能为空"));
// 校验参数是否合法
requestList.forEach(vo -> {
ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
Validator validator = vf.getValidator();
Set<ConstraintViolation<VO>> rules = validator.validate(vo);
rules.forEach(rule -> {
throw new SnailJobCommonException(rule.getMessage());
});
});
return requestList;
}
}