在分类管理这里,可以看到对于分类的两个操作,一个是修改,一个是删除
现在先看删除的操作。但是又需要注意的点就是如果分类下面关联了菜品或者套餐的话,我们是不可以去删除的。
从前端页面去分析的话,这个按钮绑定了方法
点击删除按钮的时候会给出一个确认的提示,确认的话会继续执行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("分类信息删除成功");
}
在数据库表中分类的川菜关联了具体的菜品现在进行去删除,看看能否得到相应的提示效果
这样我们就做好了。