maxiaoshan 5 роки тому
батько
коміт
617e6fec4b

+ 27 - 0
dataprocess/src/logic/logic.go

@@ -0,0 +1,27 @@
+package logic
+
+import (
+	qu "qfw/util"
+
+	. "../util"
+
+	"github.com/go-xweb/xweb"
+)
+
+type Logic struct {
+	*xweb.Action
+	logicList xweb.Mapper `xweb:"/logic/list"` //查询所有任务
+
+}
+
+func (l *Logic) LogicList() {
+	defer qu.Catch()
+	if l.Method() == "POST" {
+		data, _ := Mgo.Find("task", `{"delete":false}`, nil, nil, false, -1, -1)
+		l.ServeJson(map[string]interface{}{
+			"data": data,
+		})
+	} else {
+		l.Render("com/logic_list.html")
+	}
+}

+ 6 - 0
dataprocess/src/main.go

@@ -5,6 +5,9 @@ import (
 	"time"
 
 	"./front"
+	"./logic"
+	"./microservice"
+	"./task"
 	. "./util"
 
 	"github.com/go-xweb/xweb"
@@ -26,6 +29,9 @@ func init() {
 	xweb.RootApp().AppConfig.Mode = xweb.Product
 	xweb.RootApp().AppConfig.CacheTemplates = false
 	xweb.AddAction(&front.Front{})
+	xweb.AddAction(&task.Task{})
+	xweb.AddAction(&logic.Logic{})
+	xweb.AddAction(&microservice.Service{})
 	xweb.RootApp().AppConfig.SessionTimeout = 1 * time.Hour
 	xweb.RootApp().Logger.SetOutputLevel(4)
 	//xweb.AddTmplVar("add", func(a, b int) int { return a + b })

+ 27 - 0
dataprocess/src/microservice/microservice.go

@@ -0,0 +1,27 @@
+package microservice
+
+import (
+	qu "qfw/util"
+
+	. "../util"
+
+	"github.com/go-xweb/xweb"
+)
+
+type Service struct {
+	*xweb.Action
+	serviceList xweb.Mapper `xweb:"/microservice/list"` //查询所有任务
+
+}
+
+func (s *Service) ServiceList() {
+	defer qu.Catch()
+	if s.Method() == "POST" {
+		data, _ := Mgo.Find("task", `{"delete":false}`, nil, nil, false, -1, -1)
+		s.ServeJson(map[string]interface{}{
+			"data": data,
+		})
+	} else {
+		s.Render("com/microservice_list.html")
+	}
+}

+ 83 - 0
dataprocess/src/task/task.go

@@ -0,0 +1,83 @@
+package task
+
+import (
+	qu "qfw/util"
+	"strings"
+	"time"
+
+	. "../util"
+
+	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
+)
+
+type Task struct {
+	*xweb.Action
+	taskList  xweb.Mapper `xweb:"/task/list"`  //查询所有任务
+	taskSave  xweb.Mapper `xweb:"/task/save"`  //保存任务
+	taskDel   xweb.Mapper `xweb:"/task/del"`   //删除任务
+	taskStope xweb.Mapper `xweb:"/task/start"` //启动任务
+	taskStop  xweb.Mapper `xweb:"/task/stop"`  //停止任务
+}
+
+func (t *Task) TaskList() {
+	defer qu.Catch()
+	if t.Method() == "POST" {
+		data, _ := Mgo.Find("task", `{"delete":false}`, nil, nil, false, -1, -1)
+		t.ServeJson(map[string]interface{}{
+			"data": data,
+		})
+	} else {
+		t.Render("com/task_list.html")
+	}
+}
+
+func (t *Task) TaskSave() {
+	//判断存储配置是否完整
+	s_mgosavecoll := t.GetString("s_mgosavecoll")
+	strs := strings.Split(s_mgosavecoll, "/")
+	if len(strs) < 3 {
+		t.ServeJson(map[string]interface{}{
+			"rep": false,
+			"msg": "保存表输入地址不正确!",
+		})
+		return
+	}
+	_id := t.GetString("_id")
+	data := GetPostForm(t.Request)
+	b := false
+	if _id == "" {
+		data["delete"] = false
+		data["l_comeintime"] = time.Now().Unix()
+		session := t.GetSession("user").(map[string]interface{})
+		data["s_username"] = session["name"].(string)
+		data["s_userid"] = session["id"].(string)
+		data["i_runstate"] = 0
+		b = Mgo.Save("task", data) != ""
+	} else {
+		data["l_lasttime"] = time.Now().Unix()
+		b = Mgo.Update("task", `{"_id":"`+_id+`"}`, map[string]interface{}{
+			"$set": data,
+		}, false, false)
+	}
+	t.ServeJson(map[string]interface{}{
+		"rep": b,
+	})
+}
+
+func (t *Task) TaskDel() {
+	_id := t.GetString("_id")
+	query := bson.M{
+		"_id": qu.StringTOBsonId(_id),
+	}
+	set := bson.M{
+		"$set": bson.M{
+			"delete": true,
+		},
+	}
+	b := Mgo.Update("task", query, set, false, false)
+	t.ServeJson(map[string]interface{}{
+		"rep": b,
+	})
+
+}

+ 35 - 0
dataprocess/src/util/util.go

@@ -0,0 +1,35 @@
+package util
+
+import (
+	"net/http"
+	"strconv"
+)
+
+//数据类型转换
+func GetPostForm(r *http.Request) map[string]interface{} {
+	val := map[string]interface{}{}
+	for k, _ := range r.Form {
+		if len(k) < 2 {
+			continue
+		}
+		if k != "_id" {
+			v := r.FormValue(k)
+			switch k[:2] {
+			case "s_": //string型
+				val[k] = v
+			case "l_": //int64位
+				val[k], _ = strconv.ParseInt(v, 10, 64)
+			case "i_": //int型
+				val[k], _ = strconv.Atoi(v)
+			default:
+				if v == "true" || v == "false" {
+					b, _ := strconv.ParseBool(v)
+					val[k] = b
+				} else {
+					val[k] = v
+				}
+			}
+		}
+	}
+	return val
+}

+ 1 - 3
dataprocess/src/web/templates/com/dialog.html

@@ -1,4 +1,3 @@
-{{ define "dialog" }}
 <div class="modal fade" id="myModal" tabindex="-1" role="dialog" 
    aria-labelledby="myModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
    <div class="modal-dialog">
@@ -24,5 +23,4 @@
       </div><!-- /.modal-content -->
    </div><!-- /.modal-dialog -->
 </div><!-- /.modal -->
-<script src="./js/dialog.js"></script>
-{{end}}
+<script src="/js/dialog.js"></script>

+ 251 - 0
dataprocess/src/web/templates/com/logic_list.html

@@ -0,0 +1,251 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+
+<div class="content-wrapper" id="showbtn">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增任务</a></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/task/list"><i class="fa fa-dashboard"></i> 任务管理</a></li>		  
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content">
+      <div class="row">
+	      <div class="col-xs-12">
+	        <div class="box">
+		        <div class="box-body">
+		            <table id="dataTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <th>任务名称</th> <th>创建时间</th> <th>创建人</th> <th>描述</th><th>运行状态</th> <th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+</div>
+{{include "com/dialog.html"}}
+{{include "com/footer.html"}}
+<script>
+menuActive("list")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : false,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/logic/list",
+			"type": "post",
+			"data":{}
+		 },
+		"language": {
+            "url": "/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_taskname"},
+			{ "data": "l_comeintime",render:function(val){
+				var dt=new Date()
+				dt.setTime(parseInt(val)*1000)
+				return dt.format("yyyy-MM-dd hh:mm:ss")
+			}},
+			{ "data": "s_username"},
+			{ "data": "s_descript","width":"25%"},
+			{ "data": "i_runstate",render:function(val){
+				if(val==1){
+					return "<i class='fa fa-fw fa-circle text-green'></i>运行中"
+				}else{
+					return "<i class='fa fa-fw fa-circle text-danger'></i>未启动"
+				}
+			}},
+			{ "data":"_id","width":"25%",render:function(val,a,row,pos){
+				tmp = '<div>'+
+					'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+					'<a class="btn btn-sm btn-success opr" opr="start" onclick="start(\''+row._id+'\')">启动</a> '+
+					'<a class="btn btn-sm btn-info opr" opr="stop" onclick="stop(\''+row._id+'\')">停止</a> '+
+					'<a class="btn btn-sm btn-danger opr" opr="del" onclick="del(\''+val+'\')">删除</a>'+
+					'</div>';
+				return  tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$("#showbtn").on('click','a.opr',function(){
+			var n=$(this).attr("opr");
+			var taskid=$(this).attr("taskid");
+			var htmlObj={},obj,tag=[],bts=[];
+			var _tit="";
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();	
+			case "new":
+				/*表单*/
+				addtask=[
+					{label:"任务名称",s_label:"s_taskname",placeholder:"数据清洗",must:true},
+					{label:"源库连接",s_label:"s_mgoaddr",must:true},
+					{label:"源数据库",s_label:"s_mgodb",must:true},
+					{label:"源表",s_label:"s_mgocoll",must:true},
+					{label:"保存表",s_label:"s_mgosavecoll",placeholder:"127.0.0.1:27080/dataprocess/bidding(数据库地址/数据库/表)",must:true},
+					{label:"描述",s_label:"s_descript",type:"tpl_text"},
+					/*
+					{label:"是否追踪",s_label:"i_track",type:"tpl_list_local",must:true,list:[{"s_name":"是","_id":1},{"s_name":"否","_id":0}],default:0,fun:function(){
+						var to=$("#i_track")					
+						to.val($(this).attr("_id"))
+						$("#s_show",to.closest("div")).val($(this).text())
+						//追踪表样式
+						$("#s_trackcoll").attr("must",$(this).attr("_id")==1)
+						$("#s_trackcoll").closest("div.row").find("label").css("color",$(this).attr("_id")==1?"red":"")
+					}},
+					{label:"追踪记录表",s_label:"s_trackcoll",must:function(){
+						return  obj&&obj.i_track
+					}()},
+					{label:"是否统计",s_label:"i_count",type:"tpl_list_local",must:true,list:[{"s_name":"是","_id":1},{"s_name":"否","_id":0}],default:0},
+					*/
+					//{label:"使用版本",s_label:"s_version",type:"tpl_list_local",must:true,url:"/admin/task/getversion"},
+					{label:"并发数量",s_label:"i_process",placeholder:"5",must:true},
+					{label:"预处理逻辑",s_label:"s_preprocesslogic",type:"tpl_list_local",url:""},
+					{label:"匹配逻辑",s_label:"s_class",type:"tpl_list_ajax",url:"",fun:function(){
+						var ids=$("#s_class").data("ids")
+						var parentDiv=$("#s_class").closest("div")
+						ids=ids||{}
+						var tid=$(this).attr("_id")
+						if(!ids[tid]){
+							ids[tid]=true
+							$("#s_class").data("ids",ids)
+							var tpl1=$('<div class="alert alert-dismissible alert-success" style="min-width:50px;max-width:250px;font-size:10px;padding:3px;margin:5px;display:inline-block"><button type="button" class="close" data-dismiss="alert" style="right:0px;">&times;</button><span></span></div>')
+							tpl1.find("span").text($(this).text())							
+							tpl1.attr("tid",tid)
+							tpl1.find("button").click(function(){
+								var ttid=$(this).closest(".alert").attr("tid");
+								var iids=$("#s_class").data("ids")
+								delete iids[ttid]
+								$("#s_class").val(function(){
+									var strid=[]
+									for(var k in iids){
+										strid.push(k)
+									}
+									return strid.join(",")
+								}())
+							})
+							$("#s_show",parentDiv).append(tpl1)
+							$("#s_class").val(function(){
+								var strid=[]
+								for(var k in ids){
+									strid.push(k)
+								}
+								return strid.join(",")
+							}())
+						}
+					}},
+					//{label:"匹配逻辑",s_label:"s_matchlogic",type:"tpl_list_local",url:""},
+					{label:"字段",s_label:"s_field",placeholder:"title"},
+					{label:"起始id",s_label:"s_extlastid",must:true},
+					{s_label:"_id",type:"tpl_hidden"},
+				];
+				/*testtask=[
+					{label:"起始id",s_label:"s_startid",must:true},
+					{label:"数据数量",s_label:"s_datanum",placeholder:"5",must:true}
+				];*/
+				/*按钮*/
+				//新增保存按钮
+				addtaskbtn=[
+					{label:"保存",class:"btn-primary",
+						fun:function(){
+							var obj={}
+							var bcon=true
+							$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+								var val=$(el).val();
+								if(el.id!="_id"&&$(el).attr("must")&&!val){
+									bcon=false
+									return false
+								}
+								obj[el.id]=$(el).val()
+							})
+							if (bcon){								
+								$.post("/task/save",obj,function(data){
+									if(data&&data.rep){
+										//window.location.href="/task/list"
+										$('#myModal').modal('hide');
+										ttable.ajax.reload();
+									}else{
+										alert(data.msg)
+									}
+								},'json')
+							}else{
+								alert("红色标签的表单不能为空!")
+							}
+						}
+					}
+				];
+				if(n == "new"){
+					_tit="新增抽取任务";
+					tag = com.pushArry(tag,addtask);
+					bts = com.pushArry(bts,addtaskbtn);
+				}else if(n == "edit"){
+					_tit="编辑-"+obj.s_taskname;
+					tag = com.pushArry(tag,addtask);
+					bts = com.pushArry(bts,addtaskbtn);
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+	
+})
+function start(_id){
+	showConfirm("确定启动?", function() {
+		$.ajax({
+			url:"/task/start",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				//window.location.reload();
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+function stop(_id){
+	showConfirm("确定停止?", function() {
+		$.ajax({
+			url:"/task/stop",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				//window.location.reload()
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+function del(_id){
+	showConfirm("确定启动?", function() {
+		$.ajax({
+			url:"/task/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+</script>

+ 251 - 0
dataprocess/src/web/templates/com/microservice_list.html

@@ -0,0 +1,251 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+
+<div class="content-wrapper" id="showbtn">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增任务</a></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/task/list"><i class="fa fa-dashboard"></i> 任务管理</a></li>		  
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content">
+      <div class="row">
+	      <div class="col-xs-12">
+	        <div class="box">
+		        <div class="box-body">
+		            <table id="dataTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <th>任务名称</th> <th>创建时间</th> <th>创建人</th> <th>描述</th><th>运行状态</th> <th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+</div>
+{{include "com/dialog.html"}}
+{{include "com/footer.html"}}
+<script>
+menuActive("list")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : false,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/microservice/list",
+			"type": "post",
+			"data":{}
+		 },
+		"language": {
+            "url": "/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_taskname"},
+			{ "data": "l_comeintime",render:function(val){
+				var dt=new Date()
+				dt.setTime(parseInt(val)*1000)
+				return dt.format("yyyy-MM-dd hh:mm:ss")
+			}},
+			{ "data": "s_username"},
+			{ "data": "s_descript","width":"25%"},
+			{ "data": "i_runstate",render:function(val){
+				if(val==1){
+					return "<i class='fa fa-fw fa-circle text-green'></i>运行中"
+				}else{
+					return "<i class='fa fa-fw fa-circle text-danger'></i>未启动"
+				}
+			}},
+			{ "data":"_id","width":"25%",render:function(val,a,row,pos){
+				tmp = '<div>'+
+					'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+					'<a class="btn btn-sm btn-success opr" opr="start" onclick="start(\''+row._id+'\')">启动</a> '+
+					'<a class="btn btn-sm btn-info opr" opr="stop" onclick="stop(\''+row._id+'\')">停止</a> '+
+					'<a class="btn btn-sm btn-danger opr" opr="del" onclick="del(\''+val+'\')">删除</a>'+
+					'</div>';
+				return  tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$("#showbtn").on('click','a.opr',function(){
+			var n=$(this).attr("opr");
+			var taskid=$(this).attr("taskid");
+			var htmlObj={},obj,tag=[],bts=[];
+			var _tit="";
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();	
+			case "new":
+				/*表单*/
+				addtask=[
+					{label:"任务名称",s_label:"s_taskname",placeholder:"数据清洗",must:true},
+					{label:"源库连接",s_label:"s_mgoaddr",must:true},
+					{label:"源数据库",s_label:"s_mgodb",must:true},
+					{label:"源表",s_label:"s_mgocoll",must:true},
+					{label:"保存表",s_label:"s_mgosavecoll",placeholder:"127.0.0.1:27080/dataprocess/bidding(数据库地址/数据库/表)",must:true},
+					{label:"描述",s_label:"s_descript",type:"tpl_text"},
+					/*
+					{label:"是否追踪",s_label:"i_track",type:"tpl_list_local",must:true,list:[{"s_name":"是","_id":1},{"s_name":"否","_id":0}],default:0,fun:function(){
+						var to=$("#i_track")					
+						to.val($(this).attr("_id"))
+						$("#s_show",to.closest("div")).val($(this).text())
+						//追踪表样式
+						$("#s_trackcoll").attr("must",$(this).attr("_id")==1)
+						$("#s_trackcoll").closest("div.row").find("label").css("color",$(this).attr("_id")==1?"red":"")
+					}},
+					{label:"追踪记录表",s_label:"s_trackcoll",must:function(){
+						return  obj&&obj.i_track
+					}()},
+					{label:"是否统计",s_label:"i_count",type:"tpl_list_local",must:true,list:[{"s_name":"是","_id":1},{"s_name":"否","_id":0}],default:0},
+					*/
+					//{label:"使用版本",s_label:"s_version",type:"tpl_list_local",must:true,url:"/admin/task/getversion"},
+					{label:"并发数量",s_label:"i_process",placeholder:"5",must:true},
+					{label:"预处理逻辑",s_label:"s_preprocesslogic",type:"tpl_list_local",url:""},
+					{label:"匹配逻辑",s_label:"s_class",type:"tpl_list_ajax",url:"",fun:function(){
+						var ids=$("#s_class").data("ids")
+						var parentDiv=$("#s_class").closest("div")
+						ids=ids||{}
+						var tid=$(this).attr("_id")
+						if(!ids[tid]){
+							ids[tid]=true
+							$("#s_class").data("ids",ids)
+							var tpl1=$('<div class="alert alert-dismissible alert-success" style="min-width:50px;max-width:250px;font-size:10px;padding:3px;margin:5px;display:inline-block"><button type="button" class="close" data-dismiss="alert" style="right:0px;">&times;</button><span></span></div>')
+							tpl1.find("span").text($(this).text())							
+							tpl1.attr("tid",tid)
+							tpl1.find("button").click(function(){
+								var ttid=$(this).closest(".alert").attr("tid");
+								var iids=$("#s_class").data("ids")
+								delete iids[ttid]
+								$("#s_class").val(function(){
+									var strid=[]
+									for(var k in iids){
+										strid.push(k)
+									}
+									return strid.join(",")
+								}())
+							})
+							$("#s_show",parentDiv).append(tpl1)
+							$("#s_class").val(function(){
+								var strid=[]
+								for(var k in ids){
+									strid.push(k)
+								}
+								return strid.join(",")
+							}())
+						}
+					}},
+					//{label:"匹配逻辑",s_label:"s_matchlogic",type:"tpl_list_local",url:""},
+					{label:"字段",s_label:"s_field",placeholder:"title"},
+					{label:"起始id",s_label:"s_extlastid",must:true},
+					{s_label:"_id",type:"tpl_hidden"},
+				];
+				/*testtask=[
+					{label:"起始id",s_label:"s_startid",must:true},
+					{label:"数据数量",s_label:"s_datanum",placeholder:"5",must:true}
+				];*/
+				/*按钮*/
+				//新增保存按钮
+				addtaskbtn=[
+					{label:"保存",class:"btn-primary",
+						fun:function(){
+							var obj={}
+							var bcon=true
+							$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+								var val=$(el).val();
+								if(el.id!="_id"&&$(el).attr("must")&&!val){
+									bcon=false
+									return false
+								}
+								obj[el.id]=$(el).val()
+							})
+							if (bcon){								
+								$.post("/task/save",obj,function(data){
+									if(data&&data.rep){
+										//window.location.href="/task/list"
+										$('#myModal').modal('hide');
+										ttable.ajax.reload();
+									}else{
+										alert(data.msg)
+									}
+								},'json')
+							}else{
+								alert("红色标签的表单不能为空!")
+							}
+						}
+					}
+				];
+				if(n == "new"){
+					_tit="新增抽取任务";
+					tag = com.pushArry(tag,addtask);
+					bts = com.pushArry(bts,addtaskbtn);
+				}else if(n == "edit"){
+					_tit="编辑-"+obj.s_taskname;
+					tag = com.pushArry(tag,addtask);
+					bts = com.pushArry(bts,addtaskbtn);
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+	
+})
+function start(_id){
+	showConfirm("确定启动?", function() {
+		$.ajax({
+			url:"/task/start",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				//window.location.reload();
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+function stop(_id){
+	showConfirm("确定停止?", function() {
+		$.ajax({
+			url:"/task/stop",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				//window.location.reload()
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+function del(_id){
+	showConfirm("确定启动?", function() {
+		$.ajax({
+			url:"/task/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+</script>

+ 251 - 0
dataprocess/src/web/templates/com/task_list.html

@@ -0,0 +1,251 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+
+<div class="content-wrapper" id="showbtn">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增任务</a></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/task/list"><i class="fa fa-dashboard"></i> 任务管理</a></li>		  
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content">
+      <div class="row">
+	      <div class="col-xs-12">
+	        <div class="box">
+		        <div class="box-body">
+		            <table id="dataTable" class="table table-bordered table-hover">
+		              <thead>
+		              <tr>
+		                <th>任务名称</th> <th>创建时间</th> <th>创建人</th> <th>描述</th><th>运行状态</th> <th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+</div>
+{{include "com/dialog.html"}}
+{{include "com/footer.html"}}
+<script>
+menuActive("list")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : false,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/task/list",
+			"type": "post",
+			"data":{}
+		 },
+		"language": {
+            "url": "/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_taskname"},
+			{ "data": "l_comeintime",render:function(val){
+				var dt=new Date()
+				dt.setTime(parseInt(val)*1000)
+				return dt.format("yyyy-MM-dd hh:mm:ss")
+			}},
+			{ "data": "s_username"},
+			{ "data": "s_descript","width":"25%"},
+			{ "data": "i_runstate",render:function(val){
+				if(val==1){
+					return "<i class='fa fa-fw fa-circle text-green'></i>运行中"
+				}else{
+					return "<i class='fa fa-fw fa-circle text-danger'></i>未启动"
+				}
+			}},
+			{ "data":"_id","width":"25%",render:function(val,a,row,pos){
+				tmp = '<div>'+
+					'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+					'<a class="btn btn-sm btn-success opr" opr="start" onclick="start(\''+row._id+'\')">启动</a> '+
+					'<a class="btn btn-sm btn-info opr" opr="stop" onclick="stop(\''+row._id+'\')">停止</a> '+
+					'<a class="btn btn-sm btn-danger opr" opr="del" onclick="del(\''+val+'\')">删除</a>'+
+					'</div>';
+				return  tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$("#showbtn").on('click','a.opr',function(){
+			var n=$(this).attr("opr");
+			var taskid=$(this).attr("taskid");
+			var htmlObj={},obj,tag=[],bts=[];
+			var _tit="";
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();	
+			case "new":
+				/*表单*/
+				addtask=[
+					{label:"任务名称",s_label:"s_taskname",placeholder:"数据清洗",must:true},
+					{label:"源库连接",s_label:"s_mgoaddr",must:true},
+					{label:"源数据库",s_label:"s_mgodb",must:true},
+					{label:"源表",s_label:"s_mgocoll",must:true},
+					{label:"保存表",s_label:"s_mgosavecoll",placeholder:"127.0.0.1:27080/dataprocess/bidding(数据库地址/数据库/表)",must:true},
+					{label:"描述",s_label:"s_descript",type:"tpl_text"},
+					/*
+					{label:"是否追踪",s_label:"i_track",type:"tpl_list_local",must:true,list:[{"s_name":"是","_id":1},{"s_name":"否","_id":0}],default:0,fun:function(){
+						var to=$("#i_track")					
+						to.val($(this).attr("_id"))
+						$("#s_show",to.closest("div")).val($(this).text())
+						//追踪表样式
+						$("#s_trackcoll").attr("must",$(this).attr("_id")==1)
+						$("#s_trackcoll").closest("div.row").find("label").css("color",$(this).attr("_id")==1?"red":"")
+					}},
+					{label:"追踪记录表",s_label:"s_trackcoll",must:function(){
+						return  obj&&obj.i_track
+					}()},
+					{label:"是否统计",s_label:"i_count",type:"tpl_list_local",must:true,list:[{"s_name":"是","_id":1},{"s_name":"否","_id":0}],default:0},
+					*/
+					//{label:"使用版本",s_label:"s_version",type:"tpl_list_local",must:true,url:"/admin/task/getversion"},
+					{label:"并发数量",s_label:"i_process",placeholder:"5",must:true},
+					{label:"预处理逻辑",s_label:"s_preprocesslogic",type:"tpl_list_local",url:""},
+					{label:"匹配逻辑",s_label:"s_class",type:"tpl_list_ajax",url:"",fun:function(){
+						var ids=$("#s_class").data("ids")
+						var parentDiv=$("#s_class").closest("div")
+						ids=ids||{}
+						var tid=$(this).attr("_id")
+						if(!ids[tid]){
+							ids[tid]=true
+							$("#s_class").data("ids",ids)
+							var tpl1=$('<div class="alert alert-dismissible alert-success" style="min-width:50px;max-width:250px;font-size:10px;padding:3px;margin:5px;display:inline-block"><button type="button" class="close" data-dismiss="alert" style="right:0px;">&times;</button><span></span></div>')
+							tpl1.find("span").text($(this).text())							
+							tpl1.attr("tid",tid)
+							tpl1.find("button").click(function(){
+								var ttid=$(this).closest(".alert").attr("tid");
+								var iids=$("#s_class").data("ids")
+								delete iids[ttid]
+								$("#s_class").val(function(){
+									var strid=[]
+									for(var k in iids){
+										strid.push(k)
+									}
+									return strid.join(",")
+								}())
+							})
+							$("#s_show",parentDiv).append(tpl1)
+							$("#s_class").val(function(){
+								var strid=[]
+								for(var k in ids){
+									strid.push(k)
+								}
+								return strid.join(",")
+							}())
+						}
+					}},
+					//{label:"匹配逻辑",s_label:"s_matchlogic",type:"tpl_list_local",url:""},
+					{label:"字段",s_label:"s_field",placeholder:"title"},
+					{label:"起始id",s_label:"s_extlastid",must:true},
+					{s_label:"_id",type:"tpl_hidden"},
+				];
+				/*testtask=[
+					{label:"起始id",s_label:"s_startid",must:true},
+					{label:"数据数量",s_label:"s_datanum",placeholder:"5",must:true}
+				];*/
+				/*按钮*/
+				//新增保存按钮
+				addtaskbtn=[
+					{label:"保存",class:"btn-primary",
+						fun:function(){
+							var obj={}
+							var bcon=true
+							$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+								var val=$(el).val();
+								if(el.id!="_id"&&$(el).attr("must")&&!val){
+									bcon=false
+									return false
+								}
+								obj[el.id]=$(el).val()
+							})
+							if (bcon){								
+								$.post("/task/save",obj,function(data){
+									if(data&&data.rep){
+										//window.location.href="/task/list"
+										$('#myModal').modal('hide');
+										ttable.ajax.reload();
+									}else{
+										alert(data.msg)
+									}
+								},'json')
+							}else{
+								alert("红色标签的表单不能为空!")
+							}
+						}
+					}
+				];
+				if(n == "new"){
+					_tit="新增抽取任务";
+					tag = com.pushArry(tag,addtask);
+					bts = com.pushArry(bts,addtaskbtn);
+				}else if(n == "edit"){
+					_tit="编辑-"+obj.s_taskname;
+					tag = com.pushArry(tag,addtask);
+					bts = com.pushArry(bts,addtaskbtn);
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+	
+})
+function start(_id){
+	showConfirm("确定启动?", function() {
+		$.ajax({
+			url:"/task/start",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				//window.location.reload();
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+function stop(_id){
+	showConfirm("确定停止?", function() {
+		$.ajax({
+			url:"/task/stop",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				//window.location.reload()
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+function del(_id){
+	showConfirm("确定启动?", function() {
+		$.ajax({
+			url:"/task/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				ttable.ajax.reload();
+			}
+		})
+	});
+}
+</script>