extjs递归算法生成树

这篇博客介绍了如何用Java实现递归算法,将数据转化为ExtJS的树形结构。通过查询数据库获取节点和子节点,构建树形结构,并在JavaScript中创建Ext.data.TreeStore来展示。博客详细展示了Java方法`recursiveTree`和`getTreeLeaf`的实现,以及JavaScript中Ext.tree.Panel的配置用于展示树形数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java中的代码,与数据库层主要是两个方法,一个是查询节点,一个是查询子节点。然后形成树形结构,这里主要重写了tree的store,让树子节点加载更多的信息,下面是java中的代码。
	/**
	* 递归算法解析成树形结构
	*
	* @param cid
	* @return
	* @author jiangyi
	*/
	public JSONTreeNode recursiveTree(String cid,String index_name,List areadimensions,List timedimensions) {
		//当前节点信息
		List list = categoryService.queryCategory(cid);
		JSONTreeNode node = new JSONTreeNode();
		//子节点信息
		List childTreeNodes = categoryService.hasChildNode(cid);
		//这个节点下所有指标
		List treelist = indexService.queryIndexTreeByDimednsionName(null,getTreeLeaf(cid),index_name);
		if(list!=null&&list.size()>0&&treelist!=null&&treelist.size()>0){
			DM_IND_CATEGORY_INFO DM_IND_CATEGORY_INFO = (DM_IND_CATEGORY_INFO)list.get(0);
			node.setId(DM_IND_CATEGORY_INFO.getUuid());
			node.setText(DM_IND_CATEGORY_INFO.getCategory_name()+treelist.size());
            if (childTreeNodes!=null&&childTreeNodes.size()>0) {  
            	node.setLeaf(false);  
            }else{  
            	node.setLeaf(true);  
            }  
            //遍历子节点
            if(childTreeNodes!=null){
            	for(int i=0;i<childTreeNodes.size();i++){
            		DM_IND_CATEGORY_INFO child = (DM_IND_CATEGORY_INFO)childTreeNodes.get(i);
            		JSONTreeNode n = recursiveTree(child.getUuid(),index_name,areadimensions,timedimensions); //递归
            		if(!"0".equals(n.getDescription())){
            			node.getChildren().add(n);
            		}
            	}
            }
		}else{
			node.setDescription("0");
		}
		//加一层维度信息
		if(node.isLeaf()){
			node.setLeaf(false);
			for(int i=0;i<areadimensions.size();i++){
				boolean flag = false;
				DM_IND_DIMENSION_DETAIL areadimension = (DM_IND_DIMENSION_DETAIL)areadimensions.get(i);
				JSONTreeNode areanode = new JSONTreeNode();
				areanode.setId(node.getId()+areadimension.getUuid());
				areanode.setLeaf(false);
				int size = 0;
				for(int j=0;j<timedimensions.size();j++){
					DM_IND_DIMENSION_DETAIL timedimension = (DM_IND_DIMENSION_DETAIL)timedimensions.get(j);
					//增加指标
					String dimension_name = timedimension.getUuid() + "-" + areadimension.getUuid();
					List treelist1 = indexService.queryIndexTreeByDimednsionName(dimension_name,node.getId(),index_name);
					if(treelist1!=null&&treelist1.size()>0){
						size += treelist1.size();
						flag = true;
						JSONTreeNode timenode = new JSONTreeNode();
						timenode.setId(node.getId()+areadimension.getUuid()+timedimension.getUuid());
						timenode.setText(timedimension.getDimension_name()+treelist1.size());
						timenode.setLeaf(false);
						for(int k=0;k<treelist1.size();k++){
							JSONObject json = (JSONObject)treelist1.get(k);
							JSONTreeNode indexnode = new JSONTreeNode();
							indexnode.setId(node.getId()+"-"+json.getString("sub_index_id"));
							indexnode.setText(json.getString("index_name"));
							indexnode.setLeaf(true);
							timenode.getChildren().add(indexnode);
						}
						areanode.getChildren().add(timenode);
					}
				}
				areanode.setText(areadimension.getDimension_name()+size);
				//判断这个分类下面没有指标
				if(flag){
					node.getChildren().add(areanode);
				}
			}
		}
		return node;
	}	
	/**
	* 得到这个节点下面的所有的叶子节点
	* @param cid
	* @return
	* @author jiangyi
	*/
	public List getTreeLeaf(String cid) {
		List relList = new ArrayList();
		relList.add(cid);
		List list = categoryService.queryCategory(cid);
		if(list!=null&&list.size()>0){
			DM_IND_CATEGORY_INFO DM_IND_CATEGORY_INFO = (DM_IND_CATEGORY_INFO)list.get(0);
			List childTreeNodes = categoryService.hasChildNode(cid);
            if (childTreeNodes!=null&&childTreeNodes.size()>0) {  
            	
            }else{  
            	relList.add(DM_IND_CATEGORY_INFO.getUuid());
            }  
            //遍历子节点
            if(childTreeNodes!=null){
            	for(int i=0;i<childTreeNodes.size();i++){
            		DM_IND_CATEGORY_INFO child = (DM_IND_CATEGORY_INFO)childTreeNodes.get(i);
            		List n = getTreeLeaf(child.getUuid()); //递归
            		relList.addAll(n);
            	}
            }
		}
		return relList;
	}
js中就比较简单了。
				var categoryStore = Ext.create('Ext.data.TreeStore', {
					 autoLoad : false,
					 proxy : {
					 	 type : 'ajax',
					 	 url : eastcom.baseURL+'/inas_kpimanage_index/queryIndexTree',
					 	 reader : {
							type : 'json'
						 },
					 	 actionMethods : {
							read : 'POST'
						 }
					 }
				});
				var categoryTree = Ext.create('Ext.tree.Panel', {
					 id : 'categoryTree',
					 tbar:Ext.create('Ext.toolbar.Toolbar',{items:['指标名称','->',queryIndexAction]}),
					 rootVisible : false,
					 useArrows : true,  
					 store : categoryStore,
					 listeners : {  
				           'itemclick' : function(view, record, items, index, e) { 
				         	  	var obj = record;
				         	  	var array = obj.data.id.split("-");
				         	  	var sub_index_id = array[1];
				         	  	if(obj.data.leaf == true){
									Ext.getCmp('id_sub_index_id').setValue(obj.data.id);
									Ext.Ajax.request({
							    		url : eastcom.baseURL + '/inas_kpimanage_index/querySubIndex',
							    		method : 'POST',
							    		params : {
							    			sub_index_id : sub_index_id
							    		},
							    		success : function(form, action) {
							    			var result = Ext.JSON.decode(form.responseText);
							    			 Ext.getCmp('addDbMetaAction').enable();
							    			 var o = result.data;
							    			//列表中显示信息
							    			 Ext.getCmp('id_sub_index_id').setValue(sub_index_id);
											 Ext.getCmp('id_index_last_version').setValue(o.index_last_version);
											 if(o.time_delay == ''){
											 	Ext.getCmp('id_time_delay').setValue(0);
											 }else{
												Ext.getCmp('id_time_delay').setValue( o.time_delay);
											 }
											 Ext.getCmp('id_delay_desc').setValue( o.delay_desc);
											 if(o.is_calculation == '1'){
					            			 	Ext.getCmp('id_index_algorithm').show();
					            			 	Ext.getCmp('id_is_calculation').setValue( o.is_calculation);
					            			 	Ext.getCmp('id_index_algorithm').setValue( o.index_algorithm);
					            			 }else{
					            			 	Ext.getCmp('id_index_algorithm').hide();	
					            			 	Ext.getCmp('id_is_calculation').setValue('0');
					            			 }
											 var dbdatalabelshow = o.dbdatalabel;
									         var store= Ext.getCmp('rightGridPanel').getStore();
									         store.removeAll();
											 if(dbdatalabelshow != null && dbdatalabelshow != ''){
												 var array = dbdatalabelshow.split(';');
												 for(var i=0;i<array.length;i++){
												 	var array1 = array[i].split(',');
												 	var r = Ext.create('gridtableModel', {
									                    uuid : array1[0],
									                    table_name: array1[1],
									                    field_id: array1[2]
									                });
									                store.insert(0, r);
												 }
											 }
							    		}
							    	});
				         	  	}
				           }
					 	}
				     });  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值