js实现决策表

Posted 逐梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js实现决策表相关的知识,希望对你有一定的参考价值。

最近一段时间一直在做决策表的研发。编写的过程及其残忍,当看到结果的那一刻感觉还是不错的哟。

写之前在网上搜过,没有找到,所以决定附上代码,跟大家分享一下。

决策表功能如下:

 

这里的弹出框调用的是bootsrap的组件,所以代码仅供参考,复制上去功能是出不来的,js具体代码如下:

/**
 * Created by jiqingkuo
 */
define([
        "PDUtilDir/grid",
        "PDUtilDir/util",
        "PDUtilDir/tool",
        "PDUtilDir/dialog",
        "PDUtilDir/searchBlock",
        \'CommonUtilUploadDir/lar-upload-logo\',
		\'CommonUtilUploadDir/lar-upload-single\',
        "CommonUtilCkEditorDir/ckeditor"],
   function(Grid, Util, Tool,Dialog,SearchBlock,LarUploadLogo,LarUploadSingle){
	
		var grid;
		
		var tableJson = {
	    		ruleId:"",
	    		type:"",//结果节点  为空不可添加删除条件
	    		condition:[],
				result:[]
		};
		//获取html 条件 标签元素	
		var $tbody=$("#tbody");
		var $thead=$("#thead");
		//获取 结果 HTML 元素
		var $resThead=$("#resThead");	
		var $result=$("#result");
        //定义布尔值 checkbox选中状态
		var isBool;
		/**
    	 * 构造一个DecisionTable函数
    	 */
		function DecisionTable(data){				
			
			DecisionTable.initData.call(this,data);
			
		}
		/**
		 * 初始化数据
		 */
		DecisionTable.initData = function(data){
			
			if(data === undefined){
				$.ajax({
	                type:\'GET\',
	                url:getServer()+\'/static/app/collection/decisionTable/tb.json\',
	                dataType:\'JSON\',
	                success:function(data){	
		 					DecisionTable.renderTable.call(this,data);//渲染tbody 	
	                }
	            });
			}else{
					
					DecisionTable.renderTable.call(this,data);//创建决策表

			}
			
		}
		
		/**
		 * 根据已有Json  渲染tbody
		 */
		DecisionTable.renderTable=function(data){
			//判断ruleId为空  调用条件添加 创建决策表
			if(data.ruleId!==\'\' ){
				html=\'\';
				$thead.empty();
				$tbody.empty();	
				tableJson=data;
				DecisionTable.prototype.renderData(data)
				
			}
			 	DecisionTable.init(this,data);
		}
		
		
		/**
		 * 初始化
		 * 事件绑定
		 */
		DecisionTable.init = function(node){
			DecisionTable.bindAddConditionButtonEvent(this,node);			
			DecisionTable.bindSetResultButtonEvent(this,node);
			DecisionTable.bindDeleteButtonEvent(this,node);
			DecisionTable.bindSaveButtonEvent(this,node);
			
		}
		/**
		 * 点击添加事件
		 */
		DecisionTable.bindAddConditionButtonEvent = function(node){
			
			$(\'#addBtn\').unbind(\'click\').bind(\'click\' , function(){
					if(tableJson.type === \'\'){
						//结果节点为空 可添加 删除
						DecisionTable.prototype.popAddConditionDilog(node);				
					}
					
				
            });
		}
		
		
        			
		/**
		 * 点击设置结果事件
		 */
		DecisionTable.bindSetResultButtonEvent = function(node){
			$(\'#resBtn\').unbind(\'click\').bind(\'click\' , function(){
				DecisionTable.prototype.popUpSetResultDialog(node);
				
            });
		}
		
		/**
		 * 点击删除事件
		 */
		DecisionTable.bindDeleteButtonEvent = function(node){
			$(\'#delBtn\').unbind(\'click\').bind(\'click\' , function(){
				if(tableJson.type === \'\'){
					//结果节点为空 可调用删除 方法
					DecisionTable.prototype.popUpDeleteDialog(node);
				}else{
					DecisionTable.prototype.popUpDeleteResultDialog(node);
				}
				
            });
		}
		
		/**
		 * 点击保存事件
		 */
		DecisionTable.bindSaveButtonEvent = function(node){
			 $(\'#saveBtn\').bind(\'click\',function(){
		    	   var aToStr=JSON.stringify(tableJson);//转换为Json
		    	   alert(aToStr);
		    	   console.log(aToStr);
            });
		}
		/**
		 * 
		 * 原型链结构
		 */
		DecisionTable.prototype = {
				
				/**
				 * 根据已有json遍历生成Dom
				 */
				renderData:function(data){					
					var length=data.condition.length; //获取数组长度  用于取值
				 	DecisionTable.Js(length);//调用Js通过传值  返回 2的n次方的计算结果				 	
					 //渲染thead
					 var html=\'\';			 	
		             	 html+="<tr>" ;	             
		             	 html+="<th style=\'width:10px;\' id=\'th\'></th>";
		             	 html+="<th style=\'width:180px;\'>条件名称</th>";	           	
			         for(var j=0;j<n;j++){		   		        	 
			             html+="<th style=\'width:20px;\'>"+"规则"+(j+1)+"</th>";		            
			         }
			         	 html+="</tr>";      
			        
			         //thead内元素添加
					 $thead.append(html);  
						
					 for(i=0;i<length;i++){				
					 		//渲染 tbody		       
						var html=\'\';	 
							html+="<tr>" ;	             
							html+="		<td style=\'width:10px;\'><input type=\'checkbox\' name=\'ckb\'/></td>";
							html+="		<td style=\'width:50px;\'><label id=\'cdnName\'>"+data.condition[i].name+"</label></td>";
							for(var m=0;m<n;m++){					 			
							html+="<td style=\'width:20px;\'>"+data.condition[i].rule[m].value+"</td>"
							}					 		                  
							html+="</tr>"; 							
							 //数据渲染 tbody内元素						
							 $("#tbody tr").eq(i).append(html);    
							 $tbody.append(html);      
					 }
				},
				
				
				/**
				 * 创建table结构
				 * rows当前行length
				 * suptdsum 单元格规则条件判断
				 */
				buildTableStyle:function(node,rows,suptdSum){
					
					 var html=\'\';			 	
			             html+="<tr>" ;	             
			             html+="<th style=\'width:10px;\' id=\'th\'></th>";
			             html+="<th style=\'width:180px;\'>条件名称</th>";	           	
				         for(var i=0;i<n;i++){		   		        	 
				            html+="<th style=\'width:20px;\'>"+"规则"+(i+1)+"</th>";		            
				         }
				         html+="</tr>"; 	
				         
				         //thead内元素添加
						 $thead.append(html);  
						 
						 //if判断 保留最后一次  生成的元素
				         if ($("#thead tr").length>1 ){	            	
				        	 	$("#thead tr").eq(0).remove();	            
				         }	
				         //表格的 局部生成 
				        for(var j=0;j<=rows;j++){
				        	if(j==rows){//当前行相等				        				       
	  						 var html=\'\';	 
	  				          	 html+="<tr>" ;	             
	  				             html+="		<td style=\'width:10px;\'><input type=\'checkbox\' name=\'ckb\'/></td>";
	  				             html+="		<td style=\'width:50px;\'><label id=\'cdnName\'>"+tableJson.condition[j].name+"</label></td>";
	  					         for(var k=0;k<i;k++){
	  					        	   if(k<suptdSum){//if判断 单元格值  Y 与N 各占一半
	  					        		   html+="<td style=\'width:20px;\'>"+tableJson.condition[j].rule[k].value+"</td>";
	  					        	   }else{
	  					        		   html+="<td style=\'width:20px;\'>"+tableJson.condition[j].rule[k].value+"</td>";
	  					        	   }
	  						            		            		
	  						       }		          
	  					           html+="</tr>"; 		 	  					     
	  					            //数据渲染 tbody内元素
	  					         $tbody.append(html);
				        	}
				        } 
				        DecisionTable.prototype.buildTableCoplete();//调用方法  生成完成table	
				},
				
				/**
				 * 将talbe完整 
				 */
				buildTableCoplete:function(){
								 	
				 	var rows=$("#tbody tr").length;//获取table当前行数
				 	
				 	DecisionTable.Js(rows);//计算2的n次方 返回值  n
				 	
					
					if(rows === 1){//if判断 第一次 不需要添加td
						return ;
					}else{
							 
						for(var q=0;q<rows-1;q++){	
							var html=\'\';
							var arrayCopy=tableJson.condition[q].rule.slice(0);//数组的copy
							tableJson.condition[q].rule.push.apply(tableJson.condition[q].rule,arrayCopy);//数组拼接
							
		        	  		for(var k=0;k<arrayCopy.length;k++){
		        	  			//遍历新数组 取值
		        	  			 html+="<td style=\'width:20px;\'>"+arrayCopy[k].value+"</td>";
		        	  		}
		        	  		
		        	  		$("#tbody tr").eq(q).append(html);
						}
					}	
				},
				
				/**
				 * express 条件json 创建 
				 */ 
				createJson:function(node,rows,tdSum){
					for(var j=0;j<n;j++){
			        	   if(j<tdSum){
			        		   node.condition[rows].rule.push({
			        			   value:"Y"
			        		   });
			        	   }else{
			        		   node.condition[rows].rule.push({
			        			   value:"N"
			        		   });
			        	   }
				            		            		
				       }					
				},
				/**
				 * result  结果 json 创建
				 */
				createResultJson:function(node,rows,rowIndex,isBool){
					
					for(var j=0;j<n;j++){
						
						if(isBool){
							isBool=true;
						}else{
							isBool=false;
						}
						
							
						node.result[rowIndex].value.push(isBool);	            		
				       }
					
				},
				//条件添加弹框提示
		        popAddConditionDilog:function(node){
	
		             var buttons = [];
		             buttons.push(
		            		 {name:"确定",callback:function(){
		            				 //此处写扩展代码    
		 	                     dialog.hide();	 	                    	 
		 	                     var name=$("#conName").val();//条件名称
		 	  					 var condition=$("#conExpress").val();//条件表达式
		 	  					 var rows=$("#tbody tr").length;//获取当前tr的length	
			 	  		
		 	  					
		 	  					 DecisionTable.Js(rows+1);//返回 值  为2的次方的结果n		 	  					 
		 	  					 var suptdSum=Math.ceil(n/2);//取整需要补充td数量  suptsSum 
		 	  					 
		 	  					 //将条件,名称添加到 json数组
			 	  				tableJson.condition.push({
			 	  						name:name,//条件名字
			 	  						condition:condition,//条件表达式
			 	  						rowindex:rows,//当前行
			 	  						rule:[
												 					     
			 	  						]
			 	  			
			 	  				 });
		 	  					DecisionTable.prototype.createJson(tableJson,rows,suptdSum);//调用方法创建 完整JSON
		 	  					
		 	  					//判断不为空
		 	  					 if(name===\'\' && condition===\'\'){
		 	  						DecisionTable.prototype.noNullDialog("名称和条件表达式不能为空");
		 	  					 }else if(name===\'\'){
		 	  						DecisionTable.prototype.noNullDialog("请输入条件名称");						 
		 	  					 }else if(condition===\'\'){						
		 	  						DecisionTable.prototype.noNullDialog("请输入条件表达式");			
		 	  					 }else{			
		 	  						 //表格结构构建
		 	  						DecisionTable.prototype.buildTableStyle(tableJson,rows,suptdSum);
		 	  				     } 		 	  				      
		 	  					   		 	                         
		                     }
		             });
		             var dialog = Dialog({
		                 id:"BaseDialog",
		                 cache:false,                 //是否缓存,默认为true
		                 title:"弹出框",
		                 width:"400px",
		                 height:"200px",
		                 dialogSize:"",               //modal-lg或modal-sm
		                 body:"",
		                 buttons:buttons
		             });
		             //可以通过返回的dialog对象调用相关方法
		             var dialogHtml=\'\';
		             dialogHtml += \'<form class="form-horizontal">\'
		             dialogHtml+=		\'<div class="form-group">\'
		             dialogHtml+=			\'<label class="col-sm-3">条件名称</label>\'
		             dialogHtml+=			\'<input id="conName" type="text" class="col-sm-8" placeholder="条件1" maxlength="20">\'
		             dialogHtml+=		\'</div>\'
		             dialogHtml+=		\'<div class="form-group" style="padding-top:2px;">\'
		             dialogHtml+=			\'<label class="col-sm-3">条件表达式</label>\'
		             dialogHtml+=			\'<textarea id="conExpress" class="col-sm-8" type="text" placeholder="a<b+c"></textarea>\'
		             dialogHtml+=		\'</div>\'
		             dialogHtml+=\'</form>\';
		             dialog.setBody(dialogHtml);
		            
		             dialog.show();
		        },
		      //调用设置结果弹出框
		        popUpSetResultDialog:function (node){
		           
		            var buttons = [];
		            
		            buttons.push(
		                {
		                    name:"确定",
		                    //回调函数
		                    callback:function(){
		                    	
		                    	 dialog.hide();	 	                    	 
				            	
				                 var name=$("#conName").val();
				                 var condition=$("#conExpress").val();
				                 
				           		 var ruleLength=$("#tbody tr").last().find("td").length;
				           		 var trLength=$("#tbody tr").length;//获取当前tr的length	
				           		 var rowIndex=$("#result tbody tr").length;
				           		var cbLeng=$(".cb").length;
		 	  					 //将条件,名称添加到 json数组
				           		tableJson.type="result";
			 	  				tableJson.result.push({
			 	  						name:name,//条件名字
			 	  						condition:condition,//条件表达式
			 	  						rowindex:rowIndex,//当前行
			 	  						value:[
												 					     
			 	  						]
			 	  			
			 	  				 });
								DecisionTable.prototype.createResultJson(tableJson,ruleLength-2,rowIndex,isBool)

			 	  				
			 	  				
		 	  					//判断不为空
		 	  					 if(name===\'\' && condition===\'\'){
		 	  						DecisionTable.prototype.noNullDialog("名称和条件表达式不能为空");
		 	  					 }else if(name===\'\'){
		 	  						DecisionTable.prototype.noNullDialog("请输入条件名称");						 
		 	  					 }else if(condition===\'\'){						
		 	  						DecisionTable.prototype.noNullDialog("请输入条件表达式");			
		 	  					 }else{			
			 	  						var html=\'\';			 	
			 				             html+="<tr>" ;	             
			 				             html+="<th style=\'width:10px;\' id=\'th\'></th>";
			 				             html+="<th style=\'width:180px;\'>结果名称</th>";	           	
			 					         for(var i=0;i<ruleLength-2;i++){		   		        	 
			 					            html+="<th style=\'width:20px;\'>"+"结果"+(i+1)+"</th>";		            
			 					         }
			 					         html+="</tr>"; 	
			 					         
			 					         //thead内元素添加
			 							 $resThead.append(html);  
			 							 if ($("#resThead tr").length>1 ){	            	
			 				        	 	$("#resThead tr").eq(0).remove();	            
			 							 }	
			 							var ahtml
			 	           			 	ahtml+="<tbody style=\'background:#ccffff\'>";
			 	                        ahtml+=		"<tr>" ;
			 	                        ahtml+=         "<td style=\'width:10px;\'><input type=\'checkbox\' name=\'ckb\' /></td>";
			 	                        //for(var k=0;k<trLength-1;k++){
				 	                        ahtml+=			"<td style=\'width:10px;\'>"+name+"</td>";	 	                      

			 	                        //}			 	         	                      
				 	           	         for(var j=0;j<ruleLength-2;j++){	 	           	            		
				 	           	        	ahtml+=		"<td style=\'width:10px;\'><input type=\'checkbox\'name=\'ckb\' class=\'cb\'/></td>";	 	           	            
				 	           	         }
				 	           	         ahtml+="	</tr></tbody>";     
				 	           	         //数据渲染result内元素
				 	           	         $result.append(ahtml);  
				 	           	        
				 	           	         //checkbox绑定事件  获取到当前元素Index 
							 	         $(".cb").click(function(){
												isBool=$("input[name=\'ckb\']").is(\':checked\');
												
												var rowindex=$(this).parents().parents().parents().index();//当前行的index
												
												var colLength=$(this).parents().index();//当前列的 总长度									
												var colIndex=colLength-2;//当前列的 index
												
												tableJson.result[rowindex-1].value[colIndex]=isBool;//改变当前选中的checkbox值 传入数组
							 	         });
							 	 
				 	           	     
		 	  				     } 		 	  				      
		 	  					   		 	     
		 	                  }
		             });
		             var dialog = Dialog({
		                 id:"BaseDialog",
		                 cache:false,                 //是否缓存,默认为true
		                 title:"弹出框",
		                 width:"400px",
		                 height:"200px",
		                 dialogSize:"",               //modal-lg或modal-sm
		                 body:"",
		                 buttons:buttons
		             });
		             //可以通过返回的dialog对象调用相关方法
		             var dialogHtml=\'\';
		             dialogHtml += \'<form class="form-horizontal">\'
		             dialogHtml+=		\'<div class="form-group">\'
		             dialogHtml+=			\'<label class="col-sm-3">条件名称</label>\'
		             dialogHtml+=			\'<input id="conName" type="text" class="col-sm-8" placeholder="条件1" maxlength="20">\'
		             dialogHtml+=		\'</div>\'
		             dialogHtml+=		\'<div class="form-group" style="padding-top:2px;">\'
		             dialogHtml+=			\'<label class="col-sm-3">条件表达式</label>\'
		             dialogHtml+=			\'<textarea id="conExpress" class="col-sm-8" type="text" placeholder="a<b+c"></textarea>\'
		             dialogHtml+=		\'</div>\'
		             dialogHtml+=\'</form>\';
		             dialog.setBody(dialogHtml);
		            
		             dialog.show();    
		               
		        },
				//调用删除弹出框
		        popUpDeleteDialog:function (node){	
		        	//获取checkbox 长度
		        	var checkLeng=$("input[name=\'ckb\']:checked").size();
		        	
		        	
		        	//获取未选中的 checkbox长度
		        	var unChecked=$("input[name=\'ckb\']").not("input[name=\'ckb\']:checked").parents(\'tr\');
		        	var unCheckLength=unChecked.length;
		        	//定义数组 tmp用来存放 未选中的数组 数据
		        	var tmpName=[];
		        	
		        	for(var j=unCheckLength-1;j>=0;j--){
		        		//将未选中的数据存放 到  新的 数组 tmp
		        		tmpName.push($(unChecked[j]).find("#cdnName").text());
		        	}		        			        	
		        	//if判断是否选中 并弹窗提示
		        	if(checkLeng === 0){
		        		this.noNullDialog("选择删除的内容");
		        	}else{
		        		var buttons=[];
		        		buttons.push(
				                {
				                    name:"确定",
				                    //回调函数
				                    callback:function(){
				                    	dialog.hide();
					                    var conLenth = tableJson.condition.length;//数组的长度
					                    var sum=	conLenth-checkLeng;//未选中的长度
					                    var tdsum= Math.pow(2,conLenth) - Math.pow(2,sum);//计算 需要删除的 td个数
					                    //for循环 遍历 从tmp数组取值 
					                    for(var i=0;i<sum;i++){  
					                    					                    	
					                    	tableJson.condition[i].rule.splice(0,tdsum);//删除 rule 中的 value所对应的值
					                    	tableJson.condition[i].name=tmpName[i]; //tmpName取值 并赋值
					                    	tableJson.condition[i].condition=tmpName[i];					                    	
					                    	
					                    }
					                    
					                  console.log(tableJson);
					                	   tableJson.condition.splice(sum,checkLeng);
					                	   $("#tbody").empty();
					                	   $("#thead").empty();
					                	   //调用renderData方法 重新渲染 tableJson
					                	   DecisionTable.prototype.renderData(tableJson);
					                   
					                    console.log(tableJson);
				                   
				                    	
				                    	
				                }
				        })

				            var dialog = Dialog({
				                id:"BaseDialog",
				                cache:false,
				                title:"添加内容",
				                width:"400px",
				                hieght:"200px",
				                dialogsize:"modal-sm",
				                body:"确定删除吗?",
				                buttons:buttons
				            });
				            dialog.show();
				        }
		        },		        
		        /**
		         * 结果的删除
		         * @param node
		         */
		        popUpDeleteResultDialog:function(node){				 
					 //获取checkbox 长度
					 var checkLength= $("input[name=\'ckb\']:checked").size();				 
					 //未选中 状态判断 并弹窗提示
			         if(checkLength==0){
			        	 this.popUpAddConditionDialog("选择删除的内容");//调用弹窗 
			           }else{
			        	   var buttons = [];
					          buttons.push(
					                   {name:"确定",callback:function(){
					                    	 dialog.hide();
					                    	 
					                    	 $("input[name=\'ckb\']:checked").each(function(){//?遍历选中的checkbox
					         	         		var n=$(this).parents().parents().parents().index();//?获取checkbox所在行的顺序
					         	         			var aa=$(this).parents("tr");
					         	         			//删除当前行
					         	         						         	  
					         	         			
					         	         			//if判断 index为o时  n+1避免误删
					         	         			if(n === 1){
					         	         				delete tableJson.result[n-1]; 	
					         	         				$("#result tbody tr").eq(n-1).empty();
					         	         				tableJson.type=\'\';
					         	         			}else{
					         	         				delete tableJson.result[n-1]; 	
					         	         				$("#result tbody tr").eq(n-1).empty();
					         	         			}
					         	         			
					                    	 });
					                    	 
					         	      }}
					             );
				        	  
					       //选中之后 提示 是否确定删除
				      	   var dialog = Dialog({
				                   id:"BaseDialog",
				                   cache:false,                 //是否缓存,默认为true
				                   title:"提示框",
				                   width:"200px",
				                   height:"60px",
				                   dialogSize:"",               //modal-lg或modal-sm
				                   body:"确定删除?",
				                   buttons:buttons
				               });
			           }
			        	 
				 },
				//调用弹框提示内容不能为空
				noNullDialog:function(item){					
					var dialog = Dialog({
		                id:"BaseDialog",
		                cache:false,                 //是否缓存,默认为true
		                title:"提示框",
		                width:"200px",
		                height:"60px",
		                dialogSize:"",               //modal-lg或modal-sm
		                body:item
		            });
				}
		        
		}
   
		/**
	       * 2的n次方
	       * 计算 返回的结果n
	       */
		DecisionTable.Js=function(num){
		      n=Math.pow(2,num);
		      return n;
		}
		
	/**
	 * 主函数
	 */
	 	return {
			mainInit:function(data){
				return new DecisionTable(data);
			}
		}
});

对了,点击保存之后前台将保存成JSON的格式传给后台,GIF动图如下:

 

功力尚浅的我,只能写到这了。以后会经常写一些技术相关。 

最后推荐:gif图片录制专用工具GifCam。

 

以上是关于js实现决策表的主要内容,如果未能解决你的问题,请参考以下文章

angularJS使用ocLazyLoad实现js延迟加载

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

JS实现决策报表中添加声音报警

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

Python机器学习(十八)决策树之系列一ID3原理与代码实现

VSCode自定义代码片段——JS中的面向对象编程