winform快速開發平臺 -> 通用許可權管理之動態菜單

来源:http://www.cnblogs.com/liuyunsheng/archive/2016/04/10/5375748.html
-Advertisement-
Play Games

這幾個月一直忙APP的項目,沒來得及更新項目,想想該抽出時間整理一下開發思路,跟大家分享,同時也希望得到寶貴的建議。 先說一下我們的許可權管理的的設計思路,首先一個企業信息化管理系統一定會用到許可權管理, 那麼一個動態的菜單在企業信息化管理系統占有一定的分量。 下麵介紹我的一些思路。 由於原聲的winf ...


這幾個月一直忙APP的項目,沒來得及更新項目,想想該抽出時間整理一下開發思路,跟大家分享,同時也希望得到寶貴的建議。

先說一下我們的許可權管理的的設計思路,首先一個企業信息化管理系統一定會用到許可權管理, 那麼一個動態的菜單在企業信息化管理系統占有一定的分量。

下麵介紹我的一些思路。

由於原聲的winform界面美觀性不夠, 系統採用dotnetbar第三方控制項來輔助編程。

首先我們看紅色方框部分為我們的動態模塊功能。這樣我們獲得到了以下幾個信息, 我們需要記錄模塊功能, 並且需要父子集關係, 那麼對應的我們就需要在資料庫中建立一張表來維護我們的動態菜單模塊。我們舉例命名為BaseModuleTabel, 那麼會有一下的內容,Id ParentId Name,並且由於需要跟不同的用戶有對應的關係, 我們還要建立用戶以及菜單的關係表,來維護用戶與菜單的許可權關係。  

這裡就不介紹表的設計。我們先來看看在dotnetbar中如何呈現動態菜單邏輯。

我們先從資料庫中獲取到所有菜單模塊。並通過迴圈便利動態的載入模塊按鈕。 並添加對應的模塊按鈕事件,

 1         /// <summary>
 2         /// 載入菜單
 3         /// </summary>
 4         private void LoadMenu()
 5         {
 6             var parentEntity = _baseModuleBll.Repository().FindEntity("ParentId", "0");
 7 
 8             var result = _baseModuleBll.GetModuleList().Select(p => new BaseTreeViewMenuModel()
 9             {
10                 Id = p.ModuleId,
11                 ParentId = p.ParentId,
12                 Name = p.FullName,
13                 Class = p.Location,
14                 Namespace = StringHelper.SubFirstChart(p.Location, '.'),
15                 IsForm = p.Target == "iframe"
16             }).ToList();
17             RibbonTabItem ribbonTabItemFrist = null;
18             var rabbonTabItemEntities = result.Where(p => p.ParentId == parentEntity.ModuleId);
19             foreach (var ribbonTabItemEntity in rabbonTabItemEntities)
20             {
21                 var ribbonPanel = new RibbonPanel
22                 {
23                     Text = ribbonTabItemEntity.Name,
24                     Dock = DockStyle.Fill
25                 };
26                 var ribbonTabItem = new RibbonTabItem
27                 {
28                     Text = ribbonTabItemEntity.Name,
29                     Panel = ribbonPanel
30                 };
31                 if (ribbonTabItemFrist == null)
32                     ribbonTabItemFrist = ribbonTabItem;
33                 this.ribbonControlMenu.Controls.Add(ribbonPanel);
34                 this.ribbonControlMenu.Items.Add(ribbonTabItem);
35 
36                 var ribbonBar = new RibbonBar { Text = ribbonTabItemEntity.Name };
37                 var buttonItemEntities = result.Where(p => p.ParentId == ribbonTabItemEntity.Id);
38                 foreach (var buttonItem in buttonItemEntities.Select(buttonItemEntitiy =>
39                     new ButtonItem("ButtonItem" + buttonItemEntitiy.Name)
40                     {
41                         Text = buttonItemEntitiy.Name,
42                         Tag = buttonItemEntitiy
43                     }))
44                 {
45                     buttonItem.Click += ButtonItem_Click;
46                     ribbonBar.Items.Add(buttonItem);
47                     ribbonPanel.Controls.Add(ribbonBar);
48                 }
49             }
50             this.ribbonControlMenu.SelectedRibbonTabItem = ribbonTabItemFrist;
51 
52         }
53 
54         #endregion

當然我們的框架採用了反射機制來實現組件式開發。通常在一個項目里,為了降低耦合度,我一邊將模塊力度最小話,並將按一定的規則分類, 處理成摸個模塊,在我們的系統中並不影響彼此開發的同時, 每個成員都可以獨立的去完成自己的小任務, 說句不好聽的, 就算是能力很差的新手,開發出來的耦合度極高的代碼, 通過這樣一種方式,他的影響範圍也緊緊在與他的模塊內, 並不影響其他模塊操作。 僅作為個人的一種方式,當然通過我們的代碼生成器,會生成一定的代碼規範,這雖然能避免一些, 但起不到決定性的作用。 畢竟每個人的能力也是大不相同的。作為PM我們需要做的就是降低項目整體風險,按照規定的項目周期,制定完善的項目計劃,系統模塊劃分力度越大,項目把控的越高。 

