zl程序教程

您现在的位置是:首页 >  其它

当前栏目

黑马瑞吉外卖之删除分类

删除 分类 外卖 黑马 瑞吉
2023-06-13 09:13:01 时间

黑马瑞吉外卖之删除分类

前端分析

在分类管理这里,可以看到对于分类的两个操作,一个是修改,一个是删除

现在先看删除的操作。但是又需要注意的点就是如果分类下面关联了菜品或者套餐的话,我们是不可以去删除的。

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

点击删除按钮的时候会给出一个确认的提示,确认的话会继续执行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);
}

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

package com.jgdabc.common;
//自定义业务异常
public class CustomException extends RuntimeException {
    public  CustomException(String message)
    {
        super(message);
    }

}

然后在全局异常处理器去处理

该方法还在我们的全局异常处理器类中

 @ExceptionHandler(CustomException.class)
    public R_<String> exceptionHandeler(CustomException ex)
    {
        log.error(ex.getMessage());

        return  R_.error(ex.getMessage());


    }
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);


//        查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
        //正常删除分类
    }
}

然后在controller里面我们再调用这个方法就好了。

/    根据id来删除分类
    @DeleteMapping
    public R_<String>delete(Long id)
    {
        log.info("删除分类:id为:{}",id);
//        categoryService.removeById(id);
        categoryService.remove(id);
        return R_.success("分类信息删除成功");

    }

在数据库表中分类的川菜关联了具体的菜品现在进行去删除,看看能否得到相应的提示效果

这样我们就做好了。