day04
文件上传下载
在本代上传一张图片保存到对应文件夹
1.创建对应的文件夹 在yml里 创建:
reggie:
path: D:\img\
2.创建一个新的类 注释都不能忘
@RestController @RequestMapping("/common")
3采用引用的方式 引用你在yml文件里文件地址
@Value("${reggie.path}") private String basePath;
注意这个value 的引用地址 不能用lombok里的
4.编写文件并且用uuid重命名
String originalFilename = file.getOriginalFilename(); String suffix=originalFilename.substring(originalFilename.lastIndexOf(".")); String FileName= UUID.randomUUID().toString()+suffix;
5.创建文件夹 并且传输文件
String FileName= UUID.randomUUID().toString()+suffix; File dir = new File(basePath); if(!dir.exists()){ dir.mkdir(); } file.transferTo(new File(basePath+FileName));
transfer一定要传一个新的文件 newfile 而且 用basepath 做文件名路径
还要再过滤器放行页面
新增菜品
查询分类数据
1.明白过程 过程就是前台问你查询type=1 的菜品分类 然后放到对应的文本框中 你要做的就是 擦汗寻返回的type 放进去
2,编写对应的实体类mapper 这个很简单不贴了
3.根据前台代码
可以看出请求在那个层里 什么请求方式
4 编写代码查询返回
@GetMapping("/list") public R<List<Category>> list(Category category){1.返回的其实是type、 LambdaQueryWrapper<Category> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(category.getType() != null,Category::getType,category.getType() //添加排序条件 queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime); //查询数据 List<Category> list = categoryService.list(queryWrapper); //返回数据 return R.success(list); }
在这里要注意 1.querywrapper.eq 第二个参数其实是为了解决硬编码 就是找到对应的名字在数据库里的名字 第二个是具体值
在浏览器上显示数据 要有一个download的方法
1.在上传图像时 返回图像名:
file.transferTo(new File(basePath+FileName)); return R.success(FileName);
2.下载图像上传
@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){ //向response缓冲区中写入字节,再由Tomcat服务器将字节内容组成Http响应返回给浏览器。 outputStream.write(bytes,0,len); //所储存的数据全部清空 outputStream.flush(); } //关闭流 fileInputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } }
接收页面提交的数据
在前端操作数据并且返回到页面上 有几个注意
1.返回的有口味等等 我们的dish不满足 所以我们新建了一个dto 继承dish 让他保证全都写入
public class DishDto extends Dish { private List<DishFlavor> flavors = new ArrayList<>(); private String categoryName; private Integer copies; }
2.在service重写方法.先保存正常数据到dish 然后找到id 插入数据到dishflaver
@Override public void saveWithFlavor(DishDto dishDto){ super.save(dishDto);//调用自己 List<DishFlavor> flavors = dishDto.getFlavors(); Long dishId = dishDto.getId(); flavors = flavors.stream().map((item) -> { item.setDishId(dishId); return item; }).collect(Collectors.toList()); dishFlavorService.saveBatch(flavors); }
1.调用自己的时候用super
菜品信息分页查询
1.简单分页
Page<Dish> pageInfo=new Page<Dish>(page,pageSize); LambdaQueryWrapper<Dish> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.like(name!=null,Dish::getName,name); queryWrapper.orderByDesc(Dish::getUpdateTime); dishService.page(pageInfo,queryWrapper);
分页一定要返回 R<Page>
2.这样分页只能分页显示不出菜品名字 因为过去的是id 而不是名字 但是dto里恰好有一个 name可以用它 但是问题来了 怎么把原来的page分给新的page 有一个api叫beanutils 但是这里的records是原来的列表 要先移除 改正在加入 加入就是放几
BeanUtils.copyProperties(pageInfo,dishDtoPage,"record"); List<Dish> records = pageInfo.getRecords(); List<DishDto> list = records.stream().map((item) -> { DishDto dishDto = new DishDto(); BeanUtils.copyProperties(item, dishDto); Long categoryId = item.getCategoryId(); Category byId = categoryService.getById(categoryId); String name1 = byId.getName(); dishDto.setCategoryName(name1); return dishDto; }).collect(Collectors.toList()); dishDtoPage.setRecords(list); return R.success(dishDtoPage);
-修改菜品 先来根据id搜索
查询到dish 然后拷贝到 地上dto 根据idchaxunflavor 最后加入
@Override public DishDto getByIdWithFlavor(Long id) { Dish dish = super.getById(id); DishDto dishDto=new DishDto(); BeanUtils.copyProperties(dish,dishDto); LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(DishFlavor::getId,id); List<DishFlavor> list = dishFlavorService.list(queryWrapper); dishDto.setFlavors(list); return dishDto; }
_修改菜品信息和口味信息
在新建updatewithflave函数 直接updatedish 但是dishflavor 要删除后来加入 因为直接update里面加入了不属于他自己的id
@Override public void updateWithFlavor(DishDto dishDto) { super.updateById(dishDto); LambdaQueryWrapper<DishFlavor> queryWrapper=new LambdaQueryWrapper<>(); queryWrapper.eq(DishFlavor::getId,dishDto.getCategoryId()); dishFlavorService.remove(queryWrapper); List<DishFlavor> flavors = dishDto.getFlavors(); flavors=flavors.stream().map((item)-> { item.setDishId(dishDto.getId()); return item; }).collect(Collectors.toList()); dishFlavorService.saveBatch(flavors); }