From a271ed5a232236383bc96c8c1e380a5c91dc1c3c Mon Sep 17 00:00:00 2001 From: guyue <1721849008@qq.com> Date: 星期二, 12 八月 2025 01:07:19 +0800 Subject: [PATCH] 代码规范 --- src/main/java/com/linghu/model/entity/Platform.java | 10 + src/main/java/com/linghu/controller/UserController.java | 5 src/main/java/com/linghu/service/impl/KeywordServiceImpl.java | 7 pom.xml | 16 -- src/main/java/com/linghu/model/validator/CreateGroup.java | 3 src/main/java/com/linghu/config/FinalStatus.java | 17 ++ src/main/java/com/linghu/config/GlobalExceptionHandler.java | 45 ++++++ src/main/java/com/linghu/model/validator/QueryGroup.java | 3 src/main/java/com/linghu/model/validator/UpdateGroup.java | 3 src/main/java/com/linghu/model/entity/Question.java | 7 src/main/java/com/linghu/model/entity/Sectionalization.java | 5 src/main/java/com/linghu/model/dto/KeywordDto.java | 6 src/main/java/com/linghu/controller/KeywordController.java | 13 + src/main/java/com/linghu/service/impl/TypeServiceImpl.java | 3 src/main/java/com/linghu/timeTask/ScheduledTasks.java | 38 ++-- src/main/java/com/linghu/controller/QuestionController.java | 16 + src/main/java/com/linghu/controller/PlatformController.java | 9 /dev/null | 82 ----------- src/main/java/com/linghu/controller/CollectController.java | 4 src/main/java/com/linghu/model/entity/Type.java | 7 + src/main/java/com/linghu/service/impl/QuestionServiceImpl.java | 14 + src/main/java/com/linghu/model/entity/Keyword.java | 5 src/main/java/com/linghu/controller/AuthController.java | 2 src/main/java/com/linghu/controller/SectionalizationController.java | 7 src/main/java/com/linghu/service/impl/CollectionServiceImpl.java | 22 +- src/main/java/com/linghu/service/impl/OrderServiceImpl.java | 9 src/main/java/com/linghu/controller/TypeController.java | 12 + 27 files changed, 201 insertions(+), 169 deletions(-) diff --git a/pom.xml b/pom.xml index 0a4262f..0047fc5 100644 --- a/pom.xml +++ b/pom.xml @@ -55,23 +55,7 @@ <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency> - <dependency> - <groupId>io.jsonwebtoken</groupId> - <artifactId>jjwt-api</artifactId> - <version>0.12.5</version> - </dependency> - <dependency> - <groupId>io.jsonwebtoken</groupId> - <artifactId>jjwt-impl</artifactId> - <version>0.12.5</version> - - </dependency> - <dependency> - <groupId>io.jsonwebtoken</groupId> - <artifactId>jjwt-jackson</artifactId> <!-- 或 jjwt-gson --> - <version>0.12.5</version> - </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> diff --git a/src/main/java/com/linghu/config/FinalStatus.java b/src/main/java/com/linghu/config/FinalStatus.java index 6c0e18e..11f0255 100644 --- a/src/main/java/com/linghu/config/FinalStatus.java +++ b/src/main/java/com/linghu/config/FinalStatus.java @@ -4,19 +4,34 @@ @Getter public enum FinalStatus { + //成功 SUCCESS("success"), + //没有结果 NO_RESULTS("no_results"), + //繁忙 BUSYNESS("busyness"), + //已取消 CANCELLED("cancelled"), + //已完成 COMPLETED("completed"), - CANCELED("canceled"), + //报错 ERROR("ERROR"), + //已提交 SUBMITTED("submitted"), + //待处理 PENDING("pending"), + //网络错误 FALSE("false"), + //不存在 NONENTITY("nonentity"), + //未提交 + NOTSUBMITTED("notSubmitted"), + //执行中 + RUNNING("running"), + //失败 FAILED("failed"); + private final String value; FinalStatus(String value) { diff --git a/src/main/java/com/linghu/config/GlobalExceptionHandler.java b/src/main/java/com/linghu/config/GlobalExceptionHandler.java new file mode 100644 index 0000000..5b90d42 --- /dev/null +++ b/src/main/java/com/linghu/config/GlobalExceptionHandler.java @@ -0,0 +1,45 @@ +package com.linghu.config; + +import com.linghu.model.common.ResponseResult; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +// 全局异常处理器,作用于所有 @RestController 注解的控制器 +@RestControllerAdvice +public class GlobalExceptionHandler { + + // 处理 @RequestBody 参数校验失败的异常(如 DTO 中的校验) + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseResult handleMethodArgumentNotValid(MethodArgumentNotValidException e) { + Map<String, String> errors = new HashMap<>(); + // 获取所有校验失败的字段和消息 + BindingResult bindingResult = e.getBindingResult(); + for (FieldError fieldError : e.getBindingResult().getFieldErrors()) { + // 字段名 -> 错误消息(如 "keyword: 关键词不能为空") + errors.put(fieldError.getField(), fieldError.getDefaultMessage()); + } + // 返回自定义的错误响应(根据你的 ResponseResult 结构调整) + return ResponseResult.error("参数校验失败"+ errors); + } + + // 处理 @RequestParam/@PathVariable 参数校验失败的异常 + @ExceptionHandler(ConstraintViolationException.class) + public ResponseResult<Map<String, String>> handleConstraintViolation(ConstraintViolationException e) { + Map<String, String> errors = new HashMap<>(); + for (ConstraintViolation<?> violation : e.getConstraintViolations()) { + String field = violation.getPropertyPath().toString(); + String simplifiedField = field.substring(field.lastIndexOf('.') + 1); + errors.put(simplifiedField, violation.getMessage()); + } + return ResponseResult.error("参数校验失败"+ errors); + } +} diff --git a/src/main/java/com/linghu/controller/AuthController.java b/src/main/java/com/linghu/controller/AuthController.java index de9ebdb..430a340 100644 --- a/src/main/java/com/linghu/controller/AuthController.java +++ b/src/main/java/com/linghu/controller/AuthController.java @@ -32,7 +32,7 @@ } @GetMapping("/getToken") @ApiOperation(value = "获取token") - public ResponseEntity<?> getToken( String user) { + public ResponseEntity<?> getToken(@RequestParam(value = "user" ) String user) { // 创建JwtUtils对象,并生成JWT令牌 OpenCryptUtil openCryptUtil = new OpenCryptUtil(); String decrypt = openCryptUtil.encrypt(user); diff --git a/src/main/java/com/linghu/controller/CollectController.java b/src/main/java/com/linghu/controller/CollectController.java index a90b4bf..5ccdb76 100644 --- a/src/main/java/com/linghu/controller/CollectController.java +++ b/src/main/java/com/linghu/controller/CollectController.java @@ -42,13 +42,13 @@ @ApiOperation(value = "查询任务状态") @GetMapping("/status") - public Mono<TaskStatusResponse> getTaskStatus(String taskId) { + public Mono<TaskStatusResponse> getTaskStatus(@RequestParam(value = "taskId" )String taskId) { return collectionService.getError(taskId); } @PostMapping("/cancel/{keywordId}") @ApiOperation(value = "取消任务") - public Mono<ResponseResult<TaskCancelResponse>> cancelTask(@PathVariable Integer keywordId) { + public Mono<ResponseResult<TaskCancelResponse>> cancelTask(@PathVariable Integer keywordId) { return collectionService.getResponseResult(keywordId); } diff --git a/src/main/java/com/linghu/controller/KeywordController.java b/src/main/java/com/linghu/controller/KeywordController.java index b6ccb02..a74cce4 100644 --- a/src/main/java/com/linghu/controller/KeywordController.java +++ b/src/main/java/com/linghu/controller/KeywordController.java @@ -1,6 +1,7 @@ package com.linghu.controller; import com.alibaba.excel.EasyExcel; +import com.linghu.config.FinalStatus; import com.linghu.listener.KeywordExcelListener; import com.linghu.model.common.ResponseResult; import com.linghu.model.dto.ExportFeedDTO; @@ -10,6 +11,7 @@ import com.linghu.model.dto.ExportStaticsDTO; import com.linghu.model.entity.*; import com.linghu.model.excel.*; +import com.linghu.model.validator.UpdateGroup; import com.linghu.model.vo.*; import com.linghu.model.vo.KeywordStaticsListVO; import com.linghu.model.vo.PlatformProportionVO; @@ -24,6 +26,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -66,7 +69,7 @@ @PostMapping(value = "/exportStatics") @ApiOperation(value = "EChart图导出") - public ResponseEntity<byte[]> exportStatics(@RequestBody ExportStaticsDTO exportStaticsDTO) { + public ResponseEntity<byte[]> exportStatics(@Valid @RequestBody ExportStaticsDTO exportStaticsDTO) { return keywordService.exportEChart(exportStaticsDTO); } @@ -92,7 +95,7 @@ */ @PostMapping(value = "/exportGetResultByTypeId") @ApiOperation(value = "导出:根据类别查看") - public ResponseEntity<byte[]> exportGetResultByTypeId(@RequestBody ExportGetResultDTO dto) { + public ResponseEntity<byte[]> exportGetResultByTypeId(@Valid @RequestBody ExportGetResultDTO dto) { return keywordService.exportResult(dto); } @@ -190,8 +193,8 @@ */ @PostMapping("/updateKeyword") @ApiOperation(value = "修改关键词") - public ResponseResult<String> updateKeyword(@RequestBody Keyword keyword) { - if("submitted".equals(keyword.getStatus())){ + public ResponseResult<String> updateKeyword(@Validated(UpdateGroup.class) @RequestBody Keyword keyword) { + if(FinalStatus.SUBMITTED.getValue().equals(keyword.getStatus())){ return ResponseResult.error("关键词已开始采集不允许修改!"); } keywordService.updateById(keyword); @@ -205,7 +208,7 @@ @ApiOperation(value = "删除关键词") public ResponseResult<String> deleteKeyword(@RequestParam("keywordId") Integer keywordId) { Keyword keyword = keywordService.getById(keywordId); - if("submitted".equals(keyword.getStatus())){ + if(FinalStatus.SUBMITTED.getValue().equals(keyword.getStatus())){ return ResponseResult.error("关键词已开始采集或不允许删除!"); } keywordService.removeById(keywordId); diff --git a/src/main/java/com/linghu/controller/PlatformController.java b/src/main/java/com/linghu/controller/PlatformController.java index 64b6559..4fa4779 100644 --- a/src/main/java/com/linghu/controller/PlatformController.java +++ b/src/main/java/com/linghu/controller/PlatformController.java @@ -18,6 +18,8 @@ import com.linghu.model.excel.PlatformExcel; import com.linghu.model.excel.UserExcel; import com.linghu.model.page.CustomPage; +import com.linghu.model.validator.CreateGroup; +import com.linghu.model.validator.UpdateGroup; import com.linghu.service.PlatformService; import com.linghu.service.TypeService; @@ -35,6 +37,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.util.StringUtils; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -60,14 +63,14 @@ @PostMapping @ApiOperation(value = "添加平台") - public ResponseResult<Platform> add(@RequestBody Platform platform) { + public ResponseResult<Platform> add( @Validated(CreateGroup.class) @RequestBody Platform platform) { return platformService.addPlatform(platform); } @DeleteMapping("/{platformId}") @ApiOperation(value = "删除平台") - public ResponseResult<Void> delete(@PathVariable Integer platformId) { + public ResponseResult<Void> delete( @PathVariable Integer platformId) { return platformService.deleteByPlatFormId(platformId); } @@ -75,7 +78,7 @@ @PutMapping @ApiOperation(value = "更新平台") - public ResponseResult<Void> update(@RequestBody Platform platform) { + public ResponseResult<Void> update(@Validated(UpdateGroup.class) @RequestBody Platform platform) { return platformService.updatePlatform(platform); } diff --git a/src/main/java/com/linghu/controller/QuestionController.java b/src/main/java/com/linghu/controller/QuestionController.java index 351e74f..dcd03bd 100644 --- a/src/main/java/com/linghu/controller/QuestionController.java +++ b/src/main/java/com/linghu/controller/QuestionController.java @@ -14,6 +14,8 @@ import com.linghu.model.entity.Reference; import com.linghu.model.excel.KeywordExcel; import com.linghu.model.excel.QuestionExcel; +import com.linghu.model.validator.CreateGroup; +import com.linghu.model.validator.UpdateGroup; import com.linghu.service.KeywordService; import com.linghu.service.QuestionService; import io.swagger.annotations.Api; @@ -23,10 +25,12 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.*; @@ -44,7 +48,7 @@ @PostMapping @ApiOperation(value = "添加提问词") - public ResponseResult<List<Question>> add(@Valid @RequestBody KeywordDto keywordDto) { + public ResponseResult<List<Question>> add(@Validated(CreateGroup.class) @RequestBody KeywordDto keywordDto) { return questionService.addQuestion(keywordDto); } @@ -52,27 +56,27 @@ @PutMapping @ApiOperation(value = "修改提问词") - public ResponseResult<List<Question>> update(@RequestBody KeywordDto keywordDto) { + public ResponseResult<List<Question>> update(@Validated(UpdateGroup.class) @RequestBody KeywordDto keywordDto) { return questionService.updateQuestion(keywordDto); } @PutMapping("/update") @ApiOperation(value = "修改单个提问词") - public ResponseResult<Void> update(@RequestBody Question questions) { + public ResponseResult<Void> update(@Validated(UpdateGroup.class) @RequestBody Question questions) { return questionService.updateKeyWord(questions); } @DeleteMapping("/batch") @ApiOperation(value = "批量删除提问词") - public ResponseResult<Void> batchDelete(@RequestBody List<Integer> questionIds) { + public ResponseResult<Void> batchDelete( @RequestBody List<Integer> questionIds) { return questionService.batchDeleteQuestion(questionIds); } @GetMapping("/list") @ApiOperation("根据关键词查询提问词列表") - public ResponseResult<List<Question>> list(Integer keyword_id) { + public ResponseResult<List<Question>> list(@RequestParam("keyword_id") Integer keyword_id) { return questionService.getQuestionListByKeywordId(keyword_id); } @@ -81,7 +85,7 @@ @GetMapping("/notNullList") @ApiOperation("根据关键词查询提问词列表") - public ResponseResult<List<Question>> notNullList(Integer keyword_id) { + public ResponseResult<List<Question>> notNullList(@RequestParam("keyword_id") Integer keyword_id) { return questionService.notNullQuestionList(keyword_id); } diff --git a/src/main/java/com/linghu/controller/SectionalizationController.java b/src/main/java/com/linghu/controller/SectionalizationController.java index 2f56525..307e599 100644 --- a/src/main/java/com/linghu/controller/SectionalizationController.java +++ b/src/main/java/com/linghu/controller/SectionalizationController.java @@ -3,14 +3,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.linghu.model.common.ResponseResult; import com.linghu.model.entity.Sectionalization; +import com.linghu.model.validator.UpdateGroup; import com.linghu.model.vo.SectionalizationUserVO; import com.linghu.service.SectionalizationService; import com.linghu.service.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; @RestController @@ -27,7 +30,7 @@ @PostMapping @ApiOperation(value = "添加") - public ResponseResult add(@RequestBody Sectionalization sectionalization) { + public ResponseResult add(@Valid @RequestBody Sectionalization sectionalization) { return sectionalizationService.addSectionalization(sectionalization); } @@ -36,7 +39,7 @@ */ @PutMapping @ApiOperation(value = "修改") - public ResponseResult edit(@RequestBody Sectionalization sectionalization) { + public ResponseResult edit(@Validated(UpdateGroup.class) @RequestBody Sectionalization sectionalization) { return sectionalizationService.edit(sectionalization); } diff --git a/src/main/java/com/linghu/controller/TypeController.java b/src/main/java/com/linghu/controller/TypeController.java index 862517d..77e620d 100644 --- a/src/main/java/com/linghu/controller/TypeController.java +++ b/src/main/java/com/linghu/controller/TypeController.java @@ -8,13 +8,17 @@ import com.linghu.model.entity.Keyword; import com.linghu.model.entity.Reference; import com.linghu.model.entity.Type; +import com.linghu.model.validator.CreateGroup; +import com.linghu.model.validator.UpdateGroup; import com.linghu.service.KeywordService; import com.linghu.service.TypeService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -31,7 +35,7 @@ @PostMapping @ApiOperation(value = "添加类型") - public ResponseResult<Type> add(@RequestBody Type type) { + public ResponseResult<Type> add(@Validated( CreateGroup.class) @RequestBody Type type) { return typeService.addType(type); } @@ -39,7 +43,7 @@ @PostMapping("/batch") @ApiOperation(value = "批量添加类型") - public ResponseResult<Void> batchAdd(@RequestBody List<Type> types) { + public ResponseResult<Void> batchAdd(@Validated(CreateGroup.class) @Valid @RequestBody List<Type> types) { boolean success = typeService.saveBatch(types); if (success) { return ResponseResult.success(); @@ -56,14 +60,14 @@ @PutMapping @ApiOperation(value = "更新类型") - public ResponseResult<Void> update(@RequestBody Type type) { + public ResponseResult<Void> update(@Validated(UpdateGroup.class) @RequestBody Type type) { typeService.updateById(type); return ResponseResult.success(); } @PutMapping("/batch") @ApiOperation(value = "批量更新类型") - public ResponseResult<Void> batchUpdate(@RequestBody List<Type> types) { + public ResponseResult<Void> batchUpdate(@Validated(UpdateGroup.class) @RequestBody List<Type> types) { boolean success = typeService.updateBatchById(types); if (success) { return ResponseResult.success(); diff --git a/src/main/java/com/linghu/controller/UserController.java b/src/main/java/com/linghu/controller/UserController.java index 3f264b1..4a47a54 100644 --- a/src/main/java/com/linghu/controller/UserController.java +++ b/src/main/java/com/linghu/controller/UserController.java @@ -35,6 +35,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.validation.Valid; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.time.LocalDateTime; @@ -55,7 +56,7 @@ @PostMapping @ApiOperation(value = "添加") - public ResponseResult add(@RequestBody User user) { + public ResponseResult add(@Valid @RequestBody User user) { return userService.addUser(user); } @@ -65,7 +66,7 @@ */ @PutMapping @ApiOperation(value = "修改") - public ResponseResult edit(@RequestBody User user) { + public ResponseResult edit(@Valid @RequestBody User user) { return userService.editUser(user); } diff --git a/src/main/java/com/linghu/model/dto/KeywordDto.java b/src/main/java/com/linghu/model/dto/KeywordDto.java index 79da0f5..fc34ef5 100644 --- a/src/main/java/com/linghu/model/dto/KeywordDto.java +++ b/src/main/java/com/linghu/model/dto/KeywordDto.java @@ -1,5 +1,6 @@ package com.linghu.model.dto; +import com.linghu.model.validator.CreateGroup; import lombok.Data; import lombok.EqualsAndHashCode; @@ -7,7 +8,9 @@ import com.linghu.model.entity.Keyword; import com.linghu.model.entity.Question; +import org.springframework.validation.annotation.Validated; +import javax.validation.Valid; import javax.validation.constraints.NotEmpty; @EqualsAndHashCode(callSuper = true) @@ -16,9 +19,10 @@ /** * 提问词列表,用换行符分隔 */ - @NotEmpty(message = "提问词不能为空") + @NotEmpty(message = "提问词不能为空",groups = CreateGroup.class) private String questions; + @Valid private List<Question> questionList; private List<String> taskIdList; } \ No newline at end of file diff --git a/src/main/java/com/linghu/model/entity/Keyword.java b/src/main/java/com/linghu/model/entity/Keyword.java index eb4dea2..e7ad4e0 100644 --- a/src/main/java/com/linghu/model/entity/Keyword.java +++ b/src/main/java/com/linghu/model/entity/Keyword.java @@ -5,7 +5,11 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; + +import com.linghu.model.validator.UpdateGroup; import lombok.Data; + +import javax.validation.constraints.NotNull; /** * @@ -18,6 +22,7 @@ * 关键词 */ @TableId(type = IdType.AUTO) + @NotNull(message = "id 不能为空", groups = UpdateGroup.class) private Integer keyword_id; /** diff --git a/src/main/java/com/linghu/model/entity/Platform.java b/src/main/java/com/linghu/model/entity/Platform.java index 9eaf05b..ed09399 100644 --- a/src/main/java/com/linghu/model/entity/Platform.java +++ b/src/main/java/com/linghu/model/entity/Platform.java @@ -8,9 +8,13 @@ import java.time.LocalDateTime; import java.util.Date; +import com.linghu.model.validator.CreateGroup; +import com.linghu.model.validator.UpdateGroup; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; + +import javax.validation.constraints.NotNull; /** * @@ -24,24 +28,28 @@ */ @TableId(type = IdType.AUTO) @ApiModelProperty("平台id") + @NotNull(message = "id 不能为空", groups = UpdateGroup.class) private Integer platform_id; /** * 类型id */ @ApiModelProperty("类型id") + @NotNull(message = "类型id 不能为空", groups = CreateGroup.class) private Integer type_id; /** * 平台名称 */ @ApiModelProperty("平台名称") + @NotNull(message = "平台名称不能为空", groups = CreateGroup.class) private String platform_name; /** * 平台域名 */ @ApiModelProperty("平台域名") + @NotNull(message = "平台域名不能为空", groups = CreateGroup.class) private String domain; /** @@ -67,7 +75,7 @@ /** * */ - @ApiModelProperty("创建者") + @ApiModelProperty("修改者") private String update_by; @TableField(exist = false) diff --git a/src/main/java/com/linghu/model/entity/Question.java b/src/main/java/com/linghu/model/entity/Question.java index 837a868..29c77fc 100644 --- a/src/main/java/com/linghu/model/entity/Question.java +++ b/src/main/java/com/linghu/model/entity/Question.java @@ -6,9 +6,13 @@ import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Date; + +import com.linghu.model.validator.CreateGroup; +import com.linghu.model.validator.UpdateGroup; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; + +import javax.validation.constraints.NotNull; /** * @@ -21,6 +25,7 @@ * 提问词id */ @TableId(type = IdType.AUTO) + @NotNull(message = "id不能为空",groups = UpdateGroup.class) private Integer question_id; /** diff --git a/src/main/java/com/linghu/model/entity/Sectionalization.java b/src/main/java/com/linghu/model/entity/Sectionalization.java index e853af8..f14f362 100644 --- a/src/main/java/com/linghu/model/entity/Sectionalization.java +++ b/src/main/java/com/linghu/model/entity/Sectionalization.java @@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.linghu.model.validator.UpdateGroup; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; @Data @TableName(value = "sectionalization") @@ -16,9 +18,10 @@ @TableField(exist = false) private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) + @NotNull(message = "分组id不能为空", groups = UpdateGroup.class) private Integer sectionalization_id; - @NotEmpty(message = "用户名不能为空") + @NotEmpty(message = "分组名不能为空") private String sectionalization_name; diff --git a/src/main/java/com/linghu/model/entity/Type.java b/src/main/java/com/linghu/model/entity/Type.java index 97bb0fe..d4fef6b 100644 --- a/src/main/java/com/linghu/model/entity/Type.java +++ b/src/main/java/com/linghu/model/entity/Type.java @@ -5,7 +5,12 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; + +import com.linghu.model.validator.CreateGroup; +import com.linghu.model.validator.UpdateGroup; import lombok.Data; + +import javax.validation.constraints.NotNull; /** * @@ -18,11 +23,13 @@ * 类型 */ @TableId(type = IdType.AUTO) + @NotNull(message = "类型ID不能为空", groups = {UpdateGroup.class}) private Integer type_id; /** * 名字 */ + @NotNull(message = "类型不能为空", groups = {CreateGroup.class, UpdateGroup.class}) private String type_name; diff --git a/src/main/java/com/linghu/model/validator/CreateGroup.java b/src/main/java/com/linghu/model/validator/CreateGroup.java new file mode 100644 index 0000000..7c44974 --- /dev/null +++ b/src/main/java/com/linghu/model/validator/CreateGroup.java @@ -0,0 +1,3 @@ +package com.linghu.model.validator; + +public interface CreateGroup {} diff --git a/src/main/java/com/linghu/model/validator/QueryGroup.java b/src/main/java/com/linghu/model/validator/QueryGroup.java new file mode 100644 index 0000000..ce2dc95 --- /dev/null +++ b/src/main/java/com/linghu/model/validator/QueryGroup.java @@ -0,0 +1,3 @@ +package com.linghu.model.validator; + +public interface QueryGroup {} \ No newline at end of file diff --git a/src/main/java/com/linghu/model/validator/UpdateGroup.java b/src/main/java/com/linghu/model/validator/UpdateGroup.java new file mode 100644 index 0000000..2e7d54c --- /dev/null +++ b/src/main/java/com/linghu/model/validator/UpdateGroup.java @@ -0,0 +1,3 @@ +package com.linghu.model.validator; + +public interface UpdateGroup {} \ No newline at end of file diff --git a/src/main/java/com/linghu/service/impl/CollectionServiceImpl.java b/src/main/java/com/linghu/service/impl/CollectionServiceImpl.java index 60953c6..325a4c1 100644 --- a/src/main/java/com/linghu/service/impl/CollectionServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/CollectionServiceImpl.java @@ -30,7 +30,6 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; - @Slf4j @Service public class CollectionServiceImpl implements CollectionService { @@ -181,7 +180,7 @@ return Flux.fromIterable(tasksToCancelRemotely) .flatMap(task -> { // 创建状态更新和远程取消的组合操作 - Mono<Void> updateStatus = updateTaskStatus(task.getTask_id(), "cancelled"); + Mono<Void> updateStatus = updateTaskStatus(task.getTask_id(), FinalStatus.CANCELLED.getValue()); Mono<ResponseResult<?>> cancelOp = cancelRemoteTask(task.getTask_id()) .onErrorResume(e -> { log.error("取消任务 {} 失败: {}", task.getTask_id(), e.getMessage()); @@ -347,7 +346,7 @@ // 如果任务状态是"submitted"或"running",继续轮询 if (!FinalStatus.COMPLETED.getValue().equalsIgnoreCase(statusResponse.getStatus()) && !FinalStatus.FAILED.getValue().equalsIgnoreCase(statusResponse.getStatus()) - && !FinalStatus.CANCELED.getValue().equalsIgnoreCase(statusResponse.getStatus()) + && !FinalStatus.CANCELLED.getValue().equalsIgnoreCase(statusResponse.getStatus()) && !(FinalStatus.ERROR.getValue().equalsIgnoreCase(statusResponse.getStatus()) && statusResponse.getMessage().contains("Task not found")) ) { return Mono.delay(Duration.ofSeconds(5)) // 延迟 5 秒后再次查询 @@ -453,12 +452,12 @@ if (keywordTasks.size() > 0) { KeywordTask keywordTask = keywordTasks.get(0); keywordTask.setTask_id(taskResponse.getTask_id()); - keywordTask.setStatus("pending"); + keywordTask.setStatus(FinalStatus.PENDING.getValue()); keywordTaskService.updateById(keywordTask); } //将提问词列表的状态转为pending for (String questionName : batchRequest.getQuestions()) { - questionService.update(new LambdaUpdateWrapper<Question>().eq(Question::getKeyword_id, keyword.getKeyword_id()).eq(Question::getQuestion,questionName).set(Question::getStatus, "pending")); + questionService.update(new LambdaUpdateWrapper<Question>().eq(Question::getKeyword_id, keyword.getKeyword_id()).eq(Question::getQuestion,questionName).set(Question::getStatus, FinalStatus.PENDING.getValue())); } //所有关键词都在采集中或者已完成或者错误设置订单进入采集状态 @@ -497,7 +496,7 @@ new LambdaQueryWrapper<KeywordTask>() .eq(KeywordTask::getKeyword_id, keywordId) .isNotNull(KeywordTask::getTask_id) - .eq(KeywordTask::getStatus, "pending") + .eq(KeywordTask::getStatus, FinalStatus.PENDING.getValue()) ); } @@ -524,7 +523,7 @@ List<KeywordTask> keywordTasks = keywordTaskService.list(keywordTaskWrapper); // 更新关键词状态 - keyword.setStatus("completed"); + keyword.setStatus(FinalStatus.COMPLETED.getValue()); keywordService.updateById(keyword); //更新提问词状态为取消 @@ -588,7 +587,7 @@ private Mono<ResponseResult<?>> cancelRemoteTask(String taskId) { // 使用Collections.singletonMap或手动创建Map Map<String, Object> requestBody = new HashMap<>(); - requestBody.put("status", "pending"); + requestBody.put("status", FinalStatus.PENDING.getValue()); return webClient.post() .uri(baseUrl + "/api/v1/tasks/" + taskId + "/cancel") @@ -762,7 +761,6 @@ .allMatch(task -> FinalStatus.COMPLETED.getValue().equals(task.getStatus()) || FinalStatus.FALSE.getValue().equals(task.getStatus()) || FinalStatus.CANCELLED.getValue().equals(task.getStatus()) - || FinalStatus.CANCELED.getValue().equals(task.getStatus()) || FinalStatus.NONENTITY.getValue().equals(task.getStatus())); if (allCompletedOrFailed) { @@ -908,7 +906,9 @@ List<Reference> validRefGroup = refGroup.stream() .filter(Objects::nonNull) .collect(Collectors.toList()); - if (validRefGroup.isEmpty()) return; + if (validRefGroup.isEmpty()){ + return; + } Optional<Reference> existingRef = validRefGroup.stream() .filter(ref -> ref.getReference_id() != null) @@ -983,7 +983,7 @@ // 批量更新问题状态 List<Question> questionsToUpdate = new ArrayList<>(); questions.forEach(question -> { - List<QuestionResultList> results = questionResultsMap.getOrDefault(question.getQuestion(), io.jsonwebtoken.lang.Collections.emptyList()); + List<QuestionResultList> results = questionResultsMap.getOrDefault(question.getQuestion(), Collections.emptyList()); FinalStatus finalStatus = determineFinalStatus(results); // 使用枚举进行switch判断 diff --git a/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java b/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java index a0cf143..8c65515 100644 --- a/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/KeywordServiceImpl.java @@ -8,6 +8,7 @@ import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linghu.config.FinalStatus; import com.linghu.mapper.ReferenceMapper; import com.linghu.model.common.ResponseResult; import com.linghu.model.dto.ExportFeedDTO; @@ -75,7 +76,7 @@ if (keyword == null) { return ResponseResult.error("关键词不存在"); } - if (!"completed".equals(keyword.getStatus())) { + if (!FinalStatus.COMPLETED.getValue().equals(keyword.getStatus())) { return ResponseResult.success(); } List<KeywordStaticsVO> statics = this.getBaseMapper().statics(keywordId, questionId, keyword.getNum()); @@ -97,7 +98,7 @@ if (keyword == null) { return ResponseResult.error("关键词不存在"); } - if (!"completed".equals(keyword.getStatus())) { + if (!FinalStatus.COMPLETED.getValue().equals(keyword.getStatus())) { return ResponseResult.error("关键词采集未完成"); } List<PlatformProportionVO> result = this.getBaseMapper().getResultByTypeId(keywordId, questionId, @@ -113,7 +114,7 @@ if (keyword == null) { return ResponseResult.error("关键词不存在"); } - if (!"completed".equals(keyword.getStatus())) { + if (!FinalStatus.COMPLETED.getValue().equals(keyword.getStatus())) { return ResponseResult.error("关键词采集未完成"); } diff --git a/src/main/java/com/linghu/service/impl/OrderServiceImpl.java b/src/main/java/com/linghu/service/impl/OrderServiceImpl.java index 946db58..9fb5444 100644 --- a/src/main/java/com/linghu/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/OrderServiceImpl.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linghu.config.FinalStatus; import com.linghu.model.common.ResponseResult; import com.linghu.model.dto.KeywordDto; import com.linghu.model.dto.OrderDto; @@ -63,7 +64,7 @@ Keyword keyword = new Keyword(); keyword.setOrder_id(order_id); keyword.setKeyword_name(keywordName.trim()); - keyword.setStatus("notSubmitted"); + keyword.setStatus(FinalStatus.NOTSUBMITTED.getValue()); // keyword.setNum(1); // 默认采集轮数为1 keywordService.save(keyword); } @@ -87,10 +88,10 @@ return false; } - // 删除旧关键词(当状态为1时允许修改关键词) + // 删除旧关键词(当状态为未提交时允许修改关键词) keywordService.lambdaUpdate() .eq(Keyword::getOrder_id, orderDto.getOrder_id()) - .eq(Keyword::getStatus, "notSubmitted") + .eq(Keyword::getStatus, FinalStatus.NOTSUBMITTED.getValue()) .remove(); // 保存新关键词 @@ -101,7 +102,7 @@ Keyword keyword = new Keyword(); keyword.setOrder_id(orderDto.getOrder_id()); keyword.setKeyword_name(keywordName.trim()); - keyword.setStatus("notSubmitted"); + keyword.setStatus(FinalStatus.NOTSUBMITTED.getValue()); keywordService.save(keyword); } } diff --git a/src/main/java/com/linghu/service/impl/QuestionServiceImpl.java b/src/main/java/com/linghu/service/impl/QuestionServiceImpl.java index c411f9d..fccec91 100644 --- a/src/main/java/com/linghu/service/impl/QuestionServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/QuestionServiceImpl.java @@ -3,6 +3,7 @@ import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linghu.config.FinalStatus; import com.linghu.listener.QuestionExcelListener; import com.linghu.mapper.KeywordMapper; import com.linghu.mapper.ReferenceMapper; @@ -20,6 +21,7 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayOutputStream; @@ -52,7 +54,7 @@ Question question = new Question(); question.setKeyword_id(keywordDto.getKeyword_id()); question.setQuestion(q.trim()); - question.setStatus("pending"); + question.setStatus(FinalStatus.PENDING.getValue()); return question; }).collect(Collectors.toList()); @@ -69,7 +71,7 @@ LambdaQueryWrapper<Question> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Question::getQuestion_id, questions.getQuestion_id()); Question keyword = this.getOne(queryWrapper); - if ("submitted".equals(keyword.getStatus()) ) { + if (FinalStatus.SUBMITTED.getValue().equals(keyword.getStatus()) ) { return ResponseResult.error("该关键词在采集中"); } @@ -82,6 +84,10 @@ @Override public ResponseResult<Void> batchDeleteQuestion(List<Integer> questionIds) { + // 新增判断:如果集合为空,直接返回错误 + if (CollectionUtils.isEmpty(questionIds)) { + return ResponseResult.error("删除失败,至少选择一个提问词"); + } // 2. 批量查询所有提问词 List<Question> questions = this.listByIds(questionIds); // 3. 校验所有提问词关联的关键词是否处于采集中 @@ -92,7 +98,7 @@ return ResponseResult.error("提问词关联的关键词不存在,ID:" + question.getKeyword_id()); } // 核心校验:若有任何关键词在采集中,禁止删除 - if ("submitted".equals(keyword.getStatus())) { + if (FinalStatus.PENDING.getValue().equals(keyword.getStatus())) { return ResponseResult.error("该关键词在采集中,无法删除"); } } @@ -146,7 +152,7 @@ @Override public ResponseResult<List<Question>> updateQuestion(KeywordDto keywordDto) { - if ("submitted".equals(keywordDto.getStatus()) ) { + if (FinalStatus.SUBMITTED.getValue().equals(keywordDto.getStatus()) ) { return ResponseResult.error("该关键词在采集中"); } this.updateBatchById(keywordDto.getQuestionList()); diff --git a/src/main/java/com/linghu/service/impl/TypeServiceImpl.java b/src/main/java/com/linghu/service/impl/TypeServiceImpl.java index be12dd5..c03a59f 100644 --- a/src/main/java/com/linghu/service/impl/TypeServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/TypeServiceImpl.java @@ -50,6 +50,9 @@ @Override public ResponseResult<Void> batchDeleteTypes(List<Integer> typeIds) { + if (typeIds.isEmpty()) { + return ResponseResult.error("请选择要删除的类型"); + } List<Type> types = typeIds.stream().map(id -> { Type type = new Type(); type.setType_id(id); diff --git a/src/main/java/com/linghu/timeTask/ScheduledTasks.java b/src/main/java/com/linghu/timeTask/ScheduledTasks.java index 413d277..ee07098 100644 --- a/src/main/java/com/linghu/timeTask/ScheduledTasks.java +++ b/src/main/java/com/linghu/timeTask/ScheduledTasks.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.linghu.config.FinalStatus; import com.linghu.controller.CollectController; import com.linghu.model.dto.TaskResultResponse; import com.linghu.model.dto.TaskStatusResponse; @@ -158,7 +159,7 @@ try { // 查询所有状态为pending的任务 LambdaQueryWrapper<KeywordTask> queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(KeywordTask::getStatus, "pending"); + queryWrapper.eq(KeywordTask::getStatus, FinalStatus.PENDING.getValue()); List<KeywordTask> tasks = keywordTaskService.list(queryWrapper); log.info("查询到 {} 个待处理任务", tasks.size()); @@ -173,7 +174,7 @@ boolean updatedCount = keywordTaskService.update( new LambdaUpdateWrapper<KeywordTask>() .in(KeywordTask::getId, taskIds) // 限定为查询到的任务 - .eq(KeywordTask::getStatus, "pending") // 确保状态未被其他进程修改 + .eq(KeywordTask::getStatus, FinalStatus.PENDING.getValue()) // 确保状态未被其他进程修改 .set(KeywordTask::getStatus, "processing") ); log.info("成功标记 {} 个任务为processing(查询到{}个)", updatedCount, tasks.size()); @@ -201,29 +202,29 @@ private Mono<KeywordTask> processTaskStatus(KeywordTask task) { return collectController.getTaskStatus(task.getTask_id()) .flatMap(statusResponse -> { - if ("completed".equalsIgnoreCase(statusResponse.getStatus())) { + if (FinalStatus.COMPLETED.getValue().equalsIgnoreCase(statusResponse.getStatus())) { log.info("任务 {} 已完成,获取结果", task.getTask_id()); return collectController.getTaskResult(task.getTask_id()) .doOnSuccess(result -> log.info("获取任务 {} 结果成功", task.getTask_id())) .thenReturn(task) .map(t -> { - t.setStatus("completed"); + t.setStatus(FinalStatus.COMPLETED.getValue()); return t; }); - } else if (!"submitted".equalsIgnoreCase(statusResponse.getStatus()) - && !"running".equalsIgnoreCase(statusResponse.getStatus()) - && !"Error".equalsIgnoreCase(statusResponse.getStatus())) { - task.setStatus("false"); + } else if (!FinalStatus.SUBMITTED.getValue().equalsIgnoreCase(statusResponse.getStatus()) + && !FinalStatus.RUNNING.getValue().equalsIgnoreCase(statusResponse.getStatus()) + && !FinalStatus.ERROR.getValue().equalsIgnoreCase(statusResponse.getStatus())) { + task.setStatus(FinalStatus.FALSE.getValue()); // 新增:处理status为false时的关键词状态更新 return updateKeywordStatusWhenTaskFinished(task) .then(Mono.just(task)); - }else if ( "running".equalsIgnoreCase(statusResponse.getStatus())) { + }else if ( FinalStatus.RUNNING.getValue().equalsIgnoreCase(statusResponse.getStatus())) { // 改回 pending,进行下一轮查询 - task.setStatus("pending"); + task.setStatus(FinalStatus.PENDING.getValue()); //更新每个提问词的状态 return updateQuestionStatus(task, statusResponse); // 抽取为独立方法 - }else if("ERROR".equalsIgnoreCase(statusResponse.getStatus())&&statusResponse.getMessage().contains("Task not found")){ - task.setStatus("nonentity"); + }else if(FinalStatus.ERROR.getValue().equalsIgnoreCase(statusResponse.getStatus())&&statusResponse.getMessage().contains("Task not found")){ + task.setStatus(FinalStatus.NONENTITY.getValue()); // 更新关键词状态 return updateKeywordStatusWhenTaskFinished(task) .then(Mono.just(task)); @@ -243,7 +244,7 @@ }) .onErrorResume(e -> { log.error("处理任务 {} 状态时发生错误: {}", task.getTask_id(), e.getMessage()); - task.setStatus("error"); + task.setStatus(FinalStatus.ERROR.getValue()); // 将updateById的结果包装成Mono return Mono.fromSupplier(() -> keywordTaskService.updateById(task)) @@ -287,16 +288,15 @@ }).flatMap(keywordTasks -> { // 检查所有关联任务是否都已完成(包括各种结束状态) boolean allCompleted = keywordTasks.stream().allMatch(t -> - "completed".equals(t.getStatus()) || - "false".equals(t.getStatus()) || - "cancelled".equals(t.getStatus()) || - "canceled".equals(t.getStatus()) || - "nonentity".equals(t.getStatus()) + FinalStatus.COMPLETED.getValue().equals(t.getStatus()) || + FinalStatus.FALSE.getValue().equals(t.getStatus()) || + FinalStatus.CANCELLED.getValue().equals(t.getStatus()) || + FinalStatus.NONENTITY.getValue().equals(t.getStatus()) ); if (allCompleted) { Keyword keyword = keywordService.getById(task.getKeyword_id()); - keyword.setStatus("completed"); + keyword.setStatus(FinalStatus.COMPLETED.getValue()); // return Mono.fromSupplier(() -> keywordService.updateById(keyword)) .then(); // 转换为Mono<Void> diff --git a/src/main/java/com/linghu/utils/JwtUtils.java b/src/main/java/com/linghu/utils/JwtUtils.java deleted file mode 100644 index 0e4df67..0000000 --- a/src/main/java/com/linghu/utils/JwtUtils.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.linghu.utils; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import com.linghu.model.entity.User; - -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.UnsupportedJwtException; -import io.jsonwebtoken.security.Keys; -import io.jsonwebtoken.security.SignatureException; - -import javax.crypto.SecretKey; -import java.util.Date; -import java.util.Map; - -@Component -public class JwtUtils { - @Value("${jwt.secret}") - private final String secret; - - @Value("${jwt.expiration}") - private final Long expiration; - - // 生成安全的密钥 - private SecretKey getSigningKey() { - return Keys.hmacShaKeyFor(secret.getBytes()); - } - - // 通过构造函数注入配置值 - public JwtUtils( - @Value("${jwt.secret}") String secret, - @Value("${jwt.expiration}") long expiration) { - - this.secret = secret; - this.expiration = expiration; - } - - public String generateToken(User user) { - SecretKey key = Keys.hmacShaKeyFor(secret.getBytes()); - - return Jwts.builder() - .setSubject(user.getUser_name()) - .claim("email", user.getUser_email()) - .claim("password", user.getPassword()) - .setIssuedAt(new Date()) - .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) - .signWith(key, SignatureAlgorithm.HS256) - .compact(); - } - - public User parseToken(String token) - throws ExpiredJwtException, UnsupportedJwtException, - MalformedJwtException, SignatureException, IllegalArgumentException { - - Claims claims = Jwts.parser() - .setSigningKey(getSigningKey()) - .build() - .parseClaimsJws(token) - .getBody(); - - // 创建User对象并填充数据 - User user = new User(); - user.setUser_name(claims.getSubject()); // 主题是用户名 - user.setUser_email(claims.get("email", String.class)); - user.setPassword( claims.get("password", String.class)); - return user; - } - - public boolean validateToken(String token) { - try { - parseToken(token); - return true; - } catch (Exception e) { - return false; - } - } -} \ No newline at end of file -- Gitblit v1.7.1