java 瑞吉外卖day4及补全功能 文件上传下载 菜品分页查询 Dto类 菜品状态修改 菜品停售以及菜品删除

文件上传下载

文件下载介绍 

文件上传代码实现

 服务端上传:

@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.path}")
    private String basePath;//从配置文件读取设置好的basePath

    @PostMapping("/upload")
    public R upload(MultipartFile file){
        //file是一个临时文件,需要转存到地址中,否则请求结束就会自动删除

        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //截取文件类型的字符串.jpg/.jpeg等等
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));

        //使用UUID重新生成文件名 防止文件重名导致覆盖
        String fileName = UUID.randomUUID().toString() + substring;

        //创建文件路径,并检查文件夹是否存在
        File dir =new File(basePath);
        //如果不存在就新建文件夹
        if (!dir.exists()){
            dir.mkdirs();
        }

        try {
            //将文件转存到我们指定的文件夹里
            file.transferTo(new File(basePath+fileName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //将fileName返回,后续还会用到
        return new R(1,fileName);

    }
}

文件下载实现

@GetMapping("/download")
public void download(String name, HttpServletResponse response){
    //输入流 读取文件内容
    try {
        FileInputStream fileInputStream =new FileInputStream(new File(basePath+name));
        //输出流,通过输出流将文件写会浏览器,在浏览器展示图片
        ServletOutputStream outputStream=response.getOutputStream();

        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 (IOException e) {
        throw new RuntimeException(e);
    }

}

新增菜品

 

 准备工作:

 

 梳理交互过程

下拉框数据:

//根据条件查询分类数据
@GetMapping("/list")
public R list(Category category){
    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 new R(1,"查询成功",list);
}

DishServletImpl:

Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {
    @Autowired
    private DishFlavorService dishFlavorService;
    /**
     * 新增菜品,同时保存对应的口味数据
     * @param dishDto
     */

    @Override
    @Transactional
    public void saveWithFlavor(DishDto dishDto) {
        //保存菜品的基本信息到菜品表dish
        this.save(dishDto);

        Long dishId = dishDto.getId();//菜品Id

        //菜品口味
        List<DishFlavor> flavors =dishDto.getFlavors();


        //给集合中的每个菜品口味都附上菜品id值
        flavors=flavors.stream().map((item)->{
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());

        //保存菜品口味数据到菜品口味表dish_flavor

        dishFlavorService.saveBatch(flavors);


    }
}

DishController:

@RestController
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;
    @Autowired
    private DishFlavorService dishFlavorService;

    @PostMapping
    public R save(@RequestBody DishDto dishDto){
        dishService.saveWithFlavor(dishDto);
        return new R(1,"新增菜品成功");
    }
}

菜品分页查询

 

 DishController:

@GetMapping("/page")
public R page(int page,int pageSize,String name){
    //构造分页构造器对象
    Page<Dish> pageInfo =new Page<>(page,pageSize);
    Page<DishDto> dishDtoPage =new Page<>();

    //条件构造前
    LambdaQueryWrapper<Dish> queryWrapper =new LambdaQueryWrapper<>();
    //添加过滤条件
    queryWrapper.like(name!=null,Dish::getName,name);
    //排序条件
    queryWrapper.orderByDesc(Dish::getUpdateTime);
    //执行分页查询
    dishService.page(pageInfo,queryWrapper);

    //因为我们查询dish的集合中,只查到category的id,不包含category的categoryName
    //所以要用新建并装进DishDto集合中

    //对象拷贝 ,排除records数据,pageInfo的records也就是 dish集合
    BeanUtils.copyProperties(pageInfo,dishDtoPage,"records");
    List<Dish> records =pageInfo.getRecords();

    //把Dish集合的每一个dish都拷贝到新建的dishDto 然后封装数据返回dishDto的集合
    List<DishDto> list = records.stream().map((item) -> {
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(item, dishDto);
        Long categoryId = item.getCategoryId();
        //根据Id查询category对象 然后获得name
        Category category = categoryService.getById(categoryId);
        //获取到name并封装进dishDto
        String categoryName = category.getName();
        dishDto.setCategoryName(categoryName);

        return dishDto;

    }).toList();
    //设置封装的Page类的Records
    dishDtoPage.setRecords(list);

    return new R(1,"查询成功",dishDtoPage);


}

修改菜品

 DishServiceImpl:

@Override
public void updateWithFlavor(DishDto dishDto) {
    log.info("dishDto:{}",dishDto);
    //更新dish表基本信息
    this.updateById(dishDto);
    //清理当前菜品对应口味数据---dish_flavor标的delete操作
    LambdaQueryWrapper<DishFlavor> queryWrapper= new LambdaQueryWrapper<>();
    queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());

    dishFlavorService.remove(queryWrapper);

    //添加当前菜品对应口味数据--- dish_flavor 的insert操作
    List<DishFlavor> flavors = dishDto.getFlavors();
    //给集合中的每个菜品口味都附上菜品id值
    flavors=flavors.stream().map((item)->{
        item.setDishId(dishDto.getId());
        return item;
    }).collect(Collectors.toList());

    dishFlavorService.saveBatch(flavors);

}

DishController:

@PutMapping()
public R update(@RequestBody DishDto dishDto){
    dishService.updateWithFlavor(dishDto);
    return new R(1,"新增菜品成功");
}

菜品状态修改以及菜品删除

菜品状态修改

菜品状态,在前端post

传了一个status,跟菜品的当前状态相反

还有一个ids,也就是菜品的id

批量修改跟单个修改发送的请求是一样的,所以我们直接写到同一个方法里

直接写DishController方法:

@PostMapping("/status/{status}")
public R statusChange(@PathVariable int status, @RequestParam List<Long> ids) {
      log.info("status:{},ids:{}",status,ids);
      //我们封装一个dish集合用作多条更新的条件
      List<Dish> dishes =new ArrayList<>();

      //遍历每个id并携带status封装进dish类然后塞进集合
    for (Long id : ids) {
        Dish dish =new Dish();
        dish.setId(id);
        dish.setStatus(status);
        dishes.add(dish);
    }
    //直接调用方法
    dishService.updateBatchById(dishes);


      return new R(1,"状态修改成功");

}

菜品删除

菜品删除前,我们需要把菜品对应的口味删除掉

前端只传过来一个 ids 用的Delete请求

批量删除请求跟单个删除一样,我们也成一个方法

我们在DishService层写一个deleteWithFlavor方法

@Override
public void deleteWithFlavor(List<Long> ids) {
    //清除当前菜品对应口味数据
    LambdaQueryWrapper<DishFlavor> queryWrapper =new LambdaQueryWrapper<>();
    queryWrapper.in(DishFlavor::getDishId,ids);
    dishFlavorService.remove(queryWrapper);

    //删除当前菜品数据
    this.removeByIds(ids);
}

然后再在controller调用就可以了

@DeleteMapping
public R deleteById(@RequestParam List<Long> ids){

    log.info("ids:{}",ids);
    dishService.deleteWithFlavor(ids);
    return new R(1,"删除成功");
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值