自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Web開發(fā)框架之權(quán)限管理系統(tǒng)

開發(fā) 前端 項目管理
我整理的一個框架體系,其中包含有WInform開發(fā)框架以及我的Web開發(fā)框架,由于前段時間一直忙于Winform開發(fā)框架的提煉以及優(yōu)化,并統(tǒng)一整理了很多Winform開發(fā)框架以及WCF開發(fā)框架的隨筆文章。

記得我在很早之前,開始介紹我的Winform開發(fā)框架和我的WCF開發(fā)框架之初,我曾經(jīng)給出下面的視圖,介紹我整理的一個框架體系,其中包含有WInform開發(fā)框架以及我的Web開發(fā)框架,由于前段時間一直忙于Winform開發(fā)框架的提煉以及優(yōu)化,并統(tǒng)一整理了很多Winform開發(fā)框架以及WCF開發(fā)框架的隨筆文章。隨著我的Winform逐步完善,終于有時間來整理介紹我的Web開發(fā)框架的事宜了,下面先介紹一下我最新優(yōu)化整理的Web開發(fā)框架之權(quán)限管理系統(tǒng),其中這個權(quán)限管理系統(tǒng)可以說是集眾多寵愛于一身了,除了一貫的和代碼生成工具集成,可生成基礎(chǔ)性的框架代碼外,還整合Winform開發(fā)框架繼承而來的多數(shù)據(jù)庫支持,在界面層,也就是Web權(quán)限管理系統(tǒng),整合了JQuery的Easy-UI界面組件,功能強大的zTree控件、KindEditor在線編輯控件、界面層獲取數(shù)據(jù)及保存使用基于JQuery的json數(shù)據(jù)操作,實現(xiàn)數(shù)據(jù)局部刷新等等操作,其中提供兩種不同的菜單布局操作,非常方便應(yīng)用于其他業(yè)務(wù)系統(tǒng)的界面。

首先在介紹之前,我們來貼幾個Web權(quán)限系統(tǒng)的圖片進(jìn)行感性的了解先。

1)簡潔的界面布局效果。這種效果頂部橫幅比較緊湊,左邊有一些常用的按鈕操作,適合于菜單功能不太多的小業(yè)務(wù)系統(tǒng),如我的Web權(quán)限系統(tǒng)。

2)功能強大的界面企業(yè)業(yè)務(wù)系統(tǒng)布局。這種界面效果適合于功能比較眾多,菜單展示進(jìn)行分類管理等業(yè)務(wù)系統(tǒng)。這種框架頂部的菜單為一級菜單,單擊一級菜單可以在左邊展示二級菜單,這種效果可以不用一次性列出所有系統(tǒng)的功能,而是分層次進(jìn)行功能展示。

頂部的Tab選項卡每次打開頁面的時候,增加一個Tab頁,頁面可以雙擊進(jìn)行關(guān)閉,也可以右鍵彈出菜單進(jìn)行更多操作,如下圖所示。

如果需要了解整個系統(tǒng)的效果,也可以下載《Web權(quán)限系統(tǒng)操作視屏》進(jìn)行全面的了解。

在提煉優(yōu)化這個Web權(quán)限框架的過程中,碰到了不少的問題,一一進(jìn)行解決,現(xiàn)總結(jié)一部分進(jìn)行進(jìn)行介紹。

#p#

1)使用JSON數(shù)據(jù)構(gòu)造zTree

使用zTree確實比easy-ui自帶的Tree好很多,功能也強大很多,由于我的Web權(quán)限中,各個模塊幾乎都需要樹控件來展示相關(guān)的數(shù)據(jù),如功能、組織機構(gòu)等等。在對比了我自己的傳統(tǒng)Tree、Easy-UI的Tree控件以及zTree后,發(fā)現(xiàn)使用zTree還是可以提高不少的界面分?jǐn)?shù)的。但是其自帶的例子,以及網(wǎng)上的例子,多數(shù)是使用預(yù)先弄好的樹形數(shù)據(jù),而我需要動態(tài)使用ashx進(jìn)行樹形數(shù)據(jù)的獲取及生成,這確實費了一些周折來進(jìn)行調(diào)試。

