第七章:借阅管理【基于Servlet+JSP的图书管理系统】

借阅管理

在这里插入图片描述

1. 借书卡

1.1 查询借书卡

  借书卡在正常的CRUD操作的基础上,我们还需要注意一些特殊的情况。查询信息的时候。如果是管理员则可以查询所有的信息,如果是普通用户则只能查看自己的信息。这块的控制在登录的用户信息

在这里插入图片描述

然后就是在Dao中处理的时候需要考虑根据当前登录用户查询的操作

@Override
public List<BorrowCard> listPage(PageUtils pageUtils,SysUser user) {
    QueryRunner queryRunner = MyDbUtils.getQueryRunner();
    String sql = "select * from t_borrow_card where 1 = 1";
    if(StringUtils.isNotEmpty(pageUtils.getKey())){
        sql += " and stuname like '%"+pageUtils.getKey()+"%'  ";
    }
    if(user != null && user.getIsAdmin() == false){
        // 不是管理员
        sql += " and stuid =  " + user.getId();
    }
    sql += " limit ?,? ";
    // 计算 分页开始的位置
    int startNo = pageUtils.getStart();
    try {
        return queryRunner.query(sql
                ,new BeanListHandler<BorrowCard>(BorrowCard.class),startNo,pageUtils.getPageSize());
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    return null;
}

@Override
public int count(PageUtils pageUtils, SysUser user) {
    QueryRunner queryRunner = MyDbUtils.getQueryRunner();
    String sql = "select count(1) from t_borrow_card where 1 = 1 ";
    if(StringUtils.isNotEmpty(pageUtils.getKey())){
        sql += " and stuname like '%"+pageUtils.getKey()+"%'  ";
    }
    if(user != null && user.getIsAdmin() == false){
        // 不是管理员
        sql += " and stuid =  " + user.getId();
    }
    try {
        return queryRunner.query(sql, new ResultSetHandler<Integer>() {
            @Override
            public Integer handle(ResultSet resultSet) throws SQLException {
                resultSet.next();
                return resultSet.getInt(1);
            }
        });
    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
    return 0;
}

效果:

在这里插入图片描述

在这里插入图片描述

1.2 分配借书卡

  分配借书卡就是对借书卡的添加和更新的操作。在这块我们需要注意的地方一个是需要查询所有的学生信息

在这里插入图片描述

然后使用到layerDate这个日期时间的插件

在这里插入图片描述

然后在Servlet中获取到的是特定格式的字符串,我们需要自定义转换的方法来处理。

public class DateUtils {

    public static final String DATE_PARTTERN1 = "YYYY-MM-DD hh:mm:ss";

    /**
     * 字符串转换为Date类型
     * @param msg
     * @param parttern
     * @return
     */
    public static Date stringToDate(String msg,String parttern){
        SimpleDateFormat format = new SimpleDateFormat(parttern);
        try {
            return format.parse(msg);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return new Date();
    }
}

就可以完成添加和更新的处理

在这里插入图片描述

1.3 下架处理

  当借书卡还没过期的情况下。管理员想要终止这个借书卡的使用。那么可以做下架的处理,下架的本质是修改state的状态为3.
在这里插入图片描述

2. 图书展示

  图书展示是给学员查看的,方便学生根据不同的类型快速查找到对应的书籍信息,并且完成相关的借阅操作。

2.1 标签页

  需要根据不同的类别展示不同的图书信息。那么这块我们通过bootstrap中提供的标签来实现。

在这里插入图片描述

在这块我们需要注意相关CSS属性的处理

在这里插入图片描述

动态管理ID信息,ID和类别的ID绑定。

在这里插入图片描述

然后就给对应的标签页绑定对应的点击事件,同时随着我们的点击会给tab-pane添加对应的active的class属性

$(".tabs-container .nav-tabs li").click(function(){
    var href = $(this).children()[0].href
    // 做字符串的截取操作
    var aId = href.substring(href.lastIndexOf('tab-'),href.length);

    // 先给所有的 class= tab-pane 的都移除掉 active 属性
    $(".tab-pane").removeClass('active')
    // 然后单独给当前点击的添加 active 属性
    $("#"+aId).addClass("active")
})

然后就是在页面第一次加载的时候我们需要给第一个标签也做选中和加载active属性的行为

function initTab(){
    var li = $(".tabs-container .nav-tabs").children()[0];
    $(li).addClass('active')
    var href = $($(".tabs-container .nav-tabs").children()[0]).children()[0].href
    // 做字符串的截取操作
    var aId = href.substring(href.lastIndexOf('tab-'),href.length);
    // 先给所有的 class= tab-pane 的都移除掉 active 属性
    $(".tab-pane").removeClass('active')
    // 然后单独给当前点击的添加 active 属性
    $("#"+aId).addClass("active")
}

具体的效果如下:

在这里插入图片描述

2.2 图书信息

  我们添加标签页的目的是更好的展示图书信息。所以在查询数据类型的时候我们需要同步的查询类型对应的书籍信息。首先在图书类型的bean中关联设置了对应的属性

@Data
public class BookType {

    private Integer id;
    private String name;
    private String notes;
    private Date createtime;

    private List<Book> books; // 当前类型对应的图书信息
}

然后在Servlet中添加了对应的处理

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 查询所有的类别信息
    List<BookType> list = typeService.list();
    if(list != null && list.size() > 0){
        // 遍历 每个类型 查询对应的 图书信息
        for (BookType type : list) {
            Book book = new Book();
            book.setTypeid(type.getId());
            List<Book> books = bookService.list(book);
            type.setBooks(books);
        }
    }
    req.setAttribute("list",list);
    req.getRequestDispatcher("/book/book/showBook.jsp").forward(req,resp);
}

最后在页面中循序处理展示图书信息

<div class="tab-content">
    <c:forEach  items="${list}" var="entity">
        <div id="tab-${entity.id}" class="tab-pane">
            <div class="panel-body">
                <div class="row">
                    <c:forEach items="${entity.books}" var="book">
                        <div class="col-sm-4">
                            <div class="contact-box">
                                <div class="col-sm-4">
                                    <div class="text-center">
                                        <img alt="image" class="m-t-xs img-responsive"
                                             src="/sys/downloadServlet?fileName=${book.img}">
                                        <div class="m-t-xs font-bold">CTO</div>
                                    </div>
                                </div>
                                <div class="col-sm-8">
                                    <h3><strong>${book.name}</strong></h3>
                                    <p><i class="fa fa-map-marker"></i> ${book.author}</p>
                                    <address>
                                        <strong>${book.price}</strong><br>
                                        ${book.publish}<br>
                                        Weibo:<a href="">${book.notes}</a><br>
                                        <abbr title="Phone">Tel:</abbr> (123) 456-7890
                                    </address>
                                </div>
                                <div class="clearfix"></div>
                            </div>
                        </div>
                    </c:forEach>
                </div>
            </div>
        </div>
    </c:forEach>

具体效果为:

在这里插入图片描述

然后可以对展示的图书的信息做出相关的调整和优化

在这里插入图片描述

3.借书功能

在这里插入图片描述

  借阅数据的数据会存储在t_borrow_recoder这张表中,那么与之对应就需要完成对应的后端CRUD的基础功能

在这里插入图片描述

然后在借阅图书的时候我们需要先判断当前登录的用户是否有可以使用的借书卡,如果才能借阅,否则提示不能借阅

// 借阅书籍的方法
function goBorrowing(bookId){
    // 判断是否有 可用的借书卡
    $.get("/book/borrowCardServlet?action=checkHaveCard",function(data){
        console.log("data",data);
    })
}
/**
 * 检查当前登录的用户是否有可用的借书卡
 * @param req
 * @param resp
 * @throws Exception
 */
public void checkHaveCard(HttpServletRequest req, HttpServletResponse resp) throws Exception {
    List<BorrowCard> list = service.listCanUseCard(getCurrentLoginUser(req,resp).getId());
    String msg = "error";
    if(list != null && list.size() > 0){
        msg = "ok";
    }
    PrintWriter writer = resp.getWriter();
    writer.write(msg);
    writer.flush();
}

操作的效果如下:

在这里插入图片描述

4.借阅管理

  学生借阅了相关的图书后。可以查看所有借阅信息。同时可以做出归还的操作。这块管理员可以看到所有的数据。但是不能归还,普通的学员只能看到自己的借阅记录。没有归还的图书可以做出归还的操作。

在这里插入图片描述

在这里插入图片描述

在后台代码中的处理核心

在这里插入图片描述

在这里插入图片描述

展示数据的时候。注意按钮的操作

在这里插入图片描述

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

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

相关文章

Linux 挂载局域网内共享目录

Linux 挂载局域网内共享目录 1、安装samba服务端2、samba服务端配置3、添加samba服务访问账户4、防火墙5、重启服务6、windows访问7、linux访问 1、安装samba服务端 sudo apt-get install -y samba yum install -y samba2、samba服务端配置 vim /etc/samba/smb.conf在文档尾部…

按钮权限控制

搜索关键字&#xff1a; 自定义指令传参| "自定义指令""dataset"|自定义指令dataset| "Vue""directives"|vue按钮权限实现 1、完整代码&#xff1a; <template> <div> <el-breadcrumb separator-class"el-icon…

常见前端面试之VUE面试题汇总五

13. assets 和 static 的区别 相同点&#xff1a; assets 和 static 两个都是存放静态资源文件。项目中所 需要的资源文件图片&#xff0c;字体图标&#xff0c;样式文件等都可以放在这两个文件 下&#xff0c;这是相同点 不相同点&#xff1a;assets 中存放的静态资源文件在…

IoTDB 集群环境搭建

什么是IoTDB IoTDB&#xff08;Internet of Things Database&#xff09;是一个专门设计用于存储和管理大规模物联网&#xff08;IoT&#xff09;数据的开源时序数据库系统。它专注于高效地存储、查询和分析时间序列数据&#xff0c;特别适用于物联网应用中的大量实时数据。 Io…

视频云存储平台EasyCVR视频汇聚平台关于机电设别可视化管理平台可实施设计方案

随着工业化进程的不断发展&#xff0c;机电设备在各行各业中扮演着重要的角色。然而&#xff0c;由于机电设备种类繁多、数量庞大&#xff0c;包括生产机械、建筑器械、矿用器械、制药器械、食品机械等&#xff0c;传统的手动管理方式已经无法满足对设备进行精细化管理的需求。…

Linux知识点 -- Linux多线程(三)

Linux知识点 – Linux多线程&#xff08;三&#xff09; 文章目录 Linux知识点 -- Linux多线程&#xff08;三&#xff09;一、线程同步1.概念理解2.条件变量3.使用条件变量进行线程同步 二、生产者消费者模型1.概念2.基于BlockingQueue的生产者消费者模型3.单生产者单消费者模…

一篇文章告诉你,为什么要使用Javascript流程图来可视化进程?(下)

DHTMLX Diagram库是有各种类型的图组成的&#xff0c;其中最广泛使用的是JavaScript流程图&#xff0c;它可以显示任何类型的的工作流、过程或系统&#xff0c;您可以下载DHTMLX Diagram的评估版并亲自试用。 在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0…

动态规划之路径问题

路径问题 1. 不同路径&#xff08;medium&#xff09;2. 不同路径II&#xff08;medium&#xff09;3. 礼物最大值&#xff08;medium&#xff09;4. 下降路径最小和&#xff08;medium&#xff09;5. 最⼩路径和&#xff08;medium&#xff09;6. 地下城游戏&#xff08;hard&…

7.elasticsearch同步工具-logstah

1.logstah Logstash 是一个用于数据处理和转换的开源工具&#xff0c;它可以将来自不同源头的数据收集、转换、过滤&#xff0c;并将其发送到不同的目标。Logstash 是 ELK&#xff08;Elasticsearch、Logstash 和 Kibana&#xff09;技术栈的一部分&#xff0c;通常与 Elastics…

实验篇——Ka/Ks分析

实验篇——Ka/Ks分析 文章目录 前言一、名词解释二、实操1. 安装软件2. 准备文件3. 使用ParaAT2.0 KaKs_Calculator2.04. 使用TBtools软件 三、额外总结 前言 鉴定不同基因的复制模式 本文得到的共线性基因对文件 来自于上一篇文章中的LIN.collinearity共线性文件 参考文章&…

设计模式(3)抽象工厂模式

一、概述&#xff1a; 1、提供一个创建一系列相关或相互依赖对象的接口&#xff0c;而无须指定它们具体的类。 2、结构图&#xff1a; 3、举例代码&#xff1a; &#xff08;1&#xff09; 实体&#xff1a; public interface IUser {public void insert(User user);public…

C++--动态规划两个数组的dp问题

1.最长公共子序列 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串…

Java 实现 国密SM4/ECB/PKCS7Padding对称加密解密

Java 实现 国密SM4/ECB/PKCS7Padding对称加密解密&#xff0c;为了演示方便本问使用的是IntelliJ IDEA 2022.1 (Community Edition)来构建代码的 1、pom.xml文件添加需要的jar <?xml version"1.0" encoding"UTF-8"?> <project xmlns"htt…

分布式事务(4):两阶段提交协议与三阶段提交区别

1 两阶段提交协议 两阶段提交方案应用非常广泛&#xff0c;几乎所有商业OLTP数据库都支持XA协议。但是两阶段提交方案锁定资源时间长&#xff0c;对性能影响很大&#xff0c;基本不适合解决微服务事务问题。 缺点&#xff1a; 如果协调者宕机&#xff0c;参与者没有协调者指…

SpringBoot 01 如何创建 和pom的解析

目录 1 Springboot的创建 步骤 2 项目的书写和运行 创建service包并在其下写一个service文件 项目的运行 pom文件的一些配置 parent web test 打包 打包过程 1 Springboot的创建 步骤 首先new一个新项目 然后依照如下创建 2 项目的书写和运行 创建service包并…

python接口自动化测试框架2.0,让你像Postman一样编写测试用例,支持多环境切换、多业务依赖、数据库断言等

项目介绍 接口自动化测试项目2.0 软件架构 本框架主要是基于 Python unittest ddt HTMLTestRunner log excel mysql 企业微信通知 Jenkins 实现的接口自动化框架。 前言 公司突然要求你做自动化&#xff0c;但是没有代码基础不知道怎么做&#xff1f;或者有自动化…

nginx基于端口如何配置虚拟主机

在 Nginx 中配置基于端口的虚拟主机&#xff08;也称为服务器块&#xff09;与配置基于域名的虚拟主机类似&#xff0c;但是你需要指定监听的端口。以下是基于端口的虚拟主机配置示例&#xff1a; 假设我们要配置两个不同的虚拟主机&#xff0c;一个监听 8080 端口&#xff0c…

vcomp140.dll丢失的修复方法分享,电脑提示vcomp140.dll丢失修复方法

今天&#xff0c;我的电脑出现了一个奇怪的问题&#xff0c;打开某些程序时总是提示“找不到vcomp140.dll文件”。这个问题让我非常头疼&#xff0c;因为我无法正常使用电脑上的一些重要软件。为了解决这个问题&#xff0c;我在网上查找了很多资料&#xff0c;并尝试了多种方法…

亮点!视频云存储/安防监控视频智能分析平台高空抛物AI智能检测

一、行业现状 近年来&#xff0c;高空抛物不文明事件频频发生&#xff0c;成为小区住宅的管理通病&#xff0c;也给居民的人身及财产安全带来了巨大伤害和损失。高空抛物可能导致人身事故等重大经济损失的严重危害&#xff0c;被称作“悬在城市上空的痛”。 TSINGSEE青犀AI智…

算法练习- 其他算法练习5

文章目录 宜居星球改造计划 宜居星球改造计划 yes no na 每个值为一个格子&#xff1b;每天yes的值可以向上下左右扩展一个格子&#xff0c;将no改为yes&#xff1b;矩形区域no是否可以全部转为yes&#xff0c;可以的话需要几天&#xff1f;不可以的话输出-1输入&#xff1a; …