7.7 SpringBoot实战 管理员借阅审核列表 --分页和枚举的使用

CSDN成就一亿技术人

文章目录

  • 前言
  • 一、需求
  • 二、定义接口 BookAdminController
  • 三、核心实现 BookBorrowService
    • 新建 BookBorrowService 接口定义如下:
    • 新建 BookBorrowServiceImpl 类,核心实现逻辑:
    • 新建 BookBorrowBO
  • 四、图书借阅状态枚举 BookBorrowStatusEnum
  • 五、Postman测试
  • 最后


前言

本文主要实战 管理员借阅审核分页列表,更多的是复习之前讲过的技术点,像API接口的定义、分页pageHelper的使用、角色权限的校验等等,另外针对【图书借阅审核状态】引入了枚举的使用。
按照规划,本专栏剩余的文章还会有很多新技术点,当然像本文这样的复习也少不了,唯有不断复习、不断强化,这样你才能一回生二回熟,将前面所学技术不断的在不同的场景下活学活用,举一反三,触类旁通,最后才会越用越熟练,熟成生巧,当有新需求时,当然就能更快的找到更优的落地方案!

因为我们需要实现的API还有一大把,所以对于接下来的文章,我的计划是穿插着综合实战,新技术点讲解,好戏还在后头,加油!


一、需求

当学生发起【图书借阅】的申请后,在管理员端提供【借阅审核列表】给管理员查看:谁要借阅哪本书,哪些是待审核的,哪些是审核通过的,哪些是驳回的请求,分页展示。

提前说明:学生的图书借阅接口还没有开发,我们是先从管理员端入手!

二、定义接口 BookAdminController

在这里插入图片描述

对于借阅审核列表,支持管理员角色校验@Role分页参数状态status的筛选,另外我们新注入了BookBorrowService ,代码如下:

@Autowired
private BookBorrowService bookBorrowService;

@Role
@GetMapping("/book/borrow/examine/list")
public TgResult<BookBorrowBO> getBookBorrowExamineList(@RequestParam("pageNum") Integer pageNum
        , @RequestParam("pageSize") Integer pageSize, @RequestParam("status") Integer status) {
    return TgResult.ok(bookBorrowService.getBookBorrowExamineList(pageNum, pageSize, status));
}

详细的角色权限校验@Role,请参考 7.5 拦截器实现 和 7.6 AOP实现


三、核心实现 BookBorrowService

在这里插入图片描述

新建 BookBorrowService 接口定义如下:

public interface BookBorrowService {
    Page<BookBorrowBO> getBookBorrowExamineList(int pageNum, int pageSize, Integer status);
}

新建 BookBorrowServiceImpl 类,核心实现逻辑:

  • 分页查询借阅表book_borrowing,支持按status筛选
  • 通过studentId 查询学生信息
  • 通过bookId 查询书名
  • 通过verifyUserId 查询审核人
  • 通过status 查询状态描述

我在【7.4】说明过,这里再重复说明一下:这里分开查询,主要考虑的是 用户、图书、学生等信息不经常修改,二期可以使用Redis缓存优化,如果用Join查询,回头再优化的话,改动的就会更多!

@Service
public class BookBorrowServiceImpl implements BookBorrowService {

    @Autowired
    private BookBorrowingMapper bookBorrowingMapper;
    @Autowired
    private BookMapper bookMapper;
    @Autowired
    private StudentMapper studentMapper;
    @Autowired
    private UserMapper userMapper;

