• 房费制——登录优化


         《客房收费系统个人版》基本完成,矿U层的代码是非常非常混乱。基本上D层有几个函数,B层就相应有几个函数,U层使用相应B层中的每个函数。比方说在登录中,U层首次要使用一个函数检查username和用户password是否正确,然后再使用“加入用户上机记录”的函数。以下是登录的时序图:

            登录业务比較简单,可是对于复杂的上机过程呢?U层要检查卡是否注冊。剩余金额是否充足,卡的状态是否在使用中。该卡是否如今不在线,通过这一系列检验后,还要查询学生表显示学生信息等等。

    这样就造成U层有好多函数,和B层的耦合度太大。如今我们来回想一下三层中各层的功能:

     表现层(UI):採集用户的输入信息和操作,向用户展现特定业务数据。通俗讲就是用户界面,即用户在使用一个系统的时候他的所见所得。

     业务逻辑层(BLL):针对详细问题的操作。也能够说是对数据层的操作。对数据业务逻辑处理。主要有三种方式:从UI中获取用户指令和数据,运行业务逻辑;从DAL中获取数据,以供UI显示;从UI中获取用户指令和数据,通过DAL写入数据源。

     数据訪问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、改动、查找等。

        

            

        在师傅的指点下,进行了改动:

    U层:

    '登录
        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层根本不知道详细的验证用户细节。这样就解耦了,各司其职。

           

           小结:从去年的第一次机房收费系统。到如今的个人版重构。以及接下来的合作重构,每一步都是跨越。最初我们是纯面向过程的,如今学习了三层架构,使用了设计模式,但距离面向对象仍然非常遥远。我们正在一步一步向前走,这个过程非常重要。好比是唐僧西天取经,假设让孙悟空翻个跟头就能取到经。那就不会有经典的《西游记》了。


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    DOM练习2动态增删表格行
    JS
    JS动态获取当前时间,并写到指定的区域
    DOM练习3选项批量移动
    JS练习显示隐藏图像
    修改MyEclipse默认工作路径
    Aptana 安装与配置
    DOM入门基本概念
    SecureCRT终端显示gcc编译错误提示乱码问题
    使用静态成员函数的一个错误。
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4858836.html
Copyright © 2020-2023  润新知