苍穹外卖-修改菜品(口味信息先删除再添加)

修改菜品

5.1 需求分析和设计

5.1.1 产品原型

在菜品管理列表页面点击修改按钮,跳转到修改菜品页面,在修改页面回显菜品相关信息并进行修改,最后点击保存按钮完成修改操作。

修改菜品原型:

5.1.2 接口设计

通过对上述原型图进行分析,该页面共涉及4个接口。

接口实现顺序:

  • 根据id查询菜品

  • 根据类型查询分类(已实现)

  • 文件上传(已实现)

  • 修改菜品

我们只需要实现根据id查询菜品修改菜品两个接口,接下来,我们来重点分析这两个接口。

1). 根据id查询菜品

2). 修改菜品

注:因为是修改功能,请求方式可设置为PUT。

5.2 代码开发

5.2.1 根据id查询菜品实现

1). Controller层

根据id查询菜品的接口定义在DishController中创建方法:

   /**
     * 根据id查询菜品
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询菜品")
    public Result<DishVO> getById(@PathVariable Long id) {
        log.info("根据id查询菜品:{}", id);
        DishVO dishVO = dishService.getByIdWithFlavor(id);//后绪步骤实现
        return Result.success(dishVO);
    }

2). Service层接口

在DishService接口中声明getByIdWithFlavor方法:

    /**
     * 根据id查询菜品和对应的口味数据
     *
     * @param id
     * @return
     */
    DishVO getByIdWithFlavor(Long id);

3). Service层实现类

在DishServiceImpl中实现getByIdWithFlavor方法:

    /**
     * 根据id查询菜品和对应的口味数据
     *
     * @param id
     * @return
     */
    public DishVO getByIdWithFlavor(Long id) {
        //根据id查询菜品数据
        Dish dish = dishMapper.getById(id);
​
        //根据菜品id查询口味数据
        List<DishFlavor> dishFlavors = dishFlavorMapper.getByDishId(id);//后绪步骤实现
​
        //将查询到的数据封装到VO
        DishVO dishVO = new DishVO();
        BeanUtils.copyProperties(dish, dishVO);
        dishVO.setFlavors(dishFlavors);
​
        return dishVO;
    }

4). Mapper层

在DishFlavorMapper中声明getByDishId方法,并配置SQL:

   /**
     * 根据菜品id查询对应的口味数据
     * @param dishId
     * @return
     */
    @Select("select * from dish_flavor where dish_id = #{dishId}")
    List<DishFlavor> getByDishId(Long dishId);

5.2.1 修改菜品实现

1). Controller层

根据修改菜品的接口定义在DishController中创建方法:

  /**
     * 修改菜品
     *
     * @param dishDTO
     * @return
     */
    @PutMapping
    @ApiOperation("修改菜品")
    public Result update(@RequestBody DishDTO dishDTO) {
        log.info("修改菜品:{}", dishDTO);
        dishService.updateWithFlavor(dishDTO);
        return Result.success();
    }

2). Service层接口

在DishService接口中声明updateWithFlavor方法:

 /**
     * 根据id修改菜品基本信息和对应的口味信息
     *
     * @param dishDTO
     */
    void updateWithFlavor(DishDTO dishDTO);

3). Service层实现类

在DishServiceImpl中实现updateWithFlavor方法:

  /**
     * 根据id修改菜品基本信息和对应的口味信息
     *
     * @param dishDTO
     */
    public void updateWithFlavor(DishDTO dishDTO) {
        Dish dish = new Dish();
        BeanUtils.copyProperties(dishDTO, dish);
​
        //修改菜品表基本信息
        dishMapper.update(dish);
​
        //删除原有的口味数据
        dishFlavorMapper.deleteByDishId(dishDTO.getId());
​
        //重新插入口味数据
        List<DishFlavor> flavors = dishDTO.getFlavors();
        if (flavors != null && flavors.size() > 0) {
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishDTO.getId());
            });
            //向口味表插入n条数据
            dishFlavorMapper.insertBatch(flavors);
        }
    }

核心思想--先删除再添加 

4). Mapper层

