座位管理系统Web查询页面的实现
2013-04-12肖铮王爽黄国凡
摘 要:基于座位管理系统的Web Service接口,采用SOAP方案实现了座位信息的查询页面,并通过Ajax实现座位信息的实时更新。
关键词:座位管理系统;Web Service;SOAP;Ajax
中图分类号:TP315 文献标志码:A 文章编号:1673-8454(2013)15-0049-03
一、座位系统的现实意义
信息共享空间、自习室座位资源已成为考量高校图书馆服务的核心指标。临近期末,读者对座位资源的需求更为突出。部分高校图书馆针对座位紧张、占座现象严重,开发了自习室管理系统。[1]商业化的座位管理系统针对座位这一独特资源进行了数据库优化、流程简化,并提供了应用接口供个性化二次开发。目前已有不少高校图书馆采用了此套座位管理系统。
安装座位管理系统后,读者在座位系统终端机上刷校园卡选号,点击屏幕,在空座分布图上选择座位,打印座位号条即可凭号入座。凭条上印有座位号、校园学生卡卡号和进馆时间等信息,离开时需要刷卡释放座位。如果中途有事要离开座位,也需要重新刷卡,在系统中选择暂离,座位将自动保留一段时间,如果超时系统将释放座位,以便其他读者选择。每学年期末是座位紧张高峰期,从目前厦大图书馆使用情况来看,引进此套座位管理系统后,座位利用率有了很大的提升。
但是,此套座位管理系统安装于我馆内部网,无法由外部Web访问,亦无法远程查询目前座位状况。期末座位紧张时段,学生经常到馆后才发现无位可选,提供通过Web查询实时座位状况的功能是对此套座位管理系统的有效改进,能极大地满足学生使用需求,提升系统可用性。
二、座位系统Web Service介绍
座位管理系统提供了便于与其它应用系统互操作和个性化定制的Web Service,该Web Service使用SOAP代码实现。[2] SOAP(Simple Object Access Protocol,简单对象访问协议)是一种轻量的、简单的、基于XML的远程访问协议,可以与现有的多种传输层或应用层协议结合使用,如TCP、HTTP、SMTP等。SOAP广泛使用的是基于HTTP和XML协议的实现(SOAP=RPC+HTTP+XML),也就是大家常提的Web Service使用的通信协议。一个SOAP方法可以简单地看成遵循SOAP编码规则的HTTP请求和响应。
座位管理系统Web Service目前提供六个接口,分别实现阅览室状态查询、座位使用状态查询、读者当前状态查询、读者进出状态查询、读者违规记录查询、违规黑名单记录查询六项功能。这里就本文需要使用的阅览室状态查询和座位使用状态查询予以详细介绍,其它接口不予赘述。
阅览室状态查询接口 ReadingRoomState(ReadingRoomNo)
参数说明:
返回XML文档说明:
<!—Status 阅览室状态(开放/关闭) -->
座位使用状态查询 SeatUsedInfo(ReadingRoomNo)
参数说明:
返回XML文档说明:
<!--区域名称 No 编号;-->
<!--UsedSum 使用数;AllSum 总数;LeaveSum 暂时离开数-->
三、座位信息Web查询页面的实现
座位信息Web查询页面需要提供的信息有:
(1)图书馆总座位数,总使用座位数;
(2)各阅览室状态;
(3)各阅览室总座位数,总使用座位数。
因为阅览室的状态和座位使用情况是不断变化的,因此在设计座位信息的Web查询页面时,必须要考虑如何能够在Web页面上显示出实时的情况,因此就需要使用Ajax技术,让Web页面在不进行手动刷新时自动获取当前座位信息,并显示在Web页面上。
为方便Ajax程序调用,在座位管理系统Web Service的基础上,再设计一个二次封装接口。该接口负责从数据库提取获得阅览室记录号,通过Web Service提交调用请求,解析Web Service返回结果,计算图书馆总座位数、总使用座位数。
流程如图1所示:
座位管理系统提供的Web Service需要通过阅览室记录号提交调用请求返回查询结果。调用座位系统Web Service的ASP代码如下:[3]
function RoomInfo(readingroomno)
dim xmlReadingRoomState, xmlSeatUsedInfo, UsedSum, AllSum, freeSeat
dim soapClient, xmlReader
set soapClient = Server.CreateObject(\"MSSOAP.SoapClient30\")
Set xmlReader = Server.CreateObject(\"MSXML2.DomDocument\")
’调用阅览室名称和阅览室状态
soapClient.ClientProperty(\"ServerHTTPRequest\") = true
call soapClient.mssoapinit(\"http://localhost/WebService/SMS_DataQueryInterface.asmx?WSDL\")
xmlReadingRoomState = soapClient.ReadingRoomState(readingroomno)
xmlReader.loadXML(xmlReadingRoomState)
ReadingRoomState = xmlReader.documentElement.selectNodes(\"Status\")(0).text
RoomName = xmlReader.documentElement.selectNodes(\"RoomName\")(0).text
’调用阅览室座位信息(已用座位、总座位数、暂离座位数)
xmlSeatUsedInfo = soapClient.SeatUsedInfo(readingroomno)
xmlReader.loadXML(xmlSeatUsedInfo)
UsedSum = xmlReader.documentElement.selectNodes(\"Seat/@UsedSum\")(0).text
AllSum = xmlReader.documentElement.selectNodes(\"Seat/@AllSum\")(0).text
freeSeat = xmlReader.documentElement.selectNodes(\"Seat/@freeSeat\")(0).text
LeaveSum= xmlReader.documentElement.selectNodes(\"Seat/@leaveSum\")(0).text
set soapClient = nothing
set xmlReader = nothing
’返回阅览室信息
RoomInfo = Array(RoomName, AllSum, ReadingRoomState, freeSeat, UsedSum, leaveSum )
end function
封装二次接口,返回图书馆总座位信息及各阅览室座位信息:
’从数据库读取图书馆阅览室记录号,调用接口读取各阅览室信息
roomNo = \"000\"rs(\"ReadingRoomNo\")
’取阅览室相关数据到数组roomInfos
roomInfos(i) = roomInfo(roomNo)
’计算总座位数、已占座位数
for i=0 to k-1
totalSeat = totalSeat + roomInfos(i)(1)
totalTakenSeat = totalTakenSeat + roomInfos(i)(4)
’定义一个二维数组(全部:已占:暂离:状态)
redim seatInfo_ary(k, 3)
seatInfo_ary(0,0) = totalSeat
seatInfo_ary(0,1) = totalTakenSeat
’searInfo_ary(0,2) = 0
j = 0
for i=0 to k-1
seatInfo_ary(i+1, 0) = roomInfos(j)(1) ’总座位数
seatInfo_ary(i+1, 1) = roomInfos(j)(4) ’已占座位数
seatInfo_ary(i+1, 2) = roomInfos(j)(5) ’剩余座位数
seatInfo_ary(i+1, 3) = roomInfos(j)(2) ’阅览室状态
j=j+1
next
’二次封装接口返回值
response.write \"
for i=0 to k
response.write \"
next
response.write \"\"
而后使用Ajax调用二次封装接口数据,在查询页面显示实时信息:
function xmuseat() {
$.ajax({
type: \"POST\",
url: \"seatinfo.asp\",
}).done(function( result ) {
k = $(result).find(\"takenseat\").length;
for (i=0; i takenseat = $(result).find(\"takenseat\").eq(i).text(); readingroomstate = $(result).find(\"readingroomstate\").eq(i).text(); $('#st'+i).text(takenseat); allseat = $(result).find(\"allseat\").eq(i).text(); if (readingroomstate = \"开放\"){ $('#roomstate'+i).removeClass().addClass(\"rb open\"); }else if (readingroomstate = \"关闭\") { $('#roomstate'+i).removeClass().addClass(\"rb close\"); } if (takenseat/allseat > 0.85) { $('#roomstate'+i).removeClass().addClass(\"rb full\"); } } }); } $(document).ready(function(){ //定时执行,自动加载ajax程序 setInterval(xmuseat, 10000); }); 为了使座位信息页面更加直观,在座位系统查询页面上使用色块图代表阅览室,通过颜色区别阅览室座位数使用情况。通过Ajax动态调用实时座位数,判断已用座位与总座位数之比来确定色块使用的CSS类,并动态更新页面上的相关信息。最终查询页面如图2所示: 四、结束语 座位管理系统除了提供阅览室相关信息的Web Service接口外,还提供读者相关信息的接口。为了让读者更加便利地查看自己的选座信息、违规信息等数据,笔者下一步计划在图书馆自动化系统“我的图书馆”中,通过座位管理系统的Web Service整合读者个人座位记录查询和违规记录查询。◉ 参考文献: [1]孙发,吴代莉,曾为众.图书馆自习室管理系统的设计与实现[J].现代图书情报技术, 2010(5):93-98. [2]Web服务编程,REST与SOAP[EB/OL]. http://www.ibm.com/developerworks/cn/webservices/0907_rest_ soap/. [3]使用Asp(vbs)来读取XML数据岛[EB/OL]. http://www.cnblogs.com/hanwater/articles/1405083.html. (编辑:王天鹏)