下麵打開點擊模塊按鈕來,通過反射來實現對各個模塊的初始化以及載入。代碼效率目前開無太大障礙。當然如果一個模塊dll你要弄個幾百兆,那我也只能無語了。你的力度相對較小,會跟你反射的時間掛鉤的。

 1         /// <summary>
 2         /// 打開模塊菜單
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void ButtonItem_Click(object sender, EventArgs e)
 7         {
 8             var isOpened = false;
 9             var buttonItem = (ButtonItem)sender;
10             var baseTreeViewMenuModel = (BaseTreeViewMenuModel)buttonItem.Tag;
11             if (baseTreeViewMenuModel == null) return;
12             if (!baseTreeViewMenuModel.IsForm) return;
13             if (string.IsNullOrWhiteSpace(baseTreeViewMenuModel.Namespace)) return;
14             //遍歷現有的Tab頁面,如果存在,那麼設置為選中即可
15             foreach (var tabitem in
16                 superTabControlContent.Tabs.Cast<SuperTabItem>()
17                 .Where(tabitem => tabitem.Name == "superTabItem" + baseTreeViewMenuModel.Name))
18             {
19                 superTabControlContent.SelectedTab = tabitem;
20                 isOpened = true;
21                 break;
22             }
23             if (isOpened) return;
24             var dll = Application.StartupPath + "\\" + baseTreeViewMenuModel.Namespace + ".dll";
25             if (!File.Exists(dll)) return;
26             var assembly = Assembly.LoadFrom(dll);
27             var type = assembly.GetType(baseTreeViewMenuModel.Class);
28             if (type == null) return;
29             var form = (FormBase)Activator.CreateInstance(type);
30             form.ModuleId = baseTreeViewMenuModel.Id;
31             form.FormBorderStyle = FormBorderStyle.None;
32             form.TopLevel = false;
33             form.Visible = true;
34             form.Dock = DockStyle.Fill;
35             var superTabItem = superTabControlContent.CreateTab(baseTreeViewMenuModel.Name);
36             superTabItem.Text = baseTreeViewMenuModel.Name;
37             superTabItem.Name = "superTabItem" + baseTreeViewMenuModel.Name;
38             superTabItem.AttachedControl.Controls.Add(form);
39             superTabControlContent.SelectedTab = superTabItem;
40         }
41          
42         #endregion

通過以上的代碼我們就可以實現如下圖所示的動態菜單功能 。

分享是美德,要提倡!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 代碼如下,實現了Linux系統的一些常見的監控變數,分享給大家@.·.@ ...
  • ...
  • 註:下麵用 [$] 標註的表示收費工具,但部分收費工具針對開源軟體的開發/部署/托管是免費的) 目錄 API 應用框架(Application Frameworks) 應用模板(Application Templates) 人工智慧(Artificial Intelligence) 程式集處理(As ...
  • flex 訪問WebService的方法有很多種,使用FLEX4中的"數據/服務"功能可以自動生成訪問WebService的代理類,這樣可以避免把所有的數據訪問都寫到MXML頁面上,便於重覆利用,同時可以直接導入後臺自定義數據類型,方便傳參。 直接上代碼:其中WebService介面 ? 1 2 3 ...
  • 閱讀目錄 開始 簡單使用 非同步調用WebServeices WebServices驗證 相關概念及資源 WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸 實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?We ...
  • 首先來說,委托的作用就是可以給類的方法傳遞其他類的方法而不必將類實例化。第二點,委托就是事件和響應事件的方法的橋梁(就是傳遞響應事件的方法給事件)。這裡要註意,委托跟類平級,事件與方法平級。 全文 事件與委托似乎很難以理解,這是因為它們的使用方式與常用的編碼有很大的差別,例如通常編寫的都是同步代碼, ...
  • 分類:Unity、C#、VS2015 創建日期:2016-04-11 一、簡介 在地形編輯器一節中,已經告訴了你如何使用已經創建好的樹來形成大片樹林。這一節告訴你在 Unity 5.3.4中如何利用【樹木創建器】一步一步地創建一棵樹: 當你學會了創建樹的基本操作後,你就可以根據自己的需要創建任意形狀... ...
  • 先拿出我半前年前平臺的設計初稿,經過半年的努力我已經完成了該設計稿的所有功能。並且理念已經遠遠超出該設計稿。 下麵是一些博友對我貼子的評價: 1、樓主,想法很美好,現實很骨感,我們公司就有一套你說的這樣的平臺,界面都是用XML配置出來的,雖然開發效率很高,但只能做固定版式的系統,有任何版式的修改,幾 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...