From dca7928a49fa3102fdf93e8159c1ffd70c8d369f Mon Sep 17 00:00:00 2001 From: willy <2462310981@qq.com> Date: Thu, 24 Jul 2025 15:42:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/lottery/dto/GradeDto.java | 13 ++- .../src/main/java/com/lottery/dto/PrizeDto.java | 4 + .../src/main/java/com/lottery/dto/UserDto.java | 7 ++ .../main/java/com/lottery/dto/UserQueryDto.java | 2 + .../src/main/java/com/lottery/entity/Grade.java | 2 + .../admin/controller/AdminUserController.java | 7 +- .../com/lottery/admin/mapper/AdminUserMapper.java | 3 + .../admin/service/Impl/AdminPrizeServiceImpl.java | 10 ++ .../service/Impl/AdminUserDetailServiceImpl.java | 121 ++++++++++++++++----- .../admin/service/Impl/AdminUserServiceImpl.java | 8 +- .../java/com/lottery/config/MybatisPageConfig.java | 2 +- 11 files changed, 146 insertions(+), 33 deletions(-) diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java index 3947197..fa8bb83 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java @@ -3,7 +3,7 @@ package com.lottery.dto; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; -import javax.validation.constraints.NotNull; +import javax.validation.constraints.*; /** * @program: lottery-system @@ -18,15 +18,26 @@ public class GradeDto { private Long id; + @NotNull(message = "等级名称不能为空") + @Size(max = 15, message = "等级名称长度不能超过15个字符") + @Pattern(regexp = "^[a-zA-Z0-9\\u4e00-\\u9fa5]+$", message = "等级名称只能包含中文、英文和数字") private String gradeName; // 等级名称 + @Min(value = 1, message = "数量必须为正数") + @Max(value = 100000, message = "数量不能超过100000") @NotNull(message = "数量不能为空") private Integer amount; //等级数量 + + @Min(value = 0, message = "数量必须为正数") + @Max(value = 100, message = "数量不能超过100") @NotNull(message = "排序数不能为空") private Integer sort; + + @Min(value = 1, message = "数量必须为正数") + @Max(value = 500, message = "数量不能超过500") @NotNull(message = "每轮人数不能为空") private Integer perWin; diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java index f106288..3f90568 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java @@ -5,6 +5,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; /** * @program: lottery @@ -22,6 +24,8 @@ public class PrizeDto { private Long id; @NotNull(message = "奖品名不能为空") + @Size(max = 15, message = "奖品名长度不能超过15个字符") + @Pattern(regexp = "^[\\u4e00-\\u9fa5a-zA-Z0-9]+$", message = "奖品名只能包含中文、英文或数字") private String prizeName; @NotNull(message = "等级不能为空") diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java index 3ebb13b..9c42005 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java @@ -4,6 +4,8 @@ import lombok.Builder; import lombok.Data; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; /** * @program: lottery @@ -20,8 +22,13 @@ public class UserDto { private int id; @NotNull(message = "用户名不能为空") + @Size(max = 30, message = "姓名长度不能超过30个字符") + @Pattern(regexp = "^[\\u4e00-\\u9fa5\\u3400-\\u4dbf\\u20000-\\u2a6df\\u2a700-\\u2b73f\\u2b740-\\u2b81f\\u2b820-\\u2ceaf\\uf900-\\ufaffa-zA-Z]+$", + message = "姓名只能包含中文(简繁体)或英文字符") private String username; + + @Pattern(regexp = "^\\d{5,12}$", message = "精网号必须是5到12位的数字") @NotNull(message = "精网号不能为空") private String jwcode; } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java index 3730ceb..1b6f3ab 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java @@ -13,6 +13,8 @@ import lombok.Data; @Data public class UserQueryDto { + private Long gradeId; + private String username; private String jwcode; diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java index 331db9e..58abfb1 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java @@ -6,6 +6,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; import java.util.Date; /** diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java index a0c0db3..06e2ee4 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java @@ -56,7 +56,7 @@ public class AdminUserController { LOGGER.info("新增用户:{}",userDto); if (!adminUserService.addUser(userDto)){ - return Result.failure("精网号已存在,无法添加"); + return Result.failure("用户名或精网号已存在,无法添加"); } return Result.success(); } @@ -131,6 +131,11 @@ public class AdminUserController { return Result.success(adminUserDetailService.listFixUser(userQueryDto.getPageNum(),userQueryDto.getPageSize(),userQueryDto)); } +// @PostMapping +// public Result> getAllFixUserById(@RequestBody UserQueryDto userQueryDto){ +// +// } + @PostMapping("/delete/fix") public Result deleteFix(@RequestParam Long id) { diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java index 89c4ae8..2a3be6a 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java @@ -37,4 +37,7 @@ public interface AdminUserMapper extends BaseMapper { @Select("select * from user where jwcode = #{jwcode}") User selectUserByJwcode(String jwcode); + + @Select("select * from user where username = #{username}") + User selectByName(String username); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java index 1d08ac3..0e3d9e2 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java @@ -82,6 +82,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl return Result.failure("等级不存在"); // 等级不存在,直接返回失败 } + Long l = adminPrizeMapper.selectByName(prizeDto.getPrizeName()); + if (l != null) { + return Result.failure("奖品名已存在"); + } + // 2. 检查逻辑:仅当等级未删除(is_del=0)且已存在奖品时,才拒绝添加 if (grade.getIsDel() == 0) { // 等级未删除 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); @@ -119,6 +124,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl Long gradeId = prizeDto.getGradeId(); Grade grade = adminGradeMapper.selectById(gradeId); + Long l = adminPrizeMapper.selectByName(prizeDto.getPrizeName()); + if (l != null) { + return Result.failure("奖品名已存在"); + } + // 2. 检查是否是修改现有奖品(需要传入prizeId) // 1. 查询原奖品信息 Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId()); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java index 3489e3f..f99a31c 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java @@ -59,47 +59,79 @@ public class AdminUserDetailServiceImpl extends ServiceImpl listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { // -// // 如果没有有效用户,返回空分页结果 -// if (CollectionUtils.isEmpty(validUserIds)) { -// return emptyPageInfo(pageNum, pageSize); -// } // -// // 2. 构建用户表查询条件 + // 1. 查询有效的用户详情记录(过滤掉 is_del = 1 的记录) + // 1. 先根据User表的条件查询出符合条件的用户ID列表 // LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); -// userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内 +// userWrapper.eq(User::getIsDel, 0); // 未删除的用户 // -// // 添加动态查询条件 +// // 添加User表的动态查询条件 // if (StringUtils.isNotBlank(userQueryDto.getUsername())) { // userWrapper.like(User::getUsername, userQueryDto.getUsername()); // } // if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { -// userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配 +// userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); +// } +// +// // 只查询ID字段,提高效率 +// userWrapper.select(User::getId); +// List userIds = adminUserMapper.selectList(userWrapper) +// .stream() +// .map(User::getId) +// .collect(Collectors.toList()); +// +// // 如果没有符合条件的用户,直接返回空结果 +// if (CollectionUtils.isEmpty(userIds)) { +// return emptyPageInfo(pageNum, pageSize); // } // +// // 2. 查询UserDetail表(基于上一步获取的用户ID列表) +// LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); +// detailWrapper.in(UserDetail::getUserId, userIds); // 只查询符合条件的用户ID +// detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录 +// // // 3. 执行分页查询 -// Page page = new Page<>(pageNum, pageSize); -// Page userPage = adminUserMapper.selectPage(page, userWrapper); +// Page detailPage = new Page<>(pageNum, pageSize); +// Page detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper); +// +// // 4. 如果没有数据,返回空分页结果 +// if (CollectionUtils.isEmpty(detailPageResult.getRecords())) { +// return emptyPageInfo(pageNum, pageSize); +// } // -// // 4. 转换为VO对象 -// List userVoList = userPage.getRecords().stream() -// .map(user -> { +// // 5. 批量获取关联的User信息(使用之前查询过的ID列表,避免重复查询) +// Map userMap = adminUserMapper.selectBatchIds(userIds).stream() +// .collect(Collectors.toMap(User::getId, Function.identity())); +// +// // 6. 构建VO对象 +// List userVoList = detailPageResult.getRecords().stream() +// .map(detail -> { // UserVo vo = new UserVo(); -// // 这里做属性拷贝,可以使用BeanUtils或MapStruct等工具 -// vo.setId(user.getId()); -// vo.setUsername(user.getUsername()); -// // ...其他字段拷贝 +// vo.setId(detail.getId()); // 这里使用user_detail表的ID +// +// // 设置User表的信息 +// User user = userMap.get(detail.getUserId()); +// if (user != null) { +// vo.setUsername(user.getUsername()); +// vo.setJwcode(user.getJwcode()); +// // 其他需要从User表获取的字段... +// } // return vo; // }) // .collect(Collectors.toList()); // -// // 5. 构建分页结果 -// return PageInfo.of(userPage, userVoList); - - // 1. 查询有效的用户详情记录(过滤掉 is_del = 1 的记录) +// // 7. 构建分页结果 +// return PageInfo.of(detailPageResult, userVoList); + // 1. 构建UserDetail查询条件 LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录 - // 2. 执行分页查询(直接查询UserDetail表) + // 添加gradeId条件 + if (userQueryDto.getGradeId() != null) { + detailWrapper.eq(UserDetail::getGradeId, userQueryDto.getGradeId()); + } + + // 2. 执行分页查询UserDetail表 Page detailPage = new Page<>(pageNum, pageSize); Page detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper); @@ -108,19 +140,45 @@ public class AdminUserDetailServiceImpl extends ServiceImpl userIds = detailPageResult.getRecords().stream() .map(UserDetail::getUserId) .collect(Collectors.toList()); - Map userMap = adminUserMapper.selectBatchIds(userIds).stream() + // 5. 构建User表查询条件(包含username和jwcode条件) + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + userWrapper.eq(User::getIsDel, 0) // 未删除的用户 + .in(User::getId, userIds); // 限制在分页查询到的用户范围内 + + // 添加User表的动态查询条件 + if (StringUtils.isNotBlank(userQueryDto.getUsername())) { + userWrapper.like(User::getUsername, userQueryDto.getUsername()); + } + if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { + userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); + } + + // 6. 查询符合条件的User信息 + Map userMap = adminUserMapper.selectList(userWrapper) + .stream() .collect(Collectors.toMap(User::getId, Function.identity())); - // 5. 构建VO对象 - List userVoList = detailPageResult.getRecords().stream() + // 7. 过滤掉UserDetail中没有对应User的记录 + List validDetails = detailPageResult.getRecords().stream() + .filter(detail -> userMap.containsKey(detail.getUserId())) + .collect(Collectors.toList()); + + // 8. 如果没有有效数据,返回空分页结果 + if (CollectionUtils.isEmpty(validDetails)) { + return emptyPageInfo(pageNum, pageSize); + } + + // 9. 构建VO对象 + List userVoList = validDetails.stream() .map(detail -> { UserVo vo = new UserVo(); - vo.setId(detail.getId()); // 这里使用user_detail表的ID + vo.setId(detail.getId()); // 使用user_detail表的ID +// vo.se(detail.getGradeId()); // 设置gradeId // 设置User表的信息 User user = userMap.get(detail.getUserId()); @@ -133,10 +191,15 @@ public class AdminUserDetailServiceImpl extends ServiceImpl pageInfo = PageInfo.of(detailPageResult, userVoList); + pageInfo.setList(userVoList); + pageInfo.setTotal(userVoList.size()); // 修正总数 + + return pageInfo; } + // 返回空分页结果的辅助方法 private PageInfo emptyPageInfo(int pageNum, int pageSize) { PageInfo pageInfo = new PageInfo<>(); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java index 4a9533b..73fcb2e 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java @@ -36,6 +36,7 @@ import org.springframework.web.multipart.MultipartFile; import org.json.JSONObject; import javax.persistence.criteria.CriteriaBuilder; +import javax.validation.Valid; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -123,9 +124,14 @@ public class AdminUserServiceImpl extends ServiceImpl imp } @Override - public boolean addUser(UserDto userDto) { + public boolean addUser(@Valid UserDto userDto) { String jwcode = userDto.getJwcode(); + User user1 = adminUserMapper.selectByName(userDto.getUsername()); + if (user1 != null) { + return false; + } + // 1. 查询是否已存在相同精网号的用户 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getJwcode, jwcode); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java index 5775a13..1c65598 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java @@ -25,7 +25,7 @@ public class MybatisPageConfig { public PaginationInnerInterceptor paginationInnerInterceptor() { PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(); // 设置最大单页限制数量,默认 500 条,-1 不受限制 - paginationInterceptor.setMaxLimit(1000L); + paginationInterceptor.setMaxLimit(10000L); paginationInterceptor.setDbType(DbType.MYSQL); // 开启 count 的 join 优化,只针对部分 left join paginationInterceptor.setOptimizeJoin(true);