基于xml 实现动态加载权限功能树列表---EFSFrame企业级开发架构

前端之家收集整理的这篇文章主要介绍了基于xml 实现动态加载权限功能树列表---EFSFrame企业级开发架构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

功能树的加载如图1:


下面是代码实战:

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

function doSubmit()
{
    strUserIp = "<% =strUserIP %>";
    strUserTitle = document.getElementById("txtUserName").value;
    if(strUserTitle == "")
    {
      alert("用户名不能为空");
      return false;
    }
    strUserPWD = document.getElementById("txtUserPWD").value;
    if(strUserPWD == "")
    {
      alert("密码不能为空");
      return false;
    }
    strMac = document.getElementById("txtMac").value;
    //拼接xml文件
    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>';
    //通过隐藏控件传到后台
    document.getElementById("txtXML").value = strXml;
    
    return true;
}

后台代码,判断信息正确之后调到主页面
protected void Page_Load(object sender,EventArgs e)
    {
      


      
      if (IsPostBack)
      {
        try{
            //获取到xml的值
          string strXml = Request["txtXML"];
          // strXml = XmlFun.addXDocHead(strXml);
          //创建创建一个doc对象
          XmlDocument doc = XmlFun.CreateNewDoc(strXml);
            //解析获取xml中的用户名、密码、IP\mac等信息
          string strUsertitle = XmlFun.getNodeValue(doc,Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.USERTITLE);
          string strPassWord = XmlFun.getNodeValue(doc,Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.USERPASSWORD);
          string strIP = XmlFun.getNodeValue(doc,Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.LOGINIP);
          string strMac = XmlFun.getNodeValue(doc,Common.BAR2 + Common.XDOC_LOGININFO + Common.BAR + Field.MAC);
            //调用相应的sql语句查询方法
          string str_sql = "SELECT * FROM VW_USERLIST WHERE USERTITLE='" + strUsertitle + "'";
          string strErr = "";
            //创建一个新的对象
          ReturnDoc Rtdoc = new ReturnDoc();

          OleDbDataReader rst = null;
            //判断是否存在这条记录的信息
          string strRet = CommonQuery.qryRst(str_sql,ref rst);
          if (strRet == "0")
          {
            Rtdoc.getQueryInfo(rst);
            //判断用户输入的密码是否和数据库中的密码相同

            if (strPassWord != Rtdoc.getNodeValue(Common.BAR2 + Field.USERPASSWORD))
            {
              strErr = "密码错误";
            }
          }
          else
          {
            strErr = "查询用户信息为空";
          }

          rst.Close();

          if(strErr == "")
          {
              //根据xml信息查找用户的权限信息,并把xml中的信息实例化一个用户的实例对象
            UserSession user = new UserSession(Rtdoc.getXml());

            string[] arrSys = { user.getUserID(),user.getUserTitle(),user.getUserName(),"",user.getUnitID(),user.getUnitName(),strIP,strMac };
            //记录系统日志
              string logid = SystemLog.addSysLog(arrSys);
            user.setLogID(logid);
              //登录信息信息保存用户名、角色 到Session中
            Session.Add("RoleUser",user);
              //加载主页面
            Response.Redirect("Login.aspx");
            Response.End();
          }
          else
          {

页面显示功能树的div加载带有权限的功能树(分配什么权限只能显示相应的界面信息)
<div iconCls="icon-tree" region="west" width="150" title="功能树" collapsible="true" border="false">
	<div region="center" id="treepanel" xtype="treepanel" height="450" autoScroll="true" onEfsClick="doTreeClick()" border="false">
        <%--加载设计有权限的树--%>
    <div xtype="xmlloader" url="sysadmin/baseRefWeb.aspx?method=getUserRightTree" parentPath="QUERYINFO"></div>
	</div>

baseRefWeb.aspx用来加载树

protected void Page_Load(object sender,EventArgs e)
    {
      try
      {
        string sMothod = Request["method"];
        if (!General.empty(sMothod))
        {
          Type ts = typeof(baseRef);

          object obj = Activator.CreateInstance(ts,null); //获得一个实例

          object[] methodParamArgs = new object[] { Request,Response };

          MethodInfo mi = ts.GetMethod(sMothod); //获得执行方法

          string sXml = (string)mi.Invoke(obj,methodParamArgs); //带参数委托方法调用并返回值

          Response.ContentType = "text/xml;charset=utf-8";
          Response.Charset = "UTF-8";
            //返回读取后权限的xml信息
          Response.Write(sXml);
        }
      }


查询用户权限的公共方法

/// <summary>
    /// 查询用户权限
    /// </summary>
    /// <returns></returns>
    public string getUserRightTree(HttpRequest Request,HttpResponse Response)
    {
        //通过查找角色信息
      UserSession userInfo = (UserSession)Session["RoleUser"];
      string strTree = userInfo.getUserRightsByUserID();
      return strTree;
    }

/// 查询出该用户的权限信息
    public string getUserRightsByUserID()
    {
      /// 查询出该用户的权限信息
      string str_sql = Common.SELECT + Common.DISTINCT + Common.ALL +
                       Common.S_FROM + Table.VW_USERRIGHTTREE +
                       Common.S_WHERE + Field.USERID + Common.EQUAL + General.addQuotes(this.getUserID()) +
                       Common.S_ORDER + Field.AFFAIRTYPEID + Common.COMMA + Field.EVENTTYPEID;


      OleDbDataReader rst_UserRight = null;
      try
      {
        string strRet = CommonQuery.qryRst(str_sql,ref rst_UserRight);

        if (strRet != "0")
        {
          throw new Exception("获得用户权限失败");
        }

        string str_PreAffairTypeID = "";
        string str_PreEventTypeID = "";

        ReturnDoc doc_RightTree = new ReturnDoc();

        XmlDocument doc_tmp = doc_RightTree.getDocument();

        XmlElement ele_Root = null;
        XmlElement ele_Query = null;
        XmlElement ele_AffairType = null;

        /// 对结果集进行遍历,用来生成功能树
        while (rst_UserRight.Read())
        {
          /// 创建查询返回节点
          if (!doc_RightTree.createQueryInfoNode())
          {
            throw new Exception("UserCache.setUserRightsByUserID.创建查询返回节点时发生错误");
          } /// if (!doc_RightTree.createQueryInfoNode())

          ele_Root = ele_Root == null ? (XmlElement)doc_RightTree.getQueryInfoNode() : ele_Root;

          string str_AffairTypeID = rst_UserRight[Field.AFFAIRTYPEID].ToString();
          string str_AffairTypeName = rst_UserRight[Field.AFFAIRTYPENAME].ToString();
          string str_EventTypeID = rst_UserRight[Field.EVENTTYPEID].ToString();
          string str_EventTypeName = rst_UserRight[Field.EVENTTYPENAME].ToString();
          string str_OpURL = rst_UserRight[Field.OPURL].ToString();

          int int_AffairTypeID = Convert.ToInt32(str_AffairTypeID);

          XmlElement ele_EventType = null;

          /// 查询事务
          if (int_AffairTypeID == 4)
          {
            ele_AffairType = doc_tmp.CreateElement(Common.XDOC_OPERATION);
            ele_AffairType.SetAttribute(Common.XML_PROP_AFFAIRTYPEID,str_AffairTypeID);
            ele_AffairType.SetAttribute(Common.XML_PROP_NAME,str_AffairTypeName);

            ele_Query = ele_AffairType;
            ele_Root.AppendChild(ele_AffairType);
          } /// if (int_AffairTypeID==4)
          else
          {
            if (!str_PreAffairTypeID.EndsWith(str_AffairTypeID))
            {
              ele_AffairType = doc_tmp.CreateElement(Table.AFFAIRTYPE);
              ele_AffairType.SetAttribute(Common.XML_PROP_AFFAIRTYPEID,str_AffairTypeID);
              ele_AffairType.SetAttribute(Common.XML_PROP_TEXT,str_AffairTypeName);

              str_PreAffairTypeID = str_AffairTypeID;
              ele_Root.AppendChild(ele_AffairType);
            }
          }

          /// 相同的事件类型,则不用重复创建
          if (!str_PreEventTypeID.Equals(str_EventTypeID))
          {
            ele_EventType = doc_tmp.CreateElement(Table.EVENTTYPE);
            ele_EventType.SetAttribute(Common.XML_PROP_EVENTTYPEID,str_EventTypeID);
            ele_EventType.SetAttribute(Common.XML_PROP_TEXT,str_EventTypeName);
            ele_EventType.SetAttribute(Common.XML_PROP_OPURL,str_OpURL);
            ele_AffairType.AppendChild(ele_EventType);
            str_PreEventTypeID = str_EventTypeID;
          } /// if (!str_PreEventTypeID.equals(str_EventTypeID))
        } /// while (rst_UserRight.next())



        /// 将查询事务节点,追加到权限功能树的最后
        if (ele_Query != null)
        {
          XmlElement ele_TempQuery = (XmlElement)ele_Query.Clone();
          XmlElement ele_QueryInfo = (XmlElement)doc_RightTree.getQueryInfoNode();
          ele_QueryInfo.RemoveChild(ele_Query);
          ele_QueryInfo.AppendChild(ele_TempQuery);
        } /// if (ele_Query!=null)

        if (!doc_RightTree.addErrorResult(Common.RT_QUERY_SUCCESS))
        {
          throw new Exception("添加函数返回结果失败");
        } /// if (!doc_RightTree.addErrorResult(Common.RT_QUERY_SUCCESS))

        return doc_RightTree.getXml();
      }
      catch (Exception e)
      {
        return e.Message;
      }
      finally
      {
        rst_UserRight.Close();
      }
    }

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


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


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

总结:

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

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

原文链接:https://www.f2er.com/xml/299220.html

猜你在找的XML相关文章