【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中添加以下代码:

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

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

    @ResourceCategoryMapper categoryMapper;@Overridepublic 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@Transactionalpublic 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;}

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习分享-面向分布式服务架构的流量管理工具Apache Sentinel

前言 最近学习过程中有接触到Apache Sentinel这个工具&#xff0c;所以就分享一下相关的资料和知识。 Apache Sentinel是阿里巴巴开源的一款面向分布式服务架构的流量管理工具&#xff0c;主要用于流量控制、熔断降级和系统负载保护。Sentinel提供了一整套完善的流量管理方案&…

人脸识别系统代码--相机抓取

1.导入库 import cv2 import os import tkinter as tk from tkinter import filedialog import subprocess from PIL import Image, ImageTk 2.设置窗口 win tk.Tk() win.title(相机抓取) win.geometry(750x600) 3.设置背景 image Image.open("11.gif") image…

v1.2.70-FastJson的AutoType机制研究

v1.2.70-FastJson的AutoType机制研究 最近在对接Alexa亚马逊语音技能&#xff0c;Smart Home Skill Apis时&#xff0c;有一个配置的JSON字符串是这样的&#xff1a; { "capabilityResources": {"friendlyNames": [{"type": "asset",…

python图像识别库-pytesseract

内容目录 一、安装1.安装tesseract OCR1) MAC中安装2) Windows中安装3) 中文报下载 二、pytesseract的简单使用 pytesseract是python的一个用于图像提取的库, 它实际上是对Tesseract OCR引擎的封装。pytesseract使得在Python项目中调用Tesseract变得更加简便&#xff0c;主要用…

17K star,一款开源免费的手机电脑无缝同屏软件

导读&#xff1a;白茶清欢无别事&#xff0c;我在等风也等你。 作为程序员&#xff0c;在我们的工作中经常需要把手机投票到电脑进行调试工作&#xff0c;选择一款功能强大的投屏软件是一件很必要的事情。今天给大家介绍一款开源且免费的投屏软件&#xff0c;极限投屏&#xff…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍

文章目录 前言一、快速排序非递归二、归并排序五、归并排序非递归总结 前言 C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍 一、快速排序非递归 快速排序非递归的定义 快速排序非递归&#xff0c;需要使用栈来实现。将左右下标分别push到栈中。在栈为…

处理机调度

目录 处理机调度概述 1. 作业调度&#xff08;Job Scheduling&#xff09; 2. 中级调度&#xff08;Medium-term Scheduling&#xff09; 3. 进程调度&#xff08;Process Scheduling&#xff09; 调度算法 1. 先来先服务&#xff08;FCFS&#xff09; 2. 最短作业优先&a…

基于Tricore的Tasking链接文件解读

目录 1.链接文件有什么用&#xff1f; 2.文件结构和语法解析 2.1 文件结构 2.2 语法解析 3.小结 玩惯了ld文件&#xff0c;突然让搞lsl&#xff0c;被其中花里胡哨的语法搞晕了&#xff0c;例如&#xff1a; memory cpu0_dlmu{mau 8;size 64k;type ram;map cached …

qt 加载字体 c++

目录 qt 加载字体 c label设置大小和字体&#xff1a; pro配置&#xff1a; resource.qrc qt 加载字体 c #include <QApplication> #include <QLabel> #include <QFontDatabase> #include <QVBoxLayout> #include <QWidget>int main(int ar…

腾讯中视频计划项目玩法,号称执行就有收入

腾讯中视频掘金计划是一个创新的短视频创作与分享平台&#xff0c;类似于西瓜视频&#xff0c;允许用户发布原创视频内容&#xff0c;并将其同步至腾讯旗下的多个平台&#xff0c;用户基数大&#xff0c;相信视频播放量也会比较大。 操作流程&#xff1a; 1. 注册并登录腾讯中…

深入对比:Transformer与RNN的详细解析

在深度学习领域&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;循环神经网络&#xff08;RNN&#xff09;和Transformer模型都扮演着举足轻重的角色。然而&#xff0c;随着技术的不断发展&#xff0c;Transformer模型逐渐崭露头角&#xff0c;成为…

OrangePi 安装 CANN 套件及体验 AI 应用

CANN 环境安装&#xff08;桌面端跳过&#xff09; CANN 环境存在于下载页面的官方工具中&#xff0c;点击下载即可进入下载页面。 CANN 安装包就在倒数第二项&#xff0c;下载后传到开发板上。 给 CANN 安装包赋予运行权限并运行即可。 chmod x Ascend-cann-toolkit_7.0.0_l…

N叉树的层序遍历-力扣

本题同样是二叉树的层序遍历的扩展&#xff0c;只不过二叉树每个节点的子节点只有左右节点&#xff0c;而N叉树的子节点是一个数组&#xff0c;层序遍历到一个节点时&#xff0c;需要将这个节点的子节点数组的每个节点都入队。 代码如下&#xff1a; /* // Definition for a N…

maxwell同步mysql到kafka(一个服务器启动多个)

创建mysql同步用户 CREATE USER maxwell% IDENTIFIED BY 123456; GRANT ALL ON maxwell.* TO maxwell%; GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE on *.* to maxwell%; 开启mysql binlog a.修改 /etc/my.cnf 配置 log-binmysql-bin # 开启binlog binlog-forma…

2024前端面试准备2-JS基础知识回顾

变量类型和计算 1.值类型和引用类型的区别 常见值类型:undefined(定义undefined只能用let,不能用const)、字符串、bool、number、 Symbol; 常见引用类型: 对象, 数组、null(特殊引用类型,指针指向为空地址) 、function(特殊引用类型); 值类型的值直接存储在栈中;引用类型值存储…

如何避免Python中默认参数带来的陷阱

Python编程中&#xff0c;我们有时会给函数或方法提供默认参数。然而&#xff0c;这种做法在某些情况下可能会导致意想不到的行为&#xff0c;尤其是当默认参数是可变对象&#xff08;例如列表、字典或类实例对象&#xff09;时。本文将通过几个具体的例子来解释这个问题&#…

MQTT协议使用总结

MQTT是基于TCP/IP协议栈构建的异步通信消息协议&#xff0c;是一种轻量级的发布/订阅信息传输协议MQTT在时间和空间上&#xff0c;将消息发送者与接受者分离&#xff0c;可以在不可靠的网络环境中进行扩展。适用于设备硬件存储空间有限或网络带宽有限的场景。 物联网平台支持设…

2.1.4 采用配置类与注解方式使用MyBatis

实战概述&#xff1a;采用配置类与注解方式使用MyBatis 创建MyBatis配置类 在net.huawei.mybatis.config包中创建MyBatisConfig类&#xff0c;用于配置MyBatis核心组件&#xff0c;包括数据源、事务工厂和环境设置。 配置数据源和事务 使用PooledDataSource配置MySQL数据库连接…

苍穹外卖中的Druid问题

一、jar包启动解决报错 discard long time none recevied connection 升级druid版本到1.2.9 更新maven包