VB.NET第一版机房收费系统,告一段落,验收的时候。问题也是大大的存在,没实用上设计模式,什么触发器。存储过程,都没实用上。看看其她小伙伴的,七层实现登录?那是什么东东,相比較我的三层而言,多了两倍还加个一,通过查资料,看博客。憋了好几天,最终,憋出了一个七仙女---七层实现系统登录。七个女儿,各司其职,完美配合,衍生出众多漂亮的故事。

从三层猛地跳到七层,有种穿越的感觉。说白了就是不会,又是想逃避的感觉,但是人生在世,有的事情不能随着自己的性子来。喜欢了就去做。不喜欢。就不做,没办法。就一直憋。一直憋,最终,系统登录实现了。接下来。总结一下七层系统登录的相关知识。俗话说,一张图。能够表达文字所不能描绘的情感和世界,如今让我们来看看一下机房收费系统的包图。例如以下:





      首先,我们来分析一下系统登录。我们须要做哪些工作,推断用户是否存在,推断username和password是否一致。登录成功之后。须要在worklog表中加入一条工作记录。该博文就实现系统登录简单描写叙述,加入工作记录再此不赘述。

接下来,代码实现部分:

第一层:IDAL-数据接口訪问层。放置接口函数。

<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
'文 件 名: IUser
'命名空间: IDAL
'内 容: 实现接口
'功 能: 创建接口
'文件关系:
'作 者:丁国华
'小 组:宝贝计划
'生成日期: 2014/7/9 8:44:27
'版本:V2.0
'改动日志:
'版权说明:
'**********************************************
Public Interface IUser
'/// <summary>
'/// depiction:<选择用户>
'/// </summary>
'/// <param name="<enUser>"><用户实体></param>
'/// <returns>
'///<返回一个用户实体>
'/// </returns>
Function SelectUser(ByVal enUser As Entity.UserEntity) As List(Of Entity.UserEntity) End Interface</span></span>

第二层:D层-数据訪问层,通过向SqlHelper中传递sql语句来实现详细的增删改查等功能。

<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
'文 件 名: T_UserDAL
'命名空间: DAL
'内 容: username与password推断
'功 能: 查询username与password是否正确
'文件关系:
'作 者:丁国华
'小 组:宝贝计划
'生成日期: 2014/7/9 9:03:17
'版本:V2.0
'改动日志:
'版权说明:
'********************************************** Imports System.Data.SqlClient
Imports IDAL Public Class T_UserDAL : Implements IUser
'/// <summary>
'/// depiction:<查询username与password是否正确>
'/// </summary>
'/// <param name="<enUser>"><用户实体></param>
'/// <returns>
'///<返回一个用户实体的集合>
'/// </returns>
Public Function SelectUser(ByVal enUser As Entity.UserEntity) As List(Of Entity.UserEntity) Implements IUser.SelectUser
Dim strText As String = "select * from T_User where UserID=@UserID and password=@password" 'sql语句
Dim cmdType As CommandType = CommandType.Text '命令类型
Dim Parameter As SqlParameter()
'传參
Parameter = {New SqlParameter("@UserID", enUser.userID),
New SqlParameter("@password", enUser.password)} Dim SqlHelper As New SqlHelper '实例化SqlHelper这个类的一个对象
Dim dt As New DataTable
Dim myList As List(Of Entity.UserEntity) dt = SqlHelper.ExecuteReaderTable(strText, cmdType, Parameter) '调用sqlhelper中executereadertable的方法
myList = EntityHelper.convertToList(Of Entity.UserEntity)(dt) Return myList
End Function End Class
</span></span>

第三层:Factory-工厂层,大话设计模式中对抽象工厂和配置文件这块有具体介绍。不明确的小伙伴能够查询《大话设计模式》第一百四十一页,工厂层的主要作用是应用配置文件和反射实现数据库的更换功能。

<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
'文 件 名: DataAccess
'命名空间: Factory
'内 容: 创建接口
'功 能: 创建接口
'文件关系:
'作 者:丁国华
'小 组:宝贝计划
'生成日期: 2014/7/9 8:41:23
'版本:V2.0
'改动日志:
'版权说明:
'**********************************************
Imports System.Reflection
Public Class DataAccess
'/// <summary>
'/// depiction:<创建用户接口>
'/// </summary>
'/// <param name="<>"><></param>
'/// <returns>
'///<返回IUserDAL>
'/// </returns>
Public Function CreateIUser() As IDAL.IUser
Return CType(Assembly.Load("DAL").CreateInstance("DAL.T_UserDAL"), IDAL.IUser)
End Function
End Class</span></span>

第四层:BLL层-业务逻辑层,查询username和password是否正确,实例化工厂,然后定义接口变量,调用工厂中的方法。返回一个用户实体的集合。

<span style="font-size:18px;"><span style="font-size:18px;">Imports IDAL