    @Override
    public Page<BookBorrowBO> getBookBorrowExamineList(int pageNum, int pageSize, Integer status) {
        // 图书借阅审核列表
        BookBorrowingExample example = new BookBorrowingExample();
        if (status != null) {
            example.createCriteria().andStatusEqualTo(status);
        }
        // 查询并分页
        Page<BookBorrowing> page = PageHelper.startPage(pageNum, pageSize)
                .doSelectPage(() -> bookBorrowingMapper.selectByExample(example));

        Page<BookBorrowBO> pageBO = new Page<>();
        BeanUtils.copyProperties(page, pageBO);
        for (BookBorrowing bookBorrowing : page.getResult()) {
            BookBorrowBO bookBorrowBO = new BookBorrowBO();
            BeanUtils.copyProperties(bookBorrowing, bookBorrowBO);
            Student student = studentMapper.selectByPrimaryKey(bookBorrowBO.getStudentId());
            // 借阅的学生
            StudentBO studentBO = new StudentBO();
            BeanUtils.copyProperties(student, studentBO);
            bookBorrowBO.setStudent(studentBO);
            // 书名
            Book book = bookMapper.selectByPrimaryKey(bookBorrowBO.getBookId());
            bookBorrowBO.setBookName(book.getBookName());
            // 审核人
            if (bookBorrowBO.getVerifyUserId() != null) {
                User verifyUser = userMapper.selectByPrimaryKey(bookBorrowBO.getVerifyUserId());
                bookBorrowBO.setVerifyUserName(verifyUser.getUserName());
            }
            // 状态描述
            bookBorrowBO.setStatusDesc(BookBorrowStatusEnum.getMsgByCode(bookBorrowBO.getStatus()));

            pageBO.add(bookBorrowBO);
        }
        return pageBO;
    }
}
  • 对于 BookBorrowStatusEnum.getMsgByCode,我在文章下节有说明!
  • 其它的Mybatis的根据Mapper查询,使用的都是MBG生成的selectByPrimaryKey,即根据主键查询一条记录。如果生疏了,详见 5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

新建 BookBorrowBO

@Data
public class BookBorrowBO implements Serializable {
    private Integer id;
    private Integer studentId;
    private Integer bookId;
    private Date borrowTime;
    private Integer status;
    private String rejectReason;
    private Date verifyTime;
    private Integer verifyUserId;
    private Date returnTime;
    private Date gmtCreate;
    private Date gmtModified;
    // BookBorrowing以外的字段
    private StudentBO student;
    private String statusDesc;
    private String bookName;
    private String verifyUserName;
}

四、图书借阅状态枚举 BookBorrowStatusEnum

枚举定义在tg-book-common的enums包中,如下图:

在这里插入图片描述

Java中定义枚举使用enum关键字,并且支持成员变量构造方法等,适用于定义一些状态码和描述。

对于图书借阅状态,共分4种:

  • 0-待审核
  • 1-审核通过
  • 2-驳回
  • 3-已还

对于一码一描述,可以通过定义两个字段code 和 msg,使用构造方法传入,代码如下:

/**
 * 图书借阅状态枚举
 **/
public enum BookBorrowStatusEnum {

    Integer code;
    String msg;

    BookBorrowStatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return this.code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

然后,我们可以在BookBorrowStatusEnum的最上方,中添加定义的4种状态:

/**
 * 图书借阅状态枚举
 **/
public enum BookBorrowStatusEnum {
    TO_BE_EXAMINE(0, "待审核"),
    APPROVED(1, "审核通过"),
    REJECTED(2, "驳回"),
    RETURNED(3, "已还"),
    ;

    Integer code;
    String msg;

    BookBorrowStatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return this.code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

并且,可以像类一样,定义静态方法,例如在BookBorrowStatusEnum定义静态方法:根据code获取msg

/**
 * 根据code获取msg
 **/
public static String getMsgByCode(Integer code) {
    for (BookBorrowStatusEnum e : BookBorrowStatusEnum.values()) {
        if (e.getCode().equals(code)) {
            return e.getMsg();
        }
    }
    return null;
}

同理,我们再定义一个下文使用的图书状态枚举

/**
 * 图书状态枚举
 **/
public enum BookStatusEnum {
    FREE(0, "空闲"),
    BORROWING(1, "借阅中"),
    ;

    Integer code;
    String msg;

    BookStatusEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return this.code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

五、Postman测试

先用SQL模拟一条学生借阅记录数据

INSERT INTO `db_book`.`book_borrowing`
(`student_id`, `book_id`, `borrow_time`, `status`, `reject_reason`
, `verify_time`, `verify_user_id`, `return_time`, `gmt_create`, `gmt_modified`) 
VALUES (1, 2, '2023-04-08 03:10:00', 0, ''
, NULL, NULL, NULL, '2023-07-29 03:10:00', NULL);

再用Postman请求status=0的数据,结果如下:

在这里插入图片描述


最后

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为数通HCIA-数通网络基础

基础概念 通信&#xff1a;两个实体之间进行信息交流 数据通信&#xff1a;网络设备之间进行的通信 计算机网络&#xff1a;实现网络设备之间进行数据通信的媒介 园区网络&#xff08;企业网络&#xff09;/私网/内网&#xff1a;用于实现园区内部互通&#xff0c;并且需要部…

better scoll的使用以及注意事项以及左联右

下载better scoll的核心 在你要使用的页面引入 在data里面定义一个对象 然后在createad里面放一个nexttick异步操作。 上面是获取这个left-box节点是父节点 记住里面只能有一个子节点如果循环了 就要再包一个div就是一个子节点 左联右 首先也要获取 右边的 父节点 然后配…

(树) 剑指 Offer 28. 对称的二叉树 ——【Leetcode每日一题】

❓ 剑指 Offer 28. 对称的二叉树 难度&#xff1a;简单 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \3 4 4 3但是下面这个…

了解Unity编辑器之组件篇Layout(八)

Layout&#xff1a;用于管理和控制UI元素的排列和自动调整一、Aspect Ratio Fitter&#xff1a;用于根据宽高比自动调整UI元素的大小 Aspect Mode&#xff1a;用于定义纵横比适配的行为方式。Aspect Mode属性有以下几种选项&#xff1a; &#xff08;1&#xff09;None&#xf…

安全学习DAY12_信息打点-Web应用信息搜集

信息打点-Web应用 文章目录 信息打点-Web应用业务资产企业查信息的目的 Web应用信息搜集Web网站域名搜集WEB单域名WEB子域名OneForAll&#xff08;子域名收集工具&#xff09; WEB网站架构资产WEB指纹识别资产 常用查询平台汇总查企业信息查备案信息查公众号信息域名注册查询IP…

基于 Docker 的深度学习环境:Windows 篇

本篇文章&#xff0c;我们聊聊如何在 Windows 环境下使用 Docker 作为深度学习环境&#xff0c;以及快速运行 SDXL 1.0 正式版&#xff0c;可能是目前网上比较简单的 Docker、WSL2 配置教程啦。 写在前面 早些时候&#xff0c;写过一篇《基于 Docker 的深度学习环境&#xff…

幅度调制与角度调制

文章目录 前言一、调制简介1、调制定义2、调制目的3、调制的分类 二、幅度调制&#xff08;线性调制&#xff09;1、幅度调制的一般模型2、常规双边带调幅 AM①、AM 信号的产生②、AM 调制器的模型③、AM 波形和频谱④、AM 信号的特点⑤、AM 包络检波⑥、调幅系数 3、抑制载波双…

【用IDEA基于Scala2.12.18开发Spark 3.4.1 项目】

目录 使用IDEA创建Spark项目设置sbt依赖创建Spark 项目结构新建Scala代码 使用IDEA创建Spark项目 打开IDEA后选址新建项目 选址sbt选项 配置JDK debug 解决方案 相关的依赖下载出问题多的话&#xff0c;可以关闭idea&#xff0c;重启再等等即可。 设置sbt依赖 将sbt…

neo4j教程-Cypher操作

Cypher基础操作 Cypher是图形存储数据库Neo4j的查询语言&#xff0c;Cypher是通过模式匹配Neo4j数据库中的节点和关系&#xff0c;从而对数据库Neo4j中的节点和关系进行一系列的相关操作。 下面&#xff0c;通过一张表来介绍一下常用的Neo4j操作命令及相关说明&#xff0c;具…

基于峰谷分时电价引导下的电动汽车充电负荷优化(matlab代码)

目录 1 主要内容 峰谷电价优化 电动汽车充电负荷变化 2 部分代码 3 程序结果 1 主要内容 该程序基本复现《基于峰谷分时电价引导下的电动汽车充电负荷优化》&#xff0c;代码主要做的是基于NSGA-II的电动汽车充电负荷优化&#xff0c;首先&#xff0c;在研究电动汽车用户充…

【VSCode部署模型】导出TensorFlow2.X训练好的模型信息

参考tensorflow2.0 C加载python训练保存的pb模型 经过模型训练及保存&#xff0c;我们得到“OptimalModelDataSet2”文件夹&#xff0c;模型的保存方法(.h5或.pb文件)&#xff0c;参考【Visual Studio Code】c/c部署tensorflow训练的模型 其中“OptimalModelDataSet2”文件夹保…

HDFS中namenode安全模式

HDFS中namenode安全模式 安全模式的现象探究step1step2step3step4 安全模式的概述控制进入时间和离开条件安全模式自动进入离开安全模式手动进入离开 安全模式的现象探究 step1 HDFS集群在停机状态下&#xff0c;使用hdfs -daemon命令逐个进程启动集群&#xff0c;观察现象首…

太猛了,靠“吹牛”过顺丰一面,月薪30K

说在前面 在40岁老架构师尼恩的&#xff08;50&#xff09;读者社群中&#xff0c;经常有小伙伴&#xff0c;需要面试美团、京东、阿里、 百度、头条等大厂。 下面是一个5年小伙伴成功拿到通过了顺丰面试&#xff0c;拿到offer&#xff0c;月薪30K。 现在把面试真题和参考答…

音视频——压缩原理

H264视频压缩算法现在无疑是所有视频压缩技术中使用最广泛&#xff0c; 最流行的。随着 x264/openh264以及ffmpeg等开源库的推出&#xff0c;大多数使用者无需再对H264的细节做过多的研究&#xff0c;这大降低了人们使用H264的成本。 但为了用好H264&#xff0c;我们还是要对…

【KVC补充 Objective-C语言】

一、KVC补充 好,那么接下来,再给大家说一下这个KVC 1.首先我们说,这个KVC,就是指的什么 key value coding 吧 全称就是叫做(Key Value Coding),这是它的全称 那么,你在帮助文档里面搜的时候,你就搜key-value coding 是不是这个啊,key-value coding 然后点击,进…

NASM汇编

1. 前置知识 1. 汇编语言两种风格 intel&#xff1a;我们学的NASM就属于Intel风格AT&T&#xff1a;GCC后端工具默认使用这种风格&#xff0c;当然我们也可以加选项改成intel风格 2. 代码 1. 段分布 .text: 存放的是二进制机器码&#xff0c;只读.data: 存放有初始化的…

uni-app之微信小程序实现‘下载+保存至本地+预览’功能

目录 一、H5如何实现下载功能 二、微信小程序实现下载资源功能方面与H5有很大的不同 三、 微信小程序实现文件&#xff08;doc,pdf等格式&#xff0c;非图片&#xff09;下载&#xff08;下载->保存->预览&#xff09;功能 四、图片预览、保存、转发、收藏&#xff1…

flask中的cookies介绍

flask中的cookies介绍 “Cookie” 在 web 开发中是一种非常重要的技术&#xff0c;用于在客户端&#xff08;即用户的浏览器&#xff09;存储信息&#xff0c;以便在多个页面和多个访问会话之间保持状态。Cookies 通常用于记住用户的登录信息&#xff0c;跟踪用户在站点上的浏…

C++——继承(1)详解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

机器学习深度学习——Dropout

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——权重衰减 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 Drop…