JAVA图书馆管理系统

摘  要

随着电脑、手机等信息工具的普及,人们能更加完善、快捷地处理信息数据。在图书馆的日常运作中,由于图书借阅和用户查询次数繁多,需要进行繁杂的信息数据管理。

书籍是人类不可缺少的精神食粮,尤其重要。所以图书馆借阅信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理图书、期刊、试卷合订本等查询信息,这种查询管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识。作为计算机应用的一部分,使用计算机对图书资源信息进行查询管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书查询管理的效率,也是企业、学校的科学化、正规化管理,与世界接轨的重要条件。为了能更高效、快捷、稳定地管理图书馆的数据信息,本文设计并实现了一套基于Web的图书管理借阅系统。系统采用Browser/Server运行模式,基于JAVA开发平台,并使用SQL Server作为后台数据库系统。系统分为前后台2部分,前台主要实现了以下几个功能:查询图书,读者留言、查看公告栏等。后台以管理员方式登录实现以下几个功能:借还图书、图书管理、读者信息管理,公告栏消息发布等。读者只需要通过浏览器访问本系统,就可以轻松实现图书查询、留言等操作。同样,图书管理员也可以使用本系统方便快捷地完成图书馆的信息数据管理工作。

关键词:图书管理系统;JSP ;web


 ABSTRACT

With the information tools becoming so popular, such as computer and cell phone etc, people can handle the information data more perfectly and rapidly. In the daily library operation, as book-borrowed and the ones searched being so frequently, the library has to deal with a great many complicated data.

Books are indispensable to mankind the ethos. So the library management system should be able to provide enough information and quick searching method. But since people use traditional artificial waymanagement books, periodicals, such information, the query management way has many shortcomings, for example: low efficiency, the bad secrecy, moreover the time is long, will produce the massive documents and the data, for the search, the renewal and the maintenance has brought about a lot of difficulties. Along with the science and technology unceasing enhancement, computer science is mature day after day, its formidable function hadprofoundly known for the people. As a part of computer application, using computer to library resources information query management, which themanual administration center. For example: retrieves, the search rapidly convenient, the reliability high, thereserves big, the secrecy good, the life is long, the cost is low. These merits can enormously enhance the efficiency of management of library inquires, the enterprises, schools, thestandardized management, scientific and the important condition.For the data management more efficiently, fast and reliably, the thesis designs and implements a library management system which is based on Web. On the Java platform, the system adopts the Browser/Server model, which takes SQL Server as a database server. The system mainly carry out the following functions: searching for borrowing and returning, book management, reader information management, reads messages, and the library bulletin. While the readers interview the system through the browser, they can easily search for a book or borrow and return a book etc. Simultaneously, the assistant is able to control the library information datum. In addition, the system is still added a searching function based WAP, by which the readers can search for a book more conveniently and rapidly, by means of wireless network. Such a function brings the readers a great deal convenience.

Key words: Library Management System; WAB; JSP


目    录

第一章 图书馆管理系统综述

第一节 图书馆管理系统背景

第二节 课题研究意义

第二章 图书馆管理系统需求分析

第一节 图书馆管理系统应用需求

第二节 图书馆管理系统设计模式

第三节 开发环境及开发工具

第三章 图书馆管理系统总体设计

第一节 子系统划分及系统模块设计

第二节 系统流程图

第三节 数据库的设计

第四章 图书馆管理系统详细设计及处理技术

第一节 发布首页功能模块

第二节 留言板功能模块

第三节 系统管理员的登录功能模块

第四节 图书查询功能模块

第五节 其余功能模块

图书馆管理系统系统测试

章 总结 (42)

参考文献 (42)

致谢 (43)

第一章 图书馆管理系统综述

第一节 图书馆管理系统背景

当今时代是飞速发展的信息时代,计算机与信息处理技术日渐成熟。随着Internet和计算机网络技术的蓬勃发展,Web技术得到了迅猛地发展。在科学技术高速发展的今天,信息技术已经渗透到社会发展的每一个领域,而计算机技术为工作提供了方便性、高效性、灵活性及安全性,尤其Web技术的高速发展将计算机的应用提升到另一个层次。而图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,利用计算机来管理复杂的信息,能够充分发挥计算机的优越性。书籍是人类不可缺少的精神食粮,尤其重要。所以图书馆借阅信息管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理图书、期刊、试卷合订本等查询信息,这种查询管理方式存在着许多缺点,如:效率低、保密性差,另外时间一长,将产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识。作为计算机应用的一部分,使用计算机对图书资源信息进行查询管理,具有着手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书查询管理的效率,也是企业、学校的科学化、正规化管理,与世界接轨的重要条件。选用JAVA语言进行编程。更是1次编译,处处运行。系统分为前后台2部分,前台主要实现了以下几个功能:查询图书,读者留言、查看公告栏等。后台以管理员方式登录实现以下几个功能:借还图书、图书管理、读者信息管理,公告栏消息发布等。读者只需要通过浏览器访问本系统,就可以轻松实现图书查询、留言等操作。同样,图书管理员也可以使用本系统方便快捷地完成图书馆的信息数据管理工作。

第二节 课题研究意义

尽管目前很多图书馆有图书管理系统,但是仅仅限于图书管理员使用,属于单机系统,对于Internet服务几乎没有,这样的图书管理系统根本没有发挥它的效力,资源闲置比较突出。

基于这此问题,有必要建立一个图书管理系统有效的支持WEB的服务,以使图书管理工作规范化,系统化,程序化,提高信息处理的速度和准确性,并且能通过Internet能够及时、准确修改图书情况。

本系统的设计主要有效的支持WEB访问使得资源利用最大化用户只需要通过浏览器就可以查阅到库中的图书,以及图书馆近期发布的最新消息,还可以留言。

我们系统总体上分为前台页面显示和后台管理。前台页面(即本书图书管理系统的首页)实现了公告的显示图书查询,留言建议三大功能。而后台的页面则集成了图书管理中所需的功能和录入新书到库,办公图书,借还手续,查询图书等等。平时图书管理人员的工作都是在后台中完成的。前台是为了师生显示的。师生们可以看到图书管理人员发布的最新公告信息;并可以查询自己感兴趣的图书,也可以给学校的图书管理人员留言提议。相对应的后台是针对学校图书管理人员,后台的页面都加密,如果不正常登录是进入不了后台管理页面的,后台功能具体包括:发布首页公告,添加新书到库等等

第二章 图书馆管理系统需求分析

第一节 图书馆管理系统应用需求

一个现代化的图书馆在正常运营中总是面对大量的读者信息,书籍信息以及两者相互作用产生的借书信息,还书信息。面对图书馆数以万几计的图书,纷繁复杂的读者信息,频繁更替的借还书信息,传统的直接方法不但管理出现漏洞,造成损失。

因此有一个智能化、系统化、信息化的图书管理系统十分重要的。充分利用计算机的功能实现对读者管理、书籍管理,借阅管理等自动化控制,将会使图书馆的工作大大减弱。方便友好的图形界面、简便的操作、完善的数据库管理。将会使得图书馆系统极大限度的应用于现代化图书管理中。图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。他们以前对信息管理的主要方式是基于文本、表格等纸介质的手工处理,对于图书借阅情况(如借书天数、超过限定借书时间的天数)的统计和核实等往往采用对借书卡的人工检查进行,对借阅者的借阅权限、以及借阅天数等用人工计算、手抄进行。数据信息处理工作量大,容易出错;由于数据繁多,容易丢失,且不易查找。总的来说,缺乏系统,规范的信息管理手段。尽管有的图书馆有计算机,但是尚未用于信息管理,没有发挥它的效力,资源闲置比较突出,这就是管理信息系统的开发的基本环境。

图书馆管理系统需要满足来自两方面的需求,分别是图书借阅者和图书馆工作人员。图书借阅者的需求是查询图书馆所存的各种图书信息;图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时形成借书或还书操作,有修改图书借阅者借书和还书记录的权限,实现对图书信息、借阅者信息、总体借阅情况信息的管理和统计、工作人员和管理人员信息查看及维护。图书馆管理员可以浏览、查询、添加、删除、修改、统计图书的基本信息;浏览、查询、统计、添加、删除和修改图书借阅者的基本信息,浏览、查询、统计图书馆的借阅信息,发布公告,回复留言,以下就是本系统实现的功能。

1.设计不同用户的操作权限和登陆方法

2.对所有用户开放的图书查询

3.查询及统计各种信息

4.维护图书信息

5.维护工作人员和管理员信息

6.维护借阅者信息

7.处理信息的完整性

    第二节 图书馆管理系统设计模式

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

视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和象XHTML,XML/XSL,WML等一些标识语言和Web services.如何处理应用程序的界面变得越来越有挑战性。MVC一个大的好处是它能为你的应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。

模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用象EJBs和ColdFusion Components这样的构件对象来处理数据库。被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

控制器接受用户的输入并调用模型和视图去完成用户的需求。所以当单击Web页面中的超链接和发送HTML表单时,控制器(例如:servlet)本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定用哪个视图来显示模型处理返回的数据。现在我们总结MVC的处理过程,首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

这种设计模式的好处是:

低耦合性。视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

高重用性和可适用性。随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码。它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。例如,很多数据可能用HTML来表示,但是也有可能用WAP来表示,而这些表示所需要的仅令是改变视图层的实现方式,而控制层和模型层无需做任何改变。

较低的生命周期成本。MVC使降低开发和维护用户接口的技术含量成为可能。

快速的部署。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

可维护性。分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特征,有利于通过工程化、工具化管理程序代码。

1 MVC模式

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

开发环境及开发工具

表1 开发环境

种别

软件

版本

OS

Windows

Xp

DB

Sql sever

2000

WebServer

JDK

1.6.0.10

Tomcat

6.0

浏览器

Internet Explorer

6.0及以上

语言编辑

MyEclipse

6.0及以上

SQL Server

SQL Server 是一个关系数据库管理系统。SQL Server 2000是Microsoft公司推出的SQL Server数据库管理系统的最新版本。该版本继承了SQL Server 7.0版本的优点,同时又比它增加了许多更先进的功能:

具有使用方便、可伸缩性好与相关软件集成程度高等优点。可跨越从运行Microsoft Windows 98的膝上型电脑到运行Microsoft Windows 2000的大型多处理器的服务器等多种平台使用。

TOMCAT

Tomcat服务器是Apache Group Jakarta小组开发的一个免费服务器软件,适合于嵌入Apache中使用,而且,它的源代码可以免费获得,你可以自由地对它进行扩充。Tomcat服务器的兼容性很好,如WebLogic服务器采用其为Web服务器引擎,Jbuilder将其作为标准的测试服务器,Sun公司也将其作为JSP技术应用的示例服务器。但是Tomcat服务器有众多大软件公司的支持,而且服务器的性能稳定,其发展前景很好。Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。这里的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器

ECLIPSE

Eclipse是一个非常优秀的集成开发环境,它旨在简化用于多操作系统软件工具的开发过程,可以用于管理多种开发任务,其中包括测试、性能调整以及程序调试等,而且还可以集成来自多个供应商的第三方应用程序开发工具。通过集成大量的插件,Eclipse的功能可以不断扩展,以支持各种不同的应用。Eclipse平台是一个成熟的、精心设计的、可扩展的体系结构,其组成结构如图所示用 Eclipse开发的插件,可以适应多平台的需要 , 且具有良好的可扩展性和灵活性。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development ToolsJDT)。

虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Enviro nmentPDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。

环境配置说明

JDK的配置:1.安装JDK1.5以上版本,并且复制安装路径。

2.右键我的电脑-属性-高级-环境变量-新建Administrator系统变量。

变量值为安装路径

建立3个值:

JAVA_HOME=你的安装路径

classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

PATH=C:\Program Files\Java\jdk1.6.0_10\bin也就是 路径\bin

3.测试下jdk的安装环境是否成功:

开始-运行-cmd-弹出dos对话框,在光标处输入javac version,出现版本号则配置成功。

Tomcat的配置:1。安装Tomcat后,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat):

CATALINA_HOME:c:\tomcat

CATALINA_BASE: c:\tomcat

TOMCAT_HOME: c:\tomcat

2然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下:

classpath= C:\Program Files\Java\jdk1.6.0_10 \lib\dt.jar; C:\Program Files\Java\jdk1.6.0_10 \lib\tools.jar; c:\tomcat \common\lib\servlet-api.jar;

6可能最新版本的Tomcat中没有common这个文件夹了。所以servlet-api.jar应该的路径为c:\tomcat \lib\servlet-api.jar;根据情况修改!

7.验证,启动tomcat,在IE中访问http://localhost:8080,如果看到tomcat的欢迎页面的话说明安装成功了。

第三章 图书馆管理系统总体设计

第一节 子系统划分及系统模块设计

本图书管理系统总体上分为前台页面显示和后台管理。前台页面(即本书图书管理系统的首页)实现了公告的显示图书查询,留言建议三大功能。而后台的页面则集成了图书管理中所需的功能和录入新书到库,办公图书,借还手续,查询图书等等。平时图书管理人员的工作都是在后台中完成的。前台是为了师生显示的。师生们可以看到图书管理人员发布的最新公告信息;并可以查询自己感兴趣的图书,也可以给学校的图书管理人员留言提议。相对应的后台是针对学校图书管理人员,后台的页面都加密,如果不正常登录是进入不了后台管理页面的,后台功能具体包括:发布首页公告,添加新书到库等等。

功能模块构成

根据本管理系统的要求我们在功能上将这个图书馆管理系统划分成了7个功能模块:发布首页功能模块,留言板功能模块,系统管理员登陆功能模块,图书查询功能模块,借还手续功能模块,管理库中图书信息的功能模块,最后是用户信息管理功能模块。如下图所示。

图2 功能结构图

有了这7个功能模块,就可以构建一个完整的图书馆管理系统了。

前台实现的是:图书信息查询,以及留言建议。

后台实现的是:以管理员身份进入后台后可以进行的权限操作有,用户信息的录入,图书信息的管理及录入,首页新建的发布,借还手续的操作等等。

系统流程图

下图是分别从web和wap模式的查询流程图,请求以这种方式进行发送和响应。

查询功能流程图

图3 基于WEB的查询流程图

借还图书功能流程图

下图是借还书发送请求和响应请求的流程图

图4 借还书流程图

数据库的设计

考虑该系统的定位与现有技术力量,系统采用SQL SEVER作为系统的后台数据库开发环境,数据库命名标准与规范均采用英文单词标写,以便日后对其维护修改.  数据库管理系统的最新版本该版本继承了SQL Server 7.0 版本的优点同时又比它增加了许多更先进的功能具有使用方便可伸缩性好与相关软件集成程度高等优点可跨越从运行Microsoft Windows 98 的膝上型电脑到运行Microsoft Windows 2000 的大型多处理器的服务器等多种平台使用 .

数据库逻辑设计:

表2所示为管理员表(admin),记录了系统用户的角色和密码,判断是否允许其登录后台管理员的界面。

表2  admin数据库

列名

数据类型

长度

id(PK)

Int

11

Username

Varchar

20

Password

Varchar

20

表3所示为留言信息表(guestbook),记录了游客用户姓名,发表的留言信息,发表时间和管理员回复信息,其具体作用就是实现留言板的功能。

表3  guest数据库

列名

数据类型

长度

id(PK)

Int

11

Nickname

Varchar

50

Content

Mediumtext

NO

Yourtime

Datatime

NO

Reply

Varchar

50

表4所示为首页公告表(notice),记录了发布信息和发布时间,其作用就是支持公告栏的功能实现。

表4  notice数据库

列名

数据类型

长度

id(PK)

Int

11

Content

Mediumtext

NO

Createtime

Datatime

NO

表5所示为图书信息表(book),记录了图书书名,书号,图书类型,总量。其作用就是保存录入到库的图书资料,以便借阅和查询。

表5  book数据库

列名

数据类型

长度

Id

Int

11

Title

Varchar

100

bookID(PK)

Varchar

40

Type

Varchar

40

Quantity

Int

11

表6所示为用户借阅图书信息表(borrowbook),记录了借阅证号,借书开始日期,结束日期,书号。实现本系统核心功能-借书,还书的数据库应用。

表6  borrowbook数据库

列名

数据类型

长度

Id(PK)

Int

11

BorrowID

Varchar

20

BeginTime

Datetime

NO

EndTime

Datetime

NO

BookID

Int

40

表7所示为借书证用户信息表(user),记录了借书人姓名,性别,年龄,所在院系和所借书的书号。实现其程序主体的数据库调用。

表7  uesr数据库

列名

数据类型

长度

Id(PK)

Int

11

Name

Varchar

20

Sex

Char

2

Age

Int

11

Department

Varchar

20

BorrowID

Varchar

20

数据库之间的关联设计:

这个图书管理系统是基于SQL SEVER设计的,然后通过在JSP中向数据库发送相应的SQL指令,从而实现对图书的全面管理..对于数据库设计这一流程中,最重要的一步是对user表、book表、borrowBook表三张表的设计以及它们之间的关系.这是这个图书管理系统中的一个关键技术,以下就是数据库关联图

5数据库关系

第四章 图书馆管理系统详细设计及处理技术

JavaBean技术是一种基于Java的组件技术,JavaBean组件可以用来执行复杂的计算任务,或负责与数据库的交互以及数据的提取等,是解决代码重用问题的一种策略。

为了创建和使用Java软件组件,JavaBean被实现为一种独立于平台和结构的应用程序接口,它的实现可以忽略内部的结构及细节问题,只需要定义其外部的特征及对外功能就行。其中,属性、方法和事件三种接口可以独立对外进行开发。

JavaBean的实质就是一个.class文件,也可以成为类文件。JavaBean以binary格式保存,可以保护Java源代码不容易被他人抄袭。

下面是本系统中主要的JavaBean

select函数功能:查询数据

public int select(String sql){   int k=-10;

this.init(this.getConn());

try

{

k=0;

rs=stmt.executeQuery(sql);

if (rs.next())

{

k=k+1;

}

}

catch (Exception e)

{

k=-1;

System.out.println("select():"+e.getMessage());

this.close();

}

this.close();

return k;

}

update函数功能:更新\删除\插入 数据 

public int update(String sql){

int k=-10;

this.init(this.getConn());

try

{

k=0;

k=stmt.executeUpdate(sql);

}

catch (Exception e)

{

k=-1;

System.out.println("update():"+e.getMessage());

}

this.close();

return k;

}

chStr函数功能:解决乱码

Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java文件本身编译时产生的乱码问题和Java程序与其他媒介交互产生的乱码问题。JSP以Java为基础,自然也继承了Java所遇到的中文乱码问题。

但在使用数据库时,有些Driver会将从数据库中读出的中文自动的转换成Unicode,而有些不会,如果Driver做过转换而系统又再做一次,就会出现问题,从数据库中读出的中文字符不会正确显示,而是出现“??”。 

而且,在表单提交或是URL传参数值时依然是按照Web容器在内部默认的字符编码格式ISO 8859-1来进行处理的。同时,几乎所有的浏览器在传递参数时都是默认以UTF-8的方式来传递参数的。所以,虽然在java源文件在出入口的地方指定了正确的编码方式,但其在容器内部运行是还是以ISO 8859-1来处理的,这样导致在提交的表单中若有中文字符,在存入数据库时使用的是ISO 8859-1,而本系统使用的SQL SEVER数据库默认使用的是GBK编码,这样导致的结果就是存到数据库的数据因编码不同而出现乱码现象 。

调用字符编码转换Bean中的方法,对字符编码进行强制转换,使存放到数据库的数据编码格式与数据库的内部编码格式统一,解决了向数据库中插入中文字符、将从数据库中读取的数据正确的显示的问题,所以做了一个方法放在bean里面,代码如下

public String chStr(String str){

try

{

byte[] temp=str.getBytes("ISO8859-1");

String temp2=new String(temp);

return temp2;

}catch(Exception e){System.out.println("chStr():"+e.getMessage());}

return "null";

}

第一节 发布首页功能模块

图6首页发布功能界面

在后台管理中能自由发布首页公告信息,来通知各种事情,其条目以滚动的形式来表现。

该功能的实现由admin_addnotice.jsp和admin_addnotice_post.jsp文件实现。

在admin_addnotice.jsp中主要是发布界面的编写和传输notice内容,本功能的核心程序放在admin_addnotice_post.jsp中,负责存储内容到数据库和错误提示。

在admin_addnotice_post.jsp中关键代码如下:

//从request获取名为"content"的参数值

String content=request.getParameter("content");

//解决中文乱码问题

String tcontent=addbook.chStr(content);

//合成SQL语句,将content的值传入,作用为更新公告表

String sql="update notice set content='"+content+"',createtime=DEFAULT where id=1";

//申明一个int的变量temp

int temp=-2;

//如SQL执行成功,temp>0,否则执行失败

temp=notice.update(sql);

代码部分:

                               admin_addnotice.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>发布首页公告</title>

<style type="text/css">

<!--

body,td,th {

font-size: 13px;

}

-->

</style>

<script language="JavaScript" type="text/JavaScript">

<!--

function MM_findObj(n, d) { //v4.01

  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {

    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}

  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];

  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);

  if(!x && d.getElementById) x=d.getElementById(n); return x;

}

function MM_validateForm() { //v4.0

  var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments;

  for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args[i]);

    if (val) { nm=val.name; if ((val=val.value)!="") {

      if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@');

        if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n';

      } else if (test!='R') { num = parseFloat(val);

        if (isNaN(val)) errors+='- '+nm+' must contain a number.\n';

        if (test.indexOf('inRange') != -1) { p=test.indexOf(':');

          min=test.substring(8,p); max=test.substring(p+1);

          if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n';

    } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; }

  } if (errors) alert('The following error(s) occurred:\n'+errors);

  document.MM_returnValue = (errors == '');

}

//-->

</script>

</head>

<body>

<p><strong>发布公告(首页只会滚动显示最新发布的一条公告)</strong></p>

<p>公告内容:</p>

<form name="form1" method="post" action="admin_addnotice_post.jsp">

  <p>

    <textarea name="content" cols="40" rows="10" id="content"></textarea>

  </p>

  <p>    <input name="Submit" type="submit" onClick="MM_validateForm('content','','R');return document.MM_returnValue" value="发布首页公告">

    <input type="reset" name="Submit2" value="清除">

</p>

</form>

<p>  </p>

</body>

</html>

admin_addnotice_post.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp"%>

<jsp:useBean id="notice" class="conndb.DbConnBean" scope="request" />

<%

String content=request.getParameter("content");//String tcontent=addbook.chStr(content);//解决中文乱码问题

String sql="update notice set content='"+content+"',createtime=DEFAULT where id=1";

int temp=-2;

temp=notice.update(sql);

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>发布首页公告</title>

</head>

