瑞吉外卖剩余功能开发
菜品的批量删除和单删
确定本次的请求方式为DELETE请求后,请求路径为**“/dish”**,在DishController层编写代码。
"/dish"的请求路径在DishController类上已添加,因此在删除的方法上不需要添加任何路径。
单删和批量删除的请求方式是相同的,不同点在于传入id的数量,因此可以将单删和批量删除用一个方法表示,传入的变量用List接收。
DishController
@DeleteMapping
public R<String> delete(@RequestParam("ids") List<Long> ids){
dishService.deleteById(ids);
return R.success("删除成功");
}
保持DishController层的代码简洁,将具体删除的代码,放在Service层完成。
DishService
public void deleteById(List<Long> ids);
DishServiceImpl
在删除菜品的时候,要了解到不仅要删除当前菜品,还要删除当前菜品的口味,并且当前菜品在售卖阶段的时候是不可删除的。
/**
* 批量删除菜品和单删菜品
* @param ids
*/
@Override
@Transactional
public void deleteById(List<Long> ids) {
// 构造一个条件构造器 用来匹配传入的id与菜品id
LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
// 先判断一下浏览器传过来的ids是否为空,并且与菜品表中的id进行匹配
lqw.in(ids!=null,Dish::getId,ids);
List<Dish> list = this.list(lqw);
for(Dish dish:list){
// 判断当前菜品是否在售卖阶段,0表示停售,1表示售卖
if(dish.getStatus() == 0){
// 直接删除当前菜品
this.removeById(dish.getId());
LambdaQueryWrapper<DishFlavor> lqw1 = new LambdaQueryWrapper<>();
// 根据菜品id匹配口味表中的菜品id
lqw1.eq(DishFlavor::getDishId,dish.getId());
// 删除口味表与菜品表相关联的口味信息
dishFlavorService.remove(lqw1);
}else{
throw new CustomException("此菜品还在售卖阶段,不能删除!!");
}
}
}
菜品的批量启售和单独启售
同样先去浏览器查询此次请求的方式和URL路径
此次的请求方式都有POST,但是此次的请求路径与删除时不一样,多了一个"/status",因此在控制层写方法时要把"/status"加上。
此次提交的URL不仅多了"/status"而且还传入了一个"status"参数,通过@PathVariable接收status,因此控制层代码如下
@PostMapping("/status/{status}")
public R<String> sell(@PathVariable int status,@RequestParam List<Long> ids){
dishService.sellById(status,ids);
return R.success("操作成功");
}
对应的Service层
public void sellById(int status,List<Long> ids);
其实现类ServiceImpl
/**
* 批量启售菜品和单独启售菜品
* @param ids
*/
@Override
@Transactional
public void sellById(int status,List<Long> ids) {
// 构造一个条件构造器
LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
lqw.in(ids!=null,Dish::getId,ids);
List<Dish> list = this.list(lqw);
for(Dish dish:list){
if(dish!=null) {
// 把浏览器传入的status参数赋值给此菜品
dish.setStatus(status);
// 赋值完后记得更新菜品
this.updateById(dish);
}
}
}
修改套餐信息
点击修改按钮,此时弹出的修改页面应该回显出套餐的原始信息,如下图所示。
我们应该在回显的信息上进行修改操作。
同样操作,根据浏览器提交的请求来查看本次回显的请求方式与URL
本次的请求方式为GET,请求路径为"/setmeal/{id}"
Controller
此处的返回类型应该为SetmealDto,因为回显的套餐信息中包含套餐菜品,而Setmeal实体类中并不包含菜品这一信息,因此需要用SetmealDto来接收此次的信息返回值。
@GetMapping("{id}")
public R<SetmealDto> getSetmealById(@PathVariable Long id){
SetmealDto setmealDto = setmealService.getByIdWithDish(id);
return R.success(setmealDto);
}
Service
public SetmealDto getByIdWithDish(Long id);
ServiceImpl
public SetmealDto getByIdWithDish(Long id) {
// 根据id查询基本信息
Setmeal setmeal = this.getById(id);
SetmealDto setmealDto = new SetmealDto();
// 将基本信息拷贝至 setmealDto中
BeanUtils.copyProperties(setmeal,setmealDto);
// 上面的拷贝,并未给setmealDto中的setmealDishes赋值。
LambdaQueryWrapper<SetmealDish> lqw = new LambdaQueryWrapper<>();
// 根据套餐id匹配对应setmeal_dish 表中的套餐id
lqw.eq(SetmealDish::getSetmealId,setmeal.getId());
List<SetmealDish> list = setmealDishService.list(lqw);
// 给setmealDto 中的 setmealDishes 赋值
setmealDto.setSetmealDishes(list);
return setmealDto;
}
回显操作完成后,就是在回显的界面中进行修改操作。修改完成后点击保存按钮,浏览器会发送一个请求。
根据浏览器发送的PUT请求和URL,在控制层编写修改代码。
Controller
此处传入的应该是一个SetmealDto实体类,用于接收浏览器出过来的JSON信息,信息中包含菜品信息,因此使用SetmealDto实体类接收。
@PutMapping
public R<String> update(@RequestBody SetmealDto setmealDto){
setmealService.updateWithSetmeal(setmealDto);
return R.success("修改套餐成功");
}
Service
public void updateWithSetmeal(SetmealDto setmealDto);
ServiceImpl
/**
* 修改套餐信息
* @param setmealDto
*/
@Override
public void updateWithSetmeal(SetmealDto setmealDto) {
// 根据setmealDto更新套餐的基本信息(除了菜品信息以外的信息)
this.updateById(setmealDto);
LambdaQueryWrapper<SetmealDish> lqw = new LambdaQueryWrapper<>();
// 根据 套餐 id 查询出 套餐对应的菜品信息
lqw.eq(SetmealDish::getSetmealId,setmealDto.getId());
// 将原来套餐的相关菜品移除
setmealDishService.remove(lqw);
// 根据浏览器发送的setmealDto查询出新的菜品信息
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
// 将修改后的setmeal_dish表中的菜品 赋值 套餐id
setmealDishes = setmealDishes.stream().map((item)->{// item--> setmealDish
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
// 将被赋值后的菜品保存
setmealDishService.saveBatch(setmealDishes);
}
目前只学习到此!!!!