数据库课程设计报告
目
一:系统开发平台
图书管理系统是我们平时在学校当中接触最多的系统之一,也是相对来说十分实用的一个系统。借助这次的数据库课程设计来达到我们的模拟过程。
本系统采用WAMPSERVER集成开发环境,后台使用MySQL简历数据库。
1、服务器端
整体架构:WampServer
操作系统:Windows
服务器:Apache
PHP软件:PHP
数据库:MySQL
数据库管理系统:phpMyAdmin
开发工具:EmEditor
浏览器:Google
2、客户端
浏览器:Google
二、数据库规划
2.1 任务陈述
OnLine
2.2 任务目标
通过对一些在线阅读网站和在线借书网站的实际考察、分析,并结合Online
网站设计页面要求美观大方、功能全面、操作简单。
网站整体结构和操作流程合理顺畅,实现人性化设计。
规范、完善的基础信息设置。
对操作员设置不同的操作权限,为管理员提供修改权限功能。
对所有读者进行集中管理。
对所有书籍进行集中管理。
实现书籍借阅排行,以便了解当前的畅销书。
实现书籍借阅、书籍续借、书籍归还、电子书籍等功能。
三、系统定义
3.1 系统边界
实现基础信息的管理平台。
要求图书借阅、续借、归还是记下每一笔记录的操作员。
实现对图书借阅、续借和归还过程的全程数据信息跟踪。
提供借阅到期提醒功能,是管理者可以及时了解已经到达归还日期的图书借阅信息。
提供灵活、方便的权限设置功能,是整个系统的管理分工明确。
具有以维护性和易操作性。
3.2 用户视图
网站设计页面要求美观大方、个性化,功能全面,操作简单。
实现图书借阅排行、了解当前的畅销书。
商品分类详尽,可按不同类别查看图书信息。
提供快速的图书信息、图书借阅检索功能,保证数据查询的灵活性。
实现图书借阅、图书续借、图书归还、电子图书的功能。
实现综合条件查询,如按用户指定条件查询、按日期时间段查询、综合条件查询等。
四:需求分析
4.1 用户需求说明
当以游客身份进行登录的时候能够进入以下版块
1.Index版块,能够显示欢迎界面,以及一些有关于网站的基本介绍
2.Search板块,能够按照关键字进行搜索
3.Rank板块,将所有书籍按照分类,显示每一类最受欢迎,也就是借阅次数最多的三本书
4.Login板块,能够让游客输入用户名、密码进行登录,如果可以的话,最好能够以验证码进行验证登陆
5.Register板块,能够让游客注册信息
当以某一个用户身份登录是能够进入以下版块
1.Index版块,能够显示欢迎界面,以及一些有关于网站的基本介绍
2.Search板块,能够按照关键字进行搜索
3.Rank板块,将所有书籍按照分类,显示每一类最受欢迎,也就是借阅次数最多的三本书
4.Information板块,能够显示当前用户的个人基本信息,并且支持一些修改操作
5.BorrowList板块,能够显示当前用户正在借阅的书籍
6.Favourite板块,能够显示当前用户已经选择收藏的书籍
7.Preservation板块,能够显示当前用户已经预定的书籍
8.Logout板块,能够支持让当前用户登出功能
4.2 系统需求说明
当以普通管理员的身份进行登录的时候能够进入以下版块:
1.Index板块,能够显示欢迎界面,以及一些有关于网站的基本介绍
2.Searh板块,能够按照关键字进行搜索
3.Rank板块,将所有书籍按照分类,显示每一类最受欢迎,也就是借阅次数最多的三本书
4.Add板块,能够允许管理员进行新书增添入库的功能
5.View板块,能够允许管理员对所有书籍进行浏览功能
6.Edit板块,在View板块当中嵌入,能够允许管理员编辑图书信息
7.Delete板块,在View板块当中嵌入,能够允许管理员删除图书性信息
8.Lend板块,能够允许管理员操作借阅图书给读者
9.Preserve板块,能够允许管理员按照预订信息将图书借阅给读者
10.Return板块,能够允许管理员按照还书信息记录图书还书情况
11.BooksOut板块,能够允许管理员列出当前借出图书信息
12.BooksPreserved板块,能够允许管理员列出当前预定图书信息
13.Logout板块,能够支持让当前用户登出功能
当以超级管理员的身份进行登录的时候能够进入以下板块:
1.Index板块,能够显示欢迎界面,以及一些有关于网站的基本介绍
2.Searh板块,能够按照关键字进行搜索
3.Rank板块,将所有书籍按照分类,显示每一类最受欢迎,也就是借阅次数最多的三本书
4.Add板块,能够允许超级管理员进行新书增添入库的功能
5.View板块,能够允许超级管理员对所有书籍进行浏览功能
6.Edit板块,在View板块当中嵌入,能够允许超级管理员编辑图书信息
7.Delete板块,在View板块当中嵌入,能够允许超级管理员删除图书性信息
8.Lend板块,能够允许超级管理员操作借阅图书给读者
9.Preserve板块,能够允许超级管理员按照预订信息将图书借阅给读者
10.Return板块,能够允许超级管理员按照还书信息记录图书还书情况
11.BooksOut板块,能够允许超级管理员列出当前借出图书信息
12.BooksPreserved板块,能够允许超级管理员列出当前预定图书信息
13.Manage板块,能够允许超级管理员管理普通用户和普通管理员,并且能够支持设置权限
14.Logout板块,能够支持让当前用户登出功能
五、数据库逻辑设计
5.1 ER图
5.2 数据字典
表的结构
字段 | 类型 | 空 | 默认 |
book_id | int(10) | 否 | |
bookname | varchar(100) | 否 | |
author | varchar(100) | 否 | |
price | double | 否 | |
page | int(11) | 否 | |
sort_id | int(11) | 否 | |
inTime | datetime | 否 | |
isInStore | int(11) | 否 | 1 |
转存表中的数据
字段 | 类型 | 空 | 默认 |
book_id | int(10) | 否 | |
bookname | varchar(100) | 否 | |
author | varchar(100) | 否 | |
price | double | 否 | |
page | int(11) | 否 | |
sort_id | int(11) | 否 | |
inTime | datetime | 否 | |
isInStore | int(11) | 否 | 1 |
表的结构
表的结构
字段 | 类型 | 空 | 默认 |
sort_id | int(11) | 否 | |
booksort | varchar(100) | 否 | |
转存表中的数据
1 | Computer |
2 | Language |
3 | Art |
4 | others |
表的结构
字段 | 类型 | 空 | 默认 |
sort_id | int(11) | 否 | |
booksort | varchar(100) | 否 | |
表的结构
字段 | 类型 | 空 | 默认 |
favourite_id | int(10) | 否 | |
reader_id | int(11) | 否 | |
book_id | int(11) | 否 | |
转存表中的数据
1 | 2 | 1 |
3 | 3 | 5 |
4 | 2 | 5 |
5 | 2 | 23 |
8 | 2 | 46 |
9 | 2 | 43 |
表的结构
字段 | 类型 | 空 | 默认 |
favourite_id | int(10) | 否 | |
reader_id | int(11) | 否 | |
book_id | int(11) | 否 | |
表的结构
字段 | 类型 | 空 | 默认 |
lend_id | int(11) | 否 | |
book_id | int(11) | 否 | |
reader_id | int(11) | 否 | |
lendTime | datetime | 否 | |
deadline | datetime | 否 | |
isReturn | int(11) | 否 | 0 |
renewTime | int(11) | 否 | 0 |
转存表中的数据
字段 | 类型 | 空 | 默认 |
lend_id | int(11) | 否 | |
book_id | int(11) | 否 | |
reader_id | int(11) | 否 | |
lendTime | datetime | 否 | |
deadline | datetime | 否 | |
isReturn | int(11) | 否 | 0 |
renewTime | int(11) | 否 | 0 |
表的结构
表的结构
字段 | 类型 | 空 | 默认 |
preservation_id | int(10) | 否 | |
reader_id | int(11) | 否 | |
book_id | int(11) | 否 | |
deadline | datetime | 否 | |
转存表中的数据
表的结构
字段 | 类型 | 空 | 默认 |
preservation_id | int(10) | 否 | |
reader_id | int(11) | 否 | |
book_id | int(11) | 否 | |
deadline | datetime | 否 | |
表的结构
字段 | 类型 | 空 | 默认 |
reader_id | int(10) | 否 | |
username | varchar(20) | 否 | |
password | varchar(1000) | 否 | |
| varchar(20) | 否 | |
gender | varchar(10) | 否 | |
address | varchar(100) | 否 | |
profession | varchar(100) | 否 | |
level | int(11) | 否 | |
转存表中的数据
1 | admin | 21232f297a57a5a743894a0e | admin | male | student | SDU | 2 |
2 | aaa | 47bce5c74f589f4867dbd57e | aaa@aaa.com | Male | aaa | aaa | 0 |
3 | lsc | 6f6c90e968a4adc904152244 | lsc@lsc.com | Male | lsc | lsc | 0 |
表的结构
字段 | 类型 | 空 | 默认 |
reader_id | int(10) | 否 | |
username | varchar(20) | 否 | |
password | varchar(1000) | 否 | |
| varchar(20) | 否 | |
gender | varchar(10) | 否 | |
address | varchar(100) | 否 | |
profession | varchar(100) | 否 | |
level | int(11) | 否 | |
表的结构
字段 | 类型 | 空 | 默认 |
return_id | int(11) | 否 | |
book_id | int(11) | 否 | |
reader_id | int(11) | 否 | |
lendTime | datetime | 否 | |
returnTime | datetime | 否 | |
isReturn | int(11) | 否 | 1 |
转存表中的数据
字段 | 类型 | 空 | 默认 |
return_id | int(11) | 否 | |
book_id | int(11) | 否 | |
reader_id | int(11) | 否 | |
lendTime | datetime | 否 | |
returnTime | datetime | 否 | |
isReturn | int(11) | 否 | 1 |
表的结构
六、数据库物理设计
6.1 索引
对象名 | 索引值 |
book | book_id |
reader | reader_id |
lend_out | lend_id |
return_back | return_id |
favourite | favourite_id |
preservation | preservation_id |
book_sort | sort_id |
七、应用程序设计
7.1 功能模块
1.index板块,能够显示欢迎界面,以及一些有关于网站的基本介绍
2.searh板块,能够按照关键字进行搜索
3.rank板块,将所有书籍按照分类,显示每一类最受欢迎,也就是借阅次数最多的三本书
4.login板块,能够让游客输入用户名、密码进行登录,如果可以的话,最好能够以验证码进行验证登陆
5.register板块,能够让游客注册信息
6.logout板块,能够支持让当前用户登出功能
7.detail板块,在用户板块和管理员板块当中嵌入,对于普通读者用户,可以支持添加到收藏夹(favourite)、取消收藏、添加到预定图书(preserve)、取消预订功能;对于管理员,则可以进行编辑(edit)和删除(delete)功能
8.individual_information板块,能够显示当前用户的个人基本信息,并且支持一些修改操作
9.individual_borrow_list板块,能够显示当前用户正在借阅的书籍
10.individual_favourite板块,能够显示当前用户已经选择收藏的书籍
11.individual_preservation板块,能够显示当前用户已经预定的书籍
12.books_add板块,能够允许超级管理员进行新书增添入库的功能
13.books_view板块,能够允许超级管理员对所有书籍进行浏览功能
14.books_edit板块,在View板块当中嵌入,能够允许超级管理员编辑图书信息
15.books_delete板块,在View板块当中嵌入,能够允许超级管理员删除图书性信息
16.books_lend板块,能够允许超级管理员操作借阅图书给读者
17.books_in_preservation板块,能够允许超级管理员按照预订信息将图书借阅给读者
18.books_return板块,能够允许超级管理员按照还书信息记录图书还书情况
19.books_out板块,能够允许超级管理员列出当前借出图书信息
20.Books_in_preservation板块,能够允许超级管理员列出当前预定图书信息
21.manage板块,能够允许超级管理员管理普通用户和普通管理员,并且能够支持设置权限
7.2 界面设计
index欢迎界面index.php
注册界面register.php
注册信息不完整
登陆界面login.php
登录信息有误
搜索界面search.php
排行榜rank.php
普通读者用户个人信息individual_information.php
普通读者用户的借阅历史以及当前借阅书籍individual_borrow_list.php
普通读者用户收藏夹individual_favourite.php
管理员管理借出书籍信息books_lend.php
管理员管理还书信息books_return.php
管理员管理预约书籍信息books_preserve.php
管理员列出当前所有借阅出去书籍books_out.php
超级管理员管理普通读者用户和管理员信息manage.php
管理员显示当前所有书籍的信息books_view.php
管理员管理修改当前书籍信息books_edit.php
管理员管理删除当前书籍信息books_delete.php
7.3 事务设计
1.CSS编写,模板设计
对于本次课程设计,其实一开始最担心的就是需求分析以及数据库的设计;而在代码开始编写阶段,就是担心界面友好设计的一些东西了。当初在课程设计开始就决定使用PHP+HTML+MySQL是因为平时接触更多数据库的机会是在BS或是BSS架构中遇见的,所以这次想从身边比较熟悉的下手;紧接着而来的问题就是如何写一个CSS,将我所需要的界面呈现出来。
这次使用CSS将所需要的模板架构构建出来,核心代码是在文件夹templates下的header.html文件和footer.html文件。
#footer
padding:20px;
text-align:right;
border-top:1px
margin:0;
color:#999;
}
#header
border-top:20px
}
#wrapper
width:900px;
margin:0
}
这是CSS部分,而后我还需要把CSS部分具体写到html文本当中。
2.读者用户密码修改
首先这个系统在读者用户密码修改部分是在individual_information部分显示的,所以一个在同一个页面显示的页面需要确定一下逻辑。
A第一次进入,!isset(POST[‘change’]),按确认要修改密码
B第二次进入,isset(POST[‘change’]),让用户进行表单修改,修改密码
C第三次进入,isset(POST[‘submit’]),如果确认修改完成,进入步骤A;否则如果修改有误,则进入步骤B
3.密码的加密
PHP当中的密码加密其实非常简答,只需要我们每次在进行密码存取的时候,调用函数md5()即可。
4.读者用户收藏、预约操作
这个收藏、预约操作都是在detail.php文本当中完成的。大致逻辑如下:
if
根据书本bookname和author,显示当前书本信息
}elseif(isset($_POST['disfavourite'])){
取消对当前书本的收藏
}elseif(isset($_POST['favourite'])){
将当前书本加入收藏
}elseif(isset($_POST['dispreserve'])){
取消对当前书本的预约
}elseif(isset($_POST['preserve'])){
将当前书本加入预约
}elseif
根据书本bookid,显示当前书本信息
}
具体结果就是如下所示:
5.管理员编辑
这里是一个比较细节的一个点,就是当一个管理员如果在view板块对所有书籍进行阅览的时候,可以进行两种操作:
如图所示,可以进行edit和delete操作。在edit界面,我们进入如下板块
这里的“update
另外一个delete板块也相同,$query="delete
6.超级管理员管理普通读者用户和管理员权限的设置
具体模块代码在manage.php中实现。具体想法就是每一次先进行判断if(isset($_GET['change_id'])),如果当前判断成立,就表示我当前有需要进行权限转换的普通读者用户和普通管理员,所以就利用SQL语句$query3="update
至于中间显示的operation操作,就是change操作,则是让我们进行权限转换操作,这里才用到是html
表单标签,传递方法method= ” POST ” ,所以才有了开始的判断if(isset($_GET['change_id'])),从而起到了刷新页面每个用户权限的功能。7.涉及时间戳的操作
时间戳可以说是整个系统当中细节处理最为重要的一个部分。首先需要区分MySQL和PHP当中时间戳的区别以及相互转换:
在mysql中有三种时间字段类型:DATETIME,DATE和TIMESTAMP。
DATETIME以YYYY-MM-DD
DATE则是只有年月日以YYYY-MM-DD形式的字串;
TIMESTAMP类型和PHP中的TIMESTAMP类型名字一样,但是两者基本上是不同的。
PHP是延用了UNIX时间签的类型为一个整数,而在mysql中TIMESTAMP字段则是随着记录变化而一个自动更新为当时时间的DATETIMP字段。在mysql4.1版本之后TIMESTAMP格式DATETIME格式基本上是一致了。
于是常常需要在php和msql中对两种格式的Timestamp进行转换。转换方法总结一下:
第一种方法:使用
$mysqltime=date('Y-m-d
$phptime=strtotime($mysqldate);
第二种方法:在查询语句中使用mysql函数转换:UNIX_TIMESTAMP(DATETIME=>PHP
$sql="SELECT
$sql="UPDATE
第三种方法:就是mysql中使用整数字段来保存php的timestamp类型。
由此三种方法,我们就可以很轻松的解决涉及到时间戳的问题了。首先明确有几个功能需要系统对时间进行一系列的设置:涉及借阅时间的设置,主要有books_lend.php、books_retrn.php和individual_borrowing_list.php;涉及预定时间的设置,主要有indivudual_preservation.php,books_in_preservation.php和books_preserve_out.php。
借阅时间的设置:
本次系统对于借出书籍有一个借出时间和一个还书截止日期,分别是表单lend_out的lendTime和deadline属性,而返还书籍则有一个返回时间,对应的是表单return_back的returnTime属性,而每一本书还有一个isInStore属性,用来标记当前这本书是否借出。而后在普通读者用户界面,系统还特地将用户已经借阅的书籍和借阅当中的书籍信息分别显示,中间有一个小点,就是如何判断当前时间是否在deadline之后,方法就是取当前的时间time(),再从数据库当中取出datetime时间deadline,将其转化为UNIX时间戳,方法是strtotime(),最后相减,判断是否大于0,大于0则过期借阅书籍了,否则当前借阅书籍时间还在deadline之内。
中间关键代码就是$currentTime>$tempReturnTime以及$currentTime<$tempReturnTime,就是按照如上所述,利用UNIX时间戳进行的时间早晚判断。
而后在individual_borrow_list.php当中,系统规定可以用一个renew操作,就是可以进行续借功能,实现方式就是将原来时间取出,同时加上十天时间作为续借时间$old
if(isset($_GET['renew'])){
$lend_id=$_GET['renew'];
$query5="select
$result5=mysql_query($query5,$dbc);
$row5=mysql_fetch_array($result5);
$renewTime=$row5['renewTime'];
if(!$renewTime){
$old=strtotime($row5['deadline']);
$neo=date('Y-m-d
echo
";
$query6="update
$query7="update
$result7=mysql_query($query7,$dbc);
if($result7)
mysql_query($query6,$dbc);
else
echo
Something wrong!
";
}else{
echo
You have renewed this book!
";
echo
You cannot renew the same book twice!
";
exit();
}
}
预定时间的设置:
整个时间戳比较难以考虑处理的地方就是预定时间的设置。首先需要确定的是,系统需要能够提供支持的功能,当某个普通读者用户在预定某本书籍之后,一定时间之内该预定是有效的(本系统为了检测方便,设置为五分钟)而后在有效时间之后,该预定就作废,从预定表单当中删除当前预订记录。这里利用一个数据结构当中的lazy概念,就是只有当我需要查询所有预订信息的时候,我才对当前的预定表进行修改,把超过有效时间的记录删除或者设置为无效,这里的lazy概念其实是十分重要的。
八、测试和运行
首先在数据库当中插入超级管理员
insert
values
然后开始进入首页界面
首先进行注册
次进入首页界面
进入搜索板块,搜索书名和作者名字当中含有字母“h”的结果
进入热门板块,查看当前所有书籍按照分类的热门度
进入信息板块,查看个人信息
改密码界面
进入借阅历史板块,查看当前借阅书籍以往借阅历史
进入收藏板块,查看当前用户的收藏夹
到搜索或是热门板块随意选择一本书,作为收藏内容
点击“增添收藏”
则按钮变为“取消收藏”
同时当前读者用户的收藏夹变味了
点击书名“PHP”或者操作“取消收藏”,进入取消收藏的页面
点击“取消收藏”,显示成功取消收藏
则页面返回“增添收藏”按钮
同时个人收藏夹的页面页边为了
进入预定板块,浏览当前读者用户的预定信息
点击某本书的信息页面,选择预定功能
点击按钮“预定本书”,显示
就变为了“取消预定”
预约列表变成了
回到当前本书的信息页面
点击按钮“取消预订”,显示
同时按钮变为“预定本书”
当前用户的预定列表
当前用户登出
用超级管理员账号进行登录
进入添书板块,能够添加书籍
进入浏览板块,能够预览当前所有书籍信息
进入借书板块,将书籍借阅给读者用户,这里显示的是将ID为8的书,借给ID为4的读者用户
回头再看浏览板块,ID为8的书就不在书架上了
进入借阅中板块,浏览当前所有接触书籍的信息
然后再还书板块当中把书籍归还
再回到浏览板块,就会发现ID为8的书籍已经回到书架
在借阅中板块当中,ID为8的书也已经返回了
最后进入的是超级管理员对所有用户,当前状态如图所示
然后系统可以对某一位普通读者用户进行权限变换操作
操作在当前用户我进行某本书籍的预定
那么当我登录另外一个用户的时候,在对当前这么书进行预约,如果当前这类书只有0本,就会出现如下情况
然后等我登录管理员账号,并且输入预定号码
然后就能过成功将预定书籍借出
在管理员的浏览板块我们会发现只有一本的《c》就借出了
在借阅中板块我们也可以很清楚地看到这本书借给了bbb这个用户
我们转而登录bbb,到了借阅历史板块
发现《c》这本书就到了我们当前借阅的记录
当我们按下续借操作之后,我们就可以把进行续借操作
然后可以发现还书的时间就这样延长了30天
之后再点击续借
九、总结
以下是我个人在做系统当中遇到的一些问题
1.借书还书时间的比较,对timestamp有一个很好地理解
2.还书设置,在还书同时更新lend_out,return_back和book表
3.个人收藏夹设置,加入到favourite表
4.设置PHP的mail()函数,设置SMTP,做成一个BSS架构,但是难度比较大,有待完成
5.超级管理员设置
6.修改一类书籍大小设置
7.边界大小的设计,这个需要CSS支持
8.借出书籍的展示
9.对于delete操作,需要我们进行级联删除
10.借书设置,在借出书籍的同时更新book和lend_out
11.MySQL语句的一个重要注意点就是单引号,因为在SQL语句当中,除了数值类型,其他类型的数据都需要单引号包含住,如下所示$query
12.修改单本书籍、修改一类书籍、删除单本书籍、删除一类书籍的操作,原样表单提交修改,只要记录原书名、作者,并且以它进行更新即可
13.密码加密
14.在rank板块,当前种类的显示的个数不足三个的时候,我要取出从来没有借出过的书补充道三本
15.板块detail对两种GET进行操作(1)传入book_id(2)传入bookname和author。加入收藏、取消收藏、预定、取消预订功能
16.$mysqltime
17.修改密码
A第一次进入,!isset(POST[‘change’]),按确认要修改密码
B第二次进入,isset(POST[‘change’]),让用户进行表单修改,修改密码
C第三次进入,isset(POST[‘submit’]),如果确认修改完成,进入步骤A;否则如果修改有误,则进入步骤B
18.预约功能的实现
预约流程
预约号
附. 参考文献
《PHP