• 【wiki知识库】05.分类管理模块--后端SpringBoot模块


    427ef4152dbf4b6c92618a198935cb6c.png

      📝个人主页:哈__

    期待您的关注 

    1b7335aca73b41609b7f05d1d366f476.gif

    目录

    一、🔥今日目标

    二、☀SpringBoot代码修改

    1.使用逆向工程生成Category表结构

     2. 新增CategoryQueryParam

    3.新增CategorySaveParam

    4.新增CategotyQueryVo

    三、🤖新增分类管理的相关接口

    1. /category/all

    2./category/save

    3./category/delete

    1.我们删除的是一个二级分类

    2.我们删除的是一个一级分类


    一、🔥今日目标

    【wiki知识库】05.分类管理实现--前端Vue模块-CSDN博客

    上一篇文章我把分类模块的前端部分给大家展示出来了,这篇文章主要是为了配合上一篇,其实这一篇文章应该先写到前边,然后在发前端的部分。文章的主要内容是把分类管理的后端接口写出来。

    二、☀SpringBoot代码修改

    不知道你是否还记得我们电子书模块后端接口书写的流程,【wiki知识库】02.wiki知识库SpringBoot后端的准备-CSDN博客,在这篇文章当中我是用逆向工程生成了Ebook的一些项目结构,现在我们需要Category模块。我们的第一步还是使用逆向工程。

    1.使用逆向工程生成Category表结构

    在我们util包下的 MybatisGenerator类中修改下方的代码,把我们的表换成category,然后运行代码。

    8f7683c5d7074e85831aaa5143c15837.png

     2. 新增CategoryQueryParam

    1. package com.my.hawiki.param;
    2. import lombok.Data;
    3. import lombok.EqualsAndHashCode;
    4. @EqualsAndHashCode(callSuper = true)
    5. @Data
    6. public class CategoryQueryParam extends PageParam {
    7. }

    3.新增CategorySaveParam

    1. package com.my.hawiki.param;
    2. import lombok.Data;
    3. import javax.validation.constraints.NotNull;
    4. @Data
    5. public class CategorySaveParam {
    6. private Long id;
    7. private Long parent;
    8. @NotNull(message = "【名称】不能为空")
    9. private String name;
    10. @NotNull(message = "【排序】不能为空")
    11. private Integer sort;
    12. }

    4.新增CategotyQueryVo

    1. package com.my.hawiki.vo;
    2. import lombok.Data;
    3. @Data
    4. public class CategoryQueryVo {
    5. private Long id;
    6. private Long parent;
    7. private String name;
    8. private Integer sort;
    9. }

    三、🤖新增分类管理的相关接口

    1. /category/all

    在CatagotyController中添加以下代码:

    1. @Resource
    2. CategoryService categoryService;
    3. /**
    4. * 查询所有的分类
    5. * @return
    6. */
    7. @RequestMapping("/all")
    8. public CommonResp all(){
    9. List list = categoryService.all();
    10. return new CommonResp(true,"查询成功",list);
    11. }

    为CategoryService接口添加all方法。然后CategoryServiceImpl实现该all方法,这个方法很简单,也用不到什么分页功能,因为前端没有去考虑分类功能的分页查询,所以直接查询的就是所有的分页。

    1. @Resource
    2. CategoryMapper categoryMapper;
    3. @Override
    4. public List all() {
    5. List categories = categoryMapper.selectList(null);
    6. List list = CopyUtil.copyList(categories, CategoryQueryVo.class);
    7. return list;
    8. }

    2./category/save

    CategoryController中添加下方代码:

    这里我做了一个sort值重复的判断,如果你是添加数据并且数据库中也已经有了这个sort值了,你就不能在添加了。

    1. /**
    2. * 添加分类
    3. * @param categorySaveParam 添加分类参数
    4. * @return
    5. */
    6. @PostMapping("/save")
    7. public CommonResp save(@Validated @RequestBody CategorySaveParam categorySaveParam){
    8. // 先看看这个sort有没有被占用
    9. Category category = categoryService.getOne(new LambdaQueryWrapper()
    10. .eq(Category::getSort,categorySaveParam.getSort()));
    11. if(category != null && categorySaveParam.getId()==null){
    12. return new CommonResp(false,"已经存在该顺序了",null);
    13. }
    14. boolean res = categoryService.saveOrUpdate(CopyUtil.copy(categorySaveParam,Category.class));
    15. String message = Boolean.TRUE.equals(res) ? "添加成功":"添加失败";
    16. return new CommonResp(res,message,null);
    17. }

    3./category/delete

    这里的分类删除操作其实考虑的东西还是很多的,你删除掉了这个分类,那么这个分类下的所有子分类也要删除,对应得所有电子书也都需要删除。

    这个地方还是有些难度的,不过只要考虑清楚了就可以,我带着大家考虑一下。

    • 我们删除的是一个二级分类

      倘若我们删除的是一个二级分类,这个情况稍微好一些,因为二级分类之间相互独立不影响,我们删除一个二级分类,我们只需要把属于该分类的所有电子书删掉就行。在删掉电子书的时候对应的电子书的文章我们也应该删掉,这里先不考虑文章的事情,我们只考虑分类与电子书。

    • 我们删除的是一个一级分类

      如果我们删除的是一个一级分类,那我们要做的第一件事就是找到该一级分类下的所有二级分类,然后对所有的二级分类进行删除操作,然后对所有属于该一级分类的电子书进行删除操作,这里我不是通过二级分类删除的电子书,因为一个电子书有两个字段保留其定位,一个是category1:一级分类编号,另一个是category2:二级分类编号。我们可以直接通过一级分类编号进行删除操作。

    CategotyController中添加如下代码:

    1. /**
    2. * 删除分类
    3. * @param id 分类id
    4. * @return
    5. */
    6. @DeleteMapping("/delete/{id}")
    7. public CommonResp delete(@PathVariable("id") Long id){
    8. boolean res = categoryService.deleteById(id);
    9. String message = Boolean.TRUE.equals(res) ? "删除成功":"删除失败";
    10. return new CommonResp<>(res,message,null);
    11. }

    CategotyService中添加deleteById()方法,我这里直接写CategotyServiceImpl中的方法实现。

    上来拿到Id后先去数据库中查查这个id下有多少子分类,如果大于0的话,就说明有子分类,那么我们要删除的分类就是一级分类了,我用了一个stream流操作,把所有子分类的id提取出来,然后把这个一级分类的id加进去,然后调用mapper的批量删除操作。把分类全部删除了之后,就去看看哪些电子书的一级分类编号和我们传来的一样,直接调用删除操作就行。

    如果id本身就是一个二级分类的话,我们直接把这个二级分类删除掉,同样的把该二级分类下的电子书也全部删掉。

    这里值得注意的就是这个 @Transactional注解,意味着我们开启事物,一旦这个方法中出错了,我们的事物要进行回滚操作。

    1. @Override
    2. @Transactional
    3. public boolean deleteById(Long id) {
    4. // 先找出来这个分类的子分类
    5. List categories = categoryMapper.selectList(new LambdaQueryWrapper()
    6. .eq(Category::getParent, id));
    7. // 证明是一级分类
    8. if(categories.size()>0){
    9. List collect = categories.stream()
    10. .map(Category::getId)
    11. .collect(Collectors.toList());
    12. collect.add(id);
    13. categoryMapper.deleteBatchIds(collect);
    14. ebookMapper.delete(new LambdaQueryWrapper()
    15. .eq(Ebook::getCategory1Id, id));
    16. }else{
    17. // 否则就是二级分类
    18. categoryMapper.deleteById(id);
    19. ebookMapper.delete(new LambdaQueryWrapper()
    20. .eq(Ebook::getCategory2Id, id));
    21. }
    22. return true;
    23. }

  • 相关阅读:
    幸福里基于 Flink & Paimon 的流式数仓实践
    【10套模拟】【5】
    Python 既是解释型语言,也是编译型语言
    汇编语言程序设计·RB(AT&T汇编)_笔记_第12章:使用Linux系统调用
    大语言模型之十八-商业思考
    Day712. 封闭类-Java8后最重要新特性
    【C++】C++基础知识(一)---基本概念
    【WRF-SOLAR】太阳辐射预报模式及改进技术在气象、农林、电力等相关领域中的实践应用
    [C语言趣编程]抓小偷问题
    信息学奥赛一本通-编程启蒙3001:【例2.1】Hello World
  • 原文地址:https://blog.csdn.net/qq_61024956/article/details/139470653