(MVC)三層架構知識的學習總結

首先介紹一下MVC的意義,和各個層面之間的用途和功能。mysql

1)實體層。主要用來聲明在視圖層和業務邏輯層之間傳遞數據的載體。一般表明來源與項目數據庫中一個或者多個表組成的一條有意義的記錄。算法

2)業務邏輯層。根據業務邏輯向視圖層提供數據,這個項目中的類有權根據業務邏輯來決定是否調用數據庫訪問層的方法sql

3)數據庫訪問層。項業務邏輯層提供訪問數據的方法。數據庫

4)視圖層。主要是以網站開發爲例。用於提供顯示,添加,編輯和刪除數據。數組

我在VS中建立的項目的結構圖:網站

NetMVC就是所謂的視圖層。Entity是實體層,用來聲明開發過程當中被要使用的全部變量。DAL是數據庫訪問層,主要完成全部操做對數據庫的訪問。BLL是業務邏輯層,處理視圖層傳來的業務邏輯,而後傳遞給數據庫訪問層進行處理。ui

本例主要演示的是登錄頁面的實現,Entity層的代碼以下:編碼

 

[csharp]  view plain  copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.   
  5. namespace Entity  
  6. {  
  7.     public class UserInfo  
  8.     {  
  9.         private int UserId;  
  10.   
  11.         /// <summary>  
  12.         /// 用戶比編號  
  13.         /// </summary>  
  14.         public int UserId1  
  15.         {  
  16.             get { return UserId; }  
  17.             set { UserId = value; }  
  18.         }  
  19.         private string username;  
  20.   
  21.         /// <summary>  
  22.         /// 登陸帳戶名稱  
  23.         /// </summary>  
  24.         public string Username  
  25.         {  
  26.             get { return username; }  
  27.             set { username = value; }  
  28.         }  
  29.   
  30.         private string password;  
  31.   
  32.         /// <summary>  
  33.         /// 登陸密碼  
  34.         /// </summary>  
  35.         public string Password  
  36.         {  
  37.             get { return password; }  
  38.             set { password = value; }  
  39.         }  
  40.         private int loginCount;  
  41.   
  42.         /// <summary>  
  43.         /// 登錄次數  
  44.         /// </summary>  
  45.         public int LoginCount  
  46.         {  
  47.             get { return loginCount; }  
  48.             set { loginCount = value; }  
  49.         }  
  50.         private DateTime regDate;  
  51.   
  52.         /// <summary>  
  53.         /// 註冊時間  
  54.         /// </summary>  
  55.         public DateTime RegDate  
  56.         {  
  57.             get { return regDate; }  
  58.             set { regDate = value; }  
  59.         }  
  60.         private DateTime lastLoginDate;  
  61.   
  62.         /// <summary>  
  63.         /// 最後登陸時間  
  64.         /// </summary>  
  65.         public DateTime LastLoginDate  
  66.         {  
  67.             get { return lastLoginDate; }  
  68.             set { lastLoginDate = value; }  
  69.         }  
  70.         private bool isForbidden;  
  71.         private string passwordQuestion;  
  72.   
  73.         /// <summary>  
  74.         /// 找回密碼提示問題  
  75.         /// </summary>  
  76.         public string PasswordQuestion  
  77.         {  
  78.             get { return passwordQuestion; }  
  79.             set { passwordQuestion = value; }  
  80.         }  
  81.         private string passwordAnswer;  
  82.   
  83.         /// <summary>  
  84.         /// 找回密碼答案  
  85.         /// </summary>  
  86.         public string PasswordAnswer  
  87.         {  
  88.             get { return passwordAnswer; }  
  89.             set { passwordAnswer = value; }  
  90.         }  
  91.   
  92.   
  93.     }  
  94. }  


完成對實體類的建立,接着就要完成對數據庫訪問層的建立(其中須要用到上篇問章所寫的SqlHelper數據庫訪問通用類http://blog.csdn.net/yisuowushinian/article/details/7999305),代碼以下,加密

 

 

[csharp]  view plain  copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Data;  
  5. using System.Data.SqlClient;  
  6. using System.Configuration;  
  7. using Entity;  
  8.   
  9. namespace DAL  
  10. {  
  11.     public class UserDal  
  12.     {  
  13.         private string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;  
  14.   
  15.         /// <summary>  
  16.         /// 添加用戶  
  17.         /// </summary>  
  18.         /// <param name="info">用戶的實體類</param>  
  19.         /// <returns></returns>  
  20.         public bool AddUser(UserInfo info)  
  21.         {  
  22.             string sql = "insert into Users(Username,password) values('@Username','@password')";  
  23.             SqlParameter[] parameters = new SqlParameter[4];  
  24.             parameters[0] = new SqlParameter("@Username", SqlDbType.NVarChar, 30);  
  25.             parameters[0].Value = info.Username;  
  26.   
  27.             parameters[1] = new SqlParameter("password", SqlDbType.VarChar, 50);  
  28.             parameters[1].Value = info.Password;  
  29.   
  30.   
  31.             return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;  
  32.         }  
  33.   
  34.         /// <summary>  
  35.         /// 刪除用戶  
  36.         /// </summary>  
  37.         /// <param name="UserId">用戶編號</param>  
  38.         /// <returns></returns>  
  39.         public bool DeleteUser(int UserId)  
  40.         {  
  41.             string sql = "delete from users where UserId=" + UserId;  
  42.             return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;  
  43.         }  
  44.   
  45.         /// <summary>  
  46.         /// 更新用戶  
  47.         /// </summary>  
  48.         /// <param name="info">用戶的實體類</param>  
  49.         /// <returns></returns>  
  50.         public bool UpDateUser(UserInfo info)  
  51.         {  
  52.             string sql = "update users set password=@password,loginCount=@loginCount where userid=@userid";  
  53.             SqlParameter[] parameters = new SqlParameter[7];  
  54.             parameters[0] = new SqlParameter("@password", SqlDbType.VarChar, 30);  
  55.             parameters[0].Value = info.Password;  
  56.   
  57.             parameters[1] = new SqlParameter("@loginCount", SqlDbType.Int, 4);  
  58.             parameters[1].Value = info.LoginCount;  
  59.   
  60.             return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;  
  61.         }  
  62.   
  63.         /// <summary>  
  64.         /// 根據用戶名或者用戶編號查詢用戶  
  65.         /// </summary>  
  66.         /// <param name="userId">用戶編號</param>  
  67.         /// <returns></returns>  
  68.         public DataTable GetUser(int userId)  
  69.         {  
  70.             string sql = "select * from users where userId=@UserId";  
  71.             SqlParameter[] parameters = new SqlParameter[1];  
  72.             parameters[0] = new SqlParameter("@UserId", SqlDbType.Int, 4);  
  73.             parameters[0].Value = userId;  
  74.             return new SqlDbHelper(connectionString).ExecuteDataTable(sql, CommandType.Text, parameters);  
  75.         }  
  76.   
  77.         /// <summary>  
  78.         /// 根據用戶名查詢用戶信息  
  79.         /// </summary>  
  80.         /// <param name="Username">用戶名</param>  
  81.         /// <returns></returns>  
  82.         public DataTable GetUser(string Username)  
  83.         {  
  84.             string sql = "select * from users where username=@username";  
  85.             SqlParameter[] parameters = new SqlParameter[1];  
  86.             parameters[1] = new SqlParameter("@username", SqlDbType.NVarChar, 30);  
  87.             parameters[1].Value = Username;  
  88.   
  89.             return new SqlDbHelper(connectionString).ExecuteDataTable(sql, CommandType.Text, parameters);  
  90.         }  
  91.   
  92.         /// <summary>  
  93.         /// 按照用戶編號升序查詢從指定位置開始的指定條數記錄  
  94.         /// </summary>  
  95.         /// <param name="startIndex">查詢的起始位置</param>  
  96.         /// <param name="size">返回的最大記錄條數</param>  
  97.         /// <returns></returns>  
  98.         public DataTable GetUserList(int startIndex, int size)  
  99.         {  
  100.             string sql = "select top " + size + " * from users where UserId not in (select top " + startIndex + " UserId from Users order by UserId asc)order by UserId asc";  
  101.             return new SqlDbHelper(connectionString).ExecuteDataTable(sql);  
  102.         }  
  103.   
  104.         /// <summary>  
  105.         /// 查詢用戶總數  
  106.         /// </summary>  
  107.         /// <returns></returns>  
  108.         public int GetUserCount()  
  109.         {  
  110.             string sql = "select count(1) from Users";  
  111.             return int.Parse(new SqlDbHelper(connectionString).ExecuteScalar(sql).ToString());  
  112.         }  
  113.     }  
  114. }  


而後建立業務邏輯層,代碼以下:spa

 

 

[csharp]  view plain  copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.   
  5. using DAL;  
  6. using Entity;  
  7. using System.Data;  
  8. using System.Data.SqlClient;  
  9. using System.Security.Cryptography;  
  10. using System.Security;  
  11.   
  12. namespace BLL  
  13. {  
  14.     public class UserBLL  
  15.     {  
  16.         private static string MD5Hash(string password)  
  17.         {  
  18.             MD5 md5 = MD5.Create();//建立Md5算法實例  
  19.             //將原始字符串轉換成UTF-8編碼的字節數組  
  20.             byte[] sourceBytes = System.Text.Encoding.UTF8.GetBytes(password);  
  21.             //計算字節數組的哈希值  
  22.             byte[] resultBytes = md5.ComputeHash(sourceBytes);  
  23.             StringBuilder buffer = new StringBuilder(resultBytes.Length);  
  24.             //將計算獲得的哈希值的字節數組中的每個字節轉換成十六進制形式  
  25.             foreach (byte b in resultBytes)  
  26.             {  
  27.                 buffer.Append(b.ToString("X"));  
  28.   
  29.             }  
  30.             return buffer.ToString();  
  31.         }  
  32.   
  33.         /// <summary>  
  34.         /// 添加用戶  
  35.         /// </summary>  
  36.         /// <param name="info">用戶的實體類</param>  
  37.         /// <returns></returns>  
  38.         public static bool AddUser(UserInfo info)  
  39.         {  
  40.             UserDal dal = new UserDal();  
  41.             DataTable data = dal.GetUser(info.Username);  
  42.             if (data.Rows.Count > 0)  
  43.             {  
  44.                 return false;  
  45.             }  
  46.             else  
  47.             {  
  48.                 info.Password =MD5Hash (info.Password);  
  49.                 return new UserDal().AddUser(info);  
  50.             }  
  51.         }  
  52.   
  53.         /// <summary>  
  54.         /// 刪除用戶  
  55.         /// </summary>  
  56.         /// <param name="userId">用戶編號</param>  
  57.         /// <returns></returns>  
  58.         public static bool DeleteUser(int userId)  
  59.         {  
  60.             return new UserDal().DeleteUser(userId);  
  61.         }  
  62.   
  63.         /// <summary>  
  64.         /// 更新用戶  
  65.         /// </summary>  
  66.         /// <param name="info">用戶的實體類</param>  
  67.         /// <param name="changePassword">是否須要對用戶密碼進行加密</param>  
  68.         /// <returns></returns>  
  69.         public static bool UpdateUser(UserInfo info, bool changePassword)  
  70.         {  
  71.             //若是更改密碼就須要對新密碼進行加密  
  72.             //若是沒有更改密碼則不能對密碼重複加密,不然會對用戶形成沒法登錄  
  73.             if (changePassword)  
  74.             {  
  75.                 info.Password = MD5Hash(info.Password);  
  76.             }  
  77.             return new UserDal().UpDateUser(info);  
  78.         }  
  79.   
  80.         /// <summary>  
  81.         /// 根據用戶編號查詢用戶  
  82.         /// </summary>  
  83.         /// <param name="UserId">用戶的編號</param>  
  84.         /// <returns></returns>  
  85.         public static DataTable GetUser(int UserId)  
  86.         {  
  87.             return new UserDal().GetUser(UserId);  
  88.         }  
  89.   
  90.         /// <summary>  
  91.         /// 根據用戶名查詢用戶信息  
  92.         /// </summary>  
  93.         /// <param name="userName">用戶名</param>  
  94.         /// <returns></returns>  
  95.         public static DataTable GetUser(string userName)  
  96.         {  
  97.             return new UserDal().GetUser(userName);  
  98.         }  
  99.   
  100.         /// <summary>  
  101.         /// 按照用戶編號升序查詢從指定位置開始的指定條數的記錄  
  102.         /// </summary>  
  103.         /// <param name="startIndex">查詢的起始位置</param>  
  104.         /// <param name="size">返回的最大記錄條數</param>  
  105.         /// <returns></returns>  
  106.         public static DataTable GetUserList(int startIndex, int size)  
  107.         {  
  108.             return new UserDal().GetUserList(startIndex, size);  
  109.         }  
  110.   
  111.         /// <summary>  
  112.         /// 查詢用戶總數  
  113.         /// </summary>  
  114.         /// <returns></returns>  
  115.         public static int GetUserCount()  
  116.         {  
  117.             return new UserDal().GetUserCount();  
  118.         }  
  119.   
  120.         /// <summary>  
  121.         /// 根據用戶名或者用戶編號從數據庫查詢對應記錄的實體,若是不存在則返回null  
  122.         /// </summary>  
  123.         /// <param name="userId">用戶編號</param>  
  124.         /// <returns></returns>  
  125.         public static UserInfo GetUserEntity(int userId)  
  126.         {  
  127.             return ChangeToEntity(new UserDal().GetUser(userId));  
  128.         }  
  129.   
  130.         /// <summary>  
  131.         /// 根據用戶名或者用戶編號從數據庫查詢對應記錄的實體,若是不存在則返回null  
  132.         /// </summary>  
  133.         /// <param name="userName">用戶名</param>  
  134.         /// <returns></returns>  
  135.         public static UserInfo GetUserEntity(string userName)  
  136.         {  
  137.             return ChangeToEntity(new UserDal().GetUser(userName));  
  138.         }  
  139.   
  140.         /// <summary>  
  141.         /// 將包含Users表記錄的DataTables中的第一條記錄轉換成Userinfo實體  
  142.         /// </summary>  
  143.         /// <param name="data"></param>  
  144.         /// <returns></returns>  
  145.         private static UserInfo ChangeToEntity(DataTable data)  
  146.         {  
  147.             UserInfo info = null;  
  148.             //若是data不爲空而且包含的記錄條數大於0、  
  149.             if (data!=null&&data.Rows.Count > 0)  
  150.             {  
  151.                 DataRow row = data.Rows[0];  
  152.                 info = new UserInfo();  
  153.   
  154.             }  
  155.             return info;  
  156.         }  
  157.   
  158.         public static bool Login(string userName, string password)  
  159.         {  
  160.             bool exits = false;  
  161.             UserInfo info = GetUserEntity(userName);  
  162.   
  163.             if (info != null && MD5Hash(password) == info.Password)  
  164.             {  
  165.                 exits = true;  
  166.                 info.LoginCount = info.LoginCount + 1;//將用戶登錄的次數加1  
  167.                 info.LastLoginDate = DateTime.Now;//將用戶最後的登陸時間設置爲如今  
  168.                 UpdateUser(info, false);//更新用戶的登錄次數和最後的登陸時間  
  169.             }  
  170.             return exits;  
  171.         }  
  172.     }  
  173. }  


這個就完成了對數據庫訪問層,實體層,業務邏輯層的建立工做。由於在建立過程當中被,有不少的重複的工做,我爲了加快速度,就省略了一些的代碼。

 

在登錄頁面使用時,只須要引入業務邏輯層的方法,而後根據其中的方法,傳入相應的參數,就能夠完成全部的操做。

相關文章
相關標籤/搜索