【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分
目录
一、🔥今日目标
二、🎈SpringBoot部分类的添加
1.调用MybatisGenerator
2.添加DocSaveParam
3.添加DocQueryVo
三、🚆后端新增接口
3.1添加DocController
3.1.1 /all/{ebokId}
3.1.2 /doc/save
3.1.3 /doc/delete/{idStr}
3.1.4 /doc/find-content/{id}
2.添加DocService
3.添加DocServiceImpl
一、🔥今日目标
【wiki知识库】06.文档管理页面的添加--前端Vue部分-CSDN博客
这篇文章是06前端部分实现的基础,话不多说了,直接带大家把接口实现完成。
二、🎈SpringBoot部分类的添加
1.调用MybatisGenerator
把图中的代码部分的表的名称改为doc,然后右键运行。
因为文档管理的内容中还要添加文档的具体内容,我们还要生成一下content表。
2.添加DocSaveParam
package com.my.hawiki.param;import lombok.Data;import javax.validation.constraints.NotNull;@Data public class DocSaveParam {private Long id;@NotNull(message = "【电子书】不能为空")private Long ebookId;@NotNull(message = "【父文档】不能为空")private Long parent;@NotNull(message = "【名称】不能为空")private String name;@NotNull(message = "【顺序】不能为空")private Integer sort;private Integer viewCount;private Integer voteCount;@NotNull(message = "【内容】不能为空")private String content;}
3.添加DocQueryVo
package com.my.hawiki.vo;import lombok.Data;@Data public class DocQueryVo {private Long id;private Long ebookId;private Long parent;private String name;private Integer sort;private Integer viewCount;private Integer voteCount;}
上边两个部分不用解释了。
三、🚆后端新增接口
3.1添加DocController
一共有四个接口
3.1.1 /all/{ebokId}
根据传来的ebookId来查询这个电子书下的所有文档。
/*** 查询电子书下的所有doc* @param ebookId 电子书id* @return*/@GetMapping("/all/{ebookId}")public CommonResp all(@PathVariable Long ebookId){List<DocQueryVo> list = docService.all(ebookId);return new CommonResp(true,"查找成功",list);}
3.1.2 /doc/save
保存传来的文档。
/*** 文档的保存* @param req 文档参数* @return*/@PostMapping("/save")public CommonResp save(@Valid @RequestBody DocSaveParam req) {docService.saveDoc(req);return new CommonResp(true,"添加成功",null);}
3.1.3 /doc/delete/{idStr}
删除传来的树形文档。
/*** 文档删除 树形结构删除* @param idsStr 删除的文档的ids* @return*/@DeleteMapping("/delete/{idsStr}")public CommonResp delete(@PathVariable String idsStr) {boolean res = docService.removeByIds(Arrays.asList(idsStr.split(",")));String message = Boolean.TRUE.equals(res) ? "删除成功" : "删除失败";return new CommonResp(res,message,null);}
3.1.4 /doc/find-content/{id}
根据conent的id查询content。
/*** 查找某个doc的content内容* @param id content的id* @return*/@GetMapping("/find-content/{id}")public CommonResp findContent(@PathVariable Long id) {Content content = contentService.getById(id);String message = content.getContent();return new CommonResp(true,"查找成功",message);}
大家可以自己把代码添加到DocController中。
package com.my.hawiki.controller;/*** <p>* 文档 前端控制器* </p>** @author CSDN__哈* @since 2024-05-26*/ @RestController @RequestMapping("/doc") public class DocController {@ResourceDocService docService;@ResourceContentService contentService;}
2.添加DocService
public interface DocService extends IService<Doc> {List<DocQueryVo> all(Long ebookId);void saveDoc(DocSaveParam req); }
3.添加DocServiceImpl
我并没有做文档的查询功能,没有使用分页查询。下边的保存或更新操作倒是坑到我了,因为你添加一个文档的时候,content也是同样被添加的,所以更新操作我直接进行的content更新,但是我拿到的数据库中有一部分数据是手动添加的,content和docu不对应,所以这里进行了更新判断,如果更新不成功说明就是上边的情况,这时候把content直接插入进去。
package com.my.hawiki.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.my.hawiki.domain.Content; import com.my.hawiki.domain.Doc; import com.my.hawiki.mapper.ContentMapper; import com.my.hawiki.mapper.DocMapper; import com.my.hawiki.param.DocSaveParam; import com.my.hawiki.service.DocService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.my.hawiki.utils.CopyUtil; import com.my.hawiki.vo.DocQueryVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource; import java.util.List;/*** <p>* 文档 服务实现类* </p>** @author CSDN__哈* @since 2024-05-26*/ @Service public class DocServiceImpl extends ServiceImpl<DocMapper, Doc> implements DocService {@ResourceDocMapper docMapper;@ResourceContentMapper contentMapper;@Overridepublic List<DocQueryVo> all(Long ebookId) {LambdaQueryWrapper<Doc> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.eq(Doc::getEbookId,ebookId).orderByAsc(Doc::getSort);List<Doc> docs = docMapper.selectList(lambdaQueryWrapper);List<DocQueryVo> docQueryVos = CopyUtil.copyList(docs,DocQueryVo.class);return docQueryVos;}@Override@Transactionalpublic void saveDoc(DocSaveParam req) {Doc doc = CopyUtil.copy(req,Doc.class);Content content = CopyUtil.copy(req,Content.class);// 证明是添加操作if(doc.getId()==null){docMapper.insert(doc);content.setId(doc.getId());contentMapper.insert(content);}else{docMapper.updateById(doc);int res = contentMapper.updateById(content);System.out.println(res);System.out.println(content);if(res == 0){contentMapper.insert(content);}}} }
这回修改的后端部分代码不是很多也不是很难,所以我不打算在讲文档模块的接口了
相关文章:

【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分
目录 一、🔥今日目标 二、🎈SpringBoot部分类的添加 1.调用MybatisGenerator 2.添加DocSaveParam 3.添加DocQueryVo 三、🚆后端新增接口 3.1添加DocController 3.1.1 /all/{ebokId} 3.1.2 /doc/save 3.1.3 /doc/delete/{idStr} …...
c,c++,go语言字符串的演进
#include <stdio.h> #include <string.h> int main() {char str[] {a,b,c,\0,d,d,d};printf("string:[%s], len:%d \n", str, strlen(str) );return 0; } string:[abc], len:3 c语言只有数组的概念,数组本身没有长度的概念,需…...

vue-cli 快速入门
vue-cli (目前向Vite发展) 介绍:Vue-cli 是Vue官方提供一个脚手架,用于快速生成一个Vue的项目模板。 Vue-cli提供了如下功能: 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境:NodeJ…...
机器人--矩阵运算
两个矩阵相乘的含义 P点在坐标系B中的坐标系PB,需要乘以B到A到变换矩阵TAB。 M点在B坐标系中的位姿MB,怎么计算M在A中的坐标系? 两个矩阵相乘 一个矩阵*另一个矩阵的逆矩阵...
期末复习【汇总】
期末复习【汇总】 前言版权推荐期末复习【汇总】最后 前言 2024-5-12 20:52:17 截止到今天,所有期末复习的汇总 以下内容源自《【创作模板】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是ht…...
【IM即时通讯】MQTT协议的详解(3)- CONNACK Packet
【IM即时通讯】MQTT协议的详解(3)- CONNACK Packet 文章目录 【IM即时通讯】MQTT协议的详解(3)- CONNACK Packet前言说明一、固定同步详解、可变头部详解总结 前言 关于所有的类型的数据示例已经在上面一篇博客说完: …...

Linux - 深入理解/proc虚拟文件系统:从基础到高级
文章目录 Linux /proc虚拟文件系统/proc/self使用 /proc/self 的优势/proc/self 的使用案例案例1:获取当前进程的状态信息案例2:获取当前进程的命令行参数案例3:获取当前进程的内存映射案例4:获取当前进程的文件描述符 /proc中进程…...

Django DeleteView视图
Django 的 DeleteView 是一个基于类的视图,用于处理对象的删除操作。 1,添加视图函数 Test/app3/views.py from django.shortcuts import render# Create your views here. from .models import Bookfrom django.views.generic import ListView class B…...
代码杂谈 之 pyspark如何做相似度计算
在 PySpark 中,计算 DataFrame 两列向量的差可以通过使用 UDF(用户自定义函数)和 Vector 类型完成。这里有一个示例,展示了如何使用 PySpark 的 pyspark.ml.linalg.Vectorspyspark.sql.functions.udf 来实现这一功能:…...

混剪素材哪里找?分享8个热门素材网站
今天我们来深入探讨如何获取高质量的混剪素材,为您的短视频和自媒体制作提供最佳资源。在这篇指南中,我将介绍几个热门的素材网站,让您轻松掌握素材获取的技巧,并根据百度SEO排名规则,优化关键词的使用,确保…...

临床应用的深度学习在视网膜疾病的诊断和转诊中的应用| 文献速递-视觉通用模型与疾病诊断
Title 题目 Clinically applicable deep learning for diagnosis and referral in retinal disease 临床应用的深度学习在视网膜疾病的诊断和转诊中的应用 01 文献速递介绍 诊断成像的数量和复杂性正在以比人类专家可用性更快的速度增加。人工智能在分类一些常见疾病的二…...
中继器简介
一、网络信号衰减问题 现在的网路信号有两种,一种是电信号,另一种的光信号,电信号在网线、电话线或者电视闭路线中传输,光信号在光缆中传输,但是不管是以那种信号进行传输,随着传输距离的增加,电…...
websocket 前端项目js示例
websocket前端 和服务端websocket通信示例, 前端直接使用h5的内置对象 WebSocket 来创建和管理 WebSocket 连接,以及可以通过该连接发送和接收数据。 这个对象都是是事件方式来处理和与后端交互数据, 他们分别是 onopen打开, onclose关闭, o…...

webapi跨越问题
由于浏览器存在同源策略,为了防止 钓鱼问题,浏览器直接请求才不会有跨越的问题 浏览器要求JavaScript或Cookie只能访问同域下的内容 浏览器也是一个应用程序,有很多限制,不能访问和使用电脑信息(获取cpu、硬盘等&#…...
你知道 npmrc 文档吗? ---- npmrc 关键作用介绍
你知道 npmrc 文档吗? ---- npmrc 关键作用介绍 你知道 npmrc 文档吗? ---- npmrc 关键作用介绍如何修改配置呢?日常开放常常需要置哪些信息呢?registry 信息配置限定包认证信息代理配置缓存配置安装行为 参考 你知道 npmrc 文档吗…...
发现 Laravel 中的 api 响应时间明显过长
背景 近期在排查网站后台页面功能时 发现,部分查询页面,明显响应时间过长(12秒),不合理 优先排查 接口运行时长 经过打印,发现代码是正常的,且时间仅需不到一秒 进一步怀疑是 VUE框架的渲染加载…...

如何在MySQL中创建不同的索引和用途?
目录 1 基本的 CREATE INDEX 语法 2 创建单列索引 3 创建多列索引 4 创建唯一索引 5 创建全文索引 6 在表创建时添加索引 7 使用 ALTER TABLE 添加索引 8 删除索引 9 索引管理的最佳实践 10 示例 在 MySQL 中,索引(index)是一种用于…...
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…...

实用软件分享---简单菜谱 0.3版本 几千种美食(安卓)
专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…...
网络学习(14)|RESTful API设计:构建优雅的Web服务
文章目录 设计原则最佳实践命名与URI设计状态码与响应格式HTTP状态码详解响应格式选择 在当今的互联网世界中,RESTful API已成为构建可扩展、可维护和高性能Web服务的标准。本文将深入探讨RESTful API的设计原则、资源命名与URI设计的最佳实践,以及请求与…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...