• 黑马瑞吉外卖之新增菜品


    前端页面分析以及需求分析

    接下来我们去完成新增菜品的功能。首先还是来看前端页面。
    新增菜品这个功能自然是在菜品的前端功能界面。
    首先来看这个界面,这里绑定了按钮,并传入add。
    在这里插入图片描述
    调用到下面的方法,st就是掺入的一个参数,由上面可知传入了add,所以这里就是走到添加菜品的页面。
    在这里插入图片描述

    在这里插入图片描述
    一路追溯的话其实可以看到其实还是调用到了这个请求,其实这个请求就是为了获取到分类,这个获取分类的功能其实我们之前写过,就是分类功能界面里面。
    在这里插入图片描述
    所以调用的就是原来的我们的功能实现,这里传入参数type,值为1,所以最终查询的就是菜品。
    在这里插入图片描述

    在这里插入图片描述

    所以我们找到这个界面。所以就是走·到这个界面,但是你会发现这个界面里面还有一些新的出来的属性,口味?

    在这里插入图片描述

    先运行项目来看这个界面,这是添加菜品的前端界面,可以看到这里有一些供选的数据选项。

    在这里插入图片描述

    我们可以在菜品分类这里获取到菜品分类。

    当我们点击到这里这个框的时候就会出现下面这些供选的列表数据。
    在这里插入图片描述
    然后还可以添加数据。我们可以在相应的口味名称下面添加一些口味。
    在这里插入图片描述
    那么这个是如何实现的,还是来看我们的前端页面。
    我们可以定位到这个方法,该方法其实是对口味这个数据模型设置了一些值。

    在这里插入图片描述
    在上面挂载的方法对此进行了调用
    在这里插入图片描述
    那么从该页面来看,前端这里其实菜品是关联了口味这些数据,并且前端保存了一些预备的临时数据,我们进行添加菜品的时候要多口味进行选择,然后提交给后端。所以我们得出一个要求就是一定需要有一个菜品和口味的关联的表,所以我们就会想到还需要新的实体类,其实数据库设计的时候具有对口味表的提供。
    在这里插入图片描述
    是如何关联的呢?其实还是和之气前的一样的关联的方法,就像套餐和菜品的关联的方式一样,通过在一张表中对应到对方的id。

    所以在数据库给出这样的表折后我们还需要设置对应的实体类。
    叫做菜品口味实体类。

    其实我们可以去运行项目,我们现在先不要写后端代码,运行程序,添加菜品,然后在浏览器中去查询请求这些数据。我们到这里去添加菜品。
    在这里插入图片描述
    我们可以去看标头
    在这里插入图片描述

    在负载这里我们也可以查看到具体的参数。

    在这里插入图片描述

    其实你通过这里可以非常清楚的看到,提交的信息划分为两类,一类是菜品,一类是口味。于是后端在保存提交的彩屏的时候需要去一方面保存菜品,一方面保存菜品关联口味这些数据。

    还是十分容易设计的。

    后端菜品添加的功能开发

    这里首先还需要再DishDto这里扩展一下字段属性,口味数据是列表形式的数据。
    在这里插入图片描述

    首先我么按照口味表来设计出来实体类和相关的三层架构的类。

    package com.jgdabc.entity;
    
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableId;
    import lombok.Data;
    import java.io.Serializable;
    import java.time.LocalDateTime;
    
    /**
    菜品口味
     */
    @Data
    public class DishFlavor implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
    
        //菜品id
        private Long dishId;
    
    
        //口味名称
        private String name;
    
    
        //口味数据list
        private String value;
    
    
        @TableField(fill = FieldFill.INSERT)
        private LocalDateTime createTime;
    
    
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private LocalDateTime updateTime;
    
    
        @TableField(fill = FieldFill.INSERT)
        private Long createUser;
    
    
        @TableField(fill = FieldFill.INSERT_UPDATE)
        private Long updateUser;
    
    
        //是否删除
        private Integer isDeleted;
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    于是还是按照之前的一个过程,设计mapper也就是dao层,然后service,然后service的实现类,
    dao层

    package com.jgdabc.mapper;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.jgdabc.entity.DishFlavor;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface DishFlavorMapper extends BaseMapper<DishFlavor> {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    service层

    package com.jgdabc.service;
    
    import com.baomidou.mybatisplus.extension.service.IService;
    import com.jgdabc.entity.DishFlavor;
    
    public interface DishFlavorService extends IService<DishFlavor> {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    然后service的实现类。

    package com.jgdabc.service.impl;
    
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.jgdabc.entity.DishFlavor;
    import com.jgdabc.mapper.DishFlavorMapper;
    import com.jgdabc.service.DishFlavorService;
    import com.jgdabc.service.DishService;
    import org.springframework.stereotype.Service;
    
    @Service
    public class DishFlavorServiceImpl extends ServiceImpl<DishFlavorMapper, DishFlavor> implements DishFlavorService {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上面已经说道,需要保存新增的菜品和菜品口味数据。我们现在需要去改造一下菜品的service类,然后我们改进一下dish 的service下面的具体的保存的方法。

    在这里插入图片描述

     @Autowired
        private DishFlavorService dishFlavorService;
        @Transactional
        public void saveWithFlavor(DishDto dishDto) {
    //        保存菜品的基本信息
    //这里首先保存了菜品,
            this.save(dishDto);
            Long dishId = dishDto.getId();//菜品id
            List<DishFlavor> flavors = dishDto.getFlavors();//获取到对应id的菜品口味
           flavors = flavors.stream().map((item)->
            {
                //拿到的这个item就是这个DishFlavor集合
                item.setDishId(dishId);//让口味和id 上
                return item;
            }).collect(Collectors.toList());
    //        保存菜品口味数据到菜品口味表
            dishFlavorService.saveBatch(flavors);//批量保存
    
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    前端传来的数据是这样的。
    在这里插入图片描述
    菜品的基本的信息的保存是没有任何问题的,我们还需要去保存口味数据。但是口味数据这边前端传来的并没有id这些数据,我们看下面的数据库表中就可以明白,两个id必不可少。我们需要获取到的是dishid。于是我们上面还是去通过流的方式获取到了dishid,并进行了响应的设置赋值。然后我们进行了批量的保存。这样数据就完整了。
    在这里插入图片描述

    主要解释一下这里。

    然后呢,我们就去Controller。
    在这里插入图片描述

      //    新增菜品
        @PostMapping
        public R_<String> save(@RequestBody DishDto dishDto) {
    
            log.info(dishDto.toString());
            dishService.saveWithFlavor(dishDto);
            return R_.success("新增菜品成功");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    第九章 设置结构化日志记录(一)
    SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?
    Redis实现并发阻塞锁方案
    安徽省专业技术类职业资格与职称对应表
    Hi3516DV500部署paddle版型分析模型记录
    VSCode 安装教程(超详细)
    shell脚本自学笔记
    代码随想录31——贪心:贪心算法理论基础、455分发饼干、376摆动序列
    设计模式:策略模式
    mysql 服务启动和停止方法
  • 原文地址:https://blog.csdn.net/jgdabc/article/details/126415077