Browse Source

修复bug

dev
willy 4 weeks ago
parent
commit
dca7928a49
  1. 13
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/GradeDto.java
  2. 4
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java
  3. 7
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java
  4. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java
  5. 2
      lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java
  6. 7
      lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java
  7. 3
      lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java
  8. 10
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java
  9. 121
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java
  10. 8
      lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java
  11. 2
      lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java

13
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 com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.*;
/** /**
* @program: lottery-system * @program: lottery-system
@ -18,15 +18,26 @@ public class GradeDto {
private Long id; private Long id;
@NotNull(message = "等级名称不能为空") @NotNull(message = "等级名称不能为空")
@Size(max = 15, message = "等级名称长度不能超过15个字符")
@Pattern(regexp = "^[a-zA-Z0-9\\u4e00-\\u9fa5]+$", message = "等级名称只能包含中文、英文和数字")
private String gradeName; // 等级名称 private String gradeName; // 等级名称
@Min(value = 1, message = "数量必须为正数")
@Max(value = 100000, message = "数量不能超过100000")
@NotNull(message = "数量不能为空") @NotNull(message = "数量不能为空")
private Integer amount; //等级数量 private Integer amount; //等级数量
@Min(value = 0, message = "数量必须为正数")
@Max(value = 100, message = "数量不能超过100")
@NotNull(message = "排序数不能为空") @NotNull(message = "排序数不能为空")
private Integer sort; private Integer sort;
@Min(value = 1, message = "数量必须为正数")
@Max(value = 500, message = "数量不能超过500")
@NotNull(message = "每轮人数不能为空") @NotNull(message = "每轮人数不能为空")
private Integer perWin; private Integer perWin;

4
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java

@ -5,6 +5,8 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/** /**
* @program: lottery * @program: lottery
@ -22,6 +24,8 @@ public class PrizeDto {
private Long id; private Long id;
@NotNull(message = "奖品名不能为空") @NotNull(message = "奖品名不能为空")
@Size(max = 15, message = "奖品名长度不能超过15个字符")
@Pattern(regexp = "^[\\u4e00-\\u9fa5a-zA-Z0-9]+$", message = "奖品名只能包含中文、英文或数字")
private String prizeName; private String prizeName;
@NotNull(message = "等级不能为空") @NotNull(message = "等级不能为空")

7
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java

@ -4,6 +4,8 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
/** /**
* @program: lottery * @program: lottery
@ -20,8 +22,13 @@ public class UserDto {
private int id; private int id;
@NotNull(message = "用户名不能为空") @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; private String username;
@Pattern(regexp = "^\\d{5,12}$", message = "精网号必须是5到12位的数字")
@NotNull(message = "精网号不能为空") @NotNull(message = "精网号不能为空")
private String jwcode; private String jwcode;
} }

2
lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java

@ -13,6 +13,8 @@ import lombok.Data;
@Data @Data
public class UserQueryDto { public class UserQueryDto {
private Long gradeId;
private String username; private String username;
private String jwcode; private String jwcode;

2
lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Grade.java

@ -6,6 +6,8 @@ import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.util.Date; import java.util.Date;
/** /**

7
lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java

@ -56,7 +56,7 @@ public class AdminUserController {
LOGGER.info("新增用户:{}",userDto); LOGGER.info("新增用户:{}",userDto);
if (!adminUserService.addUser(userDto)){ if (!adminUserService.addUser(userDto)){
return Result.failure("精网号已存在,无法添加");
return Result.failure("用户名或精网号已存在,无法添加");
} }
return Result.success(); return Result.success();
} }
@ -131,6 +131,11 @@ public class AdminUserController {
return Result.success(adminUserDetailService.listFixUser(userQueryDto.getPageNum(),userQueryDto.getPageSize(),userQueryDto)); return Result.success(adminUserDetailService.listFixUser(userQueryDto.getPageNum(),userQueryDto.getPageSize(),userQueryDto));
} }
// @PostMapping
// public Result<PageInfo<UserVo>> getAllFixUserById(@RequestBody UserQueryDto userQueryDto){
//
// }
@PostMapping("/delete/fix") @PostMapping("/delete/fix")
public Result deleteFix(@RequestParam Long id) { public Result deleteFix(@RequestParam Long id) {

3
lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java

@ -37,4 +37,7 @@ public interface AdminUserMapper extends BaseMapper<User> {
@Select("select * from user where jwcode = #{jwcode}") @Select("select * from user where jwcode = #{jwcode}")
User selectUserByJwcode(String jwcode); User selectUserByJwcode(String jwcode);
@Select("select * from user where username = #{username}")
User selectByName(String username);
} }

10
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminPrizeServiceImpl.java

@ -82,6 +82,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
return Result.failure("等级不存在"); // 等级不存在直接返回失败 return Result.failure("等级不存在"); // 等级不存在直接返回失败
} }
Long l = adminPrizeMapper.selectByName(prizeDto.getPrizeName());
if (l != null) {
return Result.failure("奖品名已存在");
}
// 2. 检查逻辑仅当等级未删除is_del=0且已存在奖品时才拒绝添加 // 2. 检查逻辑仅当等级未删除is_del=0且已存在奖品时才拒绝添加
if (grade.getIsDel() == 0) { // 等级未删除 if (grade.getIsDel() == 0) { // 等级未删除
LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<Prize> wrapper = new LambdaQueryWrapper<>();
@ -119,6 +124,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl<AdminPrizeMapper, Prize>
Long gradeId = prizeDto.getGradeId(); Long gradeId = prizeDto.getGradeId();
Grade grade = adminGradeMapper.selectById(gradeId); Grade grade = adminGradeMapper.selectById(gradeId);
Long l = adminPrizeMapper.selectByName(prizeDto.getPrizeName());
if (l != null) {
return Result.failure("奖品名已存在");
}
// 2. 检查是否是修改现有奖品需要传入prizeId // 2. 检查是否是修改现有奖品需要传入prizeId
// 1. 查询原奖品信息 // 1. 查询原奖品信息
Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId()); Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId());

121
lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserDetailServiceImpl.java

@ -59,47 +59,79 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
@Override @Override
public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { public PageInfo<UserVo> listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) {
// //
// // 如果没有有效用户返回空分页结果
// if (CollectionUtils.isEmpty(validUserIds)) {
// return emptyPageInfo(pageNum, pageSize);
// }
// //
// // 2. 构建用户表查询条件
// 1. 查询有效的用户详情记录过滤掉 is_del = 1 的记录
// 1. 先根据User表的条件查询出符合条件的用户ID列表
// LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>(); // LambdaQueryWrapper<User> userWrapper = new LambdaQueryWrapper<>();
// userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内
// userWrapper.eq(User::getIsDel, 0); // 未删除的用户
// //
// // 添加动态查询条件
// // 添加User表的动态查询条件
// if (StringUtils.isNotBlank(userQueryDto.getUsername())) { // if (StringUtils.isNotBlank(userQueryDto.getUsername())) {
// userWrapper.like(User::getUsername, userQueryDto.getUsername()); // userWrapper.like(User::getUsername, userQueryDto.getUsername());
// } // }
// if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { // if (StringUtils.isNotBlank(userQueryDto.getJwcode())) {
// userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配
// userWrapper.like(User::getJwcode, userQueryDto.getJwcode());
// }
//
// // 只查询ID字段提高效率
// userWrapper.select(User::getId);
// List<Long> userIds = adminUserMapper.selectList(userWrapper)
// .stream()
// .map(User::getId)
// .collect(Collectors.toList());
//
// // 如果没有符合条件的用户直接返回空结果
// if (CollectionUtils.isEmpty(userIds)) {
// return emptyPageInfo(pageNum, pageSize);
// } // }
// //
// // 2. 查询UserDetail表基于上一步获取的用户ID列表
// LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>();
// detailWrapper.in(UserDetail::getUserId, userIds); // 只查询符合条件的用户ID
// detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录
//
// // 3. 执行分页查询 // // 3. 执行分页查询
// Page<User> page = new Page<>(pageNum, pageSize);
// Page<User> userPage = adminUserMapper.selectPage(page, userWrapper);
// Page<UserDetail> detailPage = new Page<>(pageNum, pageSize);
// Page<UserDetail> detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper);
//
// // 4. 如果没有数据返回空分页结果
// if (CollectionUtils.isEmpty(detailPageResult.getRecords())) {
// return emptyPageInfo(pageNum, pageSize);
// }
// //
// // 4. 转换为VO对象
// List<UserVo> userVoList = userPage.getRecords().stream()
// .map(user -> {
// // 5. 批量获取关联的User信息使用之前查询过的ID列表避免重复查询
// Map<Long, User> userMap = adminUserMapper.selectBatchIds(userIds).stream()
// .collect(Collectors.toMap(User::getId, Function.identity()));
//
// // 6. 构建VO对象
// List<UserVo> userVoList = detailPageResult.getRecords().stream()
// .map(detail -> {
// UserVo vo = new UserVo(); // 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; // return vo;
// }) // })
// .collect(Collectors.toList()); // .collect(Collectors.toList());
// //
// // 5. 构建分页结果
// return PageInfo.of(userPage, userVoList);
// 1. 查询有效的用户详情记录过滤掉 is_del = 1 的记录
// // 7. 构建分页结果
// return PageInfo.of(detailPageResult, userVoList);
// 1. 构建UserDetail查询条件
LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<UserDetail> detailWrapper = new LambdaQueryWrapper<>();
detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录 detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录
// 2. 执行分页查询直接查询UserDetail表
// 添加gradeId条件
if (userQueryDto.getGradeId() != null) {
detailWrapper.eq(UserDetail::getGradeId, userQueryDto.getGradeId());
}
// 2. 执行分页查询UserDetail表
Page<UserDetail> detailPage = new Page<>(pageNum, pageSize); Page<UserDetail> detailPage = new Page<>(pageNum, pageSize);
Page<UserDetail> detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper); Page<UserDetail> detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper);
@ -108,19 +140,45 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
return emptyPageInfo(pageNum, pageSize); return emptyPageInfo(pageNum, pageSize);
} }
// 4. 批量获取关联的User信息
// 4. 获取所有关联的用户ID
List<Long> userIds = detailPageResult.getRecords().stream() List<Long> userIds = detailPageResult.getRecords().stream()
.map(UserDetail::getUserId) .map(UserDetail::getUserId)
.collect(Collectors.toList()); .collect(Collectors.toList());
Map<Long, User> userMap = adminUserMapper.selectBatchIds(userIds).stream()
// 5. 构建User表查询条件包含username和jwcode条件
LambdaQueryWrapper<User> 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<Long, User> userMap = adminUserMapper.selectList(userWrapper)
.stream()
.collect(Collectors.toMap(User::getId, Function.identity())); .collect(Collectors.toMap(User::getId, Function.identity()));
// 5. 构建VO对象
List<UserVo> userVoList = detailPageResult.getRecords().stream()
// 7. 过滤掉UserDetail中没有对应User的记录
List<UserDetail> 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<UserVo> userVoList = validDetails.stream()
.map(detail -> { .map(detail -> {
UserVo vo = new UserVo(); 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 user = userMap.get(detail.getUserId()); User user = userMap.get(detail.getUserId());
@ -133,10 +191,15 @@ public class AdminUserDetailServiceImpl extends ServiceImpl<IUserDetailMapper, U
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
// 6. 构建分页结果
return PageInfo.of(detailPageResult, userVoList);
// 10. 重新构建分页结果
PageInfo<UserVo> pageInfo = PageInfo.of(detailPageResult, userVoList);
pageInfo.setList(userVoList);
pageInfo.setTotal(userVoList.size()); // 修正总数
return pageInfo;
} }
// 返回空分页结果的辅助方法 // 返回空分页结果的辅助方法
private <T> PageInfo<T> emptyPageInfo(int pageNum, int pageSize) { private <T> PageInfo<T> emptyPageInfo(int pageNum, int pageSize) {
PageInfo<T> pageInfo = new PageInfo<>(); PageInfo<T> pageInfo = new PageInfo<>();

8
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 org.json.JSONObject;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
import javax.validation.Valid;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -123,9 +124,14 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, User> imp
} }
@Override @Override
public boolean addUser(UserDto userDto) {
public boolean addUser(@Valid UserDto userDto) {
String jwcode = userDto.getJwcode(); String jwcode = userDto.getJwcode();
User user1 = adminUserMapper.selectByName(userDto.getUsername());
if (user1 != null) {
return false;
}
// 1. 查询是否已存在相同精网号的用户 // 1. 查询是否已存在相同精网号的用户
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getJwcode, jwcode); queryWrapper.eq(User::getJwcode, jwcode);

2
lottery-system/lottery-service/src/main/java/com/lottery/config/MybatisPageConfig.java

@ -25,7 +25,7 @@ public class MybatisPageConfig {
public PaginationInnerInterceptor paginationInnerInterceptor() { public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(); PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
// 设置最大单页限制数量默认 500 -1 不受限制 // 设置最大单页限制数量默认 500 -1 不受限制
paginationInterceptor.setMaxLimit(1000L);
paginationInterceptor.setMaxLimit(10000L);
paginationInterceptor.setDbType(DbType.MYSQL); paginationInterceptor.setDbType(DbType.MYSQL);
// 开启 count join 优化,只针对部分 left join // 开启 count join 优化,只针对部分 left join
paginationInterceptor.setOptimizeJoin(true); paginationInterceptor.setOptimizeJoin(true);

Loading…
Cancel
Save