Extjs4.X--开发后台管理系统--框架搭建
在实际Ext项目开发中,主框架的搭建是关键,下面根据个人经验做一个简单的事例!
1.运行主界面如下图:
2、前台的JS文件,采用Ext4.X提供的MVC框架建立如下目录结构!
(1)App.js 应用程序的入口
Ext.onReady(function(){ Ext.QuickTips.init(); Ext.Loader.setConfig({ enabled : true }); Ext.application({ name : 'AM', appFolder : 'app', launch : function(){ Ext.create('Ext.container.Viewport',{ layout :'fit', loadMask:{ msg : '正在加载,请稍后...' }, items : { xtype : 'mainview' } }); }, controllers : [ 'MainController'] }); });
(2).MainView.js 主界面
Ext.define('AM.view.MainView',{ extend:'Ext.panel.Panel', alias : 'widget.mainview', layout: 'border', items: [ { title: '系统标题', region: 'north', xtype: 'panel', margins:'0 0 5 0', tbar:[ '->', '张三,欢迎您!', 'Date:'+Ext.Date.format(new Date(),'Y-m-d'), { text:'修改密码' }, { text:'退出' }, { xtype:'displayfield', width:50 } ] }, { title: '操作菜单', region:'west', xtype: 'menutree', layout:'fit', margins:'0 0 1 1', split:true, width: 180, maxWidth:250, collapsible: true },{ region: 'center', id:'centerId', xtype: 'tabpanel', margins:'0 1 1 0', layout: 'fit', items:[ { title:'主界面', padding:10, html:'这里是系统简介!' } ] },{ title: '系统版本及说明', region: 'south', xtype: 'panel', split: true }], initComponent : function(){ this.callParent(arguments); } });
(3).MenuView.js 左边菜单界面
Ext.define('AM.view.MenuView',{ extend:'Ext.tree.Panel', alias : 'widget.menutree', store:'MenuStore', animate:true, rootVisible:false, initComponent : function(){ this.callParent(arguments); } });
(4).MenuModel.js 数据模型
Ext.define('AM.model.MenuModel',{ extend:'Ext.data.Model', fields:['id','text','leaf','iconCls','url'] });
(5).MenuStore.js 数据集
Ext.define('AM.store.MenuStore',{ extend:'Ext.data.TreeStore', fields:['id','text','leaf','href','url','iconCls'], proxy: { type: 'ajax', url: 'Tree/getTreeList.do' }, reader : { type : 'json' }, root: { text: '树根', id: '00', expanded: true }, folderSort: true, sorters: [{ property: 'id', direction: 'ASC' }] });
(6).MainController.js 控制器
Ext.define('AM.controller.MainController',{ extend : 'Ext.app.Controller', init : function(){ var menuTree = null; this.control({ 'menutree':{ render:function(t, eOpts){ menuTree = t; }, beforeitemexpand:function(node, eOpts ){ Ext.apply(menuTree.getStore().proxy.extraParams,{ id:node.data.id }); }, itemclick:function(tree, r, item, index, e, eOpts ){ /*var root = menuTree.getRootNode(); var childNode = root.getChildAt(index); if(childNode.hasChildNodes()) { alert('132'); }*/ if(r.raw.url!=null && r.raw.url!=''){ var tblPanel = tree.up('mainview').down('tabpanel[id=centerId]'); var panel = Ext.getCmp(r.raw.id); if(!panel){ tblPanel.add( { id:r.raw.id, title:r.raw.text, closable:true, iconCls:r.raw.iconCls, html:"<iframe src="+BASEPATH+r.raw.url+" frameborder=0 scrolling='auto' width=100% height=100%></iframe>" } ).show(); }else{ panel.show(); } } } } }); }, views:[ 'MainView','MenuView' ], models:[ 'MenuModel' ], stores:[ 'MenuStore' ] });
2.左边菜单使用了动态加载方式,这里使用SpringMVC,在现实中菜单数据因保存在数据库中,为了省事这里只做模拟即可
package com.phome.spring.action; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.phone.spring.bean.TreeBean; /** * 获取菜单列表 * @author lenovo * */ @Controller @RequestMapping("/Tree") public class TreeListAction { @RequestMapping("/getTreeList") public void getTreeList(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "id", required = false) String id) { try { List<TreeBean> list = null; if (id == null || id.equals("00")) { list = new ArrayList<TreeBean>(); list.add(new TreeBean("01", "系统设置", false,null)); list.add(new TreeBean("02", "全局配置", false,null)); list.add(new TreeBean("03", "商户管理", false,null)); } else if (id.equals("01")) { list = new ArrayList<TreeBean>(); list.add(new TreeBean("0101", "用户管理", true,"0101")); list.add(new TreeBean("0102", "角色管理", true,"0102")); list.add(new TreeBean("0103", "日志记录", true,"0103")); } else if (id.equals("02")) { list = new ArrayList<TreeBean>(); list.add(new TreeBean("0201", "商户配置", true,"0201")); list.add(new TreeBean("0202", "终端配置", true,"0202")); list.add(new TreeBean("0203", "其他配置", true,"0203")); } else if (id.equals("03")) { list = new ArrayList<TreeBean>(); list.add(new TreeBean("0301", "商户管理", true,"0301")); list.add(new TreeBean("0302", "指令管理", true,"0302")); list.add(new TreeBean("0303", "监控管理", true,"0303")); } if (list != null) { StringBuffer jsonStr = new StringBuffer("["); for (TreeBean tree : list) { JSONObject jb = JSONObject.fromObject(tree); jsonStr.append(jb).append(","); } jsonStr.deleteCharAt(jsonStr.length() - 1); jsonStr.append("]"); response.setCharacterEncoding("utf-8"); response.getWriter().write(jsonStr.toString()); } } catch (Exception e) { e.printStackTrace(); } } }