【机房重构】七层登录

【前言】

        个人重构是在机房VB版之后的另一个重构项目,是.net版本的。之前一直不知道怎么下手,感觉自己对于三层和七层的理解也不是很深入,一直在各种准备,犹豫起来发现自己更不想要行动了。不行动是不可以的,最近很多琐碎事情一直耽误自己的进度,自己要是再不抓紧就太慢了,所以还是逼自己敲了起来。做起来之后发现并没有自己想的那么复杂。小伙伴们告诉我,只要把一条线敲好了,其他的也就会了。登录这条线已经敲了很久了,总是有各种错误,现在来小结一下。

解决方案:

代码部分:

UI层:

 

Imports Facade
Imports System.Net.Dns

Public Class frmLogin

    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
        Dim strResult1 As Boolean
        Dim strResult2 As Boolean
        Dim FacadeLogin As New Facade.LoginFacade  '定义一个外观对象
        Dim UserInfo As New LoginEntity.UserEntity '定义一个实体类对象

        '判断文本框
        If txtUsername.Text = "" Then
            MessageBox.Show("温馨提示,请输入用户名", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtUsername.Text = "" '设置为空
            txtUsername.Focus() '用户名获得焦点
            Exit Sub
        End If

        If txtPassword.Text = "" Then
            MessageBox.Show("温馨提示,请输入密码", "", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtPassword.Text = ""
            txtPassword.Focus()  '密码框获得焦点
            Exit Sub
        End If

        'Try
        '将文本框中的参数传递给实体
        UserInfo.UserName = txtUsername.Text.Trim() '将用户名和密码赋值给实体类对象UserInfoUserName,Password属性
        UserInfo.Password = txtPassword.Text.Trim() '从而UserInfo获得了U层的参数,通过外观层,传递到B层进行判断
        strResult1 = FacadeLogin.CheckUser(UserInfo) '将U层的用户名通过外观层传到B层,得到外观的返回值
        strResult2 = FacadeLogin.CheckPwd(UserInfo)

        If strResult1 = False Or strResult2 = False Then '通过返回值来判断用户是否存在
            MsgBox("用户名或者密码不正确!")
            txtUsername.Text = ""
            txtPassword.Text = ""
            txtUsername.Focus()
        Else
            MsgBox("登录成功!")
        End If

        'Catch ex As Exception
        '    MsgBox("用户不存在或者密码不正确!")
        '    txtUsername.Text = ""
        '    txtPassword.Text = ""
        '    txtUsername.Focus()
        'End Try
    End Sub

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        Me.Close()  '关闭窗体
    End Sub

    Private Sub frmLogin_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '获取计算机名称
        Dim Address() As System.Net.IPAddress  'class system.net.IPAddress提供网际协议(IP)地址
        'class system.net.dns 提供简单的域名解析功能;
        'GetHostName()获取本地主机名
        'AddressList获取或设置与主机关联的IP列表
        Address = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList
        txtComputer.Text = System.Net.Dns.GetHostName().ToString()
    End Sub
End Class

配置文件:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <appSettings>
      <add key ="ConnStr" value="Server=(local);DataBase=Login;uid=sa;Pwd=123 " />
     </appSettings>
</configuration>

 

Facade层:

Imports LoginEntity
Imports LoginBLL
Imports System.Reflection    'reflection 反射

Public Class LoginFacade

    Public Function CheckUser(ByVal UserInfo As LoginEntity.UserEntity) As Boolean
        Dim isUserExists As New LoginBLL.UserBLL() '实例化B层UserBll类对象
        Dim flag As Boolean
        flag = isUserExists.IsUserExists(UserInfo) '判断是否存在该用户
        Return flag
    End Function

    Public Function CheckPwd(ByVal UserInfo As LoginEntity.UserEntity) As Boolean
        Dim isPwd As New LoginBLL.UserBLL() '实例化UserBLL对象
        Dim flag1 As Boolean
        flag1 = isPwd.IsPwdRight(UserInfo)  '判断userinfo对象的密码是否存在
        Return flag1
    End Function
End Class

BLL层:

 

Public Class UserBLL
    '检查用户是否存在
    Public Function IsUserExists(ByVal userInfo As LoginEntity.UserEntity) As Boolean
        Dim Iuser As LoginIDAL.IuserInfoDAL
        '调用创建用户的工厂方法
        Iuser = Factory.LoginFactory.CreateUserInfo
        Dim table As DataTable
        Dim flag As Boolean
        table = Iuser.selectUser(userInfo)

        '由于在sqlhelper中以表格的形式存在(adataset.Tables(0)),且开头第一列表示为0,所以Item(0)表示为用户名
        If table.Rows.count = 0 Then   '第一行第一列
            flag = False
        Else
            flag = True
        End If
        Return flag
    End Function

    '查看密码是否正确
    Public Function IsPwdRight(ByVal UserInfo As LoginEntity.UserEntity) As Boolean
        Dim Iuser As LoginIDAL.IuserInfoDAL
        Dim table As DataTable  '中间变量用来存储数据
        Dim flag1 As Boolean
        Iuser = Factory.LoginFactory.CreateUserInfo   '调用工厂方法Creatuserinfo来创建iuser
        table = Iuser.selectUser(UserInfo)  '调用接口的方法selectUser
        If table.Rows.count = 0 Then
            flag1 = False
        Else
            flag1 = True
        End If
        Return flag1
    End Function
End Class

Factory层:

 

Imports System.Configuration  '添加对配置文件的引用
Imports System.Reflection '添加对反射的引用
Imports LoginIDAL
Imports LoginDAL

Public Class LoginFactory
    '读配置文件,D层的每个类在配置文件里面对应一个key
    '读下面这句是把key变成变量,然后在下面这个方法中用这个变量就可以应用D层里面的这个类了
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("DBString")  '读取配置文件里的 DBString
    ''' <summary>
    ''' 实例化LoginDAL中users表中一个类
    ''' </summary>
    ''' <remarks></remarks>
    
    Public Shared Function CreateUserInfo() As LoginIDAL.IuserInfoDAL
        'CType是一个内联函数,将前面的部分转换为后半部分
        'LoginDAL为程序集名称
        'LoginDAL为命名空间名称
        'IuserInfoDAL为要实例化的类名
        'CreatUserInfo 创建实例
        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & "UserDAL"), IuserInfoDAL)
    End Function
End Class

IDAL层:

Imports LoginEntity

Public Interface IuserInfoDAL
    'UserInfo为用户的实体,是由实体类实例化而来的
    '即所谓的传实体
    '此接口定义了一个方法,是用来检测用户是否存在
    Function selectUser(ByVal UserInfo As LoginEntity.UserEntity) As DataTable
End Interface

DAL层:

 

Imports System.Data.SqlClient
'system.data.sqlClient命名空间是SQL SERVER的.netframework数据提供的程序  
'sql server的.net framework数据提供程序描述了一个类集合,这个类用于访问托管中的sql server数据库;  
Imports LoginEntity
Imports LoginIDAL
Imports SQLHelper

Public Class UserDAL : Implements LoginIDAL.IuserInfoDAL '实现接口中的方法;  
    '声明并实例化sqlhelper类  
    Private SqlHelper As SQLHelper.sqlhelper = New SQLHelper.sqlhelper
    Public Function selectUser(UserInfo As LoginEntity.UserEntity) As DataTable Implements IuserInfoDAL.selectUser
        Dim Sql As String
        Dim table As DataTable '中间变量用于存储从数据库中查找信息  
        Dim sqlConnectStr As String = "server =(local);database=Login;uid=sa;pwd=123"
        '声明并实例化参数数组  
        Dim sqlParams As SqlParameter() = {New SqlParameter("@UserName", UserInfo.UserName), New SqlParameter("@Password", UserInfo.Password)}
        Sql = "select * from UserInfo where UserName=@UserName and Password=@Password" 'SQL是查询到的信息;  
        '下句为调用SqlHelper类中的GetDataTable()方法来执行查询,并获取返回值;  
        table = SqlHelper.GetDataTable(Sql, CommandType.Text, sqlParams)
        Return table
    End Function
End Class

Entity层:

 

Public Class UserEntity

    '区别变量的名字,变量的名字比数据库多“_”  
    Private _UserName As String
    Private _Password As String
    Private _UserID As String
    Private _level As String
    Private _Holder As String

    '以下为可读写属性,名字和数据库中的一样
    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

SQLHelper:

 

Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Data
Imports System.Reflection

Public Class sqlhelper
    'configurationManager表示读配置文件;  
    'appsetting获取配置文件的数据;  
    Public Shared ConnectionString As String = ConfigurationManager.AppSettings("ConnStr")
    'sqlDataAdapter表示用于填充Data.Dataset和更新SQL SERVER数据库的一组数组命令和一个数据库连接;  
    Private Shared Property adaptor As SqlDataAdapter
    '''<summary>  
    '''执行带参数的查询操作  
    '''</summary>  
    ''' <param name="cmdTxt">参数cmdTxt为所要执行的sql语句</param>  
    ''' <param name="cmdType">查询时的查询方式</param>  
    ''' <param name="paras">查询时的命令参数paras</param>  
    ''' <returns>查询后以表示的方式返回,如下面adataset.Tables(0)</returns>  
    ''' <remarks></remarks>  
    Public Shared Function GetDataTable(ByVal cmdTxt As String, ByVal cmdType As CommandType, ByVal paras As SqlParameter()) As DataTable
        Dim conn As SqlConnection = New SqlConnection(ConnectionString) '建立数据库连接;  
        Dim cmd As SqlCommand '定义命令变量;  
        Dim adaptor As SqlDataAdapter '定义数据库适配器;  
        Dim adataset As DataSet '定义并实例化数据库缓冲区对象,即从数据库传入对象;  
        cmd = New SqlCommand(cmdTxt, conn) '在Conn上实例化命令变量,并执行cmdType;  
        cmd.CommandType = cmdType '执行命令的类型  
        cmd.Parameters.AddRange(paras) '命令执行时的参数  
        adaptor = New SqlDataAdapter(cmd) '将结果绑定到数据库适配器变量adaptor上面;  
        adataset = New DataSet 'dataset表示数据内存中缓存;  
        Try
            '如果数据库连接状态为关闭则将其打开;  
            If conn.State = ConnectionState.Closed Then
                conn.Open()
            End If
            adaptor.Fill(adataset) '向adaptor对象中填充要查询的数据;  
        Catch ex As Exception
            '错误处理程序,出错则提示  
            MsgBox(ex.Message, , "数据库操作!")
        Finally
            '如果连接状态为打开,则将其关闭,释放内存;  
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try
        '以表格的形式返回结果  
        Return adataset.Tables(0)
    End Function
    Function GetDataTable() As DataTable
        Throw New NotImplementedException
    End Function
End Class

 

【小结】

       七层登录就这么敲完了,重要的是理清其中的逻辑关系。一条线走通了,其他的也就仿照着能够敲出来了。时间管理真的很重要,坚持每天做一点,每天微小的进步日积月累就会有巨大的成就!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值