diff --git a/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java b/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java index eaa2ebb..762b050 100644 --- a/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java +++ b/lottery-system/lottery-common/src/main/java/com/lottery/exception/GlobalExceptionHandler.java @@ -2,31 +2,111 @@ package com.lottery.exception; import com.lottery.result.Result; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.validation.BindException; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.List; +import java.util.stream.Collectors; /** - * @program: lottery-system - * @ClassName GlobalExceptionHandler - * @description: - * @author:jihaipeng - * @create: 2025−07-14 17:02 - * @Version 1.0 - **/ -@ControllerAdvice // 确保该类被 Spring 管理 + * 全局异常处理器 + */ +@RestControllerAdvice @Slf4j public class GlobalExceptionHandler { - // 处理 GlobalException - @ExceptionHandler(GlobalException.class) - public Result handleGlobalException(GlobalException e) { - log.error("业务异常: {}", e.getMessage(), e); - return Result.failure(e.getMessage()); + + /** + * 处理参数校验异常(统一入口) + */ + @ExceptionHandler({ + MethodArgumentNotValidException.class, + BindException.class, + ConstraintViolationException.class, + MethodArgumentTypeMismatchException.class, + MissingServletRequestParameterException.class + }) + public Result handleValidationException(Exception ex) { + String errorMessage; + + if (ex instanceof MethodArgumentNotValidException) { + errorMessage = handleMethodArgumentNotValid((MethodArgumentNotValidException) ex); + } else if (ex instanceof BindException) { + errorMessage = handleBindException((BindException) ex); + } else if (ex instanceof ConstraintViolationException) { + errorMessage = handleConstraintViolation((ConstraintViolationException) ex); + } else if (ex instanceof MethodArgumentTypeMismatchException) { + errorMessage = handleTypeMismatch((MethodArgumentTypeMismatchException) ex); + } else if (ex instanceof MissingServletRequestParameterException) { + errorMessage = handleMissingParameter((MissingServletRequestParameterException) ex); + } else { + errorMessage = "参数校验失败"; + } + + log.warn("参数校验异常: {}", errorMessage); + return Result.failure(400, errorMessage); + } + + /** + * 处理 MethodArgumentNotValidException + */ + private String handleMethodArgumentNotValid(MethodArgumentNotValidException ex) { + List errors = ex.getBindingResult().getFieldErrors().stream() + .map(error -> error.getField() + ": " + error.getDefaultMessage()) + .collect(Collectors.toList()); + return String.join(", ", errors); + } + + /** + * 处理 BindException + */ + private String handleBindException(BindException ex) { + List errors = ex.getBindingResult().getFieldErrors().stream() + .map(error -> error.getField() + ": " + error.getDefaultMessage()) + .collect(Collectors.toList()); + return String.join(", ", errors); + } + + /** + * 处理 ConstraintViolationException + */ + private String handleConstraintViolation(ConstraintViolationException ex) { + List errors = ex.getConstraintViolations().stream() + .map(ConstraintViolation::getMessage) + .collect(Collectors.toList()); + return String.join(", ", errors); + } + + /** + * 处理类型不匹配异常 + */ + private String handleTypeMismatch(MethodArgumentTypeMismatchException ex) { + return String.format("参数 '%s' 类型不匹配,期望类型: %s", + ex.getName(), + ex.getRequiredType().getSimpleName()); + } + + /** + * 处理缺失参数异常 + */ + private String handleMissingParameter(MissingServletRequestParameterException ex) { + return String.format("缺失必填参数: '%s' (类型: %s)", + ex.getParameterName(), + ex.getParameterType()); } - // 处理其他异常 + /** + * 处理系统异常 + */ @ExceptionHandler(Exception.class) - public Result handleException(Exception e) { + public Result handleSystemException(Exception e) { log.error("系统异常: ", e); return Result.failure(500, "系统繁忙,请稍后再试"); } -} +} \ No newline at end of file diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingRecordDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingRecordDto.java index a707ff8..9161598 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingRecordDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingRecordDto.java @@ -1,6 +1,11 @@ package com.lottery.dto; + + import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import javax.validation.constraints.NotNull; /** * @program: lottery-system @@ -10,10 +15,12 @@ import lombok.Data; * @create: 2025−07-15 14:27 * @Version 1.0 **/ +@Slf4j @Data public class FundingRecordDto { + @NotNull(message = "活动ID不能为空") private Integer activityId; - + @NotNull(message = "市场标识不能为空") private Integer marketSign; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingUserDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingUserDto.java index 0bb82b2..7689a82 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingUserDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FundingUserDto.java @@ -1,7 +1,10 @@ package com.lottery.dto; + import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import javax.validation.constraints.NotNull; import java.time.LocalDateTime; /** @@ -12,8 +15,11 @@ import java.time.LocalDateTime; * @create: 2025−07-15 10:47 * @Version 1.0 **/ +@Slf4j @Data public class FundingUserDto { + + @NotNull(message = "活动ID不能为空") public Integer activityId; private Integer marketSign; // 市场标识(usa/hk) diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApiFundingVO.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApiFundingVO.java index a3e4b29..5c53ee5 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApiFundingVO.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApiFundingVO.java @@ -3,6 +3,7 @@ package com.lottery.vo; import lombok.Data; import java.time.LocalDate; +import java.util.List; /** * @program: lottery-system @@ -14,15 +15,8 @@ import java.time.LocalDate; **/ @Data public class ApiFundingVO { - private Integer marketOneId; - private Integer marketTwoId; - private String marketOne; - private String marketTwo; + private List data; private LocalDate startTime; private LocalDate endTime; private Integer Totalcount; - private Integer marketOneCount; - private Integer marketTwoCount; - private String marketOneStatus; - private String marketTwoStatus; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApimarketVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApimarketVo.java new file mode 100644 index 0000000..a978a84 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/ApimarketVo.java @@ -0,0 +1,23 @@ +package com.lottery.vo; + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDate; + +/** + * @program: lottery-system + * @ClassName ApimarketVo + * @description: + * @author:jihaipeng + * @create: 2025−07-21 14:10 + * @Version 1.0 + **/ +@Slf4j +@Data +public class ApimarketVo { + private Integer marketId; + private String market; + private Integer marketCount; + private String marketStatus; +} diff --git a/lottery-system/lottery-service/pom.xml b/lottery-system/lottery-service/pom.xml index c72b15a..86a2699 100644 --- a/lottery-system/lottery-service/pom.xml +++ b/lottery-system/lottery-service/pom.xml @@ -30,11 +30,21 @@ lottery-common 1.0-SNAPSHOT + + javax.validation + validation-api + 2.0.1.Final + org.springframework.boot spring-boot-starter-data-jpa + + org.springframework.boot + spring-boot-starter-validation + + com.alibaba diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java index b162782..1ce5ff9 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/FundingController.java @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.*; import javax.persistence.criteria.CriteriaBuilder; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.io.IOException; import java.util.List; import java.util.Map; @@ -154,7 +155,7 @@ public class FundingController { //导出活动数据 @PostMapping("/exportActivityData") - public void exportActivityData(@RequestBody FundingUserDto fundingUserDto, HttpServletResponse response) throws IOException { + public void exportActivityData(@RequestBody @Valid FundingUserDto fundingUserDto, HttpServletResponse response) throws IOException { LOGGER.info("导出活动数据,参数为{}", fundingUserDto); fundingService.exportActivityData(fundingUserDto,response); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java index 350df0c..811bf7a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminWinServiceImpl.java @@ -61,6 +61,7 @@ public class AdminWinServiceImpl extends ServiceImpl page = new Page<>(pageNum, pageSize); + // 2. 构建查询条件 LambdaQueryWrapper recordWrapper = new LambdaQueryWrapper<>(); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java index 4eb9df0..48b665a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/FundingServiceImpl.java @@ -300,7 +300,7 @@ public class FundingServiceImpl implements IFundingService { } //市场二的虚拟次数 Integer markerTwoVirtual = fundingMapper.searchVirtual(activityId, Two); - if(markerTwoVirtual != null ){ + if(markerTwoVirtual == null ){ markerTwoVirtual = 0; } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java index f1a4aa7..caa2301 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/ApiFundingController.java @@ -9,8 +9,11 @@ import lombok.Data; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; + /** * @program: lottery-system * @ClassName FundingController @@ -27,23 +30,24 @@ public class ApiFundingController { private ApiIFundingService fundingService; private final static Logger LOGGER = LoggerFactory.getLogger(ApiFundingController.class); - //前台获取活动列表 - @GetMapping("/getActivity") - public Result getFundingActivity(@RequestParam Integer activityId){ - LOGGER.info("前台获取众筹活动所有数据"); - return Result.success(fundingService.getActivityDetail(activityId)); - } + //前台获取活动详情 - @PostMapping("/getActivity1") - public Result getFundingActivity1(@RequestHeader String token){ + @PostMapping("/getActivity") + public Result getFundingActivity(@RequestHeader String token){ + if(token == null|| token.trim().isEmpty()){ + return Result.failure("请先登录"); + } LOGGER.info("前台获取众筹活动所有数据"); return fundingService.getActivityDetailOne(token); } //添加用户参与记录 @PostMapping("/addRecord") - public Result addRecord(@RequestHeader String token,@RequestBody FundingRecordDto fundingRecordDto) throws Exception { + public Result addRecord(@RequestHeader String token,@RequestBody @Valid FundingRecordDto fundingRecordDto) throws Exception { + if(token == null|| token.trim().isEmpty()){ + return Result.failure("请先登录"); + } LOGGER.info("添加用户参与记录,参数为{}", fundingRecordDto); return fundingService.addRecord(token,fundingRecordDto); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/ApiIFundingService.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/ApiIFundingService.java index f499126..a91a87e 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/ApiIFundingService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/ApiIFundingService.java @@ -16,7 +16,6 @@ import javax.print.DocFlavor; **/ public interface ApiIFundingService { - ApiFundingVO getActivityDetail(Integer activityId); Result getActivityDetailOne(String token); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java index dcf1d63..cbf720a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/ApiFundingServiceImpl.java @@ -9,14 +9,14 @@ import com.lottery.result.Result; import com.lottery.utils.HttpUtils; import com.lottery.vo.ApiFundingTimeVo; import com.lottery.vo.ApiFundingVO; +import com.lottery.vo.ApimarketVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * @program: lottery-system @@ -36,66 +36,6 @@ public class ApiFundingServiceImpl implements ApiIFundingService { @Autowired ObjectMapper objectMapper = new ObjectMapper(); - //返回前台所有数据 - @Override - public ApiFundingVO getActivityDetail(Integer activityId) { - - //根据活动id查询活动时间,市场一,市场二,设置的初始时间,俩个市场总助力次数 - - //根据活动id查询俩个市场,俩个市场是一条数据 - ApiFundingTimeVo data= fundingMapper.getMarket(activityId); - - Integer marketOne = data.getMarketOne(); - Integer marketTwo = data.getMarketTwo(); - LocalDate startTime = (LocalDate) data.getStartTime(); - LocalDate endTime = (LocalDate) data.getEndTime(); - - - //市场一的总的助力次数 - Integer markerOneTotal = fundingMapper.searchMarketTotal(activityId, marketOne); - if (markerOneTotal == null) { - markerOneTotal = 0; // 默认值 - } - //市场一的虚拟次数 - Integer markerOneVirtual = fundingMapper.searchVirtual(activityId, marketOne); - if (markerOneVirtual == null) { - markerOneVirtual = 0; // 默认值 - } - - //市场二的总的助力次数 - Integer markerTwoTotal = fundingMapper.searchMarketTotal(activityId, marketTwo); - if (markerTwoTotal == null) { - markerTwoTotal = 0; // 默认值 - } - //市场二的虚拟次数 - Integer markerTwoVirtual = fundingMapper.searchVirtual(activityId, marketTwo); - if (markerTwoVirtual == null) { - markerTwoVirtual = 0; // 默认值 - } - //获取的设置时间 - Integer time = fundingMapper.getTime(activityId,marketOne); - - Integer oneShow = markerOneTotal + markerOneVirtual; - Integer twoShow = markerTwoTotal + markerTwoVirtual; - - ApiFundingVO apiFundingVO = new ApiFundingVO(); - - // - String marketOneName = fundingMapper.selectMarket(marketOne); - String marketTwoName = fundingMapper.selectMarket(marketTwo); - - apiFundingVO.setMarketOne(marketOneName); - apiFundingVO.setMarketTwo(marketTwoName); - - - apiFundingVO.setMarketOneCount(oneShow); - apiFundingVO.setMarketTwoCount(twoShow); - apiFundingVO.setTotalcount(time); - apiFundingVO.setStartTime(startTime); - apiFundingVO.setEndTime(endTime); - - return apiFundingVO; - } @Override public Result getActivityDetailOne(String token) { @@ -103,10 +43,10 @@ public class ApiFundingServiceImpl implements ApiIFundingService { //先查询一下有几个活动开启 Integer count = fundingMapper.selectStatusCount(); - if (count == null || count < 0 || count > 1) { + if (count == null || count == 0 || count > 1) { // 根据业务逻辑,这里可以分别处理count为null、小于0和大于1的情况 // 但为了简化示例,我们统一返回一个失败结果 - return Result.failure("活动数量不符合要求,请检查并关闭多余的活动"); + return Result.failure("活动数量不符合要求,请检查打开或关闭多余的活动"); } Integer activityId = fundingMapper.selectStatus(); @@ -185,21 +125,27 @@ public class ApiFundingServiceImpl implements ApiIFundingService { ApiFundingVO apiFundingVO = new ApiFundingVO(); - String marketOneName = fundingMapper.selectMarket(marketOne); String marketTwoName = fundingMapper.selectMarket(marketTwo); - apiFundingVO.setMarketOne(marketOneName); - apiFundingVO.setMarketTwo(marketTwoName); - - apiFundingVO.setMarketOneId(marketOne); - apiFundingVO.setMarketTwoId(marketTwo); - apiFundingVO.setMarketOneCount(oneShow); - apiFundingVO.setMarketTwoCount(twoShow); apiFundingVO.setTotalcount(time); apiFundingVO.setStartTime(startTime); apiFundingVO.setEndTime(endTime); - apiFundingVO.setMarketOneStatus(markeroneadd); - apiFundingVO.setMarketTwoStatus(marketTwoadd); + + ApimarketVo marketone = new ApimarketVo(); + ApimarketVo markettwo = new ApimarketVo(); + + marketone.setMarketId(marketOne); + marketone.setMarket(marketOneName); + marketone.setMarketCount(oneShow); + marketone.setMarketStatus(markeroneadd); + + markettwo.setMarketId(marketTwo); + markettwo.setMarket(marketTwoName); + markettwo.setMarketCount(twoShow); + markettwo.setMarketStatus(marketTwoadd); + + + apiFundingVO.setData(Arrays.asList(marketone,markettwo)); return Result.success(apiFundingVO); } diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml index c9feed1..a185457 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/fundingMapper.xml @@ -160,19 +160,19 @@ FROM activity WHERE status = 1 + + - -