论文网

图书馆管理系统的设计与实现

更新时间:2020-02-12 15:45:34点击:

摘  要

随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高。计算机信息处理系统的引进已彻底改变了许多系统的经营管理。

图书管理系统是学校管理机制中的重要组成部分,通过对图书馆管理系统的运行管理机制进行调查和研究,开发了此图书馆管理系统。本文中主要介绍了图书馆管理事务中的常见基本问题等研究背景,进行了全面的可行性分析,详细论证了系统的需求分析、系统设计、系统实现和系统测试过程。

本系统使用PHP进行网页界面的设计,使用MVC设计模式,采用集成开发环境DreamWeaver进行开发。后端的数据库采用MySQL,通过ODBC驱动和数据库进行无缝连接。

系统实现了用户登录、图书管理、借书证管理、图书借阅管理等功能模块。用户登录模块实现用户的登录和权限判定;图书管理模块实现了对图书的添加、删除、修改、查询等功能;借书证管理模块实现了对学生的添加、删除、修改、查询等功能;图书借阅管理模块实现了学生对图书的借阅、还书和所借图书的查看等功能。

测试结果表明,本系统实现了图书馆图书管理的主要功能,基本满足图书管理的需要。

关键词

图书馆,图书管理系统,PHP, MySQL ,JavaScript.



目    录

一、绪 论3

二、需求分析4

(一)图书馆管理系统需求概述4

(二)功能需求4

(三)性能需求5

(四)运行需求6

三、系统设计7

(一)图书馆管理系统设计指导思想和原则7

(二)设计模式7

(三)图书馆管理系统总体功能概述8

(四)图书馆管理系统各功能模块概述9

1.系统登录模块9

2.图书管理模块10

3.学生管理模块11

4.借阅信息管理模块12

5.图书检索模块13

四、系统实现15

(一)系统的软件结构15

(二)登录系统模块的实现15

(三)图书管理模块的实现17

1.图书入库功能的实现17

2.图书维护功能的实现19

(四)学生管理模块的实现24

1.学生添加功能的实现24

2.学生维护功能的实现25

(五)借阅信息管理模块的实现29

1.办理图书借阅功能的实现30

2.办理图书归还功能的实现31

(六)图书检索模块的实现32

(七)系统设计的创新点34

1.系统后台管理的安全性34

2.DAO数据访问接口35

五、系统测试37

(一)系统测试的方法与步骤37

(二)模块测试37

1.登录模块测试37

2.图书管理测试38

3.学生管理测试38

4.借阅信息管理测试39

(三)评价39

六、结束语41

致  谢42

参考文献43


一、绪 论

随着计算机的广泛应用,其逐步成为现代化的标志。图书馆或者一些企业内部,甚至是书店,在正常运行的过程中总是面对大量的读者信息,书籍信息以及两者相互作用产生的借书信息,还书信息。因此需要对读者资源,书籍资源,借书信息,还书信息进行管理,及时了解各个环节中信息的变更,要对因此而产生的单据进行及时的处理,为了提高图书馆或者企业内部对图书存销的自动化的管理,能够更快速地满足读者的要求,提高各种工作效率,现对其设计相应的系统,以达到上述的目的。

图书馆管理系统的主要功能是实现图书馆图书的借阅和归还的管理自动化,图书新增及销毁的及时化,用户及图书信息的更新,围绕这些主要功能,本系统涉及到以下核心功能:借阅管理,归还管理,图书管理,学生管理。除了这些核心功能外,还包括一些基本和辅助的功能,它们是:图书信息管理,查询功能等。

 

二、需求分析

(一)图书馆管理系统需求概述

图书馆管理系统的开发主要涉及到图书的管理,学生信息的管理,借阅信息的管理三大功能的数据管理。从管理的角度可将图书分为三类:图书信息管理、系统用户管理、读者数据管理。图书信息管理包括:添加新进图书、删除旧图书、修改图书信息。系统用户管理包括:修改用户信息、办理新用户、注销用户。读者数据管理主要包括:读者借阅信息的管理,借阅图书以及归还图书。

图书借阅者的需求是查询图书室所存的图书。个人借阅情况以及个人信息的修改;图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时形成借书或还书报表给借阅者查看确认;图书管理人员的功能最为复杂,包括对图书借阅者、图书进行管理和维护、以及系统状态的查询和维护等。

图书馆管理员可以浏览、查询、添加、删除、修改的基本信息;浏览、查询、添加、删除和修改图书借阅者的基本信息;浏览、查询、添加、删除和修改图书的借阅信息。

(二)功能需求

在本系统中,对读者来说,他们关心的问题其实是如何方便的查询到图书馆中的书籍以及自己正在借阅或者已经借阅过一些什么书籍,也就是借阅历史,另一个关心的问题就是所借阅的图书是否到期等等。由此可以得出系统一些需求。

1.与读者相关的基本功能元素

(1)图书查询:应该能够按照图书不同信息对图书进行查询,如书名、作者、图书类型等条件查询。

(2)读者信息查询,读者信息的查询内容应包括以下几个方面:

①读者信息——对读者的基本信息进行显示。

②书刊借阅——对该读者借阅书籍记录进行查询。

③欠款查询——对该读者超期图书的欠款情况的查看。

2.与管理员相关的基本功能元素

在面向系统的管理员来说,应注意如下几点:

(1)图书馆中有哪些书籍,是否可以被借阅;

(2)对学生的添加、修改和删除操作的方便性;

(3)查看学生都借阅着哪些书籍;

(4)对书籍的添加、修改和删除操作的方便性。

3.总体系统的基本功能元素

从以上问题出发,可以得出本系统应该具有的功能:

(1)图书查询——对馆内的图书进行查询;

(2)借阅管理——对读者的每一次借阅,还书进行登记和管理;

(3)图书管理——对图书馆的书籍进行管理,添加、删除以及修改信息;

(4)学生管理——对学生进行管理,添加、删除以及修改信息;

(5)欠款情况管理——对读者借阅图书超期欠款的情况进行管理。

(三)性能需求

1.人身和环境安全性需求

(1)系统中的软件不构成对人身健康的损害;

(2)系统中的软件失效时不造成财产的损失;

(3)系统中的软件失效时不造成环境的破坏。

2.可靠性和可用性需求

(1)系统中的软件可以每天使用24小时,每年使用365天;

(2)系统中的软件故障率小于等于5%。

3.容错性需求

用户输入错误信息时,系统应提示,不应崩溃。

4.易用性

软件适合12-70周岁的智力、视力、体力和肢体正常且具有图书借阅相关知识的人使用;

3.3.5易学性

经过1-2天培训的使用者可以正常使用本软件。

(四)运行需求

1.预期的物理环境

(1)系统在常温环境下使用;

(2)系统在洁净的室内使用。

2.预期的技术环境

(1)宽带网、1M以上宽带互联网;

(2)台式计算机:CPU P4 2.0G以上,内存256M以上,硬盘40G以上,10M/100M网卡,Windows 2000/2003/NT/XP中文操作系统;

(3)数据库管理系统:MySQL5.0及以上。

 

三、系统设计

(一)图书馆管理系统设计指导思想和原则

(1)利用软件开发现有软硬件环境,及先进的管理系统开发方案,从而到达充分利用现在资源提高系统开发水平和应用效果的目的。

(2)系统应该符合软件工程开发的理论,开发方法等开发依据。

(3)系统应满足图书馆管理工作的需要,并达到操作过程中的直观,方便,实用,安全,准确等要求。

(4)系统应具备数据库维护功能,及时根据用户需求进行数据库的各种操作。

(5)系统采用原型,实用模块化程序设计方法,便于系统功能的各种组合和修改,以及系统的测试与维护。

(6)图书馆管理系统的设计应适合校园的发展。

(7)图书馆管理系统的设计应当遵循数据库设计规范。

(二)设计模式

设计模式是面向对象的程序设计人员用来解决编程问题的一种形式化表示。本系统开发采用目前一种广泛流行的软件设计模式MVC。MVC(Model—View—Controller)应用程序结构被用来分析分布式应用程序的特征。这种抽象结构能有助于将应用程序分割成若干逻辑部件,使程序设计变得更加容易。把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

MVC模式的出现,很好的解决了传统开发WEB应用方式中存在的问题。M代表模型(Model),包含完成任务所需要的所有的行为和数据;V代表视图(View)界面,现实模型提供的数据;C代表控制器(Controller),它将模型映射到界面中,处理用户的输入并相应请求。其模型的关系如图所示。在MVC模型中,三层各尽其职、相互独立,各层内部的改变不会影响到其它层,从而降低了数据表达、数据描述和应该操作的耦合度,也能更好的实现开发中的分工,加速工程进度。

(三)图书馆管理系统总体功能概述

图书管理系统包含五个模块分别是:系统登录、图书管理、学生管理、借阅信息管理、图书检索。

系统登录模块:一般用户和管理员都必须登录才能进入系统,用户登录时在后台判断用户的权限类型,分为普通用户和管理员,普通用户可以对书籍进行浏览及个人借阅信息的查询,管理员可以对多种信息进行操作。

图书管理模块:管理员通过验证界面进入系统后,进入到图书管理模块,可以对图书进行添加,删除、修改图书信息、查询、查看等一系列的操作。

学生管理模块:管理员可以在此模块中创建新的普通用户,并且可以对用户的信息进行修改,删除等操作。

借阅信息管理模块:这是图书管系统中最重要的模块之一,管理员进入该模块中可以为普通用户办理借阅图书,归还图书的功能,并且能够实现还款的操作。

图书检索模块:普通用户通过验证界面进入系统后,能够按照书名,作者等多种条件对图书进行查询操作,确保查询到的都是最新的信息。

整体系统的功能模块如图1所示:


 


图1 图书馆管理系统功能图

(四)图书馆管理系统各功能模块概述

1.系统登录模块

用户进入系统时调用的一个模块。该模块根据用户输入的用户名、密码来判断用户的类型,跳转到该类用户的界面。

本模块的功能点包括:

判断用户名和密码是否相符;

根据用户的权限类型,登录到系统的制定界面操作使用。

登录功能模块流程图如图2所示:

 

图2 登录模块流程图

2.图书管理模块

在本模块中图书馆工作人员可以对图书进行管理操作。

本模块的功能点包括:

新书入库,将新进图书按其类型将图书的基本信息录入系统数据库;  

图书出库,某一部分图书会随着时间的增长及知识的更新而变得不再有收藏的价值,或者图书被损坏,这些图书就要在图书库中除去。即从图书库中删除此图书记录;

新书编码,图书入库后,需要贴上条形码,以便以后提供借阅,本系统不涉及到条形码阅读器,只是假定此过程已经生成条形码。编码只是将条形码帖于书上以唯一标识图书;

图书信息修改,图书信息由于工作人员的疏忽,而出现录入错误,提供其图书ID就可以查看图书的基本信息并对其进行修改;

图书管理功能模块流程图如图3所示:

 

图3 图书管理模块流程图

3.学生管理模块

本模块主要是工作者对学生信息(读者借书证信息)进行管理。

本模块的功能点包括:

办理借书证,为新读者办理借书证,填写用户基本信息;

注销借书证,输入读者借书证编号,根据借书证ID删除读者表中此借书证信息;

挂失借书证,主要是将借书证的状态改为挂失,更新读者表状态字段,有图书管理员操作;

修改图书证信息,由于工作人员的疏忽,而出现办理借书证时录入信息有误,则可根据借书证编号对其信息进行查看和修改。

借书证管理功能模块流程图如图4所示:

 

图4 借书证管理模块流程图

4.借阅信息管理模块

本模块主要是工作者对图书外借和归还进行管理。

本模块的功能点包括:

图书借阅,记录借阅证编号和图书编号,进行借书过程。在数据库中插入一天借书记录,该记录包括图书ID、借书证ID、借阅日期、归还日期等;

图书归还,输入借书证编号,图书编号,根据输入的编号在借阅登记表中找到相应的记录,将借阅记录删除,并将该记录相应的数据更新到历史借阅记录信息表中;

查看借阅记录,可以根据借书证ID以及图书ID查询借阅记录。

办理还款,如读者有图书超期的情况将会有欠款,可以根据借书证的ID来为读者班里还款。

借阅信息管理功能模块流程图如图5所示:

 

图5 借阅信息管理模块流程图

5.图书检索模块

使用该模块的用户有:读者和管理员。

本模块的功能点包括:

根据图书ID进行检索;

根据图书名称进行检索;

根据图书类型进行检索。

根据图书作者或译者进行检索。

图书检索功能模块流程图如图6所示:

 

图6 图书检索模块流程图

 

四、系统实现

(一)系统的软件结构

处理静态WEB是由Web浏览器向Web发送静态页面, Web服务器直接对发送的静态网页进行处理。

处理动态WEB数据库查询的过程是:当Web浏览器向Web服务器发送请求时,动态网页的处理流程是,屏蔽掉HTML语言,只输入动态网页文件,由Web服务器向数据库中传递信息,经过数据库的处理返回数据集,Web应用服务器再把含有程序代码的动态网页转换为静态网页返还给Web浏览器。这就是用动态网页对数据库进行查询并将数据返还给浏览器处理的全过程,具体见图7所示。


 

图7数据库查询示意图


(二)登录系统模块的实现

本模块主要是用户通过图书馆管理系统的首页进入该系统。用户输入正确的用户名和密码,如果登录信息有错误,则系统提示登录错误信息,并且禁止系统用户进行任何操作。若登录信息正确,系统会根据用户的身份进行相应权限的判断,读者进入前台系统,管理员进入后台系统。图书馆系统登录主页面如图8所示。

 

图8 图书馆管理系统登录界面

其实现的代码如下:

Action层:

public String login() {

boolean flag = iss.login(admin);

if(flag) { return "success"; }

message = "用户名或口令错误!";

return "fail";

}

Service层:

public boolean login(TAdmin admin) {

TAdmin a = isd.login(admin);

if(a != null) {  return true;}

return false;

}

Dao层:

public TAdmin login(TAdmin admin) {

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery("from TAdmin a where a.adminName = ? and a.adminPassword = ?").setString(0, admin.getAdminName()).setString(1, admin.getAdminPassword());

TAdmin a = (TAdmin)q.uniqueResult();

return a;

}

(三)图书管理模块的实现

图书管理模块主要分为图书入库、查看图书、图书,其中图书入库是往图书管理数据库中添加图书信息。看图书功能中可以查看图书详细信息,并对图书信息进行修改或删除某些废弃图书信息。

1.图书入库功能的实现

点击添加图书功能,填写图书基本信息,为图书选择类型,类型是与数据库交互动态生成的下拉列表,具体界面如图9所示。

 

图9 图书入库界面

其实现的代码如下:

public String addInfoBook() {

this.sortList = ibs.listBookSort();

return "add";

}

public List<TSort> listBookSort() {

return this.getHibernateTemplate().find("from TSort tsort");

}

public String addSaveBook() {

ibs.saveBook(book);

book = null;

bookList = this.listBook();

return "Book";

}

public void saveBook(TBook book) {

Date now = new Date();

book.setBuyDate(now);

book.setCurrentNum(book.getTotalNum());

ibd.saveBook(book);

}

public void saveBook(TBook book) {this.getHibernateTemplate().save(book);

}

2.图书维护功能的实现

点击图书维护功能,展示所有图书的信息列表,在每个图书信息行后提供删除和修改操作功能,并且可以单击选定某一个图书信息后的详细信息进行详细查看图书信息。具体图书列表界面如图10所示

 

图10 图书列表界面

其实现的代码如下:

public String listAllBook() {

bookList = this.listBook();

return "Book";

}

public List<TBook> listBook(TBook book, Page page) {

String hql = "from TBook tb where 1=1";

if(book!=null) {

if(book.getBookNum() != null && !"".equals(book.getBookNum().trim())) {

hql = hql + " and tb.bookNum = '" + book.getBookNum()+"'";

}

if(book.getBookName() != null && !"".equals(book.getBookName().trim())) {

hql = hql + " and tb.bookName = '" + book.getBookName()+"'";

}

if(book.getWriter() != null && !"".equals(book.getWriter().trim())) {  hql = hql + " and tb.writer = '" + book.getWriter()+"'"; }

if(!book.getSortId().getSortId().trim().equals("-1")) {

hql = hql + " and tb.sortId.sortId = '" + book.getSortId().getSortId()+"'";

}

hql = hql + " order by tb.bookName";

} else {

hql = hql + " order by tb.buyDate desc";

}

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery(hql);

q.setFirstResult(page.getStartRow());

q.setMaxResults(5);

List<TBook> list = q.list();

return list;

}

(1)删除图书功能的实现

管理员删除图书,删除时可删除一个,也可同时多选删除,

其实现的代码如下:

public String deleteOneBook() {

ibs.delBookById(bookNum);

bookList = this.listBook();

return "Book";

}

public String deleteMoreBook() {

ibs.delMoreBook(bookNums);

bookList = this.listBook();

return "Book"; 

}

public void delBookById(String bookNum) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TBook.class, bookNum)); 

}

public void delMoreBook(String[] bookNums) {

for(int i=0; i<bookNums.length;i++) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TBook.class, bookNums[i]));}

}

(2)修改图书信息功能的实现

在管理员修改图书信息时,跳转到图书信息详细表单中,列出所要修改图书的详细信息,并可以进行修改,则修改界面如图11所示。

 

图11 修改图书信息界面

其实现的代码如下:

public String modifyInfoBook() {

this.sortList = ibs.listBookSort();

book = ibs.queryOneBookById(bookNum);

return "modifyInfo";

}

public String modifySaveBook() {

ibs.modifyBook(book);

book = null;

bookList = this.listBook();

return "Book";

}

public TBook queryOneBookById(String bookNum) {

TBook book = (TBook)this.getSession().createQuery("from TBook tb where tb.bookNum = ?").setString(0, bookNum).uniqueResult();

this.getSession().close();

return book;

}

public void modifyBook(TBook book) {

this.getHibernateTemplate().update(book);

}

(3)查看图书详细信息功能的实现

在管理员点击详细信息时,跳转到某图书信息详细表单中,列出所选图书的详细信息,则显示界面如图12所示。

 

图12图书详细信息界面

其实现的代码如下:

public String infoDetailBook() {

book = ibs.queryOneBookById(bookNum);

return "Detail";

}

public TBook queryOneBookById(String bookNum) {

TBook book = (TBook)this.getSession().createQuery("from TBook tb where tb.bookNum = ?").setString(0, bookNum).uniqueResult();

this.getSession().close();

return book;

}


(四)学生管理模块的实现

学生管理模块主要分为添加学生、查看学生、修改学生,查看学生的详细信息。 

1.学生添加功能的实现

点击添加学生,填写学生基本信息,具体界面如图13所示。

 

图13办理借书证界面

其实现的代码如下:

public String addInfoStudent() {

this.academyList = iss.listAllAcademy();

return "add";

}

public void addStudent(TStudent student) {

Date now = new Date();

student.setCreateDate(now);

student.setLendedNum(0);

isd.saveStudent(student);

}

public List<TAcademy> listAllAcademy() {

return this.getHibernateTemplate().find("from TAcademy ta");

}

public List<TClass> listAllClass() {

return this.getHibernateTemplate().find("from TClass tc");

}

public void saveStudent(TStudent student) {

this.getHibernateTemplate().save(student);

}

2.学生维护功能的实现

点击学生维护功能,展示所有读者的信息列表,在每个读者信息行后提供删除和修改操作功能,并且可以单击选定某一个读者信息后的详细信息进行详细查看读者信息。具体读者列表界面如图14所示

 

图14 读者列表界面

其实现的代码如下:

public String listAllStudent() {

studentList = this.getStudentListByPage();

return "Student";

}

public List<TStudent> listAllStudent(Page page) {

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery("from TStudent ts");

q.setFirstResult(page.getStartRow());

q.setMaxResults(5);

List<TStudent> list = q.list();

return list;

}

(1)删除学生功能的实现

管理员删除读者,删除时可删除一个,也可同时多选删除。

其实现的代码如下:

public String deleteOneStudent() {

iss.deleteOneStudent(studentNum);

studentList = this.getStudentListByPage();

return "Student";

}

public String deleteMoreStudent() {

iss.deleteMoreStudent(studentNums);

studentList = this.getStudentListByPage();

return "Student";

}

public void deleteOneStudent(String studentNum) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TStudent.class, studentNum));

}

public void deleteMoreStudent(String[] studentNums) {

for(int i=0;i<studentNums.length;i++) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TStudent.class, studentNums[i]));

}

}

(2)修改学生信息功能的实现

在管理员修改学生信息时,跳转到学生信息详细表单中,列出所要修改学生的详细信息,并可以进行修改,则修改界面如图15所示。

 

图15 修改读者信息界面

其实现的代码如下:

public String modifyInfoStudent() {

this.student = iss.getStudentByid(studentNum);

this.academyList = iss.listAllAcademy();

this.classList = iss.listClassById(student.getAcademyId().getAcademyId());

return "modifyInfo";

}

public String modifySaveStudent() {

iss.modifyStudentByid(student);

student = null;

studentList = this.getStudentListByPage();

return "Student";

}

public TStudent getStudentByid(String studentNum) {

return (TStudent)this.getHibernateTemplate().get(TStudent.class, studentNum);

}

public void modifyStudentByid(TStudent student) {

this.getHibernateTemplate().update(student);

}

(3)查看读者详细信息功能的实现

在管理员点击详细信息时,跳转到某读者信息详细表单中,列出所选读者的详细信息,则显示界面如图16所示。

 

图16读者详细信息界面

其实现的代码如下:

public String infoDetailStudent() {

student = iss.getOneStudentById(studentNum);

return "Detail";

}

public TStudent queryOneStudentById(String studentNum) {

TStudent student = (TStudent)this.getSession().createQuery("from TStudent ts where ts.studentNum = ?").setString(0, studentNum).uniqueResult();

this.getSession().close();

return student;

}

(五)借阅信息管理模块的实现

借书信息管理模块主要分为办理图书借阅、办理图书归还、借阅信息查看,其中借阅信息查看可按图书编号和借书证编号查看。

1.办理图书借阅功能的实现

点击图书借阅,填写图书编号和借书证编号,具体界面如图17所示。

 

图17办理图书借阅界面

其实现的代码如下:

public String saveBookStudent() {

message = ils.saveBookStudent(bookStudent);

return "success";

}

public String saveBookStudent(TBookStudent bookStudent) {

TBook book = ild.getOneBook(bookStudent.getBookId());

if(book.getCurrentNum() == 0) {

return "该书已被借完!";

}

TStudent student = ild.getOneStudent(bookStudent.getStudentId());

if(student.getLendedNum() == 9) {

return "借书数量已达到最大,不能在借!";

}

Date borrowDate = new Date();

long l = borrowDate.getTime();

long ll = l + 30*24*60*60*1000L;

Date returnDate = new Date(ll);

bookStudent.setBorrowDate(borrowDate);

bookStudent.setReturnDate(returnDate);

bookStudent.setMoney(0d);//补上所欠金额的计算

ild.saveBookStudent(bookStudent);

book.setCurrentNum(book.getCurrentNum()-1);

ild.modifyBook(book);

student.setLendedNum(student.getLendedNum()+1);

ild.modifyStudent(student);

return "借书成功!";

}

public void saveBookStudent(TBookStudent bookStudent) {

this.getHibernateTemplate().save(bookStudent);

}

2.办理图书归还功能的实现

点击图书归还,填写图书编号和借书证编号,具体界面如图18所示。

 

图18 办理图书归还界面

其实现的代码如下:

public String delBookStudent() {

message = ils.delBookStudent(bookStudent);

return "success";

}

public String delBookStudent(TBookStudent bookStudent) {

TBook book = ild.getOneBook(bookStudent.getBookId());

TStudent student = ild.getOneStudent(bookStudent.getStudentId());

boolean flag = ild.delBookStudent(bookStudent.getStudentId(), bookStudent.getBookId());

if(!flag) {

return "没有该 记录!";

}

book.setCurrentNum(book.getCurrentNum()+1);

student.setLendedNum(student.getLendedNum()-1);

return "还书成功";

}

public boolean delBookStudent(String studentId, String bookId) {

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery("from TBookStudent tbs where tbs.studentId = ? and tbs.bookId = ?").setString(0, studentId).setString(1, bookId);

List<TBookStudent> list = q.list();

if(list.size() != 0) {

TBookStudent bookStudent = list.get(0);

this.getHibernateTemplate().delete(bookStudent);

return true;

}

return false;

}

(六)图书检索模块的实现

本模块主要是用户能够输入自己想要查询图书的条件来快速的检索。图书检索页面如图19示。

 

图19图书检索界面

其实现的代码如下:

public List<TBook> listBook() {

this.sortList = ibs.listBookSort();

if(page == null) {

page = new Page();

page.setCurrentPage(1);

}

page.setTotalRow(ibs.getBookNum(book));

page.setTotalPage((page.getTotalRow()+4)/5);

page.setStartRow((page.getCurrentPage()-1) * 5);

return ibs.listBook(book, page);

}

public List<TBook> listBook(TBook book, Page page) {

String hql = "from TBook tb where 1=1";

if(book!=null) {

if(book.getBookNum() != null && !"".equals(book.getBookNum().trim())) {

hql = hql + " and tb.bookNum = '" + book.getBookNum()+"'";

}

if(book.getBookName() != null && !"".equals(book.getBookName().trim())) {

hql = hql + " and tb.bookName = '" + book.getBookName()+"'";

}

if(book.getWriter() != null && !"".equals(book.getWriter().trim())) {

hql = hql + " and tb.writer = '" + book.getWriter()+"'";

}

if(!book.getSortId().getSortId().trim().equals("-1")) {

hql = hql + " and tb.sortId.sortId = '" + book.getSortId().getSortId()+"'";

}

hql = hql + " order by tb.bookName";

} else {

hql = hql + " order by tb.buyDate desc";

}

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery(hql);

q.setFirstResult(page.getStartRow());

q.setMaxResults(5);

List<TBook> list = q.list();

return list;

}

(七)系统设计的创新点

1.系统后台管理的安全性  

为了不让一般读者用户通过输入网址直接进入后台管理系统,必须采取一定的安全判断措施来进行系统的保护。在这里是通过PHP技术的“session”功能来实现的。session可以在网页运行期间记录某个对象的值,例如session.setAttribute(”KEY”,“super”)这句话就是给 “KEY”这样一个对象赋予了“super”的值。管理员登录系统时,一旦登录成功,就可以为某个对象设置一个session值,然后再进入每个系统管理界面之前都进行一次此对象session值得判断,如果此对象的session值并不是管理员在成功登陆系统后所设置的值,即可跳转到错误页面,反之则成功进入管理页面。由于session的对象是编写者随机设置的,session值也是随机设置的,而且必须在系统网页运行期间进行session的设置才起作用,所以用户是无法直接进入系统后台管理的。这样一来,系统后台管理的安全性就得以保障了。

2.DAO数据访问接口

DAO是数据访问接口(Data Access Object)的缩写,把数据库的连接和操作封装在DAO内。其优点一是让业务代码无需依赖于任何特定的数据访问API;二是提高数据库操作代码的重用率;三是实现了持久层与业务逻辑的分离;四是简化了数据库程序设计。因此,该文档与档案系统采用DAO模式实现与数据库的操作。

在工程文件的目录如图20示:

 

图20 工程目录

其中dao包中有三个类文件,分别是对于不同模块所创建的借口,而在service包中有与dao包中名字对应的三个类文件,跟别实现了dao包中的所有将诶口。这样做就实现了数据与业务的分离。 

五、系统测试

(一)系统测试的方法与步骤

该系统在本地服务器上进行运行和调试,鉴于对系统的内部结构和处理算法的完全了解以及对系统功能的全面掌握对系统进行白盒测试和黑盒测试。

在开发软件系统的过程中,需要面对错综复杂的问题,因此,在软件生存周期的每个阶段都不可避免地会产生错误。测试目的在于:发现错误而执行一个程序的过程,测试的最重要目的是发现其中尚未发现的错误。

为了设计出有效的测试方案按照下面准则进行测试:所有测试都应追溯到用户需求;在完成了需求模型就要着手制定测试计划,在编码之前对所有测试工作进行计划和设计;御用Pareto原理着重对占出错误89%的容易出错的20%的模块进行测试,从小规模开始逐步进行大规模测试,通常先重点测试单个程序模块再转向集成的模块;精心设计测试方案,尽可能充分覆盖程序逻辑使之达到要求的可能性。

(二)模块测试

1.登录模块测试

进入系统,输入用户名和密码,根据用户身份的不同,显示的操作菜单有所不同,一般读者只能查看图书信息和个人信息,并可以查询自己的借阅图书的历史记录;图书管理员可以对图书信息,读者信息以及借阅信息进行查看和管理。当输入错误的用户名称密码时显示登录错误并自动返回登录窗口。


2.图书管理测试

图书管理员进入系统图书管理模块后,可对图书进行添加,修改,删除操作。

(1)添加图书,填写图书基本信息,点击确定按钮,添加成功跳转到成功页面并提示添加成功,可继续添加,添加失败跳转到失败页面并提示添加失败,请重新添加。当填写的信息不完全时,点击确定按钮将根据没有填写的信息给出提示。

(2)删除图书,单个删除时,点击删除则根据图书的ID删除此图书信息,成功则返回列表,不成功则提示未删除成功的原因,多选删除时也根据图书ID数组删除多个图书,并跳转到相应的提示页面。

(3)修改图书信息,点击查看图书信息时,可对图书信息进行修改,修改成功或失败跳转到相应提示页面。

3.学生管理测试

图书管理员进入系统借书证管理模块后,可对借助正进行添加,修改,注销等操作。

(1)办理借书证,填写读者基本信息,点击确定按钮,添加成功跳转到成功页面并提示添加成功,可继续添加,添加失败跳转到失败页面并提示添加失败,请重新添加。当填写的信息不完全时,点击确定按钮将根据没有填写的信息给出提示。

(2)注销借书证,单个删除时,点击删除则根据借书证编号注销此借书证,成功则返回列表,不成功则提示未删除成功的原因,多选删除时也根据借书证ID的数组删除多个借书证,并跳转到相应的提示页面。

(3)修改读者信息,点击查看读者借书证信息时,对其进行修改并根据结果成功或失败跳转到相应提示页面。

4.借阅信息管理测试

图书管理员进入系统借阅信息管理模块后,可对借阅信息进行管理操作。

(1)办理借阅,根据读者借书证编号和图书编号办理读者借阅此图书,若图书剩余数量为0,则提示不能借阅,图书数量不足,如此图书证已经借阅此图书,则提示不能借阅相同的图书,若借阅成功则转向成功界面。

(2)图书归还,根据读者借书证编号和图书编号办理归还图书,借阅信息中必须有这条信息,否则不能归还,跳转提示页面。图书归还成功后不再有这条借阅信息,图书数量加1,并且计算好欠费情况。

(3)查看借阅信息,能够根据图书编号或借书证编号查询借阅信息。

(4)办理还款,根据读者借书证编号为读者办理还款业务,根据结果能够跳转到相应的提示页面。

(三)评价

测试过程严格按照测试的流程,经过单元测试,子系统测试和系统测试。通过单元测试,查找出了系统各个模块内部的错误;通过子系统测试,发现了模块间相互协调和通信上的错误;通过系统的集成测试,发现了软件设计过程中存在的错误。通过改正错误的设计和实现部分,保证了图书借阅管理系统可以完成需求分析中指定的需求。

从上面的测试中可以看出,此系统可以完成用户登录,系统设置,图书管理,读者管理,借阅管理和系统查询等功能。读者在本系统的应用下可以实现按照各种方式(如:书名、编号、作者)查询图书馆的藏书,方便的借阅图书,归还图书,能够查询自己的借阅图书情况。图书馆工作人员能够方便的对图书进行查询,方便的进行读者借阅情况,方便的进行借书还书处理等,便捷的对图书信息进行添加、修改、删除、分类管理等操作,对系统用户进行添加、修改、删除、权限设置等操作,对图书馆的办证参数进行修改维护等操作功能。测试阶段的工作一方面发现了系统的各种错误,另外一方面验证了修改后的系统能够实现提高图书馆工作效率的预期目的。

 

六、总结

不知不觉中,毕业设计已接近尾声。回顾这几个月,短暂而充实。经过这几个月的学习,使我对用例设计有了一定的了解,从开始的式样理解到后来的需求分析到最后的用例设计,一步一步的前进,一点一点的完善,最后完成了该图书馆管理系统的设计与实现。该图书馆管理系统从开始设计到目前为止基本功能已经实现。

本系统具有如下特点:

(1) 采用B/S三层体系结构,使系统具有很好的可维护性和可重用性。

(2) 在本系统的开发过程中采用的是MVC框架开发模式,此模式将明显的把显示和逻辑分离,使代码容易管理,适合于大型项目的开发。

(3) 后台采用的MySQL数据库,MySQL的数据库引擎集成了对XML的支持,同时以可扩展、易于使用和安全的特点,成为建设大型Web站点最好的数据存储设备之一。






致  谢

转眼间,一年的毕业设计马上就要过去了,随之我的大学生活也要结束了。大学生活总是使人难忘,特别是在毕业设计最后阶段令我的更加记忆深刻。

首先我要感谢我的校内和校外导师。在做毕业设计的三个月中,是他们一直在各方面给予我指导和关怀,使我能够顺利地完成毕业设计。他们渊博的学识、仔细认真的态度、对问题深刻的分析以及对我热情的指导和鼓励,都给我留下了深刻的印象,使我终身难忘。

虽然我不在校内实习,但是老师对我也是十分的负责,使我对本系统设计从需求分析到总体分析、总体设计、功能模块划分、程序实现以及测试、调试方面有了正确的方向。在此,要对老师表示衷心的感谢。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。他无论在理论上还是在实践中,都给予我很大的帮助,也使我在很大方面都得到了很大的提高,感谢他耐心的辅导。

本系统开发的成功,是对我几年来的大学学习生活所作的总结,通过它扩大了知识面,也增加了不少实践的经验,为以后的学习生涯打下了坚实的基础。

同时,也要感谢在我大学几年的学习、生活中给予我关怀的老师和同学,更要感谢我的家人对我学业上的支持和鼓励,感谢所有关心帮助过我的人,感谢学校!


参考文献

[1] 高红岩.PHP实用开发指南[M].北京:科学出版社,2012.7

[2] 耿祥义,张跃平.PHP实用教程[M].北京:清华大学出版社,2013.5

[3] 王珊,萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社,2015.5

[4] 廖义奎.PHP编程基础与实例精讲[M].北京:中国电力出版社,2009.1

[5] 王俊标.Java Web开发——基于Struts、EJB、Hibernate、Builder [M].北京:人民邮电出版社,2007.2

[6] 林琪,朱涛江.PHP设计 [M].北京:中国电力出版社,2014.12

[7] 邱哲,王俊标,马斗.PHP WEB设计与开发大全[M].北京:清华大学出版社,2011.2

[8] 孙卫琴. 基于MVC的PHP WEB.设计与开发[M].北京:电子工业出版社,2015.6

[9] 唐有明, 吴华等. PHP动态网站开发 清华大学出版社,2012.8

[10] 孔长征,姜岭. Dreamweaver短期培训教程.北京电子希望出版社,2012.4

[11] 林康司,林上杰. PHP技术手册[M]. 电子工业出版社,2014

[12] 张桂元,贾燕枫. PHP开发入门与项目实践[M]. 人民邮电出版社,2015

[13] 赵强. PHP应用开发[M]. 电子工业出版社,2006

[14] 明日科技. PHP开发技术大全[M].人民邮电出版社,2007

[15] (印度)克里斯那.MySQL应用开发[M].清华大学出版社,2005

[16] 吴京慧, 杜宾, 杨波. MySQL数据库管理及应用开发教程[M]. 清华大学,2009



郑州大学现代远程教育本科毕业论文(设计)评审表

姓 名程建锋学号学习中心

专 业是否申请学位

题 目

指 导 教 师 评 语 及 成 绩




                           成绩:__________ 指导教师签名:____________

学习中心盖章          

                                      年     月     日

答 辩 小 组 意 见              很好   较好   一般   较差  非常差

撰写规范:    □     □     □     □     □

论文选题:    □     □     □     □     □

内容观点:    □     □     □     □     □

结论与创新:  □     □     □     □     □

特别说明:


成绩:___________ 组长签名:____________

                                        年     月    日


郑州大学现代远程教育


毕 业 设 计

题     目: 图书馆管理系统的设计与实现                             

入 学 年 月___2016年9月__

姓       名___程建锋______

学       号__16212506070_

专       业______计算机___

联 系 方 式__13683818976__

学 习 中 心___驻马店    __

指 导 教 师____付永华_____



完成时间2018年09月11日

摘  要

随着科学技术的进步和计算机行业的迅速发展,人们的工作效率得到大大提高。计算机信息处理系统的引进已彻底改变了许多系统的经营管理。

图书管理系统是学校管理机制中的重要组成部分,通过对图书馆管理系统的运行管理机制进行调查和研究,开发了此图书馆管理系统。本文中主要介绍了图书馆管理事务中的常见基本问题等研究背景,进行了全面的可行性分析,详细论证了系统的需求分析、系统设计、系统实现和系统测试过程。

本系统使用PHP进行网页界面的设计,使用MVC设计模式,采用集成开发环境DreamWeaver进行开发。后端的数据库采用MySQL,通过ODBC驱动和数据库进行无缝连接。

系统实现了用户登录、图书管理、借书证管理、图书借阅管理等功能模块。用户登录模块实现用户的登录和权限判定;图书管理模块实现了对图书的添加、删除、修改、查询等功能;借书证管理模块实现了对学生的添加、删除、修改、查询等功能;图书借阅管理模块实现了学生对图书的借阅、还书和所借图书的查看等功能。

测试结果表明,本系统实现了图书馆图书管理的主要功能,基本满足图书管理的需要。

关键词

图书馆,图书管理系统,PHP, MySQL ,JavaScript.



目    录

一、绪 论3

二、需求分析4

(一)图书馆管理系统需求概述4

(二)功能需求4

(三)性能需求5

(四)运行需求6

三、系统设计7

(一)图书馆管理系统设计指导思想和原则7

(二)设计模式7

(三)图书馆管理系统总体功能概述8

(四)图书馆管理系统各功能模块概述9

1.系统登录模块9

2.图书管理模块10

3.学生管理模块11

4.借阅信息管理模块12

5.图书检索模块13

四、系统实现15

(一)系统的软件结构15

(二)登录系统模块的实现15

(三)图书管理模块的实现17

1.图书入库功能的实现17

2.图书维护功能的实现19

(四)学生管理模块的实现24

1.学生添加功能的实现24

2.学生维护功能的实现25

(五)借阅信息管理模块的实现29

1.办理图书借阅功能的实现30

2.办理图书归还功能的实现31

(六)图书检索模块的实现32

(七)系统设计的创新点34

1.系统后台管理的安全性34

2.DAO数据访问接口35

五、系统测试37

(一)系统测试的方法与步骤37

(二)模块测试37

1.登录模块测试37

2.图书管理测试38

3.学生管理测试38

4.借阅信息管理测试39

(三)评价39

六、结束语41

致  谢42

参考文献43


一、绪 论

随着计算机的广泛应用,其逐步成为现代化的标志。图书馆或者一些企业内部,甚至是书店,在正常运行的过程中总是面对大量的读者信息,书籍信息以及两者相互作用产生的借书信息,还书信息。因此需要对读者资源,书籍资源,借书信息,还书信息进行管理,及时了解各个环节中信息的变更,要对因此而产生的单据进行及时的处理,为了提高图书馆或者企业内部对图书存销的自动化的管理,能够更快速地满足读者的要求,提高各种工作效率,现对其设计相应的系统,以达到上述的目的。

图书馆管理系统的主要功能是实现图书馆图书的借阅和归还的管理自动化,图书新增及销毁的及时化,用户及图书信息的更新,围绕这些主要功能,本系统涉及到以下核心功能:借阅管理,归还管理,图书管理,学生管理。除了这些核心功能外,还包括一些基本和辅助的功能,它们是:图书信息管理,查询功能等。

 

二、需求分析

(一)图书馆管理系统需求概述

图书馆管理系统的开发主要涉及到图书的管理,学生信息的管理,借阅信息的管理三大功能的数据管理。从管理的角度可将图书分为三类:图书信息管理、系统用户管理、读者数据管理。图书信息管理包括:添加新进图书、删除旧图书、修改图书信息。系统用户管理包括:修改用户信息、办理新用户、注销用户。读者数据管理主要包括:读者借阅信息的管理,借阅图书以及归还图书。

图书借阅者的需求是查询图书室所存的图书。个人借阅情况以及个人信息的修改;图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时形成借书或还书报表给借阅者查看确认;图书管理人员的功能最为复杂,包括对图书借阅者、图书进行管理和维护、以及系统状态的查询和维护等。

图书馆管理员可以浏览、查询、添加、删除、修改的基本信息;浏览、查询、添加、删除和修改图书借阅者的基本信息;浏览、查询、添加、删除和修改图书的借阅信息。

(二)功能需求

在本系统中,对读者来说,他们关心的问题其实是如何方便的查询到图书馆中的书籍以及自己正在借阅或者已经借阅过一些什么书籍,也就是借阅历史,另一个关心的问题就是所借阅的图书是否到期等等。由此可以得出系统一些需求。

1.与读者相关的基本功能元素

(1)图书查询:应该能够按照图书不同信息对图书进行查询,如书名、作者、图书类型等条件查询。

(2)读者信息查询,读者信息的查询内容应包括以下几个方面:

①读者信息——对读者的基本信息进行显示。

②书刊借阅——对该读者借阅书籍记录进行查询。

③欠款查询——对该读者超期图书的欠款情况的查看。

2.与管理员相关的基本功能元素

在面向系统的管理员来说,应注意如下几点:

(1)图书馆中有哪些书籍,是否可以被借阅;

(2)对学生的添加、修改和删除操作的方便性;

(3)查看学生都借阅着哪些书籍;

(4)对书籍的添加、修改和删除操作的方便性。

3.总体系统的基本功能元素

从以上问题出发,可以得出本系统应该具有的功能:

(1)图书查询——对馆内的图书进行查询;

(2)借阅管理——对读者的每一次借阅,还书进行登记和管理;

(3)图书管理——对图书馆的书籍进行管理,添加、删除以及修改信息;

(4)学生管理——对学生进行管理,添加、删除以及修改信息;

(5)欠款情况管理——对读者借阅图书超期欠款的情况进行管理。

(三)性能需求

1.人身和环境安全性需求

(1)系统中的软件不构成对人身健康的损害;

(2)系统中的软件失效时不造成财产的损失;

(3)系统中的软件失效时不造成环境的破坏。

2.可靠性和可用性需求

(1)系统中的软件可以每天使用24小时,每年使用365天;

(2)系统中的软件故障率小于等于5%。

3.容错性需求

用户输入错误信息时,系统应提示,不应崩溃。

4.易用性

软件适合12-70周岁的智力、视力、体力和肢体正常且具有图书借阅相关知识的人使用;

3.3.5易学性

经过1-2天培训的使用者可以正常使用本软件。

(四)运行需求

1.预期的物理环境

(1)系统在常温环境下使用;

(2)系统在洁净的室内使用。

2.预期的技术环境

(1)宽带网、1M以上宽带互联网;

(2)台式计算机:CPU P4 2.0G以上,内存256M以上,硬盘40G以上,10M/100M网卡,Windows 2000/2003/NT/XP中文操作系统;

(3)数据库管理系统:MySQL5.0及以上。

 

三、系统设计

(一)图书馆管理系统设计指导思想和原则

(1)利用软件开发现有软硬件环境,及先进的管理系统开发方案,从而到达充分利用现在资源提高系统开发水平和应用效果的目的。

(2)系统应该符合软件工程开发的理论,开发方法等开发依据。

(3)系统应满足图书馆管理工作的需要,并达到操作过程中的直观,方便,实用,安全,准确等要求。

(4)系统应具备数据库维护功能,及时根据用户需求进行数据库的各种操作。

(5)系统采用原型,实用模块化程序设计方法,便于系统功能的各种组合和修改,以及系统的测试与维护。

(6)图书馆管理系统的设计应适合校园的发展。

(7)图书馆管理系统的设计应当遵循数据库设计规范。

(二)设计模式

设计模式是面向对象的程序设计人员用来解决编程问题的一种形式化表示。本系统开发采用目前一种广泛流行的软件设计模式MVC。MVC(Model—View—Controller)应用程序结构被用来分析分布式应用程序的特征。这种抽象结构能有助于将应用程序分割成若干逻辑部件,使程序设计变得更加容易。把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

MVC模式的出现,很好的解决了传统开发WEB应用方式中存在的问题。M代表模型(Model),包含完成任务所需要的所有的行为和数据;V代表视图(View)界面,现实模型提供的数据;C代表控制器(Controller),它将模型映射到界面中,处理用户的输入并相应请求。其模型的关系如图所示。在MVC模型中,三层各尽其职、相互独立,各层内部的改变不会影响到其它层,从而降低了数据表达、数据描述和应该操作的耦合度,也能更好的实现开发中的分工,加速工程进度。

(三)图书馆管理系统总体功能概述

图书管理系统包含五个模块分别是:系统登录、图书管理、学生管理、借阅信息管理、图书检索。

系统登录模块:一般用户和管理员都必须登录才能进入系统,用户登录时在后台判断用户的权限类型,分为普通用户和管理员,普通用户可以对书籍进行浏览及个人借阅信息的查询,管理员可以对多种信息进行操作。

图书管理模块:管理员通过验证界面进入系统后,进入到图书管理模块,可以对图书进行添加,删除、修改图书信息、查询、查看等一系列的操作。

学生管理模块:管理员可以在此模块中创建新的普通用户,并且可以对用户的信息进行修改,删除等操作。

借阅信息管理模块:这是图书管系统中最重要的模块之一,管理员进入该模块中可以为普通用户办理借阅图书,归还图书的功能,并且能够实现还款的操作。

图书检索模块:普通用户通过验证界面进入系统后,能够按照书名,作者等多种条件对图书进行查询操作,确保查询到的都是最新的信息。

整体系统的功能模块如图1所示:


 


图1 图书馆管理系统功能图

(四)图书馆管理系统各功能模块概述

1.系统登录模块

用户进入系统时调用的一个模块。该模块根据用户输入的用户名、密码来判断用户的类型,跳转到该类用户的界面。

本模块的功能点包括:

判断用户名和密码是否相符;

根据用户的权限类型,登录到系统的制定界面操作使用。

登录功能模块流程图如图2所示:

 

图2 登录模块流程图

2.图书管理模块

在本模块中图书馆工作人员可以对图书进行管理操作。

本模块的功能点包括:

新书入库,将新进图书按其类型将图书的基本信息录入系统数据库;  

图书出库,某一部分图书会随着时间的增长及知识的更新而变得不再有收藏的价值,或者图书被损坏,这些图书就要在图书库中除去。即从图书库中删除此图书记录;

新书编码,图书入库后,需要贴上条形码,以便以后提供借阅,本系统不涉及到条形码阅读器,只是假定此过程已经生成条形码。编码只是将条形码帖于书上以唯一标识图书;

图书信息修改,图书信息由于工作人员的疏忽,而出现录入错误,提供其图书ID就可以查看图书的基本信息并对其进行修改;

图书管理功能模块流程图如图3所示:

 

图3 图书管理模块流程图

3.学生管理模块

本模块主要是工作者对学生信息(读者借书证信息)进行管理。

本模块的功能点包括:

办理借书证,为新读者办理借书证,填写用户基本信息;

注销借书证,输入读者借书证编号,根据借书证ID删除读者表中此借书证信息;

挂失借书证,主要是将借书证的状态改为挂失,更新读者表状态字段,有图书管理员操作;

修改图书证信息,由于工作人员的疏忽,而出现办理借书证时录入信息有误,则可根据借书证编号对其信息进行查看和修改。

借书证管理功能模块流程图如图4所示:

 

图4 借书证管理模块流程图

4.借阅信息管理模块

本模块主要是工作者对图书外借和归还进行管理。

本模块的功能点包括:

图书借阅,记录借阅证编号和图书编号,进行借书过程。在数据库中插入一天借书记录,该记录包括图书ID、借书证ID、借阅日期、归还日期等;

图书归还,输入借书证编号,图书编号,根据输入的编号在借阅登记表中找到相应的记录,将借阅记录删除,并将该记录相应的数据更新到历史借阅记录信息表中;

查看借阅记录,可以根据借书证ID以及图书ID查询借阅记录。

办理还款,如读者有图书超期的情况将会有欠款,可以根据借书证的ID来为读者班里还款。

借阅信息管理功能模块流程图如图5所示:

 

图5 借阅信息管理模块流程图

5.图书检索模块

使用该模块的用户有:读者和管理员。

本模块的功能点包括:

根据图书ID进行检索;

根据图书名称进行检索;

根据图书类型进行检索。

根据图书作者或译者进行检索。

图书检索功能模块流程图如图6所示:

 

图6 图书检索模块流程图

 

四、系统实现

(一)系统的软件结构

处理静态WEB是由Web浏览器向Web发送静态页面, Web服务器直接对发送的静态网页进行处理。

处理动态WEB数据库查询的过程是:当Web浏览器向Web服务器发送请求时,动态网页的处理流程是,屏蔽掉HTML语言,只输入动态网页文件,由Web服务器向数据库中传递信息,经过数据库的处理返回数据集,Web应用服务器再把含有程序代码的动态网页转换为静态网页返还给Web浏览器。这就是用动态网页对数据库进行查询并将数据返还给浏览器处理的全过程,具体见图7所示。


 

图7数据库查询示意图


(二)登录系统模块的实现

本模块主要是用户通过图书馆管理系统的首页进入该系统。用户输入正确的用户名和密码,如果登录信息有错误,则系统提示登录错误信息,并且禁止系统用户进行任何操作。若登录信息正确,系统会根据用户的身份进行相应权限的判断,读者进入前台系统,管理员进入后台系统。图书馆系统登录主页面如图8所示。

 

图8 图书馆管理系统登录界面

其实现的代码如下:

Action层:

public String login() {

boolean flag = iss.login(admin);

if(flag) { return "success"; }

message = "用户名或口令错误!";

return "fail";

}

Service层:

public boolean login(TAdmin admin) {

TAdmin a = isd.login(admin);

if(a != null) {  return true;}

return false;

}

Dao层:

public TAdmin login(TAdmin admin) {

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery("from TAdmin a where a.adminName = ? and a.adminPassword = ?").setString(0, admin.getAdminName()).setString(1, admin.getAdminPassword());

TAdmin a = (TAdmin)q.uniqueResult();

return a;

}

(三)图书管理模块的实现

图书管理模块主要分为图书入库、查看图书、图书,其中图书入库是往图书管理数据库中添加图书信息。看图书功能中可以查看图书详细信息,并对图书信息进行修改或删除某些废弃图书信息。

1.图书入库功能的实现

点击添加图书功能,填写图书基本信息,为图书选择类型,类型是与数据库交互动态生成的下拉列表,具体界面如图9所示。

 

图9 图书入库界面

其实现的代码如下:

public String addInfoBook() {

this.sortList = ibs.listBookSort();

return "add";

}

public List<TSort> listBookSort() {

return this.getHibernateTemplate().find("from TSort tsort");

}

public String addSaveBook() {

ibs.saveBook(book);

book = null;

bookList = this.listBook();

return "Book";

}

public void saveBook(TBook book) {

Date now = new Date();

book.setBuyDate(now);

book.setCurrentNum(book.getTotalNum());

ibd.saveBook(book);

}

public void saveBook(TBook book) {this.getHibernateTemplate().save(book);

}

2.图书维护功能的实现

点击图书维护功能,展示所有图书的信息列表,在每个图书信息行后提供删除和修改操作功能,并且可以单击选定某一个图书信息后的详细信息进行详细查看图书信息。具体图书列表界面如图10所示

 

图10 图书列表界面

其实现的代码如下:

public String listAllBook() {

bookList = this.listBook();

return "Book";

}

public List<TBook> listBook(TBook book, Page page) {

String hql = "from TBook tb where 1=1";

if(book!=null) {

if(book.getBookNum() != null && !"".equals(book.getBookNum().trim())) {

hql = hql + " and tb.bookNum = '" + book.getBookNum()+"'";

}

if(book.getBookName() != null && !"".equals(book.getBookName().trim())) {

hql = hql + " and tb.bookName = '" + book.getBookName()+"'";

}

if(book.getWriter() != null && !"".equals(book.getWriter().trim())) {  hql = hql + " and tb.writer = '" + book.getWriter()+"'"; }

if(!book.getSortId().getSortId().trim().equals("-1")) {

hql = hql + " and tb.sortId.sortId = '" + book.getSortId().getSortId()+"'";

}

hql = hql + " order by tb.bookName";

} else {

hql = hql + " order by tb.buyDate desc";

}

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery(hql);

q.setFirstResult(page.getStartRow());

q.setMaxResults(5);

List<TBook> list = q.list();

return list;

}

(1)删除图书功能的实现

管理员删除图书,删除时可删除一个,也可同时多选删除,

其实现的代码如下:

public String deleteOneBook() {

ibs.delBookById(bookNum);

bookList = this.listBook();

return "Book";

}

public String deleteMoreBook() {

ibs.delMoreBook(bookNums);

bookList = this.listBook();

return "Book"; 

}

public void delBookById(String bookNum) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TBook.class, bookNum)); 

}

public void delMoreBook(String[] bookNums) {

for(int i=0; i<bookNums.length;i++) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TBook.class, bookNums[i]));}

}

(2)修改图书信息功能的实现

在管理员修改图书信息时,跳转到图书信息详细表单中,列出所要修改图书的详细信息,并可以进行修改,则修改界面如图11所示。

 

图11 修改图书信息界面

其实现的代码如下:

public String modifyInfoBook() {

this.sortList = ibs.listBookSort();

book = ibs.queryOneBookById(bookNum);

return "modifyInfo";

}

public String modifySaveBook() {

ibs.modifyBook(book);

book = null;

bookList = this.listBook();

return "Book";

}

public TBook queryOneBookById(String bookNum) {

TBook book = (TBook)this.getSession().createQuery("from TBook tb where tb.bookNum = ?").setString(0, bookNum).uniqueResult();

this.getSession().close();

return book;

}

public void modifyBook(TBook book) {

this.getHibernateTemplate().update(book);

}

