管理端的套餐管理内容~~~
- 根据id查询setmeal表的套餐内容----这个接口是为了后续服务,修改套餐内容时候前端显示的如下图所示:

我们点击修改后它会自动调用查询setmeal表展示出来,并且会根据setmeal表中的setmeal_id去查询setmeal_dish表..........下面是这个接口的文档:


前端传递参数在路径中所以别忘记@Pathvariable,后端返回给前端的内容也很清晰,一个setmealVO对象存储的Data(一般后端往前端返回的都是VO封装的数据)----
所以我们实现的逻辑就是拿到套餐id去查询套餐表,将数据填充至VO中,此时还有setmealdish这个表没有查询,根据前面查询到的setmeal_id去查询得到的是一个List<setmealdish>,同样存入VO中返回给前端!
下图是controller层代码:

下图是service层代码:

这里需要调用两个mapper因为需要查询两个表,这俩SQL都是基础的SQL就懒得展示了,大致就是select * from table where id=?
- 分页查询
分页查询就是把我们的所有的套餐展示出来如下图所示:

前面员工管理和菜品管理都是这样做的,本次套餐管理其实也是同理。
首先是前端会传输一个PageQueryDTO对象过来,里面存储着page,pagesize以及需要精确查询的字段(这个不必须)。后端需要返回一个total以及records存储在PageResult对象中。
这里的Total表示数据库里总共有多少条套餐数据~
records表示的是当前分页的数据集合也就是List<setmealVO>(这里为什么是VO因为返回给前端的通常是VO)~
所以controller层代码如下:

主要就是service层的pageQuery:

这里我们同样借助PageHelper帮助分页,我们将当前需要查询的页数以及pagesize传给它,它就会给我们下面的SQL改造!下图是原理:

最后是我们Mapper层的SQL编写,由于我们返回的时候需要分类名称,但是setmeal中只有id,所以我们需要left join category表!
下图是mapper层XML中的SQL:

包含表联合查询,以及精确查询的动态SQL~
- 新增套餐

前端通过json传参,一般前端传参我们用DTO接收参数手写一个捏如下图所示:

实际上新增就是让我们把前端传过来的参数按照业务逻辑插入到对应的表中~
所以controller层代码如下:

详细的业务实现都在service层
梳理一下service层需要的业务逻辑=>
-
首先就是要插入新的套餐表,所以要将DTO转为entity对象进行插入
-
其次由于每个套餐可能会绑定多个菜品,有一个setmealDish表也需要进行插入
-
这俩的插入需要@Transactional
service层代码如下:

这里的CacheEvict后面讲Redis缓存删除的时候有,为了保持数据的一致性。
讲一下这里代码的逻辑,首先就是插入套餐表中,这里由于插入前该套餐是没有id的,因为数据库的id是自增的,而在setmealDish这个表中需要id,所以在插入套餐表的时候需要将生成的id存入entity中,好让后续取到所以mapper中的代码如下:

并且在外层的mapper中还需要AutoFill一下createTime这些值
之后遍历setmealDish将得到的id一个一个插入,这里就不在for循环的时候去插入setmealDish表了这样效率太低,用mybatis的foreach进行插入!如下图所示:

总共是调用了两个mapper层,一个setmeal另一个setmealDish。
- 修改套餐内容
本质上就是update功能

和上面的insert其实前端传输的参数都一样,所以controller层就不多说了但是注意这里是put操作代码如下:

将接收的setmealDTO传给service层实现业务逻辑=>
1.修改套餐 涉及到套餐表所以需要修改套餐表的内容
- 可能修改套餐里面的菜品所以同样需要修改setmealDish表,但是修改这个表的话有的情况太过复杂,不如把相关的先全删了再重新插入
代码如下:

这里调用了三次Mapper层,逐一讲一下
(1)首先是第一个setmealMapper.update 就是封装成entity后更新套餐表,这里需要用到动态SQL因为可能有的内容不更新,如果不用动态SQL,字段就会变成null;代码如下:

(2) 第二个就是setmealDishMapper.deleteBySetmealId 就是前面提到的不如先把所以关联的数据先删除这里用简单的SQL就可以做到了
(3) 在2删除完之后我们需要重新插入关联的菜品,这里需要注意的是可能前端没给我们它具体关联的套餐id,所以需要手动赋值,最后调用前面新增套餐时候封装好的insertBatch接口插入表就好了。
- 修改套餐状态
分析:这里只需要修改一个表,就是套餐表!要把套餐起售首先需要判断套餐里面的菜品是否是起售状态,如果不是则不可以起售套餐。反而禁售套餐不需要判断直接禁用即可。
实现:做好逻辑判断 更新的时候封装成entity用修改套餐信息的接口更新接好了;service的代码如下:

- 批量删除套餐

前端传输一个String类型的ids,这里我们需要处理成List用@RequestParam 可以自动帮我们处理
controller代码如下:

service的逻辑和代码都在里头了:
