目录
一、公共字段自动填充 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
公共字段:在不同的功能处,都有存在响应的字段。实际上就是重复的内容,用到的地方比较多。
实现步骤:
步骤一:在实体类属性上添加注解@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.2中createUser和updateUser时,设置的属性信息为固定值。将该固定值设置为动态获得当前登陆用户的id。
解决方案:
ThreadLocal:
实现步骤:
步骤一:创建BaseContext工具类。
代码:
/*** 基于ThreadLocal封装工具类,用户保存和获取当前登陆用户id*/
public class BaseContext {private static ThreadLocal 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值
分类管理的数据模型:数据库中的表category
代码开发的基础准备:(骨架的搭建)
需求分析:将分类管理进行分页处理
本部分代码:
/*** 分页查询* @param page* @param pageSize* @return*/@GetMapping("/page")public R page(int page,int pageSize){//分页构造器Page pageInfo = new Page<>(page,pageSize);//条件构造器,需要设置一个过滤的条件,进行排序。在category实体类里面有一个排序的条件sortLambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();//添加排序条件,根据sort进行排序queryWrapper.orderByAsc(Category::getSort);//根据sort这个字段来进行升序排序//进行分页查询categoryService.page(pageInfo,queryWrapper);//根据page类进行分页查询return R.success(pageInfo);}
注:如果这个分类下面连接着其他的具体的某个菜,是不能被删除的。例如:热门菜品分类:关联着鱼香肉丝。那么这个热门菜品的这个分类是不能被删除的。
初步的代码:
/*** 根据id删除分类* @param id* @return*/@DeleteMappingpublic R delete(Long id){log.info("删除分类,id为:{}",id);categoryService.removeById(id);return R.success("分类信息删除成功");}
前期的基础内容准备:基础的类和基础的接口
解决方案;因为删除菜品分类之前,需要有一个判断的过程,看是否能被删除掉。4.2中使用的是mtbatis给封装好的一个remove。我们就需要创建一个新的,在CategoryService的接口中创建一个新的方法。
解决该问题的步骤:
步骤一:创建分类管理类中创建异常的方法
步骤二:在对应的实现类中方法代码书写
@Service
public class CategoryServiceImpl extends ServiceImpl implements CategoryService {@Autowiredprivate SetmealService setmealService;@Autowiredprivate DishService dishService;/*** 根据id删除分类,删除之前需要进行判断* @param id*/@Overridepublic void remove(Long id) {//构造查询对象LambdaQueryWrapper 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 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 exceptionHandler(CustomException ex){log.error(ex.getMessage());return R.error(ex.getMessage());//通过ex就可以直接获取前面定义的message信息。}
}
步骤四:在Controller层中进行方法的调用
代码:
/*** 根据id删除分类* @param id* @return*/@DeleteMappingpublic R delete(Long id){log.info("删除分类,id为:{}",id);// categoryService.removeById(id);//removeById是mybatis内置的方法。categoryService.remove(id);//这个是自己创建的业务异常删除的方法,调用CategoryServiceImpl中的remove方法return R.success("分类信息删除成功");}
信息回显:就是点击“修改”按钮后,弹出的窗口上就有对应的信息内容展示。
代码部分:在controller层进行修改处理
/*** 根据id修改分类信息* @param category* @return*/@PutMappingpublic R update(@RequestBody Category category){log.info("修改分类信息:{}",category);categoryService.updateById(category);return R.success("修改分类信息成功");}
上一篇:数据结构:循环队列
下一篇:npm设置和查看仓库源