【机房重构】七层登录

来源:互联网 发布:美工是什么职位类别 编辑:程序博客网 时间:2024/05/17 02:39

【前言】

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

解决方案:


代码部分:

UI层:

Imports FacadeImports System.Net.DnsPublic 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 SubEnd 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 LoginEntityImports LoginBLLImports 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 FunctionEnd 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 FunctionEnd Class
Factory层:

Imports System.Configuration  '添加对配置文件的引用Imports System.Reflection '添加对反射的引用Imports LoginIDALImports LoginDALPublic 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 FunctionEnd Class
IDAL层:
Imports LoginEntityPublic Interface IuserInfoDAL    'UserInfo为用户的实体,是由实体类实例化而来的    '即所谓的传实体    '此接口定义了一个方法,是用来检测用户是否存在    Function selectUser(ByVal UserInfo As LoginEntity.UserEntity) As DataTableEnd Interface
DAL层:

Imports System.Data.SqlClient'system.data.sqlClient命名空间是SQL SERVER的.netframework数据提供的程序  'sql server的.net framework数据提供程序描述了一个类集合,这个类用于访问托管中的sql server数据库;  Imports LoginEntityImports LoginIDALImports SQLHelperPublic 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 FunctionEnd 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 PropertyEnd Class
SQLHelper:

Imports System.Data.SqlClientImports System.ConfigurationImports System.DataImports System.ReflectionPublic 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 FunctionEnd Class

小结

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


1 0