黑马苍穹外卖笔记day4

黑马苍穹外卖笔记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的所有菜品: