第1章 引言
1.1课题的研究背景
当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的原因。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了安全性。尤其对于复杂的信息管理,计算机能够充分发挥它的优越性。计算机进行信息管理与信息管理系统的开发密切相关,系统的开发是系统管理的前提。本系统就是为了管理好图书信息而设计的。
本图书管理系统是针对学校的图书馆日常操作业务而开发的管理软件。根据管理员、读者借阅的需求,实现图书、读者之间的有序化、信息化管理。本系统主要由这几个模块组成:日常借阅管理、读者管理、图书管理、系统设置等。图书管理系统通过录入图书的详细资料,建立读者档案、系统用户资料,设置各类参数(如:超期期限、人员类别、图书类别等),找出图书与读者之间的对应关系,实现日常的借阅操作。基于这些得到的基础数据,系统自行生成相应的统计数据供管理员查询、分析。另外,管理员还可以对这些基本信息进行定期的数据更新和数据库维护;为读者借阅时提供图书是否在馆,以及自己借书、还书等情况的查询功能,图书管理系统力求给图书管理员提供操作简单、方便快捷的途径去管理这些庞大,繁琐的信息和图书。
1.2研究意义
对图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。根据调查得知,他们以前对信息管理的主要方式是基于文本,表格等纸介质的手工处理,对于图书借阅情况(如借书天数,超过限定借书时间的天数)的统计和核实等往往采用对借书卡的人工检查进行,对借阅者的借阅权限,以及借阅天数等用人工计算,手抄进行。数据处理工作量大,容易出错。由于数据繁多。容易丢失,且不易查找。总的来说。缺乏系统规范的信息管理手段。尽管有的图书馆有计算机,但是尚未用于信息管理,没有发挥它的效力,资源闲置比较突出,这就是管理信息系统的开发的潜在应用环境。
基于这个问题,本人认为有必要建立一个图书管理系统,使图书管理工作规范化、系统化、程序化,避免图书管理的随意性,提高信息处理的速度和准确性, 能够及时、准确、有效的查询和修改图书情况。
第2章 系统分析
2.1可行性分析
2.2.1 技术可行性
本项目采用的是 Python+Django,是因为 Django 具有功能强大的脚手架和诸多开箱即用的组件,用 Django 搭建 Web 应用快速而又省力。相比于其他同学手敲 Qt 窗口,Django 自带的 Admin 已经基本把这些功能都实现了,甚至装了插件后还更美观,因此可以聚焦于前台交互的快速开发。
其次,开发架构方面,本程序员熟练掌握以B/S为基础的软件项目开发,采用B/S架构使得用户对数据的访问完全集中到服务器端进行。在访问数据库方面,能够熟练使用数据库相关访问技术,所以技术上是完全可行的。
2.2.2 经济可行性
第一点:开发成本低。由于系统开发环境配置以及开发并不复杂,只需一些基本的开发工具。而且开发出的系统操作起来也比较简单,另外具备网络中的一些资源优势,因此开发费用较低。
第二点:技术成本低。本系统主要使用一些第三方开源库插件以及在线开源css样式及js技术,不需要支付技术专利费用。这些开源代码,为本次项目设计与开发提供了很多免费的效果。
第三点:维护成本低,本系统采用django框架,维护起来较为简便。
2.2.3 操作可行性
首先,B/S架构大大简化了客户端,用户不需要再安装额外的软件就可以随时随地通过浏览器访问招聘系统,且B/S架构易于维护,用户对数据的访问完全集中到服务器端进行,使得数据的访问更加安全。
2.2分析需求
图书管理系统是为了实现图书高效管理而设计的.它完全取代了人工处理的工作方式,并且避免了由于管理员的疏忽以及管理质量问题所导致的各种错误。为及时、准确、高效地完成图书管理工作提供了强有力的工具。
2.3功能需求
本系统主要是管理员对图书信息和出版社进行管理。本系统需要有出版社管理、图书管理、作者管理、统计等功能, 能将相关信息从数据库中添加修改删除并且利用查询将相关信息显示出来。数据要求有自动更新功能,能显示最新的结 果。
图2.1
通过对一些大型图书管理系统的实际考察、分析,并结合实际要求以及实际的市场调查,要求本系统具有 以下功能:
·窗体界面要求美观大方、个性化、功能全面、操作简单。
·要求实现基础信息的管理平台。
·要求对所有图书进行管理。
·提供快速的图书信息检索功能,保证数据查询的灵活性。
·实现综合条件查询,如图书名称、图书作者等。
·提供灵活、方便的权限设置功能,使整个系统的管理分工明确。
·具有易维护性和易操作性。
2.4系统性能需求
因为系统要代替人工管理图书信息,所以要求系统响应速度快,稳定性强,操作简单,准确性高。根据前面所作的需求分析及功能的需求可以得出,学校图书馆管理系统实施后,应达到以下系统性能标 准:
· 窗体界面要求美观大方、功能全面、操作简单。
·程序整体结构和操作流程合理顺畅,实现人性化设计。
·规范、完善的基础信息设置。
·对操作员设置不同的操作权限,为管理员提供修改权限功能。
·对图书信息进行集中管理。
第3章 总体设计
3.1系统模块图
根据系统分析的结果,在综合分析的基础上,进行了系统总体设计,把系统分为了 5 个功能模块:登录模 块、出版社管理、图书管理、作者管理和系统用户管理模块。系统模块结构图如图所示:
图书信息管理模块:主要包括图书信息管理的功能,具体包括查询图书、修改图书、增加图书、删除图书 基本资料等基本操作(普通用户只有查询功能)。
出版社管理模块:主要是对出版社进行管理,可以查询出版社、修改出版社、增加出版社、删除出版社等 功能。
作者管理模块:主要是对作者进行管理,可以查询作者、修改作者、增加作者、删除作者等功能。
登录管理模块:主要是实现用户登录的功能,用户只有登录系统,才能在自己的权限范围内进行合法的操 作,否则,将不能进行任何操作。 注册管理模块:主要实现用户注册功能.
3.2数据库设计
MySQL 具有很强的完整性与可伸缩性,具有较低的价格比与性能比,考虑到本系统的稳定性与可靠性以 及开发程序与用户需求,笔者决定在设计该系统时选择 SQLMySQL 数据库来满足系统的需求。
在设计图书馆管理系统之前,有必要说明数据库的基本概念和本设计所应用的数据表。
3.3 E-R图
根据已知需求,为了更好的体现系统中各种数据之间的关系,更清楚、准确地表达用户对数据的要求,我们需要建立一个概念性的数据模型,其中包括涉及到的数据对象、对象的属性以及相互间彼此的联系,这就是实体-关系图,简称E-R图,用E-R图表示的概念模型独立于具体的DBMS所支持的数据模型,它是各种数据模型的共同基础,因此比数据模型更一般、该抽象、更接近现实世界。
ER图分为实体、属性、关系三个核心部分。实体是长方形体现,而属性则是椭圆形,关系为菱形。
ER图的实体(entity)即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示,每个实体都有自己的实体成员(entity member)或者说实体对象(entity instance),实体成员(entity member)/实体实例(entity instance) 不需要出现在ER图中。
ER图的属性(attribute)即数据对象所具有的属性,例如学生具有姓名、学号、年级等属性,用椭圆形表示,属性分为唯一属性( unique attribute)和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性。
ER图的关系(relationship)用来表现数据对象与数据对象之间的联系,关系用菱形来表示。
1.出版社档案实体
出版社档案实体包括:出版社编号,出版社地址,出版社名称
2.图书档案实体
出版社档案实体包括:序号,图书名称,图书编号,译者,出版日期,出版社
图3.4
3.作者档案实体
出版社档案实体包括:序号,姓名,性别,年龄,联系方式
图3.5
4.用户档案实体
出版社档案实体包括:序号,用户名,密码,邮箱,手机
图3.6
3.4 系统数据库表结构
结合实际情况及对用户需求的分析,图书管理系统bms数据库主要包含如下表所示的 4 个数据表。
表3-1出版社信息表
字段名 | 数据类型 | 是否主键 | 说明 |
id | int | 是 | 出版社编号 |
name | int | 否 | 出版社名称 |
addr | varchar(40) | 否 | 出版社地址 |
表3-2图书信息表
字段名 | 数据类型 | 是否主键 | 说明 |
id | int | 是 | 序号 |
name | varchar(64) | 否 | 图书名称 |
ISBN | varchar(64) | 否 | 图书编号 |
translator | varchar(64) | 否 | 译者 |
date | date | 否 | 出版日期 |
publisher_id | int | 否 | 出版社 |
表3-3作者信息表
字段名 | 数据类型 | 是否主键 | 说明 |
id | int | 是 | 序号 |
name | varchar(64) | 否 | 姓名 |
sex | varchar(4) | 否 | 性别 |
age | int | 否 | 年龄 |
tel | varchar(64) | 否 | 联系方式 |
表3-4用户信息表
字段名 | 数据类型 | 是否主键 | 说明 |
id | int | 是 | 序号 |
username | varchar(32) | 否 | 用户名 |
password | varchar(32) | 否 | 密码 |
| varchar(32) | 否 | 邮箱 |
mobile | int | 否 | 手机 |
第4章 详细设计及编码
4.1 系统主界面
系统主界面采用Django框架中后台管理的插件——simpleui,simpleui 是django admin的一个主题 ,是一个基于element-ui+vue开发,重写和优化90%以上的页面。与suit是同类产品。是一个更符合国人审美和使用习惯的一个主题。简而言之就是一个开源的Django后台管理的框架。使用simpleui不需要去专门书写后台管理的html页面代码,只需要在admin.py中对simpleui模板做文章即可达到想要实现的目的。simpleui提供可以更换主题的功能,可以根据自己的喜好选择不同的主题。(支持自定义主题)。系统主界面如图4-1所示:
图4-2为在settings.py中添置simpleui模块的相关代码
4.2 管理员身份认证模块的实现
Django实现了通过执行python manage.py createsuperuser来创建超级账号(拥有所有权限)即管理员账号。用户在ide的终端输入该命令后根据提示即可完成创建管理员角色。创建完成后通过后台网页创建其他的管理员账号,并分配给其不同的权限。
在使用系统前,管理员需要输入自己的用户名、密码。系统验证其用户名和密码的正确性,如果错误会出现用户名或密码输入错误,需要重新输入的提示。如果用户名、密码输入正确,则系统会根据当前管理员所持有的权限信息开放相应的后台管理界面,生成模块操作菜单,供当前管理员使用。界面如图4-3管理员登录界面所示:
4.3 图书管理系统信息管理的实现
包括出版社、作者、图书的添加、删除、修改、查询等。
- 添加出版社
管理员在进入后台管理界面后点击出版社管理按钮进入出版社管理界面,如图4-4所示。首先可以看到已经存在的出版社信息,点击增加按钮进入出版社添加界面如图4-5所示。
- 编辑出版社窗口
用户进入出版社管理界面,点击一条出版社信息,如图4-6所示,点击编辑进入出版社编辑页面,如图4-7所示
图4-7
出版社代码设计:
# 出版社展示列表
from app01.models import LmsUser
# @login_required
def publisher_list(request):
publisher = models.Publisher.objects.all()
return render(request, 'pub_list.html', {'pub_list': publisher})
# 添加出版社
def add_publisher(request):
if request.method == 'POST':
new_publisher_name = request.POST.get('name')
new_publisher_addr = request.POST.get('addr')
models.Publisher.objects.create(name=new_publisher_name, addr=new_publisher_addr)
return redirect('/pub_list/')
return render(request, 'pub_add.html')
# 编辑出版社
def edit_publisher(request):
if request.method == 'POST':
edit_id = request.GET.get('id')
edit_obj = models.Publisher.objects.get(id=edit_id)
new_name = request.POST.get('edit_name')
new_addr = request.POST.get('edit_addr')
edit_obj.name = new_name
edit_obj.addr = new_addr
edit_obj.save()
return redirect('/pub_list/')
edit_id = request.GET.get('id')
edit_obj = models.Publisher.objects.get(id=edit_id)
return render(request, 'pub_edit.html', {'publisher': edit_obj})
# 删除出版社
def drop_publisher(request):
drop_id = request.GET.get('id')
drop_obj = models.Publisher.objects.get(id=drop_id)
drop_obj.delete()
return redirect('/pub_list/')
- 添加作者
管理员在进入后台管理界面后点击作者管理按钮进入作者管理界面,如图4-8所示。首先可以看到已经存在的作者信息,点击增加按钮进入作者添加界面如图4-9所示。
- 编辑作者窗口
用户进入作者管理界面,点击一条作者信息,如图4-10所示,点击编辑进入作者编辑页面,如图4-11所示
作者代码设计:
# 作者的列表
def author_list(request):
author = models.Author.objects.all()
return render(request, 'auth_list.html', {'author_list': author})
# 添加作者
def add_author(request):
if request.method == 'POST':
new_author_name = request.POST.get('name')
new_author_sex = request.POST.get('sex')
new_author_age = request.POST.get('age')
new_author_tel = request.POST.get('tel')
models.Author.objects.create(name=new_author_name, sex=new_author_sex, age=new_author_age, tel=new_author_tel)
return redirect('/author_list/')
return render(request, 'author_add.html')
# 删除作者
def drop_author(request):
drop_id = request.GET.get('id')
drop_obj = models.Author.objects.get(id=drop_id)
drop_obj.delete()
return redirect('/author_list/')
# 修改作者
def edit_author(request):
if request.method == 'POST':
edit_id = request.GET.get('id')
edit_obj = models.Author.objects.get(id=edit_id)
new_author_name = request.POST.get('edit_name')
new_author_sex = request.POST.get('edit_sex')
new_author_age = request.POST.get('edit_age')
new_author_tel = request.POST.get('edit_tel')
new_book_id = request.POST.getlist('book_id')
edit_obj.name = new_author_name
edit_obj.sex = new_author_sex
edit_obj.age = new_author_age
edit_obj.tel= new_author_tel
edit_obj.book.set(new_book_id)
edit_obj.save()
return redirect('/author_list/')
edit_id = request.GET.get('id')
edit_obj = models.Author.objects.get(id=edit_id)
all_book = models.Book.objects.all()
return render(request, 'auth_edit.html', {
'author': edit_obj,
'book_list': all_book
})
- 添加书籍
管理员在进入后台管理界面后点击图书管理按钮进入图书管理界面,如图4-12所示。首先可以看到已经存在的图书信息,点击增加按钮进入图书添加界面如图4-13所示。
图4-12
- 编辑图书窗口
用户进入图书管理界面,点击一条图书信息,如图4-14所示,点击编辑进入图书编辑页面,如图4-15所示
图4-14
图书代码设计:
# 书籍列表
def book_list(request):
book = models.Book.objects.all()
return render(request, 'book_list.html', {'book_list': book})
# 添加书籍
def add_book(request):
if request.method == 'POST':
new_book_name = request.POST.get('name')
new_book_ISBN = request.POST.get('ISBN')
new_book_translator = request.POST.get('translator')
new_book_date = request.POST.get('date')
publisher_id = request.POST.get('publisher_id')
models.Book.objects.create(name=new_book_name, publisher_id=publisher_id, ISBN=new_book_ISBN,
translator=new_book_translator, date=new_book_date)
return redirect('/book_list/')
res = models.Publisher.objects.all()
return render(request, 'book_add.html', {'publisher_list': res})
# 删除书籍
def drop_book(request):
drop_id = request.GET.get('id')
drop_obj = models.Book.objects.get(id=drop_id)
drop_obj.delete()
return redirect('/book_list/')
# 编辑书籍
def edit_book(request):
if request.method == 'POST':
new_book_name = request.POST.get('name')
new_book_ISBN = request.POST.get('ISBN')
new_book_translator = request.POST.get('translator')
new_book_date = request.POST.get('date')
new_publisher_id = request.POST.get('publisher_id')
edit_id = request.GET.get('id')
edit_obj = models.Book.objects.get(id=edit_id)
edit_obj.name = new_book_name
edit_obj.ISBN = new_book_ISBN
edit_obj.translator = new_book_translator
edit_obj.date = new_book_date
edit_obj.publisher_id = new_publisher_id
edit_obj.save()
return redirect('/book_list/')
edit_id = request.GET.get('id')
edit_obj = models.Book.objects.get(id=edit_id)
all_publisher = models.Publisher.objects.all()
return render(request, 'book_edit.html', {'book': edit_obj, 'publisher_list': all_publisher})
4.4 前台网站的实现
前台网站功能模块主要包括以下功能:
用户注册、登录
进入前台界面。用户可以点击注册按钮进入注册界面(如图4-16所示),按照相应的提示完成注册后可以点击直接登录(如图4-17)按钮进入主页。
图4-17
代码实现:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书管理系统</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- jQuery UI -->
<link href="https://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css" rel="stylesheet" media="screen">
<!-- Bootstrap -->
<link href="/static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<!-- styles -->
<link href="/static/css/styles.css" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
</head>
<body class="login-bg">
<div class="header">
<div class="container">
<div class="row">
<div class="col-md-12">
<!-- Logo -->
<div class="logo">
<h1><a href="index.html">图书管理系统</a></h1>
</div>
</div>
</div>
</div>
</div>
<div class="page-content container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="login-wrapper">
<div class="box">
<form class="content-wrap" role="form" action="/register/" method="post">
<h6>注册</h6>
{% csrf_token %}
<input class="form-control" name="username" type="text" placeholder="Username">
<input class="form-control" name="email" type="text" placeholder="E-mail address">
<input class="form-control" name="password" type="password" placeholder="Password">
<input class="form-control" name="mobile" type="text" placeholder="Mobile">
<!-- <input class="form-control" type="password" placeholder="Confirm Password">-->
<div class="action">
<button type="submit" class="btn btn-primary">注册</button>
</div>
</form>
<div class="already">
<p>已有账户?</p>
<a href="/login">登录</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://code.jquery.com/jquery.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="bootstrap/js/bootstrap.min.js"></script>
<script src="js/custom.js"></script>
</body>
第5章 系统测试
5.1 前台用户模块测试
5.1.1 用户登录模块测试
用户登录模块测试用例执行情况如表5.1所示。
表5.1 登录模块测试情况表
测试输入数据 | 预期输出 | 实际输出 | 测试结果 |
输入用户名“李”密码“123456” | 系统进入李的个人主页 | 系统进入李的个人主页 | Passed |
输入用户名 | 系统提示“请填写密码字段” | 系统提示“请填写密码字段” | Passed |
输入密码 | 系统提示“请填写用户名字段” | 系统提示“请填写用户名字段” | Passed |
输入错误用户名和密码 | 系统自动清空密码栏,等待用户输入正确的密码 | 系统自动清空密码栏,等待用户输入正确的密码 | Passed |
5.1.2 用户注册模块测试
注册模块测试情况如表5.2所示。
表5.2 注册模块测试情况表
测试输入数据 | 预期输出 | 实际输出 | 测试结果 |
输入注册信息 | 用户注册信息显示在页面上 | 界面显示用户填写的注册信息 | Passed |
新增用户信息并点击“注册” | 自动弹出新增用户信息成功信息,并且跳转至登陆界面 | 系统在新增用户信息后返回登录界面 | Passed |
5.2 后台管理员模块测试
5.2.1 食堂管理功能测试(窗口,菜品测试同理就不在演示)
管理员模块资讯管理功能测试情况如表5.5所示。
表5.3 图书管理功能测试情况表
测试输入数据 | 预期输出 | 实际输出 | 测试结果 |
点击“新增”进行记录添加 | 系统显示添加成功 | 系统将新增的数据存入数据库,且在页面显示出来 | Passed |
点击“查看”进行信息查询 | 系统显示户作者的信息 | 系统检索信息并显示出来 | Passed |
点击“编辑”进行学生信息的修改 | 系统更改数据库中作者信息 | 系统成功从更改数据库的学生信息 | Passed |
点击“删除” | 删除该条信息 | 系统从数据库中将该信息删除 | Passed |
输入名字后点击“搜索” | 显示出该名字的作者的信息 | 系统将该作者的信息显示出来 | Passed |
5.3 系统测试遇到的问题及解决方案
检查浏览器路径是否正确;相对路径是否正确;.xml配置中的路径是否正确;查看项目是否部署成功。经过这一系列操作,成功解决了问题。
5.3.2无法正常连接数据库
application.properties文件中的server.port定义接口出现错误,url定义格式出错,将这两个进行修改,接口修改为自己电脑修改过的tomcat接口,url根据标准修改,数据库名用自己定义的数据库,即可连接成功。
5.4 系统测试结论
在一系列的测试过程中,也发现了一系列大大小小的问题,比如页面跳转出错,或者数据库信息更新失败等等。经过一段时间的代码修改和完善,已将变成中所发现的错误全部调试正确,需求和功能设计方面的问题也已经进行调整和修改。整个系统的功能基本上已经能够达到预期的目标。
第6章 总结及展望
(根据需求分析预定目标、测试及运行结果对系统实现进行自评,并指出其中不足。针对现有系统不足,进行下一步工作展望。)
6.1 实训自评
这次实训项目整体来说我还是比较满意的,因为在数据库实训之前我并未做过web项目,对web项目的搭建可谓是一头雾水。所以这次的实训其实是一个不断学习,不断尝试,不断纠错的过程。在项目刚开始的需求分析阶段,我一开始的想法是创建一个用户在线点餐的系统,并没有考虑到网上点餐的订单的不同状态,比如已下单,已送达等。所以在后来考虑之后添加了订单的状态栏。测试阶段还是很顺利,并没有出现一些意料之外的错误。
6.2 系统不足
本次图书管理系统有一些可以改进的地方,比如读者信息是没有的,如需改进的话,可以增加读者信息以及读者借阅图书、归还图书。但是碍于能力原因并没有实现该部分的功能实现。
6.3 下一步工作展望
在下一步计划中,我会继续加深对于django框架的学习,此次实训仅仅是用到了django的冰山一角,还有很多未知的知识等待着我去学习与开拓。另外我也会巩固html,css相关的知识,争取学到更多的技巧让页面更加美观。此次实训也让我认识到了仅仅是理论知识是不够的,计算机需要不断的实践,不断的去发现自己的错误,在一步步找bug的路途中成长。因此我会更加注重实践的影响力,无论困难与否,我都会做到坚持与用心,我觉得这是能够不断前行的必要条件。