黑马瑞吉外卖之新增菜品
前端页面分析以及需求分析
接下来我们去完成新增菜品的功能。首先还是来看前端页面。
新增菜品这个功能自然是在菜品的前端功能界面。
首先来看这个界面,这里绑定了按钮,并传入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;
}
于是还是按照之前的一个过程,设计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> {
}
service层
package com.jgdabc.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jgdabc.entity.DishFlavor;
public interface DishFlavorService extends IService<DishFlavor> {
}
然后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 {
}
上面已经说道,需要保存新增的菜品和菜品口味数据。我们现在需要去改造一下菜品的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);//批量保存
}
前端传来的数据是这样的。
菜品的基本的信息的保存是没有任何问题的,我们还需要去保存口味数据。但是口味数据这边前端传来的并没有id这些数据,我们看下面的数据库表中就可以明白,两个id必不可少。我们需要获取到的是dishid。于是我们上面还是去通过流的方式获取到了dishid,并进行了响应的设置赋值。然后我们进行了批量的保存。这样数据就完整了。
主要解释一下这里。
然后呢,我们就去Controller。
// 新增菜品
@PostMapping
public R_<String> save(@RequestBody DishDto dishDto) {
log.info(dishDto.toString());
dishService.saveWithFlavor(dishDto);
return R_.success("新增菜品成功");
}