机房收费系统——登录窗体

时间:2022-12-20 15:46:49

机房收费系统在历时17天之后,磕磕绊绊的写完了,虽然一直都没有订每天的任务量,但是总体感觉还行,因为中间差不多每天要花费三个小时去听英语,我听英语还是比较认真的。

其实想想做机房收费系统的整个过程,也就是在登录窗体的时候卡住了,因为这是第一次用三层做,而且说实话对VB.NET不是特别熟悉,登录窗体能够运行之后,后面的大概就是堆代码了。

这是我机房收费系统的包图。下面以登录窗体写层实现的过程

机房收费系统——登录窗体

DALL层

因为考虑到以后更换数据库的问题,所以DAL层用到了抽象工厂模式。所以相应的也就加了DataAccess层,IDAL接口层,SQLHelper主要用于SQL调用之类的类。

抽象工厂模式下的DAL层:

机房收费系统——登录窗体

IuserInfo接口(即为包图中的IDAL层里的一个类),用户客户端访问,接触与具体数据库访问的耦合(此处只以登录窗体为例,所以所涉及到的数据库操作相对较少)

Public Interface IUserInfo
Function UserInsert(ByVal entityuserInfo As Entity.enUserInfo) As Boolean
End Interface

SqlserverUserInfo类(即为DAL中的一个类),用于访问SQL Server的UserInfo(如何访问的是Access数据库,可以按此写一个访问Access的类)

Public Function UserInquire(entityuserInfo As Entity.enUserInfo) As Boolean Implements IDAL.IUserInfo.UserInquire
' Dim sql As String = String.Format("select * from UserInfo where userName={0} and passWord={1} and Status={2}", entityuserInfo.UserName, entityuserInfo.Password, entityuserInfo.StatusType)
Dim sql As String = String.Format("select * from UserInfo where userName={0} and passWord={1} and Status={2}", _
enUserInfo.DBPARAM_USERNAME, enUserInfo.DBPARAM_PASSWORD, enUserInfo.DBPARAM_STATUSTYPE)
Dim sqlHelp As New SQLhelper.daBase
Dim conn As SqlConnection = sqlHelp.CreateConn(connStr)
Dim cmd As SqlCommand = New SqlCommand(sql, conn)
AddSqlParameter(cmd, enUserInfo.DBPARAM_USERNAME, SqlDbType.Char, entityuserInfo.UserName)
AddSqlParameter(cmd, enUserInfo.DBPARAM_PASSWORD, SqlDbType.Char, entityuserInfo.Password)
AddSqlParameter(cmd, enUserInfo.DBPARAM_STATUSTYPE, SqlDbType.Char, entityuserInfo.Status)
Dim sdr As SqlDataReader = Nothing
Try
conn.Open()
sdr = cmd.ExecuteReader()
sdr.Read()
If (sdr.HasRows = True) Then
Return True
Else
Return False
End If

Catch ex As Exception
Return False
Finally
Close(conn)
Close(cmd)
Close(sdr)
End Try

End Function

(此处用到很多例如关闭数据库,关闭记录集,传参的函数,具体的都写在SQLHelp中,不一一列举)

Ifactory接口(DataAccess包中的类),定义一个创建访问UserInfo表对象的抽象的工厂接口。

Public Interface IFactory
Function creatUserInfo() As IUserInfo
End Interface
SqlServerFactory类,实现Ifactory接口,实例化SqlserverUser(如何是Access,照此可以直接写出)
Public Class SqlServerFactory : Implements IFactory    Public Function creatUserInfo() As IDAL.IUserInfo Implements IFactory.creatUserInfo        Dim dalUser As New DAL.sqlUserInfo        Return dalUser    End Function

此处的关键就在于,如果需要更换数据库,直接增加Access类即可,不需要改动源码。

下面是Bll层

Public Function userQuery(ByVal entityUserInfo As Entity.enUserInfo) As Boolean
Dim fatory = New DataAccess.SqlServerFactory
Dim userInfo As IDAL.IUserInfo = fatory.creatUserInfo
Dim flag As Boolean
flag = CBool(userInfo.UserInquire(entityUserInfo))
Return flag
End Function

我写的BLL层是从DAL层写的,当然也可以按照UI层来写

外观层只要是用来对UI层所需要数据的整理打包

FAÇADE外观层:

Public Function Logon(ByVal entityUserInfo As Entity.enUserInfo, ByVal entityWorkLog As Entity.enWorkLog) As Boolean
Dim user As New BllUserInfo
Dim flag As Boolean
flag = user.userQuery(entityUserInfo)
Return flag
End Function

最后是U层,因为U层涉及到窗体登录是传的数据,还有判断,这是大家都知道的,所以,下面只写出U层中与三层有关的两句

Dim facade = New BllFacade.Logon
facade.Logon(entityUserInfo)

大概流程就是这样的,一直从开始理解三层到做完机房收费系统,我发现,虽然机房收费系统并不是一个多大的系统,但是用三层写后的确是很容易维护,从后来调错中就可以看出,基本上不怎么费力就可以调通,所以,花点时间研究下三层,还是很有必要的。