【机房重构】七层登录
来源:互联网 发布:美工是什么职位类别 编辑:程序博客网 时间: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 ClassBLL层:
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 ClassFactory层:
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 ClassIDAL层:
Imports LoginEntityPublic Interface IuserInfoDAL 'UserInfo为用户的实体,是由实体类实例化而来的 '即所谓的传实体 '此接口定义了一个方法,是用来检测用户是否存在 Function selectUser(ByVal UserInfo As LoginEntity.UserEntity) As DataTableEnd InterfaceDAL层:
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 ClassEntity层:
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 ClassSQLHelper:
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
- 机房重构之七层登录
- 【C#】七层登录<机房重构>
- 机房重构---七层登录
- 机房重构—七层登录
- 机房重构之七层登录
- 【机房重构个人版】七层登录
- 【机房重构】七层登录
- 【机房重构】七层登录
- 机房重构之七层登录
- 机房重构--七层登录
- 【VB.NET机房重构】七层登录
- 机房收费系统重构之七层系统登录
- 【机房重构】——七层登录
- 机房重构——七层登录
- 机房重构——七层登录
- 【机房重构】之七层登录不要怕
- 【C#】机房重构——七层登录
- 机房重构-七层登录(上)
- Android Bean序列化使用场景
- SeaJS入门教程系列之使用SeaJS(二)
- 实现一个getMin功能的栈
- Android性能优化的方方面面
- Mac Karabiner 设置
- 【机房重构】七层登录
- PhotoKit相册的性能优化
- redis基础及特点
- win10开机黑时间数十秒原因及解决
- iOS coretext框架第二章 CTStringAttributes类介绍
- 程序员的沟通之痛
- Apache优化配置详解
- nodeJs知识点总结
- 【CodeForces506A】【DP】【记忆化搜索】Mr. Kitayuta, the Treasure Hunter 题解