《客房收費系統我的版》基本完成,礦U層的代碼是很是很是混亂。基本上D層有幾個函數,B層就相應有幾個函數,U層使用相應B層中的每一個函數。比方說在登陸中,U層首次要使用一個函數檢查username和用戶password是否正確,而後再使用「加入用戶上機記錄」的函數。如下是登陸的時序圖:sql
登陸業務比較簡單,但是對於複雜的上機過程呢?U層要檢查卡是否註冊。剩餘金額是否充足,卡的狀態是否在使用中。該卡是否現在不在線,經過這一系列檢驗後,還要查詢學生表顯示學生信息等等。數據庫
這樣就形成U層有好多函數,和B層的耦合度太大。現在咱們來回想一下三層中各層的功能:設計模式
表現層(UI):採集用戶的輸入信息和操做,向用戶展示特定業務數據。通俗講就是用戶界面,即用戶在使用一個系統的時候他的所見所得。架構
業務邏輯層(BLL):針對詳細問題的操做。也可以說是對數據層的操做。對數據業務邏輯處理。主要有三種方式:從UI中獲取用戶指令和數據,運行業務邏輯;從DAL中獲取數據,以供UI顯示;從UI中獲取用戶指令和數據,經過DAL寫入數據源。ide
數據訪問層(DAL):該層所作事務直接操做數據庫,針對數據的增添、刪除、改動、查找等。函數
在師傅的指點下,進行了改動:學習
U層:spa
'登陸 Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click '查空 If PublicFunction.IsEmptyText(Me) = True Then Exit Sub End If '實例化實體User,引用B層 Dim euser As New Entity.User Dim euserRecord As New Entity.UserRecord Dim blogin As New BLL.LoginBLL Try '將用戶輸入的信息傳給實體 euser.ProuserID = txtUserID.Text.Trim euser.ProuserPwd = txtUserPwd.Text '用戶驗證後反饋信息 If blogin.Check(euser, euserRecord) Then '登陸成功 ''UserID和UserLevel爲全局變量,其它功能要用到 UserID = euser.ProuserID.Trim '去空格 UserLevel = euser.ProuserLevel.Trim '去空格 '主窗口顯示 Me.Hide() frmMain.Show() Else MsgBox("登陸失敗!username或password有誤。B層:", vbExclamation, "系統提示") txtUserID.Focus() Exit Sub End If Catch ex As Exception MsgBox("錯誤!", vbExclamation, "系統提示") End Try End Sub設計
Public Function Check(ByVal euser As Entity.User, ByVal euserRecord As Entity.UserRecord) As Boolean Dim dt As DataTable dt = iuser.QueryUser(euser) Try If dt.Rows.Count = 0 Then Return False Else 'username和password輸入正確 euser.ProuserID = dt.Rows(0).Item(0) '用戶ID euser.ProuserLevel = dt.Rows(0).Item(2) '用戶級別 '輸入用戶上機記錄信息 euserRecord.ProuserID = euser.ProuserID euserRecord.ProuserLevel = euser.ProuserLevel euserRecord.ProloginTime = Now euserRecord.PrologoutTime = Now euserRecord.ProisOnline = 1 '1表示在線。0表示不在線 euserRecord.Procomputer = My.Computer.Name '得到當前電腦的username '加入用戶上機記錄 Dim result As Integer result = iuser.AddUserRecord(euserRecord) If result <> 0 Then '加入用戶記錄成功 Return True End If End If Catch ex As Exception Throw New Exception End Try End Function
'查找用戶的方法 Public Function QueryUser(euser As Entity.User) As DataTable Implements IUser.QueryUser Try Dim strSQL As String = "select * from T_User where userID=@userID and userPwd=@userPwd " Dim params() As SqlParameter = {New SqlParameter("@userID", euser.ProuserID), New SqlParameter("@userPwd", euser.ProuserPwd)} Dim helper As New SqlHelper.sqlHelper Dim table = helper.GetDataTable(strSQL, CommandType.Text, params) Return table Catch ex As Exception Throw New Exception End Try End Function '用戶登陸成功加入記錄到UserRecord Public Function AddUserRecord(euserRecord As Entity.UserRecord) As Integer Implements IUser.AddUserRecord '每一個字段都填寫時,可省略前面括號裏的內容 'Dim strSQL As String = "insert into T_UserRecord values(@userID,@level,@loginTime,@logoutTime,@computer,@isOnline)" Try Dim strSQL As String = "insert into T_UserRecord (userID,userLevel,loginTime,logoutTime,computer,isOnline)values(@userID,@level,@loginTime,@logoutTime,@computer,@isOnline)" Dim params() As SqlParameter = {New SqlParameter("@userID", euserRecord.ProuserID), New SqlParameter("@level", euserRecord.ProuserLevel), New SqlParameter("@loginTime", euserRecord.ProloginTime), New SqlParameter("@logoutTime", euserRecord.PrologoutTime), New SqlParameter("@computer", euserRecord.Procomputer), New SqlParameter("@isOnline", euserRecord.ProisOnline)} Dim helper As New SqlHelper.sqlHelper Dim intResult = helper.ExecuteNoQuery(strSQL, CommandType.Text, params) Return intResult Catch ex As Exception Throw New Exception End Try End Function改動後的登陸時序圖:
兩幅登陸時序圖造成鮮明的對照,這樣用戶點擊「登陸」button後,U層負責採集用戶輸入的username和password,而後僅僅需調用一個Check()函數進行驗證。B層處理業務邏輯。先推斷用戶信息,若輸入正確則進行下一步加入用戶上機記錄。D層和數據庫打交道。進行增刪改查。U層根本不知道詳細的驗證用戶細節。這樣就解耦了,各司其職。code
小結:從去年的第一次機房收費系統。到現在的我的版重構。以及接下來的合做重構,每一步都是跨越。最初咱們是純面向過程的,現在學習了三層架構,使用了設計模式,但距離面向對象仍然很是遙遠。咱們正在一步一步向前走,這個過程很是重要。比如是唐僧西天取經,假設讓孫悟空翻個跟頭就能取到經。那就不會有經典的《西遊記》了。