黑马瑞吉外卖(自己练手)

菜品的批量删除和单删

批量删除
单删
确定本次的请求方式为DELETE请求后,请求路径为**“/dish”**,在DishController层编写代码。
"/dish"的请求路径在DishController类上已添加,因此在删除的方法上不需要添加任何路径。
单删和批量删除的请求方式是相同的,不同点在于传入id的数量,因此可以将单删和批量删除用一个方法表示,传入的变量用
List
接收。
DishController

    @DeleteMapping
    public R<String> delete(@RequestParam("ids") List<Long> ids){
        dishService.deleteById(ids);
        return R.success("删除成功");
    }

保持DishController层的代码简洁,将具体删除的代码,放在Service层完成。
DishService

public void deleteById(List<Long> ids);

DishServiceImpl
在删除菜品的时候,要了解到不仅要删除当前菜品,还要删除当前菜品的口味,并且当前菜品在售卖阶段的时候是不可删除的。

    /**
     * 批量删除菜品和单删菜品
     * @param ids
     */
    @Override
    @Transactional
    public void deleteById(List<Long> ids) {
        // 构造一个条件构造器 用来匹配传入的id与菜品id
        LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
        // 先判断一下浏览器传过来的ids是否为空,并且与菜品表中的id进行匹配
        lqw.in(ids!=null,Dish::getId,ids);
        List<Dish> list = this.list(lqw);
        for(Dish dish:list){
        	// 判断当前菜品是否在售卖阶段,0表示停售,1表示售卖
            if(dish.getStatus() == 0){
            	// 直接删除当前菜品
                this.removeById(dish.getId());
                LambdaQueryWrapper<DishFlavor> lqw1 = new LambdaQueryWrapper<>();
                // 根据菜品id匹配口味表中的菜品id
                lqw1.eq(DishFlavor::getDishId,dish.getId());
                // 删除口味表与菜品表相关联的口味信息
                dishFlavorService.remove(lqw1);
            }else{
                throw new CustomException("此菜品还在售卖阶段,不能删除!!");
            }
        }
    }

菜品的批量启售和单独启售

同样先去浏览器查询此次请求的方式和URL路径
单独启售/停售批量启售/停售
此次的请求方式都有POST,但是此次的请求路径与删除时不一样,多了一个"/status",因此在控制层写方法时要把"/status"加上。
此次提交的URL不仅多了"/status"而且还传入了一个"status"参数,通过@PathVariable接收status,因此控制层代码如下

    @PostMapping("/status/{status}")
    public R<String> sell(@PathVariable int status,@RequestParam List<Long> ids){
        dishService.sellById(status,ids);
        return R.success("操作成功");
    }

对应的Service层

public void sellById(int status,List<Long> ids);

其实现类ServiceImpl

    /**
     * 批量启售菜品和单独启售菜品
     * @param ids
     */
    @Override
    @Transactional
    public void sellById(int status,List<Long> ids) {
        // 构造一个条件构造器
        LambdaQueryWrapper<Dish> lqw = new LambdaQueryWrapper<>();
        lqw.in(ids!=null,Dish::getId,ids);
        List<Dish> list = this.list(lqw);
        for(Dish dish:list){
            if(dish!=null) {
            	// 把浏览器传入的status参数赋值给此菜品
                dish.setStatus(status);
                // 赋值完后记得更新菜品
                this.updateById(dish);
            }
        }
    }

修改套餐信息

点击修改按钮,此时弹出的修改页面应该回显出套餐的原始信息,如下图所示。
回显信息
我们应该在回显的信息上进行修改操作。
同样操作,根据浏览器提交的请求来查看本次回显的请求方式与URL
回显信息的请求路径和请求方式
本次的请求方式为GET,请求路径为"/setmeal/{id}"
Controller
此处的返回类型应该为SetmealDto,因为回显的套餐信息中包含套餐菜品,而Setmeal实体类中并不包含菜品这一信息,因此需要用SetmealDto来接收此次的信息返回值。

    @GetMapping("{id}")
    public R<SetmealDto> getSetmealById(@PathVariable Long id){
        SetmealDto setmealDto = setmealService.getByIdWithDish(id);
        return R.success(setmealDto);
    }

Service

    public SetmealDto getByIdWithDish(Long id);

ServiceImpl

    public SetmealDto getByIdWithDish(Long id) {
        // 根据id查询基本信息
        Setmeal setmeal = this.getById(id);
        SetmealDto setmealDto = new SetmealDto();
        // 将基本信息拷贝至 setmealDto中
        BeanUtils.copyProperties(setmeal,setmealDto);
        // 上面的拷贝,并未给setmealDto中的setmealDishes赋值。
        LambdaQueryWrapper<SetmealDish> lqw = new LambdaQueryWrapper<>();
        // 根据套餐id匹配对应setmeal_dish 表中的套餐id
        lqw.eq(SetmealDish::getSetmealId,setmeal.getId());
        List<SetmealDish> list = setmealDishService.list(lqw);
        // 给setmealDto 中的 setmealDishes 赋值
        setmealDto.setSetmealDishes(list);
        return setmealDto;
    }

回显操作完成后,就是在回显的界面中进行修改操作。修改完成后点击保存按钮,浏览器会发送一个请求。
保存修改套餐信息
根据浏览器发送的PUT请求和URL,在控制层编写修改代码。
Controller
此处传入的应该是一个SetmealDto实体类,用于接收浏览器出过来的JSON信息,信息中包含菜品信息,因此使用SetmealDto实体类接收。
浏览器发送的信息

    @PutMapping
    public R<String> update(@RequestBody SetmealDto setmealDto){
        setmealService.updateWithSetmeal(setmealDto);
        return R.success("修改套餐成功");
    }

Service

public void updateWithSetmeal(SetmealDto setmealDto);

ServiceImpl

    /**
     * 修改套餐信息
     * @param setmealDto
     */
    @Override
    public void updateWithSetmeal(SetmealDto setmealDto) {
        // 根据setmealDto更新套餐的基本信息(除了菜品信息以外的信息)
        this.updateById(setmealDto);

        LambdaQueryWrapper<SetmealDish> lqw = new LambdaQueryWrapper<>();
        // 根据 套餐 id 查询出 套餐对应的菜品信息
        lqw.eq(SetmealDish::getSetmealId,setmealDto.getId());
        // 将原来套餐的相关菜品移除
        setmealDishService.remove(lqw);

        // 根据浏览器发送的setmealDto查询出新的菜品信息
        List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();

        // 将修改后的setmeal_dish表中的菜品 赋值 套餐id
        setmealDishes = setmealDishes.stream().map((item)->{// item--> setmealDish
            item.setSetmealId(setmealDto.getId());
            return item;
        }).collect(Collectors.toList());
        // 将被赋值后的菜品保存
        setmealDishService.saveBatch(setmealDishes);
    }

目前只学习到此!!!!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值