【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

package com.my.hawiki.param;

import lombok.Data;
import lombok.EqualsAndHashCode;

@EqualsAndHashCode(callSuper = true)
@Data
public class CategoryQueryParam extends PageParam {
}

3.新增CategorySaveParam

package com.my.hawiki.param;

import lombok.Data;
import javax.validation.constraints.NotNull;

@Data
public class CategorySaveParam {
    private Long id;

    private Long parent;

    @NotNull(message = "【名称】不能为空")
    private String name;

    @NotNull(message = "【排序】不能为空")
    private Integer sort;
}

4.新增CategotyQueryVo

package com.my.hawiki.vo;

import lombok.Data;

@Data
public class CategoryQueryVo {
    private Long id;

    private Long parent;

    private String name;

    private Integer sort;
}

 

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

1. /category/all

在CatagotyController中添加以下代码:

 @Resource
    CategoryService categoryService;

    /**
     * 查询所有的分类
     * @return
     */
    @RequestMapping("/all")
    public CommonResp all(){
        List<CategoryQueryVo> list = categoryService.all();
        return new CommonResp(true,"查询成功",list);
    }

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

    @Resource
    CategoryMapper categoryMapper;
    @Override
    public List<CategoryQueryVo> all() {
        List<Category> categories = categoryMapper.selectList(null);
        List<CategoryQueryVo> list = CopyUtil.copyList(categories, CategoryQueryVo.class);
        return list;
    }

2./category/save

CategoryController中添加下方代码:

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

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

3./category/delete

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

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

 

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

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

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

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

CategotyController中添加如下代码:

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

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

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

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

 

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

 @Override
    @Transactional
    public boolean deleteById(Long id) {
        // 先找出来这个分类的子分类
        List<Category> categories = categoryMapper.selectList(new LambdaQueryWrapper<Category>()
                .eq(Category::getParent, id));

        // 证明是一级分类
        if(categories.size()>0){
            List<Long> collect = categories.stream()
                    .map(Category::getId)
                    .collect(Collectors.toList());
            collect.add(id);
            categoryMapper.deleteBatchIds(collect);
            ebookMapper.delete(new LambdaQueryWrapper<Ebook>()
                    .eq(Ebook::getCategory1Id, id));
        }else{
            // 否则就是二级分类
            categoryMapper.deleteById(id);
            ebookMapper.delete(new LambdaQueryWrapper<Ebook>()
                    .eq(Ebook::getCategory2Id, id));
        }
        return true;
    }

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/681283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL—多表查询—多表关系介绍

一、引言 提到查询&#xff0c;我们想到之前学习的单表查询&#xff08;DQL语句&#xff09;。而这一章节部分的博客我们将要去学习和了解多表查询。 对于多表查询&#xff0c;主要从以下7个方面进行学习。 &#xff08;1&#xff09;第一部分&#xff1a;介绍 1、多表关系 2、…

记录layui-table中操作列的宽度随着权限变化而变化

最近做一个项目&#xff0c;某个页面因为角色不同&#xff0c;所以显示的的按钮有所不同。 管理员权限 普通人员权限 layui引入的table宽度是写死的&#xff0c;不能随着自动变化&#xff0c;查了一些资料&#xff0c;让写入css的方法 .layui-table th, .layui-table td { whi…

智能楼宇安防3D数据可视化平台满足日益增长的安防需求

在当今社会&#xff0c;安全是每个人和企业最为关心的问题。为满足日益增长的安防需求&#xff0c;3D可视化公司深圳华锐视点隆重推出安防平台3D可视化管理系统&#xff0c;以先进的三维技术为您的安全保驾护航。 安防平台3D可视化管理系统通过创新的三维可视化技术&#xff0c…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件&#xff1a;Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域&#xff0c;SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中&#xff0c;内链建设是构建良好网站结构和提升…

Glide支持通过url加载本地图标

序言 glide可以在load的时候传入一个资源id来加载本地图标&#xff0c;但是在开发过程中。还得区分数据类型来分别处理。这样的使用成本比较大。希望通过自定义ModelLoader实现通过自定义的url来加载Drawab。降低使用成本 实现 一共四个类 类名作用GlideIcon通过自定义url的…

轻松搭建AI应用的三个大模型技术路线

时下聊起AI&#xff0c;想必最热的就是使用AI的应用&#xff08;chatGPT&#xff0c;文心一言等&#xff09;来提升自己工作的效率&#xff0c;比如破局俱乐部&#xff0c;洋哥带领星球2万多人开启大航海&#xff0c;教人使用这一波新起的应用进行赚钱与赋能。 在我的视角来看…

PS系统教程11

HUD拾色器 作用&#xff1a;它可以帮助使用者更加高效地选择和使用颜色&#xff0c;从而提高工作效率和设计质量。 先确定色相值改变饱和度改变亮度使用HUD拾色器选中画笔工具画笔模式-正常shiftAlt右键 色相轮 上下移动从黑到白亮度变化左右移动从浅到深饱和度的变化选中颜…

