《苍穹外卖-day04》

0. 今日总结

  1. 完成菜品管理模块中的 菜品起售停售 功能
  2. 完成套餐管理模块所有业务功能,包括
    1. 新增套餐
    2. 套餐分页查询
    3. 根据id查找套餐
    4. 删除套餐
    5. 修改套餐
    6. 起售停售套餐

1. 新增套餐

  1. controller层

    image-20251121130441758

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

  2. service层

    image-20251121130536021

    在新增套餐时,不仅要新增套餐数据,还要将套餐关联的菜品也新增到套餐菜品表

    1. 新增套餐数据

      1. 创建setmeal对象,并通过BeanUtils的方法将同名变量直接一次性赋值
      2. 调用mapper层接口插入数据
    2. 新增套餐对应菜品数据

      1. 先获取套餐id,由前端传入
      2. 获取前端传入的菜品列表
      3. 对每个菜品列表的setmealId赋值
      4. 对菜品列表遍历,调用mapper层接口,依次将菜品数据插入setmealDish表
    3. 添加@Transactional注解

      保证插入操作的一致性

  3. mapper层

    1. 新增套餐数据接口

      image-20251121131035267

      image-20251121131047611

      1. 加上AutoFill注解,通过AOP技术实现公共字段的自动赋值。

      2. 在mapper.xml文件中加上image-20251121131142459以此获得插入后数据的id值(这个id前端不会传给setmealDTO,而是插入后根据主键自动获得,因此要多这一步)

      3. 执行插入操作

    2. 新增套餐对应菜品接口

      image-20251121131548303

      image-20251121131559006

      1. 这里不用加AutoFill注解,因为setmeal_dish中的数据没有需要修改的公共属性
      2. 插入操作正常进行即可

2. 套餐分页查询

  1. controller层

    image-20251121131814786

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

    image-20251121131826732

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

    image-20251121131837327

    image-20251121131847884

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

3. 根据id查找套餐

  1. controller层

    image-20251121132705607

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

    image-20251121132723014

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

    1. 查询套餐ID对应的套餐

    image-20251121132739991

    image-20251121132747950

    多表查询,并将c.name取别名为categoryName用于自动封装

    1. 查询套餐id对应的菜品

    image-20251121132759683

4. 删除套餐

  1. controller层

    image-20251121132231759

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

  2. service层

    image-20251121132242707

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

    1. 删除套餐

    image-20251121132253597

    1. 删除菜品

    image-20251121132305760

5. 修改套餐

  1. controller层

    image-20251121112133632

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

  2. service层

    image-20251121112237976

    分析:修改套餐数据,其实是修改套餐数据和套餐对应的菜品数据,因此要分成两步

    1. 修改套餐

      创建Setmeal对象,并用copyProperties方法将同名变量赋值给setmeal,接着调用mapper层接口对setmeal的id的套餐进行修改。

    2. 修改套餐对应菜品数据

      思路是:如果修改前前绑定了菜品,则将修改前的菜品都删除,再将修改后的菜品插入

      因此,先获得修改前套餐的id setmealId,并根据套餐id查找对应的菜品集合defaultDishes,同时通过前端传入的数据,抽取setmealDishes对象表示修改后的菜品数据,并依次对修改后的菜品的setmealId进行赋值,该值就是传入的套餐id。

      判断,如果修改前非空,则调用setmealDishMapper的deleteById接口一次性删除所有当前套餐id下的菜品数据。

      判断,如果修改后非空,则将修改后的菜品数据依次插入setmealDish表

  3. mapper层

    1. 修改套餐

      image-20251121133918015

      image-20251121133949304

      1. 加上AutoFill注解,完成公共字段自动赋值
      2. 通过动态SQL修改各个可能修改的字段
    2. 修改菜品

      1. 根据套餐id获得该套餐id对应的所有菜品数据

      image-20251121112816115

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

      image-20251121112846033

      1. 插入菜品数据

      image-20251121112911187

      image-20251121112920822

6. 根据套餐id查询菜品

  1. controller层

    无,因为这个接口是为了起售停售套餐服务

  2. service层

    无,因为这个接口是为了起售停售套餐服务

  3. mapper层

    image-20251121133654635

    多表查询dish和setmeal_dish表,查询条件为setmeal_dish表的setmeal_id和传入的setmeal的id相同

7. 起售停售套餐

  1. controller层

    image-20251121133420360

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

  2. service层

    image-20251121133437109

    思路:在修改状态前,如果要修改为起售,则应该先判断套餐包含的菜品中是否有菜品为停售,如果有,则不能起售该套餐,而菜品的起售状态在dish表中存储

    1. 如果status是起售,则要判断
    2. 采用dishMapper的getBySetmealId方法,根据setmeal id查找对应dish表中的菜品
    3. 遍历查找到的菜品,依次判断,如果有至少一个菜品是停售,则抛出异常,拒绝将整个套餐设置为起售
    4. 如果每个菜品都是起售,则执行切换状态操作,创建一个Setmeal对象,只给status和id赋值,调用mapper接口将套餐id为id(前端传入)的套餐的状态设置为status(前端传入)
  3. mapper层

    image-20251121133842526

    image-20251121134559000

    1. 加上AutoFill注解,完成公共字段自动赋值
    2. 通过动态SQL修改各个可能修改的字段
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