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

news2025/1/15 6:24:48

概念

本文在上一篇文章之上完成登录,图书显示,关键字搜索以及分页功能

登录功能实现

当用户在首页进行输入学生用户信息后,点击登录按钮发送请求给服务器,地址请求为: /toLogin/

urls.py

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

将接收的学号和密码发送给服务器进行查询数据库进行验证,如果该学生不存在,则跳转至登录提示页面,否则进入主页,并将登录的用户信息存储起来

# 保存登录信息
student=[]

def toLogin(request):
    # 接收学生的登录信息,并将登录成功的学生信息临时存储
    num=request.POST["num"]
    psd=request.POST["psd"]
    # 根据登录信息查询数据库该学生是否存在
    global student
    student=Student.objects.filter(number=num,psd=psd)

    # 如果能查询到数据,则进入主页
    if student:
        return redirect(bookList)
    else:
        return render(request,"loginError.html")

主页地址请求为: 

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

views.py,将数据库中所有图书信息进行查询并做分页处理

def bookList(request):
    try:
        ym=request.GET["ym"]
    except:
        ym=1
    # 将所有图书信息查询出来
    bookList = Book.objects.all().values()
    p=paginator.Paginator(bookList,16)
    page=p.get_page(ym)
    bookList=page.object_list
    yms=p.page_range
    for b in bookList:
        b["image"] = "img/" + str(b["image"])
    return render(request, "home.html", {"student": student[0], "bookList": bookList,"page":page,"yms":yms})

主页的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">
        #h_content {
            width: 100%;
            margin: 10px 0px;
        }

        #h_content_top {
            width: 100%;
            height: 60px;
        }
        #seach {
            width: 400px;
            margin: auto;
        }

        #seach form {
            width: 380px;
            margin: 0px auto;
        }

        #seach form .t_seach {
            width: 300px;
            height: 30px;
            border-radius: 3px;
            border-width: 3px;
            border-color: chocolate;
        }

        #seach form .btn_seach {
            width: 60px;
            height: 30px;
            border-radius: 3px;
            border-width: 0px;
            background-color: #00aaff;
            color: white;
        }

        #h_content_center {
            width: 100%;
        }

        #h_content_center ul {
            list-style: none;
            width: 900px;
            margin: 0px;
            padding: 0px;
        }

        #h_content_center ul li {
            width: 200px;
            float: left;
            margin: 5px;
        }


        #h_content_center ul li img {
            width: 200px;
            margin: 0px auto;
        }

        #h_content_center ul li p {
            width: 100%;
            text-align: center;
            color: black;
            font-size: 11px;
        }

        #h_content_center a {
            text-decoration: none;
            color: black;
        }

        #h_content_center a:LINK {
            color: black;
        }

         #h_content_center a:HOVER {
            color: red;
        }

        #h_content_foot ul {
            margin: 0px;
            padding: 0px;
            list-style: none;
        }

        #h_content_foot ul li {
            width: 20px;
            height: 20px;
            font-size: 12px;
            float: left;
            margin: 10px;
            text-align: center;
        }

        #h_content_foot ul li:HOVER {
            color: white;
            background-color: #0077ff;
        }

        #nav{
            width: 900px;
            height: 40px;
            margin-top: 20px;
            clear: left;
        }
        #nav a{
            text-decoration: none;
            margin: 3px;
            background-color: cadetblue;
        }
        #nav a:hover{
            background-color: #FF1719;
        }

        #nav a.c_page{
            background-color: #FF1719;
        }
        #nav a.up_page,#nav a.do_page{
            width: 80px;
            height: 40px;
            padding: 5px 10px;
            border-radius: 5px;
            color: white;
        }
        #nav a.p_page{
            width: 40px;
            height: 40px;
            padding: 3px;
            border-radius: 5px;
            color: white;
        }

    </style>
    <script type="text/javascript">

         //定义方法,用于处理分页导航栏的样式
        function a_style() {
            //通过class选择器获得分页导航栏对象
            var aElements=document.getElementsByClassName("p_page");
            for (var i = 0; i < aElements.length; i++) {
                var text=aElements.item(i).innerHTML;
                if (text<10){
                    aElements.item(i).innerHTML="&nbsp;"+text+"&nbsp;";
                }
            }
        }

    </script>
