【Django】第三课 基于Django图书借阅管理网站平台

news2024/11/17 8:49:17

概念

本文在上一篇文章之上,完成借阅图书功能,查看借阅记录功能,归还图书,查看历史借阅记录,删除历史借阅记录等等

借阅图书功能实现

当前学生查阅图书的时候,如果当前学生没有借阅过该书,或者以前借阅过但已归还的情况下,该页面的按钮为蓝色,表示还可以进行借阅,如果该学生之前借阅过该书,但一直没有归还图书,则该按钮显示为红色,则不允许再借此图书。

 当学生点击该按钮进行借阅图书的时候,将该图书的书籍编号id发送给服务器,请求地址为: /addUserBookInfo

那么urls.py文件中需定义接收匹配该地址请求

path('addUserBookInfo/',views.addUserBookInfo),

并将接收的请求转发给views.py文件进行处理

def addUserBookInfo(request):
    id=request.GET["bookid"]
    # 根据当前登录的学生的学号和图书id查询借阅记录表的借阅状态
    infos = UserBookInfo.objects.filter(number=student[0].id, bookId=id)
    # 如果未查询到,则状态为0,表示未借阅,1表示已借阅,2表示已归还
    state = infos[0].state if infos else 0
    # 获得当前实时时间
    year=time.strftime("%Y",time.localtime())
    month=time.strftime("%m",time.localtime())
    day=time.strftime("%d",time.localtime())
    hour=time.strftime("%H",time.localtime())
    minute=time.strftime("%M",time.localtime())
    second=time.strftime("%S",time.localtime())
    dt=f"{year}年{month}月{day}日 {hour}:{minute}:{second}"
    if state == 0:
        # 表示该学生没有借阅过该书籍,则添加借阅记录
        UserBookInfo.objects.create(number=student[0].number,bookId=id,startDate=dt,endDate="",state=1)
    elif state == 2:
        # 表示该学生借阅过该书籍,并且也归还了
        UserBookInfo.objects.create(number=student[0].number, bookId=id, startDate=dt, endDate="", state=1)
    return HttpResponseRedirect("/bookInfo/?bookid="+id)

根据当前学生学号和图书id作为查询条件查询借阅信息记录表,查询当前学生对该图书的借阅状态,如果未查询到,则添加该学生对这本书的借阅信息,如果状态为2说明该学生以前借阅过该图书且归还了,因此继续借阅该图书,也需要添加对该图书的借阅信息,借阅时间

当借阅成功后,借阅按钮则会显示为红色,表示借阅成功,在未归还之前,不允许当前学生在对该书进行重复借阅。

查询借阅信息功能实现

登录成功后,点击头部的“我的借阅”可以查看该学生的借阅的所有图书

当点击“我的借阅”时,向服务器发出请求地址: /MyJY/

urls.py

path('MyJY/',views.MyJY),

 views.py,从数据库中查询借阅状态为1的当前学生的借阅信息

def MyJY(request):
    # 从借阅信息表中查询当前学生借阅的所有书籍信息,根据状态为1的借阅状态
    jList=UserBookInfo.objects.filter(number=student[0].number,state=1).values()
    if jList:
        for j in jList:
            book=Book.objects.get(id=j["bookId"])
            j["image"]="img/"+str(book.image)
            j["bookName"]=book.bookName
            j["bookAddress"]=book.bookAddress
    return render(request,"myJYInfo.html",{"jList":jList,"student":student[0]})
myJYInfo.html的页面代码如下
<!DOCTYPE html >
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>我的借阅</title>
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'css/css1.css' %}">

    <style type="text/css">
        #con {
            width: 900px;
            margin: 10px auto;
        }

        #m_content {
            width: 100%;
        }

        #m_content table {
            text-align: center;
            font-size: 16px;
        }

        #m_content table tr {
            width: 100%;
        }

        #m_content table tr td {
            width: 20%;
            padding: 10px;
        }
    </style>
    <script type="text/javascript">
        function td_(id) {
            var is = confirm("是否需要归还当前书籍?");
            //将借阅的id发送给服务端
            if (is) {
                location.href = "/updateJYInfo/?id=" + id;
            }
        }
    </script>
</head>
<body>
<div id="con">
    <!-- 头部 -->
    {% include "top.html" with stu=student %}
    <!-- 内容 -->
    <div id="m_content">
        <table>
            <tr>
                <td>书籍封面</td>
                <td>书籍名称</td>
                <td>出版社</td>
                <td>借书日期</td>
                <td>状态</td>
            </tr>
            {% if jList %}
                {% for foo in jList %}
                    <tr>
                        <td><img src="{% static foo.image %}">
                        </td>
                        <td>{{ foo.bookName }}</td>
                        <td>{{ foo.bookAddress }}</td>
                        <td>{{ foo.startDate }}</td>
                        <td onclick="td_({{ foo.id }})"><font
                                color="red">借阅中</font>
                        </td>
                    </tr>
                {% endfor %}
            {% else %}
                <p>当前没有借阅的书籍</p>
            {% endif %}

        </table>
    </div>
    <!-- 底部 -->
    {% include "foot.html" %}
</div>
</body>
</html>

其效果图如下

当读者点击“借阅中”,则可以将当前借阅的图书进行归还

 

当点击确定后,将该借阅信息的主键id发送给服务器,请求地址为: /updateJYInfo/

 urls.py

path('updateJYInfo/',views.updateJYInfo),

views.py

def updateJYInfo(request):
    id=request.GET["id"]
    # 根据借阅信息id归还图书,修改借阅信息表的借阅状态为2
    info=UserBookInfo.objects.filter(id=id)
    # 获得当前实时时间
    year = time.strftime("%Y", time.localtime())
    month = time.strftime("%m", time.localtime())
    day = time.strftime("%d", time.localtime())
    hour = time.strftime("%H", time.localtime())
    minute = time.strftime("%M", time.localtime())
    second = time.strftime("%S", time.localtime())
    dt = f"{year}年{month}月{day}日 {hour}:{minute}:{second}"
    info.update(state=2,endDate=dt)
    return redirect(MyJY)

将借阅状态从1变为2即可归还图书

查看历史记录功能实现

点击“历史记录”给服务器发送请求地址,/hisInfo/

 urls.py

path('hisInfo/',views.hisInfo),

views.py

def hisInfo(request):
    jList = UserBookInfo.objects.filter(number=student[0].number, state=2).values()
    if jList:
        for j in jList:
            book = Book.objects.get(id=j["bookId"])
            j["image"] = "img/" + str(book.image)
            j["bookName"] = book.bookName
            j["bookAddress"] = book.bookAddress
    return render(request, "hisInfo.html", {"jList": jList,"student":student[0]})

将该学生所借阅归还了的图书信息查询出来,显示在历史记录页面中,其页面代码如下

<!DOCTYPE html >
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>历史记录</title>
    {% load static %}
    <link rel="stylesheet" type="text/css" href="{% static 'css/css1.css' %}">
    <style type="text/css">
        #con {
            width: 900px;
            margin: 10px auto;
        }

        #m_content {
            width: 100%;
        }

        #m_content table {
            text-align: center;
            font-size: 16px;
        }

        #m_content table tr {
            width: 100%;
        }

        #m_content table tr td {
            width: 20%;
            padding: 10px;
        }

        input{
            width: 60px;
            border-radius: 5px;
            border-width: 0px;
            background-color: #FF1719;
            color: white;
            padding: 5px;
        }
    </style>
    <script type="text/javascript">
        function td_(id) {
            var is = confirm("是否需要删除该书籍?");
            //将历史记录的id发送给服务端
            if (is) {
                location.href = "/deleteBookInfo/?id=" + id;
            }
        }
    </script>
</head>
<body>
<div id="con">
    <!-- 头部 -->
    {% include "top.html" with stu=student %}
    <!-- 内容 -->
    <div id="m_content">
        <table>
            <tr>
                <td>书籍封面</td>
                <td>书籍名称</td>
                <td>借书日期</td>
                <td>归还日期</td>
                <td>操作</td>
            </tr>
            {% if jList %}
                {% for foo in jList %}
                    <tr>
                        <td><img src="{% static foo.image %}">
                        </td>
                        <td>{{ foo.bookName }}</td>
                        <td>{{ foo.startDate }}</td>
                        <td>{{ foo.endDate }}</td>
                        <td><input type="button" onclick="td_({{ foo.id }})" value="删除"></td>
                        </td>
                    </tr>
                {% endfor %}
            {% else %}
                <p>当前没有借阅的书籍</p>
            {% endif %}
        </table>
    </div>
    <!-- 底部 -->
    {% include "foot.html" %}
