权限管理系统之模块管理
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; }
作者: 辰希小筑 http://iPragmatic.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载。转载须保留此段声明,并在明显位置给出署名和原文连接。
如果觉得有帮助的话,欢迎点击右下角的【推荐一下】,希望能够持续的跟大家分享更多有益的文章!