需求分析
套餐就是菜品的集合。
后台系统中可以管理套餐信息,通过新增套餐功能来增加一个新的套餐,在添加套餐时需要选择套餐分类和包含的菜品,并且需要选择套餐所对应的图片,在移动端会展示相应的界面。
数据模型
新增套餐其实就是将新增页面提交的套餐信息插入到setmeal表,还需要向setmeal_dish表插入套餐和关联数据,所以在新增套餐时涉及两个表:setmeal表和setmeal_dish表。
代码开发
搭建基本环境
mapper、service、controller。
注意:
@service注解最好添加在service实现类上,因为一个sevice接口可能有多个实现类。只有一个不用指定id别名,有多个实现类时最好指定
id别名。
前后端交互过程
- 页面发送ajax请求到服务端,服务端接收请求返回给套餐分类数据到前端并展示到下拉框。
- 页面发送ajax请求,请求服务端获取菜品分类数据并展示到添加菜品窗口。
- 页面发送ajax请求,根据菜品分类查询对应的菜品数据并展示到添加菜品窗口中。
/**
* 根据条件查询对应的菜品信息。
* @param dish
* @return
*/
@GetMapping("/list")
public R<List<Dish>> list(Dish dish) {
log.info("接收参数:{}",dish);
//构造查询条件
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
//查询起售的。
queryWrapper.eq(Dish::getStatus,1);
queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId());
//添加排序条件
queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
//执行查询
List<Dish> dishList = dishService.list(queryWrapper);
return R.success(dishList);
}
- 页面发送请求进行图片上传,请求服务端将图片保存到服务器。
- 页面发送请求进行图片下载,将上传的图片进行回显。
- 点击保存按钮,发送ajax请求,将页面输入的套餐信息以json数据提交到服务端并进行保存。
Service层
/**
* @Author 小杰 @Date 2022/4/27 15:13 @Version 1.0
*/
@Service
public class SetmealServiceImpl extends ServiceImpl<SetmealMapper, Setmeal>
implements SetmealService {
@Autowired private SetmealDishService setmealDishService;
@Transactional
@Override
public void saveWithDish(SetmealDto setmealDto) {
// 1.先保存基本信息到setmeal表。
this.save(setmealDto);
// 2.保存套餐对应的菜品信息到setmeal_dish表。
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
// Field 'setmeal_id' doesn't have a default value] with root cause
// 所以需要处理setmeal_id字段。
setmealDishes.stream()
.map(
(item) -> {
item.setSetmealId(setmealDto.getId());
return item;
})
.collect(Collectors.toList());
setmealDishService.saveBatch(setmealDishes);
}
注意:保存时,不仅要保存setmeal基本信息,还要保存套餐所对应的菜品到setmeal_dish表,所以涉及到两个表的保存,所以控制器方法需要一个dto类型来接收前端参数。因为前端提交是json数据的格式,所以要在形参加@RequestBody注解接收。
controller层
/**
* 新增套餐
*
* @param setmealDto
* @return
*/
@PostMapping
public R<String> save(@RequestBody SetmealDto setmealDto) {
log.info("新增套餐:{}", setmealDto);
// 先保存基本setmeal信息。
// setmealService.save(setmealDto);
//保存套餐
setmealService.saveWithDish(setmealDto);
return R.success("新增套餐成功");
}