跟我一起学extjs5(32--加入模块和菜单定义[4更新菜单(源码下载)])

跟我一起学extjs5(32--加入模块和菜单定义[4根据后台信息更新菜单])

这一节根据后台传递过来的菜单分组和菜单定义,以及模块定义来更新4种类型的菜单。

按钮菜单和标准菜单的数据格式是一样的,生成的函数都在MainModel.js中,下面将其改一下:

			// 根据data.tf_MenuGroups生成菜单条和菜单按钮下面使用的菜单数据
			getMenus : function() {
				var items = [], me = this;
				Ext.Array.each(this.get('tf_MenuGroups'), function(group) { // 遍历菜单项的数组
							var submenu = [];
							// 对每一个菜单项,遍历菜单条的数组
							Ext.Array.each(group.tf_menuModules, function(menuitem) {
										// 根据moduleId取得该模块的定义
										var module = me.getModuleDefine(menuitem.tf_ModuleId);
										// 如果模块存在(或者具有浏览权限,以后加入)
										if (module) {
											submenu.push({
														mainmenu : 'true',
														moduleName : module.tf_moduleName,
														text : module.tf_title,
														icon : module.tf_icon,
														glyph : module.tf_glyph,
														handler : 'onMainMenuClick' // MainController中的事件处理程序
													})
											// 如果菜单定义了分隔下一条,那么菜单上加一个分隔线
											if (menuitem.tf_addSeparator)
												submenu.push('-');
										}
									})
							var item = {
								text : group.tf_title,
								menu : submenu,
								icon : group.tf_iconURL,
								glyph : group.tf_glyph
							};
							items.push(item);
						})
				return items;
			}

树状菜单也要进行修改:

/**
 * 树状菜单,显示在主界面的左边
 */
Ext.define('app.view.main.menu.MainMenuTree', {
			extend : 'Ext.tree.Panel',
			alias : 'widget.mainmenutree',
			title : '系统菜单',

			rootVisible : false,
			lines : false,

			initComponent : function() {
				this.store = Ext.create('Ext.data.TreeStore', {
							root : {
								text : '系统菜单',
								leaf : false,
								expanded : true
							}
						});
				var vm = this.up('app-main').getViewModel()
				var menus = vm.get('tf_MenuGroups');
				var root = this.store.getRootNode();
				for (var i in menus) {
					var menugroup = menus[i];
					var menuitem = root.appendChild({
								text : menugroup.tf_title,
								// 节点默认是否展开
								expanded : menugroup.tf_expand,
								icon : menugroup.tf_iconURL,
								glyph : menugroup.tf_glyph
							});
					for (var j in menugroup.tf_menuModules) {
						var menumodule = menugroup.tf_menuModules[j];

						var module = vm.getModuleDefine(menumodule.tf_ModuleId);
						if (module) {
							var childnode = {
								moduleId : module.tf_moduleId,
								moduleName : module.tf_moduleName,
								text : module.tf_title,
								leaf : true
							};
							menuitem.appendChild(childnode);
						}
					}
				}
				this.callParent(arguments);
			}
		})

手风琴式的折叠菜单:

/**
 * 折叠式(accordion)菜单,样式可以自己用css进行美化
 */

Ext.define('app.view.main.menu.AccordionMainMenu', {
			extend : 'Ext.panel.Panel',
			alias : 'widget.mainmenuaccordion',
			title : '系统菜单',

			layout : {
				type : 'accordion',
				animate : true
			},

			initComponent : function() {
				this.items = [];
				var vm = this.up('app-main').getViewModel();
				var menus = vm.get('tf_MenuGroups');
				var me = this;
				for (var i in menus) {
					var menugroup = menus[i];
					var accpanel = {
						menuAccordion : true,
						xtype : 'panel',
						title : menugroup.tf_title,
						bodyStyle : {
							padding : '10px'
						},
						layout : 'fit',
						dockedItems : [{
									dock : 'left',
									xtype : 'toolbar',
									items : []
								}],
						glyph : menugroup.tf_glyph
					};
					for (var j in menugroup.tf_menuModules) {
						var menumodule = menugroup.tf_menuModules[j];
						var module = vm.getModuleDefine(menumodule.tf_ModuleId);
						if (module) {
							accpanel.dockedItems[0].items.push({
										xtype : 'buttontransparent',
										text : this.addSpace(module.tf_title, 12),
										glyph : module.tf_glyph,
										handler : 'onMainMenuClick'
									});
						}
					}
					this.items.push(accpanel);
				}
				this.callParent(arguments);
			},

			addSpace : function(text, len) {
				var result = text;
				for (var i = text.length; i < len; i++) {
					result += ' ';
				}
				return result;
			}

		})

下面看看修改过后的样子:由于现在各个模块分组下的模块都没有加入,只有“系统管理”下有4个模块,因此有些菜单组下是无菜单的。在以后无菜单的菜单组将会被删除。

前几节讲了简单的前后台交互建立系统主页和菜单的例子,在这之前,我把在Top区域“设置”中又增加了一些内容:增加了一个金额单位显示位置的设置,一种是将金额单位显示在数值之后,还有一种是显示在列头上,在数值中不显示。

源码和数据库的下载地址:http://pan.baidu.com/s/1hqGcnze

这里面包括了到现在为止的所有extjs的修改,java代码,各种配置文件和数据库。jar包如果找不齐的可以下载我的extjs4系列文章中的示例工程,里面都有(由于本人时间有限,工程搭建有问题请自行参照博客解决,祝大家国庆快乐)

时间: 2024-10-27 12:26:55

跟我一起学extjs5(32--加入模块和菜单定义[4更新菜单(源码下载)])的相关文章

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据]) 写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的说说了,里面加了几十个类.有兴趣的下载了源代码自己看.以下画张通用的模块列表取数据的流程,这个流程是适用于全部的模块.我这个后台处理程序也是对全部的模块进行统一处理,包含数据查找,新增,改动,删除都是同样的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamZvaw==

跟我一起学extjs5(30--加入模块和菜单定义[3后台系统数据的组织和生成])

跟我一起学extjs5(30--加入模块和菜单定义[3后台系统数据的组织和生成]) 对于大多web程序来说,后台是完成控制和处理的,前台就是一个展示工具,这个系统也是这样.在上一节中建立了四个模块,下面开始设计前后台的交互.将系统信息和模块.菜单信息传到前台,由前台来进行展示. 首先新建一个java bean类用来存放各种需要传到前台的数据,里面包括:系统信息.操作人员信息.服务人员信息.模块信息.菜单.现在只加入了这几个,以后还要加入各种 各样的权限设置.在com.jfok.server.co

跟我一起学extjs5(28--加入模块和菜单定义[1建立数据库和表])

跟我一起学extjs5(28--加入模块和菜单定义[1建立数据库和表]) 下面我们开始进入自定义系统的设计和各个组成部分的搭建工作. 首先在sql server中建立数据库,这里的数据的名字我定义为extjs5,然后需要建立模块的定义表,这个表里将存着系统中所有模块的定义信息.为了能有个直观的前后台的互动,先把模块和菜单这二个部分加进去,可以把菜单数据组织好后发送到前台去进行展示. 由于系统中的模块很多,需要分类,因此在先要设计一个"模块分组"的表,对于菜单也是一样,需要有一个&quo

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据])

跟我一起学extjs5(38--单个模块的设计[6取得模块列表数据]) 上一节中做好了前后台的程序,现在来看看取得数据的运行过程.在菜单中选择 "系统管理"--"模块分组".就可以看到下图,在渲染后grid后,会显示数据. 来看看ajax取得数据的url和数据. url的信息: Remote Address:[::1]:8888 Request URL:http://localhost:8888/app/rest/module/fetchdata.do?_dc=14

跟我一起学extjs5(42--单个模块的数据新增方式)

跟我一起学extjs5(42--单个模块的数据新增方式) 前面的章节中已经加入了一个自定义的模块,并且可以进行数据的新增.修改.删除的操作了,在这个基础上就可以大作文章了.这一节来设想几种新据新增的方式,并给出一些具体的解决方案. 看了我后台java源码的可以看出,所有的模块的新增.修改.删除全部是相同的处理,只是用了反射来生成各个实体bean,这样不管你有多少个业务bean,你的这部分代码是不用再增加了,只需要考虑一些逻辑处理上的操作即可,这些在后面会提到.基于这样的方式,我们可以定义多种数据

跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean])

跟我一起学extjs5(29--加入模块和菜单定义[2建立java bean]) 对上一节中加入的4个模块在java中建立相应的bean文件. 以上表建立好以后,需要建立java bean文件.在建立之前需要加入几个支持类. 先在com.jfok.server.common中建立包annotation,再在下面加入二个类库,这二个是自定义的注释类.分别用来注释每一个模块的信息和模块中每一字段的信息. package com.jfok.server.common.annotation; impor

跟我一起学extjs5(36--单个模块的设计[4根据菜单建立相应的模块])

跟我一起学extjs5(36--单个模块的设计[4根据菜单建立相应的模块]) 前几节处理好了后台,现在又要处理前台了.首先是要修改菜单的选择事件,在创建一个module的时候将 moduleName参数传递进去. 修改MainController.js中的函数: // 选择了主菜单上的菜单后执行 onMainMenuClick : function(menuitem) { var maincenter = this.getView().down('maincenter'); maincenter

跟我一起学extjs5(35--单个模块的设计[3根据类的标注自动生成数据])

跟我一起学extjs5(35--单个模块的设计[3根据类的标注自动生成数据]) 然后在hibernate.cfg.xml中加入: <mapping class="com.jfok.server.hibernate.system._ModuleField" /> <mapping class="com.jfok.server.hibernate.system._ModuleGridScheme" /> <mapping class=&qu

跟我一起学extjs5(31--加入模块和菜单定义[4前台通过ajax来调用数据与展示])

跟我一起学extjs5(31--加入模块和菜单定义[4前台通过ajax来调用数据与展示]) 上一节已经把到现在为止的后台做好了,启动tomcat ,在浏览器中打入网址:http://localhost:8888/app/applicationinfo.do,就可以取得系统参数值.下面看一下在chrome调试器中的结果. 到此为止,后台暂告一段落,又要开始对前台的extjs的程序进行修改了. 首先要修改的是MainModel.js,在此js文件中加入构造函数: constructor : func