許可權管理系統之模塊管理

来源:http://www.cnblogs.com/iPragmatic/archive/2016/08/30/5821657.html
-Advertisement-
Play Games

模塊是平臺功能的單元,是源碼和數據的集合體。模塊管理(菜單、動作、數據)是整個平臺中框架功能體現的核心。整個平臺內的各個功能模塊都是在此進行配置的。 ...


4.4 模塊管理

模塊是平臺功能的單元,是源碼和數據的集合體。

模塊管理(菜單、動作、數據)是整個平臺中框架功能體現的核心。整個平臺內的各個功能模塊都是在此進行配置的。

這個功能模塊主要是面向於平臺上的系統管理人員和開發人員。對其他類型的用戶應該是儘量避免授予訪問、瀏覽甚至是操作此模塊的許可權,當然最好的做法就是授權時做到屏蔽或禁止。

模塊管理主要完成對整個平臺各功能模塊的:

① 添加、修改、刪除,模塊的分類、移動,
② 模塊的啟用、停用,模塊的動作許可權設置,
③ 模塊的狀態設置,模塊的排序功能等。

所有的模塊配置信息保存在資料庫中。

模塊管理的功能作業區(用戶操作)界面如下圖4.4-1所示,通過主要的操作按鈕和信息內容可知其功能有:新增模塊組、模塊,編輯模塊組、模塊,刪除模塊組、模塊,移動模塊組、模塊,模塊組、模塊的排序功能和備註信息等。其中功能操作按鈕的狀態會根據選擇的左側樹型中不同節點和不同登錄用戶的動作許可權而改變。

平臺在理論和實現上支持了無限遞歸的樹型模塊結構,可根據實際需要進行添加、修改、刪除或移動等對平臺模塊進行分類處理和調整。

 

圖4.4-1  模塊管理界面

 

4.4.1 新增、編輯和刪除

點擊展開樹形菜單“模塊類型”,可以看到平臺的各個模塊組和模塊。平臺自帶了一個根節點“模塊類型”,所有的模塊組和模塊都是該節點的子節點。模塊類型並不是真實存在的頂級模塊(組),無實際意義。

另外,由於本平臺是基於插件的框架設計的,所有模塊組和模塊的狀態都是依賴於該模塊所屬插件被載入或者插件配置中的狀態為可用時。如果該模塊組和模塊所屬的插件本身已經被卸載或者被禁用,模塊組或者模塊的啟用、禁用是無效的。

 

新增或編輯模塊組:選擇“模塊類型”或平臺已有的模塊組後點擊“新增分類”按鈕,可以添加模塊組。帶紅色星號標記“*”的條目,名稱和排序ID是必須要填寫的內容。平臺會檢測該模塊組名稱的合法性。確保模塊組名稱的唯一性和可用性,不至於造成平臺管理模塊功能時的混亂。

具體的模塊組操作界面如下圖4.4.1-1所示:

 

圖4.4.1-1  新增、編輯模塊組

 

新增或編輯模塊:選擇平臺已有模塊組後點擊“點擊“新增模塊”按鈕,可以添加具體的模塊。常規選項卡中帶紅色星號標記“*”的條目,標識、名稱和排序ID是必須填寫的內容。平臺會檢測該模塊的標識、名稱的合法性,確保模塊標識、模塊名稱的唯一性和可用性,不至於造成平臺管理模塊功能時的混亂。同時管理員可以指定或修改該平臺模塊的狀態(可用性)。

具體的常規信息操作界面如下圖4.4.1-2所示:

 

圖4.4.1-2  新增、編輯模塊的常規信息

 

除了對模塊常規信息操作,還可以對模塊的動作許可權進行設置。

一個模塊的所有可配置的動作許可權來源於字典模塊(系統代碼管理)中已經設置的許可權代碼組和其所屬的許可權代碼。通過點擊模塊下載入的動作許可權,可以將該模塊所需的具體動作許可權分配或者收回。

關於字典模塊的設置和管理,可以參考後續文章中關於系統代碼管理部分的詳細描述。

