瑞吉外卖项目——删除和批量删除套餐功能

需求分析

用户点击删除按钮,可以删除对应的套餐,也可以通过复选框选择多个套餐,点击批量删除,一次性删除多个套餐。
注意:对于状态在售卖中的套餐不能删除,需要先停售,之后才能删除。

代码开发

前后端发交互

  • 前端携带id发送请求,请求服务端。
  • 服务端接收id,根据id删除对应的套餐。
    在这里插入图片描述
    在这里插入图片描述
    观察删除的交互过程(单个删除和批量删除),可以发现两次请求的请求方式和请求地址都是相同的,不同的则是传递的id个数,所以可以在服务提供一个方法来做统一处理。
    controller层
  /**
   * 根据id删除套餐信息。(删除一个或者批量删除) 需要删除关联表数据
   *
   * @param ids
   * @return
   */
  @DeleteMapping
  public R<String> delete(@RequestParam List<Long> ids) {
    // 接收的id成功。
    log.info("根据id删除套餐信息{}", ids);
    // 根据id删除对应的套餐和关联表数据。
    setmealService.removeWithDish(ids);
    return R.success("删除套餐成功");
  }


Service层

  /**
   * 根据id删除对应的套餐,并且还要删除套餐关联的菜品。
   * @param ids
   */
  @Override
  public void removeWithDish(List<Long> ids) {
    // select count(*) from setmeal where id in () and status=1;
    // 查询套餐状态是否可以删除
    LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
    setmealLambdaQueryWrapper.in(Setmeal::getId, ids);
    setmealLambdaQueryWrapper.eq(Setmeal::getStatus, 1);
    int count = this.count(setmealLambdaQueryWrapper);
    if (count > 0) {
      // 如果不能删除(为起售状态),则抛出一个业务异常。
      throw new CustomException("套餐为起售状态,无法删除");
    }
    // 如果可以删除,则先删除套餐表数据。
    this.removeByIds(ids);
    //已知setmeal中的id,删除setmeal_dish中的记录。
    // delete from setmeal_dish where setmeal_id in (ids)
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.in(SetmealDish::getSetmealId, ids);
    // 删除套餐关联表数据。
    setmealDishService.remove(queryWrapper);
  }

注意:
一定要在方法或service接口上加@Transactional注解。

测试通过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值