java抽奖系统(六)

发布于:2024-12-18 ⋅ 阅读:(27) ⋅ 点赞:(0)

7.2 奖品管理

时序图如下所示:

 7.2.1 图片上传

controller层:

@RestController
public class PrizeController {
    @Autowired
    private PictureService pictureService;

    @RequestMapping("/pic/upload")
    public String uploadPic(MultipartFile file) {
        return pictureService.savePicture(file);
    }
}

service层:

public interface PictureService {
    String savePicture(MultipartFile multipartFile);
}

@Component
public class PictureServiceImpl implements PictureService {
    @Value("${pic.local-path}")
    private String localPath;

    @Override
    public String savePicture(MultipartFile multipartFile) {

        // 创建目录
        File dir = new File(localPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
         //dir.mkdir(); a/b/c 只会创建c

        // 创建索引
        // aaa.jpg -> xxx.jpg
        // aaa.jpg  .jpg  xxx  xxx.jpg
        String filename = multipartFile.getOriginalFilename();
        assert filename != null;
        String suffix = filename.substring(
                filename.lastIndexOf("."));
        filename = UUID.randomUUID() + suffix;//生成自己管控的文件名

        // 图片保存
        try {
            multipartFile.transferTo(new File(localPath + "/" + filename));
            //将multipartFile文件写入到目标目录文件中,即图片保存
        } catch (IOException e) {
            throw new ServiceException(ServiceErrorCodeConstants.PIC_UPLOAD_ERROR);
        }
        return filename;
    }
}

         图片上传成功之后,会保存到项目绑定的路径,并且会返回一个uuid产生的索引.jpg;

经测试如下:

图片测试:

 7.2.2 奖品创建

约定前后端交互接口

        请求采用的是form表单的形式,表单第一项数据是奖品的基本信息,第二项数据是奖品的图片;

controller层:

 //穿件奖品事宜表单的形式来创建的
    // @RequestPart注解用户于接受表单数据
    @RequestMapping("/prize/create")
    public CommonResult<Long> createPrize(
            @Valid @RequestPart("param") CreatePrizeParam param,
            @RequestPart("prizePic") MultipartFile picFile){
        logger.info("PrizeController createPrize createPrizeParam:{}",
                JacksonUtil.writeValueAsString(param));
            return CommonResult.success(prizeService.createPrize(param,picFile));
    }

service层的接口及其实现:

Long createPrize(CreatePrizeParam param, MultipartFile picFile);
  @Override
    public Long createPrize(CreatePrizeParam param, MultipartFile picFile) {
        // 上传图片
        String fileName = pictureService.savePicture(picFile);
        // 存库
        PrizeDO prizeDO = new PrizeDO();
        prizeDO.setName(param.getPrizeName());
        prizeDO.setDescription(param.getDescription());
        prizeDO.setImageUrl(fileName);
        prizeDO.setPrice(param.getPrice());
        //开始网数据库中塞值
        prizeMapper.insert(prizeDO);
        return prizeDO.getId();
    }

 dao层:

    @Insert("insert into prize (name, image_url, price, description)" +
            " values (#{name}, #{imageUrl}, #{price}, #{description})")
    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
        //keyProperty = "id"PrizeDO中的id, keyColumn = "id数据库中的id
        //将数据添加到数据库之后,将该奖品数据库的id塞入到prizedo中得id
    int insert(PrizeDO prizeDO);

由于请求中的form表单 中两个参数,一个是json格式的字符串,另外一个 是图片,所以会存在文件转换的问题,所以添加一个格式转换器:

@Component
public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
    protected MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
        // MediaType.APPLICATION_OCTET_STREAM 表示这个转换器用于处理二进制流数据,通常用于文件上传。
        //在进行其他json格式参数和图片统一进行上传的话,需要使用数据转换器
        super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        // 转换器不用于写入(即不用于响应的序列化)
        return false;
    }

    @Override
    public boolean canWrite(Type type, Class<?> clazz, MediaType mediaType) {
        return false;
    }

    @Override
    protected boolean canWrite(MediaType mediaType) {
        return false;
    }
}

测试创建奖品如下:

 

完善前端页面,进行测试:

 

7.2.3 奖品列表

时序图:

前后端交互接口:

controller:

@RequestMapping("/prize/find-list")
    public CommonResult<FindPrizeListResult> findPrizeList(PageParam param) {
        //这里没有使用注解进行注解,是因为需要这里的参数直接拼接到请求中,不需要进行格式转换
        logger.info("PrizeController findPrizeList PageParam:{}", JacksonUtil.writeValueAsString(param));
        PageListDTO<PrizeDTO> pageListDTO = prizeService.findPrizeList(param);
        return CommonResult.success(convertToFindPrizeListResult(pageListDTO));
    }

    private FindPrizeListResult convertToFindPrizeListResult(PageListDTO<PrizeDTO> pageListDTO) {
        if (null == pageListDTO) {
            throw new ControllerException(ControllerErrorCodeConstants.FIND_PRIZE_LIST_ERROR);
        }
        FindPrizeListResult result = new FindPrizeListResult();
        result.setTotal(pageListDTO.getTotal());
        result.setRecords(
                pageListDTO.getRecords().stream().map(prizeDTO -> {
                            FindPrizeListResult.PrizeInfo prizeInfo = new FindPrizeListResult.PrizeInfo();
                            prizeInfo.setPrizeId(prizeDTO.getPrizeId());
                            prizeInfo.setPrizeName(prizeDTO.getName());
                            prizeInfo.setDescription(prizeDTO.getDescription());
                            prizeInfo.setImageUrl(prizeDTO.getImageUrl());
                            prizeInfo.setPrice(prizeDTO.getPrice());
                            return prizeInfo;
                }).collect(Collectors.toList())
        );
        return result;
    }

service:

PageListDTO<PrizeDTO> findPrizeList(PageParam param);

 @Override
    public PageListDTO<PrizeDTO> findPrizeList(PageParam param) {
        // 总量
        int total = prizeMapper.count();
        // 查询当前页列表
        List<PrizeDTO> prizeDTOList = new ArrayList<>();
        List<PrizeDO> prizeDOList = prizeMapper.selectPrizeList(param.offset(), param.getPageSize());
        for (PrizeDO prizeDO : prizeDOList) {
            PrizeDTO prizeDTO = new PrizeDTO();
            prizeDTO.setPrizeId(prizeDO.getId());
            prizeDTO.setName(prizeDO.getName());
            prizeDTO.setDescription(prizeDO.getDescription());
            prizeDTO.setImageUrl(prizeDO.getImageUrl());
            prizeDTO.setPrice(prizeDO.getPrice());
            prizeDTOList.add(prizeDTO);
        }
        return new PageListDTO<>(total, prizeDTOList);
    }

 dao:

    @Select("select count(1) from prize")
    //count(1)和count(*)都可以,是根据主键来查找数量的
    int count();

    @Select("select * from prize order by id desc limit #{offset}, #{pageSize}")
    List<PrizeDO> selectPrizeList(@Param("offset") Integer offset,
                                  @Param("pageSize") Integer pageSize);

测试结果如下所示:

{
    "code": 200,
    "data": {
        "total": 3,
        "records": [
            {
                "prizeId": 21,
                "prizeName": "奥迪a6",
                "description": "一个四轮车子",
                "price": 260000.00,
                "imageUrl": "a1452970-b709-4a51-8343-e969f5ac5c64.jpg"
            },
            {
                "prizeId": 19,
                "prizeName": "迈巴赫",
                "description": "四轮车",
                "price": 2000000.00,
                "imageUrl": "c2886f87-31a0-4b86-a99d-1a2cbc6b3674.jpg"
            },
            {
                "prizeId": 18,
                "prizeName": "汤臣一品",
                "description": "房子",
                "price": 5000000.00,
                "imageUrl": "d9567843-59a5-4d9f-8e25-3ea953aae2b7.jpg"
            }
        ]
    },
    "msg": ""
}

 前端代码实现,见码云:

测试结果如下:

进行登陆之后就会有奖品列表;

 ps:本次的内容就到这里了,谢谢观看;


网站公告

今日签到

点亮在社区的每一天
去签到