用户权限树的建立及递归算法思路原则

*********权限思路:先把所有权限加载到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();
    }

posted @ 2012-11-04 23:20  酒沉吟  阅读(1744)  评论(0编辑  收藏  举报