7.20 SpringBoot项目实战【图书详情-学生端】:图书信息 + 评论列表 + 是否收藏

news2024/11/13 14:41:55

CSDN成就一亿技术人

文章目录

  • 前言
  • 一、接口规划
  • 二、编写服务层
  • 三、编写数据访问层
  • 四、编写控制器
  • 五、PostMan测试
    • 1. getBook 根据id获取图书
    • 2. getBookCommentList 根据id获取图书详情 - 评论列表
    • 3. getFavoriteId 获取学生收藏了某图书的收藏id
  • 最后


前言

学生的【借阅申请】审核通过以后,就有了借阅图书的资格。

产品设计操作流程通常为:查看图书列表 7.3 实现-》查看图书详情-》点击借阅。

我们曾在7.4 实现过管理员端的图书详情,但与学生端还有点区别,本文将实现的是 图书详情-学生端,都是多个接口,让我们拭目以待!


一、接口规划

图书详情-学生端 主要展示3块内容:图书基本信息、评论列表、我是否收藏,所以规划包含以下3个接口:

  1. 图书基本信息API,我们最开始就已实现,如下图:

    在这里插入图片描述

    管理员端调用是/book/detail 接口,小有差别。

  2. 图书评论列表API(审核通过的)

    之前实现的是/book/comment/list接口,查询的是全部的评论,这里需要根据角色做一下完善,代码完善3点:

    对应图① 获取当前登录用户是否是管理员(isAdmin)

    对应图② 当不是管理员时,增加status是审核通过的筛选条件

    对应图③ 当是管理员时,才显示审核人

    在这里插入图片描述

    请参考图片修改相应代码~

  3. 我是否收藏了该图书API

    这是学生需要看到的收藏状态,也是本文我们新增的接口

二、编写服务层

在这里插入图片描述

新增FavoriteService接口

新增getFavoriteId方法,返回收藏id,是为了支持后面的取消收藏

public interface FavoriteService {
    /**
     * 获取学生收藏了某图书的收藏id
     * @param bookId 图书id
     * @return 收藏id, 如果没收藏则为空
     **/
    Integer getFavoriteId(Integer bookId, Integer userId);
}

新增FavoriteServiceImpl类,实现FavoriteService接口,加@Service注解,注入自定义mapper:BookFavoriteMapperExt

@Service
public class FavoriteServiceImpl implements FavoriteService {

    @Autowired
    private BookFavoriteMapperExt bookFavoriteMapperExt;

    @Override
    public Integer getFavoriteId(Integer bookId, Integer userId) {
        BookFavorite bookFavorite = bookFavoriteMapperExt.selectByUserId(bookId, userId);
        return bookFavorite != null ? bookFavorite.getId() : null;
    }
}

三、编写数据访问层

在这里插入图片描述

新增自定义的mapper:BookFavoriteMapperExt接口,注意对应的包路径

public interface BookFavoriteMapperExt {
    BookFavorite selectByUserId(@Param("bookId") Integer bookId, @Param("userId") Integer userId);
}

BookFavoriteMapperExt.xml 定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.tg.book.dal.mapper.ext.BookFavoriteMapperExt">

    <select id="selectByUserId" resultType="org.tg.book.dal.po.mbg.BookFavorite">
        select a.* from book_favorite a
            inner join student b on a.student_id = b.id
        where a.book_id = #{bookId}
            and b.user_id = #{userId}
            and is_cancelled = 0
        limit 1
    </select>

</mapper>

book_favoritestudent表关联查询,按bookId和userId筛选未取消收藏的 limit 1


四、编写控制器

在这里插入图片描述

新增FavoriteController类:

@RestController
@RequestMapping("/favorite")
@Validated
public class FavoriteController {

    @Autowired
    private FavoriteService favoriteService;

    @GetMapping("/book")
    public TgResult<Integer> getFavoriteId(@Min(value = 1, message = "id必须大于0") @RequestParam("bookId") Integer bookId) {
        Integer userId = AuthContextInfo.getAuthInfo().loginUserId();
        Integer bookFavoriteId = favoriteService.getFavoriteId(bookId, userId);
        return TgResult.ok(bookFavoriteId);
    }
}

这些代码不要太熟了吧?不多做解释了~


五、PostMan测试

1. getBook 根据id获取图书

/admin/book?id=1

在这里插入图片描述

2. getBookCommentList 根据id获取图书详情 - 评论列表

/admin/book/comment/list?id=1&pageNum=1&pageSize=100

book_comment表的数据如下:

在这里插入图片描述

因为没有【审核通过】的评论,所以当使用【学生账号】查看时,dataList为空

在这里插入图片描述

看看打印的SQL(ok,加上了status=1的条件):

在这里插入图片描述

因为有一条【待审核】的评论,所以当使用【管理员账号】查看时,结果如下:

在这里插入图片描述

3. getFavoriteId 获取学生收藏了某图书的收藏id

/favorite/book?bookId=1

book_favorite表的数据如下:

在这里插入图片描述

当使用student_id=1的账号调用时,返回id=2,OK~

在这里插入图片描述


最后

看到这,觉得有帮助的,刷波666,感谢大家的支持~

想要看更多实战好文章,还是给大家推荐我的实战专栏–>《基于SpringBoot+SpringCloud+Vue前后端分离项目实战》,由我和 前端狗哥 合力打造的一款专栏,可以让你从0到1快速拥有企业级规范的项目实战经验!

具体的优势、规划、技术选型都可以在《开篇》试读!

订阅专栏后可以添加我的微信,我会为每一位用户进行针对性指导!

另外,别忘了关注我:天罡gg ,怕你找不到我,发布新文不容易错过: https://blog.csdn.net/scm_2008

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

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

相关文章

nodejs+vue市民健身中心网上平台-计算机毕业设计

市民健身中心网上平台分为用户界面和管理员界面&#xff0c;用户界面功能模块图如图1所示&#xff0c;管理员界面功能模块图如图2所示。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs…

springboot+avue医院绩效考核系统源码

医院绩效考核系统是一种以人力资源管理为基础&#xff0c;选用适合医院组织机构属性的绩效理论和方法&#xff0c;基于医院战略目标&#xff0c;构建全方位的绩效考评体系&#xff0c;在科学、合理的绩效管理体系基础上&#xff0c;采用科学管理的方法&#xff0c;如平衡计分卡…

C++前缀和算法:生成数组原理、源码及测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划&#xff0c;日后完成。 题目 给定三个整数 n、m 和 k 。考虑使用下图描述的算法找出正整数数组中最大的元素。 请你构建一个具有以下属性的数组 arr &#…

Amazon CodeWhisperer让力扣不再用力code!

书接上文《爱编程 why not AI编程》&#xff0c;通过前文的对于Amazon CodeWhisperer的介绍、入门指南、相关课程以及【云上探索实验室】活动&#xff0c;各位读者们应该对于Amazon CodeWhisperer有了一些了解&#xff0c;那么作者今天将该通过本篇文章来介绍用Amazon CodeWhis…

OpenCV官方教程中文版 —— Canny 边缘检测

OpenCV官方教程中文版 —— Canny 边缘检测 前言一、原理1.噪声去除2.计算图像梯度3.非极大值抑制4.滞后阈值 二、OpenCV 中的 Canny 边界检测练习 前言 OpenCV 中的 Canny 边缘检测 • 了解 Canny 边缘检测的概念 • 学习函数 cv2.Canny() 一、原理 Canny 边缘检测是一种…

FreeRTOS深入教程(任务的引入及栈的作用)

文章目录 前言一、任务的引入二、深入理解C语言函数的调用1.ARM架构2.基础汇编指令3.函数运行流程分析 三.保存现场的几种情况1.函数调用2.中断处理3.任务切换 总结 前言 本篇文章开始带大家深入学习FreeRTOS&#xff0c;带大家学习什么是任务&#xff0c;并且深入学习栈的作用…

Openssl数据安全传输平台008:业务数据分析+工厂方法

文章目录 UML图1.1 客户端1.2 服务器端 UML图 1.1 客户端 // 准备要发送的数据 struct RequestMsg {//1 密钥协商 //2 密钥校验; // 3 密钥注销int cmdType; // 报文类型string clientId; // 客户端编号string serverId; // 服务器端编号string sign;string data; };1.2 服务器…

USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式

