目录
公共字段:在不同的功能处,都有存在响应的字段。实际上就是重复的内容,用到的地方比较多。
实现步骤:
步骤一:在实体类属性上添加注解@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实体类里面有一个排序的条件sort
- LambdaQueryWrapper
queryWrapper = new LambdaQueryWrapper<>(); -
- //添加排序条件,根据sort进行排序
- queryWrapper.orderByAsc(Category::getSort);//根据sort这个字段来进行升序排序
-
- //进行分页查询
- categoryService.page(pageInfo,queryWrapper);//根据page类进行分页查询
- return R.success(pageInfo);
- }
注:如果这个分类下面连接着其他的具体的某个菜,是不能被删除的。例如:热门菜品分类:关联着鱼香肉丝。那么这个热门菜品的这个分类是不能被删除的。
初步的代码:
- /**
- * 根据id删除分类
- * @param id
- * @return
- */
- @DeleteMapping
- public 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 { -
- @Autowired
- private SetmealService setmealService;
- @Autowired
- private DishService dishService;
- /**
- * 根据id删除分类,删除之前需要进行判断
- * @param id
- */
- @Override
- public 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
- */
- @DeleteMapping
- public 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
- */
- @PutMapping
- public R
update(@RequestBody Category category){ - log.info("修改分类信息:{}",category);
-
- categoryService.updateById(category);
- return R.success("修改分类信息成功");
-
- }