机房收费系统重构(五)

     在上上篇,《机房收费系统重构(3)》,中主要是介绍了自己关于DAL层,工厂层,以及接口层,还有实体层的理解,但是好多读者再问我,你的代码呢,我在这解释一下,就是我只是写出关于那几部分的理解,并没有写贴出代码让大家研究的,但是不能顺应民心的文章不是好文章,所以我在这篇文章中,将机房收费登录中七层中所有的代码,贴出来供大家拍砖斧正,还有最后我在谈谈针对BLL层和外观层的理解。

     首先我所说的七层是针对UI层,外观层,BLL层,DAL层,工厂层,实体层,接口层七层组成。

     实现登录窗体,要明白,先要查询用户是否存在,然后将登录信息写入数据库,这两个主要步骤。

首先来看看我数据库中用到的两个表:

  

    这样能方便读者更容易理解后面的代码:

    一.首先看看实体层的代码吧

(1)用户表实体层:

Public Class MO_Login

    Private _userID As String
    Private _level As String
    Private _password As String
    Private _userName As String
    Private _computer As String

    Public Shared UserHead As String  ' 设置全局变量
    Public Shared UserLevel As String

    Public Property UserID() As String
        Get
            Return _userID
        End Get
        Set(value As String)
            _userID = 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 level() As String
        Get
            Return _level
        End Get
        Set(value As String)
            _level = 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 Computer() As String
        Get
            Return _computer
        End Get
        Set(value As String)
            _computer = value
        End Set
    End Property
End Class

(2)工作记录实体层:

Public Class MO_Worklog
    Private _userID As String
    Private _level As String
    Private _loginDataTime As String
    Private _computer As String
    Private _status As String

    Public Shared Property Login_DataTime As String

    Public Property UserID() As String
        Get
            Return _userID
        End Get
        Set(value As String)
            _userID = value
        End Set
    End Property
    Public Property level() As String
        Get
            Return _level
        End Get
        Set(value As String)
            _level = value
        End Set
    End Property
    Public Property LoginDataTime() As String
        Get
            Return _loginDataTime
        End Get
        Set(value As String)
            _loginDataTime = value
        End Set
    End Property
    Public Property Computer() As String
        Get
            Return _computer
        End Get
        Set(value As String)
            _computer = value
        End Set
    End Property
    Public Property Status() As String
        Get
            Return _status
        End Get
        Set(value As String)
            _status = value
        End Set
    End Property
End Class

   二.接着来看看UI层的吧:

Public Class frmLogin

    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
        Dim login As New Model.MO_Login
        Dim falogin As New Facade.FA_Login     '实例化过程

        Dim strResult As String

        login.UserID = txtUserName.Text        '赋值过程
        login.PassWord = txtPassWord.Text

        Model.MO_Login.UserHead = txtUserName.Text

        Dim worklog As New Model.MO_Worklog    '实例化工作记录
        worklog.LoginDataTime = Date.Now.ToString("yyyy-mm-dd hh:mm:ss")  '上机时间
        worklog.Status = "正在值班"                                       '工作状态
        worklog.UserID = Model.MO_Login.UserHead
        worklog.Computer = System.Net.Dns.GetHostName().ToString()        '本地计算机

        strResult = falogin.FLogin(login, worklog)                        '传参返回过程

        Select Case strResult                                             '判断过程
            Case "输入有误"
                MsgBox("输入有误,请重新输入")
            Case "登录成功"
                MsgBox("登录成功")

                Model.MO_Worklog.Login_DataTime = worklog.LoginDataTime
                Me.Hide()
                'frmMain.Show()
        End Select

    End Sub

    Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
        End
    End Sub
End Class

   三.外观层代码:

Imports BLL
Public Class FA_Login
    Public Function FLogin(ByVal user As Model.MO_Login, worklog As Model.MO_Worklog) As String
        Dim UserBLL As New BLL.BL_Login

        If UserBLL.IsnotNull(user, worklog) = False Then
            Return "输入有误"
        Else
            Return "登录成功"
        End If
    End Function