探索 Adobe Illustrator 2023 (AI 2023) for Mac/Win——创意设计的强大工具

Adobe Illustrator 2023 (AI 2023) for Mac/Win 是一款在设计领域备受推崇的专业矢量图形编辑软件软件&#xff0c;为设计师们提供了无尽的创意可能性。 它具有强大而精确的绘图功能&#xff0c;让用户能够轻松绘制出各种复杂的图形、线条和形状。无论是简洁的图标设计还是精美…

不服就干!FEAST微生物溯源:一场微生物“寻根究底”的浪漫之旅

微生物一直处于不断变化的状态&#xff0c;估计不同源微生物群落&#xff08;source,“源”&#xff09;对特定微生物群落&#xff08;sink,“汇”&#xff09;的贡献或混合比例被称为微生物溯源&#xff08;MST&#xff09;问题。了解样本中这些生物体来自何处以及如何形成群落…

机器学习之数学基础(六)~时间复杂度和空间复杂度

目录 算法背景 background 1. 时间复杂度 Time Complexity 1.1 时间复杂度分类 1.1.1 O(1) 常数阶 1.1.2 O(n) 线性阶 1.1.3 O(n^2) 平方阶 1.1.4 O(logn) 对数阶 1.1.5 O(nlogn) 线性对数阶 1.1.6 O(2^n) 指数阶 1.1.7 O(n!) 阶乘阶 1.1.8 时间复杂度分类 1.2 时…

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署&#xff0c;之前也是部署过几次nuxt项目了&#xff0c;所以&#xff0c;并没有要记录的想法。但是过程出现了很多问题&#xff0c;最后考虑还是写下来吧。留个记录&#xff08;完整的配置部署过程&#xff09; 这里我将要说明两种部署方式以供选择&…

electron-Vue: Module parse failed: Unexpected character ‘ ‘

​ electron-Vue项目中&#xff0c;我自己写了一个node的C扩展&#xff08;xx.node&#xff09;&#xff0c;然后在.vue文件里import它&#xff0c;然后运行npm run electron:serve&#xff0c;报错如下: ​​ electron-Vue打包默认使用webpack&#xff0c;默认情况下webpack没…

Vue2.0项目搭建流程(一步一步教你如何初始化一个前端项目)

文章目录 1.环境准备2.项目初始化3.删除不必要的初始化文件 1.环境准备 1.winr在cmd终端界面输入node -v&#xff0c;检测node环境是否安装成功 2.cmd终端界面输入vue -V&#xff0c;检测前端脚手架vue/cli是否安装成功 没有显示则终端输入以下指令 //以下内容三选一 cnpm …

vue的elementUI的el-tree的选择

有一棵树型的数据,需要实现:在外部加一个 全选和不全选的按钮,去全部勾选树结构里面每一项的选框。 当点击勾选全选的时候,树的每一项都勾选; 当取消全选的时候,树的每一项都不勾选; 当选树的其中一项时,全选按钮是半选状态; 实现效果如下: <template><…

骨传导耳机哪个牌子好?精选5大品质上乘的尖货骨传导耳机推荐!

作为一名数码博主&#xff0c;我已有十余年的行业经历&#xff0c;其中&#xff0c;骨传导耳机作为近年来新兴的技术产品&#xff0c;凭借特殊的传声方式和佩戴方式吸引到了不少消费者&#xff0c;我也是亲自体验并评测了数十款。基于这些经验&#xff0c;我深感有必要提醒大家…

玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…

标准发布 | 反渗透和纳滤水处理膜修复再利用技术指南

一、编制单位 本文件由浙江大学、中华环保联合会水环境治理专业委员会提出。 本文件由中华环保联合会归口。 本文件主编单位&#xff1a;浙江大学、河南一膜环保技术有限公司、安徽精高水处理有限公司、国能龙源环保有限公司、湖南沁森高科新材料有限公司。 本文件参编单位&…

C++ | Leetcode C++题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> row(rowIndex 1);row[0] 1;for (int i 1; i < rowIndex; i) {row[i] 1LL * row[i - 1] * (rowIndex - i 1) / i;}return row;} };

简搭云可视化大屏设计器:前端技术探索与实践

一、引言 随着数字化时代的到来&#xff0c;数据可视化已经成为企业决策和业务分析不可或缺的一部分。为了满足用户对于数据展示的直观性、便捷性和高效性需求&#xff0c;简搭云可视化大屏设计器应运而生。本文旨在探讨简搭云可视化大屏设计器的前端技术实现&#xff0c;并通…

店匠科技亮相VivaTech,新零售解决方案引关注

在中法建交60周年之际,两国关系持续发展并共同推动双方在人工智能和全球治理领域达成重要合作。同时,浙江-法国高新产业创新合作对接会在巴黎顺利举行,进一步促进了中法两国在高新技术领域的交流与合作。 紧跟此次访问的步伐,众多中国科技创新企业齐聚巴黎,于5月22日至25日在法…