</head>
<body onload="a_style()">
<div id="h_body"
     style="width: 900px;
	height: 800px;margin: 10px auto;">
    <!-- 头部:登录的用户,历史记录,我的借阅,注销 -->
    {% include "top.html" with stu=student %}
    <!-- 内容 -->
    <div id="h_content">
        <div id="h_content_top">
            <div id="seach">
                <form action="/seach/" method="post">
                    {% csrf_token %}
                    <input type="text" class="t_seach" width="80" height="40"
                           name="seach" placeholder="根据书名搜索,例如:java"> &nbsp;&nbsp;<input
                        type="submit" class="btn_seach" name="submit" value="搜索">
                </form>
            </div>
        </div>
        <div id="h_content_center">
            <ul>
                {% for foo in bookList %}
                    <li ><a href="/bookInfo/?bookid={{ foo.id }}"><img alt="{{ foo.bookName }}"
                                                                                              src="{% static foo.image %}"></a>
                        <p><a href="/bookInfo/?bookid={{ foo.id }}">{{ foo.bookName }}</a></p>
                    </li>
                {% endfor %}
            </ul>
        </div>
        <!-- 显示页码导航栏 -->
        <div id="nav" align="center">
            <!-- 上一页 -->
            <!-- 判断当前页是否有上一页,如果有上一页则显示上一页的按钮,否则就不显示上一页 -->
            {% if page.has_previous %}
                <a href="/bookList/?ym={{ page.previous_page_number }}" class="up_page">上一页</a>
            {% endif %}
            <!-- 页码 -->
            {% for ym in yms %}
                {% if page.number == ym %}
                    <a href="/bookList/?ym={{ ym }}" class="p_page c_page">{{ ym }}</a>
                {% else %}
                    <a href="/bookList/?ym={{ ym }}" class="p_page">{{ ym }}</a>
                {% endif %}
            {% endfor %}

            <!-- 下一页 -->
            {% if page.has_next %}
                <a href="/bookList/?ym={{ page.next_page_number }}" class="do_page">下一页</a>
            {% endif %}
        </div>
    </div>
    <!-- 底部 -->
    {% include "foot.html" %}
</div>
</body>
</html>

其界面效果如下

根据关键字查询图书信息

在搜索文本框中输入要搜索的书籍名称的关键字,点击搜索后,发出请求  /seach/

urls.py中进行匹配

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

 views.py

def seach(request):
    info=request.POST["seach"]
    # 进行模糊查询
    bookList=Book.objects.filter(bookName__contains=info).values()
    try:
        ym = request.GET["ym"]
    except:
        ym = 1
    p = paginator.Paginator(bookList, 16)
    page = p.get_page(ym)
    bookList = page.object_list
    yms = p.page_range
    for b in bookList:
        b["image"] = "img/" + str(b["image"])
    return render(request, "home.html", {"student": student[0], "bookList": bookList, "page": page, "yms": yms})

其页面效果如下

查看图书详情信息功能实现

当用户需要查看某一本图书的时候,进行选择对应的图书信息点击,想服务器发送请求 /bookInfo/

 urls.py文件中定义该地址

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

views.py文件中接收用户发送的图书id进行获取图书信息,以及该用户是否对该图书有借阅记录的状态获取

def bookInfo(request):
    id=request.GET["bookid"]
    # 根据id获得该对应的图书信息
    book=Book.objects.get(id=id)
    book.image="img/"+str(book.image)
    # 根据当前登录的学生的学号和图书id查询借阅记录表的借阅状态
    infos=UserBookInfo.objects.filter(number=student[0].number,bookId=id)
    # 如果未查询到,则状态为0,表示未借阅,1表示已借阅,2表示已归还
    state=  infos[0].state  if infos else 0
    return render(request,"bookInfo.html",{"student":student[0],"book":book,"state":state})

并显示在图书详细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">
		#b_content input{
			width: 200px;
			height: 40px;
            border-radius: 5px;
			color: white;
			font-size: 18px;
			font-weight: bold;
		}
	</style>
	<script type="text/javascript">
		function a_() {
			alert("该书已借阅,不能同时借阅同一本书!!!");
		}
	</script>
