【wiki知识库】06.文档管理接口的实现--SpringBoot后端部分

news2024/11/16 15:57:58

目录

一、🔥今日目标

二、🎈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 {

    @Resource
    DocService docService;

    @Resource
    ContentService 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 {
    @Resource
    DocMapper docMapper;
    @Resource
    ContentMapper contentMapper;

    @Override
    public 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
    @Transactional
    public 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);
            }
        }

    }
}

这回修改的后端部分代码不是很多也不是很难,所以我不打算在讲文档模块的接口了

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

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

相关文章

Pixi.js学习 (五)动画效果与变量逻辑控制

目录 前言 一、动画效果 1.1 帧频 1.2 帧频函数 二、变量逻辑控制 2.1 定义变量的语法 2.2 使用变量控制逻辑 2.3 使用变量控制追加效果 三、实战 例题一&#xff1a;完成天天酷跑 例题一代码&#xff1a; 总结 前言 为了提高作者的代码编辑水品&#xff0c;作者在使用博客的时…

day35|1005.K次取反后最大化的数组和 134. 加油站135. 分发糖果

文章目录 python语法记录 sort格式 1005.K次取反后最大化的数组和思路方法一方法二 按照绝对值排序 教程&#x1f388;✨ 背住 按照绝对值进行降序排序的语法是&#xff1a; 134. 加油站思路方法一 教程解法方法二 暴力求解 135. 分发糖果思路方法一 总结 python语法记录 sort …

【AI大模型】Transformers大模型库(七):单机多卡推理之device_map

目录​​​​​​​ 一、引言 二、单机多卡推理之device_map 2.1 概述 2.2 自动配置&#xff0c;如device_map"auto" 2.3 手动配置&#xff0c;如device_map"cuda:1" 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#x…

MapTR代码复现-nucenes数据集

前言 本节将对环视车道线MapTR算法进行复现&#xff0c;使用nuscenes-mini数据集&#xff01; 一、环境配置 1、基础环境&#xff1a; ubuntu20.04&#xff0c;pytorch1.10.0&#xff0c;python3.8&#xff0c;cuda11.3 2、源码下载 下载地址&#xff1a; git clone http…

基础IO(下)

基础IO 1. 磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑抽象结构 2. 理解文件系统2.1 前言2.2 文件系统2.3 文件的新建和删除2.4 文件的查找2.5 理解软硬链接 3. 动态库和静态库3.1 生成静态库3.2 生成动态库3.3 动态库加载 实际上&#xff0c;大部分文件都不是被打开的&#xff08;当…

pikachu靶场通关全流程

目录 暴力破解&#xff1a; 1.基于表单的暴力破解&#xff1a; 2.验证码绕过(on server)&#xff1a; 3.验证码绕过(on client)&#xff1a; token防爆破&#xff1a; XSS&#xff1a; 1.反射型xss(get)&#xff1a; 2.反射性xss(post)&#xff1a; 3.存储型xss&#…

一道初中一年级几何题解析

来看一个初中一年级的几何题目&#xff1a; 直接看第三问。 拿到题后直接解的话就是在 BC 上截取 BP 等于 CE&#xff0c;就直接得出 PBD 和 ECD 全等&#xff0c;加上角 EDF 等于 45 度&#xff0c;就能得到角 EDF 等于角 PDF&#xff0c;于是 PDF 与 EDF 全等&#xff0c;…

自定义组件——ABManager(AB包管理器)

需求描述 在Unity3D引擎中&#xff0c;AB包作为常用的游戏资源存储格式之一。而对于资源管理我们就不得不谈到集中管理的优势了&#xff0c;通过统一的接口加载和卸载AB包及其中的资源将进一步提升我们的编程效率。本文将围绕这个需求进行尝试。 功能描述 1. AB包的加载包括同…

代码随想录算法训练营第五十五 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 https://programmercarl.com/0583.%E4%B8%A4%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C.html class Solution { public:int minDistance(string word1, string word2) {vector<vector<int>> d…

遇到的状态308问题

前端用的vue.config.js做的代理,请求后端的地址https://n6118lr7-10010.usw3.devtunnels.ms 在请求的时候会308 是因为本地是http而请求地址是https 前端代理允许https接口代理即可

电脑缺失d3dx9_43.dll是怎么回事,总结5种实测有效的解决方法

电脑在使用过程中偶尔会遇到一些问题&#xff0c;其中之一就是缺失d3dx9_43.dll文件。那么&#xff0c;电脑缺失d3dx9_43.dll​是怎么回事呢&#xff1f;本文将从多个方面进行详细描述&#xff0c;帮助大家更好地了解这个问题。 一&#xff0c;d3dx9_43.dll文件的概述 d3dx9_4…

Python中的钩子函数(hooks)介绍使用

什么是hook&#xff1f; 钩子函数&#xff0c;顾名思义&#xff0c;就是把我们自己实现的自定义函数在某一时刻挂接到目标挂载点上去执行。 1. hook函数&#xff0c;就是我们自己实现的函数&#xff0c;函数类型与挂载点匹配&#xff08;返回值&#xff0c;参数列表&#xff0…

virtual box安装invalid installation directory

问题原因 看官方文档Chapter 2. Installation Details 第2.1.2所示&#xff0c;安装目录需要满足两个条件&#xff1a; 一是&#xff1a;需要安装目录的所有父目录都要满足以下访问控制条件 Users S-1-5-32-545:(OI)(CI)(RX) Users S-1-5-32-545…

添加L1/L2损失函数,以及AttributeError: ‘NoneType‘ object has no attribute ‘data‘

添加L1/L2损失函数&#xff0c;以及解决报错 1.添加L1 loss2.添加L2 loss3.代码报错&#xff1a;AttributeError: NoneType object has no attribute data 1.添加L1 loss # 方式1&#xff1a;添加到损失函数中 def l1_regularization(model, l1_alpha):l1_loss []for module …

健康节能台灯的设计电子实践

1.1 功能描述 根据主要功能要求&#xff0c;该设计利用 51 单片机实现了电子时钟、温度的显示以 及整点报时等功能。具体可分为一下几种&#xff1a; 1) 显示当前的日期及时间&#xff0c;24 时制的时、分、秒&#xff1b; 2) 可调节时间&#xff1b; 3) 整点报时并响铃。 4) 能…

SpringCloud微服务架构(eureka、nacos、ribbon、feign、gateway等组件的详细介绍和使用)

一、微服务演变 1、单体架构&#xff08;Monolithic Architecture&#xff09; 是一种传统的软件架构模式&#xff0c;应用程序的所有功能和组件都集中在一个单一的应用中。 在单体架构中&#xff0c;应用程序通常由一个大型的、单一的代码库组成&#xff0c;其中包含了所有…

C/C++ 进阶(6)红黑树

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 目录 一、概念 性质 二、操作 插入 情况一&#xff1a;cur为红、p为红、g为黑&#xff0c;如果u存在且为红 步骤&#xff1a; 情况二&#xff1a;cur为红、p为红、g为黑&#xff0c;如果u不存在或…

京东网页html+css简单制作1(附带源码和素材)

一.代码效果展示 代码html骨架结构分为头部top,颈部banner&#xff0c;中间部分main,腿部fortet-image,尾部fortter&#xff0c;五部分组成&#xff0c;从上至下&#xff0c;从左到右结构。&#xff08;总体因为没设计版心&#xff0c;所以位置比较乱&#xff09; 其中中部mai…

迷宫最短路径求解--c++

【代码】 #include<iostream> #include<queue> #include<stack> using namespace std; #define ROW 8 #define COL 8 //测试迷宫数据 int maze[ROW][COL] {{0,0,0,1,0,0,0,0},{0,1,0,1,0,1,0,1},{0,1,0,0,0,1,0,1},{0,1,0,1,1,1,0,1},{0,1,0,1,1,0,0,0},{0…

第一百零四节 Java面向对象设计 - Java内部类成员

Java面向对象设计 - Java内部类成员 内部类可以访问其所有实例成员&#xff0c;实例字段和其封闭类的实例方法。 class Outer {private int value 2014;public class Inner {public void printValue() {System.out.println("Inner: Value " value);}} // Inner …