'**********************************************
'文 件 名: T_UserBLL
'命名空间: BLL
'内 容: 业务逻辑层
'功 能: 查询username和password是否正确
'文件关系:
'作 者:丁国华
'小 组:宝贝计划
'生成日期: 2014/7/9 9:02:30
'版本:V2.0
'改动日志:
'版权说明:
'********************************************** Public Class T_UserBLL
'/// <summary>
'/// depiction:<查询username和password是否正确>
'/// </summary>
'/// <param name="<enUser>"><用户实体></param>
'/// <returns>
'///<返回一个用户实体的集合>
'/// </returns>
Public Function SelectUser(ByVal enUser As Entity.UserEntity) As List(Of Entity.UserEntity)
Dim factory As New Factory.DataAccess
Dim IUser As IDAL.IUser
Dim myList As List(Of Entity.UserEntity) IUser = factory.CreateIUser()
myList = IUser.SelectUser(enUser) Return myList End Function
End Class
</span></span>

第五层:Facade-外观层,《大话设计模式》一百零三页有详细的相关介绍。

<span style="font-size:18px;"><span style="font-size:18px;">'**********************************************
'文 件 名: LoginFacade
'命名空间: Facade
'内 容:
'功 能:
'文件关系:
'作 者:丁国华
'小 组:宝贝计划
'生成日期: 2014/7/9 8:41:05
'版本:V2.0
'改动日志:
'版权说明:
'********************************************** Public Class LoginFacade
'/// <summary>
'/// depiction:<选择用户>
'/// </summary>
'/// <param name="<enUser>"><用户实体></param>
'/// <returns>
'///<返回一个用户实体的集合>
'/// </returns> Public Function SelectUser(ByVal enUser As Entity.UserEntity) As List(Of Entity.UserEntity)
Dim userBLL As New BLL.T_UserBLL
Dim myList As List(Of Entity.UserEntity) myList = userBLL.SelectUser(enUser) If myList.Count = 0 Then
Throw New Exception("username或password输入错误")
Else
Return myList
End If
End Function
End Class</span></span>

第六层:UI层-用户显示层,U层负责数据的输入与输出。调用Façade层验证用户类的查询方法来确认该用户是否存在。最后通过调用Façade层的方法登录。

<span style="font-size:18px;"><span style="font-size:18px;">Imports System.Windows.Forms

'**********************************************
'文 件 名: frmLogin
'命名空间: UI
'内 容: 用户显示层
'功 能: 确认用户是否存在
'文件关系:
'作 者:丁国华
'小 组:宝贝计划
'生成日期: 2014/7/8 17:51:07
'版本:V2.0
'改动日志:
'版权说明:
'**********************************************
Public Class frmLogin Public Shared enLogin As New Entity.UserEntity '/// <summary>
'/// depiction:<确认用户是否存在>
'/// </summary>
'/// <param name="<>"><></param>
'/// <returns>
'///<登录失败给出提示,登录成功进入主界面>
'/// </returns>
Private Sub btnConfirm_Click(sender As Object, e As EventArgs) Handles btnConfirm.Click
Dim facade As New Facade.LoginFacade
Dim myList As New List(Of Entity.UserEntity)
Dim enUser As New Entity.UserEntity '封装实体
Dim flag As Boolean
Try
enUser.userID = txtUserName.Text.Trim()
enUser.password = txtPassword.Text.Trim() myList = facade.SelectUser(enUser) If myList.Count > 0 Then
MsgBox("登录成功") Dim enWorklog As New Entity.WorklogEntity
enWorklog.userID = txtUserName.Text.Trim()
enWorklog.loginDate = CStr(Format(Now(), "yyyy-MM-dd"))
enWorklog.loginTime = CStr(Format(Now(), "HH:mm:ss"))
enWorklog.status = "正在值班"
enWorklog.computer = Environment.GetEnvironmentVariable("USERNAME") flag = facade.InsertWorklog(enWorklog) enLogin.userID = myList.Item(0).userID
enLogin.level = myList.Item(0).level End If
Catch ex As Exception
MessageBox.Show(ex.Message.ToString())
txtUserName.Focus()
txtUserName.SelectAll()
txtPassword.Text = "" End Try
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
Me.Close()
End Sub
End Class
</span></span>

第七层:SqlHelper。前面的博文有相关介绍。在这里,就不一一介绍了。

自此。一个小小的登录功能就实现了,在七层登录还没有成型的时候。各种纠结。各种不想做,有种快到临界点的感觉。但是走过之后。发现。这个临界点是打开三界的结界。打开之后,发现这个世界如此漂亮多彩。一如七仙女的故事。我们的七层登录也是各司其职,在自己的工作岗位履行着自己的职责。

第二版机房收费系统,未完,待续......