(3)查看图书详细信息功能的实现

在管理员点击详细信息时,跳转到某图书信息详细表单中,列出所选图书的详细信息,则显示界面如图12所示。

 

图12图书详细信息界面

其实现的代码如下:

public String infoDetailBook() {

book = ibs.queryOneBookById(bookNum);

return "Detail";

}

public TBook queryOneBookById(String bookNum) {

TBook book = (TBook)this.getSession().createQuery("from TBook tb where tb.bookNum = ?").setString(0, bookNum).uniqueResult();

this.getSession().close();

return book;

}


(四)学生管理模块的实现

学生管理模块主要分为添加学生、查看学生、修改学生,查看学生的详细信息。 

1.学生添加功能的实现

点击添加学生,填写学生基本信息,具体界面如图13所示。

 

图13办理借书证界面

其实现的代码如下:

public String addInfoStudent() {

this.academyList = iss.listAllAcademy();

return "add";

}

public void addStudent(TStudent student) {

Date now = new Date();

student.setCreateDate(now);

student.setLendedNum(0);

isd.saveStudent(student);

}

public List<TAcademy> listAllAcademy() {

return this.getHibernateTemplate().find("from TAcademy ta");

}

public List<TClass> listAllClass() {

return this.getHibernateTemplate().find("from TClass tc");

}

public void saveStudent(TStudent student) {

this.getHibernateTemplate().save(student);

}

2.学生维护功能的实现

点击学生维护功能,展示所有读者的信息列表,在每个读者信息行后提供删除和修改操作功能,并且可以单击选定某一个读者信息后的详细信息进行详细查看读者信息。具体读者列表界面如图14所示

 

图14 读者列表界面

其实现的代码如下:

public String listAllStudent() {

studentList = this.getStudentListByPage();

return "Student";

}

public List<TStudent> listAllStudent(Page page) {

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery("from TStudent ts");

q.setFirstResult(page.getStartRow());

q.setMaxResults(5);

List<TStudent> list = q.list();

return list;

}

(1)删除学生功能的实现

管理员删除读者,删除时可删除一个,也可同时多选删除。

其实现的代码如下:

public String deleteOneStudent() {

iss.deleteOneStudent(studentNum);

studentList = this.getStudentListByPage();

return "Student";

}

public String deleteMoreStudent() {

iss.deleteMoreStudent(studentNums);

studentList = this.getStudentListByPage();

return "Student";

}

public void deleteOneStudent(String studentNum) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TStudent.class, studentNum));

}

public void deleteMoreStudent(String[] studentNums) {

for(int i=0;i<studentNums.length;i++) {

this.getHibernateTemplate().delete(this.getHibernateTemplate().get(TStudent.class, studentNums[i]));

}

}

(2)修改学生信息功能的实现

在管理员修改学生信息时,跳转到学生信息详细表单中,列出所要修改学生的详细信息,并可以进行修改,则修改界面如图15所示。

 

图15 修改读者信息界面

其实现的代码如下:

public String modifyInfoStudent() {

this.student = iss.getStudentByid(studentNum);

this.academyList = iss.listAllAcademy();

this.classList = iss.listClassById(student.getAcademyId().getAcademyId());

return "modifyInfo";

}

public String modifySaveStudent() {

iss.modifyStudentByid(student);

student = null;

studentList = this.getStudentListByPage();

return "Student";

}

public TStudent getStudentByid(String studentNum) {

return (TStudent)this.getHibernateTemplate().get(TStudent.class, studentNum);

}

public void modifyStudentByid(TStudent student) {

this.getHibernateTemplate().update(student);

}

(3)查看读者详细信息功能的实现

在管理员点击详细信息时,跳转到某读者信息详细表单中,列出所选读者的详细信息,则显示界面如图16所示。

 

图16读者详细信息界面

其实现的代码如下:

public String infoDetailStudent() {

student = iss.getOneStudentById(studentNum);

return "Detail";

}

public TStudent queryOneStudentById(String studentNum) {

TStudent student = (TStudent)this.getSession().createQuery("from TStudent ts where ts.studentNum = ?").setString(0, studentNum).uniqueResult();

this.getSession().close();

return student;

}

(五)借阅信息管理模块的实现

借书信息管理模块主要分为办理图书借阅、办理图书归还、借阅信息查看,其中借阅信息查看可按图书编号和借书证编号查看。

1.办理图书借阅功能的实现

点击图书借阅,填写图书编号和借书证编号,具体界面如图17所示。

 

图17办理图书借阅界面

其实现的代码如下:

public String saveBookStudent() {

message = ils.saveBookStudent(bookStudent);

return "success";

}

public String saveBookStudent(TBookStudent bookStudent) {

TBook book = ild.getOneBook(bookStudent.getBookId());

if(book.getCurrentNum() == 0) {

return "该书已被借完!";

}

TStudent student = ild.getOneStudent(bookStudent.getStudentId());

if(student.getLendedNum() == 9) {

return "借书数量已达到最大,不能在借!";

}

Date borrowDate = new Date();

long l = borrowDate.getTime();

long ll = l + 30*24*60*60*1000L;

Date returnDate = new Date(ll);

bookStudent.setBorrowDate(borrowDate);

bookStudent.setReturnDate(returnDate);

bookStudent.setMoney(0d);//补上所欠金额的计算

ild.saveBookStudent(bookStudent);

book.setCurrentNum(book.getCurrentNum()-1);

ild.modifyBook(book);

student.setLendedNum(student.getLendedNum()+1);

ild.modifyStudent(student);

return "借书成功!";

}

public void saveBookStudent(TBookStudent bookStudent) {

this.getHibernateTemplate().save(bookStudent);

}

2.办理图书归还功能的实现

点击图书归还,填写图书编号和借书证编号,具体界面如图18所示。

 

图18 办理图书归还界面

其实现的代码如下:

public String delBookStudent() {

message = ils.delBookStudent(bookStudent);

return "success";

}

public String delBookStudent(TBookStudent bookStudent) {

TBook book = ild.getOneBook(bookStudent.getBookId());

TStudent student = ild.getOneStudent(bookStudent.getStudentId());

boolean flag = ild.delBookStudent(bookStudent.getStudentId(), bookStudent.getBookId());

if(!flag) {

return "没有该 记录!";

}

book.setCurrentNum(book.getCurrentNum()+1);

student.setLendedNum(student.getLendedNum()-1);

return "还书成功";

}

public boolean delBookStudent(String studentId, String bookId) {

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery("from TBookStudent tbs where tbs.studentId = ? and tbs.bookId = ?").setString(0, studentId).setString(1, bookId);

List<TBookStudent> list = q.list();

if(list.size() != 0) {

TBookStudent bookStudent = list.get(0);

this.getHibernateTemplate().delete(bookStudent);

return true;

}

return false;

}

(六)图书检索模块的实现

本模块主要是用户能够输入自己想要查询图书的条件来快速的检索。图书检索页面如图19示。

 

图19图书检索界面

其实现的代码如下:

public List<TBook> listBook() {

this.sortList = ibs.listBookSort();

if(page == null) {

page = new Page();

page.setCurrentPage(1);

}

page.setTotalRow(ibs.getBookNum(book));

page.setTotalPage((page.getTotalRow()+4)/5);

page.setStartRow((page.getCurrentPage()-1) * 5);

return ibs.listBook(book, page);

}

public List<TBook> listBook(TBook book, Page page) {

String hql = "from TBook tb where 1=1";

if(book!=null) {

if(book.getBookNum() != null && !"".equals(book.getBookNum().trim())) {

hql = hql + " and tb.bookNum = '" + book.getBookNum()+"'";

}

if(book.getBookName() != null && !"".equals(book.getBookName().trim())) {

hql = hql + " and tb.bookName = '" + book.getBookName()+"'";

}

if(book.getWriter() != null && !"".equals(book.getWriter().trim())) {

hql = hql + " and tb.writer = '" + book.getWriter()+"'";

}

if(!book.getSortId().getSortId().trim().equals("-1")) {

hql = hql + " and tb.sortId.sortId = '" + book.getSortId().getSortId()+"'";

}

hql = hql + " order by tb.bookName";

} else {

hql = hql + " order by tb.buyDate desc";

}

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Query q = session.createQuery(hql);

q.setFirstResult(page.getStartRow());

q.setMaxResults(5);

List<TBook> list = q.list();

return list;

}

(七)系统设计的创新点

1.系统后台管理的安全性  

为了不让一般读者用户通过输入网址直接进入后台管理系统,必须采取一定的安全判断措施来进行系统的保护。在这里是通过PHP技术的“session”功能来实现的。session可以在网页运行期间记录某个对象的值,例如session.setAttribute(”KEY”,“super”)这句话就是给 “KEY”这样一个对象赋予了“super”的值。管理员登录系统时,一旦登录成功,就可以为某个对象设置一个session值,然后再进入每个系统管理界面之前都进行一次此对象session值得判断,如果此对象的session值并不是管理员在成功登陆系统后所设置的值,即可跳转到错误页面,反之则成功进入管理页面。由于session的对象是编写者随机设置的,session值也是随机设置的,而且必须在系统网页运行期间进行session的设置才起作用,所以用户是无法直接进入系统后台管理的。这样一来,系统后台管理的安全性就得以保障了。

