1.任务
- 菜品的添加功能(涉及到两张表的数据添加)
2.菜品添加
功能页面如上,该页面有两个注意点
- 菜品分类:点击菜品分类后,会展示当前已有菜品:这个功能的实现要从category表里查询数据,然后再做展示
- 口味做法配置:口味的添加涉及到了另一张表dish_flavor,添加的口味需要存放在这张表里
2.1.菜品分类
在add.html文件中,有getDishList函数,里面的getCategoryList函数的函数体在food.js中向服务端发送了Ajax请求,并且还传了一个type作为参数(type为1表示是菜品,type为2表示是套餐)
2.1.1.CategoryMapper.xml
<select id="selectDishByType" resultType="category">
select * from category where type = #{type}
</select>
service层的代码省略
2.1.2.CategoryController
//展示菜品分类
@GetMapping("/list")
public R<List<Category>> selectDishByType(Category category){
List<Category> dishList = categoryService.selectDishByType(category);
return R.success(dishList);
}
注意:返回类型是List集合,因为前端接收服务端传来的数据时用的是数组类型,如下:
2.2口味做法配置
当点击保存按钮之后,前端会发送如下请求
上述页面中的数据,除了口味做法配置中的数据会存放在dish_flavor表中,剩下的数据都会存放在dish表中,如何请求一次服务端同时操作两张表呢?
- 在这里给出的做法很简单,在FlavorMapper.xml中编写插入dish_flavor表的SQL语句,在DishMappr.xml中编写插入dish表的SQL语句,各写各的,但是最后都在DishServiceImpl实现类中调用上面两个方法,完成向两张表插入数据
- 还有一个问题,前端给服务端返回Json格式的数据,我们改用什么类型的参数来接收呢?答案是dto类型(data transfer object数据传输对象),在这个类中既封装了dish类的数据,又封装了dish_flavor类的数据
2.2.1.DishDto实体类
public class DishDto extends Dish {
//将前端获取到的值封装到flavors中
private List<DishFlavor> flavors = new ArrayList<>();
}
2.2.2.DishServiceImpl
@Override
public void addDish(DishDto dishDto) {
DishFlavor dishFlavor = new DishFlavor();
//获取菜品id,为填写dish_id做准备
Long id = dishDto.getId();
dishFlavor.setDishId(id);
//遍历从前端获取的口味集合,并将name和value赋值给dishFlavor对象
List<DishFlavor> flavors = dishDto.getFlavors();
for (DishFlavor flavor : flavors) {
//获取name
String name = flavor.getName();
dishFlavor.setName(name);
//获取value
String value = flavor.getValue();
dishFlavor.setValue(value);
}
//给dishFlavor对象赋id
Random random = new Random();
dishFlavor.setId(random.nextLong(1000000000000000000l));
//给dishFlavor对象赋创造和修改时间
dishFlavor.setCreateTime(LocalDateTime.now());
dishFlavor.setUpdateTime(LocalDateTime.now());
//给dishFlavor对象赋创造和修改人
dishFlavor.setCreateUser(1L);
dishFlavor.setUpdateUser(1L);
//向口味表里添加口味
flavorMapper.addFlavor(dishFlavor);
//向菜品表里添加菜品
dishMapper.addDish(dishDto);
}
重点就是这个实现类,当我们从controller层获取到了前端传来的dishDto这个参数后,从其中取出dish_flavor表里面的数据,并将其封装在dishFlavor这个对象中,这样就能通过传给mapper层dishFlavor这个对象来插入数据了