房費制——登陸優化

     《客房收費系統我的版》基本完成,礦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有誤。

", vbExclamation, "系統提示") txtUserID.Focus() Exit Sub End If Catch ex As Exception MsgBox("錯誤!", vbExclamation, "系統提示") End Try End Sub設計

B層:

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

D層:

  '查找用戶的方法
    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

       

       小結:從去年的第一次機房收費系統。到現在的我的版重構。以及接下來的合做重構,每一步都是跨越。最初咱們是純面向過程的,現在學習了三層架構,使用了設計模式,但距離面向對象仍然很是遙遠。咱們正在一步一步向前走,這個過程很是重要。比如是唐僧西天取經,假設讓孫悟空翻個跟頭就能取到經。那就不會有經典的《西遊記》了。

相關文章
相關標籤/搜索