End Class

   四.BLL层代码:

<pre name="code" class="vb">Imports IDAL
Public Class BL_Login
    Public Function IsnotNull(ByVal user As Model.MO_Login, ByVal worklog As Model.MO_Worklog) As Boolean
        Dim IUser As IDAL.ILogin                          '注意接口类型不能实例化。
        Dim factory As New Factory.LoginFactory           '实例化工厂
        Dim IWorklog As IDAL.IWorklog

        IUser = factory.CreateUserInfo()                  '工厂创建接口,DAL实现接口,BLL调用工厂
        IWorklog = factory.CreateWorklog()

        If IUser.User_Login(user).UserID = "" Then        '如果为空
            Return False                                  'Boolean值为false
        Else
            worklog.level = IUser.User_Login(user).level   '传参数,将查询到的用户类型传给worklog实体层,在后面的增删改中应用。
            If IWorklog.SaveWorkLog(worklog) Then          '如果查询到用户存在,就开始将登录信息写入数据库中。
                Return True
            End If
            Return True
        End If

    End Function
End Class

  五.工厂层代码:


Imports System.Reflection '添加反射的引用
Imports System.Configuration '添加配置文件的引用
Imports IDAL
Public Class LoginFactory
    '利用反射+配置文件+抽象工厂
    Dim strDB As String = System.Configuration.ConfigurationSettings.AppSettings("strSqlConnection")
    '表示读取配置文件,如果配置文件中是SQLserver数据库就访问,如果是别的就放访问别的,不需要更改代码
    'Dim strQueryWorkLog As String = System.Configuration.ConfigurationSettings.AppSettings("strSqlConnection")
    '创建用户表工厂
    Public Function CreateUserInfo() As ILogin
        Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "DA_Login"), ILogin)
    End Function
    Public Function CreateWorklog() As IWorklog
        Return CType(Assembly.Load("DAL").CreateInstance("DAL" & "." & "DA_Worklog"), IWorklog)
    End Function
End Class

  六.接口层代码:

(1)用户查询接口

Public Interface ILogin
    Function User_Login(ByVal user As Model.MO_Login) As Model.MO_Login
End Interface

(2)将操作记录写入数据库代码:

Public Interface IWorklog
    Function SaveWorkLog(ByVal worklog As Model.MO_Worklog) As Boolean
End Interface

  七.最后是DAL层代码:

(1)用户查询DAL

Imports System.Data.SqlClient
Imports System.Data
Imports IDAL
Public Class DA_Login : Implements IDAL.ILogin

    Public Function User_Login(user As Model.MO_Login) As Model.MO_Login Implements IDAL.ILogin.User_Login
        Dim sqlparams As SqlParameter() = {New SqlParameter("@UserID", user.UserID), New SqlParameter("@Password", user.PassWord)} '传递参数过程
        Dim cmdText As String = "select * from T_UserInfo where UserName [email protected] and PassWord [email protected]"                         '查询数据库
        Dim aUser As New Model.MO_Login  '实例化过程

        Dim helper As New SqlHelper
        Dim cmdType As CommandType = New CommandType()
        cmdType = CommandType.Text       '定义命令类型为存储过程
        Dim table As DataTable           '实例化一个过程
        '在这里想解释一个,由于函数返回参数是实体层,但是这里定义的table是一个Datable类型,所以系统无法进行转换。所以我定义了一个aUser进行中转。
        table = helper.ExecuteQuery(cmdText, cmdType, sqlparams) '定义返回值
        If table.Rows.Count <> 0 Then
            aUser.UserID = table.Rows(0).Item("UserID")
            aUser.PassWord = table.Rows(0).Item("PassWord")
            aUser.level = table.Rows(0).Item("level")
            aUser.UserName = table.Rows(0).Item("UserName")
        End If
        Return aUser
    End Function
End Class

(2)操作记录写入代码DAL

