黑马苍穹外卖笔记day4
第四天实现套餐管理的所有接口
1.新增套餐
业务规则:
- 套餐名称唯一
- 套餐必须属于某个分类
- 套餐必须包含菜品
- 名称、分类、价格、图片为必填项
- 添加菜品窗口需要根据分类类型来展示菜品
- 新增的套餐默认为停售状态
接口设计:
- 根据类型查询分类(已完成)
- 根据分类id查询菜品
- 图片上传(已完成)
- 新增套餐
根据分类id查询菜品:
controller层在DishController类中编写一个方法list(),返回一个Result<List<Dish>>
在Service层的DishServiceImpl类中,将categoryId和状态包装成一个dish对象,然后传入Mapper层,用这个dish对象来进行查询
在mapper层的DishMapper.xml文件中,使用Mybatis来进行查询
注意:mybatis中where标签的语句要加and(不用加逗号),set标签要加逗号
新增套餐:注意新增套餐时,不仅要保存到setmeal表中,还要向setmeal_dish表中保存套餐和菜品的关联关系
在Service层中的实现,在SetmealServiceImpl类中的saveWithDish方法
在插入套餐之后,还需要获取到这个套餐的id,所以在mybatis代码中要将主键返回,在SetmealDishMapper.xml文件中使用useGeneratedKeys关键字指定需要返回主键,keyProperty关键字指定返回的主键是哪个
在saveWithDish方法中,最后还需要批量插入套餐菜品关系,用到了setmealDishMapper的insertBatch方法,其中的mybatis代码如下所示:
使用到了foreach标签
2.套餐分页查询
业务规则:
- 根据页码进行分页展示
- 每页展示十条数据
- 可以根据需要,按照套餐名称、分类、售卖状态进行查询
Controller层:SetmealController类中编写分页查询方法page
Service层:SetmealService中编写pageQuery方法,在SetmealServiceImpl实现类中实现,使用PageHelper的方法实现分页
Mapper层:在SetmealMapper.xml文件中,使用mybatis代码来实现分页查询,这里用到了左外连接,将setmeal表和category表连接到一起进行查询
3.删除套餐
业务规则:
- 可以一次删除一个套餐,也可以批量删除套餐
- 起售中的套餐不能删除
Controller层:SetmealController类中编写delete()方法,批量删除套餐
Service层:在SetmealService类的实现类SetmealServiceImpl类中实现deleteBatch()方法
注意要先判断套餐的起售状态,如果是起售中的套餐就不能被删除。同时要在id找不到对应套餐的时候有防御机制,比如if(setmeal!=null)
4.修改套餐
接口设计:
- 根据id查询套餐
- 根据类型查询分类(已完成)
- 根据分类id查询菜品(已完成)
- 图片上传(已完成)
- 修改套餐
首先,需要完成根据id查询套餐的功能,通过路径参数{id}来对SetmealVO进行查询,在Controller层中的SetmealController类中以getById()方法实现
Service层:在SetmealServiceImpl类中的getByIdWithDish方法中,需要先通过select()方法获取到一个Setmeal对象,然后通过selectBySetmealId()方法获取到套餐和菜品的关联表,然后通过BeanUtils的方法将Setmeal对象的值赋给SetmealVO对象
修改套餐在Controller层中的SetmealController层以update()方法实现
Service层:在SetmealServiceImpl类中的update()方法实现。首先要将SetmealDTO对象通过BeanUtils的方法转为Setmeal对象,然后通过Mapper层的update()方法来更新,对于套餐菜品关系,要先删除掉原有的套餐菜品关系,并新增更新后的套餐菜品关系,并通过SetmealDish的Mapper层来将套餐菜品关系插入到数据库中
5.起售停售套餐
业务规则:
- 可以对状态为起售的套餐进行停售操作,可以对状态为停售的套餐进行起售操作
- 起售的套餐可以展示在用户端,停售的套餐不能展示在用户端
- 起售套餐时,如果套餐内包含停售的菜品,则不能起售
Controller层:在SetmealController中定义updateStatus()方法,通过路径参数status来改变套餐的起售状态
Service层:在SetmealServiceImpl中,实现updateStatus()方法。首先在起售套餐时,要先判断套餐中的所有菜品是否都处于起售状态,如果有处于停售状态的菜品,则套餐也不能起售。所以在Mapper层新实现了一个selectBySetmealId方法,通过套餐id获取到套餐中的所有菜品,然后判断这些菜品的起售状态。
Mapper层:DishMapper层中定义selectBySetmealId()方法,通过左外连接将dish表和setmeal_dish表连接,查到对应套餐id的所有菜品: