From 24321390053ebee63a2858cfe8b6cf654e12cd56 Mon Sep 17 00:00:00 2001 From: willy <2462310981@qq.com> Date: Tue, 22 Jul 2025 14:22:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=BD=AF=E5=88=A0?= =?UTF-8?q?=E4=B9=8B=E5=90=8E=E7=9A=84=E7=BB=86=E8=8A=82=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=B8=80=E4=BA=9Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/lottery/utils/JwtUtil.java | 9 +- .../src/main/java/com/lottery/dto/FixUserDto.java | 5 + .../src/main/java/com/lottery/dto/GradeDto.java | 6 + .../src/main/java/com/lottery/dto/PrizeDto.java | 5 + .../admin/controller/AdminGradeController.java | 19 +-- .../admin/controller/AdminPrizeController.java | 32 +--- .../admin/controller/AdminUserController.java | 16 +- .../com/lottery/admin/mapper/AdminUserMapper.java | 11 ++ .../lottery/admin/service/AdminPrizeService.java | 4 +- .../lottery/admin/service/AdminUserService.java | 2 + .../admin/service/Impl/AdminPrizeServiceImpl.java | 28 +-- .../service/Impl/AdminUserDetailServiceImpl.java | 190 +++++++++++++++++---- .../admin/service/Impl/AdminUserServiceImpl.java | 115 ++++++++++--- .../api/service/Impl/UserDetailServiceImpl.java | 48 ++++-- .../src/main/resources/application.yml | 15 +- 15 files changed, 375 insertions(+), 130 deletions(-) diff --git a/lottery-system/lottery-common/src/main/java/com/lottery/utils/JwtUtil.java b/lottery-system/lottery-common/src/main/java/com/lottery/utils/JwtUtil.java index 463725d..6ba34a0 100644 --- a/lottery-system/lottery-common/src/main/java/com/lottery/utils/JwtUtil.java +++ b/lottery-system/lottery-common/src/main/java/com/lottery/utils/JwtUtil.java @@ -63,5 +63,12 @@ public class JwtUtil { .parseClaimsJws(token).getBody(); return claims; } - +// +// private static final String SECRET = "willy"; +// public static Claims parseToken(String token) { +// return Jwts.parser() +// .setSigningKey(SECRET) +// .parseClaimsJws(token) +// .getBody(); +// } } diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java index 87f3983..852ff6c 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/FixUserDto.java @@ -2,6 +2,8 @@ package com.lottery.dto; import lombok.Data; +import javax.validation.constraints.NotNull; + /** * @program: lottery * @ClassName WinUserDto @@ -13,9 +15,12 @@ import lombok.Data; @Data public class FixUserDto { + @NotNull(message = "用户名不能为空") private String username; + @NotNull(message = "精网号不能为空") private String jwcode; + @NotNull(message = "等级不能为空") private Long GradeId; } 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 f291316..3947197 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,6 +3,8 @@ package com.lottery.dto; import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; +import javax.validation.constraints.NotNull; + /** * @program: lottery-system * @ClassName GradeDto @@ -16,12 +18,16 @@ public class GradeDto { private Long id; + @NotNull(message = "等级名称不能为空") private String gradeName; // 等级名称 + @NotNull(message = "数量不能为空") private Integer amount; //等级数量 + @NotNull(message = "排序数不能为空") private Integer sort; + @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 b0b1706..f106288 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 @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; + /** * @program: lottery * @ClassName PrizeDto @@ -19,9 +21,12 @@ public class PrizeDto { private Long id; + @NotNull(message = "奖品名不能为空") private String prizeName; + @NotNull(message = "等级不能为空") private Long gradeId; + @NotNull(message = "请上传图片") private String imageUrl; } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java index b733452..02bb52d 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java @@ -17,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.Date; import java.util.List; @@ -66,18 +67,13 @@ public class AdminGradeController { } @PostMapping("/add") - public Result add(@RequestBody GradeDto gradeDto){ + public Result add(@RequestBody @Valid GradeDto gradeDto){ LOGGER.info("新增等级:{}", gradeDto); - if (gradeDto.getGradeName() == null || gradeDto.getAmount() == null|| - gradeDto.getSort() == null || gradeDto.getPerWin() == null) { - return Result.failure("所有字段都必须填写"); - } - // 修改自己等级会错误 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName()) - .eq(Grade::getIsDel, 0);; + .eq(Grade::getIsDel, 0); if (adminGradeService.count(queryWrapper) > 0) { return Result.failure("等级已存在,新增失败"); } @@ -90,20 +86,15 @@ public class AdminGradeController { @PostMapping("/update") public Result update(@RequestBody GradeDto gradeDto){ - if (gradeDto.getGradeName() == null || gradeDto.getAmount() == null|| - gradeDto.getSort() == null || gradeDto.getPerWin() == null) { - return Result.failure("所有字段都必须填写"); - } - LOGGER.info("修改等级:{}", gradeDto); if (adminGradeService.getById(gradeDto.getId())== null) { return Result.failure("修改的id不存在"); } - //TOdo 修改自己会失败 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Grade::getGradeName, gradeDto.getGradeName()) - .eq(Grade::getIsDel, 0); + .eq(Grade::getIsDel, 0) + .ne(Grade::getId, gradeDto.getId()); if (adminGradeService.count(queryWrapper) > 0) { return Result.failure("等级已存在,修改失败"); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java index fff108e..bb98c0c 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java @@ -11,6 +11,8 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; + /** * @program: lottery * @ClassName AdminPrizeController @@ -44,37 +46,22 @@ public class AdminPrizeController { //TODO 添加图片oss @PostMapping("/add") - public Result addPrize(@RequestBody PrizeDto prizeDto) { + public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) { LOGGER.info("新增奖品:{}", prizeDto); - if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| - prizeDto.getGradeId() == null) { - return Result.failure("所有字段都必须填写"); - } - if(!adminPrizeService.add(prizeDto)){ - return Result.failure("该等级下已有礼物"); - }; + //TODO 新增的时候选择不存在的等级,给前端返回错误信息 - return Result.success(); + return adminPrizeService.add(prizeDto); } @PostMapping("/update") - public Result updatePrize(@RequestBody PrizeDto prizeDto) { + public Result updatePrize(@RequestBody @Valid PrizeDto prizeDto) { LOGGER.info("修改奖品信息:{}",prizeDto); - if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| - prizeDto.getGradeId() == null) { - return Result.failure("所有字段都必须填写"); - } if (adminPrizeService.getById(prizeDto.getId())== null) { return Result.failure("修改的id不存在"); } - if(!adminPrizeService.updatePrize(prizeDto)){ - return Result.failure("该等级下已有礼物"); - }; - - //TODO 修改的时候选择不存在的等级,给前端返回错误信息 - return Result.success(); + return adminPrizeService.updatePrize(prizeDto); } @PostMapping("/delete") @@ -88,11 +75,8 @@ public class AdminPrizeController { //新增内定 @PostMapping("/addFixUser") - public Result addWinUser(@RequestBody FixUserDto fixUserDto) { + public Result addWinUser(@RequestBody @Valid FixUserDto fixUserDto) { - if (fixUserDto.getUsername() == null || fixUserDto.getJwcode() == null) { - return Result.failure("所有字段都必须填写"); - } return adminPrizeService.addWinUser(fixUserDto); } 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 78cc1c3..340ef8f 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 @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; @@ -44,6 +45,9 @@ public class AdminUserController { private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); + @Autowired + private com.lottery.propertise.jwtPropertice jwtPropertice; + @PostMapping("/add") public Result add(@RequestBody UserDto userDto) { @@ -82,7 +86,7 @@ public class AdminUserController { public Result deleteBatch(@RequestParam List ids) { LOGGER.info("批量删除用户:{}",ids); if (ids == null || ids.size() == 0) { - return Result.failure("ids is null"); + return Result.failure("请传入id"); } if (adminUserService.removeUserBatchByIds(ids)){ return Result.success(); @@ -164,4 +168,14 @@ public class AdminUserController { return adminUserDetailService.importFixUsers(file,gradeId); } + /** + * 退出 + * @return + */ + @PostMapping("/logout") + public Result logout(HttpServletRequest request) { + String token = request.getHeader(jwtPropertice.getUserTokenName()); + return adminUserService.logout(token); + } + } 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 7fad76b..89c4ae8 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 @@ -6,6 +6,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Update; +import java.util.Collection; +import java.util.List; import java.util.Set; /** @@ -26,4 +28,13 @@ public interface AdminUserMapper extends BaseMapper { @Update("update user set is_del = 1 where id = #{id}") void deleteUserById(Long id); + + @Select("SELECT jwcode, is_del as isDel FROM user") + List selectAllUserCodesWithDelStatus(); + + @Select("SELECT * FROM user WHERE jwcode = #{jwcode}") + User selectByJwCode(String jwcode); + + @Select("select * from user where jwcode = #{jwcode}") + User selectUserByJwcode(String jwcode); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java index c49827e..f467695 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminPrizeService.java @@ -19,9 +19,9 @@ import com.lottery.vo.PrizeVo; public interface AdminPrizeService extends IService { PageInfo pageListPrize(int pageNum, int pageSize); - boolean add(PrizeDto prizeDto); + Result add(PrizeDto prizeDto); - boolean updatePrize(PrizeDto prizeDto); + Result updatePrize(PrizeDto prizeDto); PrizeVo getPrizeById(Long id); diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java index 3801cde..130cf75 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java @@ -43,5 +43,7 @@ public interface AdminUserService extends IService { void removeUserById(Long id); boolean removeUserBatchByIds(List ids); + + Result logout(String token); } 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 3346c04..f0293f8 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 @@ -59,12 +59,11 @@ public class AdminPrizeServiceImpl extends ServiceImpl } @Override - public boolean add(PrizeDto prizeDto) { + public Result add(PrizeDto prizeDto) { // Long gradeId = prizeDto.getGradeId(); // Grade grade = adminGradeMapper.selectById(gradeId); // if (grade == null) { -//// return Result.failure("等级不存在"); -// throw new SomeException("heheh"); +// return Result.failure("等级不存在"); // } // 3. 检查该等级是否已有奖品 @@ -80,7 +79,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl // 1. 查询关联的等级(grade)状态 Grade grade = adminGradeMapper.selectById(prizeDto.getGradeId()); // 假设 gradeId 是传入的等级ID if (grade.getIsDel() == 1) { - return false; // 等级不存在,直接返回失败 + return Result.failure("等级不存在"); // 等级不存在,直接返回失败 } // 2. 检查逻辑:仅当等级未删除(is_del=0)且已存在奖品时,才拒绝添加 @@ -89,7 +88,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl wrapper.eq(Prize::getGradeId, prizeDto.getGradeId()) .eq(Prize::getIs_del, 0); // 只统计未删除的奖品; if (this.count(wrapper) > 0) { - return false; // 等级未删除且已有奖品,拒绝添加 + return Result.failure("该等级已有奖品"); // 等级未删除且已有奖品,拒绝添加 } } @@ -108,12 +107,15 @@ public class AdminPrizeServiceImpl extends ServiceImpl // grade.setUpdateTime(new Date()); // adminGradeMapper.updateById(grade); // } - return isPrizeSaved; + if (!isPrizeSaved) { + return Result.failure("未知错误,添加失败,122行"); + } + return Result.success(); } @Override @Transactional - public boolean updatePrize(PrizeDto prizeDto) { + public Result updatePrize(PrizeDto prizeDto) { Long gradeId = prizeDto.getGradeId(); Grade grade = adminGradeMapper.selectById(gradeId); @@ -121,19 +123,19 @@ public class AdminPrizeServiceImpl extends ServiceImpl // 1. 查询原奖品信息 Prize originalPrize = adminPrizeMapper.selectById(prizeDto.getId()); if (originalPrize == null) { - return false; // 原奖品不存在 + return Result.failure("奖品不存在"); // 原奖品不存在 } // 2. 查询目标等级信息 Grade targetGrade = adminGradeMapper.selectById(gradeId); if (targetGrade == null) { - return false; // 目标等级不存在 + return Result.failure("目标等级不存在"); // 目标等级不存在 } // :如果目标等级已删除(is_del=1),禁止修改 if (targetGrade.getIsDel() == 1) { - return false; // 目标等级已删除,不允许修改 + return Result.failure("目标等级不存在"); // 目标等级已删除,不允许修改 } // 3. 如果修改后的等级和原等级不同,检查目标等级是否已有奖品 @@ -141,7 +143,7 @@ public class AdminPrizeServiceImpl extends ServiceImpl LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Prize::getGradeId, targetGrade.getId()); if (this.count(wrapper) > 0) { - return false; // 目标等级已有奖品,不能修改 + return Result.failure("目标等级已有奖品,不能修改"); // 目标等级已有奖品,不能修改 } } // @@ -164,9 +166,9 @@ public class AdminPrizeServiceImpl extends ServiceImpl prize.setUpdateTime(new Date()); prize.setGradeId(grade.getId()); if (adminPrizeMapper.updateById(prize) > 0){ - return true; + return Result.success(); }; - return false; + return Result.failure("未知错误"); } @Override 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 87a1b93..506ab91 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 @@ -29,6 +29,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -138,6 +139,85 @@ public class AdminUserDetailServiceImpl extends ServiceImpl userDtos = EasyExcel.read(file.getInputStream()) +// .head(UserImportDto.class) +// .sheet() +// .doReadSync(); +// +// // 2. 准备数据集合 +// List newUsers = new ArrayList<>(); // 新用户(需要插入user表) +// List existingUsers = new ArrayList<>(); // 已存在用户(从数据库查询) +// List userDetails = new ArrayList<>(); +// Set processedCodes = new HashSet<>(); +// int successCount = 0; +// int skipCount = 0; +// +// // 3. 查询所有已存在的jwcode +// Set existingCodes = adminUserMapper.selectAllUserCodes(); +// +// for (int i = 0; i < userDtos.size(); i++) { +// UserImportDto dto = userDtos.get(i); +// try { +// validateUser(dto, i + 2, processedCodes); // 移除了existingCodes检查 +// +// // 检查用户是否已存在 +// if (existingCodes.contains(dto.getJwcode())) { +// // 用户已存在,查询用户信息 +//// User existingUser = adminUserMapper.selectByJwcode(dto.getJwcode()); +// Long userId = adminUserMapper.selectByJwcode(dto.getJwcode()); +// existingUsers.add(adminUserMapper.selectById(userId)); +// } else { +// // 用户不存在,创建新用户 +// User newUser = convertToEntity(dto); +// newUsers.add(newUser); +// } +// +// processedCodes.add(dto.getJwcode()); +// successCount++; +// } catch (IllegalArgumentException e) { +// LOGGER.warn("导入数据校验失败: {}", e.getMessage()); +// skipCount++; +// } +// } +// +// // 4. 批量保存新用户 +// if (!newUsers.isEmpty()) { +// adminUserService.saveBatch(newUsers); +// } +// +// // 5. 准备userDetail数据 (包括新用户和已存在用户) +// List allUsers = new ArrayList<>(); +// allUsers.addAll(newUsers); +// allUsers.addAll(existingUsers); +// +// for (User user : allUsers) { +// UserDetail detail = new UserDetail(); +// detail.setUserId(user.getId()); +// detail.setGradeId(gradeId); +// detail.setIsFixed(1); +// detail.setIsDel(0);// 标记为内定用户 +// userDetails.add(detail); +// } +// +// // 6. 批量保存userDetail +// if (!userDetails.isEmpty()) { +// this.saveBatch(userDetails); +// return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); +// } +// +// return Result.failure("没有有效数据可导入"); +// } catch (Exception e) { +// LOGGER.error("导入用户失败", e); +// return Result.failure("导入失败: " + e.getMessage()); +// } +// } + + @Override @Transactional(rollbackFor = Exception.class) public Result importFixUsers(MultipartFile file, Long gradeId) { @@ -149,73 +229,113 @@ public class AdminUserDetailServiceImpl extends ServiceImpl newUsers = new ArrayList<>(); // 新用户(需要插入user表) - List existingUsers = new ArrayList<>(); // 已存在用户(从数据库查询) - List userDetails = new ArrayList<>(); + List newUsers = new ArrayList<>(); // 需要新增到user表的用户 + List usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户 + List newUserDetails = new ArrayList<>(); // 新增的userDetail + List detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail + Set processedCodes = new HashSet<>(); int successCount = 0; int skipCount = 0; - // 3. 查询所有已存在的jwcode - Set existingCodes = adminUserMapper.selectAllUserCodes(); + // 3. 查询所有已存在的jwcode(user表) + Set existingJwCodes = adminUserMapper.selectAllUserCodes(); + + // 4. 查询所有已存在的user_detail记录(避免N+1查询) + Map existingDetails = adminUserDetailMapper.selectList(null) + .stream() + .collect(Collectors.toMap( + detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(), + detail -> detail + )); for (int i = 0; i < userDtos.size(); i++) { UserImportDto dto = userDtos.get(i); try { - validateUser(dto, i + 2, processedCodes); // 移除了existingCodes检查 - - // 检查用户是否已存在 - if (existingCodes.contains(dto.getJwcode())) { - // 用户已存在,查询用户信息 -// User existingUser = adminUserMapper.selectByJwcode(dto.getJwcode()); - Long userId = adminUserMapper.selectByJwcode(dto.getJwcode()); - existingUsers.add(adminUserMapper.selectById(userId)); + validateUser(dto, i + 2, processedCodes); + + // 检查是否已在当前文件中处理过 + if (processedCodes.contains(dto.getJwcode())) { + throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode()); + } + processedCodes.add(dto.getJwcode()); + + // 处理逻辑 + if (existingJwCodes.contains(dto.getJwcode())) { + // --- 用户已存在 --- + User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode()); + + // 检查user表状态 + if (existingUser.getIsDel() == 1) { + // user表已删除,恢复用户 + existingUser.setIsDel(0); + usersToRecover.add(existingUser); + } + + // 检查user_detail状态 + UserDetail existingDetail = existingDetails.get(dto.getJwcode()); + if (existingDetail != null) { + if (existingDetail.getIsDel() == 1) { + // user_detail已删除,恢复记录 + existingDetail.setIsDel(0); + existingDetail.setGradeId(gradeId); + detailsToRecover.add(existingDetail); + } else { + // user_detail已存在且未删除,跳过 + throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode()); + } + } else { + // user_detail不存在,新增 + newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); + } } else { - // 用户不存在,创建新用户 + // --- 全新用户 --- User newUser = convertToEntity(dto); newUsers.add(newUser); } - - processedCodes.add(dto.getJwcode()); successCount++; } catch (IllegalArgumentException e) { LOGGER.warn("导入数据校验失败: {}", e.getMessage()); skipCount++; } } - - // 4. 批量保存新用户 + // 5. 批量操作数据库 if (!newUsers.isEmpty()) { adminUserService.saveBatch(newUsers); + // 为新用户创建userDetail + newUsers.forEach(user -> + newUserDetails.add(createUserDetail(user.getId(), gradeId))); + } + + if (!usersToRecover.isEmpty()) { + adminUserService.updateBatchById(usersToRecover); } - // 5. 准备userDetail数据 (包括新用户和已存在用户) - List allUsers = new ArrayList<>(); - allUsers.addAll(newUsers); - allUsers.addAll(existingUsers); - - for (User user : allUsers) { - UserDetail detail = new UserDetail(); - detail.setUserId(user.getId()); - detail.setGradeId(gradeId); - detail.setIsFixed(1); - detail.setIsDel(0);// 标记为内定用户 - userDetails.add(detail); + if (!detailsToRecover.isEmpty()) { + this.updateBatchById(detailsToRecover); } - // 6. 批量保存userDetail - if (!userDetails.isEmpty()) { - this.saveBatch(userDetails); - return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); + if (!newUserDetails.isEmpty()) { + this.saveBatch(newUserDetails); } - return Result.failure("没有有效数据可导入"); + return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); } catch (Exception e) { LOGGER.error("导入用户失败", e); return Result.failure("导入失败: " + e.getMessage()); } } + // 辅助方法:创建UserDetail + private UserDetail createUserDetail(Long userId, Long gradeId) { + UserDetail detail = new UserDetail(); + detail.setUserId(userId); + detail.setGradeId(gradeId); + detail.setIsFixed(1); + detail.setIsDel(0); + return detail; + } + @Override public boolean removeFixUserById(Long id) { return adminUserDetailMapper.removeFixUserById(id) > 0; 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 492057f..989d09f 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 @@ -20,17 +20,21 @@ import com.lottery.entity.UserDetail; import com.lottery.entity.WinnerRecord; import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; +import com.lottery.utils.JwtUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.UserLoginVo; import com.lottery.vo.UserVo; +import io.jsonwebtoken.Claims; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.json.JSONObject; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.lottery.utils.HttpUtils.postUrlencoded; @@ -55,6 +59,11 @@ public class AdminUserServiceImpl extends ServiceImpl imp @Autowired private AdminWinMapper adminWinMapper; + @Autowired + private com.lottery.propertise.jwtPropertice jwtPropertice; + + @Autowired + private RedisTemplate redisTemplate; @Override public Result AdminUserlogin(AdminLogin adminLogin) { @@ -80,8 +89,11 @@ public class AdminUserServiceImpl extends ServiceImpl imp if (jsonResponse.getInt("code") == 200) { JSONObject data = jsonResponse.getJSONObject("data"); token = data.getString("token"); +// String username = data.getString("username"); + LOGGER.info("登录成功,Token:{} " ,token); + // 后续可以使用token调用其他API } else { LOGGER.error(jsonResponse.getString("msg")); @@ -95,6 +107,9 @@ public class AdminUserServiceImpl extends ServiceImpl imp UserLoginVo userLoginVo = new UserLoginVo(); userLoginVo.setUsername(adminLogin.getUsername()); userLoginVo.setToken(token); + //把token传入redis + redisTemplate.opsForValue().set(token, userLoginVo.getUsername(),2, TimeUnit.HOURS); + return Result.success(userLoginVo); } @@ -153,43 +168,81 @@ public class AdminUserServiceImpl extends ServiceImpl imp public Result importUsers(MultipartFile file) { try { - // 2. 解析Excel -// List userDtos = ExcelUtil.parseExcel(file, UserImportDto.class); + // 1. 解析Excel List userDtos = EasyExcel.read(file.getInputStream()) .head(UserImportDto.class) .sheet() .doReadSync(); - // 3. 数据校验和去重 - Set existingCodes = adminUserMapper.selectAllUserCodes(); // 查询已存在的精网号 - List users = new ArrayList<>(); + // 2. 获取已存在的精网号及其删除状态 + Map existingUserMap = adminUserMapper.selectAllUserCodesWithDelStatus() + .stream() + .collect(Collectors.toMap( + User::getJwcode, + User::getIsDel, // 保持 Integer + (existing, replacement) -> existing + )); + + List usersToAdd = new ArrayList<>(); + List usersToUpdate = new ArrayList<>(); Set processedCodes = new HashSet<>(); // 用于当前文件内的去重 for (int i = 0; i < userDtos.size(); i++) { UserImportDto dto = userDtos.get(i); try { - validateUser(dto, i + 2, existingCodes, processedCodes); // i+2对应Excel行号 - users.add(convertToEntity(dto)); + validateUser(dto, i + 2); // 基础校验 + + // 文件内去重 + if (processedCodes.contains(dto.getJwcode())) { + throw new IllegalArgumentException(String.format("第%d行: 精网号%s在当前文件中重复", i + 2, dto.getJwcode())); + } processedCodes.add(dto.getJwcode()); + + // 处理数据库中的重复情况 + if (existingUserMap.containsKey(dto.getJwcode())) { + Integer isDel = existingUserMap.get(dto.getJwcode()); + if (isDel == 1) { + // 已删除的用户,可以更新 + User existingUser = adminUserMapper.selectByJwCode(dto.getJwcode()); + User userToUpdate = convertToEntity(dto); + userToUpdate.setId(existingUser.getId()); + userToUpdate.setIsDel(0); // 恢复为未删除状态 + usersToUpdate.add(userToUpdate); + } else { + throw new IllegalArgumentException(String.format("第%d行: 精网号%s已存在", i + 2, dto.getJwcode())); + } + } else { + // 全新用户,直接添加 + usersToAdd.add(convertToEntity(dto)); + } } catch (IllegalArgumentException e) { LOGGER.warn("导入数据校验失败: {}", e.getMessage()); } } - // 4. 批量保存 - if (!users.isEmpty()) { - boolean success = this.saveBatch(users); - return success ? - Result.success(String.format("导入成功%d条,跳过%d条", users.size(), userDtos.size() - users.size())) : - Result.failure("部分数据导入失败"); + // 3. 执行数据库操作 + int successCount = 0; + if (!usersToAdd.isEmpty()) { + boolean addSuccess = this.saveBatch(usersToAdd); + successCount += addSuccess ? usersToAdd.size() : 0; + } + if (!usersToUpdate.isEmpty()) { + boolean updateSuccess = this.updateBatchById(usersToUpdate); + successCount += updateSuccess ? usersToUpdate.size() : 0; } - return Result.failure("没有有效数据可导入"); + + int skipCount = userDtos.size() - usersToAdd.size() - usersToUpdate.size(); + return successCount > 0 ? + Result.success(String.format("导入成功%d条(新增%d条,更新%d条),跳过%d条", + successCount, usersToAdd.size(), usersToUpdate.size(), skipCount)) : + Result.failure("没有有效数据可导入"); } catch (Exception e) { LOGGER.error("导入用户失败", e); return Result.failure("导入失败: " + e.getMessage()); } } + @Override public void removeUserById(Long id) { //关联删除user_detail @@ -221,6 +274,24 @@ public class AdminUserServiceImpl extends ServiceImpl imp return this.update(updateWrapper); } + @Override + public Result logout(String token) { + + if (StringUtils.isBlank(token)) { + return Result.failure("Token为空"); + } + + String username = redisTemplate.opsForValue().get(token); + if (StringUtils.isBlank(username)) { + return Result.failure("无效的Token"); + } + + redisTemplate.delete(token); + return Result.success("登出成功"); + } + + + private User convertToEntity(UserImportDto dto) { User user = new User(); user.setJwcode(dto.getJwcode()); @@ -234,7 +305,7 @@ public class AdminUserServiceImpl extends ServiceImpl imp return user; } - private void validateUser(UserImportDto dto, int rowNum, Set existingCodes, Set processedCodes) { + private void validateUser(UserImportDto dto, int rowNum) { if (StringUtils.isBlank(dto.getJwcode())) { throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空"); } @@ -243,13 +314,13 @@ public class AdminUserServiceImpl extends ServiceImpl imp throw new IllegalArgumentException("第" + rowNum + "行: 姓名不能为空"); } - if (existingCodes.contains(dto.getJwcode())) { - throw new IllegalArgumentException("第" + rowNum + "行: 精网号已存在"); - } - - if (processedCodes.contains(dto.getJwcode())) { - throw new IllegalArgumentException("第" + rowNum + "行: 精网号在当前文件中重复"); - } +// if (existingCodes.contains(dto.getJwcode())) { +// throw new IllegalArgumentException("第" + rowNum + "行: 精网号已存在"); +// } +// +// if (processedCodes.contains(dto.getJwcode())) { +// throw new IllegalArgumentException("第" + rowNum + "行: 精网号在当前文件中重复"); + // } } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java index 16ac47a..df553c2 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserDetailServiceImpl.java @@ -3,6 +3,7 @@ package com.lottery.api.service.Impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.admin.controller.AdminPrizeController; import com.lottery.admin.mapper.AdminPrizeMapper; import com.lottery.admin.mapper.AdminWinMapper; import com.lottery.api.mapper.IGradeMapper; @@ -17,6 +18,8 @@ import com.lottery.entity.WinnerRecord; import com.lottery.exception.SomeException; import com.lottery.vo.UserVo; import com.lottery.vo.LotteryVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -266,21 +269,46 @@ public class UserDetailServiceImpl extends ServiceImpl winners, StartLotteryDto startLotteryDto) { for (User user : winners) { - user.setIsWin(1); // 1表示已中奖 - - //把中奖的用户添加到中奖表里面 -// WinnerRecord winnerRecord = new WinnerRecord(); -// winnerRecord.setUserId(user.getId()); + // 1. 检查该用户是否已有有效中奖记录(is_del=0) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WinnerRecord::getUserId, user.getId()) + .eq(WinnerRecord::getIsDel, 0); // 只查询未删除的记录 + + if (adminWinMapper.selectCount(queryWrapper) > 0) { + LOGGER.warn("用户已存在有效中奖记录,跳过插入: userId={}", user.getId()); + continue; // 已有有效记录,跳过插入 + } - WinnerRecord winnerRecord = WinnerRecord.builder() - .userId(user.getId()) - .winTime(new Date()) - .prizeId(startLotteryDto.getPrizeId()).build(); + // 2. 检查是否存在已删除的记录(is_del=1) + LambdaQueryWrapper deletedQuery = new LambdaQueryWrapper<>(); + deletedQuery.eq(WinnerRecord::getUserId, user.getId()) + .eq(WinnerRecord::getIsDel, 1); // 查询已删除的记录 + + WinnerRecord existingRecord = adminWinMapper.selectOne(deletedQuery); + + if (existingRecord != null) { + // 3. 如果存在已删除记录,则更新该记录 + existingRecord.setIsDel(0); // 恢复记录 + existingRecord.setWinTime(new Date()); + existingRecord.setPrizeId(startLotteryDto.getPrizeId()); + adminWinMapper.updateById(existingRecord); + } else { + // 4. 如果不存在任何记录,则插入新记录 + WinnerRecord winnerRecord = WinnerRecord.builder() + .userId(user.getId()) + .winTime(new Date()) + .prizeId(startLotteryDto.getPrizeId()) + .isDel(0) // 明确设置为未删除 + .build(); + adminWinMapper.insert(winnerRecord); + } - adminWinMapper.insert(winnerRecord); + // 5. 更新用户中奖状态 + user.setIsWin(1); userMapper.updateById(user); } } diff --git a/lottery-system/lottery-service/src/main/resources/application.yml b/lottery-system/lottery-service/src/main/resources/application.yml index 7ca4a34..f0e242f 100644 --- a/lottery-system/lottery-service/src/main/resources/application.yml +++ b/lottery-system/lottery-service/src/main/resources/application.yml @@ -26,14 +26,13 @@ spring: host: 39.98.127.73 port: 7001 password: 2TOVfFeJ0pyi9Wtj - database: 0 # 默认DB索引 - jedis: + database: 8 # 默认DB索引 + lettuce: pool: - max-active: 8 # 最大连接数 - max-wait: 5000ms # 最大等待时间 - max-idle: 4 # 最大空闲连接 - min-idle: 1 # 最小空闲连接 - timeout: 3000ms # 连接超时时间 + max-active: 100 # 最大连接数 + max-wait: 300 # 最大等待时间 + max-idle: 20 # 最大空闲连接 + min-idle: 10 # 最小空闲连接 # ========== MyBatis 配置(如果使用MyBatis代替JPA) ========== @@ -57,7 +56,7 @@ lottery: #用户端JWT user-secret-key: willier_need_at_least_32_chars_secure_key_12345 user-ttl: 7200000 - user-token-name: authentication + user-token-name: token max-draw-times: 3 # 用户每日最大抽奖次数 From e816e4e7abe4e03e3317bb4c5f2d24848ffffe0e Mon Sep 17 00:00:00 2001 From: willy <2462310981@qq.com> Date: Tue, 22 Jul 2025 14:28:37 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=B0=8F=E4=BF=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lottery-pojo/src/main/java/com/lottery/dto/UserDto.java | 4 ++++ .../java/com/lottery/admin/controller/AdminUserController.java | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) 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 1a90973..3ebb13b 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 @@ -3,6 +3,8 @@ package com.lottery.dto; import lombok.Builder; import lombok.Data; +import javax.validation.constraints.NotNull; + /** * @program: lottery * @ClassName UserDto @@ -17,7 +19,9 @@ import lombok.Data; public class UserDto { private int id; + @NotNull(message = "用户名不能为空") private String username; + @NotNull(message = "精网号不能为空") private String jwcode; } 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 340ef8f..1493603 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 @@ -21,6 +21,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; @@ -49,12 +50,9 @@ public class AdminUserController { private com.lottery.propertise.jwtPropertice jwtPropertice; @PostMapping("/add") - public Result add(@RequestBody UserDto userDto) { + public Result add(@RequestBody @Valid UserDto userDto) { LOGGER.info("新增用户:{}",userDto); - if (userDto.getUsername() == null || userDto.getJwcode() == null) { - return Result.failure("所有字段都必须填写"); - } if (!adminUserService.addUser(userDto)){ return Result.failure("精网号已存在,无法添加"); } @@ -174,6 +172,7 @@ public class AdminUserController { */ @PostMapping("/logout") public Result logout(HttpServletRequest request) { + LOGGER.info("用户登出"); String token = request.getHeader(jwtPropertice.getUserTokenName()); return adminUserService.logout(token); } From a44782a72bcb4f5e0c6afd6a3cf82adea1cadae1 Mon Sep 17 00:00:00 2001 From: willy <2462310981@qq.com> Date: Tue, 22 Jul 2025 17:49:29 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=95=B4=E7=90=86?= =?UTF-8?q?=E5=AE=8C=E5=89=8D=E7=AB=AF=E5=8F=8D=E9=A6=88=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/lottery/dto/PageSimpleDto.java | 19 ++ .../admin/controller/AdminGradeController.java | 15 +- .../admin/controller/AdminPrizeController.java | 15 +- .../com/lottery/admin/service/AdminWinService.java | 3 + .../admin/service/Impl/AdminGradeServiceImpl.java | 3 +- .../admin/service/Impl/AdminPrizeServiceImpl.java | 45 ++- .../service/Impl/AdminUserDetailServiceImpl.java | 349 ++++++++++++++------- .../admin/service/Impl/AdminUserServiceImpl.java | 4 +- .../admin/service/Impl/AdminWinServiceImpl.java | 8 +- .../lottery/api/controller/WinUserController.java | 40 +++ .../lottery/api/service/Impl/UserServiceImpl.java | 6 +- .../api/service/Impl/WinUserServiceImpl.java | 15 + .../com/lottery/api/service/WinUserService.java | 14 + .../main/java/com/lottery/config/CorsConfig.java | 11 +- .../src/main/resources/mapper/api/prizeMapper.xml | 2 +- 15 files changed, 402 insertions(+), 147 deletions(-) create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java new file mode 100644 index 0000000..a2e90b2 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PageSimpleDto.java @@ -0,0 +1,19 @@ +package com.lottery.dto; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName PageSimpleDto + * @description: + * @author: wwl + * @create: 2025-07-22 16:50 + * @Version 1.0 + **/ +@Data +public class PageSimpleDto { + + private Integer pageNum; + + private Integer pageSize; +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java index 02bb52d..79b1b54 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminGradeController.java @@ -3,6 +3,7 @@ package com.lottery.admin.controller; import com.lottery.admin.mapper.AdminGradeMapper; import com.lottery.admin.service.AdminGradeService; import com.lottery.dto.GradeDto; +import com.lottery.dto.PageSimpleDto; import com.lottery.entity.Grade; import com.lottery.exception.SomeException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -46,11 +47,17 @@ public class AdminGradeController { @PostMapping("/list") - public Result> selectGrade( @RequestParam(defaultValue = "1") Integer pageNum, - @RequestParam(defaultValue = "10") Integer pageSize){ - LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageNum, pageSize); + public Result> selectGrade(@RequestBody PageSimpleDto pageSimpleDto){ + if (pageSimpleDto.getPageNum() == null) { + pageSimpleDto.setPageNum(1); + } + if (pageSimpleDto.getPageSize() == null) { + pageSimpleDto.setPageSize(10); + } + + LOGGER.info("列分页查询等级表, 页码: {}, 每页大小: {}", pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); - PageInfo pageSelectGrade = adminGradeService.pageSelectGrade(pageNum, pageSize); + PageInfo pageSelectGrade = adminGradeService.pageSelectGrade(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); return Result.success(pageSelectGrade); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java index bb98c0c..8b8bd37 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminPrizeController.java @@ -1,6 +1,7 @@ package com.lottery.admin.controller; import com.lottery.admin.service.AdminPrizeService; +import com.lottery.dto.PageSimpleDto; import com.lottery.dto.PrizeDto; import com.lottery.dto.FixUserDto; import com.lottery.result.Result; @@ -31,10 +32,16 @@ public class AdminPrizeController { private final static Logger LOGGER = LoggerFactory.getLogger(AdminPrizeController.class); @PostMapping("list") - public Result> listPrize(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize) { - LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageNum, pageSize); + public Result> listPrize(@RequestBody PageSimpleDto pageSimpleDto) { + if (pageSimpleDto.getPageNum() == null) { + pageSimpleDto.setPageNum(1); + } + if (pageSimpleDto.getPageSize() == null) { + pageSimpleDto.setPageSize(10); + } + LOGGER.info("列分页查询l礼品表, 页码: {}, 每页大小: {}", pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); - PageInfo pageInfo = adminPrizeService.pageListPrize(pageNum, pageSize); + PageInfo pageInfo = adminPrizeService.pageListPrize(pageSimpleDto.getPageNum(), pageSimpleDto.getPageSize()); return Result.success(pageInfo); } @@ -48,8 +55,6 @@ public class AdminPrizeController { @PostMapping("/add") public Result addPrize(@RequestBody @Valid PrizeDto prizeDto) { LOGGER.info("新增奖品:{}", prizeDto); - - //TODO 新增的时候选择不存在的等级,给前端返回错误信息 return adminPrizeService.add(prizeDto); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java index 9cf50ae..0cadb53 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminWinService.java @@ -3,6 +3,7 @@ package com.lottery.admin.service; import com.baomidou.mybatisplus.extension.service.IService; import com.lottery.dto.WinUserQueryDto; import com.lottery.entity.WinnerRecord; +import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.WinUserVo; @@ -26,4 +27,6 @@ public interface AdminWinService extends IService { PageInfo listWinUser(int pageNum, int pageSize, WinUserQueryDto winUserQueryDto); void exportWinUser(WinUserQueryDto winUserQueryDto, HttpServletResponse response) throws IOException; + + PageInfo listWinUserWin(); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java index 792635f..ebdd90b 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminGradeServiceImpl.java @@ -74,7 +74,8 @@ public class AdminGradeServiceImpl extends ServiceImpl LambdaQueryWrapper gradeLambdaQueryWrapper = new LambdaQueryWrapper<>(); gradeLambdaQueryWrapper.eq(Grade::getIsDel, 0); - gradeLambdaQueryWrapper.orderByDesc(Grade::getSort); + gradeLambdaQueryWrapper.orderByDesc(Grade::getSort) + .orderByAsc(Grade::getId); //sort一样按照id排序 Page gradePage = this.page(page, gradeLambdaQueryWrapper); List gradeVos = ConvertBeanUtil.convertList(gradePage.getRecords(), GradeVo.class); 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 f0293f8..b739229 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 @@ -232,26 +232,51 @@ public class AdminPrizeServiceImpl extends ServiceImpl // 2. 检查该等级下是否已存在未删除的内定用户 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(UserDetail::getGradeId, gradeId) -// .eq(UserDetail::getIsFixed, 1) + wrapper.eq(UserDetail::getUserId, userId) + .eq(UserDetail::getIsFixed, 1) //已经内定的用户不能内定 .eq(UserDetail::getIsDel, 0); // 只检查未删除的记录 if (adminUserDetailMapper.selectCount(wrapper) > 0) { - return Result.failure("该等级下已存在内定用户,不可重复添加"); + return Result.failure("该用户已是其他等级的内定用户,一个用户只能内定一个等级"); } - // 3. 检查是否存在已删除的内定用户(is_del=1) +// // 检查该等级下是否已存在未删除的内定用户 +// LambdaQueryWrapper gradeWrapper = new LambdaQueryWrapper<>(); +// gradeWrapper.eq(UserDetail::getGradeId, gradeId) +// .eq(UserDetail::getIsFixed, 1) +// .eq(UserDetail::getIsDel, 0); +// +// if (adminUserDetailMapper.selectCount(gradeWrapper) > 0) { +// return Result.failure("该等级下已存在内定用户"); +// } + +// // 3. 检查是否存在已删除的内定用户(is_del=1) +// LambdaQueryWrapper deletedWrapper = new LambdaQueryWrapper<>(); +// deletedWrapper.eq(UserDetail::getGradeId, gradeId) +// .eq(UserDetail::getIsFixed, 1) +// .eq(UserDetail::getIsDel, 1) +// .last("LIMIT 1"); // 只取第一条 +// +// UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper); +// if (deletedUserDetail != null) { +// // 如果存在已删除的记录,先物理删除 +// adminUserDetailMapper.deleteById(deletedUserDetail.getId()); +// } + // 3. 检查该等级下是否存在已删除的内定用户(is_del=1),并全部物理删除 LambdaQueryWrapper deletedWrapper = new LambdaQueryWrapper<>(); deletedWrapper.eq(UserDetail::getGradeId, gradeId) .eq(UserDetail::getIsFixed, 1) - .eq(UserDetail::getIsDel, 1); - - UserDetail deletedUserDetail = adminUserDetailMapper.selectOne(deletedWrapper); - if (deletedUserDetail != null) { - // 如果存在已删除的记录,先物理删除 - adminUserDetailMapper.deleteById(deletedUserDetail.getId()); + .eq(UserDetail::getIsDel, 1); // 查询所有已删除的内定用户 + + List deletedDetails = adminUserDetailMapper.selectList(deletedWrapper); + if (!deletedDetails.isEmpty()) { + // 批量删除所有已标记为删除的记录 + deletedDetails.forEach(deletedUserDetail -> { + adminUserDetailMapper.deleteById(deletedUserDetail.getId()); + }); } + // 4. 添加新内定用户 UserDetail userDetail = new UserDetail(); userDetail.setUserId(userId); 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 506ab91..3489e3f 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 @@ -58,74 +58,83 @@ public class AdminUserDetailServiceImpl extends ServiceImpl listFixUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { - -// //查UserDetail表吧所有的userid取出来,然后在从user表根据id查就行了。 -// List list = this.list(); -// List UserIds = list.stream().map(UserDetail::getUserId).collect(Collectors.toList()); -// -// Page page = new Page<>(pageNum, pageSize); // -// //user表根据id批量查询 -// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); -// queryWrapper.in(User::getId, UserIds); +// // 如果没有有效用户,返回空分页结果 +// if (CollectionUtils.isEmpty(validUserIds)) { +// return emptyPageInfo(pageNum, pageSize); +// } // +// // 2. 构建用户表查询条件 +// LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); +// userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内 // +// // 添加动态查询条件 // if (StringUtils.isNotBlank(userQueryDto.getUsername())) { -// queryWrapper.like(User::getUsername, userQueryDto.getUsername()); +// userWrapper.like(User::getUsername, userQueryDto.getUsername()); // } -// if(StringUtils.isNotBlank(userQueryDto.getJwcode())){ -// queryWrapper.like(User::getPassword, userQueryDto.getJwcode()); +// if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { +// userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配 // } // -// Page userPage = this.adminUserMapper.selectPage(page, queryWrapper); -// List userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class); -// return PageInfo.of(userPage, userVolist); +// // 3. 执行分页查询 +// Page page = new Page<>(pageNum, pageSize); +// Page userPage = adminUserMapper.selectPage(page, userWrapper); +// +// // 4. 转换为VO对象 +// List userVoList = userPage.getRecords().stream() +// .map(user -> { +// UserVo vo = new UserVo(); +// // 这里做属性拷贝,可以使用BeanUtils或MapStruct等工具 +// vo.setId(user.getId()); +// vo.setUsername(user.getUsername()); +// // ...其他字段拷贝 +// return vo; +// }) +// .collect(Collectors.toList()); +// +// // 5. 构建分页结果 +// return PageInfo.of(userPage, userVoList); - // 1. 先查询有效的用户ID列表(过滤掉 is_del = 1 的记录) + // 1. 查询有效的用户详情记录(过滤掉 is_del = 1 的记录) LambdaQueryWrapper detailWrapper = new LambdaQueryWrapper<>(); - detailWrapper.select(UserDetail::getUserId) // 只查询user_id字段 - .eq(UserDetail::getIsDel, 0); // 未删除的记录 + detailWrapper.eq(UserDetail::getIsDel, 0); // 未删除的记录 - List validUserIds = this.list(detailWrapper) - .stream() - .map(UserDetail::getUserId) - .collect(Collectors.toList()); + // 2. 执行分页查询(直接查询UserDetail表) + Page detailPage = new Page<>(pageNum, pageSize); + Page detailPageResult = adminUserDetailMapper.selectPage(detailPage, detailWrapper); - // 如果没有有效用户,返回空分页结果 - if (CollectionUtils.isEmpty(validUserIds)) { + // 3. 如果没有数据,返回空分页结果 + if (CollectionUtils.isEmpty(detailPageResult.getRecords())) { return emptyPageInfo(pageNum, pageSize); } - // 2. 构建用户表查询条件 - LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); - userWrapper.in(User::getId, validUserIds); // 限定在有效用户范围内 - - // 添加动态查询条件 - if (StringUtils.isNotBlank(userQueryDto.getUsername())) { - userWrapper.like(User::getUsername, userQueryDto.getUsername()); - } - if (StringUtils.isNotBlank(userQueryDto.getJwcode())) { - userWrapper.like(User::getJwcode, userQueryDto.getJwcode()); // 注意字段名是否匹配 - } + // 4. 批量获取关联的User信息 + List userIds = detailPageResult.getRecords().stream() + .map(UserDetail::getUserId) + .collect(Collectors.toList()); - // 3. 执行分页查询 - Page page = new Page<>(pageNum, pageSize); - Page userPage = adminUserMapper.selectPage(page, userWrapper); + Map userMap = adminUserMapper.selectBatchIds(userIds).stream() + .collect(Collectors.toMap(User::getId, Function.identity())); - // 4. 转换为VO对象 - List userVoList = userPage.getRecords().stream() - .map(user -> { + // 5. 构建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); + // 6. 构建分页结果 + return PageInfo.of(detailPageResult, userVoList); } // 返回空分页结果的辅助方法 @@ -221,6 +230,141 @@ public class AdminUserDetailServiceImpl extends ServiceImpl userDtos = EasyExcel.read(file.getInputStream()) +// .head(UserImportDto.class) +// .sheet() +// .doReadSync(); +// +// // 2. 准备数据集合 +// List newUsers = new ArrayList<>(); // 需要新增到user表的用户 +// List usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户 +// List newUserDetails = new ArrayList<>(); // 新增的userDetail +// List detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail +// +// Set processedCodes = new HashSet<>(); +// int successCount = 0; +// int skipCount = 0; +// +// // 3. 查询所有已存在的jwcode(user表) +// Set existingJwCodes = adminUserMapper.selectAllUserCodes(); +// +// // 4. 查询所有已存在的user_detail记录(避免N+1查询) +// Map existingDetails = adminUserDetailMapper.selectList(null) +// .stream() +// .collect(Collectors.toMap( +// detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(), +// detail -> detail +// )); +// +// for (int i = 0; i < userDtos.size(); i++) { +// UserImportDto dto = userDtos.get(i); +// try { +// validateUser(dto, i + 2, processedCodes); +// +// // 检查是否已在当前文件中处理过 +// if (processedCodes.contains(dto.getJwcode())) { +// throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode()); +// } +// processedCodes.add(dto.getJwcode()); +// +// // 处理逻辑 +// if (existingJwCodes.contains(dto.getJwcode())) { +// // --- 用户已存在 --- +// User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode()); +// +// // 检查user表状态 +// if (existingUser.getIsDel() == 1) { +// // user表已删除,恢复用户 +// existingUser.setIsDel(0); +// usersToRecover.add(existingUser); +// } +// +//// // 检查user_detail状态 +//// UserDetail existingDetail = existingDetails.get(dto.getJwcode()); +//// if (existingDetail != null) { +//// if (existingDetail.getIsDel() == 1) { +//// // user_detail已删除,恢复记录 +//// existingDetail.setIsDel(0); +//// existingDetail.setGradeId(gradeId); +//// detailsToRecover.add(existingDetail); +//// } else { +//// // user_detail已存在且未删除,跳过 +//// throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode()); +//// } +//// } else { +//// // user_detail不存在,新增 +//// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); +//// } +//// } else { +//// // --- 全新用户 --- +//// User newUser = convertToEntity(dto); +//// newUsers.add(newUser); +//// } +//// successCount++; +//// } catch (IllegalArgumentException e) { +//// LOGGER.warn("导入数据校验失败: {}", e.getMessage()); +//// skipCount++; +//// } +//// } +// // 检查用户是否已经是其他等级的内定用户 +// UserDetail existingFixedDetail = existingDetails.get(existingUser.getId()); +// if (existingFixedDetail != null) { +// if (existingFixedDetail.getGradeId().equals(gradeId)) { +// // 已经是当前等级的内定用户 +// if (existingFixedDetail.getIsDel() == 1) { +// // 恢复已删除的记录 +// existingFixedDetail.setIsDel(0); +// detailsToRecover.add(existingFixedDetail); +// } else { +// throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode()); +// } +// } else { +// // 已经是其他等级的内定用户 +// throw new IllegalArgumentException("用户已是其他等级的内定用户,无法添加到本等级: " + dto.getJwcode()); +// } +// } else { +// // 不是任何等级的内定用户,可以添加 +// newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); +// } +// } else { +// // --- 全新用户 --- +// User newUser = convertToEntity(dto); +// newUsers.add(newUser); +// } +// successCount++; +// } catch (IllegalArgumentException e) { +// LOGGER.warn("导入数据校验失败: {}", e.getMessage()); +// skipCount++; +// } +// } +// // 5. 批量操作数据库 +// if (!newUsers.isEmpty()) { +// adminUserService.saveBatch(newUsers); +// // 为新用户创建userDetail +// newUsers.forEach(user -> +// newUserDetails.add(createUserDetail(user.getId(), gradeId))); +// } +// +// if (!usersToRecover.isEmpty()) { +// adminUserService.updateBatchById(usersToRecover); +// } +// +// if (!detailsToRecover.isEmpty()) { +// this.updateBatchById(detailsToRecover); +// } +// +// if (!newUserDetails.isEmpty()) { +// this.saveBatch(newUserDetails); +// } +// +// return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); +// } catch (Exception e) { +// LOGGER.error("导入用户失败", e); +// return Result.failure("导入失败: " + e.getMessage()); +// } + try { // 1. 解析Excel List userDtos = EasyExcel.read(file.getInputStream()) @@ -228,100 +372,69 @@ public class AdminUserDetailServiceImpl extends ServiceImpl newUsers = new ArrayList<>(); // 需要新增到user表的用户 - List usersToRecover = new ArrayList<>(); // 需要恢复的已删除用户 - List newUserDetails = new ArrayList<>(); // 新增的userDetail - List detailsToRecover = new ArrayList<>(); // 需要恢复的userDetail - - Set processedCodes = new HashSet<>(); int successCount = 0; int skipCount = 0; - - // 3. 查询所有已存在的jwcode(user表) - Set existingJwCodes = adminUserMapper.selectAllUserCodes(); - - // 4. 查询所有已存在的user_detail记录(避免N+1查询) - Map existingDetails = adminUserDetailMapper.selectList(null) - .stream() - .collect(Collectors.toMap( - detail -> adminUserMapper.selectById(detail.getUserId()).getJwcode(), - detail -> detail - )); + Set processedCodes = new HashSet<>(); for (int i = 0; i < userDtos.size(); i++) { UserImportDto dto = userDtos.get(i); try { validateUser(dto, i + 2, processedCodes); + processedCodes.add(dto.getJwcode()); - // 检查是否已在当前文件中处理过 - if (processedCodes.contains(dto.getJwcode())) { - throw new IllegalArgumentException("精网号在当前文件中重复: " + dto.getJwcode()); + // 2. 查询用户是否存在(按jwcode) + User user = adminUserMapper.selectUserByJwcode(dto.getJwcode()); + if (user == null) { + // 新增用户 + user = convertToEntity(dto); + adminUserMapper.insert(user); + } else if (user.getIsDel() == 1) { + // 恢复已删除用户 + user.setIsDel(0); + adminUserMapper.updateById(user); } - processedCodes.add(dto.getJwcode()); - // 处理逻辑 - if (existingJwCodes.contains(dto.getJwcode())) { - // --- 用户已存在 --- - User existingUser = adminUserMapper.selectUserByJwcode(dto.getJwcode()); + // 3. 检查用户是否已经是其他等级的内定用户(全局检查) + LambdaQueryWrapper globalCheckWrapper = new LambdaQueryWrapper<>(); + globalCheckWrapper.eq(UserDetail::getUserId, user.getId()) + .eq(UserDetail::getIsFixed, 1) + .eq(UserDetail::getIsDel, 0) + .ne(UserDetail::getGradeId, gradeId); // 排除当前等级 - // 检查user表状态 - if (existingUser.getIsDel() == 1) { - // user表已删除,恢复用户 - existingUser.setIsDel(0); - usersToRecover.add(existingUser); - } + if (adminUserDetailMapper.selectCount(globalCheckWrapper) > 0) { + throw new IllegalArgumentException("用户已是其他等级的内定用户,无法重复内定: " + dto.getJwcode()); + } - // 检查user_detail状态 - UserDetail existingDetail = existingDetails.get(dto.getJwcode()); - if (existingDetail != null) { - if (existingDetail.getIsDel() == 1) { - // user_detail已删除,恢复记录 - existingDetail.setIsDel(0); - existingDetail.setGradeId(gradeId); - detailsToRecover.add(existingDetail); - } else { - // user_detail已存在且未删除,跳过 - throw new IllegalArgumentException("用户已存在且未删除: " + dto.getJwcode()); - } + // 3. 检查是否已是当前gradeId的内定用户 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserDetail::getUserId, user.getId()) + .eq(UserDetail::getGradeId, gradeId) + .eq(UserDetail::getIsFixed, 1); + + UserDetail existingDetail = adminUserDetailMapper.selectOne(wrapper); + if (existingDetail != null) { + if (existingDetail.getIsDel() == 0) { + throw new IllegalArgumentException("用户已是当前等级的内定用户: " + dto.getJwcode()); } else { - // user_detail不存在,新增 - newUserDetails.add(createUserDetail(existingUser.getId(), gradeId)); + // 物理删除旧记录,再新增一条 + adminUserDetailMapper.deleteById(existingDetail.getId()); } - } else { - // --- 全新用户 --- - User newUser = convertToEntity(dto); - newUsers.add(newUser); } + + // 4. 新增内定记录 + UserDetail newDetail = createUserDetail(user.getId(), gradeId); + adminUserDetailMapper.insert(newDetail); successCount++; + } catch (IllegalArgumentException e) { - LOGGER.warn("导入数据校验失败: {}", e.getMessage()); + LOGGER.warn("导入失败(行{}): {}", i + 2, e.getMessage()); skipCount++; } } - // 5. 批量操作数据库 - if (!newUsers.isEmpty()) { - adminUserService.saveBatch(newUsers); - // 为新用户创建userDetail - newUsers.forEach(user -> - newUserDetails.add(createUserDetail(user.getId(), gradeId))); - } - - if (!usersToRecover.isEmpty()) { - adminUserService.updateBatchById(usersToRecover); - } - - if (!detailsToRecover.isEmpty()) { - this.updateBatchById(detailsToRecover); - } - - if (!newUserDetails.isEmpty()) { - this.saveBatch(newUserDetails); - } return Result.success(String.format("导入成功%d条,跳过%d条", successCount, skipCount)); } catch (Exception e) { - LOGGER.error("导入用户失败", e); + LOGGER.error("导入失败", e); return Result.failure("导入失败: " + e.getMessage()); } } 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 989d09f..1f43e9b 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 @@ -281,12 +281,12 @@ public class AdminUserServiceImpl extends ServiceImpl imp return Result.failure("Token为空"); } - String username = redisTemplate.opsForValue().get(token); + String username = redisTemplate.opsForValue().get("token:" + token); if (StringUtils.isBlank(username)) { return Result.failure("无效的Token"); } - redisTemplate.delete(token); + redisTemplate.delete("token:" + token); return Result.success("登出成功"); } 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 78b8fa6..ed3fad6 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 @@ -19,6 +19,7 @@ import com.lottery.dto.UserQueryDto; import com.lottery.dto.WinUserExportDto; import com.lottery.dto.WinUserQueryDto; import com.lottery.entity.*; +import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.UserVo; @@ -64,7 +65,7 @@ public class AdminWinServiceImpl extends ServiceImpl recordWrapper = new LambdaQueryWrapper<>(); - recordWrapper.eq(WinnerRecord::getIsDel, 0); + recordWrapper.eq(WinnerRecord::getIsDel, 0).orderByDesc(WinnerRecord::getWinTime); if (StringUtils.isNotBlank(winUserQueryDto.getUsername())){ // 需要关联用户表查询用户名 @@ -181,6 +182,11 @@ public class AdminWinServiceImpl extends ServiceImpl listWinUserWin() { + return this.listWinUser(1, Integer.MAX_VALUE, new WinUserQueryDto()); + } + // Vo 转 ExportDto 的转换方法 private List convertToExportDto(List voList) { diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java new file mode 100644 index 0000000..084a642 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/WinUserController.java @@ -0,0 +1,40 @@ +package com.lottery.api.controller; + +import com.lottery.admin.mapper.AdminUserMapper; +import com.lottery.admin.service.AdminWinService; +import com.lottery.api.service.WinUserService; +import com.lottery.result.Result; +import com.lottery.vo.PageInfo; +import com.lottery.vo.WinUserVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.logging.Logger; + +/** + * @program: lottery + * @ClassName WinUserController + * @description: + * @author: wwl + * @create: 2025-07-22 15:05 + * @Version 1.0 + **/ +@RestController +@RequestMapping("/api/winUser") +public class WinUserController { + + private final static Logger LOGGER = Logger.getLogger(WinUserController.class.getName()); + + @Autowired + private AdminWinService adminWinService; + + @PostMapping("/list") + public Result> list(){ + LOGGER.info("查询所有中奖用户"); + return Result.success(adminWinService.listWinUserWin()); + //return Result.success(); + } +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java index 4f7b87b..90cbdcb 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/UserServiceImpl.java @@ -57,7 +57,7 @@ public class UserServiceImpl extends ServiceImpl implements I @Override public List listAllUser() { // 1. 查询前140条未删除的用户 - Page page = new Page<>(1, 140); + Page page = new Page<>(1, 2); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(User::getIsDel, 0); // 只查询未删除的用户 @@ -65,8 +65,8 @@ public class UserServiceImpl extends ServiceImpl implements I List users = userPage.getRecords(); // 2. 如果不足140条,从剩余未删除用户中随机补充 - if (users.size() < 140) { - int needed = 140 - users.size(); + if (users.size() < 2) { + int needed = 2 - users.size(); // 获取所有未删除用户ID List allUserIds = userMapper.selectList( diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java new file mode 100644 index 0000000..28eacf0 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/Impl/WinUserServiceImpl.java @@ -0,0 +1,15 @@ +package com.lottery.api.service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.api.service.WinUserService; + +/** + * @program: lottery + * @ClassName WinUserServiceImpl + * @description: + * @author: wwl + * @create: 2025-07-22 15:21 + * @Version 1.0 + **/ +public class WinUserServiceImpl implements WinUserService { +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java new file mode 100644 index 0000000..3ab4b73 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/WinUserService.java @@ -0,0 +1,14 @@ +package com.lottery.api.service; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * @program: lottery + * @ClassName WinUserService + * @description: + * @author: wwl + * @create: 2025-07-22 15:21 + * @Version 1.0 + **/ +public interface WinUserService { +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java b/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java index da79684..5da90ee 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/config/CorsConfig.java @@ -17,9 +17,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { +// registry.addMapping("/**") +// .allowedOrigins("*") // 允许所有来源 +// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") +// .allowedHeaders("*"); + registry.addMapping("/**") - .allowedOrigins("*") // 允许所有来源 + .allowedOriginPatterns("*") // 允许所有来源模式 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") - .allowedHeaders("*"); + .allowedHeaders("*") + .allowCredentials(true); // 允许携带凭证(如cookie、认证头) + } } diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml index da97ce2..7a4ed26 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/api/prizeMapper.xml @@ -7,7 +7,7 @@ from prize p left join grade g on p.grade_id = g.id where g.is_del = 0 - order by g.sort desc + order by g.sort desc,g.id ASC