当前位置: 首页 > article >正文

瑞吉外卖项目学习笔记(八)修改菜品信息、批量启售/停售菜品

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现
瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现
瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
瑞吉外卖项目学习笔记(五)菜品/套餐分类的增删改查
瑞吉外卖项目学习笔记(六)分页查询菜品列表、实现图片上传和下载
瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品

文章目录

  • 9 菜品管理
    • 9.7 修改菜品
      • 9.7.1 菜品数据回显
      • 9.7.2 修改菜品具体实现
    • 9.8 (批量)启售/停售菜品
      • 9.8.1 需求分析
      • 9.8.2 具体实现
    • 9.9 完善删除菜品分类功能

9 菜品管理

9.7 修改菜品

9.7.1 菜品数据回显

点击“修改”菜品按钮,进入修改页面,首先需要根据菜品ID查询菜品信息进行数据回显。不仅要返回菜品的基本信息,还要返回菜品的口味配置信息。

功能请求方法请求路径请求参数
根据ID查询菜品信息GET/dish/get?id=1
  • 1)在实体类Dish中添加flavors属性,用于保存菜品对应的口味配置
// com.itweid.takeout.entity.Dish

@ApiModelProperty(value = "菜品口味配置")
@TableField(exist = false)
private DishFlavor[] flavors;
  • 2)在DishController类中添加get方法
// com.itweid.takeout.controller.DishController

@ApiOperation("根据ID查询菜品")
@GetMapping("/get")
public BaseResult<Dish> get(@NotNull(message = "菜品ID不能为空") Long id) {
    return dishService.getDishById(id);
}
  • 3)在DishServiceImpl类中具体实现getDishById方法
// com.itweid.takeout.service.impl.DishServiceImpl

@Override
public BaseResult<Dish> getDishById(Long id) {
    // 查询菜品信息
    Dish dish = getById(id);
    if(dish != null) {
        // 查菜品口味配置
        List<DishFlavor> dishFlavorList = Db.lambdaQuery(DishFlavor.class)
                .eq(DishFlavor::getDishId, dish.getId())
                .list();
        if(dishFlavorList != null && !dishFlavorList.isEmpty()) {
            dish.setFlavors(dishFlavorList.toArray(new DishFlavor[0]));
        }
    }
    return BaseResult.success(dish);
}
  • 4)重启服务,测试数据回显

大部分数据成功回显,但菜品分类没有成功回显。原因还是Long类型数据的精度丢失问题。(所以根本没必要把ID搞得这么大。。。)

  • 5)给Dish实体类的categoryId字段添加@JsonSerialize(using = ToStringSerializer.class)注解,重启服务,再次测试数据回显

9.7.2 修改菜品具体实现

功能请求方法请求路径
修改菜品PUT/dish/edit

该接口的入参也跟新增菜品一样,比新增菜品多了一个菜品ID,下面是一个示例:

{
    "id":"1397852391150759938", //菜品ID
    "name":"辣子鸡", //菜品名称
    "price":14.99, //菜品价格
    "image":"e7cff7e7-4f63-4e3a-8001-6866e27f82d6.png", //菜品图片
    "description":"辣子鸡真的好吃!!", //菜品描述
    "categoryId":"1397844263642378242", //菜品分类ID
    "flavors":[ //口味做法配置
        {
            "name":"甜味",
            "value":"[\"无糖\",\"少糖\",\"半糖\"\"多糖\",\"全糖\"]",
            "showOption":false
            
        },{
            "name":"温度",
            "value":"[\"热饮\",\"常温\",\"去冰\",\"少冰\",\"多冰\"]",
            "showOption":false
            
        },{
            "name":"忌口",
            "value":"[\"不要葱\",\"不要蒜\",\"不要香菜\",\"不要辣\"]",
            "showOption":false
            
        },{
            "name":"辣度",
            "value":"[\"不辣\",\"微辣\",\"中辣\",\"重辣\"]",
            "showOption":false
        }
    ]
}
  • 1)在DishQuery查询类中添加id属性,并添加修改菜品的表单校验规则

  • 2)在DishController类中添加edit方法
// com.itweid.takeout.controller.DishController

@ApiOperation("修改菜品")
@PutMapping("/edit")
public BaseResult edit(@RequestBody @Validated(Edit.class) DishQuery dishQuery) {
    return dishService.editDish(dishQuery);
}
  • 3)在DishServiceImpl中具体实现editDish方法
// com.itweid.takeout.service.impl.DishServiceImpl