具體的許可權信息操作界面如下圖4.4.1-3所示:

 

圖4.4.1-3  新增、編輯模塊的許可權信息

 

private bool InsertorUpdateModuleType()
        {
            if (dmeModule == null)
            {
                dmeModule = new DMESYS_MODULE();
            }

            if (action == Action.ADD)
            {
                if (DoValidatedModule())
                {
                    // 向資料庫保存新的模塊信息和模塊許可權信息。
                    dmeModule.Module_Type_Id = dmeModuleType.Id;
                    dmeModule.Id = DBO.DBOService.GetID();
                    DBOSYS_MODULE.InsertDMESYS_MODULE(dmeModule);
                    // 獲取待新增的許可權
                    toBeAdded.Clear();
                    foreach (TreeNode tn in tvRightAction.Nodes)
                    {
                        if (tn.ImageIndex == 1 && tn.SelectedImageIndex == 1)
                        {
                            DMESYS_MODULE_RIGHT dmr = new DMESYS_MODULE_RIGHT();
                            dmr.Id = DBO.DBOService.GetID();
                            dmr.Module_Id = dmeModule.Id;
                            dmr.Right_Tag = tn.Name;
                            toBeAdded.Add(dmr);
                        }
                    }
                    // 增加許可權。
                    foreach (DMESYS_MODULE_RIGHT dmeMR in toBeAdded)
                    {
                        DBOSYS_MODULE_RIGHT.InsertDMESYS_MODULE_RIGHT(dmeMR);
                    }
                    return true;
                }
                return false;
            }

            if (action == Action.EDIT)
            {
                if (DoValidatedModule())
                {
                    // 向資料庫保存新的模塊信息和模塊許可權信息。
                    DBOSYS_MODULE.UpdateDMESYS_MODULE(dmeModule);
                    // 刪除許可權。
                    toBeDeleted.Clear();
                    foreach (TreeNode tn in tvRightAction.Nodes)
                    {
                        if (tn.ImageIndex == 0 && tn.SelectedImageIndex == 0)
                        {
                            AppendExistRightTag(tn.Name);
                        }
                    }
                    foreach (DMESYS_MODULE_RIGHT dmeMR in toBeDeleted)
                    {
                        DBOSYS_MODULE_RIGHT.DeleteDMESYS_MODULE_RIGHT(dmeMR);
                    }
                    // 增加許可權。
                    toBeAdded.Clear();
                    foreach (TreeNode tn in tvRightAction.Nodes)
                    {
                        if (tn.ImageIndex == 1 && tn.SelectedImageIndex == 1)
                        {
                            if (!ExistRightTag(tn.Name))
                            {
                                DMESYS_MODULE_RIGHT dmr = new DMESYS_MODULE_RIGHT();
                                dmr.Id = DBO.DBOService.GetID();
                                dmr.Module_Id = dmeModule.Id;
                                dmr.Right_Tag = tn.Name;
                                toBeAdded.Add(dmr);
                            }
                        }
                    }
                    foreach (DMESYS_MODULE_RIGHT dmeMR in toBeAdded)
                    {
                        DBOSYS_MODULE_RIGHT.InsertDMESYS_MODULE_RIGHT(dmeMR);
                    }
                    return true;
                }
                return false;
            }

            return false;
        }

 

刪除模塊組和模塊:如果需要對平臺上的模塊組或者模塊進行刪除,點擊展開樹形菜單“模塊類型”,在樹型目錄下選擇一個模塊組或者模塊後點擊“刪除”按鈕,在圖4.4.1-4中顯示了幾個刪除操作的提示對話框界面。分別選擇了模塊“測試模塊”,模塊組“許可權管理”,模塊“模塊管理”作為了測試用例。

備註:對於擁有子模塊組和模塊的模塊組是無法直接刪除的,首先需要刪除下麵的子模塊組或者下屬的模塊;對於已經含有許可權的模塊也是無法直接刪除的,也是需要先取消其授權的動作許可權資源後才能進行刪除操作。

 

 

 

圖4.4.1-4  刪除模塊組和模塊

 

