• 黑马瑞吉外卖之删除分类


    黑马瑞吉外卖之删除分类

    前端分析

    在分类管理这里,可以看到对于分类的两个操作,一个是修改,一个是删除
    在这里插入图片描述
    现在先看删除的操作。但是又需要注意的点就是如果分类下面关联了菜品或者套餐的话,我们是不可以去删除的。

    从前端页面去分析的话,这个按钮绑定了方法

    在这里插入图片描述
    点击删除按钮的时候会给出一个确认的提示,确认的话会继续执行then下面的部分。具体调用了一个方法,传入的参数是id。
    在这里插入图片描述

    来看这个方法,其实也是写在一个js里面,从这里我们就明白了路径和具体的请求方法和传递参数。

    在这里插入图片描述
    这是分析的方法执行的路径。在后端呢,我们要进行一些处理,包括去查询分类是否关联套餐和菜品。

    后端功能开发

    相关的实体类这里就不提供了,课程都已经给好了。在这里主要去着重看分类的功能。
    不过我们需要导入两个实体类,是套餐和菜品,
    在这里插入图片描述
    按照前面的气门一次创建出来各自的dao层,service层,以及实现。这三个还是按照mybatisplus的开发思路去创建出来。

    这些实体类参照数据库的字段都给出来了。关联的话其实是按照下面这个categoryId去关联的。所以我们通过分析就可以明白怎么去查询是否关联。
    在这里插入图片描述
    在这里插入图片描述
    在数据库表中给菜品表和套餐表设计了字段叫做categoryId,这个属性字段可以作为与分类关联的依据,在具体的分类的表中,与菜品分类和套餐分类,他们有自己的id,我们判断是否关联的方法就是比对菜品表和套餐表当中的categoryId和分类表具体的分类的id是否一样,一样的话就说明有关联。
    而实际上我们可以这样去判断,我们可以将分类的id给到后端,后端直接将这个字段作为categoryId,看看是否可以查到数据。如果可以查到就说明关联了。

    于是在用到mybatisplus的删除的操作的时候,我们需要去做一些判断,那么我们句需要去重新定义remove方法。我们直接在service去扩展remove方法。

    在这里插入图片描述

    package com.jgdabc.service;
    
    import com.baomidou.mybatisplus.extension.service.IService;
    import com.jgdabc.entity.Category;
    
    public interface CategoryService extends IService<Category> {
        public void remove(Long id);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    那么具体的逻辑就写在service的实现类,那这样的逻辑的话就十分清楚了。我们可以自定义一个异常,当查询出来关联到菜品或者套餐的时候,我们就抛出异常,这个异常我们去自定义就好了。

    package com.jgdabc.common;
    //自定义业务异常
    public class CustomException extends RuntimeException {
        public  CustomException(String message)
        {
            super(message);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    然后在全局异常处理器去处理
    在这里插入图片描述
    该方法还在我们的全局异常处理器类中
    在这里插入图片描述

     @ExceptionHandler(CustomException.class)
        public R_<String> exceptionHandeler(CustomException ex)
        {
            log.error(ex.getMessage());
    
            return  R_.error(ex.getMessage());
    
    
        }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    package com.jgdabc.service.impl;
    
    import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.jgdabc.common.CustomException;
    import com.jgdabc.entity.Category;
    import com.jgdabc.entity.Dish;
    import com.jgdabc.entity.Setmeal;
    import com.jgdabc.mapper.CategoryMapper;
    import com.jgdabc.service.CategoryService;
    import com.jgdabc.service.DishService;
    import com.jgdabc.service.SetMealService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    @Slf4j
    @Service
    public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> implements CategoryService {
        @Autowired
        private DishService dishService;
        @Autowired
        private SetMealService setMealService;
        @Override
    //    根据id删除分类,删除之前进行判断
        public void remove(Long id) {
            LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
    //        添加查询条件
            dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);
            long count = dishService.count(dishLambdaQueryWrapper);
            if(count>0)
            {
                log.info("检测到关联菜品");
                throw new CustomException("当前分类项关联了菜品,不能删除");
    //            说明已经关联了菜品,抛出一个业务异常
            }
    //        查询当前分类是否关联菜品,如果关联,就抛出业务异常,
            LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
            setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
            long count1 = setMealService.count(setmealLambdaQueryWrapper);
            if(count1>0)
            {
                log.info("检测到关联套餐");
                throw new CustomException("当前分类下关联了套餐,不能进行删除");
    
    //            说明已经关联了套餐,需要配抛出一个义务异常
            }
            super.removeById(id);
    
    
    //        查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
            //正常删除分类
        }
    }
    
    
    • 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

    然后在controller里面我们再调用这个方法就好了。
    在这里插入图片描述

    /    根据id来删除分类
        @DeleteMapping
        public R_<String>delete(Long id)
        {
            log.info("删除分类:id为:{}",id);
    //        categoryService.removeById(id);
            categoryService.remove(id);
            return R_.success("分类信息删除成功");
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在数据库表中分类的川菜关联了具体的菜品现在进行去删除,看看能否得到相应的提示效果
    在这里插入图片描述
    在这里插入图片描述
    这样我们就做好了。

  • 相关阅读:
    【C++进阶】多态
    OA系统,有效提升企业办公效率落实执行力
    U2-Net显著性检测源码详解
    YAYA LIVE CTO 唐鸿斌:真正本地化,要让产品没有「产地」属性
    移动硬盘被误删除了怎么找回呢?
    vue源码分析(四)——vue 挂载($mount)的详细过程
    vue项目添加水印
    linux编程与基础:第二章命令与开发工具--自我总结
    Spring 定时任务如何到达某一指定时间点后,触发任务机制
    Linux中目录的概述以及 查看 切换 创建和删除目录
  • 原文地址:https://blog.csdn.net/jgdabc/article/details/126328140