<body>

<% if(temp>0){%><script language="javascript">alert("已经成功发布了新的首页公告!");</script>

<a href="admin_main.jsp">返回管理首页</a>

<%

}else{

session.setAttribute("error","请检查你的输入.请确保你输入的信息的正确性!");

response.sendRedirect("../errorpage.jsp");

} %>

</body>

</html>

第二节 留言板功能模块

  留言板功能模块分为发布模块和回复模块。发布模块在前台完成,可以让任何人留言,而回复模块在后台使用只允许管理员查看回复。

图7 发布留言界面

本功能所有文件放在guest目录下面,包含了guestbook_index.jsp,guestbook_postmessage.jsp,guestbook_save.jsp,guestbook_show.jsp,guestbook_viewmessage.jsp这5个文件,分别实现了留言板各个功能。

其主要代码在guestbook_postmessage.jsp中.

//从request获取名为"username"的参数值

String username=request.getParameter("username");

//从request获取名为"content"的参数值

String content=request.getParameter("content");

//合成SQL语句,将username,content的值传入nickname,content表中,作用为将留言板内容放入数据库中

String.sql="insert into guestbook (nickname,content) values('"+username+"','"+content+"')";

//判断语句,如果username为空或者错误,content为空或者错误的时候。

if(username==null||username.equals("")||content==null||content.equals(""))

