基于Java+MySQL实现(Web)图书借阅管理系统
图书借阅管理系统(前后台)
1 需求分析
图书借阅管理系统是模拟学校图书馆实现的一个具有前后台的 Web 系统.对于读者,能够提供全文检索,个性化推荐,借阅等功能.对于管理员,能够提供可视化数据分析,信息管理等功能.
2 技术栈
前端: Layui,jQuery,echarts
后端:Spring Boot,MyBatis,elasticsearch,thymeleaf(一个模板引擎,代替 jsp)
开发工具:IDEA,HBuilder,postman,Navicat for MySQL
项目管理工具:Maven
3 总体设计
3.1 系统功能概述
3.1.1 前台系统
(1) 读者登录,注册,修改密码
(2) 基本资料查看,修改
(3) 图书查询(复杂查询),仿京东商城以图片卡片形式分页展示,可点击每本书的评价数进行评价,点击卡片查看详细图书信息以及借阅
(4) 个性化推荐图书:根据读者的兴趣爱好,每本书对应读者的浏览量,每本书的借阅量,每本书的评论数进行多重排序,展示在读者面前
(5) 历史记录浏览,查询
(6) 基于 Elasticsearch 搜索引擎的全文检索
3.1.2 后台系统
(1) 管理员登录,修改密码
(2) 读者管理:查看,添加,编辑,删除
(3) 管理员管理:查看,添加,删除
(4) 角色管理
(5) 统计分析:
A.分别以树状图,饼图展示图书分类占比
B.以折线图加饼图展示每年的图书类型借阅情况
C.查询每年的热门图书排名以及借阅次数
(6) 历史记录管理
(7) 图书管理:查看,添加,删除
3.2 E-R 模型
3.3 系统流程图
4 详细设计
4.1 前台系统
分页查询:当图书数量达到一定程度,分页显示就显得很重要了.通过使用 pagination.js 和 AJAX 向后端发起请求返回数据,每次点击页码执行回调函数.
多重检索:可通过 ID,书名,作者,出版社,分类,出版时间范围进行搜索,然后表单提交到后端接口,后端执行动态 MySQL 查询语句,然后返回数据,最后分页展示出来.
个性化推荐:在基本资料里可设置自己的兴趣爱好,此后推荐的图书符合自己设置的兴趣爱好.同时基于点击量,评论数,借阅量,出版时间进行多级排序,这点可通过 MySQL 的左连接实现,再通过 AJAX 请求后端接口返回数据.
全文检索:使用 Elasticsearch 搜索引擎,模仿 Google 浏览器实现对图书进行全文检索,并高亮显示出来.
其他: 基本资料修改,输入头像地址,头像可相应地改变,可修改密码.
核心代码:
function do_add() {$.ajax({type: "post",url: "/book/add",data: {"_bookId": $("#new_bookId").val(),"_bookName": $("#new_bookName").val(),"_author": $("#new_author").val(),"_press": $("#new_press").val(),"_bookDate": $("#new_bookDate").val(),"_bookType": $("#new_bookType").val(),"_bookDesc": $("#new_bookDesc").val(),"_bookImage": $("#new_bookImage").val()},success: function (data) {if (data = "OK") {alert("新书入库成功");window.location.reload();} else {alert("新书入库失败");window.location.reload();}}});
}
// 个性化推荐 MySQL语句
SELECT book.*,cnt FROM book
LEFT JOIN recommend ON recommend.bookId=book.bookId AND recommend.userId=#{userId}
LEFT JOIN (SELECT `comment`.bookId,COUNT(*) AS cnt FROM `comment` GROUP BY `comment`.bookId) as t ON t.bookId=book.bookId
LEFT JOIN (SELECT record.bookId,COUNT(*) AS num FROM record GROUP BY record.bookId) as tt ON tt.bookId=book.bookId
LEFT JOIN (SELECT recommend.bookId,SUM(clickNum) as s FROM recommend GROUP BY recommend.bookId) as ttt ON ttt.bookId=book.bookId
WHERE bookType in (SELECT myInterest FROM interest WHERE userId=#{userId})
ORDER BY clickNum DESC,cnt DESC,num DESC,s DESC
图 1 全文检索界面
图 2 图书复杂查询界面
图 3 基本资料修改界面
图 4 分页查询展示界面
4.2 后台系统
用户管理: 管理员分为管理员,超级管理员,运营人员等多种角色,那么就牵涉到权限问题,只有超级管理员才能添加和删除管理员,以及删除读者.用户管理模块实现了基本的增删改查功能以及分页展示.
历史记录: 对于网站用户的每次操作就展示在历史记录模块当中,可搜索某一年的记录,并分页展示.
图书管理: 基于 AJAX 实现的增删改查功能,并对查询功能进行了优化,可进行复杂的搜索功能.
图书分析: 按年份对每本书的借阅次数进行排序,可选择年份进行分页展示.对库存中图书类型以柱状图和饼图的形式展示出来,并显示出占比,这样管理员即可一目了然地了解图书的分类占比.
仪表盘(后台主页): 以卡片形式展示出访问量,用户量,库存量,活跃用户这四个指标.这样管理员登录后即可知悉系统现状.当然这部分由于时间关系来不及实现,后期再补上.此外,利用百度的 echarts 对每一年的每种图书类型借阅情况以折线图和饼图的形式清晰地展现出来,管理员通过观察折线图的趋势走向进行数据分析.
其他: 基本资料修改,输入头像地址,头像即可相应地及时改变.可修改密码.
核心代码:
// 分页查询 图书管理 后端代码
@ResponseBody
@GetMapping("/all")
public Object findAllBook(@RequestParam(name = "page", required = false, defaultValue = "1") int pageNum,@RequestParam(name = "limit", required = false, defaultValue = "10") int pageSize,Integer bookId, String bookName, String author, String press, String bookType, String date1, String date2) {if (!bookName.equals("#")) bookName = "%" + bookName + "%";System.out.println(bookId + " " + bookName + " " + author + " " + press + " " + bookType + " " + date1 + " " + date2);return bookService.findAllBook(pageNum, pageSize, bookId, bookName, author, press, bookType, date1, date2);
}
// 分页查询 图书管理 mybatis+pagehelper+动态查询
SELECT book.* FROM book<where><if test="bookId!=0">book.bookId=#{bookId}</if><if test="bookName!='#'.toString()">and bookName like #{bookName}</if><if test="author!='#'.toString()">and author=#{author}</if><if test="press!='#'.toString()">and press=#{press}</if><if test="bookType!='#'.toString()">and bookType=#{bookType}</if><if test="date1!='#'.toString()">and bookDate >= #{date1}</if><if test="date2!='#'.toString()">and bookDate <= #{date2}</if></where>
图 5 Dashboard 界面
图 6 图书分析界面
图 7 图书管理界面
5 总结
首先,非常感谢学院给予我们课设两周的时间,这两周和同专业的同学在机房完成任务,氛围非常好,时间也很充裕,这两周个人独立开发,coding 期间遇到问题自行 google,参考官网文档,仔细阅读官网给的 demo,在经过这两周的课设确确实实感到非常充实,也觉得在实践 coding 方面提到了很大的提升.平时上课老师讲授的是 jsp,但 Spring 官网推荐使用的模板引擎是 thymeleaf,由此我在课设前的周末花时间去了解并掌握基本语法,才发现 thymeleaf 确实比 JSP 好用,无需写 JSP 文件,而且在无网络的环境下也可运行.
由于平时接触前端的时间很少,于是想着做一个后台管理系统就不用花大部分时间去折腾前端布局而把重心放在后端.可是过了一个星期后,后台做完了还有很多时间就想着一个系统只有后台是不完整的,于是去折腾弄个前台.得益于 Layui 前端框架,前台布局很快就做好了.模仿京东商城,在每本书的展示卡片上显示了评价数,点击可进行评价.由于我希望这次的 Web 课设与上学期的数据库课设不一样,想添加些许新颖的想法,例如个性化推荐和数据可视化以及全文搜索.前台的个性化推荐基于兴趣,点击量,评论数,借阅量,出版时间进行多级排序,写 MySQL 查询语句较为复杂.后台的数据可视化是基于百度的 echarts,通过仔细阅读官网 demo 案例实现.前台的全文搜索是基于 Elasticsearch 搜索引擎,这是开源的分布式搜索引擎,并对匹配到的内容进行高亮展示,目前已实现.
这次的课设收获蛮大的.前端方面学会 ajax,jQuery,Layui,pagination,echarts,以及通过 Google 控制台 debug 前端布局.后端学会使用 Spring boot,mybatis,thymeleaf,elasticsearch,以及写复杂的 MySQL 语句并且掌握利用 postman 测试后端接口.
相关文章:

基于Java+MySQL实现(Web)图书借阅管理系统
图书借阅管理系统(前后台) 1 需求分析 图书借阅管理系统是模拟学校图书馆实现的一个具有前后台的 Web 系统.对于读者,能够提供全文检索,个性化推荐,借阅等功能.对于管理员,能够提供可视化数据分析,信息管理等功能. 2 技术栈 前端: Layui,jQuery,echarts 后端:Spring Boot,…...

SAR ADC的功耗设计
SAR ADC 由比较器、逻辑和DAC组成,功耗比可能是3:6:1,对于低功耗设计来说,我们需要尽量让DAC的功耗最小,这里来探讨一下CDAC的功耗计算方法。 CDAC从状态1切换到状态2时,需要从Vref buffer上抽拉电荷。C是状态2时连接Vref的总电容,V2就是状态2时接Vref的电容上的电压…...

PP-OCRv5
目录 PP-OCRv5官方效果如下 C封装、C#调用效果 项目 代码 下载 PP-OCRv5官方效果如下 C封装、C#调用效果 项目 代码 using Newtonsoft.Json; using OpenCvSharp; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; usi…...

nginx的一些配置的意思
1.用这个端口可以访问到nginx 2.工作进程,设置成和cpu核心数一样即可 3.每个工作进程的最大网络连接数。 4.主机名称 设置反向代理时,把server_name设置成ip。 5.反向代理进行转发,localhost指的是nginx所在的机器。 关键字proxy_pass。 …...

Agent模型微调
这篇文章讲解: 把 Agent 和 Fine-Tuning 的知识串起来,在更高的技术视角看大模型应用;加深对 Agent 工作原理的理解;加深对 Fine-Tuning 训练数据处理的理解。 1. 认识大模型 Agent 1.1 大模型 Agent 的应用场景 揭秘Agent核心…...
Android-OkHttp与Retrofit学习总结
OkHttp核心机制与工作流程 面试官:能简单介绍一下OkHttp的工作流程吗? 候选人: 好的,OkHttp的工作流程大致可以分为几个步骤。首先,我们需要创建一个OkHttpClient实例,通常会用建造者模式来配置…...
移远三款主流5G模块RM500U,RM520N,RG200U比较
文章目录 概要一、技术架构差异1. 3GPP协议版本2. 芯片平台与性能3. 频段覆盖与区域适配4. 协议增强与特殊功能 二、功能与应用定位1. 网络兼容性2. 封装与接口扩展 三、典型应用场景总结 概要 本文介绍下移远两款主流5G模块RM500U RM520N RG200U。 一…...
C++引用以及和指针的区别
C++ 引用 引用(reference)是 C++ 中的一种变量类型,是另一个变量的别名。一旦引用被初始化,就不能再改变它所指向的对象。 引用的特点 必须初始化:声明引用时必须立即对其进行初始化。不可更改绑定:一旦引用绑定到某个变量,就不能再指向其他变量。语法简洁:使用引用不…...
firfox 国外版和国内版本账号不互通问题处理
https://blog.csdn.net/sinat_37891718/article/details/147445621 现在国际服的火狐浏览器修改使用国内的账号服务器,需要先在搜索框输入about:config 中改变三项配置,然后重启浏览器,才能正常使用国内的火狐账号服务器 identity.fxaccount…...

Linux基本指令篇 —— whoami指令
whoami 是 Linux 和 Unix 系统中一个简单但实用的命令,全称 Who Am I(我是谁)。它的功能是显示当前登录用户的用户名。以下是关于 whoami 的详细解析: 目录 1. 基本用法 2. 命令特点 3. 实际应用场景 场景 1:脚本中…...
用go从零构建写一个RPC(3)--异步调用+多路复用实现
在前两个版本中,我们实现了基础的客户端-服务端通信、连接池、序列化等关键模块。为了进一步提升吞吐量和并发性能,本版本新增了 异步发送机制 和 多路复用支持,旨在减少资源消耗、提升连接利用率。 代码地址:https://github.com/…...

力扣395做题笔记
题目链接 力扣395 第一次尝试 class Solution {public int longestSubstring(String str, int k) {char[] s str.toCharArray();int n s.length;int[] cnts new int[256];int ans 0;for (int r 0, l 0; r < n; r ) { cnts[s[r]];if (cnts[s[r]] > k) { ans Mat…...
Python-numpy中常用的统计函数及转换函数
numpy中常用的统计函数 numpy中常用统计函数numpy普通统计函数忽略 NaN 值进行统计百分位数 numpy中形状转换函数重塑数组(reshape)展平数组(flatten/ravel)转置(transpose/T) 数据类型的转换使用astype()转…...
【C语言干货】free细节
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、为啥*phead free掉了之后,为啥下面还 提示:以下是本篇文章正文内容,下面案例可供 可以用? 前言参考 一、为…...
网络安全-等级保护(等保) 2-0 等级保护制度现行技术标准
################################################################################ 第二章:现行等保标准要求,通过表格方式详细拆分了等保的相关要求。 GB 17859-1999 计算机信息系统 安全保护等级划分准则【现行】 GB/T22240-2020 《信息安全技术 网…...

WebSocket(看这一篇就够了)
文章目录 WebSocket 基本概念什么是WebSocket?为什么需要 WebSocket?与 HTTP 协议的区别WebSocket协议的原理WebSocket工作流程WebSocket 数据帧结构和控制帧结构。JavaScript 中 WebSocket 对象的属性和方法,以及如何创建和连接 WebSocket。webSocket简…...

旧物回收小程序:让闲置焕发光彩,为生活增添价值
你是否常常为家中堆积如山的闲置物品而烦恼?那些曾经心爱的物品,如今却成了占据空间的“鸡肋”,丢弃可惜,留着又无处安放。别担心,一款旧物二手回收小程序将为你解决这一难题,让闲置物品重新焕发光彩&#…...
精益数据分析(73/126):黏性阶段的功能优先级法则——七问决策模型与风险控制
精益数据分析(73/126):黏性阶段的功能优先级法则——七问决策模型与风险控制 在创业的黏性阶段,如何从海量的功能创意中筛选出真正能提升用户留存的关键改动?今天,我们结合《精益数据分析》中的“开发功能…...
React声明式编程(手动控制,大型项目,深度定制)与Vue响应式系统(自动优化,中小型项目,快速开发)区别
文章目录 React声明式与Vue响应式区别详解一、响应式机制原理对比1.1 Vue的响应式系统Vue响应式流程图Vue响应式代码示例 1.2 React的声明式更新React声明式流程图React声明式代码示例 二、更新触发逻辑差异2.1 Vue的自动更新Vue依赖收集机制 2.2 React的手动更新React Diff算法…...

数学建模MathAI智能体-2025电工杯A题实战
题目: 光伏电站发电功率日前预测问题 光伏发电是通过半导体材料的光电效应,将太阳能直接转化为电能的技术。光伏电站是由众多光伏发电单元组成的规模化发电设施。 光伏电站的发电功率主要由光伏板表面接收到的太阳辐射总量决定,不同季节太阳…...
跨平台游戏引擎 Axmol-2.6.0 发布
Axmol 2.6.0 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 🙏感谢所有贡献者及财务赞助者:scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 相对于2.5.0版本的重要变更: 通…...

C# Windows Forms应用程序-002
目录 项目结构 主类和命名空间 构造函数和析构函数 初始化组件 (InitializeComponent) 按钮点击事件处理程序 主程序入口点 项目截图: 完整代码: 项目结构 这个项目是一个简单的C# Windows Forms应用程序,获取指定文件的根信息…...

理解计算机系统_线程(八):并行
前言 以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续理解计算机系统_并发编程(10)_线程(七):基于预线程化的…...

【MySQL】09.索引
索引是用来提高数据库的性能的,但查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值在于提高一个海量数据的检索速度。 1. 认识磁盘 MySQL 给用户提供存储服务,而存储的都是数据&…...

【备忘】 windows 11安装 AdGuardHome,实现开机自启,使用 DoH
windows 11安装 AdGuardHome,实现开机自启,使用 DoH 下载 AdGuardHome解压 AdGuardHome启动 AdGuard Home设置 AdGuardHome设置开机自启安装 NSSM设置开机自启重启电脑后我们可以访问 **http://127.0.0.1/** 设置使用 AdGuardHome DNS 效果图 下载 AdGua…...

[Windows] 游戏常用运行库- Game Runtime Libraries Package(6.2.25.0409)
游戏常用运行库 合集 整合了许多游戏会用到的运行库,支持 Windows XP – Windows 11 系统,并且支持自动检测系统勾选推荐的运行库,方便快捷。 本版特点: By:mefcl 整合常见最新游戏所需运行库 根据系统自动勾选推荐…...
MYSQL order 、group 与row_number详解
一、order by order by A ASC, B DESC,C ASC … 上述语句会先按照A排序,当A相同的时候再按照B排序,当B相同的再按照C排序,并会不按照ABC组合一起排序 二、group by group by A,B,C… select 中的字段必须是group by中的字段,…...
QT之巧用对象充当信号接收者
备注:以下仅为演示不代表合理性,适合简单任务,逻辑简单、临时使用,可保持代码简洁,对于复杂的任务应创建一个专门的类来管理信号和线程池任务. FileScanner类继承QObject和QRunnable,扫描指定目录下的文件获…...
《红警2000》游戏信息
游戏背景:与《红色警戒》系列的其他版本类似,基于红警 95 的背景设定,讲述了第二次世界大战期间,世界各国为了争夺全球霸权而展开战争。游戏画面与音效:在画面上相比早期的红警版本有一定提升,解析度更高&a…...
Vue3 + ThinkPHP8 + PHP8.x 生态与 Swoole 增强方案对比分析
一、基础方案:Vue3 ThinkPHP8 PHP8.x 传统架构 优点 成熟稳定 组合经过长期验证,文档和社区资源丰富ThinkPHP8 对PHP8.x有良好支持,性能比PHP7提升20-30% 开发效率高 TP8的ORM和路由系统大幅减少样板代码Vue3组合式API Vite开发…...