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

瑞吉外卖项目学习笔记(七)新增菜品、(批量)删除菜品

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

文章目录

  • 9 菜品管理
    • 9.5 新增菜品
      • 9.5.1 加载菜品分类
      • 9.5.2 保存口味做法配置
      • 9.5.3 新增菜品具体实现
    • 9.6 (批量)删除菜品
      • 9.6.1 需求分析
      • 9.6.2 具体实现

9 菜品管理

9.5 新增菜品

9.5.1 加载菜品分类

在“新增菜品”页面,菜品分类是一个下拉框,因此进入该页面后需要向后端发起查询请求。

这里可以直接调用菜品/套餐分类的分页查询接口,参数要设置成?page=1&pageSize=999999&type=1,表示查询第1页,该页显示999999条记录,相当于查出全部;type=1表示查询的是菜品分类。

9.5.2 保存口味做法配置

t_dish的表结构可知,“新增菜品”页面的口味做法配置并不保存在t_dish表。所以我们新建一个菜品口味关系表t_dish_flavor表来单独保存。

  • 1)在数据库新建菜品口味关系表t_dish_flavor
DROP TABLE IF EXISTS `t_dish_flavor`;
CREATE TABLE `t_dish_flavor` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `dish_id` bigint(20) NOT NULL COMMENT '菜品',
  `name` varchar(64) COLLATE utf8_bin NOT NULL COMMENT '口味名称',
  `value` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '口味数据list',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `create_user` bigint(20) NOT NULL COMMENT '创建人',
  `update_user` bigint(20) NOT NULL COMMENT '修改人',
  `is_deleted` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='菜品口味关系表';
  • 2)使用MyBatisPlus插件生成代码:

  • 3)给DishFlavor实体类的公共字段添加注解:
// com.itweid.takeout.entity.DishFlavor

@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;

@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;

@ApiModelProperty(value = "创建人")
@TableField(fill = FieldFill.INSERT)
private Long createUser;

@ApiModelProperty(value = "修改人")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;

9.5.3 新增菜品具体实现

功能请求方法请求路径
新增菜品POST/dish/add

该接口的入参较为复杂,下面是一个示例:

{
    "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类,添加以上参数,并做参数校验
@Data
@EqualsAndHashCode(callSuper=false)
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "DishQuery对象", description = "菜品查询对象")
public class DishQuery extends BaseQuery {

    @ApiModelProperty(value = "菜品名称")
    @NotBlank(groups = Add.class, message = "菜品名称不能为空")
    private String name;

    @ApiModelProperty(value = "菜品分类ID")
    @NotBlank(groups = Add.class, message = "菜品分类不能为空")
    private String categoryId;

    @ApiModelProperty(value = "菜品价格")
    @NotNull(groups = Add.class, message = "菜品价格不能为空")
    private BigDecimal price;

    @ApiModelProperty(value = "菜品图片")
    @NotNull(groups = Add.class, message = "菜品图片不能为空")
    private String image;

    @ApiModelProperty(value = "菜品描述")
    private String description;

    @ApiModelProperty(value = "口味做法配置")
    private DishFlavor[] flavors;
    
}
  • 2)在DishController类创建add方法,并添加参数校验
@ApiOperation("新增菜品")
@PostMapping("/add")
public BaseResult add(@RequestBody @Validated(Add.class) DishQuery dishQuery) {
    return dishService.addDish(dishQuery);
}
  • 3)在DishServiceImpl类具体实现addDish方法
// com.itweid.takeout.service.impl.DishServiceImpl

@Override
public BaseResult addDish(DishQuery dishQuery) {
    // 1 菜品名称不能重复
    if(lambdaQuery().eq(Dish::getName, dishQuery.getName()).exists()) {
        return BaseResult.error(ErrorCode.DISH_EXIST);
    }
    // 2 新增菜品
    Dish dish = new Dish();
    dish.setName(dishQuery.getName());
    dish.setCategoryId(Long.valueOf(dishQuery.getCategoryId()));
    dish.setPrice(dishQuery.getPrice());
    dish.setImage(dishQuery.getImage());
    dish.setDescription(dishQuery.getDescription());
    // 随机指定商品码
    dish.setCode(UUID.randomUUID().toString());
    save(dish);
    // 3 新增菜品口味配置
    DishFlavor[] flavors = dishQuery.getFlavors();
    if(flavors != null && flavors.length > 0) {
        for(DishFlavor f : flavors) {
            f.setDishId(dish.getId());
            Db.save(f);
        }
    }
    return BaseResult.success();
}
  • 4)重启服务,测试新增菜品功能

  • 5)完善“菜品分类”的显示

