个人名片:
博主:酒徒ᝰ.
专栏:瑞吉外卖
个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志:真正的程序员不看参考手册,新手和胆小鬼才会看。
本项目基于B站黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目。
视频链接【黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis
plus开发核心技术的真java实战项目】 https://www.bilibili.com/video/BV13a411q753?
点击观看
因为菜品管理太多了,所有分成三部分来写了。这是第二部分
分析:dish地址,DELETE方式,ids属性。
/**
* 删除菜品
* @param ids
* @return
*/
@DeleteMapping
public R<String> dish(@PathParam("ids") Long ids){
dishService.removeById(ids);
return R.success("删除成功");
}
比较简单,修改两个地方即可
@PathParam ——>> @RequestParam
.removeById ——>> .removeByIds
/**
* 批量删除菜品
* @param ids
* @return
*/
@DeleteMapping
public R<String> dish(@RequestParam("ids") List<Long> ids){
dishService.removeByIds(ids);
return R.success("删除成功");
}
/**
* 批量删除菜品——删除菜品对应的口味
* @param ids
* @return
*/
@DeleteMapping
public R<String> dish(@RequestParam("ids") List<Long> ids){
//根据id查询dishFlavor表中对应的信息
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(DishFlavor::getDishId, ids);
dishFlavorService.remove(queryWrapper);
//根据id删除
dishService.removeByIds(ids);
return R.success("删除成功");
}
/**
* 批量删除菜品——判断菜品状态是否为正在售卖
* @param ids
* @return
*/
@DeleteMapping
public R<String> dish(@RequestParam("ids") List<Long> ids){
//判断dish状态
//根据ids获取所有的dish信息
LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
wrapper.in(Dish::getId, ids);
List<Dish> list = dishService.list(wrapper);
//判断每一个status 如果都为0,可以删除。
boolean flag = true;
for (Dish dish : list) {
if (dish.getStatus() == 1){
flag = false;
}
}
if (flag){
//根据id查询dishFlavor表中对应的信息
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(DishFlavor::getDishId, ids);
dishFlavorService.remove(queryWrapper);
//根据id删除
dishService.removeByIds(ids);
return R.success("删除成功");
}else {
return R.error("存在正在售卖菜品,删除失败");
}
}
分析:dish地址,GET方式,"/{id}"地址
通过之前的研究,可以发现此处返回值类型为DishDto类型。
/**
* 修改菜品——数据回显
* @param id
* @return
*/
@GetMapping("/{id}")
public R<DishDto> id(@PathVariable Long id){
//根据id查询
DishDto dishDto = dishService.getDishDto(id);
return R.success(dishDto);
}
在IDishService中创建getDishDto方法
DishDto getDishDto(Long id);
在IDishServiceImpl中实现方法
/**
* 修改——数据回显
* @param id
* @return
*/
@Override
public DishDto getDishDto(Long id) {
//1.根据id查询dish数据
Dish dish = this.getById(id);
//2.更加id查询口味信息
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DishFlavor::getDishId, id);
List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);
//3.组装dishDto
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(dish, dishDto);
dishDto.setFlavors(flavors);
return dishDto;
}
分析:dish地址,PUT方式
这里的修改其实是保存的意思。否则无法添加新的口味。
/**
* 修改菜品——保存
* @param request
* @param dishDto
* @return
*/
@PutMapping
public R<String> dishupdate(HttpServletRequest request, @RequestBody DishDto dishDto){
//添加创建时间和修改时间
dishDto.setUpdateTime(LocalDateTime.now());
//添加创建人和修改人
Long empId = (Long) request.getSession().getAttribute("employee");
dishDto.setUpdateUser(empId);
dishService.updateDishFlavor(request, dishDto);
return R.success("修改菜品成功");
}
在IDishService中创建updateDishFlavor方法
void updateDishFlavor(HttpServletRequest request, DishDto dishDto);
在IDishServiceImpl中实现方法
/**
* 修改菜品——保存
* @param request
* @param dishDto
* @return
*/
@Override
@Transactional
public void updateDishFlavor(HttpServletRequest request, DishDto dishDto) {
//保存dish的基本信息到dish表
this.updateById(dishDto);
//删除原有的菜品口味
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DishFlavor::getDishId, dishDto.getId());
dishFlavorService.remove(queryWrapper);
//存储dishId
List<DishFlavor> flavors = dishDto.getFlavors();
flavors = flavors.stream().map((item) -> {
//设置dishid
item.setDishId(dishDto.getId());
///添加创建时间和修改时间
item.setCreateTime(LocalDateTime.now());
item.setUpdateTime(LocalDateTime.now());
//添加创建人和修改人
Long empId = (Long) request.getSession().getAttribute("employee");
item.setCreateUser(empId);
item.setUpdateUser(empId);
return item;
}).collect(Collectors.toList());
dishFlavorService.saveBatch(flavors);
}
分析:dish地址,POST方式,status地址,status(0),ids属性
从资料中可以知道,_0 停售 1 起售,_所以,地址中的status为修改之后的状态码.
/**
* 起售与停售
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> status(@PathVariable Integer status, @PathParam("ids") Long ids){
//1.根据ids查询dish表
Dish dish = dishService.getById(ids);
dish.setStatus(status);
dishService.updateById(dish);
if (status == 0){
return R.success("开始停售");
}else {
return R.success("开始启售");
}
}
单个与批量的区别再也ids属性,批量中含有多个ids
直接在单个起售与停售中修改,否则项目无法启动成功。
报如下错误:
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map ‘dishController’ method
/**
* 批量起售与停售
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> status(@PathVariable Integer status, @RequestParam List<Long> ids){
//log.info(status.toString());
//log.info(ids.toString());
//1.根据ids查询dish表
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(Dish::getId, ids);
List<Dish> list = dishService.list(queryWrapper);
//更改list所有的status 遍历方式
for (Dish dish : list) {
dish.setStatus(status);
dishService.updateById(dish);
}
if (status == 0){
return R.success("开始停售");
}else {
return R.success("开始启售");
}
}