ASP.NET MVC+EF框架+EasyUI實現權限管系列
(開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝
(5):前台Jquery easyUI實現 (6):EF上下文實例管理 (7):DBSession的封裝 (8):DBSession線程內唯一
(9):TT摸版的學習 (10):VSS源代碼管理 (11):驗證碼實現和底層修改 (12):實現用戶異步登錄和T4模板
(13):權限設計 (14):主框架搭建 (15):權限數據庫模型和用戶登錄詳細錯誤 (16):用戶注冊的各種驗證
前言:前面兩篇博客我實現了用戶的注冊功能,分為兩篇來介紹,主要就是介紹一些簡單的驗證以及用戶名不能為空,密碼和確認密碼等必須一樣,那么后面我們將不會在詳細的講述這點內容,只要我們講述具體的思路我想大家都可以明白,那么今天我們就來說用戶的多條數據刪除以及用戶的修改信息等,當然我也會把主要的代碼貼出來供大家看看,因為后面的很多東西都是很簡單的,所以我也就是大致的說一下,希望大家能夠自己敲一遍代碼,那么什么都就知道了,下面我們就開始講述我們今天的內容吧。
1. 過濾器的使用(用戶必須登錄)
(1)當我們網站開發到這里的時候,我們雖然已經實現了用戶登錄信息,但是我如果不登錄我還是能夠操作數據庫中的數據,只要我在路徑中直接輸入訪問的地址,不經過登錄信息,比如:http://localhost:6941/UserInfo/Index如果我這樣訪問的話,如圖所示他是可以進行操作的,但是用戶還沒有登錄啊,所以我們就需要解決這樣的問題。
(2)上面我們已經提出來需求了,下面我們就需要去執行,那么這樣的話我們有什么思路可以解決這種問題呢?這時候我們想到了Session,我們可以判斷session是否為空,如果為空的話直接跳轉到登錄頁面,負責才能進行操作。這樣當我們在登錄的時候我們就已經給session賦值了,大家可以去登錄的博客里面去看,主要代碼如下:
//如果用戶信息存在的話講用戶信息保存到session中
if (UserName != null)
{
Session["UserInfo"] = userInfo;
}
(3)那么我們在登錄的控制其里面已經寫了Session,那么我們登錄之后的所有頁面的控制器里面都是去要判斷用戶是否為空了,這樣的話是不是很冗余呢?當然了,那么我們是不是把一些公共用的東西都放到基類(公共類)中去呢,這時候我們首先想到了全局過濾器Filter,所有的控制器在執行之前都要經過全局過濾器過濾,但是這里有一個缺點就是登錄的頁面也會進過全局過濾器的過濾,所以這里使用全局過濾器不太好,用戶還沒有登錄就要去驗證是否登錄。
(4)用全局過濾器不太方便,那么我們還有什么方法呢?這時候我們發現我們的控制器都繼承自Controller,那么我們就想我們是不是需要重新一個基類繼承自Controller,而讓其他的控制其類繼承自我們建立的基類,這樣我們就新建一個基類BaseController類,然后讓需要檢測用戶登錄的頁面繼承自這個基類,代碼如下:
1 namespace LYZJ.UserLimitMVC.UI.Portal.Controllers 2 3 { 4 5 /// <summary> 6 7 /// 基類BaseController,過濾器 8 9 /// </summary> 10 11 public class BaseController : Controller 12 13 { 14 15 //當前登錄的用戶屬性 16 17 public BaseUser CurrentUserInfo { get; set; } 18 19 20 21 //重新基類在Action執行之前的事情,在Action執行之前的一個方法 22 23 protected override void OnActionExecuting(ActionExecutingContext filterContext) 24 25 { 26 27 base.OnActionExecuting(filterContext); 28 29 //得到用戶登錄的信息 30 31 CurrentUserInfo = Session["UserInfo"] as BaseUser; 32 33 //判斷用戶是否為空 34 35 if (CurrentUserInfo == null) 36 37 { 38 39 Response.Redirect("/Login/Index"); 40 41 } 42 43 } 44 45 } 46 47 }
(5)最后讓我們需要檢測用戶登錄的控制其都繼承自這個基類即可,這樣我們就解決了這個需求,繼承代碼如下:
public class UserInfoController : BaseController
2. 多數據刪除(用戶可以選擇多條數據刪除)
(1)我們對數據庫的操作無非就是增刪改查,那么我們現在開始實現對數據的刪除,對數據的刪除我們現在初步分為二種,一種是直接將數據刪除,一種就是偽刪除,只是修改用戶的刪除狀態為刪除,直接將數據刪除又分為兩種狀態,一種狀態時一條一條數據的刪除,一種是直接選擇很多數據然后刪除,因為一條一條的刪除很簡單,我這里就不做了,我直接坐多條數據的刪除,那么下面我們開始實現直接刪除和偽刪除的功能。
3. 多數據直接刪除和偽刪除
(1)首先我們來實現多數據直接刪除,那么我們首先便是要有直接刪除的按鈕,EasyUI提供了如何顯示圖標的的方法,那么需要去研究一下EasyUI了,這里就不說了,效果圖如下:
(2)接下來我們就需要給直接刪除和偽刪除添加異步方法去實現這個功能了,首先我們想到的是直接刪除和偽刪除在發送異步請求的時候那里不一樣呢?當然是發送異步請求處理的方法不一樣,其他的地方在前台都是一樣的,這樣的話我們就記起來了一句話代碼公用的時候必須封裝方法,所以這里我們也封裝方法,然后給一個標識標識我們到底是偽刪除還是直接刪除,所以前台主要的發送異步請求的代碼如下:
1 //實現直接刪除數據和偽刪除數據的方法 2 3 function deleteBaseUserInfo(not) { 4 5 //得到用戶選擇的數據的ID 6 7 var rows = $("#test").datagrid("getSelections"); 8 9 //首先判斷用戶是否已經選擇了需要刪除的數據,然后循環將用戶選擇的數據傳遞到后台 10 11 if (rows.length >= 1) { 12 13 //遍歷出用戶選擇的數據的信息,這就是用戶用戶選擇刪除的用戶ID的信息 14 15 var ids = ""; //1,2,3,4,5 16 17 for (var i = 0; i < rows.length; i++) { 18 19 //異步將刪除的ID發送到后台,后台刪除之后,返回前台,前台刷洗表格 20 21 ids += rows[i].ID + ","; 22 23 } 24 25 //最后去掉最后的那一個, 26 27 ids = ids.substring(0, ids.length - 1); 28 29 //獲取用戶選擇的用戶信息,如果用戶選擇了已經登錄的用戶的話需要給出不能刪除的信息 30 31 var userNames = ""; 32 33 for (var i = 0; i < rows.length; i++) { 34 35 userNames += rows[i].UserName + ","; 36 37 } 38 39 userNames = userNames.substring(0, userNames.length - 1); 40 41 //首先取出來到底是直接刪除還是偽刪除發送異步請求的地址和是否是偽刪除的參數 42 43 var postData = ""; 44 45 if (not == null) { 46 47 postData = { 48 49 ID: ids, UserName: userNames 50 51 } 52 53 } 54 55 else { 56 57 postData = { 58 59 ID: ids, UserName: userNames, Not: not 60 61 } 62 63 } 64 65 //然后確認發送異步請求的信息到后台刪除數據 66 67 $.messager.confirm("刪除信息", "您確認刪除<font color='red' size='3'>" + userNames + "</font>用戶嗎?", function (DeleteUser) { 68 69 if (DeleteUser) { 70 71 $.get("/UserInfo/DeleteUsers", postData, function (data) { 72 73 if (data == "OK") { 74 75 //友情提示用戶刪除成功,刷新表格 76 77 $.messager.alert("友情提示", "刪除成功"); 78 79 $("#test").datagrid("reload"); 80 81 //當刪除完成之后,第二次刪除的時候還記得上次的信息,這樣是不可以的,所以我們需要清除第一次的信息 82 83 //第一種方法 84 85 rows.length = ""; 86 87 //第二種方法 88 89 $("#test").datagrid("clearSelections"); 90 91 } 92 93 else { 94 95 $.messager.alert("友情提示", "刪除失敗:" + data); 96 97 } 98 99 }); 100 101 } 102 103 }); 104 105 } 106 107 else { 108 109 alert("請選擇你要刪除的數據"); 110 111 } 112 113 };
(3)在這里我們需要注意的就是如果我們當前這個用戶已經登錄了這個系統,如果我們想要刪除這條數據的話,理論上因該是刪除不了的,所以在上面的代碼中我也做了一些操作將用戶名也傳遞到后台去了。這樣我們就可以在后台判斷這個登錄用戶名是否再使用,如果使用則不允許刪除,負責允許登錄用戶刪除信息。
(4)從上面的代碼中可以詳細的看到我做了很多的注釋,如果大家不懂得話可以去研究一下,這里就不詳細說明了,當我們發送完異步請求的時候,這時候我們就要去控制器中實現我們所發送的請求,那么我們控制器中實現的主要代碼如下,里面我也書寫了大量的注釋,這里就不詳細解釋了。代碼如下:
1 //直接刪除用戶的信息 2 3 public ActionResult DeleteUsers(BaseUser userInfo, string ID, string UserName, string Not) 4 5 { 6 7 //首先判斷是那個用戶登錄進入的,如果此用戶正在使用這個系統,則不允許用戶刪除 8 9 userInfo = Session["UserInfo"] as BaseUser; 10 11 var userName = userInfo.UserName; //登錄用戶的信息 12 13 var uIDsName = UserName.Split(','); //將傳遞過來的用戶名分割成一個一個的顯示 14 15 List<string> listUserInfo = new List<string>(); 16 17 foreach (var Name in uIDsName) 18 19 { 20 21 listUserInfo.Add(Name); 22 23 } 24 25 if (listUserInfo.Contains(userName)) 26 27 { 28 29 return Content("含有正在使用的用戶,禁止刪除"); 30 31 } 32 33 //下面我們開始刪除用戶的信息 34 35 //首先判斷確認是否從前台傳遞過來了信息 36 37 if (string.IsNullOrEmpty(ID)) 38 39 { 40 41 return Content("請選擇需要刪除的數據"); 42 43 } 44 45 var idStrs = ID.Split(','); //截取傳遞過來的字符串 46 47 List<int> deleteIDList = new List<int>(); 48 49 foreach (var idStr in idStrs) 50 51 { 52 53 deleteIDList.Add(int.Parse(idStr)); 54 55 } 56 57 if (Not != null) 58 59 { 60 61 //偽刪除,也就是根據用戶的ID修改信息,首先查詢出實體信息 62 63 foreach (var deleteId in deleteIDList) 64 65 { 66 67 var EditUserDeleteIsNot = _userInfoService.LoadEntities(c => c.ID == deleteId).FirstOrDefault(); 68 69 EditUserDeleteIsNot.DeletionStateCode = 1; 70 71 _userInfoService.UpdateEntity(userInfo); 72 73 } 74 75 return Content("OK"); 76 77 } 78 79 else 80 81 { 82 83 //最后執行批量刪除數據的方法 84 85 if (_userInfoService.DeleteUsers(deleteIDList) > 0) 86 87 { 88 89 return Content("OK"); 90 91 } 92 93 } 94 95 return Content("刪除失敗,請您檢查"); 96 97 } 98 99 }
(5)那么根據上面的代碼我們可以看到我們實現了偽刪除和批量刪除,但是我還將批量直接刪除的代碼再一次的進行了封裝,放到了業務邏輯層,那么業務邏輯層的主要代碼如下:
1 //實現批量刪除數據 2 3 public int DeleteUsers(List<int> deleteIds) 4 5 { 6 7 foreach (var deleteID in deleteIds) 8 9 { 10 11 _DbSession.BaseUserRepository.DeleteEntity(new BaseUser() 12 13 { 14 15 ID = deleteID 16 17 }); 18 19 } 20 21 return _DbSession.SaveChanges(); 22 23 }
4.小結
(1)這篇博客我們大致就說這么多吧,我們首先介紹了過濾器,其次又介紹了用戶刪除信息的各種詳細的敘述,如果大家感興趣的話可以自己去看我的代碼,代碼主要的部分還是分享給大家了,我這里就不詳細的描述了,
(2)下面我展示一下這篇博客所實現的功能圖紙,圖像如下:
源碼下載
(1):完整源碼下載
Kencery返回本系列開篇