</head>
<body>
    <div id="body">
    	<!-- 头部 -->
    	{% include "top.html" with stu=student %}
    	<!-- 内容 -->
    	<div id="b_content">
    		<table>

    			<tr >
    				<td rowspan="5" width="30%" align="center">
    				<img alt="封面" title="封面"
    				src="{% static book.image %}"> </td>
    				<td width="70%"><b>书籍名称:</b>&nbsp;&nbsp;{{ book.bookName }}</td>
    			</tr>
    			<tr>
    				<td><b>作者:</b>&nbsp;&nbsp;{{ book.author }}</td>
    			</tr>
    			<tr>
    				<td><b>出版日期:</b>&nbsp;&nbsp;{{ book.bookDate }}</td>
    			</tr>
    			<tr>
    				<td><b>出版社:</b>&nbsp;&nbsp;{{ book.bookAddress }}</td>
    			</tr>
    			<tr>
    				<td><b>所属分类:</b>&nbsp;&nbsp;{{ book.type }}</td>
    			</tr>
    			<tr>
    				<td colspan="2"><b>内容简介:</b>
    				<br>
    				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ book.info }}</td>
    			</tr>
    			<tr>
    				<td colspan="2" align="center">
                    {% if state == 0 or state == 2 %}
                        <a href="/addUserBookInfo/?bookid={{ book.id }}">
    				<input type="button" style="background-color: #0077ff;" value="借阅">
    				</a>
                    {% elif state == 1 %}
                        <a onclick="a_()">
    				<input type="button" style="background-color: red;" value="已借阅">
    				</a>
                    {% endif %}
    				</td>
    			</tr>
    		</table>
    	</div>
    	<!-- 底部 -->
    	{% include "foot.html" %}
    </div>
  </body>
</html>

其界面效果如下

如果当前学生对某图书有借阅则不允许再对该书进行借阅

 

 

 

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

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

相关文章

ArcGIS基础实验操作100例--实验3旋转矢量要素

实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验3 旋转矢量要素 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&#xff09;加载【旋转】工具 &#xff08;2&#xff09;旋转矢量要素 一…

灵龟八法推算

很久之前就对这个算法感兴趣了&#xff0c;但是一直没搞定&#xff0c;网上公说公的&#xff0c;婆说婆的&#xff0c;搞得你头晕眼睛花&#xff0c;最后东拼西凑研究了好久才研究出来,在这里给大家分享。 第一步&#xff0c;掏出你的老黄历&#xff0c;如果你没有老黄历问题不…

BUUCTF Misc 弱口令 [RoarCTF2019]黄金6年 小易的U盘 [WUSTCTF2020]alison_likes

目录 弱口令 [RoarCTF2019]黄金6年 小易的U盘 [WUSTCTF2020]alison_likes 弱口令 下载文件 一个压缩包&#xff0c;需要密码&#xff0c;爆破了一会没出结果&#xff0c;百度了一下竟然有提示 蓝色内容复制到sublime查看&#xff08;记事本也不能看&#xff09; 摩斯密码&…

vue-cli2配置webpack生产环境.env.production、测试环境.env.development(配置不同环境的打包访问地址)

vue-cli区分办法 vue配置生产环境.env.production、测试环境.env.development vue配置webpack生产环境、测试环境 在使用webpack创建完vue2项目的时候&#xff0c;为了解决生产打包、测试打包对应的全局变量不一致的问题。 首先看一下package.json的改动&#xff1a; "…

【Git】一文带你入门Git分布式版本控制系统(创建版本库、 版本回退)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

改变您对Fedora的印象

导读我是 Fedora 的老用户了&#xff0c;从四年前接触嵌入式 Linux 开始&#xff0c;Fedora 就是我的桌面操作系统&#xff0c;期间从未被其他操作系统替代过&#xff0c;偶尔尝试也会第二天就装回来。用得愈久愈是喜欢&#xff0c;简洁、漂亮、稳定&#xff0c;无一不击中我&a…

OpenGL学习(基础光照)

这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结构由3个分量组成&#xff1a;环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照 环境光照 全局照明(Global Illumination)算法&#xff0c;但是…

吴恩达《机器学习》——线性回归代码实现

线性回归1. 单变量线性回归单变量线性回归公式损失函数优化算法——批梯度下降&#xff08;BGD&#xff09;2. 多变量线性回归特征缩放&#xff08;标准化&#xff09;参数的逆缩放3. 线性回归算法代码实现向量实现Python代码4. 实验结果单变量回归多变量回归实验总结数据集、源…

使用C#开发Word VSTO外接程序示例

目标&#xff1a;实现类似word中导航栏视图的功能。 创建新项目&#xff0c;选择模板“Word VSTO 外接程序”。选择工程&#xff0c;新建项目---新建功能区&#xff08;可视化设计器&#xff09;双击打开新建的可视化编辑器&#xff0c;编辑容器RibbonGroup在容器RibbonGroup里…

