1.需求分析
在修改页面回显菜品相关信息并进行修改
2.代码开发
梳理交互过程
1.页面发送ajax请求,请求服务端获取分类数据,用于菜品下拉框中数据显示
@GetMapping("/list")
public R<List<Category>> list(Category category){
//查询,条件构造器
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加条件,首先判断传过来的type不为空,然后再进行type值的判断
queryWrapper.eq(category.getType() != null,Category::getType,category.getType());
//添加一个排序条件,orderByDesc是更新时间,优先sort排序,如果sort值相同,就使用更新时间
queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
//进行查询
List<Category> list = categoryService.list(queryWrapper);
//封装一下返回值
return R.success(list);
}
2.页面发送ajax请求,请求服务端,根据id查询当前菜品信息,用于菜品信息回显
Controller层
/**
* 根据id来查询菜品信息和对应的口味信息
* @param id
* @return
*/
@GetMapping("/{id}")
public R<DishDto> get(@PathVariable Long id){//id在请求路径里面,所以加PathVariable注解
//要查两张表,菜品表和口味表
DishDto dishDto = dishService.getByIdWithFlavor(id);
return R.success(dishDto);
}
Service层
//根据id来查询对应的菜品信息和口味信息
public DishDto getByIdWithFlavor(Long id);//声明方法
Service实现层
/**
* 根据id来查询对应的菜品信息和口味信息
* @param id
* @return
*/
public DishDto getByIdWithFlavor(Long id) {
//第一步,查询菜品信息,在dish表中查询
Dish dish = this.getById(id);
//对象拷贝
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(dish,dishDto);
//第二步,查询口味信息,在dish_flavor表中查询
//构造器
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
//查询条件
queryWrapper.eq(DishFlavor::getDishId,dish.getId());
//进行查询
List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);
//将查询到的值赋给dishDto
dishDto.setFlavors(flavors);
return dishDto;
}
3.页面发送请求,请求服务端进行图片下载,用于页图片回显
@GetMapping("/download")
public void download(String name, HttpServletResponse response){
try {
//输入流,通过输入流读取文件内容
FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
//输出流,通过输出流将文件写回浏览器
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
outputStream.close();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
4.点击保存按钮,页面发送ajax请求,将修改过的菜品相关数据以json形式提交到服务端
Controller
/**
* 修改菜品
* @return
*/
@PutMapping
public R<String> update(@RequestBody DishDto dishDto){
//更新时也涉及到两张表
dishService.updateWithFlavor(dishDto);
return R.success("修改菜品成功");
}
Service
//更新菜品信息,同时更新口味信息
public void updateWithFlavor(DishDto dishDto);//声明方法
Service实现
/**
* 更新菜品和口味信息
* @param dishDto
* @return
*/
@Override
@Transactional//事务注解,保证事务的一致性
public void updateWithFlavor(DishDto dishDto) {
//第一步,更新菜品表基本信息
this.updateById(dishDto);
//第二步,更新口味信息
//1.删除delete当前口味数据
LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());//根据当前菜品id删除
dishFlavorService.remove(queryWrapper);
//2.添加insert当前提交过来的口味数据
List<DishFlavor> flavors = dishDto.getFlavors();
//当前只有name和falvor,没有dishid
flavors = flavors.stream().map((item) -> {
item.setDishId(dishDto.getId());//将上面获取的dishId传进去
return item;
}).collect(Collectors.toList());
dishFlavorService.saveBatch(flavors);
}
总结:牵扯到两张表的操作,注意增改和查询都要进行对应的修改。