VB.NET第一版機房收費系統,告一段落,驗收的時候,問題也是大大的存在,沒有用上設計模式,什麼觸發器,存儲過程,都沒有用上,看看其她小伙伴的,七層實現登錄?那是什麼東東,相比較我的三層而言,多了兩倍還加個一,通過查資料,看博客,憋了好幾天,終於,憋出了一個七仙女---七層實現系統登錄,七個女兒,各司其職,完美配合,衍生出眾多美麗的故事。
從三層猛地跳到七層,有種穿越的感覺,說白了就是不會,又是想逃避的感覺,可是人生在世,有的事情不能隨著自己的性子來,喜歡了就去做,不喜歡,就不做,沒辦法,就一直憋,一直憋,終於,系統登錄實現了,接下來,總結一下七層系統登錄的相關知識。俗話說,一張圖,可以表達文字所不能描繪的情感和世界,現在讓我們來看看一下機房收費系統的包圖,如下:
首先,我們來分析一下系統登錄,我們需要做哪些工作,判斷用戶是否存在,判斷用戶名和密碼是否一致,登錄成功之後,需要在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 '內 容: 用戶名和密碼判斷 '功 能: 查詢用戶名和密碼是否正確 '文件關系: '作 者:丁國華 '小 組:寶貝計劃 '生成日期: 2014/7/9 9:03:17 '版本號:V2.0 '修改日志: '版權說明: '********************************************** Imports System.Data.SqlClient Imports IDAL Public Class T_UserDAL : Implements IUser '/// <summary> '/// depiction:<查詢用戶名和密碼是否正確> '/// </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層-業務邏輯層,查詢用戶名和密碼是否正確,實例化工廠,然後定義接口變量,調用工廠中的方法,返回一個用戶實體的集合。
<span style="font-size:18px;"><span style="font-size:18px;">Imports IDAL '********************************************** '文 件 名: T_UserBLL '命名空間: BLL '內 容: 業務邏輯層 '功 能: 查詢用戶名和密碼是否正確 '文件關系: '作 者:丁國華 '小 組:寶貝計劃 '生成日期: 2014/7/9 9:02:30 '版本號:V2.0 '修改日志: '版權說明: '********************************************** Public Class T_UserBLL '/// <summary> '/// depiction:<查詢用戶名和密碼是否正確> '/// </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("用戶名或密碼輸入錯誤") Else Return myList End If End Function End Class</span></span>
第六層:UI層-用戶顯示層,U層負責數據的輸入與輸出,調用Facade層驗證用戶類的查詢方法來確認該用戶是否存在,最後通過調用Facade層的方法登錄。
<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,前面的博文有相關介紹,在這裡,就不一一介紹了。自此,一個小小的登錄功能就實現了,在七層登錄還沒有成型的時候,各種糾結,各種不想做,有種快到臨界點的感覺,可是走過之後,發現,這個臨界點是打開三界的結界,打開之後,發現這個世界如此美麗多彩。一如七仙女的故事,我們的七層登錄也是各司其職,在自己的工作崗位履行著自己的職責。
第二版機房收費系統,未完,待續......
作者:csdn博客 丁國華