*********权限思路:先把所有权限加载到Detree树中,然后根据数据库中用户角色和功能ID,给其拥有权限打上勾。修改时提交事件更新数据库。
*******关于更改权限:先批量删除所有功能,再批量插入。
类中的递归算法思路: 如果是调用类中某数据作为参数,并反回部分有用数据的递规,则先考虑反回整个类 ,再篇历该类,调用各对像的参数数据进行递规。
如下:权限设置中以父节点ID得到所有子节点,进而递规得到所有子节点的子节点递归。用类处理,反回类对像集合,再调集合中的各对的父节点ID进行递规。
1.在Sys_Right权限表中得到所有一级权限菜单
public Ilist<Sys_Right> GetFirstMenu()
{
string sql="select * from Sys_Right where Right_Prent_Code=0";
return GetSys_RightBySql(sql);
}
2.根据父节点ID得到所有子节点
public Ilist<Sys_Right> GetSonMenuByParentID( int ParentID)
{
string sql="select * from Sys_Right where Right_Prent_Code="+parentID.ToString();
return GetSys_RightBySql(sql);
}
3.根据父节点ID递规得到所有子节点的方法
public string GetAllMenuByParentId( int ParentID)
{
stringBuilder sb= new StringBuilder();
Ilist<SyS_Right> listRight= GetSonMenuByParentID( ParentID ); // 反回类对像
foreach( Sys_Right right in listRight) // 遍历类对像
{
int flag = BLL.Sys_role_rightManager.GetCheckExistRoleRight(this.RoleId, right.Id) ? 1 : 2; // 用于判断是detre中功能是否选中 详情见4
sb.AppendFormat("tree.add('{0}', '{1}', '{2}', '', '', '',{3},'{4}','{5}');", right.Id,parentId, right.Right_text,
flag,this.BaseUrl+"customerImg/CloseTree.gif",this.BaseUrl+"customerImg/OpenTree.gif");
sb.Append( GetAllMenuByParentId( right.Id ) ); // 递归传弟类对像中的必要参数
}
return sb.ToString();
}
4. 根据角色ID和权限Id 在角色权限表中查询该用户角色是否含有此功能
public bool GetCheckExistRoleRight( int RoleID, int RightId)
{
string strsql = string.Format("select count(*) from Sys_role_right where Rf_role_no={0} and Rf_right_no={1}", Roleid, RightId);
return DBHelper.GetScalar(strsql) > 0; // 如果反回0 无此功能,1有此
}
5.显示所有功能于DeTree中,并将该用户拥有的功能打上勾
/// <summary>
/// 得到dtree js 的主体节点代码
/// </summary>
/// <returns></returns>
private string GetTreeJsBody()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
//得到所有的父节点
IList<Models.Sys_right> rights = BLL.Sys_rightManager.GetFirstMenu();
foreach (Models.Sys_right right in rights)
{
int flag = BLL.Sys_role_rightManager.GetCheckExistRoleRight(this.RoleId, right.Id) ? 1 : 2;
sb.AppendFormat("tree.add('{0}', '0', '{1}', '', '', '',{2},'{3}','{4}');", right.Id, right.Right_text, flag, this.BaseUrl + "customerImg/CloseTree.gif", this.BaseUrl + "customerImg/OpenTree.gif");
sb.Append(GetAllMenuByParentId(right.Id));
}
return sb.ToString();
}