maxiaoshan 2 年之前
父节点
当前提交
53ff6c3f0e

+ 1 - 0
src/config.json

@@ -47,6 +47,7 @@
         "7700": "comm"
     },
     "serveraddress": "127.0.0.1:8030",
+    "jsserveraddress":  "127.0.0.1:8031",
     "word":{
     	"keyword":"(抽签|中标|招标|成交|合同|中标候选人|资格预审|拟建|邀请|询价|比选|议价|竞价|磋商|采购|招投标|答疑|变更公告|更正公告|竞争性谈判|竞谈|意见征询|澄清|单一来源|流标|废标|验收公告|中止|终止|违规|处罚|征集公告|开标结果|评审结果|监理|招租|租赁|评判结果|项目|遴选|补遗|竞标|征求意见|标段|定点结果|项目评审公示|采购项目违规|采购活动中违规|项目行政处罚|采购行政处罚|项目审批公示)",
     	"notkeyword":"(招聘|拍卖|出租|出让|使用权|资产)"

+ 1 - 0
src/front/front.go

@@ -53,6 +53,7 @@ type Front struct {
 	runPinYin    xweb.Mapper `xweb:"/center/runpy"`           //获取拼音
 	saveStep     xweb.Mapper `xweb:"/center/save"`            //爬虫保存
 	saveChannels xweb.Mapper `xweb:"/center/save/channels"`   //保存子栏目
+	saveJs       xweb.Mapper `xweb:"/center/save/js"`         //保存js
 	loadModel    xweb.Mapper `xweb:"/center/gmodel/(.*)"`     //加载模型
 	importdata   xweb.Mapper `xweb:"/center/importdata"`      //导入脚本
 	importfile   xweb.Mapper `xweb:"/center/importfile"`      //批量导入爬虫

+ 29 - 0
src/front/spider.go

@@ -332,6 +332,7 @@ func (f *Front) SaveStep() {
 			param := map[string]interface{}{}
 			common[4] = 1
 			param["param_common"] = common
+			param["channel"] = f.Base.SpiderChannel
 			//向导模式
 			param["param_time"] = ptime
 			param["param_list"] = list
@@ -450,6 +451,34 @@ func (f *Front) SaveChannels() {
 	f.ServeJson(map[string]interface{}{"ok": ok})
 }
 
+func (f *Front) SaveJs() {
+	//param_type := f.GetString("param_type")
+	//return_type := f.GetString("return_type")
+	js_name := f.GetString("js_name")
+	js_alias := f.GetString("js_alias")
+	jstext := f.GetString("jstext")
+	step := f.GetString("step")
+	code := f.GetString("code")
+	update := map[string]interface{}{
+		"runjs": true,
+	}
+	js := map[string]interface{}{
+		"js_text":   jstext,
+		"js_name":   js_name,
+		"js_step":   step,
+		"js_alias":  js_alias,
+		"js_param":  "string",
+		"js_return": "string",
+	}
+	if step == "list" {
+		update["js_list"] = js
+	} else if step == "detail" {
+		update["js_detail"] = js
+	}
+	u.MgoEB.Update("luaconfig", map[string]interface{}{"code": code}, map[string]interface{}{"$set": update}, false, false)
+	f.ServeJson(map[string]interface{}{"ok": true})
+}
+
 func LuaSaveLog(code, user string, data *map[string]interface{}, stype int) {
 	saveOne, _ := u.MgoEB.FindOne("luasavelog", map[string]interface{}{"state": 0, "code": code})
 	if stype == 0 { //保存记录

+ 5 - 1
src/main.go

@@ -16,7 +16,9 @@ import (
 	"timetask"
 	u "util"
 
-	codegrpc "analysiscode"
+	codegrpc "analysiscode/client"
+	gojs "gorunjs/client"
+
 	util "spiderutil"
 	"time"
 
@@ -37,6 +39,8 @@ func init() {
 	redis.InitRedis(util.Config.Redisservers)
 	//验证码识别client
 	codegrpc.InitCodeGrpcClient()
+	//go执行js服务
+	gojs.InitGoRunJsClient()
 	//mail
 	smtp := util.Config.Smtp
 	front.Mails = util.New(smtp["addr"], qu.IntAll(smtp["port"]), smtp["user"], smtp["pwd"])

+ 12 - 1
src/spider/script.go

@@ -7,7 +7,7 @@ LUA中公共的方法需要抽出来,主脚本文件加载LUA公共文件
 package spider
 
 import (
-	codegrpc "analysiscode"
+	codegrpc "analysiscode/client"
 	"bytes"
 	"compress/gzip"
 	"crypto/aes"
@@ -15,6 +15,7 @@ import (
 	"encoding/json"
 	"fmt"
 	"github.com/shopspring/decimal"
+	gojs "gorunjs/client"
 	"io"
 	"io/ioutil"
 	mu "mfw/util"
@@ -596,6 +597,16 @@ func (s *Script) LoadScript(downloadnode, script string, isfile ...string) {
 		S.Push(lua.LString(respCookie))
 		return 3
 	}))
+	s.L.SetGlobal("goRunJs", s.L.NewFunction(func(S *lua.LState) int {
+		param := S.ToString(-2) //list or detail
+		step := S.ToString(-1)  //参数
+		qu.Debug("111111111")
+		result := gojs.GoRunJsGetResult(s.SCode, param, step)
+		qu.Debug("Go Run Js Result:", param, step, result)
+		S.Push(lua.LString(result))
+		return 1
+	}))
+
 	s.L.SetGlobal("newDownloadFile", s.L.NewFunction(func(S *lua.LState) int {
 		cookie := S.ToString(-1)
 		head := S.ToTable(-2)

+ 22 - 12
src/web/staticres/js/common.js

@@ -2,6 +2,7 @@ common={};
 var issave = false;
 common.spider={};
 common.form={};
+
 common.maskShow=function(title){
 	var change=function(){
 		if(title){
@@ -75,6 +76,15 @@ common.form.serializeArray=function(id){
 }
 common.form.submit=function(){}
 
+//js编辑器展示
+common.spider.editjs=function (step) {
+	$("#modal-js").modal("show");
+	setTimeout(() => {
+		editor2_js.refresh();
+		editor3_js.refresh();
+	}, 500)
+}
+
 common.spider.initMirror=function(){
 	editor_1 = CodeMirror.fromTextArea($("#step1_mirror")[0], {
 		theme:"solarized light",
@@ -228,7 +238,7 @@ common.spider.getModel=function(func){
 					models={};
 					func();
 				}
-				
+
 			}
 		}
 	})
@@ -299,7 +309,7 @@ common.spider.setModel=function(name,p){
 				modelbody.append(div.append(label).append(c_div.append(input)));
 			}
 		}
-		$("#area").prepend('<option value="">--请选择--</option>')	
+		$("#area").prepend('<option value="">--请选择--</option>')
 		if(models!=""){
 			if(typeof(models)!="object"){
 				models=JSON.parse(models);
@@ -310,14 +320,14 @@ common.spider.setModel=function(name,p){
 					getcity(models["area"],models[k])
 					if(models[k]!=""){
 						$("#"+k).prepend('<option selected value="'+models[k]+'">'+models[k]+'</option>')
-					} 
+					}
 				}else{
 					$("#"+k).val(models[k]);
 				}
 			}
 		}
-		
-	}	
+
+	}
 	return true
 }
 
@@ -334,7 +344,7 @@ function getcity(area,city){
 					$("#city").append('<option value="'+r[i]+'">'+r[i]+'</option>')
 				}
 			}
-				
+
 		}
 	})
 }
@@ -449,7 +459,7 @@ common.passwords=function(){
 
 }
 
-function setCookie(name,value){ 
+function setCookie(name,value){
     var expdate = new Date();   //初始化时间
     expdate.setTime(expdate.getTime() + 30 * 60 * 1000);   //时间
     document.cookie = name+"="+value+";expires="+expdate.toGMTString()+";path=/";
@@ -457,12 +467,12 @@ function setCookie(name,value){
 function getCookie(c_name){
 	if (document.cookie.length>0){
 	  c_start=document.cookie.indexOf(c_name + "=")
-	  if (c_start!=-1){ 
-	    c_start=c_start + c_name.length+1 
+	  if (c_start!=-1){
+	    c_start=c_start + c_name.length+1
 	    c_end=document.cookie.indexOf(";",c_start)
 	    if (c_end==-1) c_end=document.cookie.length
 	   	 return unescape(document.cookie.substring(c_start,c_end))
-	    } 
+	    }
 	  }
 	return ""
 }
@@ -515,7 +525,7 @@ common.spider.checkStatus=function(t,code){
 		$(".callout-a").text("下载请求:"+r[4]+"次,时间函数:"+r[5]+"次,列表函数:"+r[6]+"次 "+r[8]+"条信息,内容函数:"+r[7]+"次");
 		common.maskHide();
 		$("#jsonClick")[0].click();
-		
+
 		//window.open("/center/spider/json");
 		//window.open("https://editor.qmx.top/center/spider/json");
 	})
@@ -529,7 +539,7 @@ common.spider.checkTime=function(code){
 		success:function(b){
 			if(b){
 				showMsg("success",function(){});
-				ttable.ajax.reload( null, false ); 
+				ttable.ajax.reload( null, false );
 			}
 		}
 	})

+ 1 - 1
src/web/templates/head.html

@@ -27,8 +27,8 @@
   <link rel="stylesheet" href="/time/css/style.css">
 	<link rel="stylesheet"  href="/css/otherStyle.css">
 	
-	<script src="/js/common.js"></script>
 	<script src="/plugins/jQuery/jquery-2.2.3.min.js"></script>
+	<script src="/js/common.js"></script>
 	<script src="/js/bootstrap.min.js"></script>
 	<script src="/js/bootstrap-datetimepicker.js"></script>
 	<script src="/js/bootstrap-datetimepicker.fr.js"></script>

+ 51 - 0
src/web/templates/spiderbase.html

@@ -1,3 +1,54 @@
+<div class="modal fade" id="modal-js">
+	<div class="modal-dialog">
+		<form class="form-horizontal" role="form">
+			<div class="modal-content">
+				<div class="modal-header">
+					<button type="button" class="close" data-dismiss="modal" aria-label="Close">
+						<span aria-hidden="true">&times;</span></button>
+					<h4 class="modal-title">JS</h4>
+				</div>
+				<div class="modal-body">
+					<div class="form-group" id="step2_js_pre">
+						<textarea id="step2_js" name="">{{.T.lua.js_list.js_text}}</textarea>
+					</div>
+					<div class="form-group" id="step3_js_pre">
+						<textarea id="step3_js" name="">{{.T.lua.js_detail.js_text}}</textarea>
+					</div>
+					<div class="form-group">
+						<label for="js_name" class="col-sm-2 control-label">js文件名:</label>
+						<div class="col-sm-10">
+							<input id="js_name" name="jsname" type="text" class="form-control"  placeholder="请输入引用的js名称(test.js)">
+						</div>
+					</div>
+					<div class="form-group">
+						<label for="js_alias" class="col-sm-2 control-label">js别名:</label>
+						<div class="col-sm-10">
+							<input id="js_alias" name="js_alias" type="text" class="form-control"  placeholder="请输入引用的js别名">
+						</div>
+					</div>
+<!--					<div class="form-group">-->
+<!--						<label for="param_type" class="col-sm-2 control-label">参数:</label>-->
+<!--						<div class="col-sm-10">-->
+<!--							<input id="param_type" name="param_type" type="text" class="form-control" placeholder="请输入参数类型(例:string、int...)">-->
+<!--						</div>-->
+<!--					</div>-->
+<!--					<div class="form-group">-->
+<!--						<label for="return_type" class="col-sm-2 control-label">返回值:</label>-->
+<!--						<div class="col-sm-10">-->
+<!--							<input id="return_type" name="return_type" type="text" class="form-control" placeholder="请输入返回值类型(例:string、int...)">-->
+<!--						</div>-->
+<!--					</div>-->
+				</div>
+				<div class="modal-footer">
+					<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
+					<button type="button" class="btn btn-primary" id="savejs" step="list" onclick="saveJs()">保存</button>
+				</div>
+			</div>
+			<!-- /.modal-content -->
+		</form>
+	</div>
+	<!-- /.modal-dialog -->
+</div>
 <div class="modal fade" id="modal-channels">
 	<div class="modal-dialog">
 		<form class="form-horizontal" role="form">

+ 85 - 10
src/web/templates/spideredit.html

@@ -228,7 +228,7 @@
             <div class="tab-content">
             {{include "step1.html"}}
             {{include "step2.html"}}
-			      {{include "step3.html"}}
+			{{include "step3.html"}}
             {{include "stepre3.html"}}
             </div>
             </div>
@@ -259,13 +259,29 @@
 	
 <script>
 	$(function(){
+		editor2_js = CodeMirror.fromTextArea($("#step2_js")[0], {
+			theme:"solarized light",
+			lineNumbers: true,
+			indentUnit:4,
+			smartIndent:true
+		});
+		editor2_js.setSize("auto","300");
+		editor3_js = CodeMirror.fromTextArea($("#step3_js")[0], {
+			theme:"solarized light",
+			lineNumbers: true,
+			indentUnit:4,
+			smartIndent:true
+		});
+		editor3_js.setSize("auto","300");
+
+
     if({{.T.lua.iscopycontent}}){
       $("#copyTab").prop('checked','checked');
       $("#copyTabDom").show()
       //$("#copyTabDom").find('a').trigger('click')
       //editor_re3.refresh()
     }
-    
+
     $("#copyTab").on('change', function () {
       var result = $(this).prop('checked')
       if (result) {
@@ -277,19 +293,19 @@
         $("#copyTabDom").prev().find('a').trigger('click')
       }
     })
-    
+
     // showTip("注意修改:最大页和间隔时间", 3000);
     $(document).keydown(function(e){
         if(e.keyCode==13){
           $("#com-alert").modal("hide");
-        } 
+        }
   });
 		//初始化编辑器
 		common.setActive("spider");
 		common.spider.guideActive($(".edit-step li:eq(0)").attr("data-mode"),$(".edit-step li:eq(0)").get(0));
 		$(".edit-step li[data-mode]").click(function(node){
+			// console.log(1);
 			common.spider.guideActive($(this).attr("data-mode"),this);
-			//console.log(1);
 			switch ($(this).index()+1){
 				case 1:
 					setTimeout(function(){
@@ -306,11 +322,11 @@
 						editor_3.refresh();
 					},50)
 					break;
-        case 4:
+        		case 4:
 					setTimeout(function(){
 						editor_re3.refresh();
 					},50)
-					break;	
+					break;
 			}
 		});
 		$(".guide button").click(function(){
@@ -323,13 +339,13 @@
 				editor_4.refresh();
         		editor_re3.refresh();
 			}
-			
+
 		})
 
 		$.getJSON("/province.json",function(json){
 			common.spider.json=json;
 			common.spider.getModel(common.spider.setModel);
-			
+
 		})
 		$("legend a").click(function(event,editor){
       		var node = $(this).parent().find("input[type='radio']:checked").val()
@@ -346,7 +362,7 @@
 			var isstep=common.form.isCheck(target,check)
 			if(!isbase || !isstep){
 				return
-			}else{	
+			}else{
 				common.maskShow();
 				var modal=target.replace("step","#tab_");
 				var data=common.form.serializeArray(target);
@@ -499,6 +515,65 @@
 			})      
     });
   }
+  //编辑js
+  function editJs(step) {
+	  if (step == "list"){//list
+		  $("#step2_js_pre").removeClass("hide")
+		  $("#step3_js_pre").addClass("hide")
+		  $("#js_name").val({{.T.lua.js_list.js_name}});
+		  $("#js_alias").val({{.T.lua.js_list.js_alias}});
+		  // $("#param_type").val({{.T.lua.js_list.js_param}});
+		  // $("#return_type").val({{.T.lua.js_list.js_return}});
+	  }else if (step == "detail"){//detail
+		  $("#step2_js_pre").addClass("hide")
+		  $("#step3_js_pre").removeClass("hide")
+		  $("#js_name").val({{.T.lua.js_detail.js_name}});
+		  $("#js_alias").val({{.T.lua.js_detail.js_alias}});
+		  // $("#param_type").val({{.T.lua.js_detail.js_param}});
+		  // $("#return_type").val({{.T.lua.js_detail.js_return}});
+	  }
+	  console.log(step)
+	  $("#savejs").attr("step",step)
+	  common.spider.editjs(step);
+  }
+  //保存js
+  function saveJs() {
+	  var step = $("#savejs").attr("step");
+	  var jstext = ""
+	  if (step == "list"){
+		  jstext = editor2_js.getValue();
+	  }else if (step == "detail"){
+		  jstext = editor3_js.getValue();
+	  }
+	  var js_name = $("#js_name").val();
+	  var js_alias = $("#js_alias").val();
+	  if (jstext == ""){
+		  alert("js不能为空!");
+		  return;
+	  }else if (js_name !="" && js_alias == ""){
+		  alert("js别名不能为空!");
+		  return;
+	  }
+	  // var param_type = $("#param_type").val();
+	  // var return_type = $("#return_type").val();
+	  // if (jstext==""||param_type==""||return_type==""){
+		//   alert("js、参数、返回值不能为空!");
+		//   return;
+	  // }
+	  $.ajax({
+		  url:"/center/save/js",
+		  type:"post",
+		  // data:{"step":step,"jstext":jstext,"js_name":js_name,"param_type":param_type,"return_type":return_type,"code":{{.T.lua.code}}},
+		  data:{"step":step,"jstext":jstext,"js_name":js_name,"js_alias":js_alias,"code":{{.T.lua.code}}},
+		  success:function(r){
+			  $("#modal-js").modal("hide");
+			  showTip("保存成功", 1000);
+			  setTimeout(function (){
+				  window.location.reload();
+			  }, 1000);
+		  }
+	  })
+  }
 </script>
 {{include "socket.html"}}
 {{include "bottom.html"}}

+ 16 - 1
src/web/templates/spiderview.html

@@ -62,7 +62,22 @@
 	</div>
 	
 	<script>
-		$(function(){
+	$(function(){
+		editor2_js = CodeMirror.fromTextArea($("#step2_js")[0], {
+			theme:"solarized light",
+			lineNumbers: true,
+			indentUnit:4,
+			smartIndent:true
+		});
+		editor2_js.setSize("auto","300");
+		editor3_js = CodeMirror.fromTextArea($("#step3_js")[0], {
+			theme:"solarized light",
+			lineNumbers: true,
+			indentUnit:4,
+			smartIndent:true
+		});
+		editor3_js.setSize("auto","300");
+
       if({{.T.lua.iscopycontent}}){
       $("#copyTab").prop('checked','checked');
       $("#copyTabDom").show()

+ 31 - 29
src/web/templates/step2.html

@@ -81,35 +81,37 @@
 			</div>
 		</fieldset>
 		<fieldset data-mode="expert" class="hide">
-				<legend>
-         	<div style="display: flex;flex-direction: row;align-items: center;flex-wrap: wrap;">
-           第二步(专家模式)&nbsp;&nbsp;<a class="btn btn-default btn-sm" for="step2">测&nbsp;&nbsp;试</a>
-				<div style="font-size: 16px;">
-					<span style="margin-left: 10px">页码:</span>
-					<select name="pageno">
-						<option value="1">1</option>
-						<option value="2">2</option>
-						<option value="3">3</option>
-						<option value="4">4</option>
-						<option value="5">5</option>
-						<option value="6">6</option>
-						<option value="7">7</option>
-						<option value="8">8</option>
-						<option value="9">9</option>
-						<option value="10">10</option>
-					</select>
-				</div>
-				<div style="display: flex;flex-direction: row;align-items: center;">
-                <span style="margin-left: 10px;margin-right: 10px;">线路:</span>
-								<div style="font-size: 16px;">
-									<input type="radio" checked name="jd-2-2" value="test">默认</input>
-									<input type="radio" name="jd-2-2" value="comm">线路1</input>
-									<input type="radio" name="jd-2-2" value="bid">线路2</input>
-								</div>
-					  </div>
-            <small style="font-size:14px;text-align:right;width:100%">编辑器热键(F11:全屏/还原 F10:向导模式转专家代码 F9:插入调试代码段 F8:插入下载附件代码段)</small>
-          </div>
-        </legend>
+			<legend>
+				<div style="display: flex;flex-direction: row;align-items: center;flex-wrap: wrap;">
+			   第二步(专家模式)&nbsp;&nbsp;
+					<button type="button" class="btn btn-primary" onclick="editJs('list')">js</button>&nbsp;&nbsp;
+					<a class="btn btn-default btn-sm" for="step2">测&nbsp;&nbsp;试</a>
+					<div style="font-size: 16px;">
+						<span style="margin-left: 10px">页码:</span>
+						<select name="pageno">
+							<option value="1">1</option>
+							<option value="2">2</option>
+							<option value="3">3</option>
+							<option value="4">4</option>
+							<option value="5">5</option>
+							<option value="6">6</option>
+							<option value="7">7</option>
+							<option value="8">8</option>
+							<option value="9">9</option>
+							<option value="10">10</option>
+						</select>
+					</div>
+					<div style="display: flex;flex-direction: row;align-items: center;">
+					<span style="margin-left: 10px;margin-right: 10px;">线路:</span>
+									<div style="font-size: 16px;">
+										<input type="radio" checked name="jd-2-2" value="test">默认</input>
+										<input type="radio" name="jd-2-2" value="comm">线路1</input>
+										<input type="radio" name="jd-2-2" value="bid">线路2</input>
+									</div>
+						  </div>
+				<small style="font-size:14px;text-align:right;width:100%">编辑器热键(F11:全屏/还原 F10:向导模式转专家代码 F9:插入调试代码段 F8:插入下载附件代码段)</small>
+			  </div>
+			</legend>
 				{{if.T.lua.str_list}}
 				<textarea id="step2_mirror" name="Step2.Expert">{{.T.lua.str_list}}</textarea>
 				{{else}}

+ 3 - 1
src/web/templates/step3.html

@@ -59,7 +59,9 @@
 		<fieldset data-mode="expert" class="hide">
 			<legend>
           <div style="display: flex;flex-direction: row;align-items: center;flex-wrap: wrap;">
-           第三步(专家模式)&nbsp;&nbsp;<a class="btn btn-default btn-sm" for="step3">测&nbsp;&nbsp;试</a>
+           第三步(专家模式)&nbsp;&nbsp;
+			  <button type="button" class="btn btn-primary" onclick="editJs('detail')">js</button>&nbsp;&nbsp;
+			<a class="btn btn-default btn-sm" for="step3">测&nbsp;&nbsp;试</a>
             <div style="display: flex;flex-direction: row;align-items: center;">
                 <span style="margin-left: 10px;margin-right: 10px;">线路:</span>
 								<div style="font-size: 16px;">