瑞吉外卖项目实战Day04

这篇博客介绍了瑞吉外卖项目中关于菜品管理的功能实现,包括添加菜品、分页查询、批量启售停售和批量删除。添加菜品时涉及到图片上传,分页查询实现了将菜品分类名称显示在查询结果中。批量启售停售通过指定状态更新菜品状态,批量删除则检查菜品是否为停售状态,确保只有停售菜品可删除。
摘要由CSDN通过智能技术生成

瑞吉外卖项目实战Day04

一、添加菜品

进入添加菜品界面,会发出一个请求查询菜品分类

image-20220803103433413

/**
 * 根据条件查询分类数据
 * @param category
 * @return
 */
@GetMapping("/list")
public R<List<Category>> 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 R.success(list);
}

上传图片:

在配置文件中定义保存文件的地址:

#自定义文件保存的路径
reggie:
    path: D:\im
//文件的上传和下载
@RestController
@RequestMapping("/common")
public class CommonController {
    @Value("${reggie.path}")
private String path;

    //文件上传
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
    //file是一个临时文件,需要转存,否则本次请求结束后就消失
    //使用UUID随机生成文件名
        //获取文件后缀
           //获取原始文件名
        String originalFilename = file.getOriginalFilename();
           //截取后缀
        String substring = originalFilename.substring(originalFilename.lastIndexOf("."));

        String FileName = UUID.randomUUID().toString()+substring;

        //需要判断path是否存在
          File dir=new File(path);
          if (!dir.exists()){
              //目录不存在,需要创建
              dir.mkdirs();
          }

        try {
            file.transferTo(new File(path+FileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //需要返回文件名,以便保存到数据库
        return R.success(FileName);
    }

下载图片

    //文件下载
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        //输入流,读取文件内容

        try {
            FileInputStream fileInputStream=new FileInputStream(new File(path+name));

        //输出流,将文件写回浏览器
              //设置写回浏览器的文件格式
             response.setContentType("image/jpeg");

            byte[] bytes=new byte[1024];
            int len=0;
            ServletOutputStream outputStream = response.getOutputStream();
            while ((len=fileInputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }
            //关闭流
            fileInputStream.close();
            outputStream.close();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

导入dish(菜品)实体类和dishflavor(口味)实体类

创建DishMapper和DishFlavorMapper

创建DishService,DishFlavorService和DishServiceImpl,DishFlavorServiceImpl

创建DishController

image-20220804091715407

因为需要同时操作两张表

所以需要自定义一个方法完成数据的插入,并且需要添加事务

由于前端传过来的数据包括口味

我们需要重新创建一个实体类 DishDto

@Data
public class DishDto extends Dish {

    private List<DishFlavor> flavors = new ArrayList<>();

    private String categoryName;

    private Integer copies;
}

image-20220804093050971

@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    @Autowired
    private DishFlavorService dishFlavorService;
    @Override
    @Transactional
    public void addDish(DishDto dishDto) {
        //需要操作两张表
          //向dish表中添加菜品
        this.save(dishDto);

         //向dishFlavor表中插入数据
          //获取dish_id
        Long id = dishDto.getId();
          //获取口味
        List<DishFlavor> flavors = dishDto.getFlavors();
          //给口味对应的菜品id赋值
        flavors =flavors.stream().map((item)->{
             item.setDishId(id);
             return item;
         }).collect(Collectors.toList());

        //添加到口味表中
        dishFlavorService.saveBatch(flavors);

    }

在DishController中调用这个方法,返回成功即可

二、分页查询

@GetMapping("/page")
public  R<Page> selectByPage(int page,int pageSize,String name){
    Page<Dish> pageDish=new Page<>(page,pageSize);
    LambdaQueryWrapper<Dish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
    lambdaQueryWrapper.like(name!=null,Dish::getName,name);
    lambdaQueryWrapper.orderByAsc(Dish::getId);
    dishService.page(pageDish,lambdaQueryWrapper);
    return  R.success(pageDish);

}

实现结果:

image-20220804101549808

而DithDto中有个属性就是categoryName

    @GetMapping("/page")
    public  R<Page> selectByPage(int page,int pageSize,String name){
        Page<Dish> pageDish=new Page<>(page,pageSize);
        LambdaQueryWrapper<Dish> lambdaQueryWrapper=new LambdaQueryWrapper<>();
        lambdaQueryWrapper.like(name!=null,Dish::getName,name);
        lambdaQueryWrapper.orderByAsc(Dish::getId);
        dishService.page(pageDish,lambdaQueryWrapper);
        
        //复制分页,除了数据不复制
        Page<DishDto> pageDishDto=new Page<>();
        BeanUtils.copyProperties(pageDish,pageDishDto,"records");

        //获取原来的分页数据
        List<Dish> records = pageDish.getRecords();

        List<DishDto> DishDtoRecords=records.stream().map((item)->{
            //对其进行加工处理,
            DishDto dishDto=new DishDto();
            //复制数据
            BeanUtils.copyProperties(item,dishDto);

            Long id =item.getId();
            Dish dish = dishService.getById(id);

            if (dish!=null){
                Long categoryId = dish.getCategoryId();
                //得到分类名称
                Category category = categoryService.getById(categoryId);
                String categoryName = category.getName();
                //设置dishDto中的分类名称
                dishDto.setCategoryName(categoryName);
            }
            return dishDto;

        }).collect(Collectors.toList());
pageDishDto.setRecords(DishDtoRecords);

        return  R.success(pageDishDto);

    }
}

三、批量启售停售

前端发来的请求:

image-20220805091342320

dishController中

 //批量启售停售
    @PostMapping("/status/{status}")
    public R<String> update(@PathVariable int status,Long [] ids){
       //修改对应id的状态为0
        for (Long id:ids
             ) {
            Dish dish = dishService.getById(id);
            if (dish!=null&&dish.getIsDeleted()==0){
                dish.setStatus(status);
                dishService.updateById(dish);
            }
            else{
                return R.error("菜品已经被删除了");
            }

        }
        return R.success("修改成功");
    }
}

四、批量删除

只有菜品处于停售状态才可删除

注意修改分页查询的条件(当菜品的isDeleted=1时)不展示该菜品

  @DeleteMapping
    public R<String> deleteByIds(Long[]ids){
        int msg=0;//0表示删除失败,1表示删除成功
        //判断是否是停售状态,只有停售状态才能删除
        for (Long id:ids){
            Dish dish = dishService.getById(id);

            if (dish.getStatus()==1){
               msg=0;

            }

            else{
                dish.setIsDeleted(1);
                dishService.updateById(dish);
                msg=1;
            }
        }
return msg==1? R.success("删除成功"):R.error("该菜品处于启售状态,删除失败");

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值