• 外卖项目03---分类管理业务开发


    目录

    一、公共字段自动填充 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 

     步骤二:创建一个实体的公共类,用于公共字段的处理

    步骤三:对公共字段的处理的属性信息在对应的方法处进行修改处理

    之前的字段:

    本部分的代码如下:

    1. @Component
    2. @Slf4j
    3. public class MyMetaObjecthandler implements MetaObjectHandler {
    4. @Override //insert语句执行时才会运行该语句 添加时的处理操作
    5. public void insertFill(MetaObject metaObject) {
    6. log.info("公共字段自动填充[insert]...");
    7. log.info(metaObject.toString());
    8. metaObject.setValue("createTime", LocalDateTime.now());
    9. metaObject.setValue("updateTime",LocalDateTime.now());
    10. metaObject.setValue("createUser",new Long(1));//由于我们需要获得Sesion中的数据信息,
    11. // 但是该类中不能直接获取,先用“1”来代替填充数据
    12. metaObject.setValue("updateUser",new Long(1));
    13. }
    14. @Override //update语句执行时才会运行该语句 更新时的处理操作
    15. public void updateFill(MetaObject metaObject) {
    16. log.info("公共字段自动填充[update]...");
    17. log.info(metaObject.toString());
    18. metaObject.setValue("updateTime",LocalDateTime.now());
    19. metaObject.setValue("updateUser",new Long(1));
    20. }
    21. }

    1.3公共字段自动填充---功能完善 43

    问题处理:本部分解决在1.2中createUser和updateUser时,设置的属性信息为固定值。将该固定值设置为动态获得当前登陆用户的id。

    解决方案:

     

     ThreadLocal:

    实现步骤:

     步骤一:创建BaseContext工具类。

    代码:

    1. /**
    2. * 基于ThreadLocal封装工具类,用户保存和获取当前登陆用户id
    3. */
    4. public class BaseContext {
    5. private static ThreadLocal threadLocal = new ThreadLocal<>();
    6. public static void setCurrentId(Long id){
    7. threadLocal.set(id);//设置id
    8. }
    9. public static Long getCurrrentId(){//获取id并返回long类
    10. return threadLocal.get();
    11. }
    12. }

    步骤二:在LoginCheckFilter方法中调用创建的工具类,使得其能够调用获取用户登陆成功的id信息

    1. Long empId = (Long) request.getSession().getAttribute("employee");
    2. BaseContext.setCurrentId(empId);

    步骤三:在MyMethaObjecthandler方法中,获取步骤二设定的id值

    二、新增分类 44

    2.1需求分析 44

     

     分类管理的数据模型:数据库中的表category

    代码开发的基础准备:(骨架的搭建)

     

    三、分类信息查询 45

    3.1需求分析 45

    需求分析:将分类管理进行分页处理 

    3.2代码开发 流程分析

    本部分代码:

    1. /**
    2. * 分页查询
    3. * @param page
    4. * @param pageSize
    5. * @return
    6. */
    7. @GetMapping("/page")
    8. public R page(int page,int pageSize){
    9. //分页构造器
    10. Page pageInfo = new Page<>(page,pageSize);
    11. //条件构造器,需要设置一个过滤的条件,进行排序。在category实体类里面有一个排序的条件sort
    12. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    13. //添加排序条件,根据sort进行排序
    14. queryWrapper.orderByAsc(Category::getSort);//根据sort这个字段来进行升序排序
    15. //进行分页查询
    16. categoryService.page(pageInfo,queryWrapper);//根据page类进行分页查询
    17. return R.success(pageInfo);
    18. }

    四、删除分类 46

    4.1需求分析 46

    注:如果这个分类下面连接着其他的具体的某个菜,是不能被删除的。例如:热门菜品分类:关联着鱼香肉丝。那么这个热门菜品的这个分类是不能被删除的。

    4.2代码开发 

     初步的代码:

    1. /**
    2. * 根据id删除分类
    3. * @param id
    4. * @return
    5. */
    6. @DeleteMapping
    7. public R delete(Long id){
    8. log.info("删除分类,id为:{}",id);
    9. categoryService.removeById(id);
    10. return R.success("分类信息删除成功");
    11. }

    4.3功能完善---代码开发(自定义业务异常处理) 47

    前期的基础内容准备:基础的类和基础的接口 

     解决方案;因为删除菜品分类之前,需要有一个判断的过程,看是否能被删除掉。4.2中使用的是mtbatis给封装好的一个remove。我们就需要创建一个新的,在CategoryService的接口中创建一个新的方法。

    解决该问题的步骤

    步骤一:创建分类管理类中创建异常的方法

    步骤二:在对应的实现类中方法代码书写

    1. @Service
    2. public class CategoryServiceImpl extends ServiceImpl implements CategoryService {
    3. @Autowired
    4. private SetmealService setmealService;
    5. @Autowired
    6. private DishService dishService;
    7. /**
    8. * 根据id删除分类,删除之前需要进行判断
    9. * @param id
    10. */
    11. @Override
    12. public void remove(Long id) {
    13. //构造查询对象
    14. LambdaQueryWrapper dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
    15. //添加查询条件,根据分类id进行查询
    16. dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);//查询输出的Long id。传入的id和CategoryId进行匹配
    17. int count1 = dishService.count(dishLambdaQueryWrapper);
    18. //1、查询当前分类是否关联了菜品,如果已经关联,抛出一个业务异常。
    19. if(count1 > 0){
    20. //已经关联菜品,抛出一个业务异常
    21. throw new CustomException("当前分类下关联了菜品,不能删除");//实际上就是在前端的页面上点击删除后,
    22. // 会弹出窗口提示异常的信息
    23. }
    24. //2、查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
    25. //构造查询对象
    26. LambdaQueryWrapper setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
    27. //添加查询条件,根据分类id进行查询
    28. setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
    29. int count2 = setmealService.count(setmealLambdaQueryWrapper);
    30. if(count2 > 0){
    31. //已经关联套餐,抛出一个业务异常
    32. throw new CustomException("当前分类下关联了套餐,不能删除");
    33. }
    34. //正常删除
    35. super.removeById(id);
    36. }
    37. }

    步骤三:在上述的基础上创建一个自定义的业务异常类(公共类)

    代码:

    1. /**
    2. * 自定义业务异常类
    3. */
    4. public class CustomException extends RuntimeException {
    5. public CustomException(String message){
    6. super(message);
    7. }
    8. }

     并在之前的全局异常位置进行添加处理:

    代码如下:

    1. /**
    2. * 异常处理方法
    3. * @return
    4. */
    5. @ExceptionHandler(CustomException.class)
    6. public R exceptionHandler(CustomException ex){
    7. log.error(ex.getMessage());
    8. return R.error(ex.getMessage());//通过ex就可以直接获取前面定义的message信息。
    9. }
    10. }

    步骤四:在Controller层中进行方法的调用

    代码:

    1. /**
    2. * 根据id删除分类
    3. * @param id
    4. * @return
    5. */
    6. @DeleteMapping
    7. public R delete(Long id){
    8. log.info("删除分类,id为:{}",id);
    9. // categoryService.removeById(id);//removeById是mybatis内置的方法。
    10. categoryService.remove(id);//这个是自己创建的业务异常删除的方法,调用CategoryServiceImpl中的remove方法
    11. return R.success("分类信息删除成功");
    12. }

    五、修改分类 48

    5.1需求分析 48

     信息回显:就是点击“修改”按钮后,弹出的窗口上就有对应的信息内容展示。

    代码部分:在controller层进行修改处理

    1. /**
    2. * 根据id修改分类信息
    3. * @param category
    4. * @return
    5. */
    6. @PutMapping
    7. public R update(@RequestBody Category category){
    8. log.info("修改分类信息:{}",category);
    9. categoryService.updateById(category);
    10. return R.success("修改分类信息成功");
    11. }

  • 相关阅读:
    236. 二叉树的最近公共祖先
    【Java|golang】1656. 设计有序流
    5800计算程序
    基于Transformer的目标检测:原理、应用与未来展望
    带团队后的日常思考(十二)
    Linux环境变量
    鼎盛合 | 宠物智能投食机方案设计开发
    推荐10款3DMax样条线相关的神仙插件
    Mac的Safari浏览器如何打开检查元素【网页控制台】
    NoSQL之 Redis配置
  • 原文地址:https://blog.csdn.net/xiaoxixicc/article/details/127855158