#region using System; using System.Data; using System.Windows.Forms; using CSFrameworkV5.Common; using CSFrameworkV5.Core; using CSFrameworkV5.DataAccess; using CSFrameworkV5.Interfaces; using CSFrameworkV5.Models; using CSFrameworkV5.WebRef.SystemModule; #endregion namespace CSFrameworkV5.Business.BLL_Permission { /// /// 角色的权限视图管理 /// public class RoleActionsView { protected DataTable _Actions; protected string _CurrentRoleID; //当前角色编号 private bool _IsCreatedTree; //是否创建树结构 protected DataTable _MenuData; protected DataTable _ModuleData; protected DataTable _MyFormTagName; protected bool _OnInitTree; protected bool _OnViewMode; protected IBridge_Permission _PermissionBridge; protected DataTable _RoleActionData; protected DataTable _RoleData; protected TreeView _Tree; /// /// 构造器 /// /// 树视图 /// 菜单数据 public RoleActionsView(TreeView tree) { _OnViewMode = false; _Tree = tree; _PermissionBridge = CreateBridge(); } /// /// 功能点的自定义名称数据 /// public DataTable ActionCustomNameData { get => _MyFormTagName; set => _MyFormTagName = value; } /// /// 所有功能点数据 /// public DataTable ActionsData { get => _Actions; set => _Actions = value; } /// /// 当前操作的角色编号 /// public string CurrentRoleID { get => _CurrentRoleID; set => _CurrentRoleID = value; } /// /// 是否创建树结构 /// public bool IsCreatedTree { get => _IsCreatedTree; set => _IsCreatedTree = value; } /// /// 所有菜单数据 /// public DataTable MenuData { get => _MenuData; set => _MenuData = value; } /// /// 模块数据 /// public DataTable ModuleData { get => _ModuleData; set => _ModuleData = value; } /// /// 处于初始化树状态 /// public bool OnInitTree => _OnInitTree; /// /// 处于查看模式 /// public bool OnViewMode { get => _OnViewMode; set => _OnViewMode = value; } /// /// 角色的权限数据 /// public DataTable RoleActionData => _RoleActionData; /// /// 角色数据 /// public DataTable RoleData { get => _RoleData; set => _RoleData = value; } /// /// 取消操作 /// public void CancelOperation() { _MenuData.RejectChanges(); _ModuleData.RejectChanges(); _Actions.RejectChanges(); } private IBridge_Permission CreateBridge() { if (BridgeFactory.IsADODirect) return new dalPermission(Loginer.CurrentUser); if (BridgeFactory.IsWCFBridge) return new WCF_Permission(); throw new CustomException(BridgeFactory.UNKNOW_BRIDGE_TYPE); } /// /// 由菜单的数据创建树结点 /// /// 菜单的数据 /// 树视图 /// 父级结点 /// protected TreeNode DataRow2NodeHandler(DataRow row, TreeView tree, TreeNode parentNode) { var node = new TreeNode(); node.Text = ConvertEx.ToString(row[tb_MyMenu.MenuCaption]); //显示菜单标题 if (parentNode != null) parentNode.Nodes.Add(node); else tree.Nodes.Add(node); return node; } /// /// 根据父级菜单名获取所有子级的资料行. /// /// 父级菜单名 /// protected DataRow[] GetRows(string parentMenuName) { string filter; if (string.IsNullOrEmpty(parentMenuName)) filter = string.Format("({0} IS NULL) OR ({1} ='')", tb_MyMenu.ParentMenuName, tb_MyMenu.ParentMenuName); else filter = string.Format("{0}='{1}'", tb_MyMenu.ParentMenuName, parentMenuName); return _MenuData.Select(filter); } //_RoleData, txtRoleID.Text, "RoleID", _UpdateType) public static bool IsExistsInCache(DataTable cache, string keyValue, string keyName, UpdateType updateType) { if (UpdateType.Add == updateType) { var rows = cache.Select(keyName + "='" + keyValue + "'"); return rows.Length > 0; } //修改状态是禁止修改主键的 if (UpdateType.Modify == updateType) return false; return false; } /// /// 提交菜单管理功能的数据 /// /// public bool PostChanges() { var success = false; var dtMenu = MenuData.GetChanges(); var dtActionCustomName = ActionCustomNameData.GetChanges(); if (dtMenu != null) success = new bllMenu().Update(dtMenu, dtActionCustomName); //提交菜单和自定义功能点数据 if (success) { MenuData.AcceptChanges(); ActionCustomNameData.AcceptChanges(); } //提交模块字典数据 var dtModule = ModuleData.GetChanges(); if (dtModule != null) success = new bllSystemModule().Update(dtModule); if (success) ModuleData.AcceptChanges(); //提交功能点数据 var dtActions = ActionsData.GetChanges(); if (dtActions != null) success = new bllActions().Update(dtActions); if (success) ActionsData.AcceptChanges(); return success; } /// /// 重新获取角色依赖的数据 /// public void RefreshRoleRelatedData() { _MyFormTagName = _PermissionBridge.GetFormTagName(); } #region BeforeCheck/AfterCheck private void OnTreeAuthorityBeforeCheck(object sender, TreeViewCancelEventArgs e) { //查看模式支持勾选. if (_OnViewMode) e.Cancel = true; } private void OnTreeAuthorityAfterCheck(object sender, TreeViewEventArgs e) { //枚举结点 if (e.Action == TreeViewAction.ByKeyboard || e.Action == TreeViewAction.ByMouse) { if (e.Node.Checked) { TreeNodeSelectedChild(e.Node, true); TreeNodeParentSelected(e.Node, true); } else if (e.Node.Checked == false) { TreeNodeSelectedChild(e.Node, false); //当所有子结点去掉勾选时,父结点也去掉勾选时 //TreeNodeChildsUnSelected(e.Node); } } //勾选功能结点 if (e.Node.Tag is ActionNodeTag) { var action = e.Node.Tag as ActionNodeTag; //功能结点的Tag对象 var tag = e.Node.Parent.Tag as RoleActionNodeTag; //数据窗体结点Tag对象 //初始化角色的权限资料行 if (tag.RoleActionData == null) tag.RoleActionData = CreateRoleActionData(_CurrentRoleID, tag.MenuName, 0); //汇总数据窗体结点的所有打勾的功能点的值 var actionsValue = GetActionsValue(e.Node.Parent); //设置权限值 tag.RoleActionData[tb_MyRoleActions.Actions] = actionsValue; } //勾选数据窗体结点 if (e.Node.Tag is RoleActionNodeTag) { var tag = e.Node.Tag as RoleActionNodeTag; if (e.Node.Checked) //打勾 { if (tag.RoleActionData == null) //新增角色的权限 tag.RoleActionData = CreateRoleActionData(_CurrentRoleID, tag.MenuName, 0); if (tag.Deleted) tag.Deleted = false; } else //取消勾选 { if (tag.RoleActionData != null) { if (tag.RoleActionData.RowState == DataRowState.Added) tag.RoleActionData.Table.Rows.Remove( tag.RoleActionData); //删除"新增状态"的记录 else tag.Deleted = true; //给记录打上删除标记 } } } } /// /// 获取角色及角色的权限已修改的数据 /// /// public DataTable GetChanges() { foreach (TreeNode node in _Tree.Nodes) BuildNodeData(node); var changes = _RoleActionData.GetChanges(); return changes; } /// /// 将结点(取消勾选)绑定的DataRow设为删除 /// /// private void BuildNodeData(TreeNode node) { if (node == null || node.Tag == null) return; //用于测试 if (node.Text == "动态交叉报表") { } //功能点节点(如:增、删、改) if (node.Tag is ActionNodeTag) { var tag = node.Parent.Tag as RoleActionNodeTag; //数据窗体结点Tag对象 //勾选了功能点,初始化角色的权限资料行 if (tag.RoleActionData == null && node.Parent.Checked) tag.RoleActionData = CreateRoleActionData(_CurrentRoleID, tag.MenuName, 0); if (tag.RoleActionData != null) { //汇总数据窗体结点的所有打勾的功能点的值 var actionsValue = GetActionsValue(node.Parent); if (actionsValue > 0 && tag.RoleActionData.RowState != DataRowState.Deleted) //更新权限值 tag.RoleActionData[tb_MyRoleActions.Actions] = actionsValue; //else // tag.RoleActionData.Delete();//删除 } } //窗体结点 if (node.Tag is RoleActionNodeTag) { var tag = node.Tag as RoleActionNodeTag; if (node.Checked) //打勾 { if (tag.RoleActionData == null) //新增角色的权限 tag.RoleActionData = CreateRoleActionData(_CurrentRoleID, tag.MenuName, 0); } else //取消勾选 { if (tag.RoleActionData != null) //删除 { if (tag.RoleActionData.RowState == DataRowState.Added) tag.RoleActionData.Table.Rows.Remove( tag.RoleActionData); //删除"新增状态"的记录 else tag.RoleActionData.Delete(); //删除记录 } } } //若当前节点有子节点,递归处理 if (node.Nodes.Count > 0) foreach (TreeNode n in node.Nodes) BuildNodeData(n); } /// /// 汇总数据窗体结点的所有打勾的功能点的值 /// /// 数据窗体结点 /// private int GetActionsValue(TreeNode node) { var actions = 0; foreach (TreeNode n in node.Nodes) if (n.Checked && n.Tag != null && n.Tag is ActionNodeTag) actions += (n.Tag as ActionNodeTag).ActionValue; return actions; } /// /// 新增角色的权限 /// /// 角色编号 /// 菜单名称 /// 权限值(功能点汇总) /// private DataRow CreateRoleActionData(string roleID, string menuName, int actions) { var row = _RoleActionData.NewRow(); row[tb_MyRoleActions.DataSetID] = Loginer.CurrentUser.DBID; row[tb_MyRoleActions.RoleID] = roleID; row[tb_MyRoleActions.MenuName] = menuName; row[tb_MyRoleActions.Actions] = actions; _RoleActionData.Rows.Add(row); return row; } #endregion #region 递归选择结点父/子结点 /// /// 勾选所有子级结点 /// /// 当前结点 /// 是否勾选 public void TreeNodeSelectedChild(TreeNode thChild, bool isChecked) { foreach (TreeNode tnChildNext in thChild.Nodes) { tnChildNext.Checked = isChecked; TreeNodeSelectedChild(tnChildNext, isChecked); } } /// /// 勾选父级结点 /// /// 当前结点 /// 是否勾选 private void TreeNodeParentSelected(TreeNode tnChild, bool isChecked) { if (tnChild.Parent != null) { tnChild.Parent.Checked = isChecked; TreeNodeParentSelected(tnChild.Parent, isChecked); } } /// /// 当所有子结点去掉勾选时,父结点也去掉勾选时 /// /// private void TreeNodeChildsUnSelected(TreeNode tnChild) { if (tnChild.Parent == null) return; foreach (TreeNode n in tnChild.Parent.Nodes) if (n.Checked) return; tnChild.Parent.Checked = false; } #endregion #region 递归生成菜单树 /// /// 生成顶级菜单的树结点 /// public virtual void InitTree(string rootValue) { try { _OnInitTree = true; //正在初始化树视图 _OnViewMode = false; //允许勾选结点 _Tree.BeginUpdate(); _Tree.AfterCheck -= OnTreeAuthorityAfterCheck; _Tree.BeforeCheck -= OnTreeAuthorityBeforeCheck; _Tree.Nodes.Clear(); //根结点记录 var rows = GetRows(rootValue); DataRow[] childs; string pValue; //parentValue; string kValue; //key value TreeNode root; foreach (var row in rows) { pValue = row[tb_MyMenu.ParentMenuName].ToStringEx(); kValue = row[tb_MyMenu.MenuName].ToStringEx(); root = DataRow2NodeHandler(row, _Tree, null); //创建结点 root.ImageIndex = 0; root.SelectedImageIndex = 0; var tag = new RoleActionNodeTag(); //创建Tag对象 tag.MenuData = row; tag.MenuName = kValue; tag.RoleActionData = null; root.Tag = tag; childs = GetRows(kValue); if (childs.Length > 0) InitTreeChild(childs, root); } _IsCreatedTree = true; _OnInitTree = false; } finally { _Tree.BeforeCheck += OnTreeAuthorityBeforeCheck; _Tree.AfterCheck += OnTreeAuthorityAfterCheck; _Tree.EndUpdate(); } } /// /// 生成子菜单的树结构 /// protected virtual void InitTreeChild(DataRow[] childs, TreeNode parentNode) { string menuParentName; //当前菜单的父级菜单; string menuName; //当前菜单 TreeNode root; foreach (var row in childs) { menuParentName = row[tb_MyMenu.ParentMenuName].ToStringEx(); menuName = row[tb_MyMenu.MenuName].ToStringEx(); root = DataRow2NodeHandler(row, _Tree, parentNode); //创建结点 var tag = new RoleActionNodeTag(); //创建Tag对象 tag.MenuData = row; tag.MenuName = menuName; tag.RoleActionData = null; root.Tag = tag; var actions = ConvertEx.ToInt(row[tb_MyMenu.Actions]); if (actions > 0) //窗体有权限功能 { root.ImageIndex = 1; root.SelectedImageIndex = 1; InitAction(actions, menuName, root); //初始化功能结点 } else { root.ImageIndex = 3; root.SelectedImageIndex = 3; } childs = GetRows(menuName); if (childs.Length > 0) //创建下一级结点 InitTreeChild(childs, root); } } #endregion #region InitAction 初始化功能点 /// /// 初始化功能点树结点 /// /// /// protected virtual void InitAction(int actions, string menuName, TreeNode node) { var isAdmin = Loginer.CurrentUser.IsAdmin(); var userAuths = actions; //当前用户的权限 foreach (DataRow row in _Actions.Rows) //循环所有功能点. { var value = ConvertEx.ToInt(row[tb_MyActions.ActionValue]); if (value == 0) continue; //用每个功能点的值与窗体的最大权限"与"运算, 但不能超出当前用户的权限. if ((value & actions) == value && (isAdmin || (value & userAuths) == value)) { var caption = ConvertEx.ToString(row[tb_MyActions.ActionName]); var tagNameRow = GetCustomTagName(menuName, value); //取按钮的自定义名称 if (tagNameRow != null) caption = ConvertEx.ToString( tagNameRow[ tb_MyFormTagName .TagName]); //功能点名称 var actionNode = new TreeNode(caption, 0, 0); actionNode.ImageIndex = 2; actionNode.SelectedImageIndex = 2; var tag = new ActionNodeTag(value); tag.TagMenuName = menuName; tag.TagNameDataRow = tagNameRow; tag.TagNameOld = caption; //按钮标题 actionNode.Tag = tag; node.Nodes.Add(actionNode); } } } protected DataRow GetCustomTagName(string menuName, int actionValue) { var rows = _MyFormTagName.Select("MenuName='" + menuName + "' AND TagValue=" + actionValue.ToStringEx()); if (rows.Length > 0) return rows[0]; return null; } #endregion #region 显示角色的权限 //显示角色的权限. public void ShowRoleActions() { _OnInitTree = true; _RoleActionData = _PermissionBridge.GetRoleAction(_CurrentRoleID); try { _Tree.AfterCheck -= OnTreeAuthorityAfterCheck; //一级结点,模块的主菜单 foreach (TreeNode node in _Tree.Nodes) { var tag = node.Tag as RoleActionNodeTag; var drRoleAction = GetRoleActionDataRow(_CurrentRoleID, tag.MenuName); tag.RoleActionData = drRoleAction; //设置角色的权限 tag.Deleted = false; node.Checked = drRoleAction != null; if (node.Nodes.Count > 0) ShowRoleActionsChild(node); } } catch (Exception ex) { Msg.ShowException(ex); } finally { _Tree.AfterCheck += OnTreeAuthorityAfterCheck; _OnInitTree = false; } } private DataRow GetRoleActionDataRow(string roleID, string menuName) { var rs = _RoleActionData.Select("RoleID='" + roleID + "' AND MenuName='" + menuName + "'"); return rs.Length > 0 ? rs[0] : null; } private void ShowRoleActionsChild(TreeNode node) { foreach (TreeNode n in node.Nodes) { var tag = n.Tag as RoleActionNodeTag; var drRoleAction = GetRoleActionDataRow(_CurrentRoleID, tag.MenuName); tag.RoleActionData = drRoleAction; //设置角色的权限 tag.Deleted = false; n.Checked = drRoleAction != null; if (n.Checked) TreeNodeParentSelected(n, true); var actions = ConvertEx.ToInt(tag.MenuData[tb_MyRoleActions.Actions]); if (actions > 0) //当前菜单有功能点(权限值) ShowAction(n, drRoleAction); //显示菜单的功能 else if (n.Nodes.Count > 0) ShowRoleActionsChild(n); } } private void ShowAction(TreeNode node, DataRow roleAction) { if (node == null) return; var auth = 0; if (roleAction != null) auth = int.Parse(roleAction[tb_MyRoleActions.Actions] .ToStringEx()); //角色的权限 foreach (TreeNode n in node.Nodes) if (auth != 0) { var value = (n.Tag as ActionNodeTag).ActionValue; n.Checked = (value & auth) == value; //逻辑位运算 } else { n.Checked = false; } } #endregion } /// /// 组的权限视图管理(查看模式) /// public class GroupActionsView : RoleActionsView { private DataTable _GroupActions; public GroupActionsView(TreeView tree) : base(tree) { _OnViewMode = true; } private DataRow GetGroupExistedMenu(string menuName) { var rows = _GroupActions.Select(tb_MyMenu.MenuName + "='" + menuName + "'"); return rows.Length > 0 ? rows[0] : null; } protected override void InitAction(int actions, string menuName, TreeNode node) { var isAdmin = Loginer.CurrentUser.IsAdmin(); foreach (DataRow row in _Actions.Rows) //循环所有功能点. { var value = ConvertEx.ToInt(row[tb_MyActions.ActionValue]); if (value == 0) continue; //用每个功能点的值与窗体的最大权限"与"运算, 但不能超出当前用户的权限. if ((value & actions) == value) { var caption = ConvertEx.ToString(row[tb_MyActions.ActionName]); var tagNameRow = GetCustomTagName(menuName, value); //取按钮的自定义名称 if (tagNameRow != null) caption = ConvertEx.ToString( tagNameRow[ tb_MyFormTagName .TagName]); //功能点名称 var actionNode = new TreeNode(caption, 0, 0); actionNode.ImageIndex = 2; actionNode.SelectedImageIndex = 2; var tag = new ActionNodeTag(value); tag.TagMenuName = menuName; tag.TagNameDataRow = tagNameRow; tag.TagNameOld = caption; //按钮标题 actionNode.Tag = tag; node.Nodes.Add(actionNode); } } } public void InitTree(string rootValue, string groupCode) { //取当前组所有权限 _GroupActions = new bllPermission().GetGroupActions(groupCode); InitTree(rootValue); } public override void InitTree(string rootValue) { if (_GroupActions == null) throw new Exception("无法获取组的权限!"); _OnInitTree = true; _Tree.Nodes.Clear(); _Tree.BeginUpdate(); //根结点记录 var rows = GetRows(rootValue); //取菜单数据 DataRow[] childs; string menuName; //key value TreeNode root; var isAdmin = Loginer.CurrentUser.IsAdmin(); foreach (var row in rows) { menuName = row[tb_MyMenu.MenuName].ToStringEx(); //仅加载当前组的角色的权限 if (GetGroupExistedMenu(menuName) != null) { root = DataRow2NodeHandler(row, _Tree, null); root.ImageIndex = 0; root.SelectedImageIndex = 0; var tag = new RoleActionNodeTag(); tag.MenuData = row; tag.MenuName = menuName; tag.RoleActionData = null; root.Tag = tag; childs = GetRows(menuName); if (childs.Length > 0) InitTreeChild(childs, root); } } if (_Tree.Nodes.Count == 0) _Tree.Nodes.Add("该组未定义权限!"); _Tree.EndUpdate(); _OnInitTree = false; } protected override void InitTreeChild(DataRow[] childs, TreeNode parentNode) { string menuParentName; //parentValue; string menuName; //key value TreeNode root; var isAdmin = Loginer.CurrentUser.IsAdmin(); foreach (var row in childs) { menuParentName = row[tb_MyMenu.ParentMenuName].ToStringEx(); menuName = row[tb_MyMenu.MenuName].ToStringEx(); var thisMenu = GetGroupExistedMenu(menuName); if (thisMenu != null) { root = DataRow2NodeHandler(row, _Tree, parentNode); var tag = new RoleActionNodeTag(); tag.MenuData = row; tag.MenuName = menuName; tag.RoleActionData = null; root.Tag = tag; var actions = thisMenu == null ? 0 : ConvertEx.ToInt(thisMenu[tb_MyMenu.Actions]); //取角色的权限 if (actions > 0) { root.ImageIndex = 1; root.SelectedImageIndex = 1; InitAction(actions, menuName, root); } else { root.ImageIndex = 3; root.SelectedImageIndex = 3; } childs = GetRows(menuName); if (childs.Length > 0) InitTreeChild(childs, root); } } } } }