猿创征文|瑞吉外卖——管理端_套餐管理

个人名片:

博主:酒徒ᝰ.
专栏:瑞吉外卖
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。

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

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

目录

  • 一、页面显示
    • 1.显示全部
    • 2.输入框查询
  • 二、新建套餐
    • 1.套餐菜品
    • 2.保存
  • 三、修改
    • 1.回显数据
    • 2.保存
  • 四、停售与起售
    • 1.单个
    • 2.批量
  • 五、删除
    • 1.单个
    • 2.批量
    • 3.菜品删除
    • 4.状态判断

一、页面显示

1.显示全部

猿创征文|瑞吉外卖——管理端_套餐管理_第1张图片

分析:setmeal地址,GET方式,page地址,page,pageSize属性

package com.itheima.reggie.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.service.ISetmealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**
 * 

* 套餐 前端控制器 *

* * @author 酒徒 * @since 2022-09-04 */
@RestController @RequestMapping("/setmeal") public class SetmealController { @Autowired private ISetmealService setmealService; /** * 页面显示 * @param page * @param pageSize * @param name * @return */ @GetMapping("/page") public R<Page> page(int page, int pageSize, String name){ //页面构造器 Page<Setmeal> pageInfo = new Page<>(page, pageSize); //查询setmeal表中所有信息 LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(Setmeal::getUpdateTime); setmealService.page(pageInfo, queryWrapper); return R.success(pageInfo); } }

在此查询页面,发现一点小问题,套餐分类没有内容。也就是categoryName。
修改后代码如下

package com.itheima.reggie.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.dto.SetmealDto;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.entity.Setmeal;
import com.itheima.reggie.entity.SetmealDish;
import com.itheima.reggie.service.ICategoryService;
import com.itheima.reggie.service.ISetmealService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 

* 套餐 前端控制器 *

* * @author 酒徒 * @since 2022-09-04 */
@RestController @RequestMapping("/setmeal") public class SetmealController { @Autowired private ISetmealService setmealService; @Autowired private ICategoryService categoryService; /** * 页面显示 * @param page * @param pageSize * @param name * @return */ @GetMapping("/page") public R<Page> page(int page, int pageSize, String name){ //页面构造器 Page<Setmeal> setmealPage = new Page<>(page, pageSize); Page<SetmealDto> setmealDtoPage = new Page<>(page, pageSize); //查询setmeal表中所有信息 LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.orderByDesc(Setmeal::getUpdateTime); setmealService.page(setmealPage, queryWrapper); //setmealDtoPage,将其加入setmealDtoPage //1.拷贝setmealPage到setmealDtoPage BeanUtils.copyProperties(setmealPage, setmealDtoPage); //以流的形式设置每一个categoryName List<Setmeal> records = setmealPage.getRecords(); List<SetmealDto> dtoList = records.stream().map((item) -> { //通过categoryId查询categoryName LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Category::getId, item.getCategoryId()); Category category = categoryService.getOne(wrapper); //设置categoryName到setmealDto中 SetmealDto setmealDto = new SetmealDto(); setmealDto.setCategoryName(category.getName()); return setmealDto; }).collect(Collectors.toList()); //添加categoryName setmealDtoPage.setRecords(dtoList); return R.success(setmealDtoPage); } }

2.输入框查询

猿创征文|瑞吉外卖——管理端_套餐管理_第2张图片

相对于全部查询来说,多了一个name属性

if (name != null){
    queryWrapper.like(Setmeal::getName, name);
}

完整代码如下:

/**
* 页面显示
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name){
    //页面构造器
    Page<Setmeal> setmealPage = new Page<>(page, pageSize);
    Page<SetmealDto> setmealDtoPage = new Page<>(page, pageSize);

    //查询setmeal表中所有信息
    LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
    if (name != null){
        queryWrapper.like(Setmeal::getName, name);
    }
    queryWrapper.orderByDesc(Setmeal::getUpdateTime);
    setmealService.page(setmealPage, queryWrapper);

    //setmealDtoPage,将其加入setmealDtoPage
    //1.拷贝setmealPage到setmealDtoPage
    BeanUtils.copyProperties(setmealPage, setmealDtoPage);

    //以流的形式设置每一个categoryName
    List<Setmeal> records = setmealPage.getRecords();
    List<SetmealDto> dtoList = records.stream().map((item) -> {
        //通过categoryId查询categoryName
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Category::getId, item.getCategoryId());
        Category category = categoryService.getOne(wrapper);

        //设置categoryName到setmealDto中
        SetmealDto setmealDto = new SetmealDto();
        setmealDto.setCategoryName(category.getName());
        
        //拷贝setmeal的信息到SetmealDto中
        BeanUtils.copyProperties(item, setmealDto);

        return setmealDto;
    }).collect(Collectors.toList());

    //添加categoryName
    setmealDtoPage.setRecords(dtoList);

    return R.success(setmealDtoPage);
}

二、新建套餐

1.套餐菜品

猿创征文|瑞吉外卖——管理端_套餐管理_第3张图片

分析:dish地址,GET方式,list地址,categoryId属性

/**
 * 套餐——新增套餐——套餐菜品显示
 * @param categoryId
 * @return
 */
@GetMapping("/list")
public R<List<Dish>> list(@PathParam("categoryId") Long categoryId){
    //根据categoryId查询菜品名
    LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(Dish::getCategoryId, categoryId)
                    .eq(Dish::getStatus, 1)
            .orderByAsc(Dish::getSort)
            .orderByDesc(Dish::getUpdateTime);
    List<Dish> list = dishService.list(queryWrapper);
    return R.success(list);
}

2.保存

猿创征文|瑞吉外卖——管理端_套餐管理_第4张图片

分析:setmeal地址,POST方式

/**
* 新建套餐——保存
* @param request
* @param setmealDto
* @return
*/
@PostMapping
public R<String> setmeal(HttpServletRequest request, @RequestBody SetmealDto setmealDto){
    //log.info("setmealDto:{}",setmealDto);//setmealDto:SetmealDto(setmealDishes=[SetmealDish(id=null, setmealId=null, dishId=1397851668262465537, name=口味蛇, price=16800, copies=1, sort=null, createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null), categoryName=null)
    //添加创建时间和修改时间
    setmealDto.setCreateTime(LocalDateTime.now());
    setmealDto.setUpdateTime(LocalDateTime.now());
    //添加创建人和修改人
    Long empId = (Long) request.getSession().getAttribute("employee");
    setmealDto.setCreateUser(empId);
    setmealDto.setUpdateUser(empId);
    setmealService.saveWithSetmealDto(request,setmealDto);
    return R.success("新增套餐成功");
}

在ISetmealService中创建saveWithSetmealDto方法

void saveWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto);

在ISetmealServiceImpl中实现方法

/**
 * 新建套餐——保存
 * @param request
 * @param setmealDto
 * @return
 */
@PostMapping
public R<String> setmeal(HttpServletRequest request, @RequestBody SetmealDto setmealDto){
    //log.info("setmealDto:{}",setmealDto);//setmealDto:SetmealDto(setmealDishes=[SetmealDish(id=null, setmealId=null, dishId=1397851668262465537, name=口味蛇, price=16800, copies=1, sort=null, createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null), categoryName=null)
    //添加创建时间和修改时间
    setmealDto.setCreateTime(LocalDateTime.now());
    setmealDto.setUpdateTime(LocalDateTime.now());
    //添加创建人和修改人
    Long empId = (Long) request.getSession().getAttribute("employee");
    setmealDto.setCreateUser(empId);
    setmealDto.setUpdateUser(empId);
    setmealService.saveWithSetmealDto(request,setmealDto);
    return R.success("新增套餐成功");
}

三、修改

1.回显数据

猿创征文|瑞吉外卖——管理端_套餐管理_第5张图片

分析:setmeal地址,GET方式,id地址
页面包括套餐的基本信息,和套餐菜品。也就是Setmeal和SetmealDish。即SetmealDto。

/**
 * 修改——信息回显
 * @param id
 * @return
 */
@GetMapping("/{id}")
public R<SetmealDto> list(@PathVariable Long id){
    //测试是否能接受(套餐表)id信息
    log.info("id:{}",id);
    SetmealDto setmealDto = setmealService.getSetmealDto(id);
    return R.success(setmealDto);
}

在ISetmealService中创建getSetmealDto方法

SetmealDto getSetmealDto(Long id);

在ISetmealServiceImpl中实现此方法

/**
 * 套餐修改——信息回显
 * @param id
 * @return
 */
@Override
public SetmealDto getSetmealDto(Long id) {
    //1.根据id查询setmeal表信息
    Setmeal setmeal = setmealService.getById(id);

    //2.将setmeal的信息赋值到SetmealDto中
    SetmealDto setmealDto = new SetmealDto();
    BeanUtils.copyProperties(setmeal, setmealDto);

    //3.查询套餐菜品  多个菜品  流
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SetmealDish::getSetmealId, id);
    List<SetmealDish> list = setmealDishService.list(queryWrapper);

