需求分析
- 用户点击修改按钮,跳转到修改界面(和新增界面相仿),当用户填入相应信息后,点击保存按钮,会把这条套餐信息进行更改。
代码开发
后端主要处理两个请求:
- 当点击修改按钮时,前端发送ajax请求,请求服务端以进行套餐数据的回显。
controller层
/**
* 根据id查询套餐信息
*(套餐信息的回显)
* @param id
* @return
*/
@GetMapping("/{id}")
public R<SetmealDto> getById(@PathVariable Long id) {
log.info("根据id查询套餐信息:{}", id);
// 调用service执行查询。、
SetmealDto setmealDto = setmealService.getByIdWithDish(id);
return R.success(setmealDto);
}
service层
/**
* 通过id查询套餐信息, 同时还要查询关联表setmeal_dish的菜品信息进行回显。
*
* @param id 待查询的id
*/
@Override
public SetmealDto getByIdWithDish(Long id) {
// 根据id查询setmeal表中的基本信息
Setmeal setmeal = this.getById(id);
SetmealDto setmealDto = new SetmealDto();
// 对象拷贝。
BeanUtils.copyProperties(setmeal, setmealDto);
// 查询关联表setmeal_dish的菜品信息
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SetmealDish::getSetmealId, id);
List<SetmealDish> setmealDishList = setmealDishService.list(queryWrapper);
//设置套餐菜品属性
setmealDto.setSetmealDishes(setmealDishList);
return setmealDto;
}
测试通过
- 当用户点击保存按钮时,将修改后的信息以json数据形式提交到服务端进一步保存到数据库。
controller层
/**
* 修改套餐信息。
*
* @param setmealDto
* @return
*/
@PutMapping
public R<String> update(@RequestBody SetmealDto setmealDto) {
log.info("修改套餐信息{}", setmealDto);
// 执行更新。
setmealService.updateWithDish(setmealDto);
return R.success("修改套餐信息成功");
}
service层
/**
* 更新套餐信息,不仅要更新setmeal基本信息, 还要更新套餐所对应的菜品到setmeal_dish表
*
* @param setmealDto
*/
@Override
public void updateWithDish(SetmealDto setmealDto) {
// 保存setmeal表中的基本数据。
this.updateById(setmealDto);
// 先删除原来的套餐所对应的菜品数据。
LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SetmealDish::getSetmealId, setmealDto.getId());
setmealDishService.remove(queryWrapper);
// 更新套餐关联菜品信息。setmeal_dish表。
// Field 'setmeal_id' doesn't have a default value] with root cause
// 所以需要处理setmeal_id字段。
// 先获得套餐所对应的菜品集合。
List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
//每一个item为SetmealDish对象。
setmealDishes = setmealDishes.stream().map((item) -> {
//设置setmeal_id字段。
item.setSetmealId(setmealDto.getId());
return item;
}).collect(Collectors.toList());
// 重新保存套餐对应菜品数据
setmealDishService.saveBatch(setmealDishes);
}
测试通过