private void btnDelete_Click(object sender, System.EventArgs e)
        {
            if (IsModuleType())
            {
                if (selectedNode.ChildNodes.Count > 0)
                {
                    GUIHelper.MessageToUserInfo("提示:該模塊分類包含子模塊分類或子模塊,無法直接刪除!");
                    return;
                }
                if (GUIHelper.MessageQuestion("確定要刪除模塊分類“" + (selectedObj as DMESYS_MODULE_TYPE).Name + "”嗎?", "刪除模塊分類"))
                {
                    DBOSYS_MODULE_TYPE.DeleteDMESYS_MODULE_TYPE(selectedObj as DMESYS_MODULE_TYPE);
                    btnRefresh_Click(sender, e);
                    return;
                }
            }
            if (IsModule())
            {
                if (ucModule.ContainRights())
                {
                    GUIHelper.MessageToUserInfo("提示:該模塊包含許可權,無法直接刪除!");
                    return;
                }
                if (GUIHelper.MessageQuestion("確定要刪除模塊“" + (selectedObj as DMESYS_MODULE).Name + "”嗎?", "刪除模塊"))
                {
                    DBOSYS_MODULE.DeleteDMESYS_MODULE(selectedObj as DMESYS_MODULE);
                    btnRefresh_Click(sender, e);
                    return;
                }
                return;
            }
        }

 

4.4.2 移動模塊

平臺上的模塊結構在使用過程中可能會發生歸屬或者分組的變更,此時就需要涉及到對模塊進行移動操作。

點擊展開樹形菜單“模塊類型”,選擇一個模塊組或者模塊後點擊“移動”按鈕,如下圖4.4.2-1所示,界面以動態樹形方式列出了當前平臺的模塊結構,選擇需要移動到的目標模塊組,點擊確認,即可完成模塊組或模塊歸屬關係的調動。

 

圖4.3.2-1  移動模塊組、模塊

 

#region LoadModuleTypes
        private void LoadModuleTypes(TreeNode currentNode, DMESYS_MODULE_TYPE currentModuleType)
        {
            List<DMESYS_MODULE_TYPE> subModuleTypes = null;
            if (currentModuleType != null)
                subModuleTypes = DBOSYS_MODULE_TYPE.GetSubModuleTypes(currentModuleType);
            else
                subModuleTypes = DBOSYS_MODULE_TYPE.GetAllTopModuleTypes();

            foreach (DMESYS_MODULE_TYPE rt in subModuleTypes)
            {
                TreeNode node = currentNode.ChildNodes.Add();
                node.Tag = rt;
                node.Text = rt.Name;
                node.CollapsedImageIndex = 1;
                node.ExpandedImageIndex = 2;

                LoadModuleTypes(node, rt);
            }
        }
        #endregion

        private bool flag = false;

        private void TargetContainsDest(DMESYS_MODULE_TYPE target, DMESYS_MODULE_TYPE dest)
        {

            List<DMESYS_MODULE_TYPE> subModuleType = DBOSYS_MODULE_TYPE.GetSubModuleTypes(target);
            if (subModuleType.Count > 0)
            {
                foreach (DMESYS_MODULE_TYPE mt in subModuleType)
                {
                    if (mt.Id == dest.Id)
                    {
                        flag = true;
                        break;
                    }
                    if (DBOSYS_MODULE_TYPE.GetSubModuleTypes(mt).Count > 0)
                    {
                        foreach (DMESYS_MODULE_TYPE mt2 in subModuleType)
                        {
                            TargetContainsDest(mt2, dest);
                        }
                    }
                }
            }
        }

        private bool MoveModuleType()
        {
            if (target is DMESYS_MODULE_TYPE)
            {
                if (destObj != null)
                {
                    DMESYS_MODULE_TYPE dmeTarget = target as DMESYS_MODULE_TYPE;
                    DMESYS_MODULE_TYPE dmeDest = destObj as DMESYS_MODULE_TYPE;
                    TargetContainsDest(dmeTarget, dmeDest);
                    if (dmeTarget.Id != dmeDest.Id && !flag)
                    {
                        dmeTarget.Parent_Id = dmeDest.Id;
                        DBOSYS_MODULE_TYPE.UpdateDMESYS_MODULE_TYPE(dmeTarget);
                        return true;
                    }
                    else if (dmeTarget.Id == dmeDest.Id || flag)
                    {
                        lbTip.Visible = true;
                        return false;
                    }
                }
                else if (destObj == null)
                {
                    DMESYS_MODULE_TYPE mt = target as DMESYS_MODULE_TYPE;
                    mt.Parent_Id = "";
                    DBOSYS_MODULE_TYPE.UpdateDMESYS_MODULE_TYPE(mt);
                    return true;
                }
            }
            else if (target is DMESYS_MODULE)
            {
                if (destObj == null)
                {
                    lbTip.Visible = true;
                }
                else if (destObj != null)
                {
                    DMESYS_MODULE dmeModule = target as DMESYS_MODULE;
                    dmeModule.Module_Type_Id = (destObj as DMESYS_MODULE_TYPE).Id;
                    DBOSYS_MODULE.UpdateDMESYS_MODULE(dmeModule);
                    return true;
                }
            }

            return false;
        }

 


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

