zoukankan      html  css  js  c++  java
  • 机房收费系统重构(五)—登陆窗口完整版

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

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

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

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

      

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

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

    (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 =@UserID and PassWord =@Password"                         '查询数据库
            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或者实体类型是不可能。希望大家在今后写程序过程中注意就能够了。

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

  • 相关阅读:
    svg
    vuex的模块
    es6的新增方法和es5数组的一些方法
    vue的响应规则
    简单的解构赋值
    vuex的四种状态
    indexDB
    token验证
    C# 委托与事件的DEMO
    WPF MVVM 键盘按键事件绑定
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7359726.html
Copyright © 2011-2022 走看看