【苍穹外卖-day4】
本文总结了苍穹外卖项目day04的开发内容,主要完成了菜品管理和套餐管理模块功能。重点实现了套餐管理全流程功能,包括新增套餐、分页查询、根据ID查询、删除、修改和起售停售套餐。在新增套餐时,通过事务管理确保套餐数据和关联菜品数据的一致性;分页查询采用多表联查获取分类名称;删除套餐时检查在售状态;修改套餐时先删除原有菜品再新增修改后的菜品。技术实现上使用了MyBatis、PageHelper分页、A
《苍穹外卖-day04》
0. 今日总结
- 完成菜品管理模块中的 菜品起售停售 功能
- 完成套餐管理模块所有业务功能,包括
- 新增套餐
- 套餐分页查询
- 根据id查找套餐
- 删除套餐
- 修改套餐
- 起售停售套餐
1. 新增套餐
-
controller层

接收前端传来的数据,并通过RequestBody封装成setmealDTO对象
-
service层

在新增套餐时,不仅要新增套餐数据,还要将套餐关联的菜品也新增到套餐菜品表
-
新增套餐数据
- 创建setmeal对象,并通过BeanUtils的方法将同名变量直接一次性赋值
- 调用mapper层接口插入数据
-
新增套餐对应菜品数据
- 先获取套餐id,由前端传入
- 获取前端传入的菜品列表
- 对每个菜品列表的setmealId赋值
- 对菜品列表遍历,调用mapper层接口,依次将菜品数据插入setmealDish表
-
添加@Transactional注解
保证插入操作的一致性
-
-
mapper层
-
新增套餐数据接口


-
加上AutoFill注解,通过AOP技术实现公共字段的自动赋值。
-
在mapper.xml文件中加上
以此获得插入后数据的id值(这个id前端不会传给setmealDTO,而是插入后根据主键自动获得,因此要多这一步) -
执行插入操作
-
-
新增套餐对应菜品接口


- 这里不用加AutoFill注解,因为setmeal_dish中的数据没有需要修改的公共属性
- 插入操作正常进行即可
-
2. 套餐分页查询
-
controller层

- SetmealPageQueryDTO接收前端传来的数据
- 把数据封装到pageResult对象中
-
service层

- 启动PageHelper,将页码和每页大小传入
- 用PageHelper的专门对象Page接收mapper层查询的结果,查询的每个结果应当时SetmealVO对象(因为包含了categoryName字段)
-
mapper层


多表查询,并且要注意将c.name取别名为categroyName,这样才能被spring自动装配,否则c.name和s.name对应的变量名都是name
3. 根据id查找套餐
-
controller层

- 接收前端传来的id数据,并加上@PathVariable注解将该id作为路径参数
- 注意到,接口文档中后端返回给前端的查询数据除了包含套餐,还包含套餐对应的菜品集合,因此要封装成SetmealVO对象返回给前端
-
service层

- 调用setmealMapper接口,查询套餐id对应的套餐
- 调用setmealDishMapper接口,查找套餐id对的菜品
- 将setmealVO对象的setmealDishes属性设置为第二步查到得到的菜品
- 将setmealVO返回给controller层
-
mapper层
- 查询套餐ID对应的套餐


多表查询,并将c.name取别名为categoryName用于自动封装
- 查询套餐id对应的菜品

4. 删除套餐
-
controller层

接收前端传来的ids,并用List<Long>接收,这样更便于获取每个id
-
service层

- 添加@Transactional注解,保证删除操作的一致性
- 遍历ids集合,调用根据id查找套餐的方法得到套餐数据(包括套餐和套餐对应菜品)
- 判断传入的ids中的每个id对应的套餐状态是否为在售,如果在售则抛出异常,拒绝删除
- 如果ids中不包含在售菜品,则遍历ids,分别删除套餐id对应的套餐及包含的菜品
-
mapper层
- 删除套餐

- 删除菜品

5. 修改套餐
-
controller层

将前端传入的json数据用SetmealDTO接收,加上@RequestBody注解
-
service层

分析:修改套餐数据,其实是修改套餐数据和套餐对应的菜品数据,因此要分成两步
-
修改套餐
创建Setmeal对象,并用copyProperties方法将同名变量赋值给setmeal,接着调用mapper层接口对setmeal的id的套餐进行修改。
-
修改套餐对应菜品数据
思路是:如果修改前前绑定了菜品,则将修改前的菜品都删除,再将修改后的菜品插入
因此,先获得修改前套餐的id setmealId,并根据套餐id查找对应的菜品集合defaultDishes,同时通过前端传入的数据,抽取setmealDishes对象表示修改后的菜品数据,并依次对修改后的菜品的setmealId进行赋值,该值就是传入的套餐id。
判断,如果修改前非空,则调用setmealDishMapper的deleteById接口一次性删除所有当前套餐id下的菜品数据。
判断,如果修改后非空,则将修改后的菜品数据依次插入setmealDish表
-
-
mapper层
-
修改套餐


- 加上AutoFill注解,完成公共字段自动赋值
- 通过动态SQL修改各个可能修改的字段
-
修改菜品
- 根据套餐id获得该套餐id对应的所有菜品数据

- 根据套餐id删除该套餐id对应的所有菜品数据

- 插入菜品数据


-
6. 根据套餐id查询菜品
-
controller层
无,因为这个接口是为了起售停售套餐服务
-
service层
无,因为这个接口是为了起售停售套餐服务
-
mapper层

多表查询dish和setmeal_dish表,查询条件为setmeal_dish表的setmeal_id和传入的setmeal的id相同
7. 起售停售套餐
-
controller层

传入状态数据status作为路径参数,并传入id,作为要修改的套餐id
-
service层

思路:在修改状态前,如果要修改为起售,则应该先判断套餐包含的菜品中是否有菜品为停售,如果有,则不能起售该套餐,而菜品的起售状态在dish表中存储
- 如果status是起售,则要判断
- 采用dishMapper的getBySetmealId方法,根据setmeal id查找对应dish表中的菜品
- 遍历查找到的菜品,依次判断,如果有至少一个菜品是停售,则抛出异常,拒绝将整个套餐设置为起售
- 如果每个菜品都是起售,则执行切换状态操作,创建一个Setmeal对象,只给status和id赋值,调用mapper接口将套餐id为id(前端传入)的套餐的状态设置为status(前端传入)
-
mapper层


- 加上AutoFill注解,完成公共字段自动赋值
- 通过动态SQL修改各个可能修改的字段
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)