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:本次的内容就到这里了,谢谢观看;