zoukankan      html  css  js  c++  java
  • 三层——vb.net版

             经过不懈的努力,我的vb.net 版的三层登陆终于实现了。下面将我的成果向大家展示一下。

             原则

             vb.net的三层登陆跟C#的三层登陆的思想是一样的都是将系统分层——U层只负责与用户打交道,属于系统中的外交官;而D层只负责与数据库打交道,数据系统中的仓库管理员;而B层只负责进行逻辑运算,属于系统中的决策者。它们通过一个实体层来进行数据的传输。

             实体层

             首先我们说一下实体层,实体层就是定义一些个共有的变量,以便于各个层在传输数据时使用。
             
    '定义一个共有的类,用于传递用户的基本信息
    Public Class User
        '这里分别定义user的三个属性,Id、Name和Password
        Private User_ID As String
        Private User_Name As String
        Private User_Password As String
        '传入和传出用户的属性值
        Public Property Userid() As String
            Get
                Return User_ID
    
            End Get
            Set(ByVal value As String)
                User_ID = value
    
            End Set
        End Property
        Public Property UserName() As String
            Get
                Return User_Name
            End Get
            Set(ByVal value As String)
                User_Name = value
            End Set
        End Property
        Public Property UserPassword() As String
            Get
                Return User_Password
            End Get
            Set(value As String)
                User_Password = value
            End Set
        End Property
    End Class


              DAL层

             首先还是说D层,D层是被B层引用的,它主要负责与数据库打交道,系统想要实现的与数据库的交互都有D层来实现。没有D层的话,我们的整个系统就找不到我们的仓库所在,就像打仗没有了粮草一样。失去D层我们的系统就失去了与数据库的所有交互。
             下面我们来展示下我们D层的代码
             首先,是一个链接数据库的类,负责存储链接的字符串,其作用是记录数据库这个仓库的位置,有了它,系统才可以定位到相应的数据库
        '用于存放链接数据库的字符串
        Public Shared Function connstring() As String
            connstring = "server=你数据库的名称;Database=login;Uid=sa;Pwd=你数据库的密码"
        End Function
             在知道了数据库这个大仓库的位置后,我们对仓库要进行什么操作呢?比如说,我们可能是要看看仓库中都有什么,进行一下查询,也有可能是把仓库中的某条数据复制出来,还有可能是将仓库中的某条数据删除掉。这些都是有可能的。那么我们怎么样才能明确的把我们的命令传到仓库,并且得到我们想要的东西呢?
             下面的 userlogin将告诉我们答案:
    '引用有关于数据库连接的dll
    Imports System.Data.SqlClient
    Imports System.Data
    Public Class UserLoginDAL
        '用一个函数调用User将得到的数据传入数据库中,通过数据取出相应的数据
        Function UserSelect(ByVal User As Entity.User) As Entity.User
            '定义一个链接数据库的对象
            Dim cnn As SqlConnection
            '定义一个输入命令的对象
            Dim comd As SqlCommand
            comd = New SqlCommand
            '将数据库的链接路径赋值给数据链接对象
            cnn = New SqlConnection(DAL.Dbconnstring.connstring())
            '为comd绑定链接数据库的路径
            comd.Connection = cnn
            '将实体中的数据传入命令对象,用于取得相应的数据
            comd.CommandText = "select * from Users where password= 'a'"
            comd.Parameters.Add(New SqlParameter("@UserName", User.UserName))
            comd.Parameters.Add(New SqlParameter("@UserPassword", User.UserPassword))
            '选择命令输入类型,这里选择的是输入文本格式的数据
            comd.CommandType = CommandType.Text
            '打开数据库
            cnn.Open()
    
            Dim mrc As SqlClient.SqlDataReader
            mrc = comd.ExecuteReader
    
    
            Dim SelectUser As Entity.User
            SelectUser = New Entity.User
            '将取出的临时表中的数据赋值给selectuser对象,这个赋值本来应该由B层来完成,这里为了便于理解就放在这里了
            While (mrc.Read())
                SelectUser.Userid = mrc.GetString(mrc.GetOrdinal("ID"))
                SelectUser.UserName = mrc.GetString(mrc.GetOrdinal("UserName"))
                SelectUser.UserPassword = mrc.GetString(mrc.GetOrdinal("Password"))
            End While
    
            cnn.Close()
            Return SelectUser
    
        End Function
    End Class
    

             BLL层

             说完了我们的仓库管理员以后,我们来说下我们的逻辑中枢——B层吧。B层负责的事情其实很少,就是逻辑判断。类似于裁判员。这个数据对不对,合不合法都由B层来进行判断。比如说,用户输入一个数据:我是老王,我要从数据库中删除一条数据。这时,U层将数据传给B层,那么,我们的B层就要开始判断了:
                      首先,老王是谁?他是我们的合法用户么?他拥有删除该条数据的权限吗?B层的判断肯定不能是没理由的胡乱判断的,它要先跟D层说;“把老王的数据给我拿过来,他的用户名是老王,密码是*******”然后D曾通过查询将老王的数据反馈给D层(这里的反馈就是通过实体层定义的类来进行的)。D层的反馈可能是这样的:老王,男,25岁,有删除数据库记录的权限、、、、那么,B层就会对D层传输一个删除老王想要删除的数据的命令,然后D层得到命令后执行相应的操作。于是用户的操作就实现了。然后,B层在给U层一个反馈:删除已成功,请告诉老王该操作以执行。
                      也有可能是D层告诉B层:老王,查无此人!那么B曾就要告诉U层:通知该用户,操作失败,因为数据库里没有老王这个人。
             我们这里的B层得判断比较少,所以比较容易实现。下面为大家展示一下:
             
    Public Class LoginBLL
        Public Function Usertest(ByVal user As Entity.User) As Entity.User
            '定义一个usertest,接受从U层和D层传过来的数据
            Dim TestUser As Entity.User
            '将D层的类实例化
            Dim Usedal As DAL.UserLoginDAL
            Usedal = New DAL.UserLoginDAL
            TestUser = New Entity.User
            '将从U层传来的数据传入D层,然后通过D层从数据库中取得相应的数据
            TestUser.Userid = user.Userid
            TestUser.UserName = user.UserName
            TestUser.UserPassword = user.UserPassword
            TestUser = Usedal.UserSelect(TestUser)
            '对从D层取出来的数据进行判断并将判断结果反馈给U层
    
            If TestUser Is Nothing Then
                MsgBox("登陆失败")
                TestUser = Nothing
    
    
            End If
    
            Return TestUser
    
        End Function
    End Class

             U层

             U层是直接给用户打交道的,它是系统中的外交官,如果它不能正确的表达系统的意思,那么用户就不会使用我们的系统,或者说在使用的时候就会感觉很累。下面通过一张图来向大家展示:
             
             上图是一个登陆界面,在鼠标放在退出和登陆按钮上的时候,会弹出一些改操作的功能介绍。整体看起来简洁明了。这就是一个不错的Ui设计。
             
             上图虽然也能实现登陆的功能,可是,界面混乱,没有相应的提示,用户就不知道你这个系统是干什么的。这是一个有待提高的UI界面。
             下面展示下我们的登陆的UI界面的部分代码:
             
        Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
            '定义一个loginuser用于存储用户输入的信息
            Dim LoginUser As New Entity.User
            '调用Bll层的类进行逻辑判断,这里将B层的类先实例化一下,不然没法应用
            Dim useBll As New BLL.LoginBLL
            '将用户输入的数据存入loginuser中
            LoginUser.UserName = txtUserName.Text
            LoginUser.UserPassword = txtPassword.Text
            '进行逻辑判断
            LoginUser = useBll.Usertest(LoginUser)
            '根据判断的结果来给用户一个反馈,是否验证成功,本来应该传回一个true 或者是fals的值的,考虑到理解的困难程度,这里就不写成那样了
            If LoginUser Is Nothing Then
                End
            Else
                MsgBox("登陆成功!")
            End If
    
        End Sub

             这里是我的vb.net 版的登陆三层的实现,下一个目标,向着七层进军、、、、


  • 相关阅读:
    python中break、continue 、exit() 、pass终止循环的区别
    pandas 数据处理
    分布式爬虫
    crawlSpider全站数据爬取
    scrapy 中间件
    scrapy框架的日志等级和请求传参
    scrapy 递归解析和post请求
    scrapy管道持久化存储
    scrapy框架简介和基础应用
    高性能的异步爬虫
  • 原文地址:https://www.cnblogs.com/liyasong/p/6387877.html
Copyright © 2011-2022 走看看