权限管理系统之字典(代码)管理
系统代码是平台内置的、通用的、统一的数据描述。代码管理(数据字典)是整个平台中数据描述的有效机制。通过界面进行可视化的操作和维护,能快速录入和修改平台上统一的字典数据。有效提高了数据的重复利用率和产品、项目的开发效率。整个数据字典数据为框架平台所共享,用户可以更好地对系统进行自定义管理,以满足自己的个性化需求。
4.5 代码(字典)管理
系统代码是平台内置的、通用的、统一的数据描述。
代码管理(数据字典)是整个平台中数据描述的有效机制。通过界面进行可视化的操作和维护,能快速录入和修改平台上统一的字典数据。有效提高了数据的重复利用率和产品、项目的开发效率。整个数据字典数据为框架平台所共享,用户可以更好地对系统进行自定义管理,以满足自己的个性化需求。
代码管理的功能作业区(用户操作)界面如下图4.5-1所示,通过主要的操作按钮和信息内容可知其功能有:
① 新增代码组、代码,编辑代码组、代码,
② 删除代码组、代码,移动代码,
③ 代码组、代码的唯一标识,排序功能和备注信息等。
其中功能操作按钮的状态会根据选择的左侧树型中不同节点和不同登录用户的动作权限而改变。
平台在目前仅支持二级深度的树型代码结构,可根据实际需要进行添加、修改、删除或移动等对平台代码进行分类和调整。
图4.5-1 代码管理界面
#region LoadCodeTypes, LoadCodes private void LoadCodeTypes(TreeNode currentNode, DMESYS_SYSCODE_TYPE currentCodeType) { List<DMESYS_SYSCODE_TYPE> subCodeTypes = null; if (currentCodeType != null) subCodeTypes = DBOSYS_SYSCODE_TYPE.GetSubCodeTypes(currentCodeType); else subCodeTypes = DBOSYS_SYSCODE_TYPE.GetSYS_SYSCODE_TYPEEntities(); foreach (DMESYS_SYSCODE_TYPE rt in subCodeTypes) { TreeNode node = currentNode.ChildNodes.Add(); node.Tag = rt; node.Text = rt.Name; node.CollapsedImageIndex = 1; node.ExpandedImageIndex = 2; LoadCodeTypes(node, rt); } } private void LoadCodes() { codes.Clear(); codes = DBOSYS_SYSCODE.GetSYS_SYSCODEEntities(); foreach (DMESYS_SYSCODE r in codes) { TreeNode tn = CallFindNode(r.Syscode_Type_Id, tvCodes); if (tn != null) { TreeNode node = tn.ChildNodes.Add(); node.Tag = r; node.Text = r.Name; node.CollapsedImageIndex = 3; node.ExpandedImageIndex = 3; } } } private TreeNode FindTreeNode(string codeTypeId, TreeNode tnParent) { if (tnParent == null || tnParent.Tag is DMESYS_SYSCODE) return null; if ((tnParent.Tag as DMESYS_SYSCODE_TYPE).Id == codeTypeId) return tnParent; TreeNode tnRet = null; foreach (TreeNode tn in tnParent.ChildNodes) { tnRet = FindTreeNode(codeTypeId, tn); if (tnRet != null) break; } return tnRet; } private TreeNode CallFindNode(string codeTypeId, TreeControl treeView) { TreeNodeCollection nodes = treeView.RootNodes[0].ChildNodes; foreach (TreeNode n in nodes) { TreeNode temp = FindTreeNode(codeTypeId, n); if (temp != null) return temp; } return null; } #endregion
4.5.1 新增、编辑和删除
新增代码组和代码:点击展开树形菜单“系统代码”,可以看到平台内置的一部分代码组和代码。选择“系统代码”后点击“新增分类”按钮,可以添加代码组;选择已有的代码组,点击“新增代码”按钮,可以添加具体的代码。
在新增代码组或代码的过程中,其中带红色星号标记“*”的条目,标识、名称和排序ID是必须要填写的内容。平台会检测该代码组或代码的标识、名称在平台上的合法性,确保代码组或代码的标识、名称的唯一性和可用性。
具体添加代码组、代码的操作界面如下图4.5.1-1所示:
图4.5.1-1 新增代码组、代码
private void InfoUpdatedADD() { if (dmeObj == null) { lbInfo.Text = "在“系统代码”下新增如下代码分类"; return; } if (dmeObj != null && dmeObj is DMESYS_SYSCODE_TYPE) { dmeCodeType = dmeObj as DMESYS_SYSCODE_TYPE; lbInfo.Text = "在代码分类“" + dmeCodeType.Name + "”下新增如下代码"; return; } } private bool InfoUpdatedEDIT() { if (dmeObj == null) { lbInfo.Text = "加载代码类型信息时出错!"; lbInfo.ForeColor = Color.Red; ucCodes.IsEnabled(false); return false; } if (dmeObj != null && dmeObj is DMESYS_SYSCODE_TYPE) { dmeCodeType = dmeObj as DMESYS_SYSCODE_TYPE; lbInfo.Text = "编辑代码分类“" + dmeCodeType.Name + "”"; return true; } if (dmeObj != null && dmeObj is DMESYS_SYSCODE) { dmeCode = dmeObj as DMESYS_SYSCODE; lbInfo.Text = "编辑代码“" + dmeCode.Name + "”"; return true; } return false; } private bool InsertorUpdateCodes() { if (dmeCode == null) { dmeCode = new DMESYS_SYSCODE(); } if (dmeCodeType == null) { dmeCodeType = new DMESYS_SYSCODE_TYPE(); } if (action == Action.ADD) { if (dmeObj == null && DoValidatedCodes()) { dmeCodeType.Id = FeiQing.DBO.DBOService.GetID(); DBOSYS_SYSCODE_TYPE.InsertDMESYS_SYSCODE_TYPE(dmeCodeType); return true; } if (dmeObj is DMESYS_SYSCODE_TYPE && DoValidatedCodes()) { dmeCode.Syscode_Type_Id = dmeCodeType.Id; dmeCode.Id = FeiQing.DBO.DBOService.GetID(); DBOSYS_SYSCODE.InsertDMESYS_SYSCODE(dmeCode); return true; } return false; } if (action == Action.EDIT) { if (dmeObj is DMESYS_SYSCODE_TYPE && DoValidatedCodes()) { dmeCodeType.Id = (dmeObj as DMESYS_SYSCODE_TYPE).Id; DBOSYS_SYSCODE_TYPE.UpdateDMESYS_SYSCODE_TYPE(dmeCodeType); return true; } if (dmeObj is DMESYS_SYSCODE && DoValidatedCodes()) { dmeCode.Id = (dmeCode as DMESYS_SYSCODE).Id; DBOSYS_SYSCODE.UpdateDMESYS_SYSCODE(dmeCode); return true; } return false; } return false; } private bool DoValidatedCodes() { if (String.IsNullOrEmpty(ucCodes.LbTxtTag)) { lbTip.Text = "“标识”不能为空。"; lbTip.ForeColor = Color.Red; return false; } if (String.IsNullOrEmpty(ucCodes.LbTxtName)) { lbTip.Text = "“名称”不能为空。"; lbTip.ForeColor = Color.Red; return false; } if (String.IsNullOrEmpty(ucCodes.LbTxtOrder)) { lbTip.Text = "“排序ID”不能为空。"; lbTip.ForeColor = Color.Red; return false; } if (!FeiQing.Util.DataValidator2.IsNumber(ucCodes.LbTxtOrder)) { lbTip.Text = "“排序ID”必须为数值。"; lbTip.ForeColor = Color.Red; return false; } if (dmeObj == null && dmeCodeType != null && action == Action.ADD) { dmeCodeType.Tag = ucCodes.LbTxtTag; dmeCodeType.Name = ucCodes.LbTxtName; dmeCodeType.Order_Id = Int32.Parse(ucCodes.LbTxtOrder); dmeCodeType.Remark = ucCodes.LbTxtRemark; } if (dmeObj is DMESYS_SYSCODE_TYPE && dmeCode != null && action == Action.ADD) { dmeCode.Tag = ucCodes.LbTxtTag; dmeCode.Name = ucCodes.LbTxtName; dmeCode.Order_Id = Int32.Parse(ucCodes.LbTxtOrder); dmeCode.Remark = ucCodes.LbTxtRemark; } if (dmeObj is DMESYS_SYSCODE_TYPE && dmeCodeType != null && action == Action.EDIT) { dmeCodeType.Tag = ucCodes.LbTxtTag; dmeCodeType.Name = ucCodes.LbTxtName; dmeCodeType.Order_Id = Int32.Parse(ucCodes.LbTxtOrder); dmeCodeType.Remark = ucCodes.LbTxtRemark; } if (dmeObj is DMESYS_SYSCODE && dmeCode != null && action == Action.EDIT) { dmeCode.Tag = ucCodes.LbTxtTag; dmeCode.Name = ucCodes.LbTxtName; dmeCode.Order_Id = Int32.Parse(ucCodes.LbTxtOrder); dmeCode.Remark = ucCodes.LbTxtRemark; } return true; }
编辑代码组和代码:主要是在代码组或代码的标识,名称,排序,备注等信息发生变更的情况时进行的编辑操作。点击展开树形菜单“系统代码”,在树型目录下选择一个代码组或者代码后点击“编辑”按钮,即完成对应代码组或代码信息的修改。具体编辑代码组、代码的操作界面如下图4.5.1-2中所示:
图4.5.1-2 编辑代码组、代码
删除代码组和代码:点击展开树形菜单“系统代码”,在树型目录下选择一个代码组或代码后点击“删除”按钮,图4.5.1-3显示了删除操作的提示对话框界面。
备注:对于拥有代码的代码组是无法直接删除的,首先需要删除其下属的代码。
图4.5.1-3 删除代码组或代码提示
private void btnDelete_Click(object sender, System.EventArgs e) { if (IsCodeType()) { if (selectedNode.ChildNodes.Count > 0) { GUIHelper.MessageToUserInfo("提示:该代码分类包含代码,无法直接删除!"); return; } if (GUIHelper.MessageQuestion("确定要删除代码分类“" + (selectedObj as DMESYS_SYSCODE_TYPE).Name + "”吗?", "删除代码分类")) { DBOSYS_SYSCODE_TYPE.DeleteDMESYS_SYSCODE_TYPE(selectedObj as DMESYS_SYSCODE_TYPE); btnRefresh_Click(sender, e); return; } } if (IsCode()) { if (GUIHelper.MessageQuestion("确定要删除代码“" + (selectedObj as DMESYS_SYSCODE).Name + "”吗?", "删除代码")) { DBOSYS_SYSCODE.DeleteDMESYS_SYSCODE(selectedObj as DMESYS_SYSCODE); btnRefresh_Click(sender, e); return; } } }
4.5.2 移动代码
点击展开树形菜单“系统代码”,选择一个代码后点击“移动”按钮,如下图4.5.2-1中所示,选择需要移动到的目标代码组,点击确认,即可完成代码的调动。目前平台上只支持代码移动,代码组暂时不支持移动。
图4.5.2-1 移动代码
#region LoadCodeTypes private void LoadCodeTypes(TreeNode currentNode, DMESYS_SYSCODE_TYPE currentCodeType) { List<DMESYS_SYSCODE_TYPE> subCodeTypes = null; if (currentCodeType != null) subCodeTypes = DBOSYS_SYSCODE_TYPE.GetSubCodeTypes(currentCodeType); else subCodeTypes = DBOSYS_SYSCODE_TYPE.GetSYS_SYSCODE_TYPEEntities(); foreach (DMESYS_SYSCODE_TYPE rt in subCodeTypes) { TreeNode node = currentNode.ChildNodes.Add(); node.Tag = rt; node.Text = rt.Name; node.CollapsedImageIndex = 1; node.ExpandedImageIndex = 2; LoadCodeTypes(node, rt); } } #endregion private bool MoveCode() { if (destObj == null) { lbTip.Visible = true; return false; } if (destObj is DMESYS_SYSCODE_TYPE) { target.Syscode_Type_Id = (destObj as DMESYS_SYSCODE_TYPE).Id; DBOSYS_SYSCODE.UpdateDMESYS_SYSCODE(target); return true; } return false; }