在DishMapper中,声明update方法:

 /**
     * 根据id动态修改菜品数据
     *
     * @param dish
     */
    @AutoFill(value = OperationType.UPDATE)
    void update(Dish dish);

并在DishMapper.xml文件中编写SQL:

<update id="update">
        update dish
        <set>
            <if test="name != null">name = #{name},</if>
            <if test="categoryId != null">category_id = #{categoryId},</if>
            <if test="price != null">price = #{price},</if>
            <if test="image != null">image = #{image},</if>
            <if test="description != null">description = #{description},</if>
            <if test="status != null">status = #{status},</if>
            <if test="updateTime != null">update_time = #{updateTime},</if>
            <if test="updateUser != null">update_user = #{updateUser},</if>
        </set>
        where id = #{id}
</update>

小结

接口实现顺序:

  • 根据id查询菜品

  • 根据类型查询分类(已实现)

  • 文件上传(已实现)

  • 修改菜品

 /**
     * 根据id修改菜品基本信息和对应的口味信息
     *
     * @param dishDTO
     */
    public void updateWithFlavor(DishDTO dishDTO) {
        Dish dish = new Dish();
        BeanUtils.copyProperties(dishDTO, dish);

        //修改菜品表基本信息
        dishMapper.update(dish);

        //删除原有的口味数据
        dishFlavorMapper.deleteByDishId(dishDTO.getId());

        //重新插入口味数据
        List<DishFlavor> flavors = dishDTO.getFlavors();
        if (flavors != null && flavors.size() > 0) {
            flavors.forEach(dishFlavor -> {
                dishFlavor.setDishId(dishDTO.getId());
            });
            //向口味表插入n条数据
            dishFlavorMapper.insertBatch(flavors);
        }
    }

更新关联表的核心思路--先删除再添加 

<think>好的,我需要回答用户关于苍穹外卖项目第三天学习内容的问题。首,用户提到他们想了解第三天的内容或代码解析,但根据提供的引用资料,只有day02、day06和OrderService的引用,没有直接的day03的信息。 我需要确认是否有可用的相关信息。检查引用[1]到[4],发现主要涉及第二天的员工信息修改、第六天的微信小程序开发、分类查询和再来一单功能,没有明确提到第三天的内容。因此,可能需要根据现有资料推测第三天可能涉及的内容,或者建议用户查阅其他资料。 考虑到项目通常的学习路径,第三天可能涉及的功能可能包括订单管理、菜品分类或接口开发。例如,引用[3]提到了根据分类ID查询菜品口味,引用[4]提到了再来一单功能,这些可能与订单处理有关,但不确定是否属于第三天内容。 另外,需要遵守用户提供的系统级指令,如使用正确的LaTeX格式,生成相关问题,并在回答末尾添加引用标识。因此,在回答时,应明确说明现有引用中没有直接关于第三天的信息,并基于项目常见结构推测可能内容,同时建议用户参考官方文档或课程材料。 最后,生成相关问题,引导用户进一步探索相关主题,如订单管理、接口开发或分类查询的实现。</think>根据现有资料,苍穹外卖项目Day3的具体学习内容未在提供的引用中明确提及[^1][^2][^3][^4]。但根据项目开发常见流程,推测可能涉及以下核心内容: ### 典型功能模块推测 1. **菜品管理模块** - 实现菜品新增/修改接口开发 - 文件上传功能实现(OSS/MinIO) ```java // 示例:文件上传接口 @PostMapping("/upload") public Result<String> upload(MultipartFile file) { String fileName = file.getOriginalFilename(); // 调用OSS服务上传文件 return Result.success(uploadUrl); } ``` 2. **分类管理扩展** - 多级分类树形结构实现 - 分类状态批量修改 ```java // 示例:树形结构DTO public class CategoryTreeDTO { private Long id; private String name; private List<CategoryTreeDTO> children; } ``` 3. **套餐管理基础** - 套餐与菜品关联关系设计 - 套餐分页查询接口开发 ### 技术要点分析 $$ \text{项目复杂度} = \sum_{i=1}^{n}(模块耦合度 \times 业务逻辑复杂度) $$ 需要特别注意: 1. 实体关系映射(菜品-分类N:1关系) 2. 统一异常处理增强 3. 参数校验规范完善
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值