    //键菜品信息设置到SetmealDto中
    setmealDto.setSetmealDishes(list);
    
    return setmealDto;
}

2.保存

猿创征文|瑞吉外卖——管理端_套餐管理_第6张图片

分析:setmeal地址,PUT方式
(注意:和前面修改菜品相同_)_查询数据库中的setmeal_dish表,发现表格为空。所以修改套餐菜品就是保存套餐菜品到setmeal_dish表中,但要注意先删除原有的套餐菜品.

/**
 * 修改——保存
 * @param request
 * @param setmealDto
 * @return
 */
@PutMapping
public R<String> setmeals(HttpServletRequest request, @RequestBody SetmealDto setmealDto){
    log.info("setmealDto:{}",setmealDto);//setmealDto:SetmealDto(setmealDishes=[SetmealDish(id=null, setmealId=null, dishId=1397851668262465537, name=口味蛇, price=16800, copies=1, sort=null, createTime=null, updateTime=null, createUser=null, updateUser=null, isDeleted=null), categoryName=null)
    setmealDto.setUpdateTime(LocalDateTime.now());
    setmealService.updateWithSetmealDto(request, setmealDto);
    return R.success("修改成功");
}

在ISetmealService中创建getSetmealDto方法

void updateWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto);

在ISetmealServiceImpl中实现此方法

/**
 * 套餐修改——保存
 * @param request
 * @param setmealDto
 */
@Override
public void updateWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto) {
    //1.保存setmeal
    setmealService.updateById(setmealDto);

    //2.删除setmeald中所有的套餐菜品
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.eq(SetmealDish::getSetmealId, setmealDto.getId());
    setmealDishService.remove(queryWrapper);

    //3.保存setmealDish
    //批量修改setmealdish  setmealId=null, createTime=null, updateTime=null, createUser=null, updateUser=null
    List<SetmealDish> setmealDishes = setmealDto.getSetmealDishes();
    setmealDishes = setmealDishes.stream().map((item) -> {
        item.setSetmealId(setmealDto.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());

    //修改
    setmealDishService.saveBatch(setmealDishes);
}

四、停售与起售

1.单个

猿创征文|瑞吉外卖——管理端_套餐管理_第7张图片

分析:setmeal地址,POST方式,status,{status}地址,ids属性

/**
 * 单个停售与起售
 * @param status
 * @param ids
 * @return
 */
@PostMapping("/status/{status}")
public R<String> status(@PathVariable int status, @PathParam("ids") Long ids){
    log.info("status,{},ids:{}",status,ids);
    //1.根据ids查询setmeal信息
    Setmeal setmeal = setmealService.getById(ids);
    //2.修改状态码
    setmeal.setStatus(status);
    //3.修改setmeal
    setmealService.updateById(setmeal);
    if (status == 0){
        return R.success("停售成功");
    }else if (status == 1){
        return R.success("起售成功");
    }else {
        return R.success("状态码异常");
    }
}

2.批量

相对于单个而言,需要查询多个ids。
与菜品管理中修改完全相同。(这里就不解释了)

/**
     * 批量停售与起售
     * @param status
     * @param ids
     * @return
     */
    @PostMapping("/status/{status}")
    public R<String> status(@PathVariable int status, @RequestParam("ids") List<Long> ids){
        log.info("status,{},ids:{}",status,ids);
        //1.根据ids查询所有setmeal信息
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(Setmeal::getId, ids);
        List<Setmeal> list = setmealService.list(queryWrapper);

        //2.批量修改状态码
        for (Setmeal setmeal : list) {
            setmeal.setStatus(status);
            //3.批量修改setmeal
            setmealService.updateById(setmeal);
        }

        if (status == 0){
            return R.success("停售成功");
        }else if (status == 1){
            return R.success("起售成功");
        }else {
            return R.error("状态码异常");
        }
    }

五、删除

1.单个

猿创征文|瑞吉外卖——管理端_套餐管理_第8张图片

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

/**
 * 删除
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> setmeal(@PathParam("ids") Long ids){
    //根据id删除
    setmealService.removeById(ids);
    return R.success("删除成功");
}

2.批量

相对于单个而言,需要查询多个ids。这里就不多说了。

/**
 * 批量删除
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> setmeal(@RequestParam("ids") List<Long> ids){
    //根据id删除
    setmealService.removeByIds(ids);
    return R.success("删除成功");
}

3.菜品删除

检查数据库,发现套餐菜品没有删除。

/**
 * 批量删除
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> setmeal(@RequestParam("ids") List<Long> ids){
    //根据id查询setmealdish表中对应的信息
    LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.in(SetmealDish::getSetmealId, ids);
    setmealDishService.remove(queryWrapper);
    
    //根据id删除
    setmealService.removeByIds(ids);
    return R.success("删除成功");
}

4.状态判断

老是粗心,刚刚删除时看到在起售状态竟然也成功删除了。做出修改。

/**
 * 批量删除——补充口味删除
 * @param ids
 * @return
 */
@DeleteMapping
public R<String> setmeal(@RequestParam("ids") List<Long> ids){
    //判断setmeal状态
    //根据ids获取所有的setmeal信息
    LambdaQueryWrapper<Setmeal> wrapper = new LambdaQueryWrapper<>();
    wrapper.in(Setmeal::getId, ids);
    List<Setmeal> list = setmealService.list();
    //判断每一个status 如果都为0,可以删除。
    boolean flag = true;
    for (Setmeal setmeal : list) {
        if (setmeal.getStatus() == 1){
            flag = false;
        }
    }

    if (flag){
        //根据id查询setmealdish表中对应的信息
        LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(SetmealDish::getSetmealId, ids);
        setmealDishService.remove(queryWrapper);
        //根据id删除
        setmealService.removeByIds(ids);
        return R.success("删除成功");
    }else {
        return R.error("存在正在售卖套餐,删除失败");
    }
}

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