From 0264d5c88a47c46b03ee4cd77998ce536b9384c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sun, 27 Apr 2025 20:52:44 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E7=AE=80=E5=8D=95=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../iflytop/gd/app/controller/AuthController.java | 3 +- .../iflytop/gd/app/controller/CmdController.java | 3 +- .../gd/app/controller/ContainerController.java | 3 +- .../gd/app/controller/CraftsController.java | 22 ++++++++----- .../iflytop/gd/app/controller/OresController.java | 5 +-- .../gd/app/controller/SolutionsController.java | 5 +-- .../iflytop/gd/app/controller/UserController.java | 6 ++-- .../iflytop/gd/app/model/dto/PauseCraftsDto.java | 2 ++ .../iflytop/gd/app/model/dto/ResumeCraftsDto.java | 2 ++ .../iflytop/gd/app/model/dto/StartCraftsDTO.java | 3 ++ .../iflytop/gd/app/model/dto/StopCraftsDto.java | 2 ++ .../com/iflytop/gd/app/model/entity/Container.java | 1 + .../com/iflytop/gd/app/model/entity/Crafts.java | 1 + .../gd/common/handler/GlobalExceptionHandler.java | 36 ++++++++++++++++++++++ .../gd/infrastructure/repository/entity/User.java | 2 ++ 16 files changed, 81 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index dd1087e..d3312d2 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-websocket:3.4.2' implementation 'org.springframework.statemachine:spring-statemachine-core:4.0.0' implementation 'org.xerial:sqlite-jdbc:3.48.0.0' + implementation 'org.springframework.boot:spring-boot-starter-validation:3.4.5' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/iflytop/gd/app/controller/AuthController.java b/src/main/java/com/iflytop/gd/app/controller/AuthController.java index ae421d1..acb1acc 100644 --- a/src/main/java/com/iflytop/gd/app/controller/AuthController.java +++ b/src/main/java/com/iflytop/gd/app/controller/AuthController.java @@ -9,6 +9,7 @@ import com.iflytop.gd.infrastructure.repository.entity.User; import com.iflytop.gd.infrastructure.repository.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -29,7 +30,7 @@ public class AuthController { @Operation(summary = "账号密码登录") @PostMapping("/login") - public Result login(@RequestBody LoginDTO loginDTO) { + public Result login(@Valid @RequestBody LoginDTO loginDTO) { User user = userService.getOne(new LambdaQueryWrapper<>(User.class).eq(User::getUsername, loginDTO.getUsername())); if (user != null && !Objects.equals(user.getDeleted(), Deleted.ENABLE) && user.getPassword().equals(loginDTO.getPassword())) { userService.setCurrentUser(user); diff --git a/src/main/java/com/iflytop/gd/app/controller/CmdController.java b/src/main/java/com/iflytop/gd/app/controller/CmdController.java index 3a2aa06..ae70a12 100644 --- a/src/main/java/com/iflytop/gd/app/controller/CmdController.java +++ b/src/main/java/com/iflytop/gd/app/controller/CmdController.java @@ -7,6 +7,7 @@ import com.iflytop.gd.app.service.exceptions.UnSupportCommandException; import com.iflytop.gd.common.result.Result; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; @@ -24,7 +25,7 @@ public class CmdController { @Operation(summary = "前端统一调用一个接口") @PostMapping - public Result controlMethod(@RequestBody CmdDTO cmdDTO) { + public Result controlMethod(@Valid @RequestBody CmdDTO cmdDTO) { String commandName = cmdDTO.getCommand(); try { CommandHandler commandHandler = registry.getCommandHandler(commandName); diff --git a/src/main/java/com/iflytop/gd/app/controller/ContainerController.java b/src/main/java/com/iflytop/gd/app/controller/ContainerController.java index c2799e8..c045f32 100644 --- a/src/main/java/com/iflytop/gd/app/controller/ContainerController.java +++ b/src/main/java/com/iflytop/gd/app/controller/ContainerController.java @@ -5,6 +5,7 @@ import com.iflytop.gd.app.service.ContainerService; import com.iflytop.gd.common.result.Result; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -27,7 +28,7 @@ public class ContainerController { @Operation(summary = "更新容器配置") @PutMapping("") - public Result updateContainer(@RequestBody Container container) { + public Result updateContainer(@Valid @RequestBody Container container) { return Result.success(containerService.updateById(container)); } } diff --git a/src/main/java/com/iflytop/gd/app/controller/CraftsController.java b/src/main/java/com/iflytop/gd/app/controller/CraftsController.java index 7b78159..be408b6 100644 --- a/src/main/java/com/iflytop/gd/app/controller/CraftsController.java +++ b/src/main/java/com/iflytop/gd/app/controller/CraftsController.java @@ -11,30 +11,38 @@ import com.iflytop.gd.common.result.ResultCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.List; + @Tag(name = "工艺管理") @RestController @RequestMapping("/api/crafts") @RequiredArgsConstructor @Slf4j +@Validated public class CraftsController { private final CraftsService craftsService; @Operation(summary = "根据矿石id获取工艺列表") @GetMapping("/list/{oresId}") - public Result> getAllCrafts(@Parameter(description = "矿石ID") @PathVariable Long oresId) { + public Result> getAllCrafts(@NotNull(message = "矿石ID 不能为空") + @Min(value = 1, message = "矿石ID 必须大于等于 1") + @Parameter(description = "矿石ID") @PathVariable Long oresId) { List craftList = craftsService.selectAllByOresId(oresId); return Result.success(craftList); } @Operation(summary = "添加新工艺") @PostMapping("") - public Result addCrafts(@RequestBody Crafts crafts) { + public Result addCrafts(@Valid @RequestBody Crafts crafts) { Crafts existingCrafts = craftsService.findByName(crafts.getName()); if (existingCrafts == null) { boolean isSuccess = craftsService.addCrafts(crafts); @@ -49,7 +57,7 @@ public class CraftsController { @Operation(summary = "更新工艺") @PutMapping("") - public Result updateCrafts(@RequestBody Crafts crafts) { + public Result updateCrafts(@Valid @RequestBody Crafts crafts) { boolean isSuccess = craftsService.updateCrafts(crafts); if (isSuccess) { return Result.success(); @@ -69,7 +77,7 @@ public class CraftsController { @Operation(summary = "开始执行工艺") @PostMapping("/start") - public Result startCrafts(@RequestBody StartCraftsDTO startCraftsDTO) { + public Result startCrafts(@Valid @RequestBody StartCraftsDTO startCraftsDTO) { boolean isSuccess = craftsService.startCrafts(startCraftsDTO.getCraftId(), startCraftsDTO.getHeatId()); if (isSuccess) { return Result.success(); @@ -79,21 +87,21 @@ public class CraftsController { @Operation(summary = "暂停执行工艺") @PostMapping("/pause") - public Result pauseCrafts(@RequestBody PauseCraftsDto pauseCraftsDto) { + public Result pauseCrafts(@Valid @RequestBody PauseCraftsDto pauseCraftsDto) { craftsService.pauseCrafts(pauseCraftsDto.getHeatId()); return Result.success(); } @Operation(summary = "恢复执行工艺") @PostMapping("/resume") - public Result resumeCrafts(@RequestBody ResumeCraftsDto resumeCraftsDto) { + public Result resumeCrafts(@Valid @RequestBody ResumeCraftsDto resumeCraftsDto) { craftsService.resumeCrafts(resumeCraftsDto.getHeatId()); return Result.success(); } @Operation(summary = "停止执行工艺") @PostMapping("/stop") - public Result stopCrafts(@RequestBody StopCraftsDto stopCraftsDto) { + public Result stopCrafts(@Valid @RequestBody StopCraftsDto stopCraftsDto) { boolean isSuccess = craftsService.stopCrafts(stopCraftsDto.getHeatId()); if (isSuccess) { return Result.success(); diff --git a/src/main/java/com/iflytop/gd/app/controller/OresController.java b/src/main/java/com/iflytop/gd/app/controller/OresController.java index b60d6e5..52b1b4e 100644 --- a/src/main/java/com/iflytop/gd/app/controller/OresController.java +++ b/src/main/java/com/iflytop/gd/app/controller/OresController.java @@ -11,6 +11,7 @@ import com.iflytop.gd.common.result.ResultCode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -32,7 +33,7 @@ public class OresController { @Operation(summary = "添加新矿石") @PostMapping("") - public Result addOres(@RequestBody Ores ores) { + public Result addOres(@Valid @RequestBody Ores ores) { Ores existingOres = oresService.findByName(ores.getName()); if (existingOres == null) { boolean isSuccess = oresService.addOres(ores); @@ -47,7 +48,7 @@ public class OresController { @Operation(summary = "更新矿石") @PutMapping("") - public Result updateOres(@RequestBody Ores ores) { + public Result updateOres(@Valid @RequestBody Ores ores) { Ores existingOres = oresService.findByName(ores.getName()); if (existingOres == null) { boolean isSuccess = oresService.updateOres(ores); diff --git a/src/main/java/com/iflytop/gd/app/controller/SolutionsController.java b/src/main/java/com/iflytop/gd/app/controller/SolutionsController.java index 9221464..5e30a40 100644 --- a/src/main/java/com/iflytop/gd/app/controller/SolutionsController.java +++ b/src/main/java/com/iflytop/gd/app/controller/SolutionsController.java @@ -11,6 +11,7 @@ import com.iflytop.gd.infrastructure.repository.base.BasePageQuery; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -32,7 +33,7 @@ public class SolutionsController { @Operation(summary = "添加新溶液") @PostMapping("") - public Result addSolutions(@RequestBody Solutions solutions) { + public Result addSolutions(@Valid @RequestBody Solutions solutions) { Solutions existingSolutions = solutionsService.findByName(solutions.getName()); if (existingSolutions == null) { boolean isSuccess = solutionsService.addSolutions(solutions); @@ -47,7 +48,7 @@ public class SolutionsController { @Operation(summary = "更新溶液") @PutMapping("") - public Result updateSolutions(@RequestBody Solutions solutions) { + public Result updateSolutions(@Valid @RequestBody Solutions solutions) { Solutions existingSolutions = solutionsService.findByName(solutions.getName()); if (existingSolutions == null) { boolean isSuccess = solutionsService.updateSolutions(solutions); diff --git a/src/main/java/com/iflytop/gd/app/controller/UserController.java b/src/main/java/com/iflytop/gd/app/controller/UserController.java index f5d3eaa..f2cdf60 100644 --- a/src/main/java/com/iflytop/gd/app/controller/UserController.java +++ b/src/main/java/com/iflytop/gd/app/controller/UserController.java @@ -12,6 +12,7 @@ import com.iflytop.gd.infrastructure.repository.service.UserService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -34,9 +35,10 @@ public class UserController { @Operation(summary = "添加新用户") @PostMapping("") - public Result addUser(@RequestBody User user) { + public Result addUser(@Valid @RequestBody User user) { User existingUser = userService.getOne(new LambdaQueryWrapper().eq(User::getUsername, user.getUsername())); if (existingUser == null) { + user.setFixedUser(null); boolean isSuccess = userService.save(user); if (isSuccess) { return Result.success(); @@ -49,7 +51,7 @@ public class UserController { @Operation(summary = "更新用户信息") @PutMapping("") - public Result updateUser(@RequestBody User user) { + public Result updateUser(@Valid @RequestBody User user) { boolean isSuccess = userService.updateById(user); if (isSuccess) { return Result.success(); diff --git a/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java b/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java index a15faf0..ebffcaa 100644 --- a/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java +++ b/src/main/java/com/iflytop/gd/app/model/dto/PauseCraftsDto.java @@ -1,11 +1,13 @@ package com.iflytop.gd.app.model.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; @Schema(description = "暂停执行工艺") @Data public class PauseCraftsDto { + @NotBlank @Schema(description = "加热区id") private String heatId; } diff --git a/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java b/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java index 7857276..657225f 100644 --- a/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java +++ b/src/main/java/com/iflytop/gd/app/model/dto/ResumeCraftsDto.java @@ -1,11 +1,13 @@ package com.iflytop.gd.app.model.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; @Schema(description = "恢复执行工艺") @Data public class ResumeCraftsDto { + @NotBlank @Schema(description = "加热区id") private String heatId; } diff --git a/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java b/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java index b5c2f92..59cc86f 100644 --- a/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java +++ b/src/main/java/com/iflytop/gd/app/model/dto/StartCraftsDTO.java @@ -1,13 +1,16 @@ package com.iflytop.gd.app.model.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; @Schema(description = "开始工艺") @Data public class StartCraftsDTO { + @NotBlank @Schema(description = "工艺id") private Long craftId; + @NotBlank @Schema(description = "加热区id") private String heatId; } diff --git a/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java b/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java index 8f5ab6e..536fd4d 100644 --- a/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java +++ b/src/main/java/com/iflytop/gd/app/model/dto/StopCraftsDto.java @@ -1,11 +1,13 @@ package com.iflytop.gd.app.model.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import lombok.Data; @Schema(description = "恢复执行工艺") @Data public class StopCraftsDto { + @NotBlank @Schema(description = "加热区id") private String heatId; } diff --git a/src/main/java/com/iflytop/gd/app/model/entity/Container.java b/src/main/java/com/iflytop/gd/app/model/entity/Container.java index 6524cf9..fb39b9f 100644 --- a/src/main/java/com/iflytop/gd/app/model/entity/Container.java +++ b/src/main/java/com/iflytop/gd/app/model/entity/Container.java @@ -19,6 +19,7 @@ public class Container extends BaseEntity { @Schema(description = "溶液id") private Long solutionId; + @NotBlank @Schema(description = "泵id") private String pumpId; diff --git a/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java b/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java index 0bc7419..d00c4df 100644 --- a/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java +++ b/src/main/java/com/iflytop/gd/app/model/entity/Crafts.java @@ -20,6 +20,7 @@ public class Crafts extends BaseEntity { @Schema(description = "工艺步骤") private String steps; + @NotBlank @Schema(description = "矿石ID") private Long oresId; } diff --git a/src/main/java/com/iflytop/gd/common/handler/GlobalExceptionHandler.java b/src/main/java/com/iflytop/gd/common/handler/GlobalExceptionHandler.java index 8148129..d8e9851 100644 --- a/src/main/java/com/iflytop/gd/common/handler/GlobalExceptionHandler.java +++ b/src/main/java/com/iflytop/gd/common/handler/GlobalExceptionHandler.java @@ -3,14 +3,50 @@ package com.iflytop.gd.common.handler; import com.iflytop.gd.common.exception.AppException; import com.iflytop.gd.common.result.Result; import com.iflytop.gd.common.result.ResultCode; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import java.util.stream.Collectors; + @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { + // 1) JSON Body 校验失败 + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result handleBodyValid(MethodArgumentNotValidException ex) { + String msg = ex.getBindingResult().getFieldErrors().stream() + .map(f -> f.getField() + ": " + f.getDefaultMessage()) + .collect(Collectors.joining("; ")); + return Result.failed(ResultCode.INVALID_PARAMETER.getCode(), msg); + } + + // 2) 方法级参数校验失败(PathVariable/RequestParam) + @ExceptionHandler(ConstraintViolationException.class) + public Result handleParamValid(ConstraintViolationException ex) { + String msg = ex.getConstraintViolations().stream() + .map(v -> { + String path = v.getPropertyPath().toString(); + String field = path.substring(path.lastIndexOf('.') + 1); + return field + ": " + v.getMessage(); + }) + .collect(Collectors.joining("; ")); + return Result.failed(ResultCode.INVALID_PARAMETER.getCode(), msg); + } + + // 3) 表单绑定失败 + @ExceptionHandler(BindException.class) + public Result handleBind(BindException ex) { + String msg = ex.getFieldErrors().stream() + .map(f -> f.getField() + ": " + f.getDefaultMessage()) + .collect(Collectors.joining("; ")); + return Result.failed(ResultCode.INVALID_PARAMETER.getCode(), msg); + } + @ExceptionHandler(Exception.class) public Result handleException(Exception ex) { if (ex instanceof AppException ae) { diff --git a/src/main/java/com/iflytop/gd/infrastructure/repository/entity/User.java b/src/main/java/com/iflytop/gd/infrastructure/repository/entity/User.java index 726ea14..f36c2ce 100644 --- a/src/main/java/com/iflytop/gd/infrastructure/repository/entity/User.java +++ b/src/main/java/com/iflytop/gd/infrastructure/repository/entity/User.java @@ -31,9 +31,11 @@ public class User extends BaseEntity { @Schema(description = "密码") private String password; + @NotBlank() @Schema(description = "人员角色") private UsrRole role; + @NotBlank() @Schema(description = "是否删除(0-否 1-是)") private Deleted deleted;