摘要
随着国内经济形势持续发展,国内酒店业进入难得的发展高峰期,使得中外资本家纷纷将目光投向中低端市场。然而,中国酒店业的区域结构不合理、竞争手段不足和市场对经济型酒店的需求日益显露,以及2008年北京奥运会、2010年上海世界博览会对酒店业的积极影响等诸多力量的交织,使得中国酒店市场演变成了一个淘金圣地。
在信息高度发达的今天,酒店制度的改革已经成为一种更广泛、全面的潮流。该“酒店房间预约系统设计”是基于Access 2003数据库、ASP程序设计的基础上实现的。该系统可以保存和处理多个酒店的名称、星级和地址等基本信息以及每个酒店的房间信息,同时可以保存和处理客户的订单信息,并且对于这些系统提供了相应的查询功能,而且有完善的多用户安全功能。保证在我国经济持续发展、信息时代日益更新的今天,服务行业依然蒸蒸日上。
3.1 功能需求
酒店预约基本都是需要通过电话或客户直接到酒店进行,由于预约记录多是人为完成,容易造成失误和遗漏,管理效率比较低,特别是顾客比较多的季节,传统的预约方式已经基本不能满足要求。
远程预约系统是一种全新的网络预约方式,通过互联网突破了时间和空间限制实现了便捷快速的预约与管理功能。本系统具有房间信息查询、预约房间和取消预约等功能。
本酒店房间预约系统按照用户部分和管理员部分划分了两块,它们所实现的功能如下。
- 用户部分
- 用户注册:检测用户提供的信息并注册用户。
- 用户登陆:通过用户名和密码核实登陆用户身份。
- 预约房间:预约某个时间的某一房间。
- 查询预约信息:查询该用户的预约信息。
- 取消房间预约:取消某一到期且未付款的有效预约。
- 查询房间信息:按照用户提出的条件列出查询结果。
- 给站长留言:检查用户留言的正确性并保存。
- 注销用户:结束用户会话,保证安全。
- 2. 管理员部分
- 阅览用户留言:调用用户留言并显示。
- 删除无用留言:删除需要处理的留言。
- 添加房间:添加新的房间,注册详细信息。
- 删除房间:根据用户提交的信息删除指定的房间。
- 修改房间信息:对于存在的某房间信息进行修改更新。
- 确认已付款用户的预约:当用户付款后对指定预约进行标记。
- 删除无用或错误的预约信息。
- 房间预约统计和用户统计。
- 安全注销。
4.1系统模块结构设计
系统设计主要包括功能模块的划分和系统流程的分析。根据客户的需求总结系统主要完成的功能,以及将来拓展需要完成的功能,然后根据设计好的功能划分出系统的功能模块,这样方便程序员管理和维护,最后设计出系统的流程。接下来,就详细介绍系统设计的前期准备。
4.1.1 功能模块划分
酒店房间预约系统应该具有用户注册登录、查看预约房间、留言、管理员综合管理等功能。根据对该系统的功能需求分析可以画出系统功能模块图。本系统将功能划分为用户和管理员两部分,图1所示是用户部分的功能模块图。
- 用户模块包括注册、登录和注销3个功能子模块,注册模块提供用户注册成为酒店房间预约系统的会员,拥有预约房间的功能,而只有登录的用户方可以进行房间的预约,因此登录模块提供会员登录功能。为了防止其他用户私自修改用户信息,同时又设计了注销功能模块。
- 房间模块包括查看房间、查询房间、查看预约、预约房间和取消预约等功能。通过查看或者输入条件查询房间,可以获得房间的具体信息,如果为登录用户,此时可以进行房间的预约操作,用户觉得不满意,可以通过取消预约模块取消预约,同时用户可以通过查看预约模块查看用户所有的预约信息。
- 留言模块为用户提供一个发表自己看法的场所,如果遇到什么困难或者不满意的地方。可以通过该模块发表。
管理端部分的功能如图2所示。
- 管理员登录模块提供管理员登录的入口,只有成功登录后,才可以执行管理员操作。
- 添加房间功能模块为管理员提供添加新的房间的功能,此时,管理员可以输入详细的房间信息。
- 如果房间出现问题或者该房间已经不存在,管理员可以通过删除房间模块把该房间删除。
- 当房间信息发生改变时,管理员可以通过修改房间信息模块对房间的信息进行修改。
- 管理员可以通过阅读留言模块查看用户发表的留言,并可以进行回复和删除等操作。
- 用户的预约只有等管理员确认后方可生效,管理员就是通过预约管理模块对用户的预约信息进行管理的,包括确定预约和删除预约等。
管理员操作结束时需要通过注销登录模块注销登录,防止系统信息被篡改。
有关管理员操作的各个页面必须在管理员登入后方可进入,因此,在这些页面的头部都加入了管理员登入验证代码。
6.1 管理功能模块
1.登入模块
登入模块是管理员进入管理系统的入口,通过核实管理员名和密码来核实管理员身份,图10所示管理员页面。
图10 管理员登录页面
提交的用户名和密码文件由admin.asp进行处理,并由它完成判断和跳转,程序清单9是admin.asp文件的实现代码。
程序清单9 管理员登录验证admin.asp
<%
dim admin_name,admin_psw,rs_admin
admin_name=request.Form("admin_name")
admin_psw=request.Form("admin_psw")
Set rs_admin = Server.CreateObject("ADODB.Recordset")
sql = "SELECT * FROM admin where admin_name='" & admin_name & "'" & "and admin_psw='" & admin_psw & "'"
rs_admin.Open sql,hotel_conn,3,2
if rs_admin.eof or rs_admin.bof then
response.Redirect("adminerr.asp")
response.End()
else
session("admin_name")= rs_admin("admin_name")
response.Redirect("administrator.asp")
rs_admin.close
end if
%>
如果管理员验证成功则进入查看留言模块administrator.asp文件,反之则转至提示管理员错误登录页面adminerr.asp文件。
2.查看和管理留言页面模块
留言功能是为了提供与用户的交互活动而设计的,它包括生成留言列表、阅读留言和删除留言3大部分。
- 生成留言列表
为了使管理员及时了解用户意见和建议,该系统把查看留言列表页面设置为管理员登录后的首页面,如图11所示。该功能由administrator.asp文件实现,见程序清单10
图11 留言列表
见程序清单10 生成留言列表核心代码administrator.asp
<%
dim rs_word,sql,readurl
set rs_word=server.CreateObject("adodb.recordset")
sql = "select * from word "
rs_word.open sql,hotel_conn,3,2
rs_word.movefirst
while (not rs_word.eof)
readurl="admin_rword.asp?word_id=" & rs_word("word_id")
%>
<tr class="text">
<td><div align="left"><%= rs_word("user_name") %></div></td>
<td><div align="left"><%= rs_word("word_id") %></div></td>
<td><div align="left"><%= rs_word("datetime") %></div></td>
<td>
<div align="left">
<a href="<%= readurl %>" target="_blank"><%= rs_word("title") %></a>
</div>
</td>
</tr>
<%
rs_word.movenext
wend
rs_word.close
set rs_word = nothing
%>
(2)阅读留言模块
当管理员在留言列表中单击留言标题时会弹出阅读流言界面,如图12所示。
阅读留言代码的实现比较简单,直接读取数据库留言表word中的留言信息,并构造删除留言链接,其实现代码见程序清单11
图12 阅读留言
程序清单11 阅读留言核心代码admin_rword.asp
<%
dim word_id,rs_word,sql
word_id=request("word_id")
if word_id="" then response.Redirect("error.asp")
set rs_word=server.CreateObject("adodb.recordset")
sql = "select * from word where word_id =" & word_id
rs_word.open sql,hotel_conn,3,2
delurl="delword.asp?word_id=" & word_id
%>
(3)删除留言模块
删除功能基本上是每个含有数据库的网站的必要功能。当管理员需要删除无用留言时,就会使用文件delword.asp,程序清单12是其实现代码。
<%
dim word_id,rs_del,sql
word_id=request("word_id")
if word_id="" then response.Redirect("error.asp")
set rs_del=server.CreateObject("adodb.recordset")
sql = "delete from word where word_id = " & word_id
rs_del.open sql,hotel_conn,3,2
set rs_del=nothing
%>
3.维护房间信息模块
维护房间模块包括显示房间列表、删除房间和修改房间信息3个功能。
- 显示房间列表
图13所示为房间列表的显示页面。从图中可以看出,可以对房间进行删除或修改操作。
房间列表的功能实现是由文件damin_room.asp完成的,其代码见程序清单14
图13 房间列表
程序清单13 房间列表实现核心代码damin_room.asp
<%
dim rs_room,sql,delurl,editurl
set rs_room=server.CreateObject("adodb.recordset")
sql = "select * from room "
rs_room.open sql,hotel_conn,3,2
rs_room.movefirst
while (not rs_room.eof)
delurl="del.asp?room_id=" & rs_room("room_id")
editurl="admin_edit.asp?room_id=" & rs_room("room_id")
%>
<tr class="text">
<td><div align="left"><%= rs_room("room_id") %></div></td>
<td><div align="left"><%= rs_room("name") %></div></td>
<td><div align="left"><%= rs_room("type") %></div></td>
<td><div align="left"><%= rs_room("cost") %></div></td>
<td>
<div align="left">
[<a href="<%= delurl %>">删除</a>]
[<a href="<%= editurl %>">修改</a>]
</div>
</td>
</tr>
<%
rs_room.movenext
wend
%>
- 删除房间
当酒店因为某种原因不能提供预约时,管理员可以将该房间从数据库中删除,删除功能的实现是文件del.asp来实现的,程序清单14是实现删除功能的代码。
图15删除房间成功页面
程序清单14 删除房间实现代码
<%
dim room_id,sql,rs_del
room_id=request("room_id")
if room_id="" then response.Redirect("error.asp")
set rs_del=server.CreateObject("adodb.recordset")
sql = "delete from room where room_id=" & room_id
rs_del.open sql,hotel_conn,3,2
%>
当管理员成功删除指定房间后会显示删除成功界面,如图15所示。
- 修改房间信息
修改房间信息的功能是修改存在于数据库中的房间信息,包括房间名称、房间类型和费用,但是不能修改房间ID。
修改房间信息功能有admin_edit.asp和admin_editchk.asp两个文件来完成。第一个文件用来接受管理员填写的更新信息,第二个用来检查数据并写入数据库中。图16所示是填写房间信息表单的页面。
图16 修改房间信息
程序清单15 修改房间信息核心代码admin_editchk.asp
<%
dim err(4)
dim room_id,room_name,room_type,cost,haveerr,rs_edit,sql
room_id=request.Form("room_id")
room_name=request.Form("name")
room_type=request.Form("type")
cost=request.Form("cost")
if len(room_name) > 30 then err(1)="房间名称不能超过30个字符"
if len(room_name) < 2 then err(1)="房间名称不能少于2个字符"
if not IsNumeric(cost) then err(2)="费用必须是数字"
if room_type="" then err(3)="房间类型不能位为空"
if len(cost) >4 then err(4)="费用不能多于4位数"
for i=1 to 4
if err(i)<>"" then haveerr=1
next
If haveerr = 0 Then
set rs_edit=server.CreateObject("adodb.recordset")
sql = "select * from room where room_id=" & room_id
rs_edit.open sql,hotel_conn,3,2
rs_edit("name")=room_name
rs_edit("type")=room_type
rs_edit("cost")=cost
rs_edit.update
%>
4.添加房间模块
该功能模块的实现是由文件admin_addnew.asp完成的。添加房间的页面如图17所示。其实实现代码比较简单就不再详细论述。
当管理员正确提交了要添加新房间的信息后就会出现如图18所示的成功提示,该功能是由文件admin_addnewchk.asp完成的,其实现代码见程序清单16
图17 添加新房间
程序清单16 添加房间页面关键代码admin_addnewchk.asp
<%
dim err(3)
dim haveerr,room_name,room_type,cost,i
dim rs_add,sql
room_name=request.Form("name")
room_type=request.Form("type")
cost=request.Form("cost")
if len(room_name) > 30 then err(1)="房间名称不能超过30个字符"
if len(room_name) < 2 then err(1)="房间名称不能少于2个字符"
if not IsNumeric(cost) then err(2)="费用必须是数字"
if len(cost) >4 then err(3)="费用不能多于4位数"
for i=1 to 3
if err(i)<>"" then haveerr=1
next
If haveerr=0 Then
set rs_add=server.CreateObject("adodb.recordset")
sql = "select * from room"
rs_add.open sql,hotel_conn,3,2
rs_add.addnew
rs_add("name")=room_name
rs_add("room_id")=room_name
rs_add("type")=room_type
rs_add("cost")=cost
rs_add.update
%>
<%
for i=1 to 3
if err(i) <> "" then response.Write("●" & err(i) & "<br>")
next
%>
<% End If %>
<%
set rs_add=nothing
%>
5.预约管理模块
预约管理模块包括确认预约和删除预约两部分,确认预约是指在用户已经对指定的预约付款后,管理员在预约数据库中将对应的预约信息修改为为已付款操作;删除预约用于在数据库预约表中出现错误预约或恶意预约后,由管理员强制将其删除。
- 确认预约页面
酒店房间预约系统规定,用户不能取消已经付款的预约,因为这些预约已经被认为是有效预约。同样,管理员不能删除已经付款的预约。预约列表界面是确认预约页面的一部分,它将为管理员显示所有为付款的预约,并提供“确认预约”和“删除”超链接。
图19所示是显示预约列表页面,图20所示是预约确认成功提示信息页面,它们的实现都由文件admin_chk.asp完成,它们的实现代码见程序清单17
图19 预约列表
图20 预约确认
程序清单17 确认预约功能核心代码admin_chk.asp
<%
dim preengage_id,rs_preengage,sql,rs_room,datetime
preengage_id=request("preengage_id")
set rs_preengage=server.CreateObject("adodb.recordset")
If preengage_id="" Then
sql = "select * from preengage where paid = 0"
rs_preengage.open sql,hotel_conn,3,2
rs_preengage.movefirst
%>
<br>
<table width="584" border="0" class="table_small">
<tr>
<td colspan="6"> </td>
</tr>
<tr>
<td colspan="6" class="text_title"><div align="left">预约确认</div></td>
</tr>
<tr>
<td colspan="6" class="table_title"> </td>
</tr>
<tr class="text">
<td width="86"><div align="left">预约用户</div></td>
<td width="125" class="text"><div align="left">房间名称</div></td>
<td width="89"><div align="left">预约日期</div></td>
<td width="89"><div align="left">预约时间</div></td>
<td width="61"><div align="left">费用</div></td>
<td width="104"><div align="left">操作</div></td>
</tr>
<%
while (not rs_preengage.eof)
%>
<tr class="text">
<td><div align="left"><%= rs_preengage("user_name") %></div></td>
<td class="text">
<div align="left">
<%
set rs_room=server.CreateObject("adodb.recordset")
sql = "select * from room where room_id=" & rs_preengage("room_id")
rs_room.open sql,hotel_conn,3,2
response.Write(rs_room("name"))
rs_room.close
%>
</div></td>
<td><div align="left"><%= rs_preengage("pyear") & "-" & rs_preengage("pmonth") & "-" & rs_preengage("pday") %></div></td>
<td><div align="left"><%= rs_preengage("beginhour") & ":00-" & (rs_preengage("beginhour")+1) & ":00" %></div></td>
<td><div align="left"><%= rs_preengage("cost") %></div></td>
<td><div align="left">[<a href="admin_chk.asp?preengage_id=<%= rs_preengage("preengage_id") %>">确认预约</a>][<a href="chkcancel.asp?preengage_id=<%= rs_preengage("preengage_id") %>">删除</a>]</div></td>
</tr>
<%
rs_preengage.movenext
wend
%>
<tr>
<td colspan="6"> </td>
</tr>
<tr>
<td colspan="6"> </td>
</tr>
</table>
<%
Else
'已提交preengage_id数据,开始更新预约表preengage的paid字段---------
sql = "select * from preengage where preengage_id=" & preengage_id
rs_preengage.open sql,hotel_conn,3,2
rs_preengage("paid")=1
rs_preengage.update
datetime= rs_preengage("pyear") & "-" & rs_preengage("pmonth") & "-" & rs_preengage("pday")
datetime=datetime & " " & rs_preengage("beginhour") & ":00-" & (rs_preengage("beginhour")+1) & ":00"
%>
<br>
<table width="488" border="0" class="table_small">
<tr>
<td> </td>
</tr>
<tr>
<td class="text_title"><div align="left">预约确认成功</div></td>
</tr>
<tr>
<td class="table_title"> </td>
</tr>
<tr>
<td class="text"><div align="left">成功确认ID为<%= rs_preengage("preengage_id") %>的预约,它是在<%= datetime %>的预约,费用为<%= rs_preengage("cost") %>元</div></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<% End If %>
- 删除预约页面
图21所示是删除页面成功的提示信息。该功能的实现是由文件chkcancel.asp完成的,在用户面取消预约模块中还会看到该文件的出现,它们的实现都是由该文件完成的。详细代码见程序清单18
程序清单18 删除和取消预约功能的实现chkcancel.asp
<%
dim preengage_id,rs_cancel,rs_del,delok
preengage_id=request("preengage_id")
if preengage_id="" then
response.Redirect("error.asp")
response.End()
end if
if session("user_name")="" and session("admin_name")="" then
response.Redirect("error.asp")
response.End()
end if
set rs_cancel=server.CreateObject("adodb.recordset")
sql = "select * from preengage where preengage_id=" & preengage_id
if session("user_name") <> "" then
sql = sql & "and user_name = '" & session("user_name") &"'"
end if
rs_cancel.open sql,hotel_conn,3,2
if rs_cancel.eof or rs_cancel.bof then
response.Redirect("error.asp")
response.End()
end if
if datediff("h",now,rs_cancel("pyear") & "-" & rs_cancel("pmonth") & "-" & rs_cancel("pday") & " " & rs_cancel("beginhour") & ":00:00") > 24 then
rs_cancel.close
set rs_del=server.CreateObject("adodb.recordset")
sql = "delete from preengage where preengage_id=" & preengage_id
rs_del.open sql,hotel_conn,3,2
delok=1
else
delok=0
end if
%>
6.统计模块
统计模块的功能分为用户统计和预约统计两部分,主要是方便管理员对该酒店运行合理管理。这些功能的实现都是由文件admin_total.asp完成的,请参考程序清单19
程序清单19 统计功能实现核心代码admin_total.asp
<%
set rs_preengage=server.CreateObject("adodb.recordset")
sql = "select count(*) as total from preengage "
rs_preengage.open sql,hotel_conn,3,2
preengage_total=rs_preengage("total")
rs_preengage.close
sql = "select count(*) as total from preengage where paid =1 "
rs_preengage.open sql,hotel_conn,3,2
preengage_paid=rs_preengage("total")
rs_preengage.close
preengage_notpaid = preengage_total - preengage_paid
sql = "select sum(cost) as total from preengage where paid =1"
rs_preengage.open sql,hotel_conn,3,2
money = rs_preengage("total")
rs_preengage.close
sql = "select sum(cost) as total from preengage where paid =0"
rs_preengage.open sql,hotel_conn,3,2
notmoney =rs_preengage("total")
rs_preengage.close
Set rs_user = Server.CreateObject("ADODB.Recordset")
sql = "select count(*) as male from user_reg where sex = '男'"
rs_user.Open sql,hotel_conn,3,2
rs_user_male = rs_user("male")
rs_user.close
sql = "select count(*) as female from user_reg where sex = '女'"
rs_user.Open sql,hotel_conn,3,2
rs_user_female = rs_user("female")
rs_user.close
rs_user_total = rs_user_male + rs_user_female
%>
用户统计实现了统计用户总数和计算男女用户比例的功能,其界面如图22所示。预约统计实现了对预约总数、已付款预约数、实际收入和未付清预约款的统计功能,如图23所示。
图5-22 预约统计
图23 用户统计
7.1 用户功能模块
用户功能模块主要包括用户登录、用户注册、发表留言、浏览房间信息、查看房间信息、预约房间、取消预约等功能。
1.首页设计
图24所示用户进入网站看到的界面,包括了简单的房间统计,及用户登录系统等功能。
图24 网站首页
程序清单20所示是首页实现的核心代码,即文件index.asp
<%
dim rs_user,room
dim rs_user_total,room_total
Set rs_user = Server.CreateObject("ADODB.Recordset")
sql = "SELECT user_name FROM user_reg"
rs_user.Open sql,hotel_conn,3,2
Set room = Server.CreateObject("ADODB.Recordset")
sql = "SELECT room_id FROM room"
room.Open sql,hotel_conn,3,2
If (rs_user.RecordCount = -1) Then
rs_user_total=0
rs_user.movefirst
While (Not rs_user.EOF)
rs_user_total = rs_user_total + 1
rs_user.MoveNext
Wend
else
rs_user_total = rs_user.RecordCount
End If
If (room.RecordCount = -1) Then
room_total=0
room.movefirst
While (Not room.EOF)
room_total = room_total + 1
room.MoveNext
Wend
else
room_total = room.RecordCount
End If
%>
<%
If (room_total = -1) Then
room_total=0
While (Not room.EOF)
room_total = room_total + 1
room.MoveNext
Wend
If (room.CursorType > 0) Then
room.MoveFirst
Else
room.Requery
End If
If (room_numRows < 0 Or room_numRows > room_total) Then
room_numRows = room_total
End If
room_first = 1
room_last = room_first + room_numRows - 1
If (room_first > room_total) Then
roomd_first = room_total
End If
If (room_last > room_total) Then
room_last = room_total
End If
End If
%>
<%
if not isempty(session("user_name")) then
set rs_user_name=server.CreateObject("adodb.recordset")
sql="select * from user_reg where user_name ='" & session("user_name") &"'"
rs_user_name.open sql,hotel_conn,3,1
response.Write("欢迎您,"&session("user_name") &" <br>")
end if
%>
<%
set rs_user_name = Nothing
rs_user.Close()
Set rs_user = Nothing
room.Close()
Set room = Nothing
%>
2.注册登录模块
该模块分为注册和登录两个功能模块。
- 注册模块
图25所示用户注册页面,是由文件reg.asp来实现的。他不需要连接数据库,主要功能是收集信息并传递给reg2.asp文件进行数据有效性验证。
图25 用户注册页面
程序清单21 生成年、月、日序列reg.asp部分代码
<!-- 生成年 -->
<select name="byear" class="select_filed" id="byear" tabindex="7">
<%for i=1940 to year(date)-3%>
<option value="<%=i%>"><%=i%></option>
<%next%>
</select>年
<!-- 生成月 -->
<select name="bmonth" class="select_filed" id="bmonth" tabindex="8">
<%for i=1 to 12%>
<option value="<%=i%>"><%=i%></option>
<%next%>
</select>月
<!-- 生成日 -->
<select name="bday" class="select_filed" id="bday" tabindex="9">
<%for i=1 to 31%>
<option value="<%=i%>"><%=i%></option>
<%next%>
</select>日</div></td>
文件reg.asp接收到的信息传递给reg2.asp文件进行验证,其实现代码见程序清单22所示
<%
dim err(9)
dim name,psw,psw2,sex,byear,bmonth,bday,tel,email
dim rs_test_name,rs_user
name=request("name")
psw=request("psw")
psw2=request("psw2")
sex=request("sex")
byear=request("byear")
bmonth=request("bmonth")
bday=request("bday")
tel=request("tel")
email=request("email")
if is_name(name) then
set rs_test_name=server.CreateObject("adodb.recordset")
sql = "select * from user_reg where user_name='" & name & "'"
rs_test_name.open sql,hotel_conn,3,2
if not(rs_test_name.eof or rs_test_name.bof) then err(2)="这个用户名已经存在"
else
err(1)="用户名只能使用字母、数字和下划线"
end if
if len(name)>12 then err(3)="用户名不能超过12个字符"
if len(name)<4 then err(3)="用户名不能少于4个字符"
if psw <> psw2 then err(4)="两次输入的密码不一致"
if len(psw)>16 then err(5)="密码不能超过16位"
if len(psw)<4 then err(5)="密码不能少于4位"
if len(tel)>15 then err(6)="电话号码不能超过15个字符"
if len(tel)<7 then err(6)="电话号码不能少于7个字符"
if len(email)>50 then err(7)="Email最多只能有50个字符"
if not is_email(email) then err(8)="Email地址错误"
if not(isdate(byear & "-" & bmonth & "-" & bday)) then err(9)="生日您没有选择或生日日期无效"
for i=1 to 9
if err(i)<>"" then haveerr="yes"
next
%>
<%
set rs_user=server.CreateObject("adodb.recordset")
rs_user.open "select * from user_reg",hotel_conn,3,2
rs_user_total=(rs_user.RecordCount)+1
If (rs_user.RecordCount = -1) Then
rs_user_total=0
While (Not rs_user.EOF)
rs_user_total = rs_user_total + 1
rs_user.MoveNext
Wend
end if
rs_user.addnew
rs_user("user_name")=name
rs_user("psw")=psw
rs_user("sex")=sex
rs_user("age")=datediff("yyyy",byear & "-" & bmonth & "-" & bday,date)
rs_user("email")=email
rs_user("tel")=tel
rs_user("byear")=byear
rs_user("bmonth")=bmonth
rs_user("bday")=bday
rs_user.update
session("user_name") = name
%>
- 登录模块
登录模块主要是由文件login.asp来实现的。其登录核心代码见程序清单23.通过user_id和psw接收用户在首页填写的用户和密码,并打开数据库在user_reg用户信息表中查询,如果找到了相应的记录则将用户名写入session(“user_name”),并给变量haverr赋值为0作为显示正确登录的标识。
程序清单23 用户登录验证login.asp部分代码
<%
user_id=request.Form("user_name")
psw=request.Form("psw")
set rs_user=server.CreateObject("adodb.recordset")
sql="select * from user_reg where user_name = '" & user_id & "' and psw='" & psw & "'"
rs_user.open sql,hotel_conn,3,2
if not(rs_user.eof or rs_user.bof) then
session("user_name")=rs_user("user_name")
haveerr=0
else
haveerr=1
end if
%>
3.查看房间模块
查看房间信息是酒店应该提供一个必要功能。图26所示是查看房间页面的示意图,从图中可以看出在该页面显示了房间名称、房间类型、费用和预约操作。
图26 查看房价
在查看房间页面room.asp中首先要打开房间信息表room来获取信息,然后通过循环来逐条列出房间信息,见程序清单24
见程序清单24 显示房间信息核心代码room.asp
<%
set rs_room=server.CreateObject("adodb.recordset")
sql = "select * from room"
rs_room.open sql,hotel_conn,3,2
rs_room.movefirst
while (not rs_room.eof or rs_room.bof)
%>
<tr>
<td class="text"><div align="left"><%= rs_room("room_id") %></div></td>
<td class="text"><div align="left"><%= rs_room("name") %></div></td>
<td class="text"><div align="left"><%= rs_room("type") %></div></td>
<td class="text"><div align="left"><%= rs_room("cost") %></div></td>
<td class="text"><div align="left">
<a href="preengage.asp?room_id=<%= rs_room("room_id") %>">我要预约</a>
</div></td>
</tr>
<%
rs_room.movenext
wend
%>
4.查询房间模块
当房间信息过多的时候,用户为了快速获得满足自己要求的房间就比较麻烦。本系统设计了查询功能,方便用户输入条件获得需求房间。图27所示为了一个简单查询结果的页面。实现代码见程序清单25
图27 查询房间
程序清单25 查询功能实现代码search.asp
<%
set_room=request.Form("set_room")
set_cost=request.Form("set_cost")
%>
<form name="form1" method="post" action="">
<table width="533" border="0" class="table_small">
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td colspan="2" class="text_title"><div align="left">请给出查询条件:</div></td>
</tr>
<tr>
<td colspan="2" class="table_title"> </td>
</tr>
<tr>
<td colspan="2" class="text"><div align="left">
<p>查看所有费用上限
<select name="set_cost" class="select_filed2" id="set_cost">
<option selected>不作要求</option>
<option>50元</option>
<option>200元</option>
<option>400元</option>
<option>600元</option>
<option>600元以上</option>
</select>
的
<select name="set_room" class="select_filed2" id="set_room">
<option selected>所有</option>
<option >总统套房</option>
<option>观光二人间</option>
<option>标准间</option>
<option>普通二人间</option>
<option>单人间</option>
<option>普通四人间</option>
<option>其他</option>
</select>
房间</p>
</div></td>
</tr>
<tr>
<td width="341" class="text"> </td>
<td width="121" class="text"><div align="center">
<input name="search" type="submit" class="button_" id="search" value="查询">
</div></td>
</tr>
</table>
</form>
<%
if set_room="" and set_cost="" then
response.End()
else
%>
<%
set rs_search=server.CreateObject("adodb.recordset")
sql = "select * from room "
'如果输入查询条件,构造where结构-----------
if not (set_cost = "不作要求" and set_room = "所有" )then
sql = sql & "where "
end if
if set_room <> "所有" then
sql = sql & "type = '" & set_room& "'"
end if
if set_cost <> "不作要求" and set_room <> "所有" then
sql = sql & " and "
end if
if set_cost = "50元" then
sql = sql & "cost <= 50"
elseif set_cost = "200元" then
sql = sql & "cost <= 200"
elseif set_cost = "400元" then
sql = sql & "cost <=400"
elseif set_cost = "600元" then
sql = sql & "cost <= 600"
elseif set_cost = "600元以上" then
sql = sql & "cost > 600"
end if
'response.Write(sql)
'打开房间数据库---------------
rs_search.open sql,hotel_conn,3,2
if rs_search.eof or rs_search.bof then
searchok=0
else
searchok=1
end if
%>
<table width="533" border="0" class="table_small">
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4" class="text_title"><div align="left">查询结果:
<%
if searchok=1 then
response.Write("查看所有开放于"& set_time &"的"& set_room &"房间,费用上限"& set_cost)
end if
%>
</div></td>
</tr>
<tr>
<td colspan="4" class="table_title"> </td>
</tr>
<% If searchok=0 Then %>
<tr>
<td colspan="4" class="text_error"><div align="left">●没有找到符合要求的房间</div></td>
</tr>
<% Else %>
<tr class="text_title">
<td width="145"><div align="left">房间名称</div></td>
<td width="112"><div align="left">房间类型</a></div></td>
<td width="136"><div align="left">费用(元/小时)</div></td>
<td width="118"><div align="left">使用时间</div></td>
</tr>
<%
rs_search.movefirst
while (not rs_search.eof)
%>
<tr class="text">
<% urltext="preengage.asp?room_id="& rs_search("room_id") %>
<td><div align="left"><a href="<%= urltext %>"><%= rs_search("name") %></a></div></td>
<td><div align="left"><%= rs_search("type") %></div></td>
<td><div align="left"><%= rs_search("cost") %></div></td>
<td><div align="left">24小时</div></td>
</tr>
<%
rs_search.movenext
Wend
%>
5预约房间和取消预约模块
预约是本系统的核心所在,该模块接收用户提交的房间编号和预约时间,并判断房间在指定时间内是否空闲,最后给出用户预约结果,如果预约成功则要将信息写入数据库。
图28所示是预约房间界面,图29显示房间预约成功
图28 预约房间
图29 预约成功界面
由preengage.asp文件获取的表单信息给chkpre.asp文件处理。本系统要求用户提出预约时刻要比开始使用时间提前24小时,因此首先由chkpre.asp判断用户提交的时刻是否符合要求,然后查询数据库中该房间在这个时间是否空闲,最后给出预约成功的提示,并将预约信息写入数据库,代码见程序清单26
<%
dim room_id,pyear,pmonth,pday,ptime,chkok,err
dim rs_preengage,rs_room,rs_save
room_id=request.Form("room_id")
pyear=request.Form("pyear")
pmonth=request.Form("pmonth")
pday=request.Form("pday")
ptime=request.Form("ptime")
%>
<%
if not isdate(pyear & "-" & pmonth & "-" & pday) then
err=1
end if
if err=1 then
%>
<%= "<title>出现错误!</title>" %>
<%
set rs_preengage=server.CreateObject("adodb.recordset")
sql = "select * from preengage where room_id =" & room_id & " and beginhour =" & ptime
sql = sql & "and pyear= " & pyear & "and pmonth=" & pmonth & "and pday=" & pday
rs_preengage.open sql,hotel_conn,3,2
if rs_preengage.eof or rs_preengage.bof then
chkok=1
else
chkok=0
end if
if chkok=1 then
set rs_save=server.CreateObject("adodb.recordset")
sql = "select * from preengage"
rs_save.open sql,hotel_conn,3,2
set rs_room=server.CreateObject("adodb.recordset")
sql = "select * from room where room_id=" & room_id
rs_room.open sql,hotel_conn,3,2
rs_save.addnew
rs_save("user_name")=session("user_name")
rs_save("room_id")=room_id
rs_save("datetime")=now()
rs_save("cost")=rs_room("cost")
rs_save("pyear")=pyear
rs_save("pmonth")=pmonth
rs_save("pday")=pday
rs_save("beginhour")=ptime
rs_save.update
rs_save.movelast
%>
<%= "<title>预约成功</title>" %>
<%= "<title>预约未被接受!</title>" %>
取消预约模块的实现和管理端删除模块使用一个文件,这里就不再详细论述。
6.查看预约模块
用户在预约房间后会有查询预约情况的需求,查询页面主要由文件mine.asp实现,如图30所示。程序清单27是查看预约信息的核心代码。
图30 查看预约
程序清单27 查看预约的关键代码
<%
dim rs_preengage,rs_ground
dim time_out
set rs_preengage=server.CreateObject("adodb.recordset")
sql = "select * from preengage where user_name='" & session("user_name") & "'"
rs_preengage.open sql,hotel_conn,3,2
%>
<body>
<div align="center">
<table width="706" height="281" border="0" class="table_big">
<tr>
<td valign="top"><div align="center">
<!--#include file="include/head.asp" -->
<br>
<table width="605" border="0" class="table_small">
<tr>
<td colspan="7"> </td>
</tr>
<tr>
<td colspan="7" class="text_title"><div align="left">我的预约信息</div></td>
</tr>
<tr>
<td colspan="7" class="table_title"> </td>
</tr>
<% If rs_preengage.eof or rs_preengage.bof Then %>
<tr>
<td colspan="7" class="text"><div align="left">您还没有进行任何预约!</div></td>
</tr>
<% Else %>
<tr class="text">
<td width="105"><div align="left">房间名称</div></td>
<td width="68"><div align="left">房间类型</div></td>
<td width="50"><div align="left">费用</div></td>
<td width="69"><div align="left">预约日期</div></td>
<td width="86"><div align="left">预约时间</div></td>
<td width="117"><div align="left">状态</div></td>
<td width="80">操作</td>
</tr>
<%
rs_preengage.movefirst
while (not rs_preengage.eof)
set rs_room=server.CreateObject("adodb.recordset")
sql = "select * from room where room_id=" & rs_preengage("room_id")
rs_room.open sql,hotel_conn,3,2
%>
<tr class="text">
<td><div align="left"><%= rs_room("name") %></div></td>
<td><div align="left"><%= rs_room("type") %></div></td>
<td><div align="left"><%= rs_room("cost") %></div></td>
<td><div align="left"><%= rs_preengage("pyear")&"-"&rs_preengage("pmonth")&"-"&rs_preengage("pday") %></div></td>
<td><div align="left"><%= rs_preengage("beginhour")&":00-"&(rs_preengage("beginhour")+1)&":00" %></div></td>
<td><div align="left">
<%
If rs_preengage("paid")=1 Then
response.Write("已经付款 ")
else
response.Write("尚未付款 ")
end if
time_out=datediff("d",now,rs_preengage("pyear") & "-" & rs_preengage("pmonth") & "-" & rs_preengage("pday") & " " & rs_preengage("beginhour") & ":00:00")
if time_out < 0 then
response.Write("已经过期")
else
response.Write("尚未到期")
end if
%>
</div></td>
<td>
<% if rs_preengage("paid")=0 and time_out > 0then %>
<a href="cancel.asp?preengage_id=<%= rs_preengage("preengage_id") %>">取消预约</a>
<% end if %>
</td>
</tr>
<%
rs_preengage.movenext
wend
%>
<% End If %>
7.留言模块
留言模块是给用户发表意见和看法的场所。图31所示为发表留言界面。程序清单28是留言功能实现的代码主要部分。
图31 发表留言界面
程序清单28 留言功能实现部分代码lword.asp
<%
dim title,word,check,lword
title=request.Form("title")
word=request.Form("word")
if title="" and word="" then
lword=1
else
check=""
if title="" then check="●没有输入留言标题<br>"
if word="" then check=check & "●没有输入留言内容<br>"
if len(title) > 50 then check=check & "●标题超过50个字符<br>"
if len(word) > 250 then check=check & "●留言超过250个字符<br>"
end if
%>
<body>
<div align="center">
<table width="706" height="281" border="0" class="table_big">
<tr>
<td valign="top"><div align="center">
<!--#include file="include/head.asp" -->
<% If lword=1 Then %>
<br>
<form name="form1" method="post" action="">
<table width="532" border="0" class="table_small">
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td colspan="4" class="text_title"><div align="left">站长留言</div></td>
</tr>
<tr>
<td colspan="4" class="table_title"> </td>
</tr>
<tr class="text">
<td width="40" class="text"><div align="left">标题: </div></td>
<td colspan="3" class="text"><div align="left">
<input name="title" type="text" class="textfield" id="title">
</div></td>
</tr>
<tr class="text">
<td valign="top" class="text"><div align="left">内容: </div></td>
<td colspan="3" valign="top"><div align="left">
<textarea name="word" class="textfield2" id="word"></textarea>
</div></td>
</tr>
<tr>
<td colspan="4" valign="top"> </td>
</tr>
<tr>
<td> </td>
<td width="58"> </td>
<td width="51"><input name="lword" type="submit" class="button_" id="lword" value="留言"></td>
<td width="361"><div align="left">
<input name="reset" type="reset" class="button_" id="reset" value="清空">
</div></td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
</table>
</form>
<% Else %>
<% If check<>"" Then %>
<br>
<table width="480" border="0" class="table_small">
<tr>
<td> </td>
</tr>
<tr>
<td class="text_title">
<div align="left">留言错误!</div></td>
</tr>
<tr>
<td class="table_title"> </td>
</tr>
<tr>
<td class="text_error"><div align="left"><%= check %></div></td>
</tr>
<tr>
<td class="text"><div align="center">[<a href="lword.asp">返回留言页面</a>]</div></td>
</tr>
<tr>
<td class="text_error"> </td>
</tr>
</table>
<% Else %>
<%
set rs_word=server.CreateObject("adodb.recordset")
sql="select * from word where user_name ='" & session("user_name") & "'"
rs_word.open sql,hotel_conn,3,2
num=rs_word.recordcount
rs_word.close
sql="select * from word"
rs_word.open sql,hotel_conn,3,2
rs_word.addnew
rs_word("user_name")=session("user_name")
rs_word("datetime")=now()
rs_word("title")=title
rs_word("word")=word
rs_word.update
rs_word.close
%>
<br>
<table width="480" border="0" class="table_small">
<tr>
<td> </td>
</tr>
<tr>
<td class="text_title"><div align="left">留言成功</div></td>
</tr>
<tr>
<td class="table_title"> </td>
</tr>
<tr>
<td class="text"><div align="left"><%= "您给站长的留言一共有" & (num+1) & "条" %> </div></td>
</tr>
<tr>
<td class="text"><div align="center">[<a href="index.asp" class="text">返回首页</a>]</div></td>
</tr>
<tr>
<td> </td>
</tr>
</table>
<% End If %>
<% End If %>