Dish实体类中增加categoryName字段:

// com.itweid.takeout.entity.Dish

@ApiModelProperty(value = "菜品分类名称")
@TableField(exist = false)
private String categoryName;

改造DishServiceImpl类的pageQueryDish方法,处理菜品分类名称字段:

// com.itweid.takeout.service.impl.DishServiceImpl

@Override
public BaseResult<Page<Dish>> pageQueryDish(DishQuery dishQuery) {
    Page<Dish> page = new Page<>(dishQuery.getPage(), dishQuery.getPageSize());
    lambdaQuery()
            .like(StringUtils.isNoneBlank(dishQuery.getName()), Dish::getName, dishQuery.getName())
            .page(page);
    if(page.getTotal() > 0){
        for (Dish record : page.getRecords()) {
            // 处理菜品分类
            Category category = Db.getById(record.getCategoryId(), Category.class);
            if(category != null){
                record.setCategoryName(category.getName());
            }
        }
    }
    return BaseResult.success(page);
}

重启服务,测试菜品分类是否显示:

9.6 (批量)删除菜品

9.6.1 需求分析

在“菜品管理”页面,可以直接删除一个菜品,也可以选择多个菜品后批量删除:

功能请求方法请求路径请求参数
新增菜品DELETE/dish/delete{“ids”:“1,2,3”}

9.6.2 具体实现

  • 1)在DishController类中添加delete方法,并添加参数校验
// com.itweid.takeout.controller.DishController

@ApiOperation("(批量)删除菜品")
@DeleteMapping("/delete")
public BaseResult delete(@NotBlank(message = "待删除菜品ID不能为空") String ids) {
    return dishService.deleteDish(ids);
}
  • 2)在DishServiceImpl中具体实现deleteDish方法
// com.itweid.takeout.service.impl.DishServiceImpl

@Value("${dir.upload}")
private String uploadDir;
    
@Override
public BaseResult deleteDish(String ids) {
    String[] idArray = ids.split(",");
    for (String id : idArray) {
        log.info("delete id = {}", id);
        // 先查询出菜品
        Dish dish = getById(id);
        if(dish != null) {
            // 删除菜品
            removeById(dish.getId());
            // 删除菜品口味配置
            Db.lambdaUpdate(DishFlavor.class)
                    .eq(DishFlavor::getDishId, dish.getId())
                    .remove();
            // 删除菜品图片
            File file = new File(uploadDir + dish.getImage());
            if(file.exists()) {
                log.info("delete file = {} => {}", file.getAbsolutePath(), file.delete());
            }
        }
    }
    return BaseResult.success();
}
  • 3)重启服务,测试删除菜品功能

同样由于精度问题导致删除失败。我们只需要给Dish实体类的id字段添加一个@JsonSerialize注解:

// com.itweid.takeout.entity.Dish

@ApiModelProperty(value = "ID")
@TableId(value = "id", type = IdType.AUTO)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
  • 4)重启服务,再次测试删除菜品功能

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


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

相关文章:

  • 【读书笔记】《论语别裁》爱与罪
  • 如何使用Windows快捷键在多显示器间移动窗口
  • mysql 查询优化之字段建立全文索引
  • 顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
  • 一网多平面
  • 链表的详解
  • PHP医院安全(不良)事件管理系统源码,通过运用RCA分析工具,借助柏拉图、鱼骨图等分析工具,分析问题产生的根本原因
  • NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
  • TCP协议【学习指南】
  • GPT Code Interpreter
  • AIDD - 基于多层图注意力神经网络的药物-靶点相互作用预测模型研究
  • Java文字识别OCR API-手写文字识别-生僻字识别-应用场景
  • 视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点
  • 京准电钟解读,NTP网络授时服务器如何提升DCS系统效率
  • 《Vue3 三》Vue 中的 options 选项
  • 使用Qwn2-VL模型批量标注图像内容(图像理解)
  • php中 cli和cgi的区别
  • python 聚类实战
  • 美国加州房价数据分析01
  • 软件测试面试题和简历模板(面试前准备篇)
  • 力扣第115题:不同的子序列 — C语言解法
  • golang , chan学习
  • 62.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目+论文)
  • Java面试题精选:MyBatis(一)
  • 使用RKNN进行YOLOv8人体姿态估计的实战教程:yolov8-pose.onnx转yolov8-pose.rknn+推理全流程
  • Excel生成DBC脚本源文件