连接计算机外围设备最简单的方法是通过USB(通用串行总线)。USB是即插即用接口&#xff0c;可以将扫描仪、打印机、数码相机、闪存驱动器等计算机外围设备连接到计算机上。本篇文章就来介绍一下USB的一些基础知识&#xff0c;包括。 文章目录 1 接口类型和标准规范2 引脚分布3 …

前端Vue——安装和遇到的问题记录

文章目录 安装Node.js安装Vue需要的脚手架Vue Cli在PyCharm中开发Vue项目 安装Node.js 下载地址&#xff1a;https://nodejs.cn/download/ 下载.Msi即可&#xff0c;然后安装&#xff0c;一直next WinR&#xff0c;cmd&#xff0c;node -v可以查看node的版本&#xff0c;v18.1…

Deno 命令行界面

目录 1、命令行界面 ​2、脚本源 3、脚本参数 4、监听模式 5、完整性标记&#xff08;lock files&#xff09; 6、缓存和编译标记 7、运行时标记 7.1 类型检查标记 7.2 权限标记 7.2.1 权限 7.2.2 放心地运行不受信任的代码 7.2.3 权限列表 7.2.4 可配置权限 文件…

Vm虚拟机安装Linux(ubuntu18.04)系统教程(2023最新最详细)

软件&#xff1a;Linux版本&#xff1a;18.0.4语言&#xff1a;简体中文大小&#xff1a;1.82G安装环境&#xff1a;VMware硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09; 下载通道①丨百度网盘&#xff1a; 1.Vm虚拟机15.5下载链接&#xff1a; https://pan.baidu.…

Vue项目中使用Multiavatarjs生成自定义随机头像-demo

Multiavatar & vue-color-avatar 前者使用简单一点提供的有api&#xff0c;后者更类似一个项目 主要使用Multiavatar去实现随机生成头像的功能 https://github.com/multiavatar/Multiavatar/blob/main/multiavatar.js 使用很简单&#xff0c;把js下载保存到项目中&#xff…

【Top101】002链表内指定区间反转

链表内指定区间反转_牛客题霸_牛客网 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿…

零代码编程:用ChatGPT将Mobi、epub、azw3等电子书批量转换为word文档

将ebook格式转换为PDF需要一个名为Calibre的命令行工具。这是一个开源的电子书管理工具&#xff0c;首先在系统上安装它&#xff0c;软件下载地址&#xff1a;https://calibre-ebook.com/download_windows 然后将其添加到PATH环境变量中&#xff1a; 接下来&#xff0c;在ChatG…

学信息系统项目管理师第4版系列35_补遗

题外话&#xff1a;1. 计划没有变化快&#xff0c;10月18日软考出了通告&#xff0c;10月28日和29日分别是信息系统项目管理师第一批次和第二批次考试&#xff0c;比原先11月4日提前一周&#xff0c;祝贺那一批敢为人先的幸运儿。 2. 该系列也进入了尾声&#xff0c;补遗是正文…

【Maven】Unknown lifecycle phase “.skip.test=true“.

idea 终端执行如下命令时 mvn clean install -Dmaven.skip.testtrue报&#xff1a; Unknown lifecycle phase ".skip.testtrue". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id&…

【ONE·C++ || 智能指针 特殊类的设计】

总言 主要介绍智能指针&#xff08;auto_ptr、unique_ptr、shared_ptr、weak_ptr&#xff09;和特殊类的设计&#xff08;单例模式&#xff09;。 文章目录 总言1、为什么需要智能指针&#xff1f;&#xff08;内存泄漏&#xff09;1.1、什么是内存泄漏1.2、内存泄漏的分类和常…

leetcode做题笔记199. 二叉树的右视图

给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: [] 思路一&…

SD/SDIO(2):SDIO协议介绍和初始化流程

文章目录 1 标准/非标准SDIO规范2 SDIO引脚定义3 SDIO初始化流程3.1 由不支持I/O的主机初始化3.2 由支持I/O的主机初始化3.3 CMD5(IO_SEND_OP_COND)3.4 R4(CMD5的回复) 4 总结 1 标准/非标准SDIO规范 如下图所示&#xff0c;SDIO总线规范由物理层规范和SDIO规范定义。组合卡(包…

基于WebRTC构建的程序因虚拟内存不足导致闪退问题的排查以及解决办法的探究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上&#xff0c;没有感知到异常或中断 3.2、Windbg感知到了中断&#xff0c;中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …