需求分析
在后台中,通过新增功能来添加一个新的菜品,在添加菜品时需要选择当前菜品所属的菜品分类,并且需要上传的菜品图片。
代码开发
需要添加的类和基本接口:实体类DishFlavor
、Mapper接口DishFlavorMapper
、业务层接口DishFlavorService
、业务层实现类DishFlavorServiceImpl
、控制层DishController
- 页面发送ajax请求,请求服务器端获取菜品分类数据并展示到
下拉框
中 - 页面发送请求进行图片上传,请求服务端将图片保存到服务器
- 页面发送请求进行图片下载,将上传的图片进行回显
- 点击保存按钮,发送ajax请求,将菜品相关数据以json形式提交到服务端
获取菜品分类列表(下拉框)
// 获取菜品分类列表
const getCategoryList = (params) => {
return $axios({
url: '/category/list',
method: 'get',
params
})
}
前端发送aiax请求的地址是'/category/list'
,所以应该在CategoryController
中写这个方法
添加菜品功能,通过调试前端发现查看菜品分类没有报错。
/**
* 根据条件,获取菜品分类列表
* @param category
* @return
*/
@GetMapping("/list")
public R<List<Category>> list(Category category)
{
//条件构造器
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加条件
queryWrapper.eq(category.getType() != null,Category::getType,category.getType());
//添加排序条件 优先使用sort排序 当sort相同的情况下 使用更新时间进行排序
queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
List<Category> list = categoryService.list(queryWrapper);
return R.success(list);
}
排序也是正确的
上传图片
这里我上传了两次,第一次上传的图片超过了2MB,所以报错了,然后我只能上传大笨狗,上传成功了。下图分别是上传和浏览请求成功的提示。
接受页面提交的数据
数据格式:
此时save()的参数不能直接使用Dish dish,因为通过前端传送的数据格式可以看到有flavors这个参数。
解决办法:导入DishDto
,用于封装页面提交的数据
检查封装的数据是否有问题:
2023-08-01 10:18:03.969 INFO 8552 --- [nio-8060-exec-2] c.s.reggie.controller.DishController : DishDto(flavors=[DishFlavor(id=null, dishId=null, name=甜味, value=["无糖","少糖","半糖","多糖","全糖"], createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null), DishFlavor(id=null, dishId=null, name=温度, value=["热饮","常温","去冰","少冰","多冰"], createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null)], categoryName=null, copies=null)
测试代码:
@PostMapping
public R<String> save(@RequestBody DishDto dishDto)//记得封装要加RequestBody注解
{
log.info(dishDto.toString());
return null;
}
新增大笨狗成功。
/**
* 菜品管理
*/
@RestController
@RequestMapping("/dish")
@Slf4j
public class DishController {
@Autowired
private DishService dishService;//菜品服务
@Autowired
private DishFlavorService dishFlavorService;//菜品口味
@PostMapping
public R<String> save(@RequestBody DishDto dishDto)//记得封装要加RequestBody注解
{
log.info(dishDto.toString());
dishService.saveWithFlavor(dishDto);
return R.success("新增菜品成功...");
}
package com.springboot.reggie.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.springboot.reggie.dto.DishDto;
import com.springboot.reggie.entity.Dish;
import com.springboot.reggie.entity.DishFlavor;
import com.springboot.reggie.mapper.DishMapper;
import com.springboot.reggie.service.DishFlavorService;
import com.springboot.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
@Autowired
private DishFlavorService dishFlavorService;
/**
* 新增菜品 同时保存对应的口味
* @param dishDto
*/
@Transactional //需要加上事务控制 因为涉及到多张表的操作
public void saveWithFlavor(DishDto dishDto)
{
//保存菜品的基本信息到菜品表
this.save(dishDto);
Long dishId = dishDto.getId();//给菜品id赋值
//菜品口味
List<DishFlavor> flavors = dishDto.getFlavors();
flavors = flavors.stream().map((item)->{
item.setDishId(dishId);
return item;
}).collect(Collectors.toList());
//保存菜品口味数据到菜品口味表
dishFlavorService.saveBatch(flavors);
}
}