ReactJS入门之Model层

目录 一&#xff1a;分层 二&#xff1a;使用DVA进行数据分层管理 三&#xff1a;在model中请求数据 四&#xff1a;mock数据 一&#xff1a;分层 上图中&#xff0c;左侧是服务端代码的层次结构&#xff0c;由Controller、Service、Data Access 三层组成服务端系统&#…

Docker图文 | Docker、Dockerfile、Docker-compose、Docker镜像仓库操作 | 系统性学习 | 无知的我费曼笔记

Dokcer和Linux一样都是一些死命令&#xff0c;不必花费过多的时间去学习。 也不必花费过多时间专项地记忆&#xff0c;在实际运用中随用随取即可。 还不如将省下来的时间更多地花费在于培养思维上。 文章目录Docker1.初识Docker1.1.Docker意义1.1.1.应用部署的环境问题描述1.1…

Antd UI Switch组件 中 checked与defaultChecked踩坑记录

目录 需求分析 问题发现 解决方法 总结 需求分析 需求其实很简单&#xff0c;就是在对应的表格行内添加一个人switch 滑块&#xff0c;用于开启或关闭单点登录入口。只需要修改一下对应的表格&#xff0c;添加一个滑块组件&#xff0c;新增一个接口。于是菜鸡博主&#xf…

MySQL库的基本操作与数据库的备份

目录 1、什么是数据库 2、数据库的基本使用 <1>本地连接服务器 <2>创建数据库 <3>创建数据库实例 <4>字符集和校验规则 3、操纵数据库 <1> 查看数据库 <2> 显示创建语句 <3> 修改数据库 <4> 数据库删除 <5>…

遇到的问题

一、git 1. git push之前忘记git pull:需要指定如何协调不同的分支。 解决&#xff1a; (1) git config pull.rebase false (2) git status 用于查看在你上次提交之后是否有对文件进行再次修改 (3) git stash 将当前的工作状态保存到git栈 2. 删除本地分支 # 删除本地分支 git…

【C++初阶】C++的IO流

文章目录C语言的输入输出流CIO流C标准IO流C文件IO流stringstream的简单介绍所有的测试代码C语言的输入输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。printf(): 将指定的文字/字…

Python最适合做什么?

Python最适合做什么&#xff1f; 最近我在Reddit上讨论了为什么有人会使用Python而不是其他编程语言。这个讨论非常好&#xff0c;因此我想写一篇关于它的文章。 首先&#xff0c;让我告诉你我对Python的看法。Python是我喜欢的一种语言&#xff0c;可以用于各种各样的应用&a…

spark读取elasticSerach

搭建参考:我的这篇 elasticsearch搭建_我要用代码向我喜欢的女孩表白的博客-CSDN博客 为了方便测试&#xff0c;我们先建立个索引&#xff0c;如果没有索引&#xff0c;他也能插入&#xff0c;只是走的是默认插入格式。 不过虽然接触es已经4年了&#xff0c;但是在工作中&…

XSS攻击原理及预防方法

XSS攻击通常都是通过跨站指令代码攻击网站的后台漏洞。它和信息隐性代码攻击攻击的目标不同。前者是透过从Web前端输入信息至网站&#xff0c;导致网站输出了被恶意控制的网页内容&#xff0c;使得系统安全遭到破坏。而后者则是输入了足以改变系统所执行之SQL语句内容的字串&am…

【解决方案】一种简单且实用的化工厂人员定位系统

化工厂人员定位系统是推进我国安全生产状况持续稳定好转的有效载体&#xff0c;对化工行业的科学发展、安全发展起着重要的促进作用。 化工厂安全责任重于泰山&#xff0c;一旦发生事故后果不堪设想。目前&#xff0c;化工企业还存在着缺乏实时监督、缺乏主动干预、缺乏精准救援…

SpringCloud(9)— Elasticsearch聚合和自动补全

SpringCloud&#xff08;9&#xff09;— Elasticsearch聚合和自动补全 一 数据聚合 1.聚合的分类 聚合&#xff08;aggregations&#xff09;可以实现对文档数据的统计&#xff0c;分析&#xff0c;运算。常见的聚合有三种&#xff1a; 1.桶聚合&#xff08;Bucket&#x…