Imports System.Data.SqlClient
Imports System.Data
Imports IDAL
Public Class DA_Worklog : Implements IDAL.IWorklog
    Public Function SaveWorkLog(worklog As Model.MO_Worklog) As Boolean Implements IWorklog.SaveWorkLog
        Dim strText As String = "INSERT INTO T_WorkLog(UserID,level,LoginDateTime,Computer,Status)VALUES (@UserID,@level,@LoginDateTime,@Computer,@Status)"
        Dim sqlparams As SqlParameter() = {New SqlParameter("@UserID", worklog.UserID), New SqlParameter("@level", worklog.level), New SqlParameter("@LoginDateTime", worklog.LoginDataTime), New SqlParameter("@Computer", worklog.Computer), New SqlParameter("@Status", worklog.Status)}
        Dim cmdType As CommandType = CommandType.Text
        Dim helper As New SqlHelper
        Return helper.ExecuteNonQuery(strText, cmdType, sqlparams)
    End Function
End Class

其实这些代码也不全,少了关于工厂反射的配置部分的内容,还有就是SqlHelper。SqlHelper,在我《机房收费重构(4)》中有很详细的介绍。在这就不写了。

    最后说一下关于BLL和外观层的理解吧。从代码看,仿佛感觉外观层没有什么作用,是的,关于登录窗体小功能的实现,没有太大的必要用外观层,但是以后要敲一个庞大的窗体时,我们需要将U层和B层解耦,那么外观层的作用就彰显出来了。关于BLL和外观其实没有什么想说的,最想说的是数据类型的转换,因为层与层之间传递参数和返回参数的过程需要用到同样类型的数据,但是将数据类型都设置为Datatable和string或者实体类型是不可能,希望大家在今后敲代码过程中注意就可以了。

   本片文章代码较多,希望大家拍砖斧正。。

机房收费系统重构(五)

时间: 2024-10-01 04:32:06

机房收费系统重构(五)的相关文章

机房收费系统重构(五)—登陆窗口完整版

     在上上篇.<机房收费系统重构(3)>.中主要是介绍了自己关于DAL层,工厂层.以及接口层,还有实体层的理解.可是好多读者再问我.你的代码呢,我在这解释一下.就是我仅仅是写出关于那几部分的理解,并没有写贴出代码让大家研究的.可是不能顺应民心的文章不是好文章,所以我在这篇文章中,将机房收费登录中七层中全部的代码,贴出来供大家拍砖斧正.还有最后我在谈谈针对BLL层和外观层的理解.      首先我所说的七层是针对UI层,外观层,BLL层,DAL层,工厂层,实体层,接口层七层组成.    

vb.net机房收费系统重构——总结(二)软件工程文档1

学软工时常常听到:这是我们迈向职业化的一步.软件工程文档在一个项目开发中必不可少,通过这次重构,将以前的软件工程,UML重新认识,梳理,实用了一遍有了更深刻的体会,我在机房重构中,一共编写了七个文档,分别是 1.项目开发计划 2.软件需求说明书 3.数据库设计说明书 4.概要设计说明书 5.详细设计说明书 6.机房收费系统测试计划 7.机房收费系统用户操作手册 在这里只讲一下项目开发文档中各种需要的图.表. (一)软件项目开发计划: 文档的目的不用说,在这里面最重要的两个内容:项目的人员分工,以

vb.net版机房收费系统重构

机房收费系统重构版终于正式开工了! 前几天,刚刚看完三层的视频,在视频中详细的讲解了一个登录功能.天真的我,当时以为三层结构是那么的简单,所以我草草地做完总结之后,就很快就开始机房收费系统的重构了.可是谁想到,当我一打开编程软件,就让我"碰了一鼻子的灰"!首先是不知道vs 怎么用,其次就是看三层的时候,登录的实例使用C#写的,而这次我们需要用VB.NET写,所以对于其中的语法是知之甚少.虽然,前段时间我看了一遍台湾讲师--曹祖胜的<VB.NET 视频>,但是他讲的几乎都是一

