【JavaEE进阶】 图书管理系统开发日记——叁

🌴前言

在前面我们实现了用户登录的接口。现在我们来实现图书列表展示页面。

🎋数据准备

创建图书表,并初始化数据

-- 图书表
DROP TABLE IF EXISTS book_info;
CREATE TABLE `book_info` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`book_name` VARCHAR ( 127 ) NOT NULL,`author` VARCHAR ( 127 ) NOT NULL,`count` INT ( 11 ) NOT NULL,`price` DECIMAL (7,2 ) NOT NULL,`publish` VARCHAR ( 256 ) NOT NULL,`status` TINYINT ( 4 ) DEFAULT 1 COMMENT '0-⽆效, 1-正常, 2-不允许借阅',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;-- 初始化图书数据
INSERT INTO `book_info` (book_name,author,count, price, publish) VALUES ('活
着', '余华', 29, 22.00, '北京⽂艺出版社');
INSERT INTO `book_info` (book_name,author,count, price, publish) VALUES ('平凡的
世界', '路遥', 5, 98.56, '北京⼗⽉⽂艺出版社');
INSERT INTO `book_info` (book_name,author,count, price, publish) VALUES ('三
体', '刘慈欣', 9, 102.67, '重庆出版社');
INSERT INTO `book_info` (book_name,author,count, price, publish) VALUES ('⾦字塔
原理', '⻨肯锡', 16, 178.00, '⺠主与建设出版社');

MyBatis和MySQL驱动依赖已经在用户登录时已经配置过了,直接用即可

🎄需求分析

首先我们先来看一下页面展示的效果
在这里插入图片描述

在分页时,第一页就展示10条数据,第二页我们也只显示10条数据

要想实现这个功能,从数据库中进⾏分⻚查询,我们要使⽤ LIMIT 关键字,格式为:limit 开始索引每⻚显⽰的条数(开始索引从0开始)

通过观察与思考,我们可以发现

开始索引的计算公式:开始索引=(当前⻚码-1)*每⻚显⽰条数

基于前端⻚⾯的分析,得出以下结论:

  1. 前端在发起查询请求时,需要向服务端传递的参数
  • currentPage当前⻚码 //默认值为1
  • pageSize每⻚显⽰条数 //默认值为10
  1. 后端响应时,需要响应给前端的数据
  • records所查询到的数据列表(存储到List集合中)
  • total总记录数(⽤于告诉前端显⽰多少⻚,显⽰⻚数为: (total + pageSize-1)/pageSize

翻⻚请求和响应部分,我们通常封装在两个对象中,并放在model文件路径下

🚩翻⻚请求对象类

除了需要currentPage当前⻚码和pageSize每⻚显⽰条数

我们还需要根据currentPage和pageSize,计算出来开始索引

代码如下:

@Data
public class PageRequest {private int currentPage = 1; // 当前⻚private int pageSize = 10; // 每⻚中的记录数private int offset;public int getOffset() {return (currentPage-1) * pageSize;}
}

🚩翻页响应对象类

该类博主设计的是返回一个对象。

该对象应该含有以下属性。

  • records所查询到的数据列表
  • total总记录数
  • PageRequest属性

添加PageRequest属性是为了避免后续还需要其他请求处的信息

同时给出相应的构造方法。

代码实现如下:

@Data
public class PageResult<T> {private int total;//所有记录数private List<T> records; // 当前⻚数据private PageRequest pageRequest;public PageResult(Integer total, PageRequest pageRequest, List<T> records){this.total = total;this.pageRequest = pageRequest;this.records = records;}
}

🍃约定前后端交互接⼝

基于以上分析,我们来约定前后端交互接⼝

[请求]
/book/getListByPage?currentPage=1&pageSize=10
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
[参数]
[响应]
Content-Type: application/json
{
“total”: 25,
“records”: [{
“id”: 25,
“bookName”: “图书21”,
“author”: “作者2”,
“count”: 29,
“price”: 22.00,
“publish”: “出版社1”,
“status”: 1,
“statusCN”: “可借阅”
}, {

} ]
}

我们约定,浏览器给服务器发送⼀个 /book/getListByPage 这样的HTTP请求,通过currentPage参数告诉服务器,当前请求为第⼏⻚的数据,后端根据请求参数,返回对应⻚的数据

第一页可以不传递参数,默认为1

🌲后端服务器代码实现

依旧利用分层思想进行代码实现

🚩控制层

在该层我们只需要调用业务层的代码返回就好

@Slf4j
@RequestMapping("/book")
@RestController
public class BookController {@Autowiredprivate BookService bookService;@RequestMapping("/getListByPage")public PageResult<BookInfo> getListByPage(PageRequest pageRequest) {log.info("获取图书列表, pageRequest:{}", pageRequest);PageResult<BookInfo> pageResults = bookService.getBookListByPage(pageRequest);return pageResults;}}

🚩业务层

在书写业务层代码时我们需要考虑以下几点

  1. 翻⻚信息需要返回数据的总数和列表信息,需要查两次SQL

  2. 图书状态:图书状态和数据库存储的status有⼀定的对应关系

如果后续状态码有变动,我们需要修改项⽬中所有涉及的代码,这种情况,我们通常采⽤枚举类来处理映射关系

枚举类代码如下:

public enum BookStatus {DELETED(0,"⽆效"),NORMAL(1,"可借阅"),FORBIDDEN(2,"不可借阅");private Integer code;private String name;BookStatus(int code, String name) {this.code = code;this.name = name;}public static BookStatus getNameByCode(Integer code){switch (code){case 0: return DELETED;case 1: return NORMAL;case 2: return FORBIDDEN;}return null;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

此时我们只需要调用相应的数据层代码,查询相应的数据,并对查询到的数据进行状态码的更新。

最后构造新的响应对象,返回即可

代码实现如下:

@Service
public class BookService {@Autowiredprivate BookInfoMapper bookInfoMapper;public PageResult<BookInfo> getBookListByPage(PageRequest pageRequest) {Integer count = bookInfoMapper.count();List<BookInfo> books = bookInfoMapper.queryBookListByPage(pageRequest);for (BookInfo book:books){book.setStatusCN(BookStatus.getNameByCode(book.getStatus()).getName());}return new PageResult<>(count,pageRequest, books);}}

🚩数据层

数据层我们只需要进行两个查询即可

一个是返回最大数据长度,一个是查询当前页码的所有数据。

代码实现如下:

@Mapper
public interface BookInfoMapper {@Select("select count(1) from book_info where status<>0")Integer count();@Select("select * from book_info where status !=0 order by id desc limit #{offset}, #{pageSize}")List<BookInfo> queryBookListByPage(PageRequest pageRequest);
}

🚩测试后端代码

到这里后端代码就写完了,我们可以进行简单的测试,只需要在浏览器中输入

  • http://127.0.0.1:8080/book/getListByPage返回1-10条记录(按id降序)
  • http://127.0.0.1:8080/book/getListByPage?currentPage=2返回11-20条记录

此时说明后端代码已经书写成功

🌳客户端代码的完善

这里博主直接给出改变的相应代码。

实现如下:

getBookList();
function getBookList() {$.ajax({type: "get",url: "/book/getListByPage"+location.search,success: function (result) {console.log(result);if (result != null) {var finalHtml = "";for (var book of result.records) {finalHtml += '<tr>';finalHtml += '<td><input type="checkbox" name="selectBook" value="'+book.id+'" id="selectBook" class="book-select"></td>'finalHtml += '<td>' + book.id + '</td>';finalHtml += '<td>' + book.bookName + '</td>';finalHtml += '<td>' + book.author + '</td>';finalHtml += '<td>' + book.count + '</td>';finalHtml += '<td>' + book.price + '</td>';finalHtml += '<td>' + book.publish + '</td>';finalHtml += '<td>' + book.statusCN + '</td>';finalHtml += '<td><div class="op">';finalHtml += '<a href="book_update.html?bookId=' + book.id + '">修改</a>'finalHtml += '<a href="javascript:void(0)" onclick="deleteBoook(' + book.id + ')">删除</a>'finalHtml += '</div></td>';finalHtml += "</tr>";}$("tbody").html(finalHtml);//翻页信息$("#pageContainer").jqPaginator({totalCounts: result.total, //总记录数pageSize: 10,    //每页的个数visiblePages: 5, //可视页数currentPage: result.pageRequest.currentPage,  //当前页码first: '<li class="page-item"><a class="page-link">首页</a></li>',prev: '<li class="page-item"><a class="page-link" href="javascript:void(0);">上一页<\/a><\/li>',next: '<li class="page-item"><a class="page-link" href="javascript:void(0);">下一页<\/a><\/li>',last: '<li class="page-item"><a class="page-link" href="javascript:void(0);">最后一页<\/a><\/li>',page: '<li class="page-item"><a class="page-link" href="javascript:void(0);">{{page}}<\/a><\/li>',//页面初始化和页码点击时都会执行onPageChange: function (page, type) {console.log("第" + page + "⻚, 类型:" + type);if (type != 'init') {location.href = "book_list.html?currentPage=" + page;}}});}}});
}

在这里插入图片描述

⭕总结

关于《【JavaEE进阶】 图书管理系统开发日记——叁》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么样的软件,可以搜大学题?解决难题不费神,尽在大学搜题工具! #媒体#其他

学会运用各类学习辅助工具和资料&#xff0c;是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.千鸟搜题 这个是公众号 涵盖往年成人各类考试&#xff0c;题库有建筑类、金融类、医药卫生类、公考类、安全生产类、特种作业类等试题 下方附上一些测试的试题及答案 …

【自动化测试】---Selenium+Java

1.自动化测试分类 接口自动化测试UI自动化测试&#xff08;移动端自动化测试、Web端自动化测试&#xff09; 2.选择Selenium作为web自动化工具原因&#xff08;面试题&#xff09; 开源免费支持多个浏览器支持多个系统支持多语言Selenium包提供很多供测试使用的API 3.自动化是什…

深度学习入门笔记(五)前馈网络与反向传播

接着上一节,本节讲解模型自我学习的数学计算过程究竟是怎么样的。 5.1 前馈网络 一个最简单的前馈神经网络如图所示,对于每一个隐藏层,输入对应前一层每一个节点权重乘以节点输出值,输出则是经过激活函数(例如sigmoid函数)计算后的值。 在这样的网络中,输入的数据 x 经…

生物素-PEG4-酪胺,Biotin-PEG4-TSA,应用于酶联免疫吸附实验

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;生物素-PEG4-酪胺&#xff0c;Biotin-PEG4-Tyramide&#xff0c;Biotin-PEG4-TSA 一、基本信息 产品简介&#xff1a;Biotin PEG4 Tyramine is a reagent used for tyramine signal amplification (TSA) through ca…

wpsjs如何打开本机浏览器

目前在wps开发平台上还没找到直接调起浏览器的api,不过可以通过点击超链接会自动打开浏览器的特性取巧去触发 let aaApplication.ActiveSheet.Hyperlinks.Add(Application.ActiveSheet.Range(H6), "https://www.i5a6.com");//创建超链接 aa.Follow();//执行超链接

小迪安全24WEB 攻防-通用漏洞SQL 注入MYSQL 跨库ACCESS 偏移

#知识点&#xff1a; 1、脚本代码与数据库前置知识 2、Access 数据库注入-简易&偏移 3、MYSQL 数据库注入-简易&权限跨库 #前置知识&#xff1a; -SQL 注入漏洞产生原理分析 -SQL 注入漏洞危害利用分析 -脚本代码与数据库操作流程 -数据库名&#xff0c…

【GitHub项目推荐--一个 C++ 实现快速存储的库】【转载】

一个提供可嵌入、持久键值存储以实现快速存储的库。 github地址 https://github.com/facebook/rocksdb 国内镜像 http://www.gitpp.com/ag/rocksdb RocksDB 是一个开源的嵌入式键值存储库&#xff0c;由 Facebook 开发&#xff0c;用于处理大量的数据&#xff0c;特别适合于…

sql指南之null值用法

注明&#xff1a;参考文章&#xff1a; SQL避坑指南之NULL值知多少&#xff1f;_select null as-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞7次&#xff0c;收藏21次。0 引言 SQL NULL&#xff08;UNKNOW&#xff09;是用来代表缺失值的术语&#xff0c;在表中的NULL值是显示…

中国2023年土地利用现状遥感监测数据

中国2023年土地利用现状遥感监测数据是以2023年美国Landsat 8遥感影像为主要数据源&#xff0c;在2020年通过2020年土地利用数据基础上&#xff0c;通过2020年和2023年两期遥感影像对比分析&#xff0c;人工目视解译生成。 改革开放以来&#xff0c;中国经济的快速发展对土地利…

杂题——试题 算法训练 区间最大和

分析&#xff1a; 如果使用两个for循环遍历所有情况&#xff0c;运行会超时解决运行超时的关键点在于&#xff1a;及时停止累加&#xff0c;丢弃当前的子序列 比如【1&#xff0c;-2&#xff0c;3&#xff0c;10】从第一个数字开始的子序列的和小于从第三个数字开始的子序列的和…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

angr学习-入门篇

前言&#xff1a; 资源链接&#xff1a;https://github.com/jakespringer/angr_ctf&#xff08;题库仓库&#xff0c;里面有个讲解angr的PPT&#xff0c;里面有官方的题解很详细&#xff09;https://github.com/Hustcw/Angr_Tutorial_For_CTF 安装&#xff1a; 关于angr的安…