当前位置: 首页 > news >正文

【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;}

 

 

 

相关文章:

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

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、☀SpringBoot代码修改 1.使用逆向工程生成Category表结构 2. 新增CategoryQueryParam 3.新增CategorySaveParam 4.新增CategotyQueryVo 三、&#x1f916;新增分类管理的相关接口…...

资源目录与云SSO

1、开启资源目录 2、创建资源文件夹&#xff08;根据公司业务划分&#xff09; 3、资源文件夹内创建或邀请成员 4、创建管控策略&#xff08;类型访问控制权限授权方法&#xff0c;可以授权给指定给资源文件夹或资源文件夹内成员&#xff09; 5、可信服务-委派管理员账号数量 …...

ChatGPT AI专题资料合集【65GB】

介绍 ChatGPT & AI专题资料合集【65GB】 &#x1f381;【七七云享】资源仓库&#xff0c;海量资源&#xff0c;无偿分享√...

Linux 编译安装python

以deepin操作系统安装Python3.8.10为例。 下载 python3.8.10 官网下载 Linux要下载源码&#xff0c;进行编译。 下图tarball即tar包&#xff0c;是压缩包的意思。python官网给出两种压缩格式的tarball&#xff0c;下载哪个都可以。 方式一&#xff1a;直接点击链接下载 方式…...

2025 QS 世界大学排名公布,北大清华跻身全球前20

一年一度&#xff0c;2025 QS 世界大学排名公布&#xff01; QS&#xff08;Quacquarelli Symonds&#xff09;是唯一一个同时将就业能力与可持续发展纳入评价体系的排名。 继去年 2024 QS 排名因为“墨尔本超耶鲁&#xff0c;新南悉尼高清华”而荣登微博热搜之后&#xff0c…...

clickhouse(十五、存储优化实践)

文章目录 背景问题定位优化方式排序键设计写入顺序压缩算法 DoubleDeltaLowCardinality避免使用Nullable 总结 背景 clickhouse集群容量告警&#xff0c;项目中某些表占据大量的存储空间&#xff0c;借此机会对ck的存储优化进行实践学习&#xff0c;并通过多种方式测试验证优化…...

ubuntu下搭建Supervisor

sudo apt update #安装 sudo apt install supervisor#启动 supervisord 服务&#xff1a; sudo systemctl start supervisor#关闭 supervisord 服务 sudo systemctl stop supervisor#重启 supervisord 服务 sudo systemctl restart supervisor#设置 supervisord 开机自启 sudo …...

在HTML和CSS当中运用显示隐藏

1.显示与隐藏 盒子显示:display:block;盒子隐藏: display:none:隐藏该元素并且该元素所占的空间也不存在了。 visibility:hidden:隐藏该元素但是该元素所占的内存空间还存在&#xff0c;即“隐身效果”。 2.圆角边框 在CSS2中添加圆角&#xff0c;我们不得不使用背景图像&am…...

Java基础27,28(多线程,ThreadMethod ,线程安全问题,线程状态,线程池)

目录 一、多线程 1. 概述 2. 进程与线程 2.1 程序 2.2 进程 2.3 线程 2.4 进程与线程的区别 3. 线程基本概念 4.并发与并行 5. 线程的创建方式 方式一&#xff1a;继承Thread类 方式二&#xff1a;实现Runable接口 方式三&#xff1a;实现Callable接口 方式四&…...

C#WPF数字大屏项目实战04--设备运行状态

1、引入Livecharts包 项目中&#xff0c;设备运行状态是用饼状图展示的&#xff0c;因此需要使用livechart控件&#xff0c;该控件提供丰富多彩的图形控件显示效果 窗体使用控件 2、设置饼状图的显示图例 通过<lvc:PieChart.Series>设置环状区域 3、设置饼状图资源样…...

IntelliJ IDEA安装

IntelliJ IDEA 的安装、配置与使用-简化版 一、IntelliJ IDEA 介绍 1.JetBrains 公司介绍 IDEA(https://www.jetbrains.com/idea/)是 JetBrains 公司的产品&#xff0c;公司旗下还有其 它产品&#xff0c;比如&#xff1a; ➢ WebStorm&#xff1a;用于开发 JavaScript、HT…...

铸铁机械5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

铸铁机械5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。工业物联数字孪生平台以5G技术为基础&#xff0c;通过工业物联网连接铸铁机械生产过程中的各个环节&#xff0c;运用数字孪生技术构建虚拟工厂&#xff0c;实现生产过程的实时监测、模拟与优化&#…...

rocketmq No route info of this topic 问题排查

Broker配置项 autoCreateTopicEnable true 如果是单节点(master),注释掉这里的配置 #有三个值&#xff1a;SYNC_MASTER&#xff0c;ASYNC_MASTER&#xff0c;SLAVE&#xff1b;同步和异步表示Master和Slave之间同步数据的机制&#xff1b; #brokerRole SYNC_MASTER Pytho…...

STEEL ——首个利用 LLM 检测假新闻的框架算法解析

1.概述 近年来&#xff0c;假新闻的泛滥确实对政治、经济和整个社会产生了深远的负面影响。为了解决这一问题&#xff0c;人们开发了各种假新闻检测方法&#xff0c;这些方法试图通过分析新闻内容、来源和传播方式来识别虚假信息。 然而&#xff0c;正如你所提到的&#xff0…...

【AREngine BUG 解决方法】无法获取有效的相机图像尺寸

近期拿了一台 华为mate20 Pro的手机&#xff0c;在运行AR示例的过程中出现了黑屏。 问题排查 SDK版本&#xff1a;com.huawei.hms:arenginesdk:3.7.0.3 定位 经排查&#xff0c;发现(ARCamera对象的相机内参) getImageDimensions()返回的图像尺寸的width和height都为0。 这…...

植物大战僵尸杂交版2.0.88最新版+防闪退工具V2+修改工具+高清工具

植物大战僵尸杂交版&#xff0c;不仅继承原作的经典玩法&#xff0c;而且引入了全新的植物融合玩法&#xff0c;将各式各样的植物进行巧妙的杂交&#xff0c;孕育出前所未有、功能各异的全新植物。 创新的杂交合成系统 游戏引入了创新的杂交合成系统&#xff0c;让玩家可以将不…...

面试题:说说你对 JS 中 this 指向的了解

面试题&#xff1a;说说你对 JS 中 this 指向的了解 JS 的代码执行环境分为严格模式和非严格模式&#xff0c;可以通过 use strict 打开严格模式&#xff0c;此时 JS 在语法检查上会更加严格。要讨论 JS 中的 this 指向问题&#xff0c;也要分为严格模式和非严格模式进行讨论。…...

分享一个实用的MySQL一键巡检脚本

今日分享一个实用的MySQL一键巡检脚本&#xff0c;脚本内容还不是很完善&#xff0c;后续会继续进行优化。大家可以先在测试环境执行&#xff0c;确认执行没问题后可以在生产环境进行操作&#xff0c;问题的可以私信我。 MySQL一键巡检脚本的作用主要是帮助数据库管理员快速且…...

【动手学深度学习】卷积神经网络CNN的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 卷积神经网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 特征提取和模式识别&#xff1a;CNN 在计算机视觉领域被广泛用于提取图像…...

2024年数字化经济与智慧金融国际会议(ICDESF 2024)

2024 International Conference on Digital Economy and Smart Finance 【1】大会信息 大会时间&#xff1a;2024-07-22 大会地点&#xff1a;中国成都 截稿时间&#xff1a;2024-07-10(以官网为准&#xff09; 审稿通知&#xff1a;投稿后2-3日内通知 会议官网&#xff1a;h…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...