机房收费系统重构(六)—泛型集合

      机房收费系统重构仍在进行,但是在进行过程中,也许数据类型的转换是永远也避不开的,今天我就来讲讲关于数据类型转换的问题!       在个人版机房收费系统中,在DAL层中,如果是增删改,是不需要返回参数的,返回值是Boolean,但是在查询中,需要有返回值,而且返回的是Dateset类型,所以在这里问题就来了.      如果在返回值过程中一直返回的是表的类型,也许就没有那么多麻烦的事情了,但是dateset使得系统具有了强耦合性,但是如果返回的是实体类呢!关于这点我也查了查资料,为什

机房收费系统重构(三)

前段时间用简单的三层实现了窗体登录功能,心中有点小小的成就感,但是很快就被泼了凉水,机房收费不可能只用三层实现,如果你用三层,也就是说后面机房收费所有的功能都必须使用三层来实现功能.所以一周前始了七层的研究.经过一个星期的看博客,总结,调代码,终于实现了窗体登录,信息录入,和简单充值查询功能.   说说自己这次七层之旅的总结吧.   1.毋庸置疑,研究一个窗体功能,我首先判断的是需要用到数据库中的哪些表(这是属于我自己的编程习惯,不适用全部),然后再实体层中将表中的字段表示出来,有多少个表就有多

机房收费系统重构——数据库设计

终于,走到了机房收费系统重构的阶段-- 之前的一遍机房收费系统的数据库是用的给的那个,只是把每个表都看了一下,当时也没有学习数据库原理那本书,然后就没有深究-- 现在不一样了,我们进行机房收费系统重构,况且学习了数据库原理这本书,对数据库有了更深的认识.所以对于数据库要好好的设计,按照步骤走-- 数据库技术是信息资源管理最有效地手段.数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,有效存储数据,满足用户信息要求和处理要求. 数据库的设计的步骤和各阶段的主要内容

vb.net版机房收费系统重构的成长历程(功能实现篇)

重构机房收费系统,功能是不变的,需求是不变的,系统背后的代码,架构发生了改变.做过vb6.0版的系统 后,利用VS的VB.NET平台, 通过调整程序架构,加入了设计模式,改善软件的质量.性能,提高软件的扩展性和维护性.相比旧版系统,新版系统主要亮点有: 亮点一:代码分层管理,清晰明了 亮点二:加入工厂和接口,代码复用较多,减少了重复或相似的代码. 亮点三:用到了存储过程.一方面减少了代码量,另一方面也相当于是一个事务的执行.比如注册或者结账需要同 时操作多张表,这几个表必须同时被操作成功后才可以

vb.net机房收费系统重构——总结(四)软件工程文档3

(四)概要设计说明书 数据库搭建完成后就要设计概要系统,首先第一必不可少的是系统模块图. 在这里,很多同学都把模块图理解成了包图,其实这两者有差异.以我们正在做的ITOO为例,分为基础部分,评教部分,考试部分等五个部分,这就是五个大的模块.每个模块再进行细分. 而在机房收费系统中,可以简单的分为三大模块,即一般用户,操作员,管理员.每种级别用户操作目的和职能不同,所有又可以细分模块. 系统总体设计的主要任务就是确定软件的总体结构,确定模块间传送的数据及控制关系,尽量的做到解耦. (五)详细设计说

机房收费系统重构之存储过程的使用

从一开始对于机房收费系统的无从下手,到现在已经接近尾声,像冬天的迷雾一样,随着时间散开了去,对于其也是越来越清晰,想一想,这种学习的过程还真是美妙. 当然只学习不去总结是没有意义的.今天我就来把存储过程的使用总结一下.拿用户注册来说,就是往数据库里添加用户,以方便更多的用户使用.那么用户注册我们要注意到什么呢? 1.通过卡号判断用户是否已经存在. 如果不存在该用户: 2.将信息写入学生表. 3.更新充值记录表 4.更新卡表中的余额. 我们分析可以得到,如果不存在该用户,我们需要同时改动三个表.当