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):用戶注冊的各種驗證
(17):注冊用戶功能的細節處理 (18):過濾器的使用和批量刪除數據(偽刪除和直接刪除)
前言:昨天我們完成了對用戶的修改和瀏覽,基本大概的細節我也都注意到了,如果大家還有什么問題的話可以留言,今天我們就開始實現多條件查詢和回收站以及對回收站中的東西進行還原,這部分內容基本沒什么新意,也都是一些基礎的實現,從今天我們的項目的初級階段就算是完成了,還有用戶的角色和權限我就在這里不講了,和操作用戶一樣,大家自行解決即可。那么下面我們就開始今天的內容吧。
1. 對用戶進行多條件模糊查詢
(1)多條件模糊查詢我想這種需求只要是一般的項目都會有吧,什么意思,大家也都知道,就是我在要求輸入的文本框或者DropDownList中輸入/選擇某些信息,然后當我單擊搜索的時候我們能夠直接搜到我們需要的數據,這個就是多條件模糊查詢,既然是查詢,那就要有輸入信息的地方,如圖所示:
(2)如上圖所示,就是我們需要查詢的條件,那么下面我們就要來實現他們,首先我們就要綁定一個Jquery方法來實現點擊搜索按鈕的實現,然后將得到的值發送到前台去查詢數據,那么怎么樣才能夠將文本框中的值傳遞到后台去呢?在我們前面做的時候EasyUI幫我們傳遞過去了page,rows參數,那么我們就想EasyUI提供了什么參數沒有,我們可以直接給參數賦值傳遞到后台去,這個當然了,EasyUI提供的參數就是queryParams,至於這個參數怎么使用大家可以去查一下,這樣的話Jquery發送異步請求的方法代碼如下:
1 //綁定搜索按鈕的的點擊事件 2 3 function BindSerarchLickEvent() { 4 5 //按條件進行查詢數據,首先我們得到數據的值 6 7 $("#btnSerach").click(function () { 8 9 //得到用戶輸入的參數 10 11 var queryData = { 12 13 RealName: $("#txtRealName").val(), 14 15 Telephone: $("#txtTelephone").val(), 16 17 SerachMail: $("#txtSerachMail").val(), 18 19 Enabled: $("#txtEnabled").combobox('getValue'), 20 21 AuditStatus: $("#txtAuditStatus").combobox('getValue') 22 23 } 24 25 //將值傳遞給 26 27 initTable(queryData); 28 29 return false; 30 31 }); 32 33 }
(3)然后我們再EasyUI的initTable中傳入參數queryData,然后在給參數queryParams付給我們的前台參數queryData,這樣我們前台發送異步請求的部分就結束了。
(4)那么接下來我們就要去對控制器中得到前台Json對象的方法進行修改,這時候我們修改的時候因為傳遞了很多參數,所以我們最好在業務邏輯層在寫一個實現多條件查詢的方法,那么我首先實現了下面的代碼:
IQueryable<BaseUser> LoadSearchData(string Name,string TelPhone,string Emial);
(5)那么這時候大部分人只要看一眼這個方法都會想到要是參數是可以變化的呢?我要在多傳遞兩個參數呢?難道你就在這里加嗎??我這里要說的當然不是了,我們可以用下面的方法來實現對參數變化的情況。
(6)首先我們在通用類Comon中添加一個公用基類ParamterQuery,然后我們定義幾個常用的屬性,代碼如下:
1 namespace LYZJ.UserLimitMVC.Common 2 3 { 4 5 /// <summary> 6 7 /// 定義參數的公用類 8 9 /// </summary> 10 11 public class ParamterQuery 12 13 { 14 15 public int PageIndex { get; set; } 16 17 public int PageSize { get; set; } 18 19 public int Total { get; set; } 20 21 } 22 23 }
(7)接下來在我們在Model層在添加一個類UserInfoQuery,這個類繼承自ParamterQuery,並且在此基礎上又新添加了一些自己特有的屬性,代碼如下:
namespace LYZJ.UserLimitMVC.Model { /// <summary> /// 對多條件查詢的其他參數的錄入 /// </summary> public class UserInfoQuery : ParamterQuery { public string RealName { get; set; } public string Telephone { get; set; } public string EMail { get; set; } public string Enabled { get; set; } public string AuditStatus { get; set; } } }
(8)這樣我們就完成了對參數的操作,這時候如果我們想要添加一個查詢條件我們直接到Model層的子類中去添加一個屬性即可,我們在業務邏輯層是如何實現的,我都寫了詳細的注釋,就不多說了,代碼如下:
1 /// <summary> 2 3 /// 實現對多條件查詢的判斷方法的封裝 4 5 /// </summary> 6 7 /// <param name="query">引用傳遞,傳遞參數的信息</param> 8 9 /// <returns></returns> 10 11 public IQueryable<BaseUser> LoadSearchData(UserInfoQuery query) 12 13 { 14 15 var temp = _DbSession.BaseUserRepository.LoadEntities(u => true); 16 17 //首先過濾姓名 18 19 if (!string.IsNullOrEmpty(query.RealName)) 20 21 { 22 23 temp = temp.Where<BaseUser>(u => u.RealName.Contains(query.RealName)); //like '%mmm%' 24 25 } 26 27 if (!string.IsNullOrEmpty(query.Telephone)) 28 29 { 30 31 temp = temp.Where<BaseUser>(u => u.Telephone.Contains(query.Telephone)); 32 33 } 34 35 if (!string.IsNullOrEmpty(query.EMail)) 36 37 { 38 39 temp = temp.Where<BaseUser>(u => u.Email.Contains(query.EMail)); 40 41 } 42 43 if (query.Enabled != -1) 44 45 { 46 47 temp = temp.Where<BaseUser>(u => u.Enabled==query.Enabled); 48 49 } 50 51 if (!string.IsNullOrEmpty(query.AuditStatus) && query.AuditStatus != "-1") 52 53 { 54 55 temp = temp.Where<BaseUser>(u => u.AuditStatus.Contains(query.AuditStatus)); 56 57 } 58 59 query.Total = temp.Count(); 60 61 return temp.OrderBy(u => u.SortCode).Skip(query.PageSize * (query.PageIndex - 1)).Take(query.PageSize); 62 63 }
(9)當我們完成業務邏輯層的時候,這時候我們就需要實現前台控制器中的代碼,所以控制器中的實現代碼如下:
1 /// <summary> 2 3 /// 獲取所有的用戶信息 4 5 /// </summary> 6 7 /// <returns>返回用戶詳細信息的Json對象</returns> 8 9 public ActionResult GetAllUserInfos() 10 11 { 12 13 //Json格式的要求{total:22,rows:{}} 14 15 //實現對用戶分頁的查詢,rows:一共多少條,page:請求的當前第幾頁 16 17 int pageIndex = Request["page"] == null ? 1 : int.Parse(Request["page"]); 18 19 int pageSize = Request["rows"] == null ? 10 : int.Parse(Request["rows"]); 20 21 //得到多條件查詢的參數 22 23 string RealName = Request["RealName"]; 24 25 string Telephone = Request["Telephone"]; 26 27 string EMail = Request["EMail"]; 28 29 int? Enabled = Request["Enabled"] == null ? -1 : int.Parse(Request["Enabled"]); 30 31 string AuditStatus = Request["AuditStatus"]; 32 33 int total = 0; 34 35 //調用分頁的方法,傳遞參數,拿到分頁之后的數據 36 37 //var data = _userInfoService.LoadPageEntities(pageIndex, pageSize, out total, 38 39 // u => true && u.DeletionStateCode == 0, true, u => u.SortCode); 40 41 //封裝一個業務邏輯層的方法,來處理分頁過濾事件 42 43 UserInfoQuery userInfoQuery = new UserInfoQuery() 44 45 { 46 47 PageSize = pageSize, 48 49 PageIndex = pageIndex, 50 51 RealName = RealName, 52 53 Telephone = Telephone, 54 55 EMail = EMail, 56 57 Enabled = Enabled, 58 59 AuditStatus = AuditStatus, 60 61 Total = 0 62 63 }; 64 65 var data = _userInfoService.LoadSearchData(userInfoQuery); 66 67 //構造成Json的格式傳遞 68 69 var result = new { total = total, rows = data }; 70 71 return Json(result, JsonRequestBehavior.AllowGet); 72 73 }
(10)最后,我們就實現了多條件查詢的代碼,下載我們看一下結果,如圖所示:
2.回收站的實現
(1)至於我們查看回收站的數據,我覺得就和上面的多條件查詢基本一樣了,而且應該比那還簡單,因為我們沒有經過多條件的查詢,而且不需要設置什么值,只需要傳遞過去值為0的數據就行了,那么詳細代碼我就不寫了,大家參考上面的實現以下就行了,實現效果如圖所示:
3.數據還原的實現
(1)既然我們有了回收站,那么我們如果誤刪了數據或者什么之后,我們都會去重新找回這條數據,那么我們只需要還原就行了,在這里還原和偽刪除的原理一樣,而且我也重用了以前刪除和偽刪除的代碼,所以大家看到下面的成功的提示信息很是不友善,那就是因為代碼重用的緣故,部分主要的代碼和圖像如下:
1 if (Not == "not") 2 3 { 4 5 //偽刪除,也就是根據用戶的ID修改信息,首先查詢出實體信息 6 7 foreach (var deleteId in deleteIDList) 8 9 { 10 11 var EditUserDeleteIsNot = _userInfoService.LoadEntities(c => c.ID == deleteId).FirstOrDefault(); 12 13 EditUserDeleteIsNot.DeletionStateCode = 1; 14 15 _userInfoService.UpdateEntity(userInfo); 16 17 } 18 19 return Content("OK"); 20 21 } 22 23 else if (Not == "back") 24 25 { 26 27 foreach (var deleteID in deleteIDList) 28 29 { 30 31 var BackUserDelete = _userInfoService.LoadEntities(c => c.ID == deleteID).FirstOrDefault(); 32 33 BackUserDelete.DeletionStateCode = 0; 34 35 _userInfoService.UpdateEntity(userInfo); 36 37 } 38 39 return Content("OK"); 40 41 } 42 43 else 44 45 { 46 47 //最后執行批量刪除數據的方法 48 49 if (_userInfoService.DeleteUsers(deleteIDList) > 0) 50 51 { 52 53 return Content("OK"); 54 55 } 56 57 }
4.小結
(1)到這里我們前期所有的准備工作都已經完事,當我說完這句話的時候可能大部分人會認為完事了嗎?你的角色和權限的簡單增刪改查還沒有實現呢,我這里想說的是用戶的現在已經全部實現了,就剩下的兩個我不打算在說出來了,所以我會利用這個周末完成角色和權限的簡單操作,那么下來我們就需要實現對用戶給角色和權限的問題了,我們在后面在說。
(2)那么我們在開發項目的時候有時候會有一些想法想要加到我們的項目中,但是我們現在還沒有實現,想要以后實現,但是害怕我們忘了,所以下面我總結了我在項目中的一些注意項,如圖所示:
源碼下載
(1):完整源碼下載
Kencery返回本系列開篇