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


    个人名片:

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

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

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

    一、页面显示

    1.显示全部

    image.png

    分析: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); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    在此查询页面,发现一点小问题,套餐分类没有内容。也就是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); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

    2.输入框查询

    image.png

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

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

    完整代码如下:

    /**
    * 页面显示
    * @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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    二、新建套餐

    1.套餐菜品

    image.png

    分析: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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.保存

    image.png

    分析: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("新增套餐成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在ISetmealService中创建saveWithSetmealDto方法

    void saveWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto);
    
    • 1

    在ISetmealServiceImpl中实现方法

    @Override
    public void saveWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto) {
        //1.保存Setmeal
        this.save(setmealDto);
        //2.设置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());
            return item;
        }).collect(Collectors.toList());
    
        setmealDishService.saveBatch(setmealDishes);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、修改

    1.回显数据

    image.png

    分析: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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在ISetmealService中创建getSetmealDto方法

    SetmealDto getSetmealDto(Long id);
    
    • 1

    在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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    2.保存

    image.png

    分析: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("修改成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在ISetmealService中创建getSetmealDto方法

    void updateWithSetmealDto(HttpServletRequest request, SetmealDto setmealDto);
    
    • 1

    在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());
            return item;
        }).collect(Collectors.toList());
    
        //修改
        setmealDishService.saveBatch(setmealDishes);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    四、停售与起售

    1.单个

    image.png

    分析: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("状态码异常");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    五、删除

    1.单个

    image.png

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

    /**
     * 删除
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> setmeal(@PathParam("ids") Long ids){
        //根据id删除
        setmealService.removeById(ids);
        return R.success("删除成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.批量

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

    /**
     * 批量删除
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> setmeal(@RequestParam("ids") List<Long> ids){
        //根据id删除
        setmealService.removeByIds(ids);
        return R.success("删除成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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("删除成功");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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("存在正在售卖套餐,删除失败");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 相关阅读:
    Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)
    Mac | 崩溃分析
    Docker--提高下载速度的方法
    无人机还能“独立思考”,他们做到了...
    网络渗透测试:Wireshark抓取qq图片
    宏集案例 | eX707G人机界面在石油钻井工程中的应用
    MyBatis 分页插件 PageHelper 6.0.0 发布
    大数据——Hive SQL优化
    HTML 超链接 a 标签
    十一、MySql的事务(上)
  • 原文地址:https://blog.csdn.net/m0_65144570/article/details/126808344