From 6ce63ec647d38809269d8008a29db4a92c1e0032 Mon Sep 17 00:00:00 2001 From: willy <2462310981@qq.com> Date: Tue, 15 Jul 2025 18:04:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E5=86=99=E6=8A=BD=E5=A5=96=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lottery-system/lottery-common/pom.xml | 18 +++ .../com/lottery/constant/RedisCacheConstant.java | 14 ++ .../src/main/java/com/lottery/utils/ExcelUtil.java | 101 +++++++++++++++ lottery-system/lottery-pojo/pom.xml | 18 +++ .../src/main/java/com/lottery/dto/PrizeDto.java | 27 ++++ .../src/main/java/com/lottery/dto/UserDto.java | 23 ++++ .../main/java/com/lottery/dto/UserImportDto.java | 22 ++++ .../main/java/com/lottery/dto/UserQueryDto.java | 19 +++ .../src/main/java/com/lottery/entity/Prize.java | 8 ++ .../src/main/java/com/lottery/vo/GradeVo.java | 2 +- .../src/main/java/com/lottery/vo/PrizeVo.java | 5 +- lottery-system/lottery-service/pom.xml | 16 +++ .../admin/controller/AdminPrizeController.java | 53 +++++++- .../admin/controller/AdminUserController.java | 96 ++++++++++++++ .../com/lottery/admin/mapper/AdminGradeMapper.java | 1 + .../com/lottery/admin/mapper/AdminPrizeMapper.java | 19 +++ .../com/lottery/admin/mapper/AdminUserMapper.java | 23 ++++ .../lottery/admin/service/AdminPrizeService.java | 8 ++ .../lottery/admin/service/AdminUserService.java | 34 +++++ .../admin/service/Impl/AdminPrizeServiceImpl.java | 77 ++++++++++- .../admin/service/Impl/AdminUserServiceImpl.java | 141 +++++++++++++++++++++ .../com/lottery/api/controller/UserController.java | 2 +- .../java/com/lottery/api/mapper/IPrizeMapper.java | 1 - .../java/com/lottery/api/service/IUserService.java | 1 + .../lottery/api/service/Impl/UserServiceImpl.java | 17 ++- .../resources/mapper/admin/AdminGradeMapper.xml | 3 + .../resources/mapper/admin/AdminPrizeMapper.xml | 11 ++ .../resources/mapper/admin/AdminUserMapper.xml | 6 + .../src/main/resources/mapper/api/gradeMapper.xml | 3 + .../src/main/resources/mapper/api/prizeMapper.xml | 2 +- lottery-system/pom.xml | 12 ++ 31 files changed, 765 insertions(+), 18 deletions(-) create mode 100644 lottery-system/lottery-common/src/main/java/com/lottery/constant/RedisCacheConstant.java create mode 100644 lottery-system/lottery-common/src/main/java/com/lottery/utils/ExcelUtil.java create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java create mode 100644 lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java create mode 100644 lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java create mode 100644 lottery-system/lottery-service/src/main/resources/mapper/admin/AdminPrizeMapper.xml create mode 100644 lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml diff --git a/lottery-system/lottery-common/pom.xml b/lottery-system/lottery-common/pom.xml index 8ce5f96..029f651 100644 --- a/lottery-system/lottery-common/pom.xml +++ b/lottery-system/lottery-common/pom.xml @@ -18,6 +18,24 @@ + + org.apache.poi + poi + 5.2.3 + compile + + + org.apache.poi + poi-ooxml + 5.2.3 + compile + + + com.alibaba + easyexcel-core + 3.3.2 + compile + diff --git a/lottery-system/lottery-common/src/main/java/com/lottery/constant/RedisCacheConstant.java b/lottery-system/lottery-common/src/main/java/com/lottery/constant/RedisCacheConstant.java new file mode 100644 index 0000000..16615c3 --- /dev/null +++ b/lottery-system/lottery-common/src/main/java/com/lottery/constant/RedisCacheConstant.java @@ -0,0 +1,14 @@ +package com.lottery.constant; + +/** + * @program: lottery + * @ClassName RedisCacheConstant + * @description: + * @author: wwl + * @create: 2025-07-15 17:59 + * @Version 1.0 + **/ +public class RedisCacheConstant { + + public static final String ALL_USER_CACHE = "all_user_cache"; +} diff --git a/lottery-system/lottery-common/src/main/java/com/lottery/utils/ExcelUtil.java b/lottery-system/lottery-common/src/main/java/com/lottery/utils/ExcelUtil.java new file mode 100644 index 0000000..8020137 --- /dev/null +++ b/lottery-system/lottery-common/src/main/java/com/lottery/utils/ExcelUtil.java @@ -0,0 +1,101 @@ +package com.lottery.utils; + +import com.alibaba.excel.annotation.ExcelProperty; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStream; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @program: lottery + * @ClassName ExcelUtil + * @description: + * @author: wwl + * @create: 2025-07-15 16:32 + * @Version 1.0 + **/ + +public class ExcelUtil { + public static List parseExcel(MultipartFile file, Class clazz) throws Exception { + try (InputStream inputStream = file.getInputStream()) { + Workbook workbook = WorkbookFactory.create(inputStream); + Sheet sheet = workbook.getSheetAt(0); + + // 获取表头映射 + Row headerRow = sheet.getRow(0); + Map headerMap = new HashMap<>(); + for (Cell cell : headerRow) { + headerMap.put(cell.getStringCellValue().trim(), cell.getColumnIndex()); + } + + // 验证必要列是否存在 + for (Field field : clazz.getDeclaredFields()) { + ExcelProperty annotation = field.getAnnotation(ExcelProperty.class); + if (annotation != null && !headerMap.containsKey(annotation.value()[0])) { + throw new IllegalArgumentException("缺少必要列: " + annotation.value()[0]); + } + } + + // 读取数据 + List dataList = new ArrayList<>(); + for (int i = 1; i <= sheet.getLastRowNum(); i++) { + Row row = sheet.getRow(i); + if (row == null) continue; + + T dto = clazz.getDeclaredConstructor().newInstance(); + boolean hasValue = false; + + for (Field field : clazz.getDeclaredFields()) { + ExcelProperty annotation = field.getAnnotation(ExcelProperty.class); + if (annotation != null) { + String headerName = annotation.value()[0]; + Integer colIndex = headerMap.get(headerName); + if (colIndex != null) { + Cell cell = row.getCell(colIndex); + Object value = getCellValue(cell); + if (value != null) { + field.setAccessible(true); + field.set(dto, value); + hasValue = true; + } + } + } + } + + if (hasValue) { + dataList.add(dto); + } + } + + return dataList; + } + } + + private static Object getCellValue(Cell cell) { + if (cell == null) return null; + + switch (cell.getCellType()) { + case STRING: + return cell.getStringCellValue().trim(); + case NUMERIC: + if (DateUtil.isCellDateFormatted(cell)) { + return cell.getDateCellValue(); + } + return cell.getNumericCellValue(); + case BOOLEAN: + return cell.getBooleanCellValue(); + case FORMULA: + return cell.getCellFormula(); + default: + return null; + } + } +} + diff --git a/lottery-system/lottery-pojo/pom.xml b/lottery-system/lottery-pojo/pom.xml index bab56a3..2b66117 100644 --- a/lottery-system/lottery-pojo/pom.xml +++ b/lottery-system/lottery-pojo/pom.xml @@ -16,5 +16,23 @@ 11 UTF-8 + + + + + + + + + + + + + + com.alibaba + easyexcel + 3.1.3 + + \ No newline at end of file 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 new file mode 100644 index 0000000..2ad9d87 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/PrizeDto.java @@ -0,0 +1,27 @@ +package com.lottery.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @program: lottery + * @ClassName PrizeDto + * @description: + * @author: wwl + * @create: 2025-07-15 11:56 + * @Version 1.0 + **/ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PrizeDto { + + private Long id; + + private String prizeName; + + private String gradeName; + + private String imageUrl; +} 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 new file mode 100644 index 0000000..1a90973 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserDto.java @@ -0,0 +1,23 @@ +package com.lottery.dto; + +import lombok.Builder; +import lombok.Data; + +/** + * @program: lottery + * @ClassName UserDto + * @description: + * @author: wwl + * @create: 2025-07-15 15:12 + * @Version 1.0 + **/ + +@Data +@Builder +public class UserDto { + private int id; + + private String username; + + private String jwcode; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java new file mode 100644 index 0000000..e6a0aef --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserImportDto.java @@ -0,0 +1,22 @@ +package com.lottery.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * @program: lottery + * @ClassName UserImportDto + * @description: + * @author: wwl + * @create: 2025-07-15 16:27 + * @Version 1.0 + **/ +@Data +public class UserImportDto { + + @ExcelProperty("姓名") + private String username; + + @ExcelProperty("精网号") + 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 new file mode 100644 index 0000000..108e4a9 --- /dev/null +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/dto/UserQueryDto.java @@ -0,0 +1,19 @@ +package com.lottery.dto; + +import lombok.Data; + +/** + * @program: lottery + * @ClassName UserQueryDto + * @description: + * @author: wwl + * @create: 2025-07-15 16:03 + * @Version 1.0 + **/ +@Data +public class UserQueryDto { + + private String username; + + private String jwcode; +} diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Prize.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Prize.java index ca2bea7..0b3a9ba 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Prize.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/entity/Prize.java @@ -9,9 +9,11 @@ package com.lottery.entity; * @Version 1.0 **/ import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @@ -21,6 +23,7 @@ import java.util.Date; @AllArgsConstructor @NoArgsConstructor @TableName("prize") +@Builder public class Prize { // 主键ID @TableId(type = IdType.AUTO) @@ -39,4 +42,9 @@ public class Prize { // 更新时间 private Date updateTime; + + +// 用于标记实体类中的非数据库字段。,一般可以用关联查询的额外字段 + @TableField(exist = false) + private String gradeName; } \ No newline at end of file diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java index 39a243d..6cf4238 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/GradeVo.java @@ -17,7 +17,7 @@ import java.util.Date; @Data public class GradeVo { - private Long id; +// private Long id; private String GradeName; // 等级名称 diff --git a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java index e8cc434..13ea326 100644 --- a/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java +++ b/lottery-system/lottery-pojo/src/main/java/com/lottery/vo/PrizeVo.java @@ -16,7 +16,7 @@ import java.util.Date; @Data public class PrizeVo { - private Long prizeId; +// private Long id; private String PrizeName; @@ -28,7 +28,4 @@ public class PrizeVo { private Date updateTime; -// private int amount; -// -// private int grade; } diff --git a/lottery-system/lottery-service/pom.xml b/lottery-system/lottery-service/pom.xml index e57a96f..21e527e 100644 --- a/lottery-system/lottery-service/pom.xml +++ b/lottery-system/lottery-service/pom.xml @@ -30,6 +30,22 @@ 1.0-SNAPSHOT + + + + + + + + + + + + com.alibaba + easyexcel + 3.1.3 + + 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 ec77096..064eb8a 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,16 +1,14 @@ package com.lottery.admin.controller; import com.lottery.admin.service.AdminPrizeService; +import com.lottery.dto.PrizeDto; import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; /** * @program: lottery @@ -36,4 +34,51 @@ public class AdminPrizeController { PageInfo pageInfo = adminPrizeService.pageListPrize(pageNum, pageSize); return Result.success(pageInfo); } + + @GetMapping("/details") + public Result selectById(@RequestParam Long id) { + return Result.success(adminPrizeService.getPrizeById(id)); + } + + @PostMapping("/add") + public Result addPrize(@RequestBody PrizeDto prizeDto) { + LOGGER.info("新增奖品:{}", prizeDto); + if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| + prizeDto.getGradeName() == null) { + return Result.failure("所有字段都必须填写"); + } + if(!adminPrizeService.add(prizeDto)){ + return Result.failure("该等级下已有礼物"); + }; + return Result.success(); + } + + @PutMapping("/update") + public Result updatePrize(@RequestBody PrizeDto prizeDto) { + LOGGER.info("修改奖品信息:{}",prizeDto); + if (prizeDto.getPrizeName() == null || prizeDto.getImageUrl() == null|| + prizeDto.getGradeName() == null) { + return Result.failure("所有字段都必须填写"); + } + + if (adminPrizeService.getById(prizeDto.getId())== null) { + return Result.failure("修改的id不存在"); + } + + if(!adminPrizeService.updatePrize(prizeDto)){ + return Result.failure("该等级下已有礼物"); + }; + return Result.success(); + } + + @DeleteMapping("/delete") + public Result deletePrize(@RequestParam Long id) { + LOGGER.info("根基id:{},删除奖品",id); + if (!adminPrizeService.removeById(id)){ + return Result.failure("删除失败"); + } + return Result.success(); + } + + } 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 new file mode 100644 index 0000000..5e8d009 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/controller/AdminUserController.java @@ -0,0 +1,96 @@ +package com.lottery.admin.controller; + +import com.lottery.admin.service.AdminUserService; +import com.lottery.dto.UserDto; +import com.lottery.dto.UserImportDto; +import com.lottery.dto.UserQueryDto; +import com.lottery.entity.User; +import com.lottery.result.Result; +import com.lottery.utils.ConvertBeanUtil; +import com.lottery.utils.ExcelUtil; +import com.lottery.vo.PageInfo; +import com.lottery.vo.UserVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @program: lottery + * @ClassName AdminUserController + * @description: + * @author: wwl + * @create: 2025-07-15 14:56 + * @Version 1.0 + **/ + +@RestController +@RequestMapping("/admin/user") +public class AdminUserController { + + @Autowired + private AdminUserService adminUserService; + + private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); + + @PostMapping("/add") + public Result add(@RequestBody UserDto userDto) { + + LOGGER.info("新增用户:{}",userDto); + if (userDto.getUsername() == null || userDto.getJwcode() == null) { + return Result.failure("所有字段都必须填写"); + } + adminUserService.addUser(userDto); + return Result.success(); + } + + @PostMapping("/list") + public Result> getAllUser(@RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "10") int pageSize, + @RequestBody UserQueryDto userQueryDto ){ + LOGGER.info("分页查询所有用户"); + + return Result.success(adminUserService.listUser(pageNum,pageSize,userQueryDto)); + } + + + + @GetMapping() + + @DeleteMapping("/delete") + public Result delete(@RequestParam Long id) { + LOGGER.info("根据id删除用户:{}",id); + adminUserService.removeById(id); + return Result.success(); + } + + @DeleteMapping("/delete/batch") + public Result deleteBatch(@RequestParam List ids) { + LOGGER.info("批量删除用户:{}",ids); + if (ids == null || ids.size() == 0) { + return Result.failure("ids is null"); + } + adminUserService.removeBatchByIds(ids); + return Result.success(); + } + + @PostMapping("/import") + public Result importUsers(@RequestParam("file") MultipartFile file) { + LOGGER.info("开始导入用户Excel文件: {}", file.getOriginalFilename()); + + // 1. 基本文件校验 + if (file.isEmpty()) { + return Result.failure("请上传文件"); + } + + String fileName = file.getOriginalFilename(); + if (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls")) { + return Result.failure("仅支持Excel文件(.xlsx, .xls)"); + } + return adminUserService.importUsers(file); + } + +} diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java index b0ffb50..fdb2bf2 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminGradeMapper.java @@ -15,4 +15,5 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface AdminGradeMapper extends BaseMapper { + Grade selectByName(String gradeName); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java new file mode 100644 index 0000000..02a4704 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminPrizeMapper.java @@ -0,0 +1,19 @@ +package com.lottery.admin.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.lottery.entity.Prize; + +/** + * @program: lottery + * @ClassName AdminPrizeMapper + * @description: + * @author: wwl + * @create: 2025-07-15 15:00 + * @Version 1.0 + **/ +public interface AdminPrizeMapper extends BaseMapper { + + Page pageListPrize(Page page, LambdaQueryWrapper prizeLambdaQueryWrapper); +} 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 new file mode 100644 index 0000000..c65eb0d --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/mapper/AdminUserMapper.java @@ -0,0 +1,23 @@ +package com.lottery.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.lottery.entity.User; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.Set; + +/** + * @program: lottery + * @ClassName AdminUserMapper + * @description: + * @author: wwl + * @create: 2025-07-15 14:59 + * @Version 1.0 + **/ +@Mapper +public interface AdminUserMapper extends BaseMapper { + + @Select("select jwcode from user") + Set selectAllUserCodes(); +} 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 1b9744c..43a947f 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 @@ -1,7 +1,9 @@ package com.lottery.admin.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.lottery.dto.PrizeDto; import com.lottery.entity.Prize; +import com.lottery.result.Result; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; @@ -15,4 +17,10 @@ import com.lottery.vo.PrizeVo; **/ public interface AdminPrizeService extends IService { PageInfo pageListPrize(int pageNum, int pageSize); + + boolean add(PrizeDto prizeDto); + + boolean 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 new file mode 100644 index 0000000..5ee2c88 --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/AdminUserService.java @@ -0,0 +1,34 @@ +package com.lottery.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.lottery.dto.UserDto; +import com.lottery.dto.UserQueryDto; +import com.lottery.entity.User; +import com.lottery.result.Result; +import com.lottery.vo.PageInfo; +import com.lottery.vo.UserVo; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * @program: lottery + * @ClassName AdminUserService + * @description: + * @author: wwl + * @create: 2025-07-15 14:57 + * @Version 1.0 + **/ + +@Service +public interface AdminUserService extends IService { + void addUser(UserDto userDto); + + + PageInfo listUser(int pageNum, int pageSize, UserQueryDto userQueryDto); + + + Result importUsers(MultipartFile file); +} + 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 5aa87f2..bcb2b44 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 @@ -4,10 +4,16 @@ import ch.qos.logback.classic.spi.EventArgUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.admin.mapper.AdminGradeMapper; +import com.lottery.admin.mapper.AdminPrizeMapper; import com.lottery.admin.service.AdminPrizeService; import com.lottery.api.mapper.IGradeMapper; import com.lottery.api.mapper.IPrizeMapper; +import com.lottery.dto.PrizeDto; +import com.lottery.entity.Grade; import com.lottery.entity.Prize; +import com.lottery.exception.SomeException; +import com.lottery.result.Result; import com.lottery.utils.ConvertBeanUtil; import com.lottery.vo.PageInfo; import com.lottery.vo.PrizeVo; @@ -17,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.lang.module.Configuration; +import java.util.Date; import java.util.List; /** @@ -28,13 +35,13 @@ import java.util.List; * @Version 1.0 **/ @Service -public class AdminPrizeServiceImpl extends ServiceImpl implements AdminPrizeService { +public class AdminPrizeServiceImpl extends ServiceImpl implements AdminPrizeService { @Autowired - private IGradeMapper gradeMapper; + private AdminGradeMapper adminGradeMapper; @Autowired - private IPrizeMapper prizeMapper; + private AdminPrizeMapper adminPrizeMapper; @Override public PageInfo pageListPrize(int pageNum, int pageSize) { @@ -42,9 +49,71 @@ public class AdminPrizeServiceImpl extends ServiceImpl impl //关联grade查询sort,prize表也按照g.sort排序 LambdaQueryWrapper prizeLambdaQueryWrapper = new LambdaQueryWrapper<>(); - Page pagePrize = prizeMapper.pageListPrize(page, prizeLambdaQueryWrapper); + Page pagePrize = adminPrizeMapper.pageListPrize(page, prizeLambdaQueryWrapper); List prizeVos = ConvertBeanUtil.convertList(pagePrize.getRecords(), PrizeVo.class); return PageInfo.of(pagePrize, prizeVos); } + + @Override + public boolean add(PrizeDto prizeDto) { + String gradeName = prizeDto.getGradeName(); + Grade grade = adminGradeMapper.selectByName(gradeName); +// if (grade == null) { +//// return Result.failure("等级不存在"); +// throw new SomeException("heheh"); +// } + + // 3. 检查该等级是否已有奖品 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Prize::getGradeId, grade.getId()); + if (this.count(wrapper) > 0) { +// return Result.failure("该等级已存在奖品,不能重复添加"); +// throw new SomeException("heheh"); + return false; + } + + Prize prize = Prize.builder() + .PrizeName(prizeDto.getPrizeName()) + .gradeId(grade.getId()) + .imageUrl(prizeDto.getImageUrl()) + .createTime(new Date()) + .updateTime(new Date()) + .build(); + + return this.save(prize); + + } + + @Override + public boolean updatePrize(PrizeDto prizeDto) { + String gradeName = prizeDto.getGradeName(); + Grade grade = adminGradeMapper.selectByName(gradeName); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(Prize::getGradeId, grade.getId()); + if (this.count(wrapper) > 0) { +// return Result.failure("该等级已存在奖品,不能重复添加"); +// throw new SomeException("heheh"); + return false; + } + Prize prize = ConvertBeanUtil.convert(prizeDto, Prize.class); + prize.setUpdateTime(new Date()); + prize.setGradeId(grade.getId()); + if (adminPrizeMapper.updateById(prize) > 0){ + return true; + }; + return false; + } + + @Override + public PrizeVo getPrizeById(Long id) { + Prize prize = this.getById(id); + Long gradeId = prize.getGradeId(); + Grade grade = adminGradeMapper.selectById(gradeId); + + PrizeVo prizeVo = ConvertBeanUtil.convert(prize, PrizeVo.class); + prizeVo.setGradeName(grade.getGradeName()); + return prizeVo; + } } 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 new file mode 100644 index 0000000..7c9074f --- /dev/null +++ b/lottery-system/lottery-service/src/main/java/com/lottery/admin/service/Impl/AdminUserServiceImpl.java @@ -0,0 +1,141 @@ +package com.lottery.admin.service.Impl; + +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.admin.controller.AdminUserController; +import com.lottery.admin.mapper.AdminUserMapper; +import com.lottery.admin.service.AdminUserService; +import com.lottery.api.service.Impl.UserServiceImpl; +import com.lottery.dto.UserDto; +import com.lottery.dto.UserImportDto; +import com.lottery.dto.UserQueryDto; +import com.lottery.entity.Grade; +import com.lottery.entity.User; +import com.lottery.result.Result; +import com.lottery.utils.ConvertBeanUtil; +import com.lottery.utils.ExcelUtil; +import com.lottery.vo.PageInfo; +import com.lottery.vo.UserVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; + +/** + * @program: lottery + * @ClassName AdminUserServiceImpl + * @description: + * @author: wwl + * @create: 2025-07-15 14:58 + * @Version 1.0 + **/ +@Service +public class AdminUserServiceImpl extends ServiceImpl implements AdminUserService { + + @Autowired + private AdminUserMapper adminUserMapper; + private final static Logger LOGGER = LoggerFactory.getLogger(AdminUserController.class); + + @Override + public void addUser(UserDto userDto) { + this.save(ConvertBeanUtil.convert(userDto, User.class)); + } + + @Override + public PageInfo listUser(int pageNum, int pageSize, UserQueryDto userQueryDto) { + Page page = new Page<>(pageNum, pageSize); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (StringUtils.isNotBlank(userQueryDto.getUsername())) { + queryWrapper.like(User::getUsername, userQueryDto.getUsername()); + } + if(StringUtils.isNotBlank(userQueryDto.getJwcode())){ + queryWrapper.like(User::getJwcode, userQueryDto.getJwcode()); + } + + Page userPage = this.page(page, queryWrapper); + List userVolist = ConvertBeanUtil.convertList(userPage.getRecords(), UserVo.class); + return PageInfo.of(userPage, userVolist); + } + + @Override + public Result importUsers(MultipartFile file) { + + try { + // 2. 解析Excel +// List userDtos = ExcelUtil.parseExcel(file, UserImportDto.class); + List userDtos = EasyExcel.read(file.getInputStream()) + .head(UserImportDto.class) + .sheet() + .doReadSync(); + + // 3. 数据校验和去重 + Set existingCodes = adminUserMapper.selectAllUserCodes(); // 查询已存在的精网号 + List users = 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)); + processedCodes.add(dto.getJwcode()); + } 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("部分数据导入失败"); + } + return Result.failure("没有有效数据可导入"); + } catch (Exception e) { + LOGGER.error("导入用户失败", e); + return Result.failure("导入失败: " + e.getMessage()); + } + } + + private User convertToEntity(UserImportDto dto) { + User user = new User(); + user.setJwcode(dto.getJwcode()); + user.setUsername(dto.getUsername()); + user.setCreateTime(new Date()); + user.setUpdateTime(new Date()); + // 设置默认密码 + user.setPassword("123456"); + return user; + } + + private void validateUser(UserImportDto dto, int rowNum, Set existingCodes, Set processedCodes) { + if (StringUtils.isBlank(dto.getJwcode())) { + throw new IllegalArgumentException("第" + rowNum + "行: 精网号不能为空"); + } + + if (StringUtils.isBlank(dto.getUsername())) { + 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/controller/UserController.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java index 17ee70c..171a666 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/controller/UserController.java @@ -71,7 +71,7 @@ public class UserController { public Result> getAllUser(){ LOGGER.info("查询所有用户"); - List list = userService.list(); + List list = userService.listAllUser(); return Result.success(ConvertBeanUtil.convertList(list, UserVo.class)); } } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IPrizeMapper.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IPrizeMapper.java index 8db8eae..545160e 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IPrizeMapper.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/mapper/IPrizeMapper.java @@ -24,5 +24,4 @@ public interface IPrizeMapper extends BaseMapper { List selectPrizeAndGrade(); - Page pageListPrize(Page page, LambdaQueryWrapper prizeLambdaQueryWrapper); } diff --git a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserService.java b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserService.java index c5536d5..848a35d 100644 --- a/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserService.java +++ b/lottery-system/lottery-service/src/main/java/com/lottery/api/service/IUserService.java @@ -18,4 +18,5 @@ import java.util.List; public interface IUserService extends IService { User login(UserLoginDto userLoginDto); + List listAllUser(); } 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 4122065..9f03fd5 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 @@ -1,14 +1,20 @@ package com.lottery.api.service.Impl; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.lottery.constant.RedisCacheConstant; import com.lottery.dto.UserLoginDto; import com.lottery.entity.User; import com.lottery.exception.Accountexception; import com.lottery.api.mapper.IUserMapper; import com.lottery.api.service.IUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import java.util.List; + /** * @program: lottery-system * @ClassName UserServiceImpl @@ -23,6 +29,9 @@ public class UserServiceImpl extends ServiceImpl implements I @Autowired private IUserMapper userMapper; + @Autowired + private StringRedisTemplate redisTemplate; + @Override public User login(UserLoginDto userLoginDto) { String password = userLoginDto.getPassword(); @@ -35,9 +44,13 @@ public class UserServiceImpl extends ServiceImpl implements I //密码错误 throw new Accountexception("密码错误"); } - - return user; } + @Override + public List listAllUser() { + List list = this.list(); + redisTemplate.opsForValue().set(RedisCacheConstant.ALL_USER_CACHE, JSON.toJSONString(list)); + return list; + } } diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminGradeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminGradeMapper.xml index 601dd33..3046f29 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminGradeMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminGradeMapper.xml @@ -2,4 +2,7 @@ + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminPrizeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminPrizeMapper.xml new file mode 100644 index 0000000..4ec34c1 --- /dev/null +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminPrizeMapper.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml new file mode 100644 index 0000000..165b190 --- /dev/null +++ b/lottery-system/lottery-service/src/main/resources/mapper/admin/AdminUserMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml b/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml index 881a719..e85625e 100644 --- a/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml +++ b/lottery-system/lottery-service/src/main/resources/mapper/api/gradeMapper.xml @@ -2,4 +2,7 @@ + \ No newline at end of file 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 4cbc009..710af8c 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 @@ -10,7 +10,7 @@