@Override
public BaseResult editDish(DishQuery dishQuery) {
    // 1 查询原菜品信息
    Dish exDish = getById(dishQuery.getId());
    if(exDish == null) {
        return BaseResult.error(ErrorCode.DISH_NOT_EXIST);
    }
    // 2 修改菜品基本信息
    Dish newDish = new Dish();
    newDish.setId(exDish.getId());
    if(!exDish.getName().equals(dishQuery.getName())) {
        newDish.setName(dishQuery.getName());
    }
    if(!exDish.getCategoryId().equals(Long.valueOf(dishQuery.getCategoryId()))) {
        newDish.setCategoryId(exDish.getCategoryId());
    }
    if(!exDish.getPrice().equals(dishQuery.getPrice())) {
        newDish.setPrice(dishQuery.getPrice());
    }
    if(!exDish.getImage().equals(dishQuery.getImage())) {
        newDish.setImage(dishQuery.getImage());
    }
    if(!exDish.getDescription().equals(dishQuery.getDescription())) {
        newDish.setDescription(dishQuery.getDescription());
    }
    updateById(newDish);
    // 3 修改菜品口味做法配置
    DishFlavor[] flavors = dishQuery.getFlavors();
    if(flavors != null && flavors.length > 0) {
        // 删除原有配置
        Db.lambdaUpdate(DishFlavor.class)
                .eq(DishFlavor::getDishId, exDish.getId())
                .remove();
        // 增加新配置
        for(DishFlavor f : flavors) {
            f.setDishId(exDish.getId());
            Db.save(f);
        }
    }
    // 4 删除旧的菜品图片
    if(!exDish.getImage().equals(dishQuery.getImage())) {
        File file = new File(uploadDir + exDish.getImage());
        if(file.exists()) {
            log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());
        }
    }
    return BaseResult.success();
}
  • 4)重启服务,测试修改菜品功能

9.8 (批量)启售/停售菜品

9.8.1 需求分析

功能请求方法请求路径请求参数
修改菜品PUT/dish/status{“id”: “1,2”, “status”: 0}

参数id指需要修改状态的菜品ID,多个菜品ID时使用英文逗号隔开;
参数status指需要改到的状态,0表示停售,1表示启售。

9.8.2 具体实现

  • 1)在DishController类中添加status方法,并添加表单校验规格
// com.itweid.takeout.controller.DishController

@ApiOperation("修改菜品状态")
@PutMapping("/status")
public BaseResult status(@RequestBody @Validated(EditStatus.class) DishQuery dishQuery) {
    return dishService.editDishStatus(dishQuery);
}
  • 2)在DishServiceImpl中具体实现editDishStatus方法
// com.itweid.takeout.service.impl.DishServiceImpl

@Override
public BaseResult editDishStatus(DishQuery dishQuery) {
    String ids = dishQuery.getId();
    for (String id : ids.split(",")) {
        Dish dish = new Dish();
        dish.setId(Long.valueOf(id));
        dish.setStatus(dishQuery.getStatus());
        updateById(dish);
    }
    return BaseResult.success();
}
  • 3)重启服务,测试功能

9.9 完善删除菜品分类功能

在“分类管理”菜单中,进行删除分类时,需要先判断改分类是否已被菜品使用。如果已被使用,则不能删除。

改造``类的deleteCategory方法:

// com.itweid.takeout.service.impl.CategoryServiceImpl

@Override
public BaseResult deleteCategory(Long id) {
    // 判断该分类是否已被菜品使用
    if(Db.lambdaQuery(Dish.class)
            .eq(Dish::getCategoryId, id)
            .exists()) {
        return BaseResult.error(ErrorCode.CATEGORY_IS_USED);
    }
    boolean remove = removeById(id);
    return remove ? BaseResult.success() : BaseResult.error(ErrorCode.CATEGORY_NOT_EXIST);
}

重启服务,测试功能:

本节完,更多内容查阅:瑞吉外卖项目实战


http://www.kler.cn/a/452213.html

相关文章:

  • YOLOv9-0.1部分代码阅读笔记-lion.py
  • day14-16系统服务管理和ntp和防火墙
  • es 3期 第18节-分页查询使用避坑的一些事
  • LeetCode 844. 比较含退格的字符串 (C++实现)
  • Yolo11改进策略:Head改进|DynamicHead,利用注意力机制统一目标检测头部|即插即用
  • “檢測到不安全的代理”怎麼修復?
  • Matplotlib中隐藏坐标轴但保留坐标轴标签的3D图
  • 面经zhenyq
  • 图像处理-Ch5-图像复原与重建
  • 前端取Content-Disposition中的filename字段与解码(vue)
  • 「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
  • 【Select 语法全解密】.NET开源ORM框架 SqlSugar 系列
  • CPU架构的变化史
  • 用Python写炸金花游戏
  • CoinShares预测2025年加密市场前景看涨
  • 【k8s】在ingress-controlller中Admission Webhook 的作用
  • 批量识别工作表中二维码信息-Excel易用宝
  • 【UE5 C++课程系列笔记】11——FString、FName、FText的基本使用
  • C 语言基础运算:输入两个整数并计算和、差、积
  • Python:模拟(包含例题:饮料换购 图像模糊 螺旋矩阵)
  • CSS|15 CSS3圆角矩形透明度
  • Java反射学习(4)(“反射“机制获取成员方法及详细信息(Method类))
  • 用于航空发动机故障诊断的深度分层排序网络
  • [项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结
  • 宠物行业的出路:在爱与陪伴中寻找增长新机遇
  • PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读