From 99cf0461384c34d8728d601af576041f4611d333 Mon Sep 17 00:00:00 2001 From: opensnail <598092184@qq.com> Date: Wed, 29 May 2024 10:39:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(sj=5F1.0.0):=20=E4=BC=98=E5=8C=96=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E5=9C=BA=E6=99=AF=E5=92=8C=E7=BB=84=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/GroupConfigController.java | 58 ++----------------- .../web/controller/SceneConfigController.java | 56 ++---------------- .../web/service/GroupConfigService.java | 4 +- .../web/service/SceneConfigService.java | 4 +- .../service/impl/GroupConfigServiceImpl.java | 8 +-- .../service/impl/SceneConfigServiceImpl.java | 3 +- 6 files changed, 21 insertions(+), 112 deletions(-) diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java index 86c290fd..b87c1630 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/GroupConfigController.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; @@ -14,13 +9,9 @@ import com.aizuda.snailjob.server.web.model.request.GroupConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.GroupConfigRequestVO; import com.aizuda.snailjob.server.web.model.response.GroupConfigResponseVO; import com.aizuda.snailjob.server.web.service.GroupConfigService; -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 lombok.RequiredArgsConstructor; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -28,7 +19,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("/group") @RequiredArgsConstructor public class GroupConfigController { - private static final List FILE_EXTENSIONS = List.of("json"); private final GroupConfigService groupConfigService; @LoginRequired(role = RoleEnum.ADMIN) @@ -105,51 +94,16 @@ public class GroupConfigController { @LoginRequired(role = RoleEnum.ADMIN) public void importScene(@RequestPart("file") MultipartFile file) throws IOException { if (file.isEmpty()) { - throw new SnailJobCommonException("Please select a file to upload"); + 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), - GroupConfigRequestVO.class); - - Assert.notEmpty(requestList, () -> new SnailJobServerException("导入数据不能为空")); - - // 校验参数是否合法 - for (final GroupConfigRequestVO groupConfigRequestVO : requestList) { - ValidatorFactory vf = Validation.buildDefaultValidatorFactory(); - Validator validator = vf.getValidator(); - Set> set = validator.validate(groupConfigRequestVO); - for (final ConstraintViolation violation : set) { - throw new SnailJobCommonException(violation.getMessage()); - } - } - - groupConfigService.importGroup(requestList); + groupConfigService.importGroup(ImportUtils.parseList(file, GroupConfigRequestVO.class)); } @PostMapping("/export") - @LoginRequired(role = RoleEnum.ADMIN) + @LoginRequired @OriginalControllerReturnValue public ResponseEntity exportGroup(@RequestBody Set groupIds) { - - String configs = groupConfigService.exportGroup(groupIds); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - // 设置下载时的文件名称 - String fileName = String.format("group-config-%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(configs); + return ExportUtils.doExport(groupConfigService.exportGroup(groupIds)); } } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java index a9cb1689..c20ba8ce 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/controller/SceneConfigController.java @@ -1,26 +1,16 @@ 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.model.base.PageResult; import com.aizuda.snailjob.server.web.model.request.SceneConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigRequestVO; import com.aizuda.snailjob.server.web.model.response.SceneConfigResponseVO; import com.aizuda.snailjob.server.web.service.SceneConfigService; -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 lombok.RequiredArgsConstructor; -import org.springframework.core.io.UrlResource; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -28,7 +18,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,8 +31,6 @@ import java.util.Set; @RequestMapping("/scene-config") @RequiredArgsConstructor public class SceneConfigController { - - private static final List FILE_EXTENSIONS = List.of("json"); private final SceneConfigService sceneConfigService; @LoginRequired @@ -86,52 +73,19 @@ public class SceneConfigController { @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public void importScene(@RequestPart("file") MultipartFile file) throws IOException { if (file.isEmpty()) { - throw new SnailJobCommonException("Please select a file to upload"); - } - - // 保存文件到服务器 - 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), - SceneConfigRequestVO.class); - - Assert.notEmpty(requestList, () -> new SnailJobServerException("导入数据不能为空")); - - // 校验参数是否合法 - for (final SceneConfigRequestVO sceneConfigRequestVO : requestList) { - ValidatorFactory vf = Validation.buildDefaultValidatorFactory(); - Validator validator = vf.getValidator(); - Set> set = validator.validate(sceneConfigRequestVO); - for (final ConstraintViolation violation : set) { - throw new SnailJobCommonException(violation.getMessage()); - } + throw new SnailJobCommonException("请选择一个文件上传"); } // 写入数据 - sceneConfigService.importSceneConfig(requestList); + sceneConfigService.importSceneConfig(ImportUtils.parseList(file, SceneConfigRequestVO.class)); } @LoginRequired @PostMapping("/export") @OriginalControllerReturnValue public ResponseEntity export(@RequestBody Set sceneIds) { - String configs = sceneConfigService.exportSceneConfig(sceneIds); + return ExportUtils.doExport(sceneConfigService.exportSceneConfig(sceneIds)); - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - - // 设置下载时的文件名称 - String fileName = String.format("retry-scene-%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(configs); } } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/GroupConfigService.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/GroupConfigService.java index 935e5647..8ed538ea 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/GroupConfigService.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/GroupConfigService.java @@ -4,6 +4,8 @@ import com.aizuda.snailjob.server.web.model.base.PageResult; import com.aizuda.snailjob.server.web.model.request.GroupConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.GroupConfigRequestVO; import com.aizuda.snailjob.server.web.model.response.GroupConfigResponseVO; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import java.util.List; import java.util.Set; @@ -32,7 +34,7 @@ public interface GroupConfigService { List getTablePartitionList(); - void importGroup(List requestVOS); + void importGroup(@Valid @NotEmpty(message = "导入数据不能为空") List requestVOS); String exportGroup(Set groupIds); } diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java index 83093bf7..c78981c9 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/SceneConfigService.java @@ -4,6 +4,8 @@ import com.aizuda.snailjob.server.web.model.base.PageResult; import com.aizuda.snailjob.server.web.model.request.SceneConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.SceneConfigRequestVO; import com.aizuda.snailjob.server.web.model.response.SceneConfigResponseVO; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import java.util.List; import java.util.Set; @@ -26,7 +28,7 @@ public interface SceneConfigService { boolean updateStatus(Long id, final Integer status); - void importSceneConfig(List requests); + void importSceneConfig(@Valid @NotEmpty(message = "导入数据不能为空") List requests); String exportSceneConfig(Set sceneIds); diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java index 97455619..194205dd 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java @@ -31,14 +31,10 @@ import com.aizuda.snailjob.template.datasource.persistence.mapper.SequenceAllocM import com.aizuda.snailjob.template.datasource.persistence.mapper.ServerNodeMapper; import com.aizuda.snailjob.template.datasource.persistence.po.*; import com.aizuda.snailjob.template.datasource.utils.DbUtils; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.google.common.collect.Sets.SetView; -import lombok.Data; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -47,6 +43,7 @@ import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import javax.sql.DataSource; import java.sql.Connection; @@ -55,8 +52,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDateTime; import java.util.*; -import java.util.function.Consumer; -import java.util.function.LongFunction; import java.util.stream.Collectors; /** @@ -68,6 +63,7 @@ import java.util.stream.Collectors; */ @Service @RequiredArgsConstructor +@Validated public class GroupConfigServiceImpl implements GroupConfigService { private final ServerNodeMapper serverNodeMapper; diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java index 9a5645d2..ed5ed842 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/SceneConfigServiceImpl.java @@ -30,9 +30,9 @@ import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; import lombok.RequiredArgsConstructor; -import org.checkerframework.checker.units.qual.C; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.util.List; @@ -45,6 +45,7 @@ import java.util.Set; */ @Service @RequiredArgsConstructor +@Validated public class SceneConfigServiceImpl implements SceneConfigService { private final AccessTemplate accessTemplate;