基于xml 实现动态加载权限功能树列表

在学习EFSFrame框架的过程中,感触最深的就是通过xml来实现前台与后台数据的交互,页面设计灵活,不用管后台如何写的,前台与后台的交互唯一的交互通道都是xml,在我们需要添加页面、添加规定的格式的xml文件就可以很好的融入这个架构中,现自己把加载功能树这一块和大家分享

功能树的加载如图1:

 

下面是代码实战:

第一步是:这是登陆页面中的html文件中核心的内容:把用户输入的用户名、密码、IP,全部拼接成一个一定格式的xml文件,传给隐藏控件。

[html]
  1. <span style=”font-size:18px;”>function doSubmit()
  2. {
  3.     strUserIp = “<% =strUserIP %>”;
  4.     strUserTitle = document.getElementById(“txtUserName”).value;
  5.     if(strUserTitle == “”)
  6.     {
  7.       alert(“用户名不能为空”);
  8.       return false;
  9.     }
  10.     strUserPWD = document.getElementById(“txtUserPWD”).value;
  11.     if(strUserPWD == “”)
  12.     {
  13.       alert(“密码不能为空”);
  14.       return false;
  15.     }
  16.     strMac = document.getElementById(“txtMac”).value;
  17.     //拼接xml文件
  18.     strXml = ‘<?xml version=”1.0″?> <EFSFRAME efsframe=”urn=www-efsframe-cn” version=”1.0″><DATAINFO><LOGININFO><USERTITLE>’ + strUserTitle + ‘</USERTITLE><USERPASSWORD>’ + strUserPWD + ‘</USERPASSWORD><LOGINIP>’ + strUserIp + ‘</LOGINIP><MAC>’ + strMac + ‘</MAC></LOGININFO></DATAINFO></EFSFRAME>’;
  19.     //通过隐藏控件传到后台
  20.     document.getElementById(“txtXML”).value = strXml;
  21.     return true;
  22. }</span>

后台的代码,判断信息正确之后调到主页面:

