菜品管理
文件的上传和下载
文件上传的介绍:
文件上传的代码实现:
首先将文件上传的upload.html页面复制到page目录下的demo目录中。
访问upload.html,上传文件时请求路径为:
因此新建一个CommonController进行文件上传和下载。
CommonController中文件上传的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
@RestController @RequestMapping("/common") @Slf4j public class CommonController {
@Value("${reggie.path}") private String basePath;
@PostMapping("/upload") public R<String> upload(MultipartFile file){ log.info(file.toString());
String originalFilename = file.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
String fileName = UUID.randomUUID().toString()+suffix; File dir = new File(basePath); if (!dir.exists()){ dir.mkdirs(); } try { file.transferTo(new File(basePath+fileName)); } catch (Exception e) { e.printStackTrace(); } return R.success(fileName); }
}
|
其中application.yml文件:
1 2
| reggie: path: D:\img\ #设置图片下载下来后存储的位置
|
文件下载的介绍:
根据浏览器发出的响应,所以应该为:@GetMapping("/download")
:
文件下载的代码:(下面这个代码将本机电脑作为服务器进行传输)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
@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(); } fileInputStream.close(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } }
|
新增菜品
分析
第一步:根据条件动态查询分类数据:
点击菜品分类时,所发出的请求为:
因此CategoryController.java
的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
@RequestMapping("/list") public R<List<Category>> getCategory(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); }
|
补充知识:
DTO:(Data Transfer Object 数据传输对象)当实体中的属性不能够进行作为参数传输时,也就是浏览器发送过来的数据中的参数,实体类中不包含时进行使用。
新增菜品的代码为:
因为新增菜品时,操作的是两个表,一个是菜品表,一个是口味表,所以不能用普通的save方法,因此自己写一个保存口味和菜品的方法:
因为操作的是两个表,因此也要开启事务,保证两个表一起成功,一起失败
DishServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
@Override @Transactional public void saveWithFlavor(DishDto dishDto) {
this.save(dishDto); Long id = dishDto.getId(); List<DishFlavor> flavors = dishDto.getFlavors(); flavors = flavors.stream().map((item)->{ item.setDishId(id); return item; }).collect(Collectors.toList()); dishFlavorService.saveBatch(flavors);
}
|
DishController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
@RequestMapping("/dish") @RestController @Slf4j public class DishController { @Autowired private DishService dishService;
@PostMapping public R<String> save(@RequestBody DishDto dishDto){ log.info(dishDto.toString()); dishService.saveWithFlavor(dishDto); return R.success("添加菜品成功"); }
}
|
菜品信息分页查询
菜品的分页展示,比之前的两个分页要难一些,因为要展示图片,和菜品分类的名称(因为菜品里面没有菜品名称的属性,有的是菜品的id,因此要对照菜品的分类来进行显示)
分析:
前端发送的请求:
代码为:(相对复杂,因为页面要展示菜品的名称而不是id,所以不能使用Dish,要使用DishDto)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
@GetMapping("/page") public R<Page> page(int page,int pageSize,String name){ Page<Dish> pageInfo = new Page<>(page,pageSize); Page<DishDto> dishDtoPage = new Page<>();
LambdaQueryWrapper<Dish> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.like(name!=null,Dish::getName,name); lambdaQueryWrapper.orderByDesc(Dish::getUpdateTime); dishService.page(pageInfo,lambdaQueryWrapper); BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
List<Dish> records = pageInfo.getRecords();
List<DishDto> dishDtoList = records.stream().map((item)->{ DishDto dishDto = new DishDto();
BeanUtils.copyProperties(item,dishDto);
Long categoryId = item.getCategoryId(); Category category = categoryService.getById(categoryId); if (category!=null){ String categoryName = category.getName(); dishDto.setCategoryName(categoryName); } return dishDto;
}).collect(Collectors.toList());
dishDtoPage.setRecords(dishDtoList); return R.success(dishDtoPage); }
|
修改菜品
第一步:首先,要将菜品信息进行回显
代码为:
首先要根据页面发送请求中的id查询,以上这些菜品的基本的信息以及口味。
编写DishService代码,写根据id获取信息的代码,因为不仅要获取基本的Dish信息还要获取口味信息。
DishServiceImpl.java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
public DishDto getByIdWithFlavor(Long id) {
Dish dish = dishService.getById(id);
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(dish,dishDto);
LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(DishFlavor::getDishId,dish.getId()); List<DishFlavor> list = dishFlavorService.list(lambdaQueryWrapper); dishDto.setFlavors(list); return dishDto; }
|
DishController.java:
1 2 3 4 5 6 7 8 9 10
|
@GetMapping("/{id}") public R<DishDto> get(@PathVariable Long id){ DishDto dishDto = dishService.getByIdWithFlavor(id); return R.success(dishDto); }
|
回显成功:
第二步:点击保存,修改成功:
修改也不能用系统给的普通修改,因为要修改两个表,菜品表和口味表。因此要重写更新方法
DishServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
public void updateWithFlavor(DishDto dishDto) { this.updateById(dishDto);
LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(DishFlavor::getDishId,dishDto.getId()); dishFlavorService.remove(lambdaQueryWrapper);
Long id = dishDto.getId(); List<DishFlavor> flavors = dishDto.getFlavors(); flavors = flavors.stream().map((item)->{ item.setDishId(id); return item; }).collect(Collectors.toList()); dishFlavorService.saveBatch(flavors); }
|
DishController.java
1 2 3 4 5 6 7 8 9
|
@PutMapping public R<String> update(@RequestBody DishDto dishDto){ dishService.updateWithFlavor(dishDto); return R.success("修改菜品成功"); }
|
成功~~