VB.NET 三层登录系统实战:从设计到部署全流程详解

前言:

什么是三层

三层就是把各个功能模块划分为表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL)三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(Model)作为数据传递的载体,不同的对象模型的实体类一般对应于数据库的不同表,实体类的属性与数据库表的字段名一致。

简单的点来说:就是高内聚,底耦合的思想,不会牵一发而动全身。

为什么要用到三层:

 生活中饭店的例子来举例,大家可能会更理解一些。

:服务员只管接待客人

:厨师只管烹炒客人要的菜系

:采购员只管按照客人的需求来采购食材

  各司其职,共同协作为客人提供美食

问题:

为什么要需要这三种角色,为什么不合在一起,每个角色的功能的是分离的

举例:

服务员离职、请假→其他服务员代替

厨师离职→其他厨师代替

采购员离职→其他采购员代替

为什么能够替代,每个人的功能是一致,角色不行了替代就可以,如果合在一起就不好找人了。

饭店→软件

理解:

   三层从生活到软件,不会因为谁的不在或离职,从而工作停掉,三层在软件中易是如此,每个层都有特定的职责和功能,不会因为需求改动从而需要修改整个系统,只需改其中一层的的代码,通过这种方式实现代码的模块化和维护性这就是所谓的三层

过程:

1.三层包图:

  包图用于描述逻辑架构—层、子系统、包等,所以拿包图在合适不过了。

2.数据库

3.三层项目

4.用户界面

5.添加引用

代码实现:

Entity层

Public Class eUserLogin
    Private strUserNo As String '定义一个私有字段,该字段的类型为String
    Private strPassword As String '
    Public Property Password() As String
        Get '获取属性值
            Return strPassword '返回strPassword的字符串变量的值
        End Get '结束方法
        Set(value As String) '接收一个名为"value"的字符串类型的参数
            strPassword = value '传递给StrPasswrod的字符串变量
        End Set '结束方法
    End Property
 
    Public Property UserNo() As String
        Get
            Return strUserNo
        End Get
        Set(value As String)
            strUserNo = value
        End Set
    End Property
End Class
 

BLL层

Imports System.Xml
Imports Login.DAL
 
Public Class LoginBLL
    'UserInfo用来承载登录时输入的用户名和密码,全局实体
    Public Function login(ByVal UserInfo As Entity.eUserLogin) As Entity.eUserLogin
        '实例化D层
        Dim dLogin As New Login.DAL.UserInfoDAL
        '定义B层的返回实体
        Dim bUserInfo As New Entity.eUserLogin
        '调用D层SelectUser方法
        bUserInfo = dLogin.SelectUser(UserInfo) '执行一个名为SelectUser的方法,并将其返回值赋给"bUserInfo"的布尔型变量
 
        If (bUserInfo.UserNo Is Nothing Or bUserInfo.Password Is Nothing) Then '判断bUserInfo.UserNo和bUserInfo.Password是否为空
            Throw New Exception("用户名或密码错误,请查看") 'True返回消息
        Else
            MsgBox("登录成功,请稍后", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
            Return bUserInfo 'False 返回消息  
        End If
    End Function
End Class

DAL层

'单建了一类来放数据库连接
Imports System.Data.SqlClient
 
Public Class LinkeDAL
    Public Shared Function connstring() As String
 
        '连接数据库字符串
        connstring = "Server= 192.168.96.71;Database=cybercafe;User ID=sa;Password=123456;"
    End Function
End Class
 
 
Imports System.Data.SqlClient
Imports Login
Public Class UserInfoDAL
    Public Function SelectUser(UserInfo As Entity.eUserLogin) As Entity.eUserLogin
        Dim conn As New SqlConnection(LinkeDAL.connstring)
        '打开数据库
        conn.Open()
        '创建一个名为"reader"的SqlDataReader对象
        '(SqlDataReader)是一种.NET Framework中的数据读取器,用于从Microsoft SQL Server数据库中读取数据 
        Dim reader As SqlDataReader
        'D层实例化执行查询后返回实体
        Dim duserInfo As New Entity.eUserLogin
        '查询语句
        Dim sql As String = "Select * from User_Info where UserNo=@UserNo and Password=@Password"
        '创建一个名为"cmd"的SqlCommand对象,并将其初始化指定的SQL语句和数据库连接对象。 
        'SqlCommand是一个.NET Framework中的类,用于执行SQL语句并返回查询结果
        Dim cmd As New SqlCommand(sql, conn)
        '向SQL语句添加一个命名参数,就将"@UserNo"的参数添加一个值,这个值来自一个名为UserInfo的对象 
        '@符作为参数的前缀,可以让SQL语句更容易区分参数和普通参数的文本。同时,@符号可以让SQL语句更易于阅读和理解
        cmd.Parameters.Add(New SqlParameter("@UserNo", UserInfo.UserNo))
        cmd.Parameters.Add(New SqlParameter("@Password", UserInfo.Password))
        '执行查询语句并将结果以DataReader对象的形式返回,以供后续的数据处理和操作
        reader = cmd.ExecuteReader()
        '循环语句它会在SqlDataReader对象中有下一行数据时执行,在每次循环中,我们将使用SqlDataReader对象的一些方法(如GetString、GetInt32等)来获取当前行的数据,并将其存储在相应的变量中。
        While (reader.Read())
            '循环来逐行查询结果。每次循环中,我们使用read.GetString()来获取查询结果中第一列的字符串,并赋值给duseInfo对象的UserNo属性
            duserInfo.UserNo = reader.GetString(0)
            duserInfo.Password = reader.GetString(1)
        End While
        Return duserInfo
        conn.Close() '关闭数据库 
    End Function
End Class

UI层

Imports System.Xml
 
Public Class Form1
    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click '单击事件
 
        Try
            '实例化传实体的对象
            Dim UserInfo As New Entity.eUserLogin
 
            '将用户名和密码放入实体,文本框中的字符串去除空格并赋给实体对象UserInfo,使实体对象能够带上参数
            UserInfo.UserNo = txtUserName.Text.Trim()
            UserInfo.Password = txtPassWord.Text.Trim()
            '判断账号否为空
            If txtUserName.Text = "" Then
                MsgBox("用户名不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
                Return
            End If
            '判断密码是否为空
            If txtPassWord.Text = "" Then
                MsgBox("密码不能为空!", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "提示")
                Return
            End If
            '定义一个最终的返回体,returnUserInfo,承接经过D层查询,B层判断的登录信息
            '实例化BLL层的对象
            Dim bLogin As New LoginBLL.LoginBLL
            '调用B层的方法login
            bLogin.login(UserInfo)
        Catch ex As Exception '处理异常的代码
            MessageBox.Show(ex.Message.ToString) '返回一个字符串,表示异常的详细信息
        End Try '方法结束
    End Sub
    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        End
    End Sub
End Class
 

总结:

对于三层的理解还不是很透彻,还是需要多实践,理论明白了并不代表真正意义上的明白。

发表评论