05 CRUD 套餐 + 实战内容(后续补充 ing)
新增套餐
预准备
代码实现
复制资料下的SetmealDish
类到entity下,复制SetmealDto
到dto下。
添加套餐菜品/查询菜品数据
DishController
下:
/**
* 根据条件查询对应的菜品数据
* @param dish
* @return
*/
@GetMapping("/list")
public R<List<Dish>> list(Dish dish){
//构造查询条件
LambdaQueryWrapper<Dish> queryWrapper=new LambdaQueryWrapper();
queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
queryWrapper.eq(Dish::getStatus,1);//查询起售的菜品
//添加排序条件
queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
List<Dish> list = dishService.list(queryWrapper);
return R.success(list);
}
新增套餐
在SetmealService
下写一个方法public void saveWithDish(SetmealDto setmealDto);
,用于新增套餐,同时需要保存套餐和菜品的关联关系。再其实现类下,编写:
/**
* 新增套餐,同时需要保存套餐和菜品的关联关系
* @param setmealDto
*/
@Override
@Transactional
public void saveWithDish(SetmealDto setmealDto){
//保存套餐的基本信息,操作setmeal,执行insert操作
this.save(setmealDto);
List<SetmealDish> setmealDishes=setmealDto.getSetmealDishes();
//遍历菜品,加上套餐id
setmealDishes.stream().map((item)->{
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
setmealDishService.saveBatch(setmealDishes);
}
最后SetmealController
在下:
/**
* 新增套餐
* @param setmealDto
* @return
*/
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto){
log.info("套餐信息:{}",setmealDto);
setmealService.saveWithDish(setmealDto);
return R.success("新增套餐成功!");
}
套餐信息分页查询
预准备
代码实现
在SetmealController
下,注入private SetmealDishService setmealDishService;
字段,编写:
/**
* 分页查询
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
//分页构造器对象
Page<Setmeal> pageInfo =new Page<>(page,pageSize);
Page<SetmealDto> dtoPage=new Page<>();
LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();
//添加查询条件,根据name进行like模糊查询
queryWrapper.like(name!=null,Setmeal::getName,name);
//添加排序条件,根据更新时间降序排列
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
setmealService.page(pageInfo,queryWrapper);
//显示分类名称
//对象拷贝,只拷贝分页信息
BeanUtils.copyProperties(pageInfo,dtoPage,"records");
//拷贝基本信息,加上菜品名称
List<Setmeal> records = pageInfo.getRecords();
List<SetmealDto> list=records.stream().map((item)->{
SetmealDto setmealDto=new SetmealDto();
//拷贝基础信息
BeanUtils.copyProperties(item,setmealDto);
//分类id
Long categoryId=item.getCategoryId();
//根据分类id查询分类对象
Category category = categoryService.getById(categoryId);
if(category!=null){
//分类名称
String categoryName=category.getName();
}
return setmealDto;
}).collect(Collectors.toList());
dtoPage.setRecords(list);
return R.success(dtoPage);
}
删除套餐
预准备
代码实现
在类下新增public void removeWithDish(List<Long> ids)
方法,用于删除套餐,同时需要删除套餐和菜品的关联数据。
在SetmealServiceImpl
类下:
/**
* 删除套餐,同时需要删除套餐和菜品的关联数据
* @param ids
*/
@Override
public void removeWithDish(List<Long> ids) {
//查询套餐状态,确定是否可以删除
LambdaQueryWrapper<Setmeal> queryWrapper=new LambdaQueryWrapper<>();
queryWrapper.in(Setmeal::getId,ids);
queryWrapper.eq(Setmeal::getStatus,1);
int count=this.count(queryWrapper);//是mp框架里面的方法
if(count>0){
//如果不能删除,抛出一个业务异常
throw new CustomException("套餐正在售卖中,不能删除!");
}
//如果可以删除,先删除套餐表中的数据setmeal
this.removeByIds(ids);
//删除关系表中的数据setlmealDish,removebyids是删除的这个表的主键,所以不能调用这个方法
//delete from setmeal_dish where setmeal_id in(1,2,3...)
LambdaQueryWrapper<SetmealDish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(SetmealDish::getSetmealId,ids);
setmealDishService.remove(lambdaQueryWrapper);
}
在SetmealController
类下:
/**
* 删除套餐,并删除掉附带的菜品信息
* @param ids
* @return
*/
@DeleteMapping
public R<String> delete(@RequestParam List<Long> ids){
log.info("ids{}",ids);
setmealService.removeWithDish(ids);
return R.success("套餐数据删除成功");
}
实战内容
后台按条件查询客户订单
用户个人查询自己的订单
菜品、套餐的批量起售、停售
购物车中的菜品或者套餐数量减少
后台套餐的修改