[csharp]
  1. <span style=”font-size:18px;”>protected void Page_Load(object sender, EventArgs e)
  2.     {
  3.       if (IsPostBack)
  4.       {
  5.         try{
  6.             //获取到xml的值
  7.           string strXml = Request[“txtXML”];
  8.           // strXml = XmlFun.addXDocHead(strXml);
  9.           //创建创建一个doc对象
  10.           XmlDocument doc = XmlFun.CreateNewDoc(strXml);
  11.             //解析获取xml中的用户名、密码、IP\mac等信息
  12.           string strUsertitle = XmlFun.getNodeValue(doc,Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.USERTITLE);
  13.           string strPassWord = XmlFun.getNodeValue(doc, Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.USERPASSWORD);
  14.           string strIP = XmlFun.getNodeValue(doc, Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.LOGINIP);
  15.           string strMac = XmlFun.getNodeValue(doc, Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.MAC);
  16.             //调用相应的sql语句查询方法
  17.           string str_SQL = “SELECT * FROM VW_USERLIST WHERE USERTITLE='” + strUsertitle + “‘”;
  18.           string strErr = “”;
  19.             //创建一个新的对象
  20.           ReturnDoc Rtdoc = new ReturnDoc();
  21.           OleDbDataReader rst = null;
  22.             //判断是否存在这条记录的信息
  23.           string strRet = CommonQuery.qryRst(str_SQL, ref rst);
  24.           if (strRet == “0”)
  25.           {
  26.             Rtdoc.getQueryInfo(rst);
  27.             //判断用户输入的密码是否和数据库中的密码相同
  28.             if (strPassWord != Rtdoc.getNodeValue(Common.BAR2 + Field.USERPASSWORD))
  29.             {
  30.               strErr = “密码错误”;
  31.             }
  32.           }
  33.           else
  34.           {
  35.             strErr = “查询用户信息为空”;
  36.           }
  37.           rst.Close();
  38.           if(strErr == “”)
  39.           {
  40.               //根据xml信息查找用户的权限信息,并把xml中的信息实例化一个用户的实例对象
  41.             UserSession user = new UserSession(Rtdoc.getXml());
  42.             string[] arrSys = { user.getUserID(), user.getUserTitle(), user.getUserName(), “”, user.getUnitID(), user.getUnitName(), strIP, strMac };
  43.             //记录系统日志
  44.               string logid = SystemLog.addSysLog(arrSys);
  45.             user.setLogID(logid);
  46.               //登录信息信息保存用户名、角色 到Session中
  47.             Session.Add(“RoleUser”, user);
  48.               //加载主页面
  49.             Response.Redirect(“Login.aspx”);
  50.             Response.End();
  51.           }
  52.           else
  53.           {</span>

主页面上显示功能树的div加载带有权限的功能树(分配什么权限只能显示相应的界面信息)

[html]
  1. <span style=”font-size:18px;”><div iconCls=”icon-tree” region=”west” width=”150″ title=”功能树” collapsible=”true” border=”false”>
  2.     <div region=”center” id=”treepanel” xtype=”treepanel” height=”450″ autoScroll=”true” onEfsClick=”doTreeClick()” border=”false”>
  3.         <%–加载设计有权限的树–%>
  4.     <div xtype=”xmlloader” url=”sysadmin/baseRefWeb.aspx?method=getUserRightTree” parentPath=”QUERYINFO”></div>
  5.     </div></span>

 

baseRefWeb.aspx用来加载树

[csharp]
  1. <span style=”font-size:18px;”>protected void Page_Load(object sender, EventArgs e)
  2.     {
  3.       try
  4.       {
  5.         string sMothod = Request[“method”];
  6.         if (!General.empty(sMothod))
  7.         {
  8.           Type ts = typeof(baseRef);
  9.           object obj = Activator.CreateInstance(ts, null); //获得一个实例
  10.           object[] methodParamArgs = new object[] { Request, Response };
  11.           MethodInfo mi = ts.GetMethod(sMothod); //获得执行方法
  12.           string sXml = (string)mi.Invoke(obj, methodParamArgs); //带参数委托方法的调用并返回值
  13.           Response.ContentType = “text/xml;charset=utf-8”;
  14.           Response.Charset = “UTF-8”;
  15.             //返回读取后权限的xml信息
  16.           Response.Write(sXml);
  17.         }
  18.       }</span>

 

 

查询用户权限的公共方法

[csharp]
  1. <span style=”font-size:18px;”>/// <summary>
  2.     /// 查询用户权限
  3.     /// </summary>
  4.     /// <returns></returns>
  5.     public string getUserRightTree(HttpRequest Request, HttpResponse Response)
  6.     {
  7.         //通过查找角色信息
  8.       UserSession userInfo = (UserSession)Session[“RoleUser”];
  9.       string strTree = userInfo.getUserRightsByUserID();
  10.       return strTree;
  11.     }</span>

 

[csharp]  
  1. <span style=”font-size:18px;”>/// 查询出该用户的权限信息
  2.     public string getUserRightsByUserID()
  3.     {
  4.       /// 查询出该用户的权限信息
  5.       string str_SQL = Common.SELECT + Common.DISTINCT + Common.ALL +
  6.                        Common.S_FROM + Table.VW_USERRIGHTTREE +
  7.                        Common.S_WHERE + Field.USERID + Common.EQUAL + General.addQuotes(this.getUserID()) +
  8.                        Common.S_ORDER + Field.AFFAIRTYPEID + Common.COMMA + Field.EVENTTYPEID;
  9.       OleDbDataReader rst_UserRight = null;
  10.       try
  11.       {
  12.         string strRet = CommonQuery.qryRst(str_SQL,ref rst_UserRight);
  13.         if (strRet != “0”)
  14.         {
  15.           throw new Exception(“获得用户权限失败”);
  16.         }
  17.         string str_PreAffairTypeID = “”;
  18.         string str_PreEventTypeID = “”;
  19.         ReturnDoc doc_RightTree = new ReturnDoc();
  20.         XmlDocument doc_tmp = doc_RightTree.getDocument();
  21.         XmlElement ele_Root = null;
  22.         XmlElement ele_Query = null;
  23.         XmlElement ele_AffairType = null;
  24.         /// 对结果集进行遍历,用来生成功能树
  25.         while (rst_UserRight.Read())
  26.         {
  27.           /// 创建查询返回节点
  28.           if (!doc_RightTree.createQueryInfoNode())
  29.           {
  30.             throw new Exception(“UserCache.setUserRightsByUserID.创建查询返回节点时发生错误”);
  31.           } /// if (!doc_RightTree.createQueryInfoNode())
  32.           ele_Root = ele_Root == null ? (XmlElement)doc_RightTree.getQueryInfoNode() : ele_Root;
  33.           string str_AffairTypeID = rst_UserRight[Field.AFFAIRTYPEID].ToString();
  34.           string str_AffairTypeName = rst_UserRight[Field.AFFAIRTYPENAME].ToString();
  35.           string str_EventTypeID = rst_UserRight[Field.EVENTTYPEID].ToString();
  36.           string str_EventTypeName = rst_UserRight[Field.EVENTTYPENAME].ToString();
  37.           string str_OpURL = rst_UserRight[Field.OPURL].ToString();
  38.           int int_AffairTypeID = Convert.ToInt32(str_AffairTypeID);
  39.           XmlElement ele_EventType = null;
  40.           /// 查询事务
  41.           if (int_AffairTypeID == 4)
  42.           {
  43.             ele_AffairType = doc_tmp.CreateElement(Common.XDOC_OPERATION);
  44.             ele_AffairType.SetAttribute(Common.XML_PROP_AFFAIRTYPEID, str_AffairTypeID);
  45.             ele_AffairType.SetAttribute(Common.XML_PROP_NAME, str_AffairTypeName);
  46.             ele_Query = ele_AffairType;
  47.             ele_Root.AppendChild(ele_AffairType);
  48.           } /// if (int_AffairTypeID==4)
  49.           else
  50.           {
  51.             if (!str_PreAffairTypeID.EndsWith(str_AffairTypeID))
  52.             {
  53.               ele_AffairType = doc_tmp.CreateElement(Table.AFFAIRTYPE);
  54.               ele_AffairType.SetAttribute(Common.XML_PROP_AFFAIRTYPEID, str_AffairTypeID);
  55.               ele_AffairType.SetAttribute(Common.XML_PROP_TEXT, str_AffairTypeName);
  56.               str_PreAffairTypeID = str_AffairTypeID;
  57.               ele_Root.AppendChild(ele_AffairType);
  58.             }
  59.           }
  60.           /// 相同的事件类型,则不用重复创建
  61.           if (!str_PreEventTypeID.Equals(str_EventTypeID))
  62.           {
  63.             ele_EventType = doc_tmp.CreateElement(Table.EVENTTYPE);
  64.             ele_EventType.SetAttribute(Common.XML_PROP_EVENTTYPEID, str_EventTypeID);
  65.             ele_EventType.SetAttribute(Common.XML_PROP_TEXT, str_EventTypeName);
  66.             ele_EventType.SetAttribute(Common.XML_PROP_OPURL, str_OpURL);
  67.             ele_AffairType.AppendChild(ele_EventType);
  68.             str_PreEventTypeID = str_EventTypeID;
  69.           } /// if (!str_PreEventTypeID.equals(str_EventTypeID))
  70.         } /// while (rst_UserRight.next())
  71.         /// 将查询事务节点,追加到权限功能树的最后
  72.         if (ele_Query != null)
  73.         {
  74.           XmlElement ele_TempQuery = (XmlElement)ele_Query.Clone();
  75.           XmlElement ele_QueryInfo = (XmlElement)doc_RightTree.getQueryInfoNode();
  76.           ele_QueryInfo.RemoveChild(ele_Query);
  77.           ele_QueryInfo.AppendChild(ele_TempQuery);
  78.         } /// if (ele_Query!=null)
  79.         if (!doc_RightTree.addErrorResult(Common.RT_QUERY_SUCCESS))
  80.         {
  81.           throw new Exception(“添加函数返回结果失败”);
  82.         } /// if (!doc_RightTree.addErrorResult(Common.RT_QUERY_SUCCESS))
  83.         return doc_RightTree.getXml();
  84.       }
  85.       catch (Exception e)
  86.       {
  87.         return e.Message;
  88.       }
  89.       finally
  90.       {
  91.         rst_UserRight.Close();
  92.       }
  93.     }</span>

这是通过浏览器的网络查到返回的数据信息

 

经过页面解析就有了刚开始这样功能树:

     这样就实现了我们所要的功能树(所属某个角色权限)

总结:

刚开始接触这个框架的时候确实看不太懂,后面深入的调试之后发现很强大、灵活,角色、功能的添加每个都是有一个xml来对应的控制,特别是对字典表的管理,当用户添加字典表之后,会根据数据库的内容生产字典文件到xml文件,页面加载的时候是页面从对应的xml文件读取的,并非数据库中查询加载,这样大大提高了页面加载数据的效率,软件的用户体验度很好,对于大数据量的解决提供了好的思路。

我们见识的知识还很少,我们到现在这个阶段,更多的应该是站在巨人的肩膀之上来拓展我们的学习思路,总结前人好的学习方法、思路,为进一步的学习架构指导方向。

标签