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