Forráskód Böngészése

Merge branch 'dev0.3' of http://192.168.3.207:10080/qmx/datatag into dev0.3

* 'dev0.3' of http://192.168.3.207:10080/qmx/datatag:
  备份
  udp
  任务管理  类型
  task模型
  -任务管理-udp
  打标签应用修改
  修改-任务列表相关 - udp待定
  增删改差,列表
Jianghan 5 éve
szülő
commit
d17fa91e04

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/dataTag.iml" filepath="$PROJECT_DIR$/.idea/dataTag.iml" />
+    </modules>
+  </component>
+</project>

+ 3 - 0
src/config.json

@@ -1,8 +1,11 @@
 {
   "port": "7000",
+  "udpport": ":11116",
   "mgodb": "192.168.3.207:27092",
   "dbsize": 5,
   "dbname": "datatag",
+  "jydbname": "extract_kf",
+  "jycollname": "zk_xiufu_test01",
   "mgodben": "192.168.3.207:27092",
   "dbnameen": "enterprise",
   "mongoenc": "winner_enterprise",

+ 3 - 1
src/main.go

@@ -7,6 +7,7 @@ import (
 	qu "qfw/util"
 	"service"
 	"time"
+	. "udptask"
 	"util"
 
 	"github.com/go-xweb/xweb"
@@ -16,7 +17,7 @@ func init() {
 	qu.ReadConfig(&util.Sysconfig) //初始化配置
 	util.InitMgoPool()             //初始化连接
 	util.InitOther()
-
+	InitUdp()
 	//xweb框架配置
 	xweb.Config.RecoverPanic = true
 	xweb.Config.Profiler = true
@@ -40,6 +41,7 @@ func init() {
 	xweb.RootApp().Logger.SetOutputLevel(4)
 
 	//xweb.AddTmplVar("add", func(a, b int) int { return a + b })
+	//InitTask("5ecf56ed92b4ee16ffd7e21e")
 }
 
 func main() {

+ 108 - 2
src/service/repair_rule.go

@@ -2,17 +2,123 @@ package service
 
 import (
 	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
+	"log"
 	qu "qfw/util"
+	"reflect"
+	. "util"
 )
 
 type RepairRule struct {
 	*xweb.Action
-	taskList     xweb.Mapper `xweb:"/service/jianyu/repair"`         //标签列表
+	repairList     xweb.Mapper `xweb:"/service/jianyu/repair"`
+	searchID       xweb.Mapper `xweb:"/service/jianyu/searchID"`
+	searchHref     xweb.Mapper `xweb:"/service/jianyu/searchHref"`
+	repairEdit     xweb.Mapper `xweb:"/service/jianyu/edit"`
+	repairDelete   xweb.Mapper `xweb:"/service/jianyu/delete"`
+	repairSave     xweb.Mapper `xweb:"/service/jianyu/save"`
+
 }
 
 
-func (jy *RepairRule) TaskList() {
+func (jy *RepairRule) RepairList() {
 	defer qu.Catch()
 	jy.Render("repair/jianyu_repair.html")
 
+
+}
+
+//编辑
+func (jy *RepairRule) RepairEdit() {
+	defer qu.Catch()
+	id := jy.GetString("id")
+	data, _ := JYMgo.FindById(JyCollName,id,"")
+
+	//contenthtml detail 单独拿出来
+	jy.T["data"] = *data
+
+
+	jy.Render("repair/jianyu_edit.html", &jy.T)
+}
+
+//删除
+func (jy *RepairRule) RepairDelete() {
+	defer qu.Catch()
+	//测试-待定
+	jy.ServeJson(map[string]interface{}{
+		"rep": true,
+	})
+	//_id := jy.GetString("_id")
+	//set := bson.M{"_id":qu.StringTOBsonId(_id)}
+	//b :=Mgo.Del("JyCollName",set)
+	//jy.ServeJson(map[string]interface{}{
+	//	"rep": b,
+	//})
+}
+
+
+//修改-mongo -es
+func (jy *RepairRule) RepairSave() {
+	if jy.Method() == "POST" {
+		data := GetPostForm(jy.Request)
+		updata:=qu.ObjToMap(data["data"])
+		log.Println(reflect.TypeOf(updata))
+		id := qu.ObjToString((*updata)["_id"])
+		log.Println("当前id",id)
+		query := bson.M{
+			"_id": qu.StringTOBsonId(id),
+		}
+		delete(*updata,"_id")
+		rep := JYMgo.Update(JyCollName, query, bson.M{"$set": *updata}, false, true)
+		jy.ServeJson(map[string]interface{}{
+			"rep": rep,
+		})
+	}
+}
+
+
+//查询
+func (jy *RepairRule) SearchID() {
+	defer qu.Catch()
+	if jy.Method() == "POST" {
+		id := jy.GetString("_id")
+		id = "5da3f2cba5cb26b9b7985f3f"
+		if !bson.IsObjectIdHex(id){
+			jy.ServeJson(map[string]interface{}{
+				"rep":false,
+				"msg":"id格式不正确",
+			})
+		}else {
+			data, rep := JYMgo.Find(JyCollName, bson.M{"_id": qu.StringTOBsonId(id)}, nil, nil, false, -1, -1)
+			if !rep ||len(*data)<=0 {
+				jy.ServeJson(map[string]interface{}{
+					"rep": false,
+					"msg":"未查询到数据",
+				})
+			}else {
+				jy.ServeJson(map[string]interface{}{
+					"rep":				rep,
+					"data":            data,
+				})
+			}
+		}
+	}
 }
+
+func (jy *RepairRule) SearchHref() {
+	defer qu.Catch()
+	if jy.Method() == "POST" {
+		href := jy.GetString("href")
+		data, rep := JYMgo.Find(JyCollName, bson.M{"href": href}, nil, nil, false, -1, -1)
+		if !rep ||len(*data)<=0 {
+			jy.ServeJson(map[string]interface{}{
+				"rep":				false,
+			})
+		}else {
+			jy.ServeJson(map[string]interface{}{
+				"rep":				rep,
+				"data":            data,
+			})
+		}
+	}
+}

+ 127 - 13
src/service/task_rule.go

@@ -1,20 +1,29 @@
 package service
 
 import (
-	"github.com/go-xweb/xweb"
-	"gopkg.in/mgo.v2/bson"
+	"encoding/json"
+	"log"
+	mu "mfw/util"
+	"net"
 	qu "qfw/util"
 	"strings"
 	"time"
+	. "udptask"
 	. "util"
+
+	"github.com/go-xweb/xweb"
+	"gopkg.in/mgo.v2/bson"
 )
 
 type TaskRule struct {
 	*xweb.Action
-	taskList     xweb.Mapper `xweb:"/service/task/list"`         //任务列表
-	taskCreate   xweb.Mapper `xweb:"/service/task/create"`       //任务创建
-	taskEdit  	 xweb.Mapper `xweb:"/service/task/edit"`         //任务编辑
-	taskSave   	 xweb.Mapper `xweb:"/service/task/save"`       	 //任务保存
+	taskList   xweb.Mapper `xweb:"/service/task/list"`   //任务列表
+	taskCreate xweb.Mapper `xweb:"/service/task/create"` //任务创建
+	taskEdit   xweb.Mapper `xweb:"/service/task/edit"`   //任务编辑
+	taskSave   xweb.Mapper `xweb:"/service/task/save"`   //任务保存
+	taskDelete xweb.Mapper `xweb:"/service/task/delete"` //任务保存
+	taskStart  xweb.Mapper `xweb:"/service/task/start"`  //任务保存
+	taskEnd    xweb.Mapper `xweb:"/service/task/end"`    //任务保存
 }
 
 //展示列表
@@ -36,7 +45,7 @@ func (task *TaskRule) TaskList() {
 			"recordsFiltered": count,
 			"recordsTotal":    count,
 		})
-	}else {
+	} else {
 		task.Render("task/task_list.html")
 	}
 }
@@ -55,14 +64,15 @@ func (task *TaskRule) TaskCreate() {
 //编辑
 func (task *TaskRule) TaskEdit() {
 	defer qu.Catch()
-	id := task.GetString("id")         //标签列表编辑
+	log.Println("编辑")
+	id := task.GetString("id")
 	query := bson.M{}
 	query["_id"] = qu.StringTOBsonId(id)
 	data, _ := Mgo.FindOneByField("taskinfo", query, `{}`)
 	(*data)["id"] = qu.BsonIdToSId((*data)["_id"])
 	task.T["data"] = *data
 	task.T["taskType"] = TaskTypeMap
-	task.Render("private/task_edit.html", &task.T)
+	task.Render("task/task_edit.html", &task.T)
 }
 
 //保存
@@ -76,24 +86,128 @@ func (task *TaskRule) TaskSave() {
 		delete(data, "id")
 		curtime := time.Now().Unix()
 		if id == "" { //新建
+			log.Println("新建-数据")
 			data["i_createtime"] = curtime
 			data["s_createuser"] = user["name"]
-		}else {
+			data["i_updatetime"] = curtime
+
+		} else {
+			log.Println("更新-数据", id)
 			data["i_updatetime"] = curtime
 			data["s_updateuser"] = user["name"]
 		}
-		id, rep := saveTaskMongo(id,data)
+		id, rep := saveTaskMongo(id, data)
 		task.ServeJson(map[string]interface{}{
-			"rep":       rep,
+			"rep": rep,
 		})
 	}
 }
 
+//删除
+func (task *TaskRule) TaskDelete() {
+	defer qu.Catch()
+	_id := task.GetString("_id")
+	set := bson.M{"_id": qu.StringTOBsonId(_id)}
+	b := Mgo.Del("taskinfo", set)
+	task.ServeJson(map[string]interface{}{
+		"rep": b,
+	})
+}
 
+//开始任务
+func (task *TaskRule) TaskStart() {
+	defer qu.Catch()
+	data := GetPostForm(task.Request)
+	id := qu.ObjToString(data["id"])
+	//发送udp 开启
+	by, _ := json.Marshal(map[string]interface{}{
+		"taskid": id,
+		"stype":  "startTask",
+	})
+	addr := &net.UDPAddr{
+		IP:   net.ParseIP(data["addr"].(string)),
+		Port: qu.IntAll(data["port"]),
+	}
 
+	err := Udpclient.WriteUdp(by, mu.OP_TYPE_DATA, addr)
+	if err != nil {
+		task.ServeJson(map[string]interface{}{
+			"rep": false,
+			"msg": "任务开始失败-udp",
+		})
+	}
 
+	n := 0
+	for {
+		if !IsTaskOK && n < Timeout {
+			time.Sleep(1 * time.Second)
+			n++
+		} else {
+			break
+		}
+	}
+	log.Println("循环结束", IsTaskOK, n, "处理开启post回调")
+	if IsTaskOK {
+		IsTaskOK = false
+		task.ServeJson(map[string]interface{}{
+			"rep": true,
+			"msg": "任务开始成功",
+		})
+	} else {
+		IsTaskOK = false
+		task.ServeJson(map[string]interface{}{
+			"rep": false,
+			"msg": "任务开始失败-超时",
+		})
+	}
+}
 
+//关闭任务
+func (task *TaskRule) TaskEnd() {
+	defer qu.Catch()
+	data := GetPostForm(task.Request)
+	id := qu.ObjToString(data["id"])
+	//发送udp 关闭
+	by, _ := json.Marshal(map[string]interface{}{
+		"taskid": id,
+		"stype":  "stopTask",
+	})
+	addr := &net.UDPAddr{
+		IP:   net.ParseIP(data["addr"].(string)),
+		Port: qu.IntAll(data["port"]),
+	}
+	err := Udpclient.WriteUdp(by, mu.OP_TYPE_DATA, addr)
+	if err != nil {
+		task.ServeJson(map[string]interface{}{
+			"rep": false,
+			"msg": "任务开始失败-udp",
+		})
+	}
 
+	n := 0
+	for {
+		if !IsTaskOK && n < Timeout {
+			time.Sleep(1 * time.Second)
+			n++
+		} else {
+			break
+		}
+	}
+	log.Println("循环结束", IsTaskOK, n, "处理关闭post回调")
+	if IsTaskOK {
+		IsTaskOK = false
+		task.ServeJson(map[string]interface{}{
+			"rep": true,
+			"msg": "任务开始成功",
+		})
+	} else {
+		IsTaskOK = false
+		task.ServeJson(map[string]interface{}{
+			"rep": false,
+			"msg": "任务开始失败-超时",
+		})
+	}
+}
 
 //******方法
 func saveTaskMongo(id string, rdata map[string]interface{}) (rid string, rep bool) {
@@ -113,4 +227,4 @@ func saveTaskMongo(id string, rdata map[string]interface{}) (rid string, rep boo
 		rep = Mgo.Update("taskinfo", query, bson.M{"$set": rdata}, false, false)
 	}
 	return
-}
+}

+ 0 - 0
src/tagging/src/config.json → src/tagservice/src/config.json


+ 19 - 10
src/tagging/src/data.go → src/tagservice/src/data.go

@@ -39,14 +39,16 @@ type Rule struct {
 
 //关键词类型
 type KeyWord struct {
-	KeyReg    []*regexp.Regexp
-	MatchType []string //关键词的匹配方式
+	KeyReg     []*regexp.Regexp
+	MatchType  []string     //关键词的匹配方式
+	KeyWordMap map[int]bool //记录KeyReg中字母规则
 }
 
 //附加词类型
 type AddWord struct {
-	KeyReg    []*regexp.Regexp
-	MatchType []string //关键词的匹配方式
+	KeyReg     []*regexp.Regexp
+	MatchType  []string     //附加词的匹配方式
+	AddWordMap map[int]bool //记录KeyReg中字母规则
 }
 
 func InitTags() {
@@ -90,19 +92,25 @@ func InitTags() {
 		aw_commaArr := strings.Split(addword, ",")
 		for _, comma := range aw_commaArr {
 			aw := &AddWord{}
+			aw.AddWordMap = make(map[int]bool)
 			aw.MatchType = awmArr
 			aw_addArr := strings.Split(comma, "&&")
 			if len(aw_addArr) == 1 { //,
 				tmp_aw := aw_addArr[0]
 				if tmp_aw != "" {
 					if LetterCase.MatchString(tmp_aw) {
-						tmp_aw = strings.ToUpper(tmp_aw)
+						tmp_aw = strings.ToUpper(tmp_aw) //附加词中有英文全部转为大写
+						aw.AddWordMap[len(aw.KeyReg)] = true
 					}
 					aw.KeyReg = append(aw.KeyReg, regexp.MustCompile(tmp_aw))
 				}
 			} else { //&&
 				for _, and := range aw_addArr {
 					if and != "" {
+						if LetterCase.MatchString(and) {
+							and = strings.ToUpper(and) //附加词中有英文全部转为大写
+							aw.AddWordMap[len(aw.KeyReg)] = true
+						}
 						aw.KeyReg = append(aw.KeyReg, regexp.MustCompile(and))
 					}
 				}
@@ -125,6 +133,7 @@ func InitTags() {
 		kw_commaArr := strings.Split(keyword, ",")
 		for _, comma := range kw_commaArr {
 			kw := &KeyWord{}
+			kw.KeyWordMap = make(map[int]bool)
 			kw.MatchType = kwmArr
 			kw_addArr := strings.Split(comma, "&&")
 			if len(kw_addArr) == 1 { //,
@@ -132,6 +141,7 @@ func InitTags() {
 				if tmp_kw != "" {
 					if LetterCase.MatchString(tmp_kw) {
 						tmp_kw = strings.ToUpper(tmp_kw)
+						kw.KeyWordMap[len(kw.KeyReg)] = true
 					}
 					kw.KeyReg = append(kw.KeyReg, regexp.MustCompile(tmp_kw))
 				}
@@ -139,9 +149,8 @@ func InitTags() {
 				for _, and := range kw_addArr {
 					if and != "" {
 						if LetterCase.MatchString(and) {
-							qu.Debug(and)
 							and = strings.ToUpper(and)
-							qu.Debug(and)
+							kw.KeyWordMap[len(kw.KeyReg)] = true
 						}
 						kw.KeyReg = append(kw.KeyReg, regexp.MustCompile(and))
 					}
@@ -161,7 +170,7 @@ func InitTags() {
 			}
 		}
 	}
-	// for i, r := range Rules {
-	// 	qu.Debug(i, r.TagName, r.KW.KeyReg, len(r.KW.KeyReg), r.KW.MatchType, len(r.KW.MatchType), r.AW.KeyReg, len(r.AW.KeyReg), r.AW.MatchType, len(r.AW.MatchType))
-	// }
+	for i, r := range Rules {
+		qu.Debug(i, r.TagName, r.KW.KeyReg, len(r.KW.KeyReg), r.KW.MatchType, len(r.KW.MatchType), r.KW.KeyWordMap, "---", r.AW.KeyReg, len(r.AW.KeyReg), r.AW.MatchType, len(r.AW.MatchType), r.AW.AddWordMap)
+	}
 }

+ 15 - 6
src/tagging/src/main.go → src/tagservice/src/main.go

@@ -3,11 +3,11 @@ package main
 
 import (
 	"encoding/json"
-	"errors"
 	"log"
 	mongo "qfw/mongodb"
 	qu "qfw/util"
 	"qfw/util/elastic"
+	"regexp"
 	"strings"
 	"sync"
 	"sync/atomic"
@@ -29,9 +29,10 @@ var (
 	sp                    chan bool
 )
 var lock *sync.Mutex
-var EOS = errors.New("EOS")
 
-var updatelock *sync.Mutex = new(sync.Mutex)                  //保存锁
+//var EOS = errors.New("EOS")
+//var updatelock *sync.Mutex = new(sync.Mutex)                  //保存锁
+var FilteReg = regexp.MustCompile("[()(){}-]*")
 var UpdateCache = make(chan map[string]string, 500)           //更新集合
 var UpdataMgoCache = make(chan []map[string]interface{}, 500) //更新集合
 
@@ -109,7 +110,7 @@ func main() {
 						L:
 							for _, kwm := range r.KW.MatchType {
 								if text := qu.ObjToString(tmp[kwm]); text != "" {
-									text = strings.ToUpper(text) //文本中的英文全转为大写
+									text = ProcessData(text) //过滤数据
 									for _, kw_reg := range r.KW.KeyReg {
 										if kw_reg.MatchString(text) { //关键词匹配成功
 											//关键词匹配成功后,匹配附加词
@@ -171,6 +172,12 @@ func main() {
 	<-w
 }
 
+func ProcessData(text string) string {
+	text = strings.ToUpper(text)               //文本中的英文全转为大写
+	text = FilteReg.ReplaceAllString(text, "") //去除一些特殊符号
+	return text
+}
+
 //更新es
 func TimeUpdate() {
 	log.Println("Save...")
@@ -293,6 +300,7 @@ func main_es_one() {
 						L:
 							for _, kwm := range r.KW.MatchType {
 								if text := qu.ObjToString(tmp[kwm]); text != "" {
+									text = ProcessData(text)
 									for _, kw_reg := range r.KW.KeyReg {
 										if kw_reg.MatchString(text) { //关键词匹配成功
 											kwMatch = true
@@ -372,6 +380,7 @@ func main_mongo_one() {
 			L:
 				for _, kwm := range r.KW.MatchType {
 					if text := qu.ObjToString(tmp[kwm]); text != "" {
+						text = ProcessData(text)
 						for _, kw_reg := range r.KW.KeyReg {
 							if kw_reg.MatchString(text) { //关键词匹配成功
 								//qu.Debug(kwm, kw_reg)
@@ -464,7 +473,7 @@ func main_mongo_many() {
 			L:
 				for _, kwm := range r.KW.MatchType {
 					if text := qu.ObjToString(tmp[kwm]); text != "" {
-						text = strings.ToUpper(text) //文本中的英文全转为大写
+						text = ProcessData(text)
 						for _, kw_reg := range r.KW.KeyReg {
 							if kw_reg.MatchString(text) { //关键词匹配成功
 								//qu.Debug(kwm, kw_reg)
@@ -567,7 +576,7 @@ func main_mongo_matchrecords() {
 				//L:
 				for _, kwm := range r.KW.MatchType {
 					if text := qu.ObjToString(tmp[kwm]); text != "" {
-						text = strings.ToUpper(text) //文本中的英文全转为大写
+						text = ProcessData(text)
 						for _, kw_reg := range r.KW.KeyReg {
 							if kw_reg.MatchString(text) { //关键词匹配成功
 								if len(r.AW.KeyReg) == 0 { //无附加词

+ 0 - 0
src/tagging/src/main.go1 → src/tagservice/src/main.go1


+ 0 - 0
src/tagging/src/tag.xlsx → src/tagservice/src/tag.xlsx


+ 71 - 0
src/udptask/udptask.go

@@ -0,0 +1,71 @@
+package udptask
+
+import (
+	"encoding/json"
+	"log"
+	mu "mfw/util"
+	"net"
+	qu "qfw/util"
+	"util"
+
+	"gopkg.in/mgo.v2/bson"
+)
+
+var (
+	Udpclient mu.UdpClient //udp对象
+	IsTaskOK  bool
+	Timeout   = 3
+)
+
+func InitUdp() {
+	updport := util.Sysconfig["udpport"].(string)
+	Udpclient = mu.UdpClient{Local: updport, BufSize: 1024}
+	log.Println("Udp服务监听", updport)
+	Udpclient.Listen(processUdpMsg)
+}
+
+func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
+	switch act {
+	case mu.OP_TYPE_DATA:
+		var rep map[string]interface{}
+		err := json.Unmarshal(data, &rep)
+		if err != nil { //测试接收
+
+			go Udpclient.WriteUdp([]byte{}, mu.OP_NOOP, ra) //回应上一个节点
+		} else {
+			by, _ := json.Marshal(map[string]interface{}{
+				"taskid": rep["taskid"],
+				"stype":  rep["stype"],
+			})
+			go Udpclient.WriteUdp(by, mu.OP_NOOP, ra) //回应上一个节点
+
+		}
+	case mu.OP_NOOP: //下个节点回应
+		log.Println("接收回应:", string(data))
+		var rep map[string]interface{}
+		err := json.Unmarshal(data, &rep)
+		if err != nil { //空数据
+			//
+		} else { //正确
+			if qu.ObjToString(rep["stype"]) == "startTask" {
+				updateMgoIsuse("1", qu.ObjToString(rep["taskid"]))
+			} else if rep["stype"] == "stopTask" {
+				updateMgoIsuse("0", qu.ObjToString(rep["taskid"]))
+			} else {
+
+			}
+		}
+	}
+
+}
+
+func updateMgoIsuse(isu string, id string) {
+	set := bson.M{
+		"$set": bson.M{
+			"s_isuse": isu,
+		},
+	}
+	log.Println(id)
+	util.Mgo.UpdateById("taskinfo", id, set)
+	IsTaskOK = true
+}

+ 19 - 0
src/util/config.go

@@ -9,11 +9,13 @@ import (
 var (
 	Sysconfig       map[string]interface{} //配置文件
 	Mgo             *mongodb.MongodbSim
+	JYMgo			*mongodb.MongodbSim
 	MgoEn           *mongodb.MongodbSim
 	EsIndex, EsType string
 	MgoEnC          string
 	Subday          float64
 	PreviewHref     string //数据预览地址
+	JyCollName		string
 )
 
 var (
@@ -39,6 +41,9 @@ func InitMgoPool() {
 	}
 	Mgo.InitPool()
 }
+
+
+
 func initMgoEn() {
 	MgoEn = &mongodb.MongodbSim{
 		MongodbAddr: qu.ObjToString(Sysconfig["mgodben"]),
@@ -49,6 +54,17 @@ func initMgoEn() {
 	MgoEn.InitPool()
 }
 
+func initJYMgo()  {
+	JYMgo = &mongodb.MongodbSim{
+		MongodbAddr: qu.ObjToString(Sysconfig["mgodben"]),
+		Size:        qu.IntAll(Sysconfig["dbsize"]),
+		DbName:      qu.ObjToString(Sysconfig["jydbname"]),
+	}
+	JyCollName = qu.ObjToString(Sysconfig["jycollname"])
+	JYMgo.InitPool()
+
+}
+
 func InitOther() {
 	initCitys()
 	initInfoType()
@@ -59,11 +75,14 @@ func InitOther() {
 	initTaskType()
 	initEs()
 	initMgoEn()
+	initJYMgo()
 	Subday = qu.Float64All(Sysconfig["subday"])
 	PreviewHref = qu.ObjToString(Sysconfig["preview_href"])
 	initTagField()
 }
 
+
+
 func initCitys() {
 	//map初始化
 	if ProvinceCitys == nil {

+ 313 - 0
src/util/task.go

@@ -0,0 +1,313 @@
+package util
+
+import (
+	"log"
+	mongo "qfw/mongodb"
+	qu "qfw/util"
+	"qfw/util/elastic"
+	"regexp"
+	"strings"
+	"time"
+)
+
+//匹配方式map
+var task_export_matchtype = map[string]interface{}{
+	"1": "title",
+	"2": "detail",
+	"3": "purchasing",
+	"4": "filetext",
+	"5": "projectname",
+	"6": "buyer",
+	"7": "s_winner",
+}
+var LetterCase = regexp.MustCompile("[A-Za-z]")
+
+//任务模型
+type Task struct {
+	//任务信息
+	Id      string      //任务id
+	StartId string      //起始id
+	From    string      //数据出处(es mongodb)
+	To      string      //数据更新去处(es mongodb)
+	Index   string      //es index
+	Itype   string      //es type
+	MgoColl string      //mgo coll
+	Rules   []*Tag_Rule //任务相关规则(对数据打标签)
+	IsRun   bool        //是否运行
+	//存储相关
+	Mgo            *mongo.MongodbSim             //mgo
+	Es             *elastic.Elastic              //es
+	EsUpdateCache  chan map[string]string        //es更新集合
+	MgoUpdataCache chan []map[string]interface{} //mgo更新集合
+	SP             chan bool                     //批量更新时的线程控制
+
+}
+
+//规则
+type Tag_Rule struct {
+	KW      *KeyWord
+	AW      *AddWord
+	TagName string
+}
+
+//关键词类型
+type KeyWord struct {
+	KeyReg     []*regexp.Regexp
+	MatchType  []string     //关键词的匹配方式
+	KeyWordMap map[int]bool //记录KeyReg中字母规则
+}
+
+//附加词类型
+type AddWord struct {
+	KeyReg     []*regexp.Regexp
+	MatchType  []string     //附加词的匹配方式
+	AddWordMap map[int]bool //记录KeyReg中字母规则
+}
+
+//更新es
+func (t *Task) UpdateEs() {
+	log.Println("Es Save...")
+	arru := make([]map[string]string, 200)
+	indexu := 0
+	for {
+		select {
+		case v := <-t.EsUpdateCache:
+			arru[indexu] = v
+			indexu++
+			if indexu == 200 {
+				t.SP <- true
+				go func(arru []map[string]string) {
+					defer func() {
+						<-t.SP
+					}()
+					elastic.BulkUpdateArr(t.Index, t.Itype, arru)
+				}(arru)
+				arru = make([]map[string]string, 200)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				t.SP <- true
+				go func(arru []map[string]string) {
+					defer func() {
+						<-t.SP
+					}()
+					elastic.BulkUpdateArr(t.Index, t.Itype, arru)
+				}(arru[:indexu])
+				arru = make([]map[string]string, 200)
+				indexu = 0
+			}
+		}
+	}
+}
+
+//更新mongo
+func (t *Task) UpdateMgo() {
+	log.Println("Mgo Save...")
+	arru := make([][]map[string]interface{}, 200)
+	indexu := 0
+	for {
+		select {
+		case v := <-t.MgoUpdataCache:
+			arru[indexu] = v
+			indexu++
+			if indexu == 200 {
+				t.SP <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-t.SP
+					}()
+					t.Mgo.UpdateBulk(t.MgoColl, arru...)
+				}(arru)
+				arru = make([][]map[string]interface{}, 200)
+				indexu = 0
+			}
+		case <-time.After(1000 * time.Millisecond):
+			if indexu > 0 {
+				t.SP <- true
+				go func(arru [][]map[string]interface{}) {
+					defer func() {
+						<-t.SP
+					}()
+					t.Mgo.UpdateBulk(t.MgoColl, arru...)
+				}(arru[:indexu])
+				arru = make([][]map[string]interface{}, 200)
+				indexu = 0
+			}
+		}
+	}
+}
+
+//初始化任务信息
+func InitTask(taskid string) {
+	t := &Task{}
+	data, _ := Mgo.FindById("taskinfo", taskid, nil)
+	t.Id = taskid
+	t.StartId = qu.ObjToString((*data)["s_startid"])
+	from := qu.ObjToString((*data)["s_fromtype"])
+	t.From = from
+	to := qu.ObjToString((*data)["s_totype"])
+	t.To = to
+	if from == to { //同库
+		url := qu.ObjToString((*data)["s_fromdburl"])
+		dbname := qu.ObjToString((*data)["s_fromdbname"])
+		coll := qu.ObjToString((*data)["s_fromdbcoll"])
+		if from == "es" { //es
+			t.InitEs(url, dbname, coll)
+		} else { //mgo
+			t.InitMgo(url, dbname, coll)
+		}
+	} else { //异库
+		fromdburl := qu.ObjToString((*data)["s_fromdburl"])
+		fromdbname := qu.ObjToString((*data)["s_fromdbname"])
+		fromdbcoll := qu.ObjToString((*data)["s_fromdbcoll"])
+		todburl := qu.ObjToString((*data)["s_todburl"])
+		todbname := qu.ObjToString((*data)["s_todbname"])
+		todbcoll := qu.ObjToString((*data)["s_todbcoll"])
+		if from == "es" {
+			t.InitEs(fromdburl, fromdbname, fromdbcoll)
+			t.InitMgo(todburl, todbname, todbcoll)
+		} else {
+			t.InitMgo(fromdburl, fromdbname, fromdbcoll)
+			t.InitEs(todburl, todbname, todbcoll)
+		}
+	}
+	t.EsUpdateCache = make(chan map[string]string, 500)
+	t.MgoUpdataCache = make(chan []map[string]interface{}, 500)
+	t.SP = make(chan bool, 5)
+	t.InitRules(qu.ObjToString((*data)["s_tasktype"])) //rules
+}
+
+//初始化Rules
+func (t *Task) InitRules(tasktype string) {
+	query := map[string]interface{}{
+		"i_isuse":    1, //启用状态
+		"s_tasktype": tasktype,
+		"b_delete":   false,
+	}
+	list, _ := Mgo.Find("tagrule", query, nil, `{"o_list":1,"s_tagname":1}`, false, -1, -1)
+	for _, l := range *list {
+		tagname := qu.ObjToString(l["s_tagname"])
+		o_list := l["o_list"].([]interface{})
+		for _, o := range o_list {
+			o_map := o.(map[string]interface{})
+			//附加词匹配方式
+			awm := qu.ObjToString(o_map["s_addkeymatch"])
+			awmArr := []string{}
+			for _, av := range strings.Split(awm, ",") {
+				if field := qu.ObjToString(task_export_matchtype[av]); field != "" {
+					awmArr = append(awmArr, field)
+				}
+			}
+			//附加词
+			tmp_aw := []*AddWord{}
+			addword := qu.ObjToString(o_map["s_addkey"])
+			aw_commaArr := strings.Split(addword, ",")
+			for _, comma := range aw_commaArr {
+				aw := &AddWord{}
+				aw.AddWordMap = make(map[int]bool)
+				aw.MatchType = awmArr
+				aw_addArr := strings.Split(comma, "&&")
+				if len(aw_addArr) == 1 { //,
+					tmp_aw := aw_addArr[0]
+					if tmp_aw != "" {
+						if LetterCase.MatchString(tmp_aw) { //判断附加词中是否有英文
+							tmp_aw = strings.ToUpper(tmp_aw) //附加词中有英文全部转为大写
+							aw.AddWordMap[len(aw.KeyReg)] = true
+						}
+						aw.KeyReg = append(aw.KeyReg, regexp.MustCompile(tmp_aw))
+					}
+				} else { //&&
+					for _, and := range aw_addArr {
+						if and != "" {
+							if LetterCase.MatchString(and) { //判断附加词中是否有英文
+								and = strings.ToUpper(and) //附加词中有英文全部转为大写
+								aw.AddWordMap[len(aw.KeyReg)] = true
+							}
+							aw.KeyReg = append(aw.KeyReg, regexp.MustCompile(and))
+						}
+					}
+				}
+				tmp_aw = append(tmp_aw, aw)
+			}
+			//关键词匹配方式
+			kwm := qu.ObjToString(o_map["s_keymatch"])
+			kwmArr := []string{}
+			for _, kv := range strings.Split(kwm, ",") {
+				if field := qu.ObjToString(task_export_matchtype[kv]); field != "" {
+					kwmArr = append(kwmArr, field)
+				}
+			}
+			//关键词
+			tmp_kw := []*KeyWord{}
+			keyword := qu.ObjToString(o_map["s_matchkey"])
+			kw_commaArr := strings.Split(keyword, ",")
+			for _, comma := range kw_commaArr {
+				kw := &KeyWord{}
+				kw.KeyWordMap = make(map[int]bool)
+				kw.MatchType = kwmArr
+				kw_addArr := strings.Split(comma, "&&")
+				if len(kw_addArr) == 1 { //,
+					tmp_kw := kw_addArr[0]
+					if tmp_kw != "" {
+						if LetterCase.MatchString(tmp_kw) {
+							tmp_kw = strings.ToUpper(tmp_kw)
+							kw.KeyWordMap[len(kw.KeyReg)] = true
+						}
+						kw.KeyReg = append(kw.KeyReg, regexp.MustCompile(tmp_kw))
+					}
+				} else { //&&
+					for _, and := range kw_addArr {
+						if and != "" {
+							if LetterCase.MatchString(and) {
+								and = strings.ToUpper(and)
+								kw.KeyWordMap[len(kw.KeyReg)] = true
+							}
+							kw.KeyReg = append(kw.KeyReg, regexp.MustCompile(and))
+						}
+					}
+				}
+				tmp_kw = append(tmp_kw, kw)
+			}
+
+			//组合
+			for _, tk := range tmp_kw {
+				for _, aw := range tmp_aw {
+					rule := &Tag_Rule{}
+					rule.KW = tk
+					rule.AW = aw
+					rule.TagName = tagname
+					t.Rules = append(t.Rules, rule)
+				}
+			}
+
+		}
+	}
+
+	// for i, r := range t.Rules {
+	// 	qu.Debug(i, r.TagName, r.KW.KeyReg, len(r.KW.KeyReg), r.KW.MatchType, len(r.KW.MatchType), r.KW.KeyWordMap, "---", r.AW.KeyReg, len(r.AW.KeyReg), r.AW.MatchType, len(r.AW.MatchType), r.AW.AddWordMap)
+	// }
+	// qu.Debug(t.Id, t.From, t.To, t.StartId)
+}
+
+//初始化mgo
+func (t *Task) InitMgo(url, dbname, coll string) {
+	t.Mgo = &mongo.MongodbSim{
+		MongodbAddr: url,
+		Size:        10,
+		DbName:      dbname,
+	}
+	t.Mgo.InitPool()
+	t.MgoColl = coll
+}
+
+//初始化es
+func (t *Task) InitEs(url, dbname, coll string) {
+	t.Es = &elastic.Elastic{
+		S_esurl: url,
+		I_size:  15,
+	}
+	t.Es.InitElasticSize()
+	t.Index = dbname
+	t.Itype = coll
+}

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

@@ -93,7 +93,7 @@ function login(){
 		data:{"email":email,"pwd":pwd},
 		success:function(r){
 			if(r.checked){
-				window.location.href="/service/rule/list"
+				window.location.href="/service/task/list"
 			}else{
 				alert("fail");
 			}

+ 106 - 0
src/web/templates/repair/jianyu_edit.html

@@ -0,0 +1,106 @@
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+{{include "com/modal.html"}}
+
+<style>
+    /* 方法1:设置textarea合适的宽高 */
+    #jsonTextarea {
+        float: left;
+        margin-right: 20px;
+        width: 40%;
+        height: 70vh;
+        outline: none;
+        padding: 5px;
+    }
+
+    /* 方法2:自定义高亮样式 */
+    #jsonPre {
+        float: left;
+        width: 40%;
+        height: 70vh;
+        outline: 1px solid #ccc;
+        padding: 5px;
+        overflow: scroll;
+    }
+</style>
+
+{{/*<script src="/time/js/angular.min.js"></script>*/}}
+{{/*<script src="/time/js/wui-date.js"></script>*/}}
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>维护数据</h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
+            <li><a href="/service/jianyu/repair">维护中心</a></li>
+            <li><a href="#">修复数据</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="nav-tabs-custom">
+            <ul class="nav nav-tabs edit-step">
+                </br>
+                <button class="btn btn-primary btn-sm" style="float: right;margin-top: 7px;margin-right: 10px" onclick="saveRepair()"><i class="fa fa-fw fa-file-text fa-lg"></i>更新数据</button>
+                </br></br></br>
+            </ul>
+            <form class="form-horizontal">
+                <div class="box-body">
+                    <textarea id="jsonTextarea"></textarea>
+                </div>
+            </form>
+        </div>
+    </section>
+</div>
+
+{{include "com/dialog.html"}}
+{{include "com/footer.html"}}
+<script>
+    menuActive("/service/jianyu/repair");
+    var edit_data = {{.T.data}};
+    var curID = {{.T.id}};
+
+
+    function parse(str) {
+        return JSON.stringify(str, null, "\t")
+    }
+    $('#jsonTextarea').val(parse(edit_data));
+
+
+
+    //更新
+    function saveRepair() {
+        var curData = document.getElementById('jsonTextarea').value;
+        var data = JSON.parse(curData)
+        var updata = {}
+        for (var k in data) {
+            updata[k] = data[k]
+            if (k=="detail") {
+
+            }
+        }
+        $.ajax({
+            url: "/service/jianyu/save",
+            type: 'POST',
+            data: {"data":JSON.stringify(updata)},
+            success: function (task) {
+                if (task.rep) {
+                    window.location.href="/service/jianyu/repair"
+                } else {
+                    showTip("更新失败,请稍后在试");
+                }
+            }
+        })
+    }
+
+
+
+
+
+
+
+
+
+</script>

+ 196 - 10
src/web/templates/repair/jianyu_repair.html

@@ -1,10 +1,196 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+{{include "com/modal.html"}}
+
+<style>
+    .j-input__inner {
+        box-sizing: border-box;
+        display: inline-block;
+        padding: 0px 45px 0px 15px;
+        width: 300px;
+        height: 40px;
+        color: #1D1D1D;
+
+        background-color: #fff;
+        background-image: none;
+        line-height: 40px;
+        font-size: inherit;
+        -webkit-appearance: none;
+        outline: none;
+        border: 1px solid #dcdfe6;
+        border-radius: 4px;
+        transition: border-color 0.2s cubic-bezier(0.645, 0.045, 0.355, 1);
+    }
+    .j-input__inner:hover {
+        border-color: #c0c4cc;
+    }
+    .j-input__inner:focus {
+        border-color: #409eff;
+    }
+    .search-icon {
+        position:relative;
+        width: 30px;
+        height: 30px;
+        top: 0px;
+        right: 40px;
+    }
+</style>
+
+<div class="content-wrapper" id="showbtn">
+    <section class="content-header">
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
+            <li><a href="/service/jianyu/repair"> 维护中心</a></li>
+        </ol>
+
+        <br/>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <div class="tab-content">
+                            <input class="j-input__inner" type="text" placeholder="请输入查询的id" id="idSea">
+                            <img src="" class="search-icon" onclick="idSearch()" />
+                            <input class="j-input__inner" type="text" placeholder="请输入查询的href" id="hrefSea">
+                            <img src="" class="search-icon" onclick="hrefSearch()" />
+                        </div>
+
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <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("/jianyu/repair");
+    $(document).ready(function () {
+        ttable = $('#dataTable').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": false,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "serverSide": false,
+            "language": {
+                "url": "/dist/js/dataTables.chinese.lang"
+            },
+            "fnDrawCallback": function () {
+                $("ul.pagination").prepend("&nbsp;&nbsp;&nbsp;转到第 <input type='text' id='changePage'   style='width:20px;'> 页    <a type='text' href='javascript:void(0);' id='dataTable-btn' style='text-align:center'>GO</a>");
+                $('#dataTable-btn').click(function (e) {
+                    var redirectpage = 0
+                    if ($("#changePage").val() && $("#changePage").val() > 0) {
+                        var redirectpage = $("#changePage").val() - 1;
+                    }
+                    ttable.page(redirectpage).draw(false);
+                });
+                this.api().column(0).nodes().each(function(cell, i) {
+                    cell.innerHTML = i + 1;
+                });
+            },
+            "columns": [
+                {"data": null,width:"8%"},
+                {"data": "title"},
+                {"data": "href",width:"20%"},
+                {"data": "publishtime",width:"20%", render: function (val) {
+                        var dt = new Date()
+                        dt.setTime(parseInt(val) * 1000);
+                        return dt.format("yyyy-MM-dd hh-mm-ss")
+                    }},
+                {"data": "_id", width:"15%",render: function (val, a, row, pos) {
+                        tmp = '<div>' +
+                            '<a class="btn btn-sm btn-primary" href="/service/jianyu/edit?id='+val+'">编辑</a>'+
+                            '&nbsp'+'&nbsp'+
+                            '<a class="btn btn-sm btn-danger" onclick="del_repair(\''+val+'\')">删除</a>'+
+                            '</div>';
+                        return tmp
+                    }}
+            ]
+        });
+    });
+
+
+    function idSearch() {
+        var search_name = $('#idSea').val()
+        $.ajax({
+            url:"/service/jianyu/searchID",
+            type:"post",
+            data:{"_id": search_name},
+            success:function(r){
+                if (r.rep) {
+                    $('#dataTable').dataTable().fnClearTable();
+                    $('#dataTable').dataTable().fnAddData(r.data);
+                }else {
+                    showTip(r.msg)
+                }
+            }
+        })
+    }
+    function hrefSearch() {
+        var search_name = $('#hrefSea').val()
+        $.ajax({
+            url:"/service/jianyu/searchHref",
+            type:"post",
+            data:{"href": search_name},
+            success:function(r){
+                if (r.rep) {
+                    $('#dataTable').dataTable().fnClearTable();
+                    $('#dataTable').dataTable().fnAddData(r.data);
+                }else {
+                    showTip("请输入正确的href")
+                }
+            }
+        })
+    }
+
+
+
+
+
+
+
+    function del_repair(del_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/service/jianyu/delete",
+                type:"post",
+                data:{"_id": del_id},
+                success:function(r){
+                    if(r.rep){
+                        $('#dataTable').dataTable().fnClearTable();
+                    }else{
+                        alert("删除失败");
+                    }
+                }
+            })
+        });
+    }
+
+
+
+
+
+
+</script>

+ 23 - 30
src/web/templates/task/task_create.html

@@ -43,7 +43,7 @@
                                     if ($(this).val() == 0) {
                                         dict["s_tasktype"] = ""
                                     }else {
-                                        dict["s_tasktype"] = codeType[index]["name"]
+                                        dict["s_tasktype"] = codeType[index]["code"]
                                     }
 
                                 })
@@ -52,6 +52,20 @@
                         </div>
 
                     </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>udp地址</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="udpaddr" placeholder="请输入地址" required>
+                        </div>
+
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>udp端口</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="udport" placeholder="请输入端口" required>
+                        </div>
+                    </div>
+
+
                     <div class="form-group">
                         <label class="col-sm-2 control-label"><span style="color:red;">* </span>起始id</label>
                         <div class="col-sm-3">
@@ -88,9 +102,9 @@
                     </div>
 
                     <div class="form-group">
-                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>from数据库</label>
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>from数据库/index</label>
                         <div class="col-sm-3">
-                            <input type="text" class="form-control" id="fromdbname" placeholder="请输入数据库名"
+                            <input type="text" class="form-control" id="fromdbname" placeholder="请输入数据库名/index"
                                    value="">
                         </div>
                         <label class="col-sm-2 control-label"><span style="color:red;">* </span>from表</label>
@@ -153,6 +167,8 @@
     var codeType = {{.T.taskType}};
     var dict = {
         "id":"",
+        "s_udpaddr":"",
+        "s_udport":"",
         "s_taskname": "",
         "s_isuse": "0",
         "s_tasktype": "",
@@ -185,37 +201,12 @@
 
     }
 
-
-
-
-
-
-    // dict["s_tagname"] = $('#tagname').val();
-    // dict["s_salesperson"] = $('#salename').val();
-    // dict["s_serverperson"] = $("#serverperson").val();
-    // dict["s_customername"] = $("#customername").val();
-    // dict["s_globaladdkey"] = $('#g_addkey').val();
-    // dict["s_globalnotkey"] = $('#g_notkey').val();
-
-
-    // if ($('#starttime').find("input").val() != "") {
-    //     var start = $('#starttime').find("input").val();
-    //     start = new Date(start).getTime() / 1000;
-    //     dataMap["i_starttime"] = start;
-    // }
-    // if ($('#endtime').find("input").val() != "") {
-    //     var end = $('#endtime').find("input").val();
-    //     end = new Date(end).getTime() / 1000;
-    //     dataMap["i_endtime"] = end;s
-    // }
-
-
-    //
     function checkDict(data)  {
         if (data["s_taskname"]==""||data["s_tasktype"]==""||data["s_startid"]==""||
             data["s_fromdburl"]==""||data["s_fromdbname"]==""|| data["s_fromdbcoll"]==""||
             data["s_fromtype"]==""|| data["s_todburl"]==""||data["s_todbname"]==""||
-            data["s_todbcoll"]==""|| data["s_totype"]=="") {
+            data["s_todbcoll"]==""|| data["s_totype"]==""|| data["s_udpaddr"]=="" ||
+            data["s_udport"]=="") {
             return true
         }
         return false
@@ -229,6 +220,8 @@
         dict["s_todburl"] = $('#todburl').val();
         dict["s_todbname"] = $('#todbname').val();
         dict["s_todbcoll"] = $("#todbcoll").val();
+        dict["s_udpaddr"] = $('#udpaddr').val();
+        dict["s_udport"] = $("#udport").val();
 
 
         if (checkDict(dict)) {

+ 274 - 10
src/web/templates/task/task_edit.html

@@ -1,10 +1,274 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
+{{include "com/inc.html"}}
+<!-- Main Header -->
+{{include "com/header.html"}}
+<!-- Left side column. 权限菜单 -->
+{{include "com/menu.html"}}
+{{include "com/modal.html"}}
+<script src="/time/js/angular.min.js"></script>
+<script src="/time/js/wui-date.js"></script>
+<div class="content-wrapper">
+    <section class="content-header">
+        <h1>编辑任务</h1>
+        <ol class="breadcrumb">
+            <li><a href="#"><i class="fa fa-dashboard"></i> 首页</a></li>
+            <li><a href="/service/rule/list">任务列表</a></li>
+            <li><a href="#">编辑任务</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="nav-tabs-custom">
+            <ul class="nav nav-tabs edit-step">
+                </br>
+                <button class="btn btn-primary btn-sm" style="float: right;margin-top: 7px;margin-right: 10px" onclick="saveTask()"><i class="fa fa-fw fa-file-text fa-lg"></i>更新任务</button>
+                </br></br></br>
+            </ul>
+            <form class="form-horizontal">
+                {{/*<div class="box box-primary">*/}}
+                <div class="box-body">
+                    {{/*第一组*/}}
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>任务名称</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="taskname" placeholder="请输入任务名称" required>
+                        </div>
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>任务类型</label>
+                        <div class="col-sm-3">
+                            <select class="form-control selectpicker" id="taskTypeSelect">
+                            </select>
+                            <script>
+                                $('#taskTypeSelect').on('hide.bs.select', function () {
+                                    var num = $(this).val()
+                                    var index = Number(num)-Number(1)
+                                    if ($(this).val() == 0) {
+                                        dict["s_tasktype"] = ""
+                                    }else {
+                                        dict["s_tasktype"] = codeType[index]["code"]
+                                    }
+
+                                })
+                            </script>
+
+                        </div>
+
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>udp地址</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="udpaddr" placeholder="请输入地址" required>
+                        </div>
+
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>udp端口</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="udport" placeholder="请输入端口" required>
+                        </div>
+                    </div>
+
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>起始id</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="startid" placeholder="请输入起始id" required>
+                        </div>
+                    </div>
+                    <hr>
+                    {{/*第二组*/}}
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>from方式类型</label>
+                        <div class="col-sm-3">
+                            <select class="form-control selectpicker" id="fromTypeSelect">
+                                <option selected:disabled style="diaplay:none" value=0>请选择</option>
+                                <option value=1>es</option>
+                                <option value=2>mongodb</option>
+                            </select>
+                            <script>
+                                $('#fromTypeSelect').on('changed.bs.select', function () {
+                                    if ($(this).val() == 0) {
+                                        dict["s_fromtype"] = ""
+                                    }else if ($(this).val() == 1) {
+                                        dict["s_fromtype"] = "es"
+                                    } else if ($(this).val() == 2) {
+                                        dict["s_fromtype"] = "mongodb"
+                                    }
+                                })
+                            </script>
+                        </div>
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>from地址</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="fromdburl" placeholder="请输入地址"
+                                   value="">
+                        </div>
+                    </div>
+
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>from数据库/index</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="fromdbname" placeholder="请输入数据库名/index"
+                                   value="">
+                        </div>
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>from表</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="fromdbcoll" placeholder="请输入表名"
+                                   value="" required>
+                        </div>
+                    </div>
+                    <hr>
+                    {{/*第三组*/}}
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>to方式类型</label>
+                        <div class="col-sm-3">
+                            <select class="form-control selectpicker" id="toTypeSelect">
+                                <option selected:disabled style="diaplay:none" value=0>请选择</option>
+                                <option value=1>es</option>
+                                <option value=2>mongodb</option>
+                            </select>
+                            <script>
+                                $('#toTypeSelect').on('changed.bs.select', function () {
+                                    if ($(this).val() == 0) {
+                                        dict["s_totype"] = ""
+                                    }else if ($(this).val() == 1) {
+                                        dict["s_totype"] = "es"
+                                    } else if ($(this).val() == 2) {
+                                        dict["s_totype"] = "mongodb"
+                                    }
+                                })
+                            </script>
+                        </div>
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>to地址</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="todburl" placeholder="请输入地址"
+                                   value="">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>to数据库</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="todbname" placeholder="请输入数据库名"
+                                   value="">
+                        </div>
+                        <label class="col-sm-2 control-label"><span style="color:red;">* </span>to表</label>
+                        <div class="col-sm-3">
+                            <input type="text" class="form-control" id="todbcoll" placeholder="请输入表明"
+                                   value="" required>
+                        </div>
+                    </div>
+                </div>
+
+            </form>
+        </div>
+    </section>
+</div>
+
+{{include "com/dialog.html"}}
+{{include "com/footer.html"}}
+<script>
+    menuActive("/service/task/list");
+    var codeType = {{.T.taskType}};
+    var edit_data = {{.T.data}};
+    var dict = {
+        "id":edit_data["_id"],
+        "s_taskname": edit_data["s_taskname"],
+        "s_isuse": edit_data["s_isuse"],
+        "s_tasktype": edit_data["s_tasktype"],
+        "s_startid":edit_data["s_startid"],
+        "s_fromtype": edit_data["s_fromtype"],
+        "s_fromdburl": edit_data["s_fromdburl"],
+        "s_fromdbname": edit_data["s_fromdbname"],
+        "s_fromdbcoll": edit_data["s_fromdbcoll"],
+        "s_totype": edit_data["s_totype"],
+        "s_todburl": edit_data["s_todburl"],
+        "s_todbname": edit_data["s_todbname"],
+        "s_todbcoll": edit_data["s_todbcoll"],
+        "i_createtime": edit_data["i_createtime"],
+        "s_createuser": edit_data["s_createuser"],
+        "i_updatetime": edit_data["i_updatetime"],
+        "s_updateuser": edit_data["s_updateuser"],
+        "s_udport": edit_data["s_udport"],
+        "s_udpaddr": edit_data["s_udpaddr"],
+    };
+
+    $(document).ready(function () {
+        var index = 0
+        var curIndex = 0
+        for (var i in codeType) {
+            var name = codeType[i]["name"]
+            var code = codeType[i]["code"]
+            if (code==dict["s_tasktype"]) {
+                curIndex = Number(i)
+            }
+            if (i==0) {
+                $("#taskTypeSelect").append("<option selected:disabled style=\"diaplay:none\" value="+index+">请选择</option>");
+                index++
+            }
+            $("#taskTypeSelect").append("<option value="+index+">"+name+"</option>");
+            index++
+        }
+        // 数据赋值
+        $("#taskTypeSelect").selectpicker('val', curIndex+1);
+        var index_from,index_to = 0;
+        index_from = (dict["s_fromtype"]=="es")?1:2;
+        index_to = (dict["s_totype"]=="es")?1:2;
+        $("#fromTypeSelect").selectpicker('val', index_from);
+        $("#toTypeSelect").selectpicker('val', index_to);
+        $("#taskname").val(dict["s_taskname"])
+        $("#startid").val(dict["s_startid"])
+        $("#fromdburl").val(dict["s_fromdburl"])
+        $("#fromdbname").val(dict["s_fromdbname"])
+        $("#fromdbcoll").val(dict["s_fromdbcoll"])
+        $("#fromtype").val(dict["s_fromtype"])
+        $("#todburl").val(dict["s_todburl"])
+        $("#todbname").val(dict["s_todbname"])
+        $("#todbcoll").val(dict["s_todbcoll"])
+        $("#totype").val(dict["s_totype"])
+        $("#udpaddr").val(dict["s_udpaddr"])
+        $("#udport").val(dict["s_udport"])
+
+    });
+    function checkDict(data)  {
+        if (data["s_taskname"]==""||data["s_tasktype"]==""||data["s_startid"]==""||
+            data["s_fromdburl"]==""||data["s_fromdbname"]==""|| data["s_fromdbcoll"]==""||
+            data["s_fromtype"]==""|| data["s_todburl"]==""||data["s_todbname"]==""||
+            data["s_todbcoll"]==""|| data["s_totype"]==""|| data["s_udpaddr"]=="" ||
+            data["s_udport"]=="") {
+            return true
+        }
+        return false
+    }
+    function saveTask() {
+        dict["s_taskname"] = $('#taskname').val();
+        dict["s_startid"] = $('#startid').val();
+        dict["s_fromdburl"] = $('#fromdburl').val();
+        dict["s_fromdbname"] = $("#fromdbname").val();
+        dict["s_fromdbcoll"] = $("#fromdbcoll").val();
+        dict["s_todburl"] = $('#todburl').val();
+        dict["s_todbname"] = $('#todbname').val();
+        dict["s_todbcoll"] = $("#todbcoll").val();
+        dict["s_udpaddr"] = $('#udpaddr').val();
+        dict["s_udport"] = $("#udport").val();
+
+        if (checkDict(dict)) {
+            let msg = "请完善所有信息"
+            showMsg(msg);
+            return;
+        }
+        $.ajax({
+            url: "/service/task/save",
+            type: 'POST',
+            data: dict,
+            success: function (task) {
+                if (task.rep) {
+                    window.location.href="/service/task/list"
+                } else {
+                    showTip("更新失败",1000);
+                }
+            }
+        })
+    }
+
+
+
+
+
+
+</script>

+ 68 - 15
src/web/templates/task/task_list.html

@@ -4,6 +4,9 @@
 <!-- Left side column. 权限菜单 -->
 {{include "com/menu.html"}}
 {{include "com/modal.html"}}
+
+
+
 <div class="content-wrapper" id="showbtn">
     <section class="content-header">
         <h1>
@@ -25,6 +28,7 @@
                             <tr>
                                 <th>编号</th>
                                 <th>任务名称</th>
+                                <th>创建员</th>
                                 <th>修改时间</th>
                                 <th>操作</th>
                                 <th>功能</th>
@@ -75,41 +79,89 @@
                 });
             },
             "columns": [
-                {"data": null,width:"10%"},
+                {"data": null,width:"8%"},
                 {"data": "s_taskname"},
-                {"data": "i_updatetime",width:"20%", render: function (val) {
+                {"data": "s_createuser",width:"8%"},
+                {"data": "i_updatetime",width:"18%", render: function (val) {
                         var dt = new Date()
                         dt.setTime(parseInt(val) * 1000);
                         return dt.format("yyyy-MM-dd hh-mm-ss")
                     }},
-                {"data": "_id", width:"20%",render: function (val, a, row, pos) {
-                        var s = [val, row.s_dataid];
+                {"data": "_id", width:"18%",render: function (val, a, row, pos) {
                         tmp = '<div>' +
                             '<a class="btn btn-sm btn-primary" href="/service/task/edit?id='+val+'">编辑</a>'+
                             '&nbsp'+'&nbsp'+
-                            '<a class="btn btn-sm btn-danger" onclick="del(\''+s+'\')">删除</a>'+
+                            '<a class="btn btn-sm btn-danger"  onclick="del_task(\''+val+'\')">删除</a>'+
                             '</div>';
                         return tmp
                     }},
-                {"data": "_id", width:"20%",render: function (val, a, row, pos) {
-                        var s = [val, row.s_dataid];
-                        tmp = '<div>' +
-                            '<a class="btn btn-sm btn-primary" onclick="del(\''+s+'\')">启动</a>'+
-                            '&nbsp'+'&nbsp'+
-                            '<a class="btn btn-sm btn-danger" onclick="del(\''+s+'\')">关闭</a>'+
-                            '</div>';
+                {"data": "_id", width:"18%",render: function (val, a, row, pos) {
+
+                        if (row.s_isuse=="0") {
+                            //未启动
+                            tmp = '<div>' +
+                                '<a class="btn btn-sm btn-primary" onclick="start_task(\''+val+'\',\''+row.s_udpaddr+'\',\''+row.s_udport+'\')">启动</a>'+
+                                '&nbsp'+'&nbsp'+
+                                '<a class="btn btn-sm btn-info" disabled="true" href="javascript:return false;">关闭</a>'+                                '</div>';
+                                '<div>';
+                        } else {
+                            tmp = '<div>'+
+                                '<a class="btn btn-sm btn-primary" disabled="true" href="javascript:return false;">已启动</a>'+
+                                '&nbsp'+'&nbsp'+
+                                '<a class="btn btn-sm btn-info" onclick="end_task(\''+val+'\',\''+row.s_udpaddr+'\',\''+row.s_udport+'\')">关闭</a>'+
+                                '</div>';
+                        }
+
                         return tmp
                     }}
+
             ]
         });
     });
 
-    function del(s){
+
+    function start_task(id,addr,port){
+        showConfirm("确定开启任务?", function() {
+            $.ajax({
+                url:"/service/task/start",
+                type:"post",
+                data:{"id": id,"addr": addr,"port": port},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        alert(r.msg);
+                    }
+                }
+            })
+        });
+    }
+
+
+    function end_task(id,addr,port){
+        showConfirm("确定关闭任务?", function() {
+            $.ajax({
+                url:"/service/task/end",
+                type:"post",
+                data:{"id": id,"addr": addr,"port": port},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        alert(r.msg);
+                    }
+                }
+            })
+        });
+    }
+
+
+    function del_task(del_id){
         showConfirm("确定删除?", function() {
             $.ajax({
-                url:"/service/task/del",
+                url:"/service/task/delete",
                 type:"post",
-                data:{"_id": s.split(",")[0], "s_dataid": s.split(",")[1]},
+                data:{"_id": del_id},
                 success:function(r){
                     if(r.rep){
                         ttable.ajax.reload();
@@ -121,4 +173,5 @@
         });
     }
 
+
 </script>