首先要準(zhǔn)備基于ashx處理程序生成的Tree數(shù)據(jù),樹的數(shù)據(jù)使用JSON格式。如功能定義的樹形數(shù)據(jù)如下所示。

  1. /// <summary>  
  2. /// 遞歸獲取樹形信息  
  3. /// </summary>  
  4. private string GetTreeJson(int PID, string folderIcon, string leafIcon)  
  5. {  
  6.     string condition = string.Format("PID={0}", PID);  
  7.     List<FunctionInfo> nodeList = BLLFactory<Function>.Instance.Find(condition);  
  8.     StringBuilder content = new StringBuilder();  
  9.     foreach (FunctionInfo model in nodeList)  
  10.     {  
  11.         int ParentID = (model.PID == -1 ? 0 : model.PID);  
  12.         //string tempMenu = string.Format("{{ id:{0}, pId:{1}, name:\"{2}\",icon:\"{3}\" }},", model.ID, ParentID, model.Name, imgsrc); //簡單的作法  
  13.         string subMenu = this.GetTreeJson(model.ID, folderIcon, leafIcon);  
  14.         string parentMenu = string.Format("{{ \"id\":{0}, \"pId\":{1}, \"name\":\"{2}\" ", model.ID, ParentID, model.Name);  
  15.         if (string.IsNullOrEmpty(subMenu))  
  16.         {  
  17.             if (!string.IsNullOrEmpty(leafIcon))  
  18.             {  
  19.                 parentMenu += string.Format(",\"icon\":\"{0}\" }},", leafIcon);  
  20.             }  
  21.             else 
  22.             {  
  23.                 parentMenu += "},";  
  24.             }  
  25.         }  
  26.         else 
  27.         {  
  28.             if (!string.IsNullOrEmpty(folderIcon))  
  29.             {  
  30.                 parentMenu += string.Format(",\"icon\":\"{0}\" }},", folderIcon);  
  31.             }  
  32.             else 
  33.             {  
  34.                 parentMenu += "},";  
  35.             }  
  36.         }  
  37.  
  38.         content.AppendLine(parentMenu.Trim());  
  39.         content.AppendLine(subMenu.Trim());  
  40.     }  
  41.  
  42.     return content.ToString().Trim();  
  43. }  

然后就是頁面的調(diào)用了,這里為了增強體驗效果,使用了基于javascript的JQuery的異步操作進(jìn)行數(shù)據(jù)處理,而不是基于aspx后臺頁面的處理,如下所示。

  1. //重新加載樹形結(jié)構(gòu)(異步)  
  2. function reloadTree() {  
  3.     $("#loading").show();  
  4.     $.getJSON("http://www.cnblogs.com/AjaxHandler/FunctionJson.ashx?r=" + Math.random() + "&op=tree"function (json) {  
  5.         $.fn.zTree.init($("#treeDemo"), setting, json);  
  6.         $.fn.zTree.getZTreeObj("treeDemo").expandAll(true);  
  7.  
  8.         var treeObj = $.fn.zTree.getZTreeObj("treeDemo");  
  9.         var treeNodes = treeObj.getNodes();  
  10.         if (treeNodes != null) {  
  11.             loadData(treeNodes[0].id);  
  12.         }  
  13.     });  
  14.     $("#loading").fadeOut(500);  

這樣處理的效果是頁面只是局部刷新,體驗很好。

2)基于JQuery的數(shù)據(jù)加載及保存操作

由于JQuery的方便性及良好體驗性,我統(tǒng)一了數(shù)據(jù)的獲取及保存操作。下面給出相關(guān)的處理代碼供參考。

  1. //加載制定的對象數(shù)據(jù)  
  2. function loadData(id) {  
  3.     $("#loading").show();  
  4.     $.getJSON("http://www.cnblogs.com/AjaxHandler/FunctionJson.ashx?r=" + Math.random() + "&op=findbyid&id=" + id, function (json) {  
  5.         $("#txtID").val(json.ID);  
  6.         $("#txtName").val(json.Name);  
  7.         $("#txtControlID").val(json.ControlID);  
  8.         $("#txtPID").val(json.PID);  
  9.     });  
  10.  
  11.     $('#lbxRoles').empty();  
  12.     $.getJSON("http://www.cnblogs.com/AjaxHandler/RoleJson.ashx?r=" + Math.random() + "&op=getrolesbyfunction&id=" + id, function (json) {  
  13.         $.each(json, function (i, item) {  
  14.             $('#lbxRoles').append('<option value="' + item.ID + '">' + item.Name + '</option>');  
  15.         });  
  16.     });  
  17.     $("#loading").fadeOut(500);  
  18. }  
  19.  
  20. //保存對象數(shù)據(jù)  
  21. function saveData() {  
  22.     $.ajax({  
  23.         type: 'POST',  
  24.         url: 'http://www.cnblogs.com/AjaxHandler/FunctionJson.ashx?r=' + Math.random() + '&op=insert',  
  25.         async: false,  
  26.         data: { ID: $("#txtID").val(), Name: $("#txtName").val(), ControlID: $("#txtControlID").val(), PID: $("#txtPID").val() },  
  27.         success: function (id) {  
  28.             alert("操作成功! ");  
  29.             reloadTree();  
  30.  
  31.             if (id != "")  
  32.                 loadData(id);  
  33.         },  
  34.         error: function (xhr, status, error) {  
  35.             alert("操作失敗"); //xhr.responseText  
  36.         }  
  37.     });  

3)在數(shù)據(jù)操作等待的時候,頁面中間顯示Loading效果。

整個系統(tǒng),在各種請求操作,我都統(tǒng)一了作法,在界面顯示Loading的等待效果,任務(wù)結(jié)束后關(guān)閉,這種效果在費事的操作,用戶體檢會好一些,下面看看其效果以及實現(xiàn)代碼。

[[87310]]

增加下面javascript腳本

  1. //對象居中的函數(shù),調(diào)用例子:$("#loading").center();  
  2. jQuery.fn.center = function () {  
  3.     this.css("position""absolute");  
  4.     this.css("top", Math.max(0, (($(window).height() - this.outerHeight()) / 2) +  
  5.                                         $(window).scrollTop()) + "px");  
  6.     this.css("left", Math.max(0, (($(window).width() - this.outerWidth()) / 2) +  
  7.                                         $(window).scrollLeft()) + "px");  
  8.     return this;  
  9. }  
  10.  
  11. //初始化對象  
  12. $(document).ready(function () {  
  13.  
  14.     $("#loading").center();//loading的圖片顯示居中  
  15. }); 

然后再頁面Body后面增加一行代碼即可(默認(rèn)loading圖片不顯示的哦)。

  1. < id="loading" style="display: none;"><img alt="數(shù)據(jù)正在加載中..." src="http://images.cnblogs.com/loading02.gif" /></> 

4)控件數(shù)據(jù)清空操作

由于添加和編輯公用界面控件元素,因此我們在要添加數(shù)據(jù)的時候,需要清空或者設(shè)置某些控件的值,但我們的控件可能比較多,一種好的方法是利用JQuery的選擇器功能來進(jìn)行有目的的控件清空操作。

如下面的例子所示。

  1. //新增清空控件  
  2. function addData() {  
  3.     $("#txtPID").val($("#txtID").val());  
  4.     $("input[type=text][id*='txt']").val("");  
  5.     $("textarea[id*='txt']").empty();  
  6.     $("select[id*='lbx']").empty();  

其中$("#txtPID").val($("#txtID").val());是把當(dāng)前的用戶作為添加數(shù)據(jù)的上級,其他的就是清空控件的數(shù)據(jù)了,不同的類型控件清空的步驟有些不同。

5)Ashx處理程序的安全性考慮

我們在系統(tǒng)中,多數(shù)都是調(diào)用ashx進(jìn)行數(shù)據(jù)處理,雖然一般業(yè)務(wù)系統(tǒng)在VPN或者內(nèi)網(wǎng)中運行,但是也要考慮用戶沒登陸的時候,不運行調(diào)用ashx程序,這樣可以提高數(shù)據(jù)的安全性。

默認(rèn)的ashx處理程序是沒有Session的操作的,所以我們需要修改其繼承接口(多增加IReadOnlySessionState 的繼承),然后才能調(diào)用Session來進(jìn)行判斷。

  1. /// <summary>  
  2. /// 權(quán)限功能操作類  
  3. /// </summary>  
  4. [WebService(Namespace = "http://tempuri.org/")]  
  5. [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  6. public class FunctionJson : IHttpHandler, IReadOnlySessionState   
  7. {          
  8.     public void ProcessRequest(HttpContext context)  
  9.     {  
  10.         //類對象要顯式的實現(xiàn)接口 IReadOnlySessionState,才能訪問Session數(shù)據(jù)  
  11.         if (context.Session["Identity"] == null)  
  12.         {  
  13.             throw new ArgumentException("用戶未登錄!");  
  14.         } 

6)Tab界面布局的兼容。

Web權(quán)限系統(tǒng)提供了兩種常用的菜單布局進(jìn)行管理,一般對于常用的業(yè)務(wù)系統(tǒng)肯定是沒問題了。

另外一種效果是系統(tǒng)復(fù)雜的時候用的,可以定義一級菜單和關(guān)聯(lián)的二級菜單。

對于后者,一級菜單打開的時候,可以關(guān)聯(lián)打開一個新的頁面,并且刷新二級菜單的關(guān)系。

  1. <!----------- 一級導(dǎo)航 ------------------> 
  2. <ul class="navigation" style="display:block"> 
  3.     <li><a href="#" onclick="showSubMenu('ListUser.aspx', '用戶管理', 'default')">權(quán)限管理</a></li> 
  4.     <li><a href="#" onclick="showSubMenu('../Commonpage/MyJob.aspx', '事務(wù)中心開發(fā)中...', 'point', 'icon-organ')">事務(wù)中心</a></li> 
  5.     <li><a href="#" onclick="showSubMenu('../Commonpage/building.htm', '合同起草開發(fā)中...', '')">合同起草</a></li> 
  6.     <li><a href="#" onclick="showSubMenu('../Commonpage/building.htm', '合同管理開發(fā)中...', '')">合同管理</a></li> 
  7.     <li><a href="#" onclick="showSubMenu('../Commonpage/building.htm', '查詢打印開發(fā)中...', '')">查詢打印</a></li> 
  8.     <li><a href="#" onclick="showSubMenu('../Commonpage/building.htm', '知識管理開發(fā)中...', '')">知識管理</a></li> 
  9.     <li><a href="#" onclick="showSubMenu('../Commonpage/building.htm', '系統(tǒng)管理開發(fā)中...', '')">系統(tǒng)管理</a></li> 
  10. </ul> 

好了,很多其他的特點,以后繼續(xù)介紹,歡迎多多提出寶貴意見。

原文鏈接:http://www.cnblogs.com/wuhuacong/archive/2012/07/28/2613593.html

【編輯推薦】

  1. Web開發(fā)人員有用的代碼比較工具
  2. 構(gòu)建高性能Web站點(修訂版)
  3. Web程序員走過的那些路
  4. 8個實用且免費的Web應(yīng)用程序安全測試工具
  5. 做最好的中文Web工具,提高工作效率
責(zé)任編輯:張偉 來源: 伍華聰?shù)牟┛?/span>
相關(guān)推薦

2012-09-25 09:31:58

ASP.NETC#Web

2012-08-21 11:26:17

Winform

2012-12-11 10:15:02

Winform開發(fā)框架

2012-10-08 14:01:54

ASP.NETWebC

2012-09-26 09:46:29

ASP.NETWeb框架

2021-11-18 10:28:03

鴻蒙HarmonyOS應(yīng)用

2010-05-19 14:38:11

Web開發(fā)框架Web層

2009-06-18 12:06:30

Java Web開發(fā)框

2009-09-03 16:52:44

Java Web開發(fā)框

2021-11-09 09:43:52

鴻蒙HarmonyOS應(yīng)用

2012-09-29 13:20:30

ASP.NETWeb框架

2018-08-09 16:32:49

內(nèi)存管理框架

2022-07-03 17:10:15

JavaScript編程語言開發(fā)

2024-03-11 10:19:30

Plasmo瀏覽器Web

2009-06-25 17:14:59

JSF框架

2012-06-12 13:33:38

HTML5

2015-11-17 13:15:23

Apache開發(fā)

2016-01-27 09:39:13

JoobyJava Web流程

2022-04-07 15:41:36

PythonWeb 開發(fā)框

2013-01-10 11:13:38

Golang WebRevel測試Web開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號