需求分析
后台系统可以管理菜品信息,可以通过新增功能来增加一个菜品,在添加菜品时需要选择一个菜品所属的分类,并且需要上传菜品图片。
搭建类和基本结构
- 实体类
- mapper层
- 业务层service接口和接口实现类
- controller层
前后端交互过程:
1.页面发送ajax请求,请求服务端获取菜品分类并展示到下拉框。
categorycontroller层
/**
* 根据条件查询分类数据
* @param category
* @return
*/
@GetMapping("/list")
public R<List<Category>> list(Category category) {
//创建条件构造器
LambdaQueryWrapper<Category> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//构造条件
lambdaQueryWrapper.eq(category.getType()!=null,Category::getType,category.getType());
//构造排序
lambdaQueryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
//执行查询。
List<Category> list = categoryService.list(lambdaQueryWrapper);
return R.success(list);
}
2.页面发送请求进行图片上传,请求服务端把图片保存到服务器。
3.页面发送请求进行图片下载,将上传的图片进行回显。
4.点击保存按钮,把页面数据以json数据格式发送到服务端进行保存。
- DTO:数据传输对象,一般用于展示层与服务层之间的数据传输。
dishcontroller层
/**
* 新增菜品
*
* @param dishDto
* @return
*/
@PostMapping
public R<String> save(@RequestBody DishDto dishDto) {
log.info("新增菜品:{}", dishDto);
dishService.saveWithFlavor(dishDto);
return R.success("新增菜品成功");
}
dto包下的数据传输对象
/**
* DTO:数据传输对象,一般用于展示层与服务层之间的数据传输。(注意继承)
*/
@Data
public class DishDto extends Dish {
private List<DishFlavor> flavors = new ArrayList<>();
private String categoryName;
private Integer copies;
}
service层代码
/**
* 保存菜品,同时保存菜品的口味,所有需要操作两张表:dish、dish_flavor;
* @param dishDto
* 事务一般开在接口上,不要开在实现类中,开启事务,同时要在启动类上加@EnableTransactionManagement注解。
* 降低耦合,也可以直接写在接口上,那么接口中所有方法都添加了事务。
*/
@Transactional
void saveWithFlavor(DishDto dishDto);
service实现层
@Override
public void saveWithFlavor(DishDto dishDto) {
// 先保存菜品基本信息到dish表。
this.save(dishDto);
// 处理dish_id字段。
Long dishId = dishDto.getId();
List<DishFlavor> flavors = dishDto.getFlavors();
//函数式编程。
flavors =
flavors.stream()
.map(
(item) -> {
item.setDishId(dishId);
return item;
})
.collect(Collectors.toList());
// 保存口味到dish_flavor表。
dishFlavorService.saveBatch(flavors);
}