{

else{

int temp=-2;

//如SQL执行成功,temp>0,否则执行失败

temp=guestbook.update(sql);

%>

//返回错误信息errorpage.jsp,显示“请检查你的输入.请确保你输入的信息的正确性!”错误信息文字以提示。

else{

session.setAttribute("error","请检查你的输入.请确保你输入的信息的正确性!");

response.sendRedirect("../errorpage.jsp");

} }

%>

回复留言功能模块主要是用于回复留言,由admin_guestbook_reply.jsp实现.其实现方法与前面类似,不在累述。

代码部分:

guestbook_index.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<script language=javascript>

<!--

function SetFocus()

{

if (document.message.username.value=="")

document.message.username.focus();

else

document.message.username.select();

}

function CheckForm()

{

if(document.message.username.value=="")

{

alert("请输入你的大名!");

document.message.username.focus();

return false;

}

if(document.message.content.value == "")

{

alert("请输入你想说的话!");

document.message.content.focus();

return false;

}

}

-->

</script>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>请你给学校图书馆提建议</title>

<style type="text/css">

<!--

body,td,th {

font-size: 13px;

}

body {

background-color: #99CCCC;

margin-left: 0px;

margin-top: 0px;

margin-right: 0px;

margin-bottom: 0px;

}

.style3 {

font-size: 18px;

color: #FF0000;

font-weight: bold;

}

.style5 {font-size: 30px; color: #FF3300; font-weight: bold; }

-->

</style></head>

<body>

<form name="message" method="post" action="guestbook_postmessage.jsp">

  <table width="98%"  border="1" cellpadding="2" cellspacing="5" bordercolor="#99CCCC">

    <tr>

      <td colspan="3"><table width="100%"  border="0" cellpadding="0" cellspacing="0">

        <tr>

          <td width="26%"><img src="../images/top.gif" width="245" height="88"></td>

          <td width="73%" valign="bottom" background="../images/b3.gif" bgcolor="#006699"> </td>

          <td width="1%"> </td>

        </tr>

        <tr>

          <td> </td>

          <td><div align="left"><span class="style5">     留言簿</span></div></td>

          <td> </td>

        </tr>

        <tr>

          <td> </td>

          <td><span class="style3">欢迎同学们给学校图书馆提出宝贵的建议.</span></td>

          <td> </td>

        </tr>

      </table>      </td>

    </tr>

    <tr align="center">

      <td width="24%" align="right">姓 名:</td>

      <td colspan="2" align="left"><input name="username" type="text" id="username" size="30" maxlength="50"></td>

    </tr>

    <tr>

      <td rowspan="2" align="right" valign="top">我想说:</td>

      <td width="49%" rowspan="2" align="left" valign="top"><textarea name="content" cols="60" rows="10" id="content"></textarea></td>

      <td width="27%" valign="top"><img src="../images/guestbook.gif" width="128" height="128"></td>

    </tr>

    <tr>

      <td valign="top">管理员会认真考虑你的建议的!</td>

    </tr>

    <tr>

      <td> </td>

      <td colspan="2"><input type="submit" name="Submit" value="我已经写好了" onClick="CheckForm()">

      <input name="Submit2" type="button" οnclick="javascript:window.location='guestbook_show.jsp'"  value="查看留言">

      <input type="button" name="Submit3" value="返回网站首页" οnclick="javascript:window.location='../index.jsp'"></td>

    </tr>

  </table>

</form><script language="JavaScript" type="text/JavaScript">

SetFocus();

</script>

</body>

</html>

guestbook_postmessage.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<jsp:useBean id="guestbook" class="conndb.DbConnBean" scope="request" />

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>处理留言</title>

</head>

<body>

<%

String username=request.getParameter("username");

String content=request.getParameter("content");

String sql="insert into guestbook (nickname,content) values('"+username+"','"+content+"')";

if(username==null||username.equals("")||content==null||content.equals(""))

{

%>

<script language="javascript">history.back();</script>

<%

}else{

int temp=-2;

temp=guestbook.update(sql);

 if(temp>0){%><script language="javascript">alert("发布留言成功!我们会认真考虑你的建议的,谢谢!");</script>

<a href="../index.jsp">返回网站首页</a>

<%

}else{

session.setAttribute("error","请检查你的输入.请确保你输入的信息的正确性!");

response.sendRedirect("../errorpage.jsp");

} }

%>

</body>

</html>

guestbook_save.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<jsp:directive.page import="conndb.DbConnBean"/>

<%@ include file="ch.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<jsp:useBean id="guestbook" class="DbConnBean" scope="page" />

<head>

<%

String name=request.getParameter("name");

String tname=guestbook.chStr(name);

String content=request.getParameter("content");

String tcontent=guestbook.chStr(content);

String sql="insert into guestbook (nickname,content) values('"+tname+"','"+tcontent+"')";

guestbook.update(sql);

%>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>无标题文档</title>

</head>

<body><%@ include file="top.jsp" %>

<table width="72%" border="0" cellspacing="0" cellpadding="0" align="center"><tr><td>

留言成功,管理员会尽快处理你的留言的!<br><a href="guestbook_show.jsp">查看当前留言</a>

</td></tr></table>

<%@ include file="bottom.jsp" %></body>

</html>

guestbook_show.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<jsp:directive.page import="conndb.DbConnBean"/>

<%@ include file="/ch.jsp" %>

<jsp:useBean id="showguest" class="DbConnBean" scope="page" />

<% String sql="select * from guestbook order by id desc";

   ResultSet rs=showguest.query(sql);

   String color="#99CC99";

 %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>查看留言</title>

<style type="text/css">

<!--

.text {font-size: 10px}

.guest {font-size: 12px}

body {

background-color: #99CCCC;

}

.style1 {

color: #FFFFFF;

font-weight: bold;

}

-->

</style>

</head>

<body>

<table width="72%" border="0" cellspacing="0" cellpadding="0" align="center">

<tr><td><center>

<img src="../images/b3.gif" width="770" height="100">

</center>

<% while(rs.next()){

if(color.equals("#99CC99")){color="#CCFFCC";}

else{color="#99CC99";}

String name=rs.getString(2);

String content=rs.getString(3);

String time=rs.getString(4).substring(2,10);

String reply=rs.getString(5);

%>

<table width="100%" border="0" bgcolor="<%=color%>" >

  <tr>

    <td width="18%" align="left" valign="top"><span class="guest"><strong>留言者</strong>:<%= name %></span></td>

    <td width="82%" rowspan="2" align="left" valign="top" class="guest"><div align="left"><strong>留言内容</strong>:<%= content %></div></td>

  </tr>

  <tr>

    <td align="left" valign="top" class="guest"><strong>时  间</strong>:<%= time %></td>

    </tr>

  <tr align="left">

    <td colspan="2" valign="left" class="guest"><div align="left"></div>

      <div align="left">

          <% if(session.getAttribute("username")==null){ %>

          <strong>管理员回复</strong>:<%= reply %>

          <% }else{ %>

          <%= reply %><a href=admin_guestbook_reply.jsp<%=rs.getString("id") %>>回复此留言</a>

          <% } %>

      </div></td>

    </tr>

</table>

<div align="right">

    <%}%>

    <a href="guestbook_index.jsp" target="_blank">我要留言

    </a>

</div>

<center>

</center>

</td></tr></table>

<p align="center" class="style1">成都信息工程学院-2007</p>

</body>

</html>

guestbook_viewmessage.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>查看留言</title>

</head>

<body>

fuck

</body>

</html>

第三节 系统管理员的登录功能模块

图8 管理员登录界面

本功能涉及到图书管理操作的jsp文件,为了方便全部把它们放在admin目录里面,并且通过session防止非法登录.把这个功能提取出来,单独作为一个jsp文件,然后include到需要加密的jsp文件头部.这样如果非法用户直接提交后台URL,系统会将非法用户直接转到前台首页

本功能由admin_login.jsp和admin_logincheck.jsp实现

其主要代码是在admin_logincheck.jsp中,如下

<%

//从request获取名为"username"的参数值

String username=request.getParameter("username");

//从request获取名为"password"的参数值

String password=request.getParameter("password");

//如果username为空或者错误,以及password为空或者错误。

if(username==null||username.equals("")||password==null||password.equals(""))

else{

//将username赋值到tusername,password赋值到tpassword

String tusername=logincheck.chStr(username);

String tpassword=logincheck.chStr(password);

//搜索数据库中tusername和其对应的tpassword字段。

String sql="select * from admin where username='"+tusername+"' and password='"+tpassword+"'";

int temp=-2;

temp=logincheck.select(sql);

if(temp>0){

//表明验证成功,进入admin_index.jsp,并将用户定格为登录用户。

session.setAttribute("name",tusername);

response.sendRedirect("admin_index.jsp");

}else{

//验证失败,返回错误提示信息,并返回errorpage.jsp页面。

session.setAttribute("error","请检查你的用户名和密码!");

response.sendRedirect("../errorpage.jsp");

}}

 %>

代码部分

admin_login.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<script language=javascript>

<!--

function SetFocus()

{

if (document.Login.username.value=="")

document.Login.username.focus();

else

document.Login.username.select();

}

function CheckForm()

{

if(document.Login.username.value=="")

{

alert("请输入用户名!");

document.Login.username.focus();

return false;

}

if(document.Login.password.value == "")

{

alert("请输入密码!");

document.Login.password.focus();

return false;

}

}

//-->

</script>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>管理员登录</title>

<style type="text/css">

<!--

body {

background-color: #99CCCC;

}

body,td,th {

font-size: 14px;

color: #000000;

}

a:link {

color: #333333;

}

a:visited {

color: #996600;

}

a:active {

color: #999900;

}

-->

</style></head>

<body>

<form name="Login" method="post" action="admin_logincheck.jsp">

  <table width="100%"  border="0">

    <tr>

      <td width="25%" height="295"> </td>

      <td width="14%"> </td>

      <td width="36%"><img src="../images/b2aaa.gif" width="345" height="117">

        <table width="100%"  border="0" cellpadding="0" cellspacing="8">

        <tr align="center">

          <td height="34" colspan="2"><span class="style1"><font size="3"><strong>图书管理系统后台管理员登录</strong></font></span></td>

          </tr>

        <tr>

          <td align="right">用户名称:</td>

          <td><input name="username"  type="text"  id="username" maxlength="20" style="width:160px;border-style:solid;border-width:1;padding-left:4;padding-right:4;padding-top:1;padding-bottom:1" οnmοuseοver="this.style.background='#D6DFF7';" οnmοuseοut="this.style.background='#FFFFFF'" onFocus="this.select(); "></td>

        </tr>

        <tr>

          <td align="right">用户密码:</td>

          <td><input name="password"  type="password" id="password" style="width:160px;border-style:solid;border-width:1;padding-left:4;padding-right:4;padding-top:1;padding-bottom:1" onFocus="this.select(); " οnmοuseοver="this.style.background='#D6DFF7';" οnmοuseοut="this.style.background='#FFFFFF'" maxlength="20"></td>

        </tr>

        <tr align="center">

          <td colspan="2"> <input name="Submit"   type="submit"   value=" 确 认 " onClick="CheckForm()">

                 

                <input name="reset" type="reset"  id="reset" value=" 清 除 " >

                <br>

                <br>

                若忘记用户名或密码,请与管理人员联系<br>

            <strong> </strong> </td>

          </tr>

      </table>      </td>

      <td width="25%" align="right" valign="top"><a href="../index.jsp">返回首页</a></td>

    </tr>

  </table>

</form>

<script language="JavaScript" type="text/JavaScript">

SetFocus();

</script>

</body>

</html>

admin_logincheck.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp"%>

<%@ include file="checkadmin.jsp"%>

<jsp:useBean id="logincheck" class="conndb.DbConnBean" scope="request" />

<%

String username=request.getParameter("username");

String password=request.getParameter("password");

if(username==null||username.equals("")||password==null||password.equals(""))

{%>

<script language="javascript">history.back();</script>

<%}else{

String tusername=logincheck.chStr(username);

String tpassword=logincheck.chStr(password);

String sql="select * from admin where username='"+tusername+"' and password='"+tpassword+"'";

int temp=-2;

temp=logincheck.select(sql);

if(temp>0){

session.setAttribute("name",tusername);

response.sendRedirect("admin_index.jsp");

}else{

session.setAttribute("error","请检查你的用户名和密码!");

response.sendRedirect("../errorpage.jsp");

}}

 %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>检查管理员登录</title>

</head>

<body>

检查管理员登录

</body>

</html>

图书查询功能模块

在前台允许所有用户对图书馆里面的书籍进行查询,返回内容包含书名,编号,分类和库存几个方面。总的来说该功能是本系统最重要的核心功能之一。

前台图书查询

图9Web图书查询界面

图10 查询结果界面

图9为前台查询界面,图10为显示界面主要是实现对图书的查询,内容包括书名,图书编号,分类,库存量。

分别由searchbook.jsp和实现

其主要代码在功能代码在searchbook_post.jsp下,

查询功能代码:

<%

String sql="";

//解决中文乱码

String keyword=request.getParameter("keyword");

String tkeyword=search.chStr(keyword);

//获取参数名称

String keytype=request.getParameter("type");

//如果按书名进行查询

if(keytype.equals("booktitle")){sql="select * from book where title like '%"+tkeyword+"%'";}

//如果按书号进行查询

else if(keytype.equals("bookid")){sql="select * from book where bookID like '%"+tkeyword+"%'";}

int temp=search.select(sql);

Connection conn=search.getConn();

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery(sql);

//表单显示处理功能代码:

while(rs.next()){

String booktitle=rs.getString(2);

String bookid=rs.getString(3);

String booktype=rs.getString(4);

int quantity=rs.getInt(5);

id++;

if(color=="#CCCCCC"){color="#999999";}

else{color="#CCCCCC";}

%>

代码部分

searchbook.jsp 

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>查询图书信息</title>

<style type="text/css">

<!--

.tip {font-size: 11px}

body {

background-image: url(../images/R6C.GIF);

}

-->

</style>

</head>

<body>

 <table width="72%" border="0" cellspacing="0" cellpadding="0" align="center">

        <tr>

<td width="120" height="30" bgcolor="#EFEFEF"><img src="../images/search.gif" width="120" height="26"></td>

 <td width="455" bgcolor="#EFEFEF">

<table width="100%"  border="0" cellspacing="0" cellpadding="0">

  <tr>

  <form name="form1" action="searchbook_post.jsp" method="get">

      <td width="80%" height="25" nowrap bgcolor="#EFEFEF">

          <input name="keyword" size="30" value='关键字' onFocus='this.select();'>

          <select name="type">

          <option value="booktitle">图书标题</option>   

  <option value="bookid">图书编号</option>

          </select>

          <input name="Submit" src="../images/d_search.gif" type="image" width="65" height="20" align="absmiddle" border="0"></td>

      <td width="20%" nowrap bgcolor="#EFEFEF"></td>

   </form>

  </tr>

</table></td></tr></table>

 <div align="right" class="tip">

   <div align="center">TIP:关键字为空,则返回所有图书信息 </div>

 </div>

</body>

</html>

searchbook_post.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp"%>

<jsp:useBean id="search" class="conndb.DbConnBean" scope="request" />

<%

String sql="";

String keyword=request.getParameter("keyword");

String tkeyword=search.chStr(keyword);//解决中文乱码

String keytype=request.getParameter("type");

if(keytype.equals("booktitle")){sql="select * from book where title like '%"+tkeyword+"%'";}

else if(keytype.equals("bookid")){sql="select * from book where bookID like '%"+tkeyword+"%'";}

int temp=search.select(sql);

Connection conn=search.getConn();

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery(sql);

String color="#CCCCCC";

int id=0;

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>图书查询结果</title>

</head>

<body>

<div align="center">

  <% if(temp==0){out.println("对不起,没有查到相关图书,请<a style=cursor:hand οnclick=javascript:history.back();><b>重新查找</b></a>.");}else{ %>

  <strong>图书查询结果</strong></div>

<table width="72%"  border="0" align="center">

 <tr bgcolor="00CCFF" >

    <td>序号</td><td>书名</td><td>图书编号</td><td>分类</td><td>库存量</td>

  </tr>

<%

while(rs.next()){

String booktitle=rs.getString(2);

String bookid=rs.getString(3);

String booktype=rs.getString(4);

int quantity=rs.getInt(5);

id++;

if(color=="#CCCCCC"){color="#999999";}

else{color="#CCCCCC";}

%>

  <tr bgcolor=<%=color%>>

  <td><%=id%></td><td><%=booktitle%></td><td><%=bookid%></td><td><%=booktype%></td><td><%=quantity%></td>

  </tr>

<%}}%>

</table><br><center>当前库中一共有相关图书<%= id %>种</center>

</body>

</html>

其余功能模块

后台所有图书查询

在后台运行中,除了前台所拥有的查询外,还提供直接查询并允许对其修改和删除,其界面由admin_viewallbooks.jsp显示,而修改,删除由其他文件实现,其实现方法类似前台查询不在累述。

                           代码部分

     admin_viewallbooks.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp"%>

<jsp:useBean id="viewbook" class="conndb.DbConnBean" scope="page" />

<%

String sql="select * from book";

int temp=-2;

temp=viewbook.select(sql);

Connection conn=viewbook.getConn();

Statement stmt=conn.createStatement();

ResultSet rs=stmt.executeQuery(sql);

String color="#FEEFF7";

int id=0;

 %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>当前库中所有图书信息</title>

<style type="text/css">

<!--

body,td,th {

font-size: 13px;

}

body {

background-image: url(../images/R6C.GIF);

}

-->

</style>

</head>

<body>

<% if(temp==0){out.println("对不起,库中还没有图书,请<a href=admin_addnewbook.jsp><b>录入新书</b></a>.");}else{ %>

图书馆里所有图书信息

<table width="72%"  border="0" cellspacing="0">

  <tr>

    <td><div align="right"><a href="searchbook.jsp">图书查询</a></div></td>

  </tr>

</table>

<table width="80%"  border="1" cellpadding="0" cellspacing="0" bordercolor="#00CC00">

  <tr bgcolor="#00CCCC">

    <td width="5%" align="center"><strong> 序号</strong></td>

    <td width="37%" align="center"><strong> 书名</strong></td>

    <td width="21%" align="center"><strong> 图书编号 </strong></td>

    <td width="14%" align="center"><strong> 分类 </strong></td>

    <td width="9%" align="center"><strong> 库存量 </strong></td>

    <td width="14%" align="center">操作</td>

  </tr>

<%

while(rs.next()){

String ids=rs.getString(1);

String booktitle=rs.getString(2);

String bookid=rs.getString(3);

String booktype=rs.getString(4);

int quantity=rs.getInt(5);

id++;

if(color=="#FEEFF7"){color="#F2FDF4";}

else{color="#FEEFF7";}

%>   <tr bgcolor=<%=color%>>

  <td align="center"><%=id%></td>

  <td align="left"><%=booktitle%></td><td align="left"><%=bookid%></td><td align="left"><%=booktype%></td><td align="left"><%=quantity%></td>

   <td align="center"> <a href="admin_changebook.jsp?ids=<%=ids%>">修改 </a><a href="admin_delbook.jsp?ids=<%=ids%>">删除 </a> </td>

</tr>

<%}}%>

  <tr bgcolor="#99FFCC">

    <td colspan="6"><center>当前库中一共有相关图书<%= id %>种

    </center></td>

  </tr>

</table>

</body>

</html>

借还手续功能模块包含了借书功能模块,还书功能模块,借阅信息功能模块,借书证管理功能模块。借还手续功能模块是另一个核心功能模块。借书功能模块通过输入借书证号和图书编号实现借书功能admin_borrowbook.jsp和admin_borrowbook_post.jsp文件实现。其主要功能在admin_borrowbook_post.jsp中实现。还书功能模块主要实现对图书的重新入库和清理所借图书人借书项目包含admin_returnbook.jsp,admin_returnbook_post.jsp和admin_returnbook_post_post.jsp三个文件。阅信息功能模块为查询所有借阅书籍的同学和其借阅的图书,主要由admin_viewallborrows.jsp实现。

新开借书证功能模块本功能主要实现借书证的重新开启,包含admin_addnewuser.jsp,admin_addnewuser_post.jsp。修改借书证信息主要实现修改借书的情况,包括包含admin_changeuser.jsp和admin_changeuser_post.jsp两个文件

管理图书功能模块主要用于对图书的管理,其包括录入新书功能模块和修改,删除图书功能模块,未归还图书查询功能模块。录入新书功能模块主要将图书录入,并添加其数量,名称,类别的功能由admin_addnewbook.jsp和admin_addnewbook_post.jsp两个文件实现。修改,删除图书功能模块主要是修改删除图书的信息。由admin_changebook.jsp和admin_changebook_post.jsp实现。

用户信息管理功能模块是本系统后台最为重要的一部分,包括所有用户查询功能模块,搜索用户功能模块,管理员列表功能模块,添加管理员功能模块,修改密码功能模块。所有用户查询功能模块本功能作用是实现对用户信息查询,包括姓名,性别,年龄,系别,借书证号由admin_viewallusers.jsp实现搜索用户功能模块本功就是通过输入借书证号搜寻所查找的用户。由searchuser.jsp和searchuser_post.jsp文件实现用户功能模块主要是对用户的所有信息进行修改并保存由admin_changeuser.jsp和admin_changeuser_post.jsp实现。管理员列表功能模块主要是查询所有管理员。由admin_viewalladmins.jsp实现。添加管理员功能模块就是添加管理员,包括登录名和密码由admin_addadmin.jsp和admin_addadmin_post.jsp实现。修改管理员密码功能模块本功能主要是对管理员密码修改由changepwd.jsp和admin_changepwd_post.jsp实现。

代码部分如下

admin_borrowbook.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

"http://www.w3.org/TR/html4/loose.dtd">

<html>

<script language=javascript>

<!--

function SetFocus()

{

if (document.borrowbook.borrowid.value=="")

document.borrowbook.borrowid.focus();

else

document.borrowbook.borrowid.select();

}

function CheckForm()

{

if(document.borrowbook.borrowid.value=="")

{

alert("请输入借书证号码!");

document.borrowbook.borrowid.focus();

return false;

}

if(document.borrowbook.bookid.value == "")

{

alert("请输入图书编号!");

document.borrowbook.bookid.focus();

return false;

}

}

//-->

</script>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>借书操作</title>

<style type="text/css">

<!--

body {

background-image: url(../images/R6C.GIF);

}

-->

</style></head>

<body>

<p><strong>办理借书</strong></p>

<p>说明:借书的最大期限为一个月,超过一天,罚款2毛<br>

                请师生们按时还书,谢谢合作!</p>

<form name="borrowbook" method="get" action="admin_borrowbook_post.jsp">

  <p>借书证号:

    <input name="borrowid" type="text" id="borrowid">

</p>

  <p>图书编号:

    <input name="bookid" type="text" id="bookid">

</p>

  <p>

       

    <input type="submit" name="Submit" value="提交" onClick="CheckForm()">

    <input name="Submit2" type="reset" value="清除">

  </p>

</form>

<script language="JavaScript" type="text/JavaScript">

SetFocus();

</script>

<p> </p>

</body>

</html>

       admin_borrowbook_post.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>

<%@ include file="../ch.jsp" %>

<%@ include file="checkadmin.jsp" %>

<jsp:useBean id="borrow" class="conndb.DbConnBean" scope="request" />

<%

String borrowid=request.getParameter("borrowid");

String bookid=request.getParameter("bookid");

if(borrowid==null||borrowid.equals("")||bookid==null||bookid.equals(""))

{

%>

<script language="javascript">history.back();</script>

<%

}else{

String sql="insert into borrowBook (borrowID,bookID) values('"+borrowid+"','"+bookid+"')";

int temp=-2;

temp=borrow.update(sql);

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<title>借书操作</title>

</head>

<body>

<%

if(temp>0){

%>

<script language="javascript">alert("已完成借书操作.请你按时归还此图书!");</script>

<a href="admin_borrowbook.jsp">继续借书</a> 

<a href="admin_main.jsp">返回管理首页</a>

<%

}else{

session.setAttribute("error","请检查你的输入.请确保你输入的信息的正确性!");

response.sendRedirect("../errorpage.jsp");

}}

 %>

</body>

</html>

图书馆管理系统系统测试

测试

本系统测试环境: SQL sever2000,TOMCAT5.016/Weblogic8.0,Winwap,在WIN2000/XP下均测试通过.测试结果完全符合预期目标。但有部分BUG,现问题和解决方法总结如下:

1.中文信息提交时为乱码。

解决方法:将页面编码设置为GB2312,同时在服务器端将request编码也设置为GB2312

2.页面采用2个frame,在超链接的时候往往不能链接到目标frame上。

解决方法:在超链接的后面添加target="目标框架"

最终经过详细功能测试和代码修正后,本系统完全实现借书与还书的手续操作与对图书和人员的管理功能。其系统界面简单、易用,其查询功能模块支持模糊查询和WAP查询功能使得系统更加强大。

章 总

本文提出的基于WEB的图书管理系统完成了借书,还书,查询图书,管理借书证和管理员帐户设置等主要功能,本系统是基于B/S模式,其后台部分完全实现借书与还书的手续操作与对图书和人员的管理功能,系统界面简单、易用,任何人都可以在短时间内学会使用该系统,在前台部分,创新设计的WAP图书查询部分,不仅大大方便了同学们查询图书,而且使得系统多样化,多元化,具有有很强的扩展性。由于是由JAVA语言编写,移植性也很好。

在技术方面,通过此项目的开发,本人对基于Browser/Server即浏览器/服务器模式的多层体系结构的JSP技术有了一定的实战经验,同时对JavaBean的使用有了深刻的理解。将不同复杂的数据库操作划分为独立的模块封装于Bean中,提高了系统的安全性和可移植性。

对于不足之处在于管理员权限没有细分,有条件的话可以采用给予角色的分配方法来分配权限。WAP部分功能相对于简单,可以继续加入留言板,图书续借,公告等实用功能。

参考文献

[1] 林上杰,林康司. JSP 2.0技术手册[M]. 北京: 电子工业出版社,2005。

[2] 汪孝宜,刘中兵. JSP数据库开发实例精粹[M]. 北京:机械工业出版社,2001。

[3] 杨仁毅. DreamweaverMX2004自学手册[M]. 成都: 四川电子音像出版中心,2004。

[4] 方睿,刁仁宏.网络数据库原理及应用[M]. 成都: 四川大学出版社,2005。

[5] 陈明. 实用软件工程基础[M]. 北京: 清华大学出版社,2002。

[6] 耿祥义,张跃平. JAVA2实用教程[M]. 北京: 清华大学出版社,2006。

[7]张海藩.软件工程导论[M].北京:北京清华大学出版社,2003。

[8] 熊学军.University Library Upright Information Service in Digital Age .农业图书情报学刊 , 编辑部邮箱 2003年 05期  

[9]吴玉春.基于web的图书馆管理信息系统的分析与设计.南昌大学.CNKI:CDMD:2.2008.041025

[10]刘辉.赵东安基于WAP的移动图书管理系统.CNKI:SUN:JSSY.0.2006-03-013

[11]林上杰,林康司. JSP 2.0技术手册[M]. 北京: 电子工业出版社,2005。

[12]汪孝宜,刘中兵. JSP数据库开发实例精粹[M]. 北京:机械工业出版社,2001。

[13]杨仁毅. DreamweaverMX2004自学手册[M]. 成都: 四川电子音像出版中心,2004。

[14] 方睿,刁仁宏.网络数据库原理及应用[M]. 成都: 四川大学出版社,2005。

[15] 陈明. 实用软件工程基础[M]. 北京: 清华大学出版社,2002。

[16] 耿祥义,张跃平. JAVA2实用教程[M]. 北京: 清华大学出版社,2006。

[17]张海藩.软件工程导论[M].北京:北京清华大学出版社,2003。

致谢

、 2010年发生了太多事,有太多的转折点,我最想谢谢的有3件事。

第一件:我在实习的1个月中真正的成长起来。

今年3月份我来到了格林凯莫有限公司技术部实习,短短1个月的工作使我受益匪浅,这是一次与社会工作的接轨。在技术部中,不仅计算机专业知识增长了,最主要是懂得了如何更好的为人处事。当今社会一直处在加速的发展变化中,所以对人才的要求也越来越高,我们要用发展的眼光看问题,就要不断提高思想认识,完善自我。师傅说作为一名IT从业者,所受的社会压力将比其他行业更加沉重,要学会创新求变,以适应社会的需要。如果是在单位,那就更需要掌握全面的计算机知识,因为小到计算机的组装维修,大到服务器的维护与测试,以及软件的开发,都需要一个人独立完成。可以说,近1个月的工作使我成长了不少,从中有不少感悟,下面就是我的一点心得:你可以伪装你的面孔你的心,但绝不可以忽略真诚的力量。第一天去技术部实习,心里不可避免的有些疑惑,要去干些什么,应该去怎么做,等等!踏进们,只见几个陌生的脸孔用莫名而疑惑的眼神看着我。我微笑着和他们打招呼,尴尬的局面立刻得到了缓解,大家多很友善的微笑欢迎我的到来。从那天起,我养成了一个习惯,每天早上见到他们都要微笑的说声:“师傅早”,那是我心底真诚的问候。我总觉得,经常有一些细微的东西容易被我们忽略,比如轻轻的一声问候,但它却表达了对老师同事对朋友的尊重关心,也让他人感觉到被重视与被关心。仅仅几天的时间,我就和师傅们打成一片,很好的跟他们交流沟通学习,我想,应该是我的真诚,换得了老师的信任。他们把我当朋友也愿意指导我,愿意分配给我任务。其次沟通很重要:要想在短暂的实习时间内,尽可能多的学一些东西,这就需要跟老师有很好的沟通,加深彼此的了解,刚到网络中心,老师并不了解你的工作学习能力,不清楚你会做哪些工作,不清楚你想了解什么样的知识,所以跟老师建立起很好的沟通是很必要的。同时我觉得这也是我们将来走上社会的一把不可获缺的钥匙。通过沟通了解,师傅我有了大体的了解,一边有针对性的教我一些计算机知识,一边根据我的兴趣给予我更多的指导与帮助,例如我对网络布线,电脑硬件安装,系统、网络或硬件故障排除,工作原理应用等方面比较感兴趣,师傅就让我和他一起完成电脑故障排除工作。在这次的工作中,我真正学到了计算机教科书上所没有的知识,拥有了实践经验,这才真正体现了知识的真正价值,学以致用。对本质工作要有耐心和激情:激情与耐心,就像火与冰,看似两种完全不同的东西,却能碰撞出最美丽的火花。我们的知识不断的在更新,这就需要你有激情去发现与创造,而你的耐心就要用到不断的学习新知识,提高自己的专业水平当中去。在一些具体的工作当中也是这样的:记得刚来公司实习的时候老板得电脑出了问题,我自告奋勇的毛遂自荐,安装winXP操作系统,本是非常简单的事,可没想到出现了很多问题,通过自己的摸索,调试,自此,我算是真正的弄明白了计算机的硬件安装,维护和更新。后来我又进行了各种计算机操作系统的反复安装调试,一遍又一遍的调试安装,自然有些烦,但我用我的热情与耐心克服这些困难,师傅也帮我用书面的方式整理了不少关于硬件故障的经验,比如说:我们可以在电脑启动的时候就可以通过声音来判断故障:1短:启动正常,2短:非致命错误, 1长1短:显示错误 ,1长2短:键盘错误;计算机蓝屏的原因有:一、系统重要文件损坏或丢失引起的 (包括病毒所致),二、内存超频或不稳定造成的蓝屏,三、硬件的兼容性不好引起的蓝屏,四、硬件散热引起的“蓝屏”故障;计算机经常死机的原因有:一、系统出现错误包括病毒所致,二、主板的芯片或者其他的零部件损坏,三、显卡接触不良,四、内存接触不良,五、CPU风扇散热不良,六、计算机的电源有问题,七、硬盘出现故障等;计算机黑屏的原因:一、显示器断电,或显示器数据线接触不良; 二、主板没有供电; 三、显卡接触不良或损坏; 四、CPU 接触不良; 五、内存条接触不良; 六、机器感染 CIH 病毒,BIOS 被破坏性刷新等等。因为我师傅是硬件方面的工程师,对软件了解可能比较少吧,所以在软件方面的故障我接触的比较少,大多客户都是中病毒引起的,直接重装系统就解决问题了。但是我觉得重装系统实在是耗费太多的时间了,所以我就自学了很多软件方面的知识以完备自己。在公司里我问师傅,查资料,一个个问题迎刃而解,自己在这方面的知识得到了充实。这些在平常的书本上仅仅是获得感性的认识,而在这里真的实践了,才算是真正的掌握了,也让我认识到了自己的不足,告诫自己,不管做什么,切忌眼高手低,要善于钻研。师傅说对每台计算机都要细心负责,具有基本的专业素养,因为细心负责是做好每一件事情所必备的基本条件,基本的专业素养是做好前提是发挥自己的主观能动性:“主动出击”:当你可以选择的时候,把主动权握在自己手中。在公司的时候,主动的打扫卫生,主动地帮师傅做一些力所能及的事情,并会积极地寻找合适的时间,向老师请教问题,跟师傅像朋友那样交流,谈生活学习以及未来的工作,通过这些我就和师傅走的更近,在实习当中,,师傅就会更愿意更多的指导我,使我获得更大的收获。有时我就自高奋勇,独自去一些地方进行检修等故障排除。我心里感觉很高兴,因为我的主动,我巩固了我所学的知识,并且得到了师傅的认可。 整个的实习过程是紧张而愉快的,工作态度和成效也得到了经理和同事们的肯定。这次的实践让我领悟到很多。今后,我将继续保持认真负责的工作态度,高尚的思想觉悟,进一步完善和充实自己,争取在以后的学习中更好的完善自己,在以后的实践中更好的运用去自己的只是,做一个合格的大学生,将来做一名对社会有用的人。我们都会因涉事而成长。

第二件:我要谢谢我毕业了,尽管忙的喘不过气,但是不得不承认这个阶段是在高考后付出和得到都最多的。茫茫然中工作了走入了社会,刚开始难免觉得吃力和力不从心,到了今天我能坦然的面对一切的困难,并且坚定自己的信心。我相信走出校门的日子会更加精彩。

第三件:本文是在吴江红老师的热情关心和指导下完成的,她渊博的知识和严谨的治学作风使我受益匪浅,对顺利完成本课题起到了极大的作用。另外,由于一直实习的关系,对每周的例行检查出勤是不高的,老师宽容对待,甚至挤出自己的时间来给予指导,在此向她表示我最衷心的感谢!

在论文完成过程中,本人还得到了同学的热心帮助,本人向他们表示深深的谢意!

最后向在百忙之中评审本文的各位专家、老师表示衷心的感谢

后台管理员:admin

密码:admin888

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java和SQL Server可以被用于开发一个图书管理系统Java是一种通用编程语言,而SQL Server是一种关系型数据库管理系统。 开发图书管理系统的第一步是设计数据库。使用SQL Server作为数据库可以方便地存储和管理图书信息。可以创建一个包含图书名称、作者、出版日期、ISBN号码等字段的图书表。此外,还可以创建一个借阅者表,用于存储借阅者的信息。通过使用SQL Server的查询语言,可以轻松地实现图书的增加、删除、修改和查询功能。 Java可以用于实现系统的业务逻辑和用户界面。可以使用Java的面向对象特性,创建图书类和借阅者类,分别代表图书和借阅者对象。可以为图书类和借阅者类定义方法,以实现图书管理系统的各项功能,如借阅、归还、查询等。 在Java中,可以使用JDBC(Java Database Connectivity)连接SQL Server数据库。通过JDBC,可以将Java代码与SQL Server数据库进行交互。可以通过Java数据库访问API,执行SQL查询语句,从数据库中检索信息,以及更新、插入或删除数据。 在图书管理系统的用户界面方面,可以使用Java的图形用户界面(GUI)库,如Swing或JavaFX。可以设计一个用户友好的界面,包含图书查询、借阅、归还等功能。用户可以通过界面输入所需的信息,并通过Java代码与数据库进行交互,实现相应的操作。 综上所述,通过使用Java和SQL Server,可以开发一个功能完备的图书管理系统。使用Java作为编程语言,在设计业务逻辑和用户界面方面十分灵活,而SQL Server作为数据库管理系统,方便地存储和管理图书信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等天晴i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值