【浅谈三层】——三层登陆

    之前学习对三层有了一个初步的了解,后面就需要实践来完成这件事情了,关于三层登陆主要是敲了两版,一版是根据视频中的讲解来完成的C#,另一版当然就是照着葫芦画瓢了,完成的Vb.net版。虽然是两种语言,但是其中的内容都是一致的,一个原则思路清晰,其余的东西都是so easy!

    三层主要分为表示层,业务逻辑层,以及数据访问层。这个的目的主要是在于解耦合。还是先看看我的解决方案吧。

                【浅谈三层】——三层登陆_第1张图片


    记得在第一版的机房收费系统中,每一个窗体都需要涉及到大量的数据,一个数据参数的遗漏都是一次艰难的挑错之旅。而利用三层实现登陆的最大好处就是用实体对其进行封装。这样每一次的参数传递都是在这个基础上实现的。下面请看

实体层Modal

'**********************************************
' 文  件  名:UserInfoModal
' 命名空间:Login.Modal
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/11/23 16:24:18
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class UserInfoModal
    Private _UserName As String
    Private _UserID As String
    Private _Password As String
    Public Property UserID() As String
        Get
            Return _UserID
        End Get
        Set(value As String)
            _UserID = value
        End Set
    End Property
    Public Property UserName() As String
        Get
            Return _UserName
        End Get
        Set(value As String)
            _UserName = value
        End Set
    End Property
    Public Property Password() As String
        Get
            Return _Password
        End Get
        Set(value As String)
            _Password = value
        End Set
    End Property
End Class

表示层U层

Public Class frmLogin

    Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
        Try
            Dim manager As New Login.BLL.Loginmanager
            Dim User As New Login.Modal.UserInfoModal
            User.UserName = txtUserName.Text.Trim
            User.Password = txtPassword.Text.Trim

            manager.UserLogin(User)
            'MessageBox.Show("登陆成功" + User.UserName)
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        End Try

    End Sub
End Class

U层比较简单,它只是复杂和用户界面的交互,读取基本的数据然后传到B层。

业务逻辑层

'**********************************************
' 文  件  名:Loginmanager
' 命名空间:Login.BLL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/11/23 16:51:32
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Public Class Loginmanager
    Public Function UserLogin(ByVal user As Login.Modal.UserInfoModal) As Login.Modal.UserInfoModal
        Dim UserDao As New Login.DAL.UserInfo
        Dim buser As New Login.Modal.UserInfoModal
        buser = UserDao.SelectUser(user)

        If IsNothing(buser) Then
            Throw New Exception("登陆失败,请检查登陆用户名")
        Else
            If IsNothing(buser.Password) Then
                Throw New Exception("登陆失败,请检查密码")
            Else
                MsgBox("恭喜您,登陆成功")
                Return buser                    '返回mUser1实体
            End If
        End If
    End Function
End Class

B层不涉及到数据的操作,只是对U层传进来的内容通过selectUser传给D层进行数据的判断。

数据访问层

SQLUntil

'**********************************************
' 文  件  名:sqlUntil
' 命名空间:LoginDAL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/11/23 16:18:37
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Data.SqlClient
Public Class sqlUntil
    Public Shared Function Connstring() As SqlConnection
        Dim cnStr As String

        cnStr = "Server=(local); Database=JF; User ID=sa;Password =1"
        Dim cn As SqlConnection
        cn = New SqlConnection(cnStr)
        Return cn
    End Function
End Class

UserInfo

'**********************************************
' 文  件  名:UserInfo
' 命名空间:Login.DAL
' 内       容:
' 功       能:
' 文件关系:
' 作       者:贾文静
' 小       组:XX
' 生成日期:2015/11/23 16:35:36
' 版  本  号:V1.0.0.0
' 修改日志:
' 版权说明:
'**********************************************
Imports System.Data.SqlClient
Public Class UserInfo
    Public Function SelectUser(ByVal user As Login.Modal.UserInfoModal) As Login.Modal.UserInfoModal
        Dim cn As SqlConnection = sqlUntil.Connstring
        Dim sql As String
        sql = "SELECT UserName,Password FROM User_Info WHERE UserName=@UserName AND Password=@Password"
        Dim cmd As SqlCommand = New SqlCommand(sql, cn)

        cmd.Parameters.Add(New SqlParameter("@UserName", user.UserName))
        cmd.Parameters.Add(New SqlParameter("@Password", user.Password))

        cn.Open()
        Dim reader As SqlDataReader
        reader = cmd.ExecuteReader
        Dim bUser As New Login.Modal.UserInfoModal
        While (reader.Read())
            bUser.UserName = reader.GetString(1)
            bUser.Password = reader.GetString(2)
        End While
        Return bUser
    End Function
End Class

通过B层传进来的实体,连接数据库,然后调用数据库中的数据,进行判定,将得出的实体传回B层和U层传进的实体进行对比,将结果返回U层。登陆整个过程结束!

【总结】

    有时候话说千百遍不如实现一次,通过对代码的调试,更能体会其中的数据传递过程。用它对比第一版的机房收费系统,会发现层次突然就明晰了。第一次的VB版所有的数据连接都在模块中。而这次看似麻烦的分层其实就是一个简化的过程,思路清晰了,一切都变得OK!

      菜鸟一只,如有不正确之处,还请各位大神斧正,不胜感激!


你可能感兴趣的:(【浅谈三层】——三层登陆)