VB.NET版机房收费系统---七仙女之系统登录的更多相关文章

  1. VB.NET版机房收费系统---导出Excel表格

    datagridview,翻译成中文的意思是数据表格显示,使用DataGridView控件,能够显示和编辑来自不同类型的数据源的表格,将数据绑定到DataGridView控件很easy和直观,大多数情 ...

  2. VB.NET版机房收费系统---异常处理

    异常处理,英文名为Exceptional Handling, 那时年少,还记得那年一起学习过的VB6.0的时候,常常使用ONError的错误语句.与传统VB6.0中的OnError语句相比.NET平台 ...

  3. VB.net版机房收费系统——结账功能实现(调错与优化)

    调错部分 上一篇博客<VB.net版机房收费系统--结账功能实现(代码部分>说的是结账功能的实现,亮出了代码.是在为这篇博客做铺垫.尽管结账功能代码是借鉴的巨人的博客.可是自己比着葫芦画瓢 ...

  4. VB.NET版机房收费系统---报表

    报表,即报告情况的表格,简单的说:报表就是用表格.图表等格式来动态显示数据,可以用公式表示为:"报表 = 多样的格式 + 动态的数据". 在没有计算机以前,人们利用纸和笔来记录数据 ...

  5. VB.NET版机房收费系统---组合查询

    查询的意思就是查找,寻找,指在某一个或几个地方找出自己所要的信息,假如我想搜索一下我自己写的博客,名字叫做初雪之恋,我在百度的搜索框中输入丁国华三个字,会有怎样的惊喜等着我? 啊哦,这个信息并不是我想 ...

  6. VB.NET版机房收费系统---外观层如何写

    外观设计模式,<大话设计模式>第103页详细讲解,不记得这块知识的小伙伴可以翻阅翻阅,看过设计模式,敲过书上的例子,只是学习的第一步,接着,如果在我们的项目中灵活应用,把设计模式用出花儿来 ...

  7. VB.NET版机房收费系统---外观层怎样写

    外观设计模式.<大话设计模式>第103页具体解说,不记得这块知识的小伙伴能够翻阅翻阅,看过设计模式,敲过书上的样例,仅仅是学习的第一步,接着,假设在我们的项目中灵活应用,把设计模式用出花儿 ...

  8. VB.NET版机房收费系统—数据库设计

    之前第一遍机房收费的时候,用的数据库是别人的.认知也仅仅能建立在别人的基础上,等自考中<数据库系统原理>这本书学完了之后,再去看曾经的数据库,发现数据库真的还须要进一步的优化.以下是我设计 ...

  9. vb.net版机房收费系统——教你七层架构(三)—外观模式

    上次我们看到了D层是如何运作的,如今.我简单演示一下我的外观和B层是如何和U层和D层打交道的. 首先我跟大家说的是我的外观是依照界面功能划分的,粒度有点小,大家在做的时候,记得外观有几个即可了,可是不 ...

随机推荐

  1. 在Cognos报表中使用钻取特性,参数传递

    转载至:http://blog.sina.com.cn/s/blog_6eda1c4e0100mu3t.html Cognos的钻取方式大致可以分为三种: 1.模型固有的->由CUBE和DMR支 ...

  2. 使用less函数实现不同背景的CSS样式

    今天在公司遇到一个比较特殊的需求,需要完成这样的布局,如下图: 每一个块的背景需要不同,而其他都是相同的,这时候就应该把背景提出来单独写成一个CSS样式类. 那么问题来了,有四个不同的背景需要写4个基 ...

  3. 跟我学android-常用控件之EditText

    EditText 是TextView的直接子类,它与TextView的区别在于,EditText可以接受用户输入. 下面通过一个实例来说明EditText的用法 实例:sina 微博的登录界面(注意, ...

  4. 给出2n+1个数,其中有2n个数出现过两次,如何用最简便的方法找出里面只出现了一次的那个数(转载)

    有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数 例如这样一组数3,3,1,2,4,2,5,5,4,其中只有1出现了1次,其他都是出现了2次,如何找出其中的1? 最简便的方法是使用异或 ...

  5. 挂载NTFS

    1.安装ntfs-3g wget https://tuxera.com/opensource/ntfs-3g_ntfsprogs-2015.3.14.tgz --no-check-certificat ...

  6. 清除div浮动的三种方式

    html: <body> <div class="main"> <div class="first"></div> ...

  7. .NET MVC插件化开发框架源码(插件功能完善版)

    离上次第一次上传源码一个多星期了,在工作之余今天终于把插件管理部门的功能全部完善了,已可用于实际开发,管理界面因为没人帮忙设计,所以有点丑,今天这版算是0.1.0.0吧,后面我会发布很多插件来填充这个 ...

  8. bind函数

    bind函数把一个本地协议地址赋予一个套接字 对于网际协议,协议地址是32位的IPv4地址或128位的IPv6与16位的TCP或UDP端口号的组合 int bind ( int sockfd, con ...

  9. NOIP[2015] 运输计划

    传送门 题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球 ...

  10. mongodb 教程一

    mongodb是nosql(not only sql)的一种方式 .是对不同于传统的关系型数据库的数据库管理系统的统称. NoSQL - 代表着不仅仅是SQL- 没有声明性查询语言- 没有预定义的模式 ...