目录
一、公共字段自动填充 41
1.1问题分析 41
编辑1.2公共字段自动填充---代码实现并测试 42
1.3公共字段自动填充---功能完善 43
二、新增分类 44
2.1需求分析 44
三、分类信息查询 45
3.1需求分析 45
3.2代码开发 流程分析
四、删除分类 46
4.1需求分析 46
4.2代码开发
4.3功能完善---代码开发(自定义业务异常处理) 47
五、修改分类 48
5.1需求分析 48
一、公共字段自动填充 41
1.1问题分析 41
公共字段:在不同的功能处,都有存在响应的字段。实际上就是重复的内容,用到的地方比较多。
1.2公共字段自动填充---代码实现并测试 42
实现步骤:
步骤一:在实体类属性上添加注解@TableField
步骤二:创建一个实体的公共类,用于公共字段的处理
步骤三:对公共字段的处理的属性信息在对应的方法处进行修改处理
之前的字段:
本部分的代码如下:
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
@Override //insert语句执行时才会运行该语句 添加时的处理操作
public void insertFill(MetaObject metaObject) {
log.info("公共字段自动填充[insert]...");
log.info(metaObject.toString());
metaObject.setValue("createTime", LocalDateTime.now());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("createUser",new Long(1));//由于我们需要获得Sesion中的数据信息,
// 但是该类中不能直接获取,先用“1”来代替填充数据
metaObject.setValue("updateUser",new Long(1));
}
@Override //update语句执行时才会运行该语句 更新时的处理操作
public void updateFill(MetaObject metaObject) {
log.info("公共字段自动填充[update]...");
log.info(metaObject.toString());
metaObject.setValue("updateTime",LocalDateTime.now());
metaObject.setValue("updateUser",new Long(1));
}
}
1.3公共字段自动填充---功能完善 43
问题处理:本部分解决在1.2中createUser和updateUser时,设置的属性信息为固定值。将该固定值设置为动态获得当前登陆用户的id。
解决方案:
ThreadLocal:
实现步骤:
步骤一:创建BaseContext工具类。
代码:
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登陆用户id
*/
public class BaseContext {
private static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setCurrentId(Long id){
threadLocal.set(id);//设置id
}
public static Long getCurrrentId(){//获取id并返回long类
return threadLocal.get();
}
}
步骤二:在LoginCheckFilter方法中调用创建的工具类,使得其能够调用获取用户登陆成功的id信息
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
步骤三:在MyMethaObjecthandler方法中,获取步骤二设定的id值
二、新增分类 44
2.1需求分析 44
分类管理的数据模型:数据库中的表category
代码开发的基础准备:(骨架的搭建)
三、分类信息查询 45
3.1需求分析 45
需求分析:将分类管理进行分页处理
3.2代码开发 流程分析
本部分代码:
/**
* 分页查询
* @param page
* @param pageSize
* @return
*/
@GetMapping("/page")
public R<Page> page(int page,int pageSize){
//分页构造器
Page<Category> pageInfo = new Page<>(page,pageSize);
//条件构造器,需要设置一个过滤的条件,进行排序。在category实体类里面有一个排序的条件sort
LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper<>();
//添加排序条件,根据sort进行排序
queryWrapper.orderByAsc(Category::getSort);//根据sort这个字段来进行升序排序
//进行分页查询
categoryService.page(pageInfo,queryWrapper);//根据page类进行分页查询
return R.success(pageInfo);
}
四、删除分类 46
4.1需求分析 46
注:如果这个分类下面连接着其他的具体的某个菜,是不能被删除的。例如:热门菜品分类:关联着鱼香肉丝。那么这个热门菜品的这个分类是不能被删除的。
4.2代码开发
初步的代码:
/**
* 根据id删除分类
* @param id
* @return
*/
@DeleteMapping
public R<String> delete(Long id){
log.info("删除分类,id为:{}",id);
categoryService.removeById(id);
return R.success("分类信息删除成功");
}
4.3功能完善---代码开发(自定义业务异常处理) 47
前期的基础内容准备:基础的类和基础的接口
解决方案;因为删除菜品分类之前,需要有一个判断的过程,看是否能被删除掉。4.2中使用的是mtbatis给封装好的一个remove。我们就需要创建一个新的,在CategoryService的接口中创建一个新的方法。
解决该问题的步骤:
步骤一:创建分类管理类中创建异常的方法
步骤二:在对应的实现类中方法代码书写
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper,Category> implements CategoryService {
@Autowired
private SetmealService setmealService;
@Autowired
private DishService dishService;
/**
* 根据id删除分类,删除之前需要进行判断
* @param id
*/
@Override
public void remove(Long id) {
//构造查询对象
LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
//添加查询条件,根据分类id进行查询
dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);//查询输出的Long id。传入的id和CategoryId进行匹配
int count1 = dishService.count(dishLambdaQueryWrapper);
//1、查询当前分类是否关联了菜品,如果已经关联,抛出一个业务异常。
if(count1 > 0){
//已经关联菜品,抛出一个业务异常
throw new CustomException("当前分类下关联了菜品,不能删除");//实际上就是在前端的页面上点击删除后,
// 会弹出窗口提示异常的信息
}
//2、查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
//构造查询对象
LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
//添加查询条件,根据分类id进行查询
setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
int count2 = setmealService.count(setmealLambdaQueryWrapper);
if(count2 > 0){
//已经关联套餐,抛出一个业务异常
throw new CustomException("当前分类下关联了套餐,不能删除");
}
//正常删除
super.removeById(id);
}
}
步骤三:在上述的基础上创建一个自定义的业务异常类(公共类)
代码:
/**
* 自定义业务异常类
*/
public class CustomException extends RuntimeException {
public CustomException(String message){
super(message);
}
}
并在之前的全局异常位置进行添加处理:
代码如下:
/**
* 异常处理方法
* @return
*/
@ExceptionHandler(CustomException.class)
public R<String> exceptionHandler(CustomException ex){
log.error(ex.getMessage());
return R.error(ex.getMessage());//通过ex就可以直接获取前面定义的message信息。
}
}
步骤四:在Controller层中进行方法的调用
代码:
/**
* 根据id删除分类
* @param id
* @return
*/
@DeleteMapping
public R<String> delete(Long id){
log.info("删除分类,id为:{}",id);
// categoryService.removeById(id);//removeById是mybatis内置的方法。
categoryService.remove(id);//这个是自己创建的业务异常删除的方法,调用CategoryServiceImpl中的remove方法
return R.success("分类信息删除成功");
}
五、修改分类 48
5.1需求分析 48
信息回显:就是点击“修改”按钮后,弹出的窗口上就有对应的信息内容展示。
代码部分:在controller层进行修改处理
/**
* 根据id修改分类信息
* @param category
* @return
*/
@PutMapping
public R<String> update(@RequestBody Category category){
log.info("修改分类信息:{}",category);
categoryService.updateById(category);
return R.success("修改分类信息成功");
}