-Advertisement-
Play Games
更多相關文章
  • 最終的效果圖 下麵開始幹活:生成幫助文檔 一、創建 WebApi 項目 二、找到 HelpPageConfig.cs 並取消代碼註釋 三、對項目單擊右鍵,選擇屬性,按圖操作 四、啟動項目,輸入Url: localhost:{埠號}/help 【註】Description 沒有顯示內容是因為我們沒有 ...
  • 本次主要分享幾個場景的處理代碼,有更好處理方式多多交流,相互促進進步;代碼由來主要是這幾天使用前端Ace框架做後臺管理系統,這Ace是H5框架裡面的控制項效果挺多的,做相容也很好,有點遺憾是控制項效果基本都是寫一起的,分離起來挺麻煩的;這次主要說的是後端代碼,以後可以分享下這個框架的使用。 以上是個人的 ...
  • 本文版權歸博客園和作者本人共同所有,轉載和爬蟲請註明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之處,已經有所修改。 今天分享的是Hash散列數據類型操作,不過我也覺得有了前兩篇的基礎搭建後,你就能自己按照StackExch ...
  • Asp.Net MVC5+ EntityFramework6.0 db first + Autofac(IOC) + SqlServer2014還請大家多多指教啦 anneke.cn ...
  • 前戲:針對上一篇列出來的功能點,今天和大家分享下這個自定義的公式是怎麼設計的,由於我的第一篇博客在首頁被管理員移走了,大家可以點擊這裡來跳轉,看下第一篇的目錄結構。本人作為老菜鳥,和大家分享的也是一些老菜鳥的想法,大神千萬別噴我. 設計背景:當初為什麼要設計這個自定義的計算公式呢,原因就是,這個價格 ...
  • ASP.NET Core開發Docker部署,.NET Core支持Docker 部署運行。我們將ASP.NET Core 部署在Docker 上運行。 大家可能都見識過Docker ,今天我們就詳細瞭解一下Docker的用途,以及真實的應用場景。 Docker源於PaaS,PaaS的應用場景即是D ...
  • 從淘寶UWP第一版發佈到現在,已經有十個月了,期間收到了用戶各種各樣的反饋,感謝這些用戶的反饋,指導我們不斷的修正、完善應用。但是也有一部分需求或建議,由於資源或技術的限制,目前確實無法做到,只能對廣大Win10er說聲抱歉了。下麵針對幾種用戶常提到的反饋做下說明。 最經常的反饋是為什麼在某某版本上 ...
  • 序列 延遲查詢執行 查詢操作符 查詢表達式 表達式樹 (一) 序列 先上一段代碼, 這段代碼使用擴展方法實現下麵的要求: 取進程列表,進行過濾(取大於10M的進程) 列表進行排序(按記憶體占用) 只保留列表中指定的信息(ID,進程名) 為了能清楚理解上面代碼的內部動作,我們需要介紹幾組概念. 1. I ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...