基于xml 实现动态加载权限功能树列表---EFSFrame企业级开发架构
2014-01-23 11:19
891 查看
在学习EFSFrame框架的过程中,感触最深的就是通过xml来实现前台与后台数据的交互,页面设计灵活,不用管后台如何写的,前台与后台的交互唯一的交互通道都是xml,在我们需要添加页面、添加规定的格式的xml文件就可以很好的融入这个架构中,现自己把加载功能树这一块和大家分享
功能树的加载如图1:
下面是代码实战:
第一步是:这是登陆页面中的html文件中核心的内容:把用户输入的用户名、密码、IP,全部拼接成一个一定格式的xml文件,传给隐藏控件。
后台的代码,判断信息正确之后调到主页面:
主页面上显示功能树的div加载带有权限的功能树(分配什么权限只能显示相应的界面信息)
baseRefWeb.aspx用来加载树
查询用户权限的公共方法
这是通过浏览器的网络查到返回的数据信息
经过页面解析就有了刚开始这样功能树:
这样就实现了我们所要的功能树(所属某个角色权限)
总结:
刚开始接触这个框架的时候确实看不太懂,后面深入的调试之后发现很强大、灵活,角色、功能的添加每个都是有一个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文件读取的,并非数据库中查询加载,这样大大提高了页面加载数据的效率,软件的用户体验度很好,对于大数据量的解决提供了好的思路。
我们见识的知识还很少,我们到现在这个阶段,更多的应该是站在巨人的肩膀之上来拓展我们的学习思路,总结前人好的学习方法、思路,为进一步的学习架构指导方向。
相关文章推荐
- 基于xml 实现动态加载权限功能树列表---EFSFrame企业级开发架构
- jQuery实现动态加载select下拉列表项功能示例
- Android动态加载XML文件及控件来简单实现QQ好友印象的功能
- 在基于Ext的Efs框架下动态加载数据列表Grid
- xml 当作导航数据源,实现动态权限
- 基于spring+struts2+ibatis+OperaMasks实现的小系统(实现权限管理和动态开发)
- Delphi 中,基于接口,封装类为 BPL 包动态加载的程序架构
- 基于角色-功能-资源的权限控制模型的设计与实现-引子
- Struts2基于XML配置文件实现权限校验
- 【支持动态gif格式】基于java实现图像裁剪以及生成缩略图功能
- 封装实现JavaScript 文件的动态加载功能
- 【Unity快速实现小功能】加载文本文件之——加载xml文件
- Fresco动态设置加载特效[Java代码实现XML效果]GenericDraweeHierarchy
- 动态加载Silverlight应用的dll文件(可实现插件功能)
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- __利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载
- Qt实现小功能之列表无限加载
- 基于Groovy实现Spring Bean的动态加载
- 动态加载Silverlight应用的dll文件(可实现插件功能)(转)
- Android实现打电话的功能-使用Intent和AndroidManifset.xml中加入权限