瑞吉外卖项目——修改套餐功能

需求分析

  • 用户点击修改按钮,跳转到修改界面(和新增界面相仿),当用户填入相应信息后,点击保存按钮,会把这条套餐信息进行更改。

代码开发

后端主要处理两个请求:

  • 当点击修改按钮时,前端发送ajax请求,请求服务端以进行套餐数据的回显。
    controller层
  /**
   * 根据id查询套餐信息
   *(套餐信息的回显)
   * @param id
   * @return
   */
  @GetMapping("/{id}")
  public R<SetmealDto> getById(@PathVariable Long id) {
    log.info("根据id查询套餐信息:{}", id);
    // 调用service执行查询。、
    SetmealDto setmealDto = setmealService.getByIdWithDish(id);
    return R.success(setmealDto);
  }

service层

  /**
   * 通过id查询套餐信息, 同时还要查询关联表setmeal_dish的菜品信息进行回显。
   *
   * @param id 待查询的id
   */
  @Override
  public SetmealDto getByIdWithDish(Long id) {
    // 根据id查询setmeal表中的基本信息
    Setmeal setmeal = this.getById(id);
    SetmealDto setmealDto = new SetmealDto();
    // 对象拷贝。
    BeanUtils.copyProperties(setmeal, setmealDto);
    // 查询关联表setmeal_dish的菜品信息
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SetmealDish::getSetmealId, id);
    List<SetmealDish> setmealDishList = setmealDishService.list(queryWrapper);
    //设置套餐菜品属性
    setmealDto.setSetmealDishes(setmealDishList);
    return setmealDto;
  }

测试通过

  • 当用户点击保存按钮时,将修改后的信息以json数据形式提交到服务端进一步保存到数据库。
    controller层
  /**
   * 修改套餐信息。
   *
   * @param setmealDto
   * @return
   */
  @PutMapping
  public R<String> update(@RequestBody SetmealDto setmealDto) {
    log.info("修改套餐信息{}", setmealDto);
    // 执行更新。
    setmealService.updateWithDish(setmealDto);
    return R.success("修改套餐信息成功");
  }

service层

  /**
   * 更新套餐信息,不仅要更新setmeal基本信息, 还要更新套餐所对应的菜品到setmeal_dish表
   *
   * @param setmealDto
   */
  @Override
  public void updateWithDish(SetmealDto setmealDto) {
    // 保存setmeal表中的基本数据。
    this.updateById(setmealDto);
    // 先删除原来的套餐所对应的菜品数据。
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SetmealDish::getSetmealId, setmealDto.getId());
    setmealDishService.remove(queryWrapper);
    // 更新套餐关联菜品信息。setmeal_dish表。
    // Field 'setmeal_id' doesn't have a default value] with root cause
    // 所以需要处理setmeal_id字段。
    // 先获得套餐所对应的菜品集合。
    List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
    //每一个item为SetmealDish对象。
    setmealDishes = setmealDishes.stream().map((item) -> {
      //设置setmeal_id字段。
      item.setSetmealId(setmealDto.getId());
      return item;
    }).collect(Collectors.toList());

    // 重新保存套餐对应菜品数据
    setmealDishService.saveBatch(setmealDishes);
  }

测试通过

你可能感兴趣的:(瑞吉外卖项目,java,前端,开发语言)