上一篇博客写了三层的基础知识,这一篇写写我实践了的一个登录实例。
1.实例业务描述:
一个登录界面,通过输入用户名和密码实现登录。如果用户名、密码在数据库Login中的Users表中存在,则表明登录成功,然后在相应的Scores表中增加10个积分;如果登录不成功,则显示“登录失败”。可参考图:
登录界面:
users表:
scores表:
2.实现过程
配置文件
配置文件是可以按需要更改的 XML 文件。 开发人员可以使用配置文件来更改设置,而不必重编译应用程序。 管理员可以使用配置文件来设置策略,以便影响应用程序在计算机上运行的方式。这里不多叙述关于配置文件的详细内容,仅给出此实例中应用到的配置文件。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<clear />
<add key="connString" value="Data Source=192.168.**.**;Initial Catalog=Login;User ID=sa;Password=123456"/>
</appSettings>
</configuration>
Model(实体类)
Model对应于users表,用来封装数据,在三层之间传送数据也就是各层之间的函数调用返回值都是user对象。Model独立于其他三个层次,不会引用其他三个程序集,而其他都引用Model。
Public Class UserInfo
Private ID As Integer
Private UserName As String
Private Password As String
Private Email As String
Public Property _ID As Integer
Get
Return ID
End Get
Set(value As Integer)
ID = value
End Set
End Property
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
Public Property _Email As String
Get
Return Email
End Get
Set(value As String)
Email = value
End Set
End Property
End Class
D层
D层中包含了三个类:DBUtil类、UserDAO类、ScoreDAO类。提供基本的数据访问,不包含任何相关的业务处理。
DBUtil类中调用了配置文件:
Public Class DBUtil
'读取配置文件。
Public Shared strConnection As String = System.Configuration.ConfigurationManager.AppSettings("connString")
End Class
UserDAO类实现了查询该用户和密码是否存在的功能。
Imports System.Data.SqlClient
Imports System.Data
Public Class UserDAO
Public Function SelectUser(ByVal UserName As String, ByVal Password As String) As LoginModel.UserInfo
Using conn As New SqlConnection(DBUtil.strConnection) 'using语句可以确保在范围结束时调动dispose方法释放对象。
Dim cmd As SqlCommand = conn.CreateCommand() '通过Connection的CreateCommand方法创建Command对象
cmd.CommandText = "SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password"
cmd.CommandType = CommandType.Text
cmd.Parameters.Add(New SqlParameter("@UserName", UserName)) '添加参数@UserName
cmd.Parameters.Add(New SqlParameter("@Password", Password)) '添加参数@Password
conn.Open()
Dim user As LoginModel.UserInfo = Nothing
Dim reader As SqlDataReader = cmd.ExecuteReader() '通过Command对象的ExecuteReader方法创建sqlDataReader对象
While (reader.Read()) '若reader中没有记录返回false则退出循环,若有记录则读入user内。
If user Is Nothing Then
user = New LoginModel.UserInfo
End If
user._ID = reader.GetInt32(0) '将字段依次读入user的属性中。
user._UserName = reader.GetString(1)
user._Password = reader.GetString(2)
If user._Email Is DBNull.Value = False Then 'DBNUll函数可以判断读出的是否为空。
user._Email = reader.GetString(3)
End If
End While
Return user
End Using
End Function
End Class
ScoreDAO类实现了增加积分的功能。
Imports System.Data.SqlClient
Public Class ScoreDAO
Public Sub UpdateScore(ByVal UserName As String, ByVal value As Integer)
Using conn As New SqlConnection(DBUtil.strConnection) 'using语句可以确保在范围结束时调动dispose方法释放对象。
Dim cmd As SqlCommand = conn.CreateCommand() '通过Connection的CreateCommand方法创建Command对象
cmd.CommandText = "INSERT INTO SCORES(UserName,Score) values(@UserName,@Score)"
cmd.Parameters.Add(New SqlParameter("@UserName", UserName))
cmd.Parameters.Add(New SqlParameter("@Score", value))
conn.Open()
cmd.ExecuteNonQuery() '执行TSQL语句。
End Using
End Sub
End Class
B层
负责处理业务逻辑。通过获取UI传来的指令,决定执行业务逻辑UserLogin,在需要访问数据源的时候(Select和Update)直接交给DAL处理,处理完成后,返回必要数据给UI。
Public Class LoginManager
Public Function UserLogin(ByVal UserName As String, ByVal Password As String) As LoginModel.UserInfo
Dim uDao As New LoginDAL.UserDAO
Dim user As New LoginModel.UserInfo
user = uDao.SelectUser(UserName, Password)
If user IsNot Nothing Then 'user不为空说明查询到用户存在,登录成功。
Dim sDao As New LoginDAL.ScoreDAO
sDao.UpdateScore(UserName, 10)
End If
Return user
End Function
End Class
U层
主要就是界面,以及负责采集和显示用户操作
Public Class Form1
Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
Dim userName As String = txtUserName.Text.Trim()
Dim password As String = txtPassword.Text
Dim user As New LoginModel.UserInfo
Dim mgr As New LoginBLL.LoginManager
user = mgr.UserLogin(userName, password)
If user IsNot Nothing Then
MsgBox("登录成功:" + userName)
Else
MsgBox("登录失败")
End If
End Sub
End Class
3.总结
通过几遍实践这个小例子,对三层的架构思想理解更进了一步。当然我觉得要是再深入理解,还得需要再实践其他项目。期待下一个项目机房收费系统个人重构的开始。