前面我们登录是已经成功了的。现在我们就要来设计我们的主界面了,主界面其实也采用了border的布局方式。
北部:标题栏
南部:版权栏
西部:菜单栏
东部:内容栏
这儿难得地方应该就是菜单和内容栏部分了;
登录:
主界面布局:
主界面布局代码:
Ext.onReady(function(){ Ext.BLANK_IMAGE_URL = 'iamge/s.gif'; Ext.QuickTips.init(); Ext.lib.Ajax.defaultPostHeader += ";charsetutf-8"; //head部分 var head = new Ext.Panel({ region:'north',//北方即顶部 border:false, html:'<div style="background:url(image/main1.gif) repeat-x; height:78px;"></div>', height:80 }); //foot部分 var foot = new Ext.Panel({ region:'south', html:'<div style="background:url(image/main2.gif) repeat-x;height:33px;">' +'<div style="float:left;font:normal 12px 宋体;margin:10px 0 0 0px;">' +'Power By:<span style="color:blue">杨静</span> </div>' +'<div style="float:right;margin:10px;font:normal 12px 宋体;">' +'版权所有:<a href="http://www/morik.com">http://write.blog.csdn.net/postlist</div>' +'</div>', height:35 }); //leftMenu部分 //临时代码 var leftmenu = new Ext.Panel({ region:'west', html:'<div>导航菜单</div>', width:200 }); //创建内容显示部分 //临时代码 var mainTab = new Ext.Panel( { region : 'center', html : '<div>主内容部分</div>' }); //建立leftmenu和miantab两者之间的关系 leftmenu.on("nodeClick", function(nodeAttr) { mainTab.loadTab(nodeAttr); }); //创建布局 var viewport = new Ext.Viewport( { layout : 'border', style : 'border:#024459 2px solid;', items : [head, foot, leftmenu, mainTab] }); });
主界面的html代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>OA系统主页面</title> <!-- 引入Ext Js的样式文件 --> <link rel="stylesheet" type="text/css" href="extjs3.2.1/resources/css/ext-all.css"> <!-- 引入Ext Js的适配文件 --> <script type="text/javascript" src="extjs3.2.1/adapter/ext/ext-base.js"></script> <!-- 引入Ext Js的框架文件,该文件方便调试,在实际应用中直接引用ext-all.js文件 --> <script type="text/javascript" src="extjs3.2.1/ext-all-debug.js"></script> <!-- 引入相关的js文件 --> <!-- 左边菜单区域的js文件 --> <script type="text/javascript" src="js/LeftMenu.js"></script> <!-- 主界面的右边的内容区域的js --> <script type="text/javascript" src="js/MenuPanel.js"></script> <!-- 主框架布局的js --> <script type="text/javascript" src="js/Main.js"></script> </head> <body> <div id='deskTree' ></div> <div id='mainTree' ></div> <div id='sysTree' ></div> </body> </html>
现在窗体的框架基本都出来了现在我们就要向里面装东西了,
main.js代码如下:
Ext.onReady(function(){ Ext.BLANK_IMAGE_URL = 'image/s.gif'; Ext.QuickTips.init(); Ext.lib.Ajax.defaultPostHeader += ";charsetutf-8"; //head部分 var head = new Ext.Panel({ region:'north',//北方即顶部 border:false, html:'<div style="background:url(image/main1.gif) repeat-x; height:78px;"></div>', height:80 }); //foot部分 var foot = new Ext.Panel({ region:'south', html:'<div style="background:url(image/main2.gif) repeat-x;height:33px;">' +'<div style="float:left;font:normal 12px 宋体;margin:10px 0 0 0px;">' +'Power By:<span style="color:blue">杨静</span> </div>' +'<div style="float:right;margin:10px;font:normal 12px 宋体;">' +'版权所有:<a href="http://weibo.com/207286868">http://weibo.com/207286868</div>' +'</div>', height:35 }); //leftMenu部分 //临时代码 /*var leftmenu = new Ext.Panel({ region:'west', html:'<div>导航菜单</div>', width:200 });*/ var t1 = new Ext.tree.TreePanel({ //构建树组件 border:false, rootVisible:false, //根节点不可视 root:new Ext.tree.AsyncTreeNode({//通过根节点来实现所有节点数据 text:'我的办公桌',//该内容在树组件中不可视 expanded:true,//起初展开根状态 //根节点的子节点数据 children:[{ id:"docRec",//text为节点显示的文本,leaf为叶子节点 text:"接收公文", leaf:true //说明他是叶子节点 },{ id:"docSend", text:"发送公文", leaf:true },{ id:"docManage", text:"公文管理", leaf:true }] }) }); var t2 = new Ext.tree.TreePanel({ border : false, rootVisible : false, root : new Ext.tree.AsyncTreeNode( { text : "主数据管理", expanded : true, children : [ { id : "department", text : "部门管理", leaf : true }, { id : "company", text : "公司管理", leaf : true }, { id : "permissions", text : "权限管理", children : [ { id : "permission", text : "权限管理", leaf : true }, { id : "permissionType", text : "权限类别", leaf : true }] }] }) }); var leftmenu = new Morik.Office.LeftMenu( { title : '我的办公系统', // items : [ { // title : '我的办公桌', // items : [t1] // }, { // title : '主数据管理', // items : [t2] // }] trees : [t1, t2] }); //创建内容显示部分 //临时代码 /*var mainTab = new Ext.Panel( { region : 'center', html : '<div>主内容部分</div>' });*/ var mainTab = new Morik.Office.MainingPanel( { style : 'padding:0 6px 0 0', autoScroll : true, region : 'center', deferredRender : false, activeTab : 0, resizeTabs : true, inTabWidth : 100, tabWidth : 90, enableTabScroll : true, items : [{ title : '我的首页', html : '<div style="background:url(image/main.gif) no-repeat center middle; height:508px;"></div>' }] }); //建立leftmenu和miantab两者之间的关系 leftmenu.on("nodeClick", function(nodeAttr) { mainTab.loadTab(nodeAttr); }); //创建布局 var viewport = new Ext.Viewport( { layout : 'border', style : 'border:#024459 2px solid;', items : [head, foot, leftmenu, mainTab] }); });
在页面的左边是我们导航菜单,在Extjs中有种布局叫做accordion布局,这种布局专门用来处理我们现在遇到的这种情况。
LeftMenu.js代码示例如下:
Ext.ns("Morik", "Morik.Office", "Morik.Util", "Morik.Office.Department"); Morik.Office.LeftMenu = function(config){ var d = Ext.apply({ split:true,//border布局中,中左区域和中右区域采用6px的分隔区域进行分隔 region:'west',//默认在主框架页面的左边 collapseMode :'mini', width:200,//宽为200px defaults : { border : false }, layoutConfig : { animate : true } },config || {});//动画方式的accordion //采用accordion布局来进行配置。这两个是导航菜单组件的核心,不能配置 config = Ext.apply(d, { layout : 'accordion', collapsible : true }); //我们通过Function类的call方法来改变Panel类的作用域 //同时把配置项也传递给Panel类。继承Ext.Panel类中的构造函数功能 Morik.Office.LeftMenu.superclass.constructor.call(this, config); //实现本类的功能 //遍历配置项trees集合 for(var i=0;i<this.trees.length;i++) this.add({title:this.trees[i].getRootNode().text, items:[this.trees[i]] }); //注册的事件名 this.addEvents('nodeClick'); //运行事件监听函数 this.initTreeEvent(); } Ext.extend(Morik.Office.LeftMenu, Ext.Panel, { //LeftMenu类的方法 initTreeEvent:function(){ if(!this.items) return; for(var i = 0; i<this.items.length;i++){//导航菜单每个子组件 var p = this.items.itemAt(i);//每个子组件 if(p) var t = p.items.itemAt(0);//每棵树 if(t) t.on({ //通过属组建click事件来构建LeftMenu组件的nodeClick事件 'click':function(node,event){ //叶子节点,取消其默认事件处理 if (node && node.isLeaf()) { event.stopEvent(); //执行注册nodeClick事件注册的回调函数 this.fireEvent('nodeClick', node.attributes); } }, scope : this }) } } });
左边的导航单部分我们是做好了,通过main.js中建立leftmenu和miantab两者之间的关系,我们来处理右部的内容界面。
当用户单击左边导航菜单中的节点时,工作区域就会载入与该节点相对应的内容。
MainPanel.js代码如下:
Ext.ns("Morik", "Morik.Office", "Morik.Util", "Morik.Office.Department"); Morik.Office.MainingPanel = Ext.extend(Ext.TabPanel, { initComponent : function() { //这里通过initComponent函数来初始化MainingPanel组件 //一些初始化工作 Morik.Office.MainingPanel.superclass.initComponent.call(this); this._cache = {}; }, /*其他的方法*/ loadTab:function(node){ var n = this.getComponent(node.id);//根据节点id找到TabPanel中的子组件 if(n){ this.setActiveTab(n);//如果该node的id指定的子组件存在,就激活他 }else{ //把node的属性组成一个参数对象 var c = { 'id' : node.id, 'title' : node.text, closable : true }; //没有找到就创建它 var pn = this.findPanel(node.id);//找到对应类 //构建该类的实例对象 n = this.add(pn ? new pn(c) : Ext.apply(c, { html : '你还没有实现该页面!' })) n.show().doLayout();//显示并进行布局 } if (n.ds) n.ds.load({params:{start:0, limit:10}}); }, findPanel : function(name) { //从手动建立的关系的集合查找 var ret = this._cache[name]; if(!ret){ //采用指定的ns命名空间来构建,如果命名空间没有指定,采用默认命名空间 var pn = (this.ns ? this.ns : 'Morik.Office') + "." + Ext.util.Format.capitalize(name) + 'Panel'; var ret = eval(pn);//通过该类名找到该类 } return ret;//返回该类 }, addPanel : function(name, panel) { if (!this._cache) this._cache = {};//手动注册这些集合 this._cache[name] = panel; } });
最后的效果图: