摘 要
大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势。在图书馆的要求下,开发一款整体式结构的图书馆管理系统,将复杂的系统进行拆分,能够实现对需求的变化快速响应、系统稳定性的保障,能保证平台可持续、规模化发展的要求。
本系统的前端界面涉及的技术主要有php,HTML,jQuery等等,通过这些技术可以实现前端页面的美观和动态效果使之符合广大群众的审美观,后台主要使用的技术主要有Java编程语言,MySQL数据库,Thinkphp框架和Ajax异步交互,根据Ajax异步模式的图书馆管理系统解决了传统管理方式所带来的人力、物力和时间上的虚耗和交流深度的限定,这让交流的过程更快捷、准确、便利,同时完成图书馆管理系统的基本功能:用户管理、图书归还记录、新书订购记录、图书管理、图书分类、图书借阅记录。
关键词:图书馆管理;整体式结构;Java编程语言;MySQL数据库
Design and Implementation of Library Management System
Abstract
In the era of big data, data is growing explosively. In order to meet the trend of the information age and the requirements of information security, using the Internet to serve other industries and promote production has become an irresistible trend. At the request of the library, develop a library management system with an integral structure to split the complex system, which can realize the rapid response to the change of demand, the guarantee of system stability, and the requirements of sustainable and large-scale development of the platform.
The technologies involved in the front-end interface of the system mainly include PHP, HTML, jQuery, etc. through these technologies, the beauty and dynamic effect of the front-end page can be realized to make it conform to the aesthetics of the masses. The main technologies used in the background mainly include Java programming language, MySQL database, ThinkPHP framework and Ajax asynchronous interaction, The library management system based on Ajax asynchronous mode solves the waste of human, material and time and the limitation of communication depth brought by the traditional management mode, which makes the communication process faster, accurate and convenient. At the same time, it completes the basic functions of the library management system: user management, book return record, new book order record, book management, book classification Book borrowing records.
Key words: Library management; Integral structure; Java programming language; Mysql database
目 录
第1章 绪论
1.1 研究背景与意义
1.2 开发现状
1.3 论文组成结构
第2章 开发工具及相关技术介绍
2.1开发技术
2.2 MVVM模式介绍
2.3 MYSQL数据库
2.4 B/S结构
2.5 Thinkphp框架介绍
第3章 系统分析
3.1 可行性分析
3.1.1 技术可行性
3.1.2 经济可行性
3.1.3 操作可行性
3.2 需求分析
3.3 系统业务流程分析
3.4 系统数据流程分析
第4章 系统设计
4.1 系统架构设计
4.2 系统功能结构
4.3 功能模块设计
4.4 数据库设计
4.4.1 概念模型设计
4.4.2 逻辑结构设计
4.4.3 数据库连接设计
第5章 系统实现
5.1 登录模块的实现
5.2 用户子系统模块的实现
5.3 读者注册模块
5.4 图书列表模块
5.5 个人资料管理模块 28
5.6 读者管理模块 29
5.7 新书订购管理模块 33
5.8 图书借阅管理模块 35
第6章 系统测试 36
6.1 测试目的 36
6.2 测试用例
6.2.1 登录测试 36
6.2.2 注册测试 36
6.2.3 留言反馈测试 36
6.2.4 图书管理测试 37
6.2.5 图书借阅测试 37
6.3 测试结果 38
第7章 总结与展望 40
参考文献 41
致谢 42
-
绪论
- 研究背景与意义
图书馆管理系统是对传统图书馆管理模式的一种改进,它可以充分利用网络的特性,随时随地的对图书进行管理,不受时空的局限,很大程度地简化了图书管理的过程,减轻了管理员工作,为借阅者提供便捷的途径,提高了图书的利用率。本系统的优势主要体现在如下几个方面:
(1)管理员通过数据库管理和维护系统可以对借阅者和图书进行管理和维护。管理员可以对后台数据中的信息进行删除、修改、更新等基本操作以管理和维护借阅者信息。
(2)用户可以通过图书作者、图书名、ISBN、出版社、主题词、图书书号进行查询,以便用户对图书信息的快速检索。
(3)图书的添加,新书的出版可以及时的输入数据库以待取用,已经报废的旧书及时的删除或禁用。
(4)借阅者可以在线随时查询图书信息,借阅图书,等待管理员审核通过。
-
- 开发现状
当前图书馆管理系统中,主流的国内产品主要有汇文软件产品、ADLIB2.0、金盘软件产品等,主流的国外产品主要以ExLibris的Aleph500为代表。近年来,随着Web2.0的发展和Library2.0研究的深入,给图书馆管理系统带来了新的理念和思路,图书馆管理系统很好的融合了Library2.0的理念和Web2.0的技术。当前图书馆管理系统普遍存在的问题有:①图书馆资源与服务的相对隔离与孤立;②不能全面集成图书馆的业务和管理工作;③信息孤岛现象日益严重;④难以体现图书馆的管理思路。图书馆管理系统的发展趋势:①融合图书馆的管理理念;②数据驱动管理;③开放合作的理念;④云计算;⑤整合服务评价体系。
-
- 论文组成结构
根据市场调研得到的信息数据,结合国内外前沿研究,利用相关系统开发和设计方法,最终设计出图书馆管理系统。
本文共有七章,如下所示。
第一章概述了图书馆管理系统的研究目的和意义;精炼地总结了国内外在仓储领域的研究情况和未来的研究趋势,最后给出了论文的组成结构。
第二章简要概述了本文所用的开发技术和工具。
第三章简要对系统各业务流程进行需求分析、可行性分析。
第四章对图书馆管理系统进行设计。
第五章对图书馆管理系统进行实现,并贴出相关页面截图,语言描述出具体功能实现的操作方法。
第六章对图书馆管理系统采用测试用例的方式来对一些主要功能模块测试,最后得出测试结果。
第七章总结全文并对未来的研究做出展望。
-
开发工具及相关技术介绍
- 开发技术
本系统前端部分基于MVVM模式进行开发,采用B/S模式,后端部分基于php的Thinkphp框架进行开发。
前端部分:前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router和Vuex实现动态路由和全局状态管理,Ajax实现前后端通信,Element UI组件库使页面快速成型。
后端部分:采用Thinkphp作为开发框架,同时集成Redis等相关技术。
-
- MVVM模式介绍:
MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。微软的WPF带来了新的技术体验,如Silverlight、音频、视频、3D、动画……,这导致了软件UI层更加细节化、可定制化。同时,在技术层面,WPF也带来了 诸如Binding、Dependency Property、Routed Events、Command、DataTemplate、ControlTemplate等新特性。MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。它立足于原有MVP框架并且把WPF的新特性糅合进去,以应对客户日益复杂的需求变化。
-
- MYSQL数据库
网站的开发必须配套相应数据库,数据库具有一定的组织结构,能够存放和管理数据信息,在以前数据库的功能仅仅是数据保存和管理操作,但是时代的变迁和发展,现在的数据库演变成了数据处理的方式,数据库从最开始的简单存放数据表格信息到现在的能够存放成千上万数据的大型数据库,期间还是经历了许多的改革。
本次开发的管理系统使用的数据库是MYSQL数据库,该数据库运行速度快,安全性能也很高,而且对使用的平台没有任何的限制,所以被广泛应运到系统的开发中。MySQL是一个开源和多线程的关系管理数据库系统,MySQL是开放源代码的数据库,具有跨平台性,虽然功能未必强大,导致很多人都了解这个数据库的基本应用,在数据库中,总共建立了10几个表,这里面每个表都是相对应的,都各自有各自的联系,数据库意义重大,如果没有数据库的链接,就没办法运行程序,这显然可以看见数据库与程序的重要性,是紧密相连接的。
-
- B/S结构
B/S(浏览器/服务器)结构是目前主流的网络化的结构模式,它能够把系统核心功能集中在服务器上面,可以帮助系统开发人员简化操作,便于维护和使用。只需要用户在客户端安装360浏览器、谷歌浏览器、QQ浏览器等当前大众浏览器,在电脑里面安装sqlserver、mysql数据库等数据库。安装好的浏览器与服务器端的数据库进行信息数据的交互。很多专门软件能够做到的事情,采用B/S结构模式也能实现,它能够结合Web浏览器技术,ActiveX技术以及多种脚本语言等技术。帮助程序开发者节约了不少开发成本。目前B/S结构成为程序开发主流结构,它最好的地方就是没有地点限制还不用专门安装软件,笔记本或者电脑能够上网就能访问系统。系统使用B/S进行开发在后期系统维护上面就会很省事,不用什么问题都在服务器上面操作,简单的客户端处理就解决部分问题,开发出来的程序跟用户交互性上面也会增强,还可以实时刷新浏览器进行程序局部的数据信息更新。
图1-1 B/S模式三层结构图
-
- Thinkphp框架介绍:
ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进。
ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。
ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,ThinkPHP框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。
作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。
-
系统分析
- 可行性分析
在软件开发的过程中系统的可行性分析是必不可少的,可行性的研究就是评估问题是否能得到解决并且是要以最少的时间和最少的代价来解决。为实现上面的目标还要必须考虑到解决这些问题的方法的优点和缺点,还要考虑到实现了这些系统规模的开发带来的经济效益。这里可以用技术的可行性,操作的可行性,经济的可行性对我们的系统进行可行性的研究。图书馆管理系统的可行性分析如下所示:
-
-
- 技术可行性
-
图书馆管理系统采用的是Java编程语言并于JSP和Servlet的模式,数据库部分采用的是当前流行的MySQL数据库,图书馆管理系统中的所有数据资源都存储在MySQL数据库中,本系统多处采用了Ajax的异步操作,Ajax技术可以对用户指定部分的数据进行局部刷新,不仅减少了服务器对页面的解析而且极大增加了用户的体验度。本系统的环境配置也较为简单,因为用的是Myeclipse编辑器,而Myeclipse里面有自带的Tomcat服务器和JDK环境,因此不需要我们在重新配置。
本系统采用Java、MySQL来支持事务和数据逻辑用H5来做前台页面的显示。
HTML网页中的不同组成成分是采用标签的形式来进行标识的。以下是HTML的基本的组成布局:
图3-1 HTML基本构成图
-
-
- 经济可行性
-
图书馆管理系统是在Java和MySQL的环境中运行的,而系统的成本也只是主要分布在软件的开发和维护上。但如果系统上线投入使用之后,不仅可以方便人们,还节省了用户的时间和精力,而且还极大限度的方便了运营者,减少了运营者的工作强度。图书馆管理系统其实也不太复杂,在开发的时候经济支出也不大,在开发系统时时间用的也不多,从时间的优势和对经济利益方面产生的好处远超过维护和管理的成本,所以开发此系统是可行合适的。
-
-
- 操作可行性
-
本系统是基于浏览器和服务器的图书馆管理系统,系统开发完成之后用户只需要在浏览器中输入正确的URL地址即可进行访问。本系统的前台页面简单明了,在没有操作指导的情况下也可以进行操作,无论是系统管理员还是读者在页面中所有的操作都是在浏览器中完成的,因此只要电脑在有网络的情况下,打开浏览器都能操作。而且在使用之前也不用进行相关的环境配置,因此本系统方便、简单、易于使用,所以该系统是容易并且可操作的。
-
- 需求分析
根据用户对系统的需求,要求系统简单操作,能够准确,完整的对信息进行管理。图书馆管理系统在对需求做解析后,整个系统主要分为两个部分:管理员和读者,每个模块下的分支功能不一样。对功能做出如下说明:
管理员模块:用户管理、图书归还记录、新书订购记录、图书管理、图书分类、图书借阅记录。
读者模块:图书、图书借阅、图书归还、我的收藏、我的账户、公告栏。
读者用例图如下所示。
图3-1 读者用例图
管理员用例图如下所示。
图3-2 管理员用例图
根据用例图,对一些重要的用例进行描述。
注册用例描述如下表所示。
表3-1 注册用例描述
用例名称 |
注册 |
参与者 |
读者 |
描述 |
读者填写相关注册数据完成注册成为系统的读者 |
前置条件 |
无 |
后置条件 |
读者填写相关注册数据并且要注册的账号不存在与系统中 |
事件流 |
|
补充说明 |
|
登录用例描述如下表所示。
表3-1 登录用例描述
用例名称 |
登录 |
参与者 |
读者 |
描述 |
读者填写读者名和密码登录系统 |
前置条件 |
读者拥有账号和密码 |
后置条件 |
读者名和密码都正确 |
事件流 |
(1)读者在登录页面输入读者名和密码 (2)系统检测读者输入的读者名和密码是否正确 (3)读者名和密码正确的话,显示登录成功并返回主页面 |
补充说明 |
(a)系统检查除密码不正确,返回登录页面 |
个人信息管理用例描述如下表所示。
表3-1 个人信息管理用例描述
用例名称 |
管理和修改个人信息 |
参与者 |
读者 |
描述 |
读者查看、修改个人信息 |
前置条件 |
读者已登录到系统中 |
后置条件 |
无 |
事件流 |
(1)读者查看个人信息 (2)读者修改个人信息 |
补充说明 |
(a)读者可修改密码 (b)读者可修改个人资料,例如姓名,头像等 |
新书订购用例描述如下表所示。
表3-1 新书订购用例描述
用例名称 |
新书订购 |
参与者 |
读者 |
描述 |
读者执行新书订购 |
前置条件 |
读者已登录 |
后置条件 |
新书订购内容不违规 |
事件流 |
(1)在新书订购页输入新书订购数据,提交新书订购 (2)更新并显示新书订购板 |
补充说明 |
(a)新书订购内容不能为空 |
评论用例描述如下表所示。
图书借阅用例描述如下表所示。
表3-1 图书借阅用例描述
用例名称 |
图书借阅 |
参与者 |
读者 |
描述 |
读者执行图书借阅操作 |
前置条件 |
读者已登录 |
后置条件 |
该图书存在,并且能被借阅 |
事件流 |
(1)在图书页点击要借阅的图书 (2)填写图书借阅表单 |
补充说明 |
(a)图书借阅表单数据不能为空 |
还书用例描述如下表所示。
表3-1 还书用例描述
用例名称 |
还书 |
参与者 |
读者 |
描述 |
读者执行还书操作 |
前置条件 |
读者已登录 |
后置条件 |
该图书存在,并且能被还书 |
事件流 |
(1)在图书页点击要还书的图书 (2)填写还书数据 |
补充说明 |
(a)还书表单数据不能为空 |
续借用例描述如下表所示。
表3-1 续借用例描述
用例名称 |
续借管理 |
参与者 |
读者 |
描述 |
读者提供新增、修改、删除、查阅等功能 |
前置条件 |
|
后置条件 |
无 |
事件流 |
(1)读者查看修改续借 (2)读者添加续借 (3)读者删除续借 |
补充说明 |
(a)新添加的续借不符合要求时会添加失败 (b)修改的续借不符合要求时会修改失败 |
图书用例描述如下表所示。
表3-1 图书用例描述
用例名称 |
图书管理 |
参与者 |
读者 |
描述 |
读者提供新增、修改、删除、查阅等功能 |
前置条件 |
|
后置条件 |
无 |
事件流 |
(1)读者查看修改图书 (2)读者添加图书 (3)读者删除图书 |
补充说明 |
(a)新添加的图书不符合要求时会添加失败 (b)修改的图书不符合要求时会修改失败 |
-
- 系统业务流程分析
图书馆管理系统的业务流程如下图所示。
图3-3 系统业务流程图
管理员拥有最高权限,在对各项信息进行增加、删除、修改后会更新后台数据库的内容,读者在登录进行图书查询、图书点评、图书借阅、新书订购、图书分类、图书归还等指令动作同样会更新后台数据。
-
- 系统数据流程分析
与强调控制逻辑的程序流程图不同,它更关心的是整个系统中数据的具体流动以及数据的加工处理的整个客观过程,是对数据规格的说明。也正因如此,系统数据流图作为系统结构化分析方法中极为重要的一种描述工具备受青睐。
图书馆管理系统的顶层数据流如下图所示。
图3-4系统顶层数据流图
系统顶层数据流:外部实体为用户,第一个流程为登录验证,用户信息表返回密码验证,是否正确,正确则登录系统,错误则反馈信息,登录系统后,根据不同用户的功能选择,来读写数据库。
系统底层数据流如下图所示。
图3-5系统底层数据流图
系统底层数据流:外部实体为管理员和读者,数据流分别有管理员和读者流向系统数据流程,数据表提供数据支持,来完成逻辑操作。
-
系统设计
- 系统架构设计
由于本系统在逻辑事务处理方面对数据库的操作比较频繁所以系统在底层连接数据库时并没有使用原生的JDBC,而是把JDBC进行了封装,封装之后相当于一个连接数据库的工具DB UTIL,这样使用起来会更加方便而且这样进行封装还可以降低系统中代码的冗余,当我们需要连接和使用数据库时只需要调用这个工具里面的一个方法就可以了。而且通过封装可以把对数据库的操作独立起来,当需要连接不同种类的数据库时只需要加以修改就可以达到目的。
DAO层本来并无这个类,它只是java中MVC构造里的一个model概念,主要就是里面的一些方法,而这些方法就是用来访问数据库的方法。我们在软件开发时DAO层我们一般都放接口和接口的实现类,用于来规范实现类的我们叫它接口,实现类重点用于对数据库的操纵。
MVC是一种系统研发的关键模型,M是Model模型,它是系统内部关键程序运行的核心,主要进行对数据库的各种操作。视图View是V也叫做视图,主要的作用是对一些数据进行显示。控制器Controller 是C执行从View的视图层来读取数据,然后控制用户的输入。
系统架构如下图所示。
图4-1系统架构图
-
- 系统功能结构
进入系统后首先要进行登录,验证你的身份,赋予你不同的权限。当你成功登录后,页面会有多个板块,分别是用户管理、新书订购管理、图书分类管理、图书借阅管理、图书归还管理、图书管理。里面界面简单易懂,根据标示可以直接进行方便快捷的操作。
系统功能结构图如下所示。
图4-2系统功能结构图
-
- 功能模块设计
管理员账户的基本信息管理。主要提供管理员账户的基本信息录入、删除、维护和查询等功能,包括:
管理员录入管理员账户基本信息;
管理员更新、增加及删除管理员账户基本信息;
用户根据管理员账户 ID 查询基本信息;
系统管理员更改个人密码;
续借的基本信息管理。主要提供续借的基本信息录入、删除、维护和查询等功能,包括:
用户录入续借基本信息;
用户更新、增加及删除续借基本信息;
用户根据续借 ID 查询基本信息;
图书借阅的基本信息管理。主要是提供图书借阅的基本信息录入、维护和查询功能,包括:
用户录入图书借阅基本信息;
用户更新、增加及删除图书借阅基本信息;
用户根据图书借阅 ID 查询图书借阅基本信息;
还书的基本信息管理。主要是提供还书的基本信息录入、维护和查询功能,包括:
用户录入还书基本信息;
用户更新、增加及删除还书基本信息;
用户根据还书 ID 查询还书基本信息;
图书的基本信息管理。主要提供图书的基本信息录入、删除、维护和查询功能, 包括:
管理员录入图书信息;
管理员更新、增加图书基本信息;
管理员根据图书ID 查询图书基本信息;
用户根据个人信息导航栏查询图书信息;
-
- 数据库设计
一个好的系统它的后台数据库一定要考虑的全面,这和我们建造房子一个概念,房子不是随心所欲建起来的,一切都是在合理设计的基础是实现的,地基打牢固了房子才能建的更高。数据库如果设计的很合理,而且每个方面都能考虑到了那么这个系统才能不会出现大的问题。
-
-
- 概念模型设计
-
本系统在数据库中存放了多张表,分别是读者表、留言反馈表、图书表、借阅表、续借表、还书表、超期表、丢失表。
系统的主要实体间关系E-R图如下图所示。
图4-7系统E-R图
-
-
- 逻辑结构设计
-
此环节把概念转变成数据。由于整个数据库所处理的信息过多,就只展示几个表。
Controller表:
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
controller_id |
int |
11 |
是 |
是 |
管理者ID |
management_number |
varchar |
64 |
是 |
否 |
管理编号 |
full_name |
varchar |
64 |
否 |
否 |
姓名 |
gender |
varchar |
64 |
否 |
否 |
性别 |
post |
varchar |
64 |
否 |
否 |
工作岗位 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
user_id |
int |
11 |
是 |
否 |
用户ID |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
Comment表:
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
comment_id |
int |
11 |
是 |
是 |
评论ID |
user_id |
int |
11 |
是 |
否 |
评论人ID |
reply_to_id |
int |
11 |
是 |
否 |
回复评论ID |
content |
longtext |
0 |
否 |
否 |
内容 |
nickname |
varchar |
255 |
否 |
否 |
昵称 |
avatar |
varchar |
255 |
否 |
否 |
头像地址 |
create_time |
timestamp |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
source_table |
varchar |
255 |
否 |
否 |
来源表 |
source_field |
varchar |
255 |
否 |
否 |
来源字段 |
source_id |
int |
10 |
是 |
否 |
来源ID |
Books表:
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
books_id |
int |
11 |
是 |
是 |
图书ID |
number |
varchar |
64 |
是 |
否 |
编号 |
name |
varchar |
64 |
否 |
否 |
名称 |
author |
varchar |
64 |
否 |
否 |
作者 |
press |
varchar |
64 |
否 |
否 |
出版社 |
book_type |
varchar |
64 |
否 |
否 |
图书类型 |
written |
varchar |
255 |
否 |
否 |
书面 |
stock |
varchar |
64 |
否 |
否 |
库存 |
price |
varchar |
64 |
否 |
否 |
价格 |
hits |
int |
11 |
是 |
否 |
点击数 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
book_return表:
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
book_return_id |
int |
11 |
是 |
是 |
图书归还ID |
number |
varchar |
64 |
否 |
否 |
编号 |
name |
varchar |
64 |
否 |
否 |
名称 |
author |
varchar |
64 |
否 |
否 |
作者 |
press |
varchar |
64 |
否 |
否 |
出版社 |
price |
varchar |
64 |
否 |
否 |
价格 |
borrowing_number |
varchar |
64 |
否 |
否 |
借阅数 |
reader_number |
int |
11 |
否 |
否 |
读者编号 |
full_name |
varchar |
64 |
否 |
否 |
姓名 |
student_id_number |
varchar |
64 |
否 |
否 |
学生证号 |
return_time |
date |
0 |
否 |
否 |
归还时间 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
book_ordering表:
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
book_ordering_id |
int |
11 |
是 |
是 |
新书订购ID |
number |
varchar |
64 |
否 |
否 |
编号 |
name |
varchar |
64 |
否 |
否 |
名称 |
author |
varchar |
64 |
否 |
否 |
作者 |
press |
varchar |
64 |
否 |
否 |
出版社 |
number_of_orders |
varchar |
64 |
否 |
否 |
订购数 |
subscription_date |
date |
0 |
否 |
否 |
订购日期 |
management_number |
int |
11 |
否 |
否 |
管理编号 |
full_name |
varchar |
64 |
否 |
否 |
姓名 |
order_status |
varchar |
64 |
否 |
否 |
订购状态 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
book_classification表;
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
book_classification_id |
int |
11 |
是 |
是 |
图书分类ID |
book_type |
varchar |
64 |
否 |
否 |
图书类型 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
book_borrowing表;
名称 |
类型 |
长度 |
不是null |
主键 |
注释 |
book_borrowing_id |
int |
11 |
是 |
是 |
图书借阅ID |
number |
varchar |
64 |
否 |
否 |
编号 |
name |
varchar |
64 |
否 |
否 |
名称 |
author |
varchar |
64 |
否 |
否 |
作者 |
press |
varchar |
64 |
否 |
否 |
出版社 |
price |
varchar |
64 |
否 |
否 |
价格 |
borrowing_number |
varchar |
64 |
否 |
否 |
借阅数 |
reader_number |
int |
11 |
否 |
否 |
读者编号 |
full_name |
varchar |
64 |
否 |
否 |
姓名 |
student_id_number |
varchar |
64 |
否 |
否 |
学生证号 |
hours_of_loan_service |
date |
0 |
否 |
否 |
借阅时间 |
examine_state |
varchar |
16 |
是 |
否 |
审核状态 |
recommend |
int |
11 |
是 |
否 |
智能推荐 |
create_time |
datetime |
0 |
是 |
否 |
创建时间 |
update_time |
timestamp |
0 |
是 |
否 |
更新时间 |
-
-
- 数据库连接设计
-
该系统的数据库连接方法采用的是C3P0数据连接池的方法,C3P0是开源的JDBC连接池,jdbcURL是所创建的数据库,driverClass连接数据库驱动,user为用户名,password为用户密码,acquireIncrement当连接池中的连接耗尽的时候C3P0一次同时获取的连接数,initialPoolSize初始化连接池中的连接数,minPoolSize和maxPoolSize分别是连接池中保留的最小和最大的连接数。C3P0的特点在于有自动回收空闲连接的功能。
数据库连接池配置代码如下所示。
<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
<default-config>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/goods</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="user">root</property>
<property name="password">admin</property>
<property name="acquireIncrement">3</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxPoolSize">10</property>
</default-config>
</c3p0-config>
-
系统实现
- 登录模块的实现
该登录模块利用js进行设计,JavaScript函数CheckSubmit()对输入框是否为空进行验证,使用js的技术结合MySQL 2012数据库的查询语句进行登录信息的验证。首先从文本框中分别获得账号user_name和密码user_pw,使用Sql语句“select * from t_user where user_name=‘”+user_name+“’ and user_pw=‘”+user_pw+“’”将查询结果赋给rs结果集,若rs.next()返回值为空,表示数据库找不到该用户数据,若rs.next()返回值不为空,则显示登录成功,进入主界面。
用户登录流程图如下所示。
图5-1用户登录流程
用户登录流程:用户只有输入正确的用户名和密码才会成功进入系统,用户输入用户名密码后点击登录按钮,系统会进行校验该用户名是否存在,如果用户名与密码不匹配或者用户名不存在,则返回主界面。
系统登录界面如下图所示。
图5-1系统登录界面
登录功能的逻辑代码如下所示。
public function login()
{
if (Request::isPost()) {
$request = Request::param();
$result = $this->validate($request, $this->validate);
if (true !== $result) {
// 验证失败 输出错误信息
$data['error'] = 30000;
$data['message'] = $result;
} else {
$request['password'] = md5($request['password']);
$result = $this->model->login($request, $this->table);
$data = $result;
}
} else {
$data['error'] = 30000;
$data['message'] = "field的值不能为空!";
}
return json_encode($data);
}
public function login($request=[],$table_name = ''){
$username = $request['username'];
$password = $request['password'];
$bol = $this->where(['username'=>$username])->find();
if ($bol){
$password = md5($password);
if ($request['password']==$bol['password']) {
//添加token信息
$access_token['create_time'] = date('Y-m-d H:i:s');
$access_token['update_time'] = date('Y-m-d H:i:s');
$access_token['info'] = json_encode($bol);
// $access_token['info'] = $bol;
$access_token['token'] = md5(date('Y-m-d H:i:s'));
$bol_token = Db::name('AccessToken')->insert($access_token);
if ($bol_token){
$data['obj'] = $bol;
$data['obj']['token'] = $access_token['token'];
return ['result' => $data];
}else{
return ['error' => ['code' => 5000, 'message' => '登录失败,token生成失败']];
}
} else {
return ['error' => ['code' => 5000, 'message' => '登录失败,密码不正确']];
}
}else{
return ['error' => ['code' => 5000, 'message' => '登录失败,账号不存在']];
}
}
-
- 用户首页模块的实现
在浏览器的地址栏里输入http://localhost:8080/index.jsp 地址,就可以跳转到图书馆管理系统的首页,首页是由4个页面组成的,包括top、left、down和center等页面,这里也是浏览者访问系统的入口,通过@ include引入。
首页载入流程图如下所示。
图5-1首页载入流程
首页载入流程:系统先连接数据库,显示界面参数初始化,读取数据库的数据表,读取html显示模板,对数据按添加时间排序,按照模板设计位置显示数据,刷新显示界面,断开数据库连接。
首页如下图所示。
图5-1首页界面
-
- 读者注册模块
系统的用户通过自行注册生成,在系统首页点击读者注册菜单,系统跳转到对应的注册页面。点击重置按钮,清空所填数据,点击注册按钮完成注册。
读者注册流程图如下所示。
图5-1读者注册流程
注册个人信息实现流程为:填写个人信息,系统使用JQuery选择器获取在网页中输入的注册信息,再对联系方式、登录密码等信息进行验证,验证通过后用Ajax异步请求方式向服务器发送请求并把数据传送到后台,然后验证用户名是否已存在,如果已存在则注册失败提示“用户名已存在”;如果用户表中没有该用户名则把用户信息加入数据库,把操作状态以json字符串方式返回到前台。Ajax请求成功接收到返回的数据时会触发成功回调函数,然后解析返回的json字符串,系统根据返回信息弹出提示框,注册成功后返回登录页。
读者注册界面如下图所示。
图5-1读者注册界面
读者注册页面的逻辑代码如下。
public function register()
{
if (Request::isPost()) {
$request = Request::param();
$request['create_time'] = isset($request['create_time']) ? $request['create_time'] : date('Y-m-d H:i:s');
$request['update_time'] = isset($request['update_time']) ? $request['update_time'] : date('Y-m-d H:i:s');
$result = $this->validate($request, $this->validate);
if (true !== $result) {
// 验证失败 输出错误信息
$data['error'] = 30000;
$data['message'] = $result;
} else {
$request['password'] = md5($request['password']);
$result = $this->model->register($request, $this->table);
$data = $result;
}
} else {
$data['error'] = 30000;
$data['message'] = "field的值不能为空!";
}
return json_encode($data);
}
public function register($request=[],$table_name = ''){
$username = $request['username'];
$bol = $this->where(['username'=>$username])->find();
if (!$bol){
$result = self::allowField(true)->save($request);
if ($result) {
return ['result' => 1];
} else {
return ['error' => ['code' => 3000, 'message' => '注册失败']];
}
}else{
return ['error' => ['code' => 3000, 'message' => '注册失败,账号已存在']];
}
}
-
- 图书列表模块
管理员发布图书后,图书在系统前台显示,用户浏览图书信息,包括图书号、图书类型、图书名称、封面、版数、作者、出版社、库存、作者、价格,选择相应的图书,通过id传参,找到该图书,在add.jsp提交借阅表单,生成借阅记录。
图书流程如下图所示。
图5-1图书流程
图书界面如下图所示。
图5-1图书借阅界面
图书列表的主要逻辑代码:
public function set()
{
if (Request::isPost()) {
$get = Request::get();
$where = [];
foreach($get as $k => $g){
//过滤参数中的页码信息
if($k != 'page' && $k != 'size'){
$where[$k] = $g;
}
}
$request = Request::post();
if($this->table != 'user'){
$request['update_time'] = isset($request['update_time']) ? $request['update_time'] : date('Y-m-d H:i:s');
}
$result = $this->validate($request, $this->validate);
if (true !== $result) {
// 验证失败 输出错误信息
$data['error'] = 30000;
$data['message'] = $result;
} else {
$result = $this->model->set($request, $this->table, $this->table_id, $where);
$data = $result;
}
} else {
$data['error']['code'] = 30000;
$data['error']['message'] = "field的值不能为空!";
}
return json_encode($data);
}
-
- 个人资料管理模块
用户点击登录填写账号信息登录后,会切换内容为“某某用户欢迎您”和历史订单,并给出注销链接。当用户登录成功后会将个人信息保存在session作用域中,点击自己的用户名时,会跳转到个人详细信息页面,由后台通过Freemarker取出session作用域中的用户信息进行动态渲染,例如,邮箱、电话号码、用户名等等。同时页面上会显示修改个人信息和修改密码的按钮,这时客户可以修改自己的登录密码以保障账号的安全性,防止被人窃取账号,通过UserController.java的updatePassword()实现,同时也可以根据自己的个人信息是否变动做出相应的修改,通过updateUserInfo()实现。
密码修改流程图如下所示。
图5-1密码修改流程图
图5-1个人信息界面图
密码修改关键代码如下所示。
public function change_password()
{
$accessTokenModel = new AccessTokenModel();
$token = Request::header('x-auth-token');
if (!empty($token)) {
$result = $accessTokenModel->getToken($token);
if (Request::isPost()) {
$get = Request::get();
$keys = array_keys($get);
$where = [];
if ($result) {
$where[] = ["user_id", '=', $result['user_id']];
$i = 0;
foreach ($get as $key => $val) {
$where[] = [$keys[$i], '=', $val];
$i++;
}
$request = Request::post();
$request['update_time'] = isset($request['update_time']) ? $request['update_time'] : date('Y-m-d H:i:s');
$result = $this->validate($request, $this->validate);
$new_password['password'] = $request['password'];
if (true !== $result) {
// 验证失败 输出错误信息
$data['error'] = 30000;
$data['message'] = $result;
} else {
$result = $this->model->change_password($new_password, $this->table, $this->table_id, $where);
$data = $result;
}
} else {
$data['error'] = 30000;
$data['message'] = "token错误或失效,未查询到用户数据";
}
} else {
$data['error'] = 30000;
$data['message'] = "field的值不能为空!";
}
} else {
$data['error'] = 30000;
$data['message'] = "token的值不能为空!";
}
return json_encode($data);
}
-
- 读者管理模块
根据需求,需要对读者进行注册、删除或修改详情信息。删除或修改读者时,系统根据读者的状态判定为可删除状态下,才会给出删除和修改链接,点击删除链接按钮时,请求到达后台,还会先查询读者状态再次做出判定能否删除。点击修改链接按钮时,会跳转到修改信息的页面,重新填写好数据后,数据提交到后台会对数据库中相应的记录做出修改。
注册读者时,会给出数据填写的页面,该页面根据填写好的读者编号同样会事先发送Ajax请求查询编号是否已存在,数据填写好之后提交到后台,会调用相关服务在数据库中插入记录。
读者管理流程图如下图所示。
图5-1读者管理流程图
读者界面如下图所示。
图5-1读者界面
读者的主要逻辑代码:
public function get_list($request=[],$table_name = '',$table_id = ''){
$page = 1;
$size = $table_name == "auth" ? 100 : 10;
$where = [];
$order = $table_id.'_id desc';
$field = '*';
// echo $order;exit;
$columns = Db::query( "show COLUMNS FROM `".$table_name."`");
foreach($columns as $key=>$val){
$field_name = $val['Field'];
if(isset($request['like'])){
if ($request['like']==true){
//字段模糊查询
if(isset($request[$field_name])){
$where[] = [$field_name, '=', $request[$field_name]];
}
}else{
//字段模糊查询
if(isset($request[$field_name])){
$where[] = [$field_name, 'like', '%' . $request[$field_name] . '%'];
}
}
}else{
//字段模糊查询
if(isset($request[$field_name])){
$where[] = [$field_name, 'like', '%' . $request[$field_name] . '%'];
}
}
//范围查询
if(isset($request[$field_name.'_min'])){
$where[] = [$field_name, '>=', $request[$field_name.'_min']];
}
if(isset($request[$field_name.'_max'])){
$where[] = [$field_name, '<=', $request[$field_name.'_max']];
}
}
//分页
if (isset($request['page'])){
$page = $request['page'];
}
if (isset($request['size'])){
$size = $request['size'];
}
//排序
if (isset($request['order'])){
$order = $request['order'];
}
//查询字段
if (isset($request['field'])){
$field = $request['field'];
}
//模糊查询
$list= $this->where($where)->order($order)->field($field)->page($page, $size)->select()->toArray();
foreach($list as &$l){
foreach($l as &$o){
if(strpos($o,$_SERVER['HTTP_HOST']) === false){
$o = str_replace('upload','http://'.$_SERVER['HTTP_HOST'].'/upload',$o);
}
}
}
return $list;
}
-
- 新书订购管理模块
读者在系统前台后,数据库的新书订购表生成订购信息,管理员在jieyue_list.jsp审核用户的新书订购,审核通过,用户新书订购成功,否则新书订购失败。
新书订购如下图所示。
图5-1新书订购界面
新书订购主要逻辑代码如下所示。
public function add($request=[],$table_name = '',$table_id = ''){
$result = self::allowField(true)->save($request);
if ($result) {
return ['result' => 1];
} else {
return ['error' => ['code' => 3000, 'message' => '数据添加失败']];
}
}
-
- 图书借阅管理模块
读者在系统前台后,数据库的图书借阅表生成借阅信息,管理员在jieyue_list.jsp审核用户的图书借阅,审核通过,用户借阅成功,否则图书借阅失败。
图书借阅如下图所示。
图5-1图书借阅管理流程
图书借阅的界面如所示。
图5-1图书借阅界面
-
系统测试
- 测试目的
在这个产品被投入使用前,首先需要进行试用,这是重要的环节。考虑到某个部分的开发没有缺陷情况下,把各种模块拼接,也有一定概率就存在矛盾。这就好比每个人都很独特,但聚在一起就显得杂乱无章,需要保证有默契的配合。对于测试,要看它的各项内容是否契合的原则。若与最初定下的标准有一定程度上的出入,那么就需要做出一些调整,让最终的大方向朝着目标前进。
-
-
测试用例
- 登录测试
-
测试用例
登录测试用例如下表所示。
表6-1登录测试用例
输入 |
输出 |
|
用户名 |
密码 |
|
空 |
空 |
用户名或密码不能为空 |
蔡徐坤 |
123 |
用户名不能为汉字,请重新输入 |
789 |
789 |
用户名或密码错误 |
678 |
123456 |
登录成功 |
-
-
- 注册测试
-
注册测试用例如下表所示。
表6-2注册测试用例
输入 |
输出 |
|||
用户名 |
密码 |
确认密码 |
邮箱 |
|
空 |
空 |
空 |
空 |
请输入完整 |
001 |
001 |
001 |
001@qq.com |
注册成功 |
002 |
002 |
003 |
002@qq.com |
注册失败,两次密码不一致 |
003 |
003 |
003 |
003.com |
注册失败,邮箱格式不正确 |
-
-
- 新书订购测试
-
新书订购测试用例如下表所示。
表6-3新书订购测试用例
功能 |
测试数据 |
预期结果 |
测试结果 |
新书订购 |
新书订购内容:鸡你太美 |
在新书订购列表中显示新书订购内容,新书订购显示为未回复 |
和预期一致 |
回复新书订购 |
新书订购回复内容:鸡你太美啊 |
新书订购列表中的新书订购“鸡你太美”显示已回复 |
和预期一致 |
删除新书订购 |
删除新书订购“鸡你太美” |
新书订购成功删除 |
和预期一致 |
-
-
- 图书管理测试
-
图书测试用例如下表所示。
表6-4添加图书测试用例
输入 |
输出 |
|||
名称 |
类别 |
书总量 |
出版社 |
|
空 |
空 |
空 |
空 |
添加失败 |
图书1 |
A |
100 |
北大出版社 |
添加成功 |
空 |
A |
100 |
北大出版社 |
添加失败,名称不能为空 |
图书2 |
空 |
100 |
北大出版社 |
添加失败,请选择类别 |
-
-
- 图书借阅测试
-
图书借阅测试用例如下表所示。
表6-5图书借阅测试用例
输入 |
输出 |
|||
名称 |
借阅人 |
借阅日期 |
还书日期 |
|
空 |
空 |
空 |
空 |
添加失败 |
图书1 |
001 |
2021年5月28日 |
2021年5月31日 |
添加成功 |
空 |
001 |
2021年5月28日 |
2021年5月31日 |
添加失败,名称不能为空 |
图书2 |
空 |
2021年5月28日 |
2021年5月31日 |
添加失败,请选择借阅人 |
-
- 测试结果
经过测试,得到测试结果如下表所示。
表6-6测试结果
测试项目 |
内容和目的 |
测试结果 |
用户登录 |
输入正确用户名与密码 |
可以登录 |
输入错误用户名与密码 |
提示错误的信息 |
|
图书管理(添加,修改,删除) |
输入正确信息 |
成功完成 |
输入错误信息 |
操作失败 |
|
修改登录密码 |
修改新的密码 |
成功完成 |
借阅管理(添加,修改,删除) |
输入正确信息 |
成功完成 |
输入错误信息 |
操作失败 |
|
图书分类管理(添加,修改,删除) |
输入正确信息 |
成功完成 |
输入错误信息 |
操作失败 |
|
新书订购管理(添加,修改,删除) |
输入正确信息 |
成功完成 |
输入错误信息 |
操作失败 |
|
还书管理(添加,修改,删除) |
输入正确信息 |
成功完成 |
输入错误信息 |
操作失败 |
- 总结与展望
本次毕业论文的主要是利用PHP框架+MySQL开发一个安全可靠,操作简易,同时具备业务可扩展的图书馆管理系统。本文详细的论述了图书馆管理系统的设计和开发,本系统的所有事务逻辑都是按照系统的需求分析进行设计的,系统有读者和系统管理员两种角色,本系统多处采用了Ajax的异步交互技术,同时它也叫异步交互技术,利用它我们可以让网页的局部进行数据刷新操作,Ajax和传统的数据更新技术大大增加了客户的体验程度,由于是对局部进行操作那么就减少了一些繁琐而又不必要的操作,减轻了服务器对页面解析的负担。
与其他系统相比,本系统有自身的优点,
例如:
(1)创新性强;
(2)业务逻辑性强,安全性高,在一些重要的功能模块需要通过审查之后才可使用;
(3)移植性高,在所有Window平台都可使用。
当然也还有很多需要进一步改进的地方:
(1)系统大多数页面都是全局刷新,缺乏局部刷新,这将增加服务器的压力,如果有大量用户在同一时间段操作同一个功能模块,可能会导致查询缓慢;
(2)页面没有经过专业的UI设计,美观程度不及其他市场其他网站系统,有待改善。
参考文献
[1]孙静.图书馆创新服务的发展策略探析[J].传播与版权,2022(03):70-72.
[2]王秀华,陈玉玲,张文明.基于区块链技术的数字图书馆数字版权管理策略研究——以清华大学数字图书馆为例[J].四川图书馆学报,2022(01):58-62.
[3]高凡,喻兴佳.危机管理双周期曲线下图书馆应急服务体系构建[J].四川图书馆学报,2022(01):23-29.
[4]兰振荣,文丽云.关于智慧医学图书馆体系建设的思考[J].卫生职业教育,2022,40(04):15-17.
[5]任冠华,黄明杰,李娌.基于文献分析浅谈医院图书馆发展及在科研管理中的作用[J].中华医学科研管理杂志,2022,35(01):65-70.
[6]郑世闯,李家俊,陈雨露,赖晓燕.基于互联网+电子商务框架下PHP技术的在线二手车交易平台[J].电子制作,2022,30(02):39-41.
[7]Prakash Waghmare. Global Research Trends on Library Management and Administration: A Bibliometric Analysis[J]. Library Philosophy and Practice,2022:
[8]李琳. 基于网络信息资源环境下的高校图书馆管理研究[C]//课程教学与管理研究论文集(六).,2022:226-230.
[9]Navneet Kumar Sharma,Aditya Tripathi. Exploring status of library management technical aspects in Indian schools[J]. Library Management,2021,43(1/2):
[10]路尧,梁艳.基于PHP和MySQL的破坏性地震震例数据库设计与实现[J].山西地震,2021(04):43-46+50.
[11]Ziyi Wang. The Application of Information Technology in Modern Library Management[J]. International Journal of Intelligent Information and Management Science,2021,10(6):
[12]陈春凯,马娅,刘付祥.基于THINKPHP框架的智能航标管理系统设计[J].电子技术与软件工程,2021(23):178-181.
[13]Hao Yin. The Countermeasures of College Library Management in the Smart Society[J]. Scientific Journal of Economics and Management Research,2021,3(12):
[14]孙海波,陈哲,周琪,陈霓.基于“ThinkPHP-3.2.X远程代码执行漏洞”谈网络安全问题防范[J].中国新通信,2021,23(22):138-140.
[15]金纯峰.基于ThinkPHP框架的教师业务管理系统的设计与实现[J].信息与电脑(理论版),2020,32(24):74-75.
[16]李淼冰,黄英就.基于ThinkPHP的高职科研管理系统的设计与实现[J].现代信息科技,2020,4(23):83-86.
[17]不公告发明人. 一种ThinkPHP框架技术的网上商城系统[P]. 湖南省:CN109426490A,2019-03-05.
[18]吴启伟,陈尚靖. 一种THINKPHP框架的数据处理方法[P]. 广东:CN108874882A,2018-11-23.
[19]Wanmin Zhang. Application of Information Technology in University Library Management[P]. 2021 International Conference on Financial management, Humanities and Social Sciences,2021.
致谢
经过几个月时间的努力终于完成了这篇文章,在文章的写作与研究的过程中遇到了很多困难,都在同学和老师的帮助下解决了。尤其非常感谢我最敬爱的老师,他对我进行了无私的指导和帮助,不厌其烦的帮助进行文章的修改。老师严谨的治学态度、渊博的学术知识、诲人不倦的敬业精神以及宽容的待人风范使我获益颇丰。此外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。在此,向帮助和指导过我的老师表示最衷心的感谢!感谢这篇文章所涉及到的各位学者。本文引用了数位学者的文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇文章的写作。感谢我的同学、朋友以及所在单位的同事,在我写文章的过程中给与了我很多素材和帮助,还在文章的撰写和排版过程中提供热情的帮助。同时,感谢我的室友对我的热心指导和帮助,经常有不懂之处都是大家在帮助我,才使得我比较顺利的完成了这篇文章。由于我水平有限,所写文章难免有不足之处,恳请各位老师和学友批评和指正!文章来源:https://www.toymoban.com/news/detail-475902.html
点赞+收藏+关注 → 私信领取本源代码、数据库文章来源地址https://www.toymoban.com/news/detail-475902.html
到了这里,关于php图书馆管理系统的设计与实现毕业设计-附源码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!