jhope代码分析以及网站结构

news/2024/5/8 13:07:32/文章来源:https://blog.csdn.net/weixin_33730836/article/details/90095888

如下图所示,为Extjs部分代码提供的网页结构:
_
网站看上去本来是这样的
_
前端采用ExtJS,与后台的SpringMVC+Spring+Hibernate进行数据交互。
之前分析过登录的过程,不赘述
在loginController处理登录返回结果的最后,如下语句
_
也就是如果正确登录的话,跳转到xtype为appcentral的页面
_
这是一个普通的panel
_
它的内容是经典的四分空间
如果仔细看代码,会看到就是我们这片博文最开始的那个示意图所示的分割方式。
这里面我们重点看看“菜单”那个空间,也就是left
网页中,菜单的形式是这样的
_
下拉框的样子,挺复杂
但是点击最左侧的小三角,也可以变换形式:
_
_
看到至少有两种其他表现形式
下面看看ExtJS的代码是如何获取菜单内容的:
Central.js这个View带有一个ViewController
_
名为CentralController.js
这个View还带有一个ViewModel
_
名为CentralModel.js,样子如下
_
在它的constructor方法中
_
EU.RS();方法是作者自己定义的js方法。
发送给SpringMVC
_
_
看到buildListToTree()方法是static的,因此可以直接使用,没有什么依赖注入之类的。
也不能这么说,注入了一个一成不变的参数
_
_

@Service
public class SystemFrameService {@Resourceprivate DaoImpl dao;@SystemLogs("获取系统左侧树形菜单")public List<TreeNode> getMenuTree() {String userid = Local.getUserid();String usertype = Local.getUserBean().getUsertype();String companyid = Local.getCompanyid();String sql = "select" + "     a.menuid,a.menuname as text,a.parentid as parentId,a.icon,a.iconCls,a.iconColor, "+ "     c.moduletype as type,c.modulesource as url,c.objectid,a.menutype,a.orderno,a.isexpand as expanded "+ " from" + "      f_companymenu a,f_companymodule b,f_module c " + " where a.companyid = b.companyid "+ "      and a.cmoduleid = b.cmoduleid " + "      and b.moduleid = c.moduleid "+ "      and a.companyid = '" + companyid + "' ";if (!usertype.equals("01")) {sql += " and (" + "        (" + "           select count(1) c "+ "              from f_modulefunction mf1,f_userfunctionlimit ufl "+ "              where mf1.cmoduleid = b.cmoduleid and mf1.functionid = ufl.functionid and ufl.userid = '"+ userid + "' " + "        ) > 0" + "     or " + "     ( " + "           select count(1) c "+ "              from f_modulefunction mf2,f_rolefunctionlimit rfl,f_userrole ur "+ "              where mf2.cmoduleid = b.cmoduleid and mf2.functionid = rfl.functionid and rfl.roleid = ur.roleid and ur.userid ='"+ userid + "' " + "        ) > 0" + " ) ";}sql += " order by a.orderno";List<TreeNode> dataList = dao.executeSQLQuery(sql, TreeNode.class);Map<String, TreeNode> parentMap = new HashMap<String, TreeNode>();for (TreeNode node : dataList) {if (!CommonUtils.isEmpty(node.getParentId())) {parentNode(parentMap, node);}}for (String key : parentMap.keySet()) {dataList.add(parentMap.get(key));}return dataList;}
}

这部分获取参数的代码还是比较壮观的,执行了sql而非hql语句,返回值是自定义类型。
上述sql语句中直接使用了数据库中数据表的名字和字段,我们补充一下对应的信息:
_
_
_
其实在phpmyadmin中只能看到字段的含义,数据表的内容,是无法直观用图形的方式看到不同数据表之间关系的。推荐使用powerdesigner读取mysql导出的sql文件,形成pdm图,可以方便的看到数据库各种关系的全貌,直观而且准确。
_

_
使用powerdesigner生成pdm图的过程,可以参考
http://blog.csdn.net/duanchangqing90/article/details/38089557
这篇文章

使用chrome浏览器看看http request的内容以及response的内容
_
Request URL:http://www.jhopesoft.com:8080/cfcmms/platform/systemframe/getmenutree.do
_
_
也就是说,前端和后台的通讯完全在意料之中。
回到ExtJS代码中Central.js的ViewModel文件
_
上述文件只是初始化,为js中的变量menus赋值
这些数据,如何使用呢?
_
上图为菜单的View文件
_
_
_
这些数据从后台返回,并处理,然后存放在js变量中,赋值给store
_
_
看来我对于filterer的猜测是错的
下面看看TreeStore的root属性(config)
_
对于Ext.data.TreeStore来说,root属性中的expanded属性设置为true,意味着不管这个store是否设置为autoLoad,整个store都会直接load。
写到这里,我们还是没有搞清楚Component和Store之间是什么关系,为什么这些数据可以被显示成View中菜单的样子。
我们来看看Ext官网上 Ext.data.TreeStore 的案例代码:

//Store部分的代码
var store = Ext.create('Ext.data.TreeStore', {root: {expanded: true,children: [{ text: 'detention', leaf: true },{ text: 'homework', expanded: true, children: [{ text: 'book report', leaf: true },{ text: 'algebra', leaf: true}] },{ text: 'buy lottery tickets', leaf: true }]}
});//View部分的代码
Ext.create('Ext.tree.Panel', {title: 'Simple Tree',width: 200,height: 500,store: store,rootVisible: false,renderTo: Ext.getBody()
});

上述代码的效果图如下
_
也就是说一个View和一个Store就可以轻易创建出上述样子的菜单。
我们也看到treepanel没什么代码,store的核心就是root children 和 text。
_
很显然c必须是字符串的数组也就是

c = [{text:菜单项1},{text:菜单项2},{text:菜单项3}]

那么菜单上面的文字,必须出现在text这个属性中,如下图
_
我们看看c的来源
_
就是Ext采用Ajax()方法对某个url发送request的返回值
因此我们有必要先去浏览器的开发者工具看看,返回值究竟是怎样的形式:
_
也就是说,ajax发送的返回值,在被ExtJS的js代码处理之前,就已经有了text这个字段,那么就肯定是Spring代码的自定义返回值,就已经安排好的。
_
_
上述的POJO是自定义返回值,其中一个字段就是text
而执行查询的executeSQLQuery()方法,也是DAO中自定义返回值的查询方法(非自定义返回值意味着,采用PO作为返回类型)
上面的描述基本讲清楚了,菜单上面的中文字符串的来源。

下面看看菜单上的菜单项,点击以后,有什么效果。
菜单的View部分页面的本质是Ext.tree.Panel
_

_

_
上述js代码就是,你点击菜单上的文字后,将一个完全新的tab页,并列到“首页”tab右边的js代码

                    /*** 将标准模块加入tabpanel中了,如果已经有了,就转至该tab页 itemId:module_(moduleName)*/addModuleToMainRegion : function(menuitem, donotActive) {var moduleName = menuitem.moduleName;var menuid = menuitem.menuid;var view = this.getView().down('maincenter');var tabItemId = 'module_' + menuid; // tabPanel中的itemIdvar tab = view.down('> panel#' + tabItemId);// 查找当前主区域中是否已经加入了此模块了if (!tab) {var tabPanel = null;// type : 01=外部xtype,03=实体对象if (menuitem.type == '01') {tabPanel = Ext.getCmp(tabItemId);if (!tabPanel) {tabPanel = Ext.create(menuitem.url, {id : tabItemId,autoDestroy : true,title : menuitem.text,closable : true});}} else if (menuitem.type == '03') {tabPanel = modules.getModuleInfo(moduleName).getModulePanel(tabItemId);}if (!tabPanel)return;if (!Ext.isEmpty(menuitem.glyph))tabPanel.glyph = menuitem.glyph;if (!Ext.isEmpty(menuitem.iconCls))tabPanel.iconCls = menuitem.iconCls;tab = view.add(tabPanel);}if (!donotActive)view.setActiveTab(tab);}

这段代码应该好好学学
_

_
上图中item
_
其实写到这里我的感觉就是强弩之末。
你点击了菜单的某一个选项,你想知道都发生了什么。

其实你很清楚,不论点击那个菜单项,结果是一样的:在首页tab右边,生成一个新的tab,至于这个tab是什么结构,里面是什么内容,取决于菜单项的id之类的信息。也就是刚刚进入网站,默认load那个treePanel,也就是菜单。(菜单是个treePanel,刚进入网站的时候默认发送ajax类型的request获取了菜单的所有内容)

那么,点击了菜单项以后,究竟发生了什么呢?

我们之前分享的那段代码,有一段十分重要:

//定位到maincenter
var view = this.getView().down('maincenter');
...................
//创建tabelse if (menuitem.type == '03') {tabPanel = modules.getModuleInfo(moduleName).getModulePanel(tabItemId);}......................//把tab加到view上,也就是让它显示tab = view.add(tabPanel);

上述代码的核心就是modules
_

/*** 取得模块的定义* @param {} moduleid ,参数可以是moduleid、modulecode、objectname、objectid* @return {}*/getModuleInfo : function(moduleid){if (Ext.isEmpty(moduleid)) {EU.toastWarn('加载moduleid不能为空!');return;}var me = this,result = me.modules.get(me.modulesKeys[moduleid.toUpperCase()]);if (result) return result;var url = "platform/module/getmoduleinfo.do",params = {moduleid : moduleid};EU.RS({url : url,params : params,async : false,callback : function(moduleinfo){me.replaceRef(moduleinfo, moduleinfo);if (moduleinfo) {result = new Ext.create('app.view.platform.module.ModuleInfo', moduleinfo);me.modules.add(moduleinfo.moduleid, result);me.modulesKeys[moduleinfo.moduleid.toUpperCase()] = moduleinfo.moduleid;me.modulesKeys[moduleinfo.modulecode.toUpperCase()] = moduleinfo.moduleid;me.modulesKeys[moduleinfo.fDataobject.objectid.toUpperCase()] = moduleinfo.moduleid;me.modulesKeys[moduleinfo.fDataobject.objectname.toUpperCase()] = moduleinfo.moduleid;} else {EU.toastWarn('加载' + moduleid + '的模块数据时失败!');}}});return result;},

_
Ctrl + H 搜索一下
modulepanel 意味着:
_
同志们,我们找到所有的核心了!!!
Module.js这个文件太关键了,因为它就是模板,这个文件就是个普通panel但是这个文件中,定义了Store和Items
也就是说,你点击菜单项创建的新的tab,取哪些数据,显示哪些UI就完全取决于这个文件了~!!!
我们上代码:

initComponent : function(){var me = this;if (Ext.isObject(me.param)) Ext.apply(me, me.param)me.moduleInfo = modules.getModuleInfo(me.moduleId);me.objectName = me.moduleInfo.fDataobject.objectname;me.model = me.moduleInfo.model;me.istreemodel = me.moduleInfo.fDataobject.istreemodel;//Store是那种类型:二选一me.store =Ext.create('app.view.platform.module.' + (me.istreemodel ? 'treegrid.TreeGridStore' : 'grid.GridStore'), {module : me.moduleInfo,modulePanel : me,model : me.model});me.store.getProxy().extraParams.moduleName = me.moduleInfo.fDataobject.objectname;if (me.parentFilter) me.store.parentFilter = me.parentFilter;me.enableNavigate =!me.istreemodel && me.enableNavigate&& (me.moduleInfo.fDataobject.navigatedesign || me.moduleInfo.getNavigateSchemeCount() > 0);me.collapseNavigate = me.moduleInfo.getNavigateSchemeCount() == 0 || me.collapseNavigate;me.defaults = {moduleInfo : me.moduleInfo,objectName : me.objectName,modulePanel : me,parentFilter : me.parentFilter};//Items中的核心UI Componentvar center = {xtype : me.istreemodel ? 'moduletreegrid' : 'modulegrid',store : me.store,region : 'center',modulePanel : me,inWindow : me.inWindow};me.items = [me.centerRegionNest ? {xtype : 'panel',region : 'center',layout : 'fit',items : [Ext.apply(center, me.defaults)]} : center];

写到这里真的写不下去了,因为,你为什么这么傻呢?
读代码多枯燥啊,我们直接去chrome上看数据传递,不就很直观么?走着!
_
我们看到执行了三次request
_
getmoduleinfo.do
fetchdata.do
这明显就是发送给SpringMVC的
如果看看response中的数据:
getmoduleinfo.do
_
fetchdata.do
_
看上去上面两类request分别用来获取
整个模板的数据和数据库中对应数据的数据。
_
fetchdata.do在整个代码中,只出现一次,靠,复用啊
_
我们看到了一个经典的Store,看到了吧,完美

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_707107.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从购买域名到nginx,flask搭建自己的网站

搭建一个只属于自己的网站? 一、注册域名&#xff08;可选*&#xff09; 1.注册阿里云账号 网址&#xff1a;登录&#xff08;注册&#xff09; 2.购买域名&#xff1a;阿里云域名注册 有一元域名、免费域名等。 购买过程中需要创建信息模板&#xff08;必须完成邮箱真实…

win10任务栏和开始菜单_如何将网站固定到Windows 10任务栏或开始菜单

win10任务栏和开始菜单Having quick access to frequently-used or hard to remember websites can save you time and frustration. Whether you use Chrome, Firefox, or Edge, you can add a shortcut to any site right to your Windows 10 taskbar or Start menu. 快速访问…

kompozer如何启动_使用KompoZer创建网站

kompozer如何启动Are you looking for a way to easily start creating your own webpages? KompoZer is a nice basic website editor that will allow you to quickly get started and become familiar with the process. 您是否正在寻找一种轻松创建自己的网页的方法&#…

pageadmin CMS网站建设教程:站点添加自定义字段

首先看看pagedmin默认的站点设置都有什么&#xff0c;如下图&#xff1a; 这里只有一些最基本的参数设置&#xff0c;用过3.0版本或用过其他公司开发的cms的用户应该有这种体验&#xff0c;在站点设置中可以设置logo图片&#xff0c;备案号&#xff0c;底部内容等等。 那么为什…

在Teams中对网站的URL特殊解析

Teams中有一个不太被大家注意的扩展点&#xff0c;名字叫Link unfurling&#xff0c;就是对于一些特殊域名的URL进行特别的解释。 可能这么说&#xff0c;大家还是无法理解&#xff0c;我们看一下下面这个图&#xff0c;当用户在message输入框中输入了一窜url后&#xff0c;Te…

震惊的网站,都是干货

分享15个鲜为人知的的小众网站&#xff0c;每一个可以让你打开新世界的大门&#xff0c;让你震惊。 1&#xff1a;仿知网 https://www.cn-ki.net/ 仿知网是一个完全可以代替知网的精品网站&#xff1b;是一个非常强大的论文搜索网站。 首先这个网站的论文检索结果和知网的搜索结…

【渗透过程】嘉缘网站 --测试

声明&#xff1a;本片文章测试网站为测试靶场 信息收集阶段&#xff1a; 首先使用了一些常见的扫描工具&#xff1a;nmap 御剑 使用nmap扫描端口 发现网站开放了 135 139 445 3306 等端口 这里可以看到网站开放了一些危害较高端口&#xff1a;135 225等 使用御剑扫描到一些敏感…

html广告条效果,css3炫酷网站banner广告动画特效

这是一款可以用来遮罩网站banner或广告的动画特效插件。该特效使用的是 CSS3 animations。注意不是所有的浏览器都支持 CSS3 animations。如果你对 CSS3 animations还不了解&#xff0c;建议你先阅读W3C CSS Animations。HTMLhtml结构如下&#xff1a;Lost at sea?Relax - wev…

一步一步SharePoint 2007之五:向网站中添加一个子网站

一步一步SharePoint 2007之五&#xff1a;向网站中添加一个子网站摘要感受完看到成果的激动&#xff0c;感受完邻家女孩的漂亮、可爱和端庄&#xff0c;不要停止&#xff0c;来&#xff0c;让我们一起来动手打造心目中的完美女神吧&#xff01;本篇文章将介绍如何向一个网站中添…

匿名用户访问用发布站点模板创建网站的列表项时要求登录的问题解决

因为发布站点中的一个Feature被打开了&#xff0c;造成将列表FormPage的查看给Lock了&#xff0c;所以需要登录&#xff0c;将其关闭就OK了。哈哈。英文KB&#xff1a;Users are unexpectedly prompted to enter their credentials when they access a list in a Windows Share…

怎么看网站是否被黑防止网站被黑

2019独角兽企业重金招聘Python工程师标准>>> 网站被黑&#xff0c;打开网站竟然跳转到博cai网站上去了&#xff0c;一开始以为自己看错了&#xff0c;多次从百度点击自己网站进去&#xff0c;还是会跳转到彩piao网站上&#xff0c;第一反应是自己的网站被黑了&#…

kali怎么成为管理员_网站死链是什么、是怎么引起的以及死链对SEO优化的影响?...

网站死链是我们在做SEO时必不可少的一个错误&#xff0c;对于从事SEO行业的人员来说&#xff0c;网站死链最熟悉不过了&#xff0c;但是对于那些刚入SEO行业的新手来说&#xff0c;还是不太熟悉。今天我们就给大家讲一下什么是网站死链&#xff1f;网站死链是怎么引起的&#x…

使用HTML5、CSS3和jQuery增强网站用户体验

记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验&#xff1f;是不是立刻就想到了flash实现&#xff1f;这彷佛年代久远的事了。使用现在最流行的Web技术HTML5&#xff0c;CSS3和jQuery&#xff0c;同样也可以实现类似的用户体验。而且使用这些特性将会比使用…

6款国内外SNS开源软件 搭建社交网站利器

SNS(Social Network Service)&#xff0c;有时称为社交网络&#xff0c;有时称为社会化网络&#xff0c;专指旨在帮助人们建立社会性网络的互联网应用服务。如果对SNS概念还很模糊&#xff0c;说到人人网、开心网你就明白了。 去年360圈、蚂蚁网接连关站给SNS前景蒙上一层阴影&…

seo每日一贴_白杨SEO:我看ZAC的外贸SEO应该怎样做?(策略篇)

前言&#xff1a;这是白杨SEO公众号更新第64篇。本该写写头条SEO啥的&#xff0c;最近在师徒培训讲站内SEO时有旁听同学提到后面讲讲谷歌SEO怎么样&#xff0c;因为谷歌全世界搜索市场占有率&#xff0c;所以外贸SEO最主要还是做谷歌SEO。以白杨特意又去了前辈ZAC的SEO每日一贴…

用webBrowser取源文件取不到的点击数--选秀榜selectop.com网站内容管理系统之六

用idhttp可以取到源文件&#xff0c;但网站用脚本代码&#xff0c;源文件是看不到&#xff0c;并且代码的结果也取不出。webBrowser可以多次返回下载到的内容&#xff0c;不包括任何html语法&#xff0c;这个当中就有文章的点击数。在WebBrowser1DownloadComplete事件中处理&am…

移动网站开发——标记语言

移动互联网被称为“第五次科技革命”&#xff0c;而随着iPhone和Android等智能手机的日渐流行和iPad等平板电脑的出现&#xff0c;移动互联网的潜力和趋势也愈发显现&#xff0c;针对移动设备的网站开发越来越受到关注&#xff0c;国内很多公司也开始重视面向所有移动设备的网站…

ux体验网站 英国_定义网站图像时的UX注意事项

ux体验网站 英国As the saying goes —俗话说 - “A picture is worth a thousand words.”“一张图片胜过千言万语。” When creating content on the web, it’s often recommended to be using high-quality imageries and making sure that the images serve its purpose …

出色的社区网站_《最后的我们》中出色的制作系统

出色的社区网站游戏设计分析 (GAME DESIGN ANALYSIS) The Last of Us became an instant classic the day it was released, back in 2013. At the sunset of the sixth console generation, it felt like Naughty Dog managed to raise the bar in all critical areas of game…