猿创征文|瑞吉外卖——管理端_菜品管理_2

个人名片:

博主:酒徒ᝰ.
专栏:瑞吉外卖
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志真正的程序员不看参考手册,新手和胆小鬼才会看。

本项目基于B站黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis plus开发核心技术的真java实战项目。

视频链接【黑马程序员Java项目实战《瑞吉外卖》,轻松掌握springboot + mybatis
plus开发核心技术的真java实战项目】 https://www.bilibili.com/video/BV13a411q753?
点击观看

因为菜品管理太多了,所有分成三部分来写了。这是第二部分

目录

  • 三、删除菜品
    • 1.单个
    • 2.批量
    • 3.删除口味
    • 4.判断状态
  • 四、修改
    • 1.回显数据
    • 2.保存
  • 五、停售与起售
    • 1.单个
    • 2.批量

三、删除菜品

1.单个

猿创征文|瑞吉外卖——管理端_菜品管理_2_第1张图片

分析:dish地址,DELETE方式,ids属性。

/**
 * 删除菜品
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> dish(@PathParam("ids") Long ids){
    dishService.removeById(ids);
    return R.success("删除成功");
}

2.批量

猿创征文|瑞吉外卖——管理端_菜品管理_2_第2张图片

比较简单,修改两个地方即可
@PathParam ——>> @RequestParam
.removeById ——>> .removeByIds

/**
 * 批量删除菜品
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> dish(@RequestParam("ids") List<Long> ids){
    dishService.removeByIds(ids);
    return R.success("删除成功");
}

3.删除口味

/**
* 批量删除菜品——删除菜品对应的口味
* @param ids
* @return
*/
@DeleteMapping
public R<String> dish(@RequestParam("ids") List<Long> ids){    
    //根据id查询dishFlavor表中对应的信息
    LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.in(DishFlavor::getDishId, ids);
    dishFlavorService.remove(queryWrapper);
    //根据id删除
    dishService.removeByIds(ids);
    return R.success("删除成功");
}

4.判断状态

/**
* 批量删除菜品——判断菜品状态是否为正在售卖
* @param ids
* @return
*/
@DeleteMapping
public R<String> dish(@RequestParam("ids") List<Long> ids){
    //判断dish状态
    //根据ids获取所有的dish信息
    LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
    wrapper.in(Dish::getId, ids);
    List<Dish> list = dishService.list(wrapper);
    //判断每一个status 如果都为0,可以删除。
    boolean flag = true;
    for (Dish dish : list) {
        if (dish.getStatus() == 1){
            flag = false;
        }
    }

    if (flag){
        //根据id查询dishFlavor表中对应的信息
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(DishFlavor::getDishId, ids);
        dishFlavorService.remove(queryWrapper);
        //根据id删除
        dishService.removeByIds(ids);
        return R.success("删除成功");
    }else {
        return R.error("存在正在售卖菜品,删除失败");
    }
}

四、修改

1.回显数据

猿创征文|瑞吉外卖——管理端_菜品管理_2_第3张图片

分析:dish地址,GET方式,"/{id}"地址
通过之前的研究,可以发现此处返回值类型为DishDto类型。

/**
 * 修改菜品——数据回显
 * @param id
 * @return
 */
@GetMapping("/{id}")
public R<DishDto> id(@PathVariable Long id){
    //根据id查询
    DishDto dishDto = dishService.getDishDto(id);
    return R.success(dishDto);
}

在IDishService中创建getDishDto方法

DishDto getDishDto(Long id);

在IDishServiceImpl中实现方法

/**
 * 修改——数据回显
 * @param id
 * @return
 */
@Override
public DishDto getDishDto(Long id) {
    //1.根据id查询dish数据
    Dish dish = this.getById(id);
    //2.更加id查询口味信息
    LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(DishFlavor::getDishId, id);
    List<DishFlavor> flavors = dishFlavorService.list(queryWrapper);

    //3.组装dishDto
    DishDto dishDto = new DishDto();
    BeanUtils.copyProperties(dish, dishDto);
    dishDto.setFlavors(flavors);

    return dishDto;
}

2.保存

猿创征文|瑞吉外卖——管理端_菜品管理_2_第4张图片

分析:dish地址,PUT方式
这里的修改其实是保存的意思。否则无法添加新的口味。

/**
 * 修改菜品——保存
 * @param request
 * @param dishDto
 * @return
 */
@PutMapping
public R<String> dishupdate(HttpServletRequest request, @RequestBody DishDto dishDto){
    //添加创建时间和修改时间
    dishDto.setUpdateTime(LocalDateTime.now());
    //添加创建人和修改人
    Long empId = (Long) request.getSession().getAttribute("employee");
    dishDto.setUpdateUser(empId);
    dishService.updateDishFlavor(request, dishDto);
    return R.success("修改菜品成功");
}

在IDishService中创建updateDishFlavor方法

void updateDishFlavor(HttpServletRequest request, DishDto dishDto);

在IDishServiceImpl中实现方法

/**
 * 修改菜品——保存
 * @param request
 * @param dishDto
 * @return
 */
@Override
@Transactional
public void updateDishFlavor(HttpServletRequest request, DishDto dishDto) {
    //保存dish的基本信息到dish表
    this.updateById(dishDto);

    //删除原有的菜品口味
    LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(DishFlavor::getDishId, dishDto.getId());
    dishFlavorService.remove(queryWrapper);

    //存储dishId
    List<DishFlavor> flavors = dishDto.getFlavors();
    flavors = flavors.stream().map((item) -> {
        //设置dishid
        item.setDishId(dishDto.getId());
        
        ///添加创建时间和修改时间
        item.setCreateTime(LocalDateTime.now());
        item.setUpdateTime(LocalDateTime.now());
        //添加创建人和修改人
        Long empId = (Long) request.getSession().getAttribute("employee");
        item.setCreateUser(empId);
        item.setUpdateUser(empId);
        return item;
    }).collect(Collectors.toList());

    dishFlavorService.saveBatch(flavors);
}

五、停售与起售

1.单个

猿创征文|瑞吉外卖——管理端_菜品管理_2_第5张图片

分析:dish地址,POST方式,status地址,status(0),ids属性
从资料中可以知道,_0 停售 1 起售,_所以,地址中的status为修改之后的状态码.

/**
 * 起售与停售
 * @param status
 * @param ids
 * @return
 */
@PostMapping("/status/{status}")
public R<String> status(@PathVariable Integer status, @PathParam("ids") Long ids){
    //1.根据ids查询dish表
    Dish dish = dishService.getById(ids);
    dish.setStatus(status);
    dishService.updateById(dish);
    if (status == 0){
        return R.success("开始停售");
    }else {
        return R.success("开始启售");
    }
}

2.批量

猿创征文|瑞吉外卖——管理端_菜品管理_2_第6张图片

单个与批量的区别再也ids属性,批量中含有多个ids
直接在单个起售与停售中修改,否则项目无法启动成功。
报如下错误:
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map ‘dishController’ method

/**
* 批量起售与停售
* @param status
* @param ids
* @return
*/
@PostMapping("/status/{status}")
public R<String> status(@PathVariable Integer status, @RequestParam List<Long> ids){
    //log.info(status.toString());
    //log.info(ids.toString());

    //1.根据ids查询dish表
    LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.in(Dish::getId, ids);
    List<Dish> list = dishService.list(queryWrapper);

    //更改list所有的status 遍历方式
    for (Dish dish : list) {
        dish.setStatus(status);
        dishService.updateById(dish);
    }

    if (status == 0){
        return R.success("开始停售");
    }else {
        return R.success("开始启售");
    }
}

你可能感兴趣的:(瑞吉外卖,java,mybatis,spring,boot)