</div>
</body>
</html>

其界面效果图如下

删除历史借阅记录功能

当点击历史记录中的删除按钮时,弹出提示对话框,提醒是否要删除该借阅历史记录,如果删除则想服务器发送请求,并将给借阅记录信息id发送给服务器,请求地址为 /deleteBookInfo/

 urls.py

path('deleteBookInfo/',views.deleteBookInfo)

 views.py

def deleteBookInfo(request):
    id=request.GET["id"]
    # 根据借阅信息id,删除该借阅记录
    info=UserBookInfo.objects.filter(id=id)
    info.delete()
    return redirect(hisInfo)

删除成功后,会自动刷新历史记录页面

总结

该项目到这里就结束了,读者可自行在本项目的功能基础上进行完善或者扩充功能。

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

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

相关文章

H5U PLC本地脉冲轴和本地编码器轴测试

H5U PLC如何通过EtherCAT总线控制伺服运动,请参看下面的博客 汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_RXXW_Dor的博客-CSDN博客首先我们看下系统硬件和软件配置:汇川H5U PLC的编程软件是:AutoShop V4.6.3.0 硬件:PLC H5U-1614MTD-A16,汇川伺服型号:SV660NS1R6I…

nacos看这一篇文章就够了

第一章 nacos简介 1 2 3 4 5 6 7 8Nacos主要帮助我们发现、注册、配置和管理微服务1. 注册中心功能(Dubbo或者SpringCloud介绍) 2. 配置中心功能 3. 服务管理功能(Dubbo或者SpringCloud介绍)官网地址: https://nacos.io/zh-cn/index.html第二章 nacos环境 1 2 3 4 51. nacos 依…

【HTML】再见2022!一起来写一个响应式跨年倒计时吧!(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【信息学CSP-J近16年历年真题64题】真题练习与解析 第10题之公交换乘

描述 著名旅游城市 B 市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交 车的优惠方案: 在搭乘一次地铁后可以获得一张优惠票,有效期为 45 分钟,在有效期内可以 消耗这张优惠票,免费搭乘一次票价不超过地铁票价的公交车。在有效期内指 开始乘公交车的时间与开…

结合商业项目深入理解Go知识点

这篇文章比较硬核&#xff0c;爆肝5千字&#xff0c;把之前整理的知识点都串起来了。建议先收藏&#xff0c;慢慢看。 前言 上一篇文章 #【Go WEB进阶实战】开源的电商前后台API系统 很受大家欢迎&#xff0c;有好多小伙伴私信我问题&#xff1a;“gtoken真不错&#xff0c;能…

【SpringBoot应用篇】SpringBoot使用Aspect AOP注解实现日志管理(增强版)

【SpringBoot应用篇】SpringBoot使用Aspect AOP注解实现日志管理&#xff08;增强版&#xff09;pomLog实体类OperateLogOrderGoodLogAspect转换器ConvertGoodConvertOrderConvertAopController启动类EnableAutoOperateLog需求: 需要保存的日志内容在方法的参数中&#xff0c;并…

Elasticsearch 谷歌插件 Elasticsearch-head 使用

目录 什么是Elasticsearch-head 安装 ​编辑界面 ​编辑集群健康值的几种状态如下 解决跨域问题 基本使用 创建索引 点击概览 点击数据浏览 什么是Elasticsearch-head ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#x…

js的Date对象

Date 对象用于处理日期与时间。可以通过 new 关键词来定义 Date 对象。 有四种方式初始化日期: new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);实例化例子&#xff1a; var …

gitlab-ci.yml关键字(二)(全局)default、stages

default 这是一个全局关键字&#xff0c;可以在全局设置某些关键字的的默认值&#xff0c;如果在job中没有定义该关键字的值&#xff0c;那么就会使用全局设置的默认值 示例 default:image: ruby:3.0rspec:script: bundle exec rspecrspec 2.7:image: ruby:2.7script: bundl…

LeetCode 598 范围求和Ⅱ

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个 m x n 的矩阵 M &#xff0c;初始化时所有的 0 和一个操作数组 op &#xff0c;其中 ops[i] [ai, bi] 意味着当所有的0 < x < ai和 0 < y < bi 时&am…

力扣——环形链表

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 这个题是要求我们判断链表是否存在环&#xff0c;有则返回环开始的结点&#xff0c;没有则返回一个NULL&#xff1b; 废话就不说了&#xff0c;直入主题&#xff1a; /*** Definition for singly-linked list.* str…

代码快一点~生活慢一点~【python性能调试工具分享】

背景1 天下武功&#xff0c;为快不破&#xff01; 上学的时候&#xff0c;有些人考试半小时就已经把卷子写完了。有些人还没写完。 工作的时候&#xff0c;有些人一天就能把活干完了&#xff0c;有些人还没开始。 写论文的时候&#xff0c;有些人代码都写完了&#xff0c;数…

ospf不规则区域实验

r11&#xff0c;r3为运行商&#xff0c;要求全网可达 首先现在r13上配置ospf 然后配置一条缺省路由并且下发路由 抓取流量 [r13]acl 2000 [r13-acl-basic-2000]rule permit source any [r13]int g0/0/1 [r13-GigabitEthernet0/0/1]nat outbound 2000 下一步实现ospf100 里面…

Ant Design入门

目录 一&#xff1a;什么是Ant Design&#xff1f; 二&#xff1a;开始使用 三&#xff1a;布局 四&#xff1a;表格 一&#xff1a;什么是Ant Design&#xff1f; Ant Design是阿里蚂蚁金服团队基于React开发的ui组件&#xff0c;主要用于中后台系统的使用。 官网&#x…

【技术】5G技术的应用场景及发展趋势

5G是具有高速率、低时延和大连接特点的新一代宽带移动通信技术。5G系统基于大带宽和大规模天线方案&#xff0c;能实现亚米级高精度定位。 据《5G经济社会影响白皮书》可知&#xff0c;按照2020年5G才大规模商用算起&#xff0c;预计2020年至2025年期间&#xff0c;中国5G发展将…

抓包工具wiresharke及抓包流程

背景&#xff1a;公司的系统在生产环境运行一段时间之后&#xff0c;通过skywalking监控工具发现时不时会有接口调用耗时很长的情况出现。且监控到的数据和华为云ELB的监控日志不匹配&#xff0c;为了验证是否是由华为云ELB转发延迟导致&#xff0c;决定在生产上抓包验证&#…

【应用】博图SCL语言之抢答器应用

使用博图的SCL语言来完成多人抢答器的应用案例。 文章目录 目录 文章目录 前言 一、控制要求和I/O分配 1.控制要求 2.I/O分配 3.具体场景 二、编写 1.建立变量 2.编写 1.四路抢答器互锁 2.抢答提示指示灯 3.提前抢答和超时不抢答 4.完善 三、效果 1.仿真效果 2.虚拟工厂效果 …

IPO OC 系列模拟信号隔离转换模块0-1mA /0-10mA/0-20mA/ 4-20mA/0-75mV/0-2.5V/0-5V/0-10V

概述 IPO OC 系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要电量隔离测控的行业。该模块内部嵌入了一个高效微功率的电源&#xff0c;可以向输入端和输出端…

缅怀致敬 继往开来 | 萨师煊教授诞辰100周年纪念主题活动在京举行

2022年12月27日是我国数据库学科奠基人——萨师煊教授诞辰100周年纪念日。为缅怀萨师煊先生对我国数据库领域做出的突出贡献&#xff0c;弘扬萨师煊先生敢为人先、严谨治学的高尚品格&#xff0c;“萨师煊教授诞辰100周年纪念活动”27日在北京举行。本次纪念活动由中国人民大学…

云原生丨手把手教你使用zabbix监控postgresql数据库(超详细讲解)

文章目录一、前言二、什么是zabbix三、zabbix安装步骤四、监控postgresql实现步骤一、前言 对于运维人员来说&#xff0c;监控是非常重要的&#xff0c;因为如果想要保证线上业务整体能够稳定运行&#xff0c;那么我们则需要实时关注与其相关的各项指标是否正常。 而一个业务…