dreamweaver 客房預訂業務的特點是顧客流動性大,其使用者註冊方式更為靈活,預訂業務除了常用的驗證外,還要防止在預訂滿的情況下繼續預訂客房。本執行個體將為讀者介紹如何?客房預訂業務。
效果說明
圖 96-1 所示是預訂業務的基本介面,使用者可以直接登入或註冊並預訂客房。
創作構思
通過程式檢測使用者是否成功登入,登入錯誤的是否能夠註冊成功,並添加使用者的預訂資料。通過“ DataTime ”類下的“ Compare ”,將使用者預訂的時間與其他使用者已預訂的時間進行比較,以檢測是否預訂滿。
操作步驟
步驟一 設定應用程式的環境
( 1 )複製光碟片中執行個體 96 的內容。將“光碟片 \ 源檔案 \ 執行個體 96 ” 目錄下的所有檔案複製到“ C:\ Inetpub\wwwroot\ ”目錄下。在 IIS 伺服器中設定預設網站的主目錄為“ C:\ Inetpub\wwwroot\hotel ”(可參考執行個體 1 中的相關方法)。在 Dreamweaver 中建立網站“ hotel ”,其網站目錄為“ C:\ Inetpub\wwwroot\hotel ”,建立網站的方法可參照執行個體 2 。
( 2 )“ hotel.mdb ”結構。運行 Access ,開啟“ C:\ Inetpub\wwwroot\adweb\data\hotel.mdb ”,可以看到資料庫“ hotel.mdb ”中有“ tbOder ”、“ tbUser ”和“ tbRoom ” 3 個資料表。“ tbOder ”表用於儲存使用者訂房的相關資料,該表的資料結構如圖 96-2 所示。“ tbUser ”表用於儲存使用者的註冊資訊,該表的資料結構如圖 96-3 所示。“ tbRoom ”表用於儲存酒店各類客房的價格及相應的客房數,該表的資料結構如圖 96-4 所示。資料庫“ hotel.mdb ”中還有一個查詢表“ UserOrder ”,該查詢表在設計檢視中的設定如圖 96-5 所示。
( 3 )建立資料庫連結“ ADconn ”,連結資料庫“ C:\ Inetpub\wwwroot\adweb \data\hotel.mdb ”,方法可參考執行個體 75 。
步驟二 設計基本頁面
( 1 )“ index.aspx ”頁面結構。開啟“ index.aspx ”,該頁面是素材直接提供的,初始開啟時如圖 96-6 所示。圖中①、②所示是映像而不是映像按鈕,圓角方框①所示的映像其作用是添加“ OnClick ”動作以顯示“ Layer1 ”層,該層中添加了一個日曆控制項,其 ID 為“ MyCalendar1 ”;圓角方框②所示映像的作用是添加“ OnClick ”動作以顯示“ Layer2 ”層,該層中添加了一個日曆控制項,其 ID 為“ MyCalendar2 ”。
提示:“ index.aspx ”初始頁面中其他控制項的設定情況如表 96-1 所示。
表 96-1 “ index.aspx ”初始頁面中其他控制項的設定情況
控制項對應文本 |
控制項類型 |
控制項 ID |
入住時間 |
asp :文字框 |
StartTime |
離店時間 |
asp :文字框 |
LastTime |
預訂數量 |
asp :文字框 |
OrderNum |
會員 ID |
asp :文字框 |
UserID1 |
會員密碼 |
asp :文字框 |
UserPass1 |
註冊 ID |
asp :文字框 |
UserID |
真實姓名 |
asp :文字框 |
UseName |
登入密碼 |
asp :文字框 |
UserPass |
重複密碼 |
asp :文字框 |
UserPass2 |
電子郵件 |
asp :文字框 |
UserEmail |
聯絡電話 |
asp :文字框 |
UserTel |
【現在預訂】按鈕 |
asp :按鈕 |
Orderbt |
【全部重設】按鈕 |
表單按鈕 |
Submit (其動作為重設表單) |
( 2 )添加資料集【 RoomData 】。在【伺服器行為】面板中添加資料集【 RoomData 】,其在【資料集】對話方塊中的設定如圖 96-7 所示。
( 3 )修改 SQL 命令。在【資料集】對話方塊中單擊【進階】按鈕,切換到【資料集】進階對話方塊,將 SQL 命令由 SELECT Pice,RoomID, RoomNum,RoomType FROM tbRoom 改為 SELECT Pice,RoomID, RoomNum, trim(RoomType)+chr(32)+cstr(Pice) As RoomType FROM tbRoom ,如圖 96-8 所示。
( 4 )添加資料列表。單擊 ASP.NET 捷徑功能表中的【 asp :選項按鈕列表】,操作如圖 96-9 所示。
( 5 )為頁面添加“ System.Data ”、“ System.Data.OleDb ”、“ System.Globalization ”和“ System.Threading ” 4 個命名空間,如圖 96-10 中圓角方框所示。
( 6 )定義頁面載入過程“ Page_Load ”,該過程的代碼如下所述。
Sub Page_Load(ByVal Src As Object, ByVal E As EventArgs)
Dim i As Integer
If Not Page.IsPostBack Then
For i = 0 To RoomData.RecordCount - 1
Dim str1, str2 As String
str1 = RoomData.DefaultView(i).Row("RoomType")
str2 = CStr(RoomData.DefaultView(i).Row("RoomID"))
RoomRadio.Items.Add(New ListItem(str1, str2))
Next
End If
End Sub
(讀者可開啟【光碟片】|【源檔案】|【執行個體 96 】|【 96.1.txt 】檔案,直接複製)
程式說明:
該 “ Page_Load ”過程是在第一次載入頁面時,為選項按鈕列表“ RoomRadio ”添加清單項目,添加清單項目的標籤值等於“ RoomData ”資料集下的欄位“ RoomType ”,而選取值等於欄位“ RoomID ”。
提示:也許有人會問為什麼不直接用選項按鈕列表的資料繫結呢?這由於通過 Dreamweaver 進行資料繫結,在程式中經常會出現無法擷取選項按鈕列表選取值的錯誤。
( 7 )定義“ MyCalendar1_SelectionChanged ”過程,用於響應日曆控制項“ MyCalendar1 ”的“ SelectionChanged ”事件,該過程的代碼如下所述。
Protected Sub MyCalendar1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs)Handles MyCalendar1.SelectionChanged
starttime.text = MyCalendar1.SelectedDate.ToShortDateString
End Sub
(讀者可開啟【光碟片】|【源檔案】|【執行個體 96 】|【 96.2.txt 】檔案,直接複製)
( 8 )定義“ MyCalendar2_SelectionChanged ”過程,用於響應日曆控制項“ MyCalendar2 ”的“ SelectionChanged ”事件,該過程的代碼如下所述。
Protected Sub MyCalendar2_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs)Handles MyCalendar2.SelectionChanged
lasttime.text= MyCalendar2.SelectedDate.ToShortDateString
End Sub
步驟三 實現客戶預訂業務
( 1 )實現客戶預訂業務的程式流程如圖 96-11 所示。
( 2 )為頁面添加 4 個全域變數,如圖 96-12 中圓角方框所示。
( 3 )定義“ Usercheck ”函數。該函數用於檢測使用者是否登入正確,登入不正確時是否註冊成功,如果使用者登入正確或者註冊成功,則該函數返回“ True ”,否則將返回“ False ”,該函數的代碼如下所述。
Function Usercheck() As Boolean
Dim Hotelada1, Hotelada2 As OleDbDataAdapter
Dim HotelDataSet1, HotelDataSet2 As System.Data.DataSet
Dim Hoteldt1, Hoteldt2 As DataTable
Dim tbRow As DataRow
Dim yy As OleDbCommandBuilder
Hotelstring = "Select * From tbUser Where UserId='" & UserID1.Text & "' And UserPass='" & UserPass1.Text & "'"
Hotelada1 = New OleDbDataAdapter(Hotelstring, conn)
HotelDataSet1 = New System.Data.DataSet
Hotelada1.Fill(HotelDataSet1, "tbUser")
Hoteldt1 = HotelDataSet1.Tables("tbUser")
If Hoteldt1.Rows.Count > 0 Then
strName = Hoteldt1.Rows(0)("UserId")
Else
If (Trim(UserID.Text) <> Nothing) And (Trim(UserPass.Text) <> Nothing) _
And (Trim(UserName.Text) <> Nothing) And (Trim(UserEmail.Text) <> Nothing) _
And (Trim(UserTel.Text) <> Nothing) Then
Hotelstring = "Select * from tbUser"
Hotelada2 = New OleDbDataAdapter(Hotelstring, conn)
yy = New OleDbCommandBuilder(Hotelada2)
HotelDataSet2 = New System.Data.DataSet
Hotelada2.Fill(HotelDataSet2, "tbUser")
Hoteldt2 = HotelDataSet2.Tables("tbUser")
tbRow = Hoteldt2.NewRow
tbRow("UserId") = UserID.Text
tbRow("UserPass") = UserPass.Text
tbRow("UserName") = UserName.Text
tbRow("UserEmail") = UserEmail.Text
tbRow("UserTel") = UserTel.Text
Hoteldt2.Rows.Add(tbRow)
Hotelada2.Update(HotelDataSet2, "tbUser")
strName = UserID.Text
Else
Usercheck = False
Exit Function
End If
End If
Usercheck = True
End Function
( 4 )定義“ Roomcheck ”函數。該函數首先檢測使用者有沒有選擇預訂客房類型,如果沒有選擇,則該函數返回“ False ”,接著在使用者選擇預訂客房類型的情況下,檢測所選擇的客房類型在預訂的時間段中是否已預訂滿,如果是,則返回“ False ”,否則將返回“ True ”,該函數的代碼如下所述。
Function Roomcheck() As Boolean
Dim Hotelada1, Hotelada2 As OleDbDataAdapter
Dim HotelDataSet1, HotelDataSet2 As System.Data.DataSet
Dim Hoteldt1, Hoteldt2 As DataTable
Dim i, RoomI As Integer
If RoomRadio.SelectedItem.Value <> Nothing Then
Hotelstring = "Select * From UserOrder Where RoomID=" & RoomRadio.SelectedItem.Value
Hotelada1 = New OleDbDataAdapter(Hotelstring, conn)
HotelDataSet1 = New System.Data.DataSet
Hotelada1.Fill(HotelDataSet1, "UserOrder")
Hoteldt1 = HotelDataSet1.Tables("UserOrder")
Dim Date1, Date2 As Date
Date1 = StartTime.Text
Date2 = LastTime.Text
For i = 0 To Hoteldt1.Rows.Count - 1
Dim roomdate1, roomdate2 As Date
roomdate1 = Hoteldt1.Rows(i)("StartTime")
roomdate2 = Hoteldt1.Rows(i)("LastTime")
If (System.DateTime.Compare(Date1, roomdate1) And System.DateTime.Compare(roomdate2, Date1)) _
Or (System.DateTime.Compare(Date2, roomdate1) And System.DateTime.Compare(roomdate2, Date2)) _
Or (System.DateTime.Compare(roomdate1, Date1) And System.DateTime.Compare(Date2, roomdate2)) Then
RoomI += 1
End If
Next
Hotelstring = "select RoomNum From tbRoom where RoomID=" & RoomRadio.SelectedItem.Value
Hotelada2 = New OleDbDataAdapter(Hotelstring, conn)
HotelDataSet2 = New System.Data.DataSet
Hotelada1.Fill(HotelDataSet2, "tbRoom")
Hoteldt2 = HotelDataSet2.Tables("tbRoom")
If RoomI +CInt(OrderNum.Text) > Hoteldt2.Rows(0)("RoomNum") Then
Roomcheck = False
Exit Function
End If
Else
Roomcheck = False
Exit Function
End If
Roomcheck = True
End Function
(讀者可開啟【光碟片】|【源檔案】|【執行個體 96 】|【 96.5.txt 】檔案,直接複製)
提示:程式中採用“ DataTime ”類下的“ Compare ”方法進行時間比較,尋找出現時間重複的訂單。以下 3 種情況屬於時間重複:① 使用者選擇的入住時間小於訂單中的“ StartTime ”欄位值,選擇的離店時間大於“ LastTime ”欄位值;② 使用者選擇的入住時間大於訂單中的“ StartTime ”欄位值,選擇的離店時間小於“ LastTime ”欄位值;③ 使用者選擇的入住時間小於訂單中的“ StartTime ”欄位值,選擇的離店時間小於“ LastTime ”欄位值。尋找得出的重複數如果等於該類型客房的最大客戶數,則說明該時間段中該類型的客房已預訂滿。
( 5 )定義“ Orderinser ”過程用於添加使用者預訂客房的相關資訊到“ tbOrder ”表中,該過程的代碼如下所述。
Sub Orderinser()
Dim Hotelada2 As OleDbDataAdapter
Dim HotelDataSet2 As System.Data.DataSet
Dim Hoteldt2 As DataTable
Dim tbRow As DataRow
Dim yy As OleDbCommandBuilder
Hotelstring = "Select * From tbOrder"
Hotelada2 = New OleDbDataAdapter(Hotelstring, conn)
HotelDataSet2 = New System.Data.DataSet
yy = New OleDbCommandBuilder(Hotelada2)
Hotelada2.Fill(HotelDataSet2, "tbOrder")
Hoteldt2 = HotelDataSet2.Tables("tbOrder")
tbRow = Hoteldt2.NewRow
tbRow("UserID") = strName
tbRow("RoomID") = CInt(RoomRadio.SelectedItem.Value)
tbRow("OrderNum") = CInt(OrderNum.Text)
tbRow("StartTime") = StartTime.Text
tbRow("LastTime") = LastTime.Text
HotelDataSet2.Tables("tbOrder").Rows.Add(tbRow)
Hotelada2.Update(HotelDataSet2, "tbOrder")
End Sub
( 6 )定義過程“ ErrInfo ”用於出錯時調用該過程顯示錯誤資訊,該過程的代碼如下所述。
Sub ErrInfo(ByVal Errmess As String)
Dim strScript As String
strScript = "<script language=javascript>"
strScript += "alert('" + Errmess + "');"
strScript += "<"
strScript += "/"
strScript += "script>"
RegisterClientScriptBlock("showSaveMessage", strScript)
End Sub
(讀者可開啟【光碟片】|【源檔案】|【執行個體 96 】|【 96.7.txt 】檔案,直接複製)
( 7 )定義【現在預訂】按鈕的“ OnClick ”事件響應過程為“ Orderbt_Click ”,並將該過程綁定到【現在預訂】按鈕的“ OnClick ”事件中。“ Orderbt_Click ”過程的原始碼如下所述。
Protected Sub Orderbt_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Errstr As String
HotelConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("data/hotel.mdb")
conn = New OleDbConnection(HotelConn)
If Usercheck() = False Then
Errstr = " 請正確登入或正確輸入您的註冊資訊! "
ErrInfo(Errstr)
Exit Sub
End If
If Roomcheck() = False Then
Errstr = " 您預訂客房在您預訂時間段中已預訂滿了! "
ErrInfo(Errstr)
Exit Sub
End If
Orderinser()
End Sub
( 8 )預覽效果。儲存“ index.apsx ”,在 IE 中預覽效果,如圖 96-1 所示。
本執行個體講解了客房預訂業務中最簡單的流程:使用者註冊、登入、驗證使用者預訂客房是否預訂滿,以完成客房預訂業務。本執行個體沒有對伺服器控制項進行驗證,也沒有對註冊名惟一性的驗證進行,有興趣的讀者可以參考執行個體 76 和執行個體 77 ,添加相關功能。當提交預訂資料時,客房預訂業務會把預訂資料以電子郵件的方式發給預訂客房的使用者,本執行個體也沒有對這方面的知識進行講解,有興趣的讀者可以參考執行個體 84 中“步驟三 建立訂單郵件自動回複”裡的相關內容。當提交預訂資料時,客房預訂業務也會將資料發給酒店的總台,以便更新總台客房預計的相關資料庫,由於這方面的知識已經超出 Dreamweaver 的應用範圍,所以這裡就不再詳細介紹了。至此,本執行個體操作完畢。