2.DAO数据访问接口

DAO是数据访问接口(Data Access Object)的缩写,把数据库的连接和操作封装在DAO内。其优点一是让业务代码无需依赖于任何特定的数据访问API;二是提高数据库操作代码的重用率;三是实现了持久层与业务逻辑的分离;四是简化了数据库程序设计。因此,该文档与档案系统采用DAO模式实现与数据库的操作。

在工程文件的目录如图20示:

 

图20 工程目录

其中dao包中有三个类文件,分别是对于不同模块所创建的借口,而在service包中有与dao包中名字对应的三个类文件,跟别实现了dao包中的所有将诶口。这样做就实现了数据与业务的分离。 

五、系统测试

(一)系统测试的方法与步骤

该系统在本地服务器上进行运行和调试,鉴于对系统的内部结构和处理算法的完全了解以及对系统功能的全面掌握对系统进行白盒测试和黑盒测试。

在开发软件系统的过程中,需要面对错综复杂的问题,因此,在软件生存周期的每个阶段都不可避免地会产生错误。测试目的在于:发现错误而执行一个程序的过程,测试的最重要目的是发现其中尚未发现的错误。

为了设计出有效的测试方案按照下面准则进行测试:所有测试都应追溯到用户需求;在完成了需求模型就要着手制定测试计划,在编码之前对所有测试工作进行计划和设计;御用Pareto原理着重对占出错误89%的容易出错的20%的模块进行测试,从小规模开始逐步进行大规模测试,通常先重点测试单个程序模块再转向集成的模块;精心设计测试方案,尽可能充分覆盖程序逻辑使之达到要求的可能性。

(二)模块测试

1.登录模块测试

进入系统,输入用户名和密码,根据用户身份的不同,显示的操作菜单有所不同,一般读者只能查看图书信息和个人信息,并可以查询自己的借阅图书的历史记录;图书管理员可以对图书信息,读者信息以及借阅信息进行查看和管理。当输入错误的用户名称密码时显示登录错误并自动返回登录窗口。


2.图书管理测试

图书管理员进入系统图书管理模块后,可对图书进行添加,修改,删除操作。

(1)添加图书,填写图书基本信息,点击确定按钮,添加成功跳转到成功页面并提示添加成功,可继续添加,添加失败跳转到失败页面并提示添加失败,请重新添加。当填写的信息不完全时,点击确定按钮将根据没有填写的信息给出提示。

(2)删除图书,单个删除时,点击删除则根据图书的ID删除此图书信息,成功则返回列表,不成功则提示未删除成功的原因,多选删除时也根据图书ID数组删除多个图书,并跳转到相应的提示页面。

(3)修改图书信息,点击查看图书信息时,可对图书信息进行修改,修改成功或失败跳转到相应提示页面。

3.学生管理测试

图书管理员进入系统借书证管理模块后,可对借助正进行添加,修改,注销等操作。

(1)办理借书证,填写读者基本信息,点击确定按钮,添加成功跳转到成功页面并提示添加成功,可继续添加,添加失败跳转到失败页面并提示添加失败,请重新添加。当填写的信息不完全时,点击确定按钮将根据没有填写的信息给出提示。

(2)注销借书证,单个删除时,点击删除则根据借书证编号注销此借书证,成功则返回列表,不成功则提示未删除成功的原因,多选删除时也根据借书证ID的数组删除多个借书证,并跳转到相应的提示页面。

(3)修改读者信息,点击查看读者借书证信息时,对其进行修改并根据结果成功或失败跳转到相应提示页面。

4.借阅信息管理测试

图书管理员进入系统借阅信息管理模块后,可对借阅信息进行管理操作。

(1)办理借阅,根据读者借书证编号和图书编号办理读者借阅此图书,若图书剩余数量为0,则提示不能借阅,图书数量不足,如此图书证已经借阅此图书,则提示不能借阅相同的图书,若借阅成功则转向成功界面。

(2)图书归还,根据读者借书证编号和图书编号办理归还图书,借阅信息中必须有这条信息,否则不能归还,跳转提示页面。图书归还成功后不再有这条借阅信息,图书数量加1,并且计算好欠费情况。

(3)查看借阅信息,能够根据图书编号或借书证编号查询借阅信息。

(4)办理还款,根据读者借书证编号为读者办理还款业务,根据结果能够跳转到相应的提示页面。

(三)评价

测试过程严格按照测试的流程,经过单元测试,子系统测试和系统测试。通过单元测试,查找出了系统各个模块内部的错误;通过子系统测试,发现了模块间相互协调和通信上的错误;通过系统的集成测试,发现了软件设计过程中存在的错误。通过改正错误的设计和实现部分,保证了图书借阅管理系统可以完成需求分析中指定的需求。

从上面的测试中可以看出,此系统可以完成用户登录,系统设置,图书管理,读者管理,借阅管理和系统查询等功能。读者在本系统的应用下可以实现按照各种方式(如:书名、编号、作者)查询图书馆的藏书,方便的借阅图书,归还图书,能够查询自己的借阅图书情况。图书馆工作人员能够方便的对图书进行查询,方便的进行读者借阅情况,方便的进行借书还书处理等,便捷的对图书信息进行添加、修改、删除、分类管理等操作,对系统用户进行添加、修改、删除、权限设置等操作,对图书馆的办证参数进行修改维护等操作功能。测试阶段的工作一方面发现了系统的各种错误,另外一方面验证了修改后的系统能够实现提高图书馆工作效率的预期目的。

 

六、总结

不知不觉中,毕业设计已接近尾声。回顾这几个月,短暂而充实。经过这几个月的学习,使我对用例设计有了一定的了解,从开始的式样理解到后来的需求分析到最后的用例设计,一步一步的前进,一点一点的完善,最后完成了该图书馆管理系统的设计与实现。该图书馆管理系统从开始设计到目前为止基本功能已经实现。

本系统具有如下特点:

(1) 采用B/S三层体系结构,使系统具有很好的可维护性和可重用性。

(2) 在本系统的开发过程中采用的是MVC框架开发模式,此模式将明显的把显示和逻辑分离,使代码容易管理,适合于大型项目的开发。

(3) 后台采用的MySQL数据库,MySQL的数据库引擎集成了对XML的支持,同时以可扩展、易于使用和安全的特点,成为建设大型Web站点最好的数据存储设备之一。






致  谢

转眼间,一年的毕业设计马上就要过去了,随之我的大学生活也要结束了。大学生活总是使人难忘,特别是在毕业设计最后阶段令我的更加记忆深刻。

首先我要感谢我的校内和校外导师。在做毕业设计的三个月中,是他们一直在各方面给予我指导和关怀,使我能够顺利地完成毕业设计。他们渊博的学识、仔细认真的态度、对问题深刻的分析以及对我热情的指导和鼓励,都给我留下了深刻的印象,使我终身难忘。

虽然我不在校内实习,但是老师对我也是十分的负责,使我对本系统设计从需求分析到总体分析、总体设计、功能模块划分、程序实现以及测试、调试方面有了正确的方向。在此,要对老师表示衷心的感谢。老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。他无论在理论上还是在实践中,都给予我很大的帮助,也使我在很大方面都得到了很大的提高,感谢他耐心的辅导。

本系统开发的成功,是对我几年来的大学学习生活所作的总结,通过它扩大了知识面,也增加了不少实践的经验,为以后的学习生涯打下了坚实的基础。

同时,也要感谢在我大学几年的学习、生活中给予我关怀的老师和同学,更要感谢我的家人对我学业上的支持和鼓励,感谢所有关心帮助过我的人,感谢学校!


参考文献

[1] 高红岩.PHP实用开发指南[M].北京:科学出版社,2012.7

[2] 耿祥义,张跃平.PHP实用教程[M].北京:清华大学出版社,2013.5

[3] 王珊,萨师煊.数据库系统概论(第四版)[M].北京:高等教育出版社,2015.5

[4] 廖义奎.PHP编程基础与实例精讲[M].北京:中国电力出版社,2009.1

[5] 王俊标.Java Web开发——基于Struts、EJB、Hibernate、Builder [M].北京:人民邮电出版社,2007.2

[6] 林琪,朱涛江.PHP设计 [M].北京:中国电力出版社,2014.12

[7] 邱哲,王俊标,马斗.PHP WEB设计与开发大全[M].北京:清华大学出版社,2011.2

[8] 孙卫琴. 基于MVC的PHP WEB.设计与开发[M].北京:电子工业出版社,2015.6

[9] 唐有明, 吴华等. PHP动态网站开发 清华大学出版社,2012.8

[10] 孔长征,姜岭. Dreamweaver短期培训教程.北京电子希望出版社,2012.4

[11] 林康司,林上杰. PHP技术手册[M]. 电子工业出版社,2014

[12] 张桂元,贾燕枫. PHP开发入门与项目实践[M]. 人民邮电出版社,2015

[13] 赵强. PHP应用开发[M]. 电子工业出版社,2006

[14] 明日科技. PHP开发技术大全[M].人民邮电出版社,2007

[15] (印度)克里斯那.MySQL应用开发[M].清华大学出版社,2005

[16] 吴京慧, 杜宾, 杨波. MySQL数据库管理及应用开发教程[M]. 清华大学,2009

推荐文章

必威体育下载