소스 검색

Merge branch 'dev3.3' of http://192.168.3.207:10080/qmx/jy-data-extract into dev3.3

maxiaoshan 5 년 전
부모
커밋
5647a1f16b
32개의 변경된 파일4070개의 추가작업 그리고 109개의 파일을 삭제
  1. 2 1
      fullproject/src/config.json
  2. 1 0
      fullproject/src/init.go
  3. 1 0
      fullproject/src/load_data.go
  4. 9 1
      fullproject/src/main.go
  5. 31 16
      fullproject/src/project.go
  6. 144 45
      fullproject/src/task.go
  7. 40 16
      src/jy/admin/rule.go
  8. 832 0
      src/jy/admin/site_management.go
  9. 35 13
      src/jy/admin/version.go
  10. 1 1
      src/jy/clear/tonumber.go
  11. 7 2
      src/jy/extract/extpackage.go
  12. 2 2
      src/jy/extract/score_jsondata.go
  13. 5 1
      src/jy/pretreated/analystep.go
  14. 3 0
      src/jy/pretreated/analytable.go
  15. 3 3
      src/web/templates/admin/rule_logiclist.html
  16. 83 0
      src/web/templates/admin/site_check_luaback.html
  17. 96 0
      src/web/templates/admin/site_check_luaclearlogic.html
  18. 84 0
      src/web/templates/admin/site_check_luacore.html
  19. 85 0
      src/web/templates/admin/site_check_luacoreback.html
  20. 84 0
      src/web/templates/admin/site_check_luacorepre.html
  21. 82 0
      src/web/templates/admin/site_check_luapre.html
  22. 231 0
      src/web/templates/admin/site_clear.html
  23. 323 0
      src/web/templates/admin/site_management.html
  24. 324 0
      src/web/templates/admin/site_onetag.html
  25. 230 0
      src/web/templates/admin/site_rule_backlist.html
  26. 230 0
      src/web/templates/admin/site_rule_logicbacklist.html
  27. 201 0
      src/web/templates/admin/site_rule_logiclist.html
  28. 266 0
      src/web/templates/admin/site_rule_logicore.html
  29. 230 0
      src/web/templates/admin/site_rule_logicprelist.html
  30. 195 0
      src/web/templates/admin/site_taglist.html
  31. 199 0
      src/web/templates/admin/site_versioninfo.html
  32. 11 8
      src/web/templates/admin/version.html

+ 2 - 1
fullproject/src/config.json

@@ -1,5 +1,6 @@
 {
-    "mongodbServers": "192.168.3.207:27082",
+    "loadStart":-1,
+	"mongodbServers": "192.168.3.207:27082",
     "mongodbPoolSize": 10,
     "mongodbName": "cesuo",
     "extractColl": "key1_biddingall",

+ 1 - 0
fullproject/src/init.go

@@ -60,6 +60,7 @@ func init() {
 		DbName:      Sysconfig["mongodbName"].(string),
 	}
 	MongoTool.InitPool()
+
 	ExtractColl = Sysconfig["extractColl"].(string)
 	ProjectColl = Sysconfig["projectColl"].(string)
 	NextNode = Sysconfig["nextNode"].([]interface{})

+ 1 - 0
fullproject/src/load_data.go

@@ -8,6 +8,7 @@ import (
 //初始加载数据,默认加载最近6个月的数据
 
 func (p *ProjectTask) loadData(starttime int64) {
+	log.Println("load start..", starttime)
 	p.findLock.Lock()
 	defer p.findLock.Unlock()
 	p.AllIdsMapLock.Lock()

+ 9 - 1
fullproject/src/main.go

@@ -5,6 +5,7 @@ import (
 	"log"
 	mu "mfw/util"
 	"net"
+	"qfw/util"
 	"time"
 )
 
@@ -20,7 +21,12 @@ func main() {
 	//udp强制合并  信息id1,id2,id3 [项目id] 不存在时新建  qzhb
 	//udp强制拆分  项目id,信息id1,id2          qzcf
 	//udp重新合并  信息id1,id2,id3             cxhb
-	P_QL.loadData(0)
+	if Sysconfig["loadStart"] != nil {
+		loadStart := util.Int64All(Sysconfig["loadStart"])
+		if loadStart > -1 {
+			P_QL.loadData(loadStart)
+		}
+	}
 	time.Sleep(99999 * time.Hour)
 }
 
@@ -49,6 +55,7 @@ func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
 						<-SingleThread
 					}()
 					P_QL.currentType = tasktype
+					P_QL.pici = time.Now().Unix()
 					P_QL.taskQl(mapInfo)
 				}()
 			case "project": //增量合并,未抽取到项目名称或项目编号的不合并  bidding中mergestatus 1已合并 2字段问题不合并 3历史待合并
@@ -58,6 +65,7 @@ func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
 						<-SingleThread
 					}()
 					P_QL.currentType = tasktype
+					P_QL.pici = time.Now().Unix()
 					P_QL.taskZl(mapInfo)
 				}()
 

+ 31 - 16
fullproject/src/project.go

@@ -362,17 +362,19 @@ func (p *ProjectTask) compareBCTABB(info *Info, cp *ProjectInfo, diffTime int64,
 		compareBudget = "A"
 		score += 1
 		score2 += 1
-	} else if info.Budget == 0 && cp.Budget == 0 {
-		compareBudget = "B"
 	}
+	//	else if info.Budget == 0 && cp.Budget == 0 {
+	//		compareBudget = "B"
+	//	}
 	compareBidmount = "C"
 	if info.Bidamount > 0 && (info.Bidamount == cp.Bidamount || (cp.Budget > 0 && cp.Budget > info.Bidamount && (cp.Budget-info.Bidamount) < 0.1*cp.Budget)) {
 		compareBidmount = "A"
 		score += 1
 		score2 += 1
-	} else if info.Bidamount == 0 && cp.Bidamount == 0 {
-		compareBidmount = "B"
 	}
+	//	else if info.Bidamount == 0 && cp.Bidamount == 0 {
+	//		compareBidmount = "B"
+	//	}
 
 	cp.score = score
 	return
@@ -391,7 +393,7 @@ var FIELDS = []string{
 	"winner",
 	"budget",
 	"bidamount",
-	"bidstatus",
+	//"bidstatus",
 	"agency",
 	"projectscope",
 	"bidopentime",
@@ -410,6 +412,13 @@ var bidtype = map[string]string{
 	"竞价": "竞价",
 }
 
+var bidstatus = map[string]string{
+	"中标": "中标",
+	"成交": "成交",
+	"废标": "废标",
+	"流标": "流标",
+}
+
 //招标时间zbtime、中标时间jgtime、项目状态bidstatus、招标类型bidtype、最后发布时间lasttime、首次发布时间firsttime
 
 func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (string, *ProjectInfo) {
@@ -431,7 +440,7 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	set["sourceinfourl"] = tmp["href"]
 	set["firsttime"] = tmp["publishtime"]
 	set["lasttime"] = tmp["publishtime"]
-	set["pici"] = now
+	set["pici"] = p.pici
 	set["ids"] = []string{thisinfo.Id}
 	if thisinfo.TopType == "招标" {
 		set["zbtime"] = tmp["publishtime"]
@@ -444,6 +453,10 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 		bt = "招标"
 	}
 	set["bidtype"] = bt
+	bs, _ := tmp["bidstatus"].(string)
+	if bidstatus[bs] != "" {
+		set["bidstatus"] = bs
+	}
 	if set["bidstatus"] == nil && thisinfo.TopType == "结果" {
 		set["bidstatus"] = thisinfo.SubType
 	}
@@ -459,14 +472,15 @@ func (p *ProjectTask) NewProject(tmp map[string]interface{}, thisinfo *Info) (st
 	set["list"] = []bson.M{
 		push,
 	}
-	p.updatePool <- []map[string]interface{}{
-		map[string]interface{}{
-			"_id": pId,
-		},
-		map[string]interface{}{
-			"$set": set,
-		},
-	}
+	p.savePool <- set
+	//	[]map[string]interface{}{
+	//		map[string]interface{}{
+	//			"_id": pId,
+	//		},
+	//		map[string]interface{}{
+	//			"$set": ,
+	//		},
+	//	}
 	return pId.Hex(), &p1
 }
 
@@ -637,7 +651,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 		set["bidamount"] = pInfo.Bidamount
 	}
 
-	if thisinfo.Budget > 0 && pInfo.Budget < 1 {
+	if thisinfo.Budget > 0 && pInfo.Budget < 1 { //多包的会有问题,没有进行合计。
 		pInfo.Budget = thisinfo.Budget
 		set["budget"] = pInfo.Budget
 	}
@@ -679,6 +693,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 
 	set["mpn"] = pInfo.MPN
 	set["mpc"] = pInfo.MPC
+	set["pici"] = p.pici
 
 	if thisinfo.HasPackage {
 		set["multipackage"] = 1
@@ -693,7 +708,7 @@ func (p *ProjectTask) UpdateProject(tmp map[string]interface{}, thisinfo *Info,
 	//保留原数据吧
 	push := p.PushListInfo(tmp)
 	push["compareStr"] = comStr
-	push["resVal"] = pInfo.pjVal
+	push["resVal"] = pInfo.resVal
 	push["pjVal"] = pInfo.pjVal
 	update["$push"] = map[string]interface{}{
 		"list": push,

+ 144 - 45
fullproject/src/task.go

@@ -36,7 +36,9 @@ type ProjectTask struct {
 	//采购单位、项目名称、项目编号
 	mapPb, mapPn, mapPc map[string]*Key
 	//更新或新增通道
-	updatePool chan []map[string]interface{}
+	updatePool           chan []map[string]interface{}
+	savePool             chan map[string]interface{}
+	saveSign, updateSign chan bool
 	//表名
 	coll string
 	//当前状态是全量还是增量
@@ -47,20 +49,24 @@ type ProjectTask struct {
 	currentTime int64
 	//保存长度
 	saveSize int
+	pici     int64
 }
 
 func NewPT() *ProjectTask {
 	return &ProjectTask{
 		InitMinTime: int64(1325347200),
 		name:        "全/增量对象",
-		thread:      3,
-		updatePool:  make(chan []map[string]interface{}, 2000),
+		thread:      4,
+		updatePool:  make(chan []map[string]interface{}, 1000),
+		savePool:    make(chan map[string]interface{}, 2000),
 		wg:          sync.WaitGroup{},
-		AllIdsMap:   make(map[string]*ID, 5000000),
-		mapPb:       make(map[string]*Key, 5000000),
-		mapPn:       make(map[string]*Key, 5000000),
-		mapPc:       make(map[string]*Key, 5000000),
+		AllIdsMap:   make(map[string]*ID, 100000),
+		mapPb:       make(map[string]*Key, 1000000),
+		mapPn:       make(map[string]*Key, 1000000),
+		mapPc:       make(map[string]*Key, 1500000),
 		saveSize:    200,
+		saveSign:    make(chan bool, 1),
+		updateSign:  make(chan bool, 1),
 		coll:        ProjectColl,
 	}
 }
@@ -70,30 +76,65 @@ var P_QL *ProjectTask
 //初始化全量合并对象
 func init() {
 	P_QL = NewPT()
+	go P_QL.saveQueue()
 	go P_QL.updateQueue()
 	go P_QL.clearMem()
+}
 
+func (p *ProjectTask) saveQueue() {
+	arr := make([]map[string]interface{}, p.saveSize)
+	indexs := 0
+	for {
+		select {
+		case <-p.saveSign:
+			if indexs > 0 {
+				MongoTool.SaveBulk(p.coll, arr[:indexs]...)
+				arr = make([]map[string]interface{}, p.saveSize)
+				indexs = 0
+			}
+			p.updateSign <- true
+		case v := <-p.savePool:
+			arr[indexs] = v
+			indexs++
+			if indexs == p.saveSize {
+				MongoTool.SaveBulk(p.coll, arr...)
+				arr = make([]map[string]interface{}, p.saveSize)
+				indexs = 0
+			}
+		case <-time.After(100 * time.Millisecond):
+			if indexs > 0 {
+				MongoTool.SaveBulk(p.coll, arr[:indexs]...)
+				arr = make([]map[string]interface{}, p.saveSize)
+				indexs = 0
+			}
+		}
+	}
 }
 
 //项目保存和更新通道
 func (p *ProjectTask) updateQueue() {
-	arr := make([][]map[string]interface{}, p.saveSize)
-	index := 0
+	arru := make([][]map[string]interface{}, p.saveSize)
+	indexu := 0
 	for {
 		select {
 		case v := <-p.updatePool:
-			arr[index] = v
-			index++
-			if index == p.saveSize {
-				MongoTool.UpSertBulk(p.coll, arr...)
-				arr = make([][]map[string]interface{}, p.saveSize)
-				index = 0
+			arru[indexu] = v
+			indexu++
+			if indexu == p.saveSize {
+				//更新之前先保存
+				p.saveSign <- true
+				<-p.updateSign
+				MongoTool.UpdateBulk(p.coll, arru...)
+				arru = make([][]map[string]interface{}, p.saveSize)
+				indexu = 0
 			}
-		case <-time.After(2 * time.Second):
-			if index > 0 {
-				MongoTool.UpSertBulk(p.coll, arr[:index]...)
-				arr = make([][]map[string]interface{}, p.saveSize)
-				index = 0
+		case <-time.After(100 * time.Millisecond):
+			if indexu > 0 {
+				p.saveSign <- true
+				<-p.updateSign
+				MongoTool.UpdateBulk(p.coll, arru[:indexu]...)
+				arru = make([][]map[string]interface{}, p.saveSize)
+				indexu = 0
 			}
 		}
 	}
@@ -105,8 +146,8 @@ func (p *ProjectTask) clearMem() {
 	//在内存中保留最近6个月的信息
 	validTime := int64(6 * 30 * 86400)
 	//跑全量时每4分钟跑一次,跑增量时400分钟跑一次
-	c.AddFunc("50 0/4 * * * *", func() {
-		if p.currentType == "ql" || p.clearContimes >= 100 {
+	c.AddFunc("50 0/10 * * * *", func() {
+		if p.currentType == "ql" || p.clearContimes >= 60 {
 			//跳过的次数清零
 			p.clearContimes = 0
 			//信息进入查找对比全局锁
@@ -197,15 +238,35 @@ func (p *ProjectTask) taskQl(udpInfo map[string]interface{}) {
 	//		log.Println("publishtime_1索引不存在")
 	//	}
 	//	MongoTool.DestoryMongoConn(sess)
-	thread := util.IntAllDef(udpInfo["thread"], 3)
+	thread := util.IntAllDef(udpInfo["thread"], 4)
 	if thread > 0 {
 		p.thread = thread
 	}
-	bcon := true
-	if bcon {
-		//生成查询语句执行
-		p.enter(db, coll, map[string]interface{}{})
+	q, _ := udpInfo["query"].(map[string]interface{})
+	if q == nil {
+		q = map[string]interface{}{}
+		lteid, _ := udpInfo["lteid"].(string)
+		var idmap map[string]interface{}
+		if len(lteid) > 15 {
+			idmap = map[string]interface{}{
+				"$lte": util.StringTOBsonId(lteid),
+			}
+		}
+		gtid, _ := udpInfo["gtid"].(string)
+		if len(gtid) > 15 {
+			if idmap == nil {
+				idmap = map[string]interface{}{}
+			}
+			idmap["$gt"] = util.StringTOBsonId(gtid)
+		}
+		if idmap != nil {
+			q["_id"] = idmap
+		}
 	}
+	//生成查询语句执行
+	log.Println("查询语句:", q)
+	p.enter(db, coll, q)
+
 }
 
 //增量合并
@@ -236,12 +297,11 @@ func (p *ProjectTask) taskZl(udpInfo map[string]interface{}) {
 			},
 		}
 	}
-	pici := time.Now().Unix()
 	if q != nil {
 		//生成查询语句执行
 		p.enter(db, coll, q)
 	}
-	nextNode(gtid, lteid, "project", pici)
+	nextNode(gtid, lteid, "project", p.pici)
 }
 
 //通知下个节点nextNode
@@ -267,35 +327,74 @@ func nextNode(gtid, lteid, stype string, pici int64) {
 
 func (p *ProjectTask) enter(db, coll string, q map[string]interface{}) {
 	defer util.Catch()
+	count, taskcount := 0, 0
+	//var lastid interface{}
+	//	for {
+	//		if lastid != nil {
+	//			if q == nil {
+	//				q = map[string]interface{}{}
+	//			}
+	//			if q["_id"] == nil {
+	//				q["_id"] = map[string]interface{}{}
+	//			}
+	//			q["_id"].(map[string]interface{})["$gt"] = lastid
+	//		}
+	pool := make(chan bool, p.thread)
+	log.Println("start project", q)
 	sess := MongoTool.GetMgoConn()
 	defer MongoTool.DestoryMongoConn(sess)
-	query := sess.DB(db).C(coll).Find(q).Sort("publishtime").Iter()
-	pool := make(chan bool, p.thread)
-	count := 0
+	query := sess.DB(db).C(coll).Find(q).Sort("_id").Select(map[string]interface{}{
+		"blocks":   0,
+		"fieldall": 0,
+	}).Iter()
+	//over := 0
 	for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
-		info := ParseInfo(tmp)
-		if info != nil && !((info.pnbval == 1 && info.Buyer != "") || info.pnbval == 0) {
-			pool <- true
-			go func(info *Info, tmp map[string]interface{}) {
-				defer func() {
-					p.currentTime = info.Publishtime
-					<-pool
-				}()
-				p.startProjectMerge(info, tmp)
-			}(info, tmp)
-		} else {
-			//信息错误,进行更新
+		if util.IntAll(tmp["repeat"]) == 0 {
+			info := ParseInfo(tmp)
+			if info != nil && !((info.pnbval == 1 && info.Buyer != "") || info.pnbval == 0) {
+				pool <- true
+				taskcount++
+				go func(info *Info, tmp map[string]interface{}) {
+					defer func() {
+						p.currentTime = info.Publishtime
+						<-pool
+					}()
+					p.startProjectMerge(info, tmp)
+				}(info, tmp)
+			} else {
+				//信息错误,进行更新
+			}
 		}
 		if count%1000 == 0 {
 			log.Println("current", count)
 		}
+		//			if taskcount > 0 && taskcount%50000 == 0 { //歇歇
+		//				log.Println("pause start..", taskcount)
+		//				for n := 0; n < p.thread; n++ {
+		//					pool <- true
+		//				}
+		//				for n := 0; n < p.thread; n++ {
+		//					<-pool
+		//				}
+		//				log.Println("pause over..")
+		//			}
+		//lastid = tmp["_id"]
 		tmp = make(map[string]interface{})
+		//		if count > 40000 {
+		//			query.Close()
+		//			break
+		//		}
+		//over++
 	}
 	//阻塞
 	for n := 0; n < p.thread; n++ {
 		pool <- true
 	}
-	log.Println("所有线程执行完成...", count)
+	//		if over == 0 {
+	//			break
+	//		}
+	//}
+	log.Println("所有线程执行完成...", count, taskcount)
 
 }
 

+ 40 - 16
src/jy/admin/rule.go

@@ -62,9 +62,9 @@ func init() {
 		_id, _ := c.GetPostForm("_id")
 		//b := Mgo.Del("rule_logic", `{"_id":"`+_id+`"}`)
 		b := Mgo.UpdateById("rule_logic", _id, `{"$set":{"delete":true}}`)
-		go DelLogicPre(_id)
-		go DelLogicCore(_id)
-		go DelLogicBack(_id)
+		go DelLogicPre(_id,false)
+		go DelLogicCore(_id,false)
+		go DelLogicBack(_id,false)
 		c.JSON(200, gin.H{"rep": b})
 	})
 	Admin.POST("/rulelogic/use", RuleLogicUse)
@@ -481,7 +481,7 @@ func DelVersionInfo(vid string) { //刪除属性配置
 	vInfo, _ := Mgo.Find("versioninfo", `{"vid":"`+vid+`","delete":false}`, nil, `{"_id":1}`, false, -1, -1)
 	Mgo.Update("versioninfo", `{"vid":"`+vid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
 	for _, v := range *vInfo {
-		DelLogic(vid, qu.BsonIdToSId((v)["_id"]))
+		DelLogic(vid, qu.BsonIdToSId((v)["_id"]), false)
 	}
 }
 
@@ -493,13 +493,19 @@ func DelPkgInfo(vid string) { //刪除分包配置
 	}
 }
 
-func DelLogic(vid, pid string) { //删除逻辑
-	logic, _ := Mgo.Find("rule_logic", `{"vid":"`+vid+`","pid":"`+pid+`","delete":false}`, nil, `{"_id":1}`, false, -1, -1)
-	Mgo.Update("rule_logic", `{"vid":"`+vid+`","pid":"`+pid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
+func DelLogic(vid, pid string, isSite bool) { //删除逻辑
+	var rule_logic string
+	if isSite {
+		rule_logic = "site_rule_logic"
+	} else {
+		rule_logic = "rule_logic"
+	}
+	logic, _ := Mgo.Find(rule_logic, `{"vid":"`+vid+`","pid":"`+pid+`","delete":false}`, nil, `{"_id":1}`, false, -1, -1)
+	Mgo.Update(rule_logic, `{"vid":"`+vid+`","pid":"`+pid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
 	for _, l := range *logic {
-		DelLogicPre(qu.BsonIdToSId(l["_id"]))
-		DelLogicCore(qu.BsonIdToSId(l["_id"]))
-		DelLogicBack(qu.BsonIdToSId(l["_id"]))
+		DelLogicPre(qu.BsonIdToSId(l["_id"]), isSite)
+		DelLogicCore(qu.BsonIdToSId(l["_id"]), isSite)
+		DelLogicBack(qu.BsonIdToSId(l["_id"]), isSite)
 	}
 }
 
@@ -511,14 +517,32 @@ func DelPkgLogic(vid, pid string) { //删除分包逻辑
 	}
 }
 
-func DelLogicPre(sid string) { //删除属性配置中的前置规则
-	Mgo.Update("rule_logicpre", `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
+func DelLogicPre(sid string, isSite bool) { //删除属性配置中的前置规则
+	var rule_logicpre string
+	if isSite {
+		rule_logicpre = "site_rule_logicpre"
+	} else {
+		rule_logicpre = "rule_logicpre"
+	}
+	Mgo.Update(rule_logicpre, `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
 }
-func DelLogicCore(sid string) { //删除属性配置中的抽取规则
-	Mgo.Update("rule_logicore", `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
+func DelLogicCore(sid string, isSite bool) { //删除属性配置中的抽取规则
+	var rule_logicore string
+	if isSite {
+		rule_logicore = "site_rule_logicore"
+	} else {
+		rule_logicore = "rule_logicore"
+	}
+	Mgo.Update(rule_logicore, `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
 }
-func DelLogicBack(sid string) { //删除属性配置中的后置规则
-	Mgo.Update("rule_logicback", `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
+func DelLogicBack(sid string, isSite bool) { //删除属性配置中的后置规则
+	var rule_logicback string
+	if isSite {
+		rule_logicback = "site_rule_logicback"
+	} else {
+		rule_logicback = "rule_logicback"
+	}
+	Mgo.Update(rule_logicback, `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)
 }
 func DelPkgLogicBack(sid string) { //删除分包属性配置中的后置规则
 	Mgo.Update("pkg_logicback", `{"sid":"`+sid+`","delete":false}`, `{"$set":{"delete":true}}`, false, true)

+ 832 - 0
src/jy/admin/site_management.go

@@ -0,0 +1,832 @@
+// version
+package admin
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/gin-contrib/sessions"
+	"github.com/gin-gonic/gin"
+	"gopkg.in/mgo.v2/bson"
+	. "jy/mongodbutil"
+	"net/http"
+	"net/url"
+	"qfw/util"
+	"strings"
+	"sync"
+	"time"
+)
+
+func init() {
+	Admin.GET("/site_management", func(c *gin.Context) {
+		vid, _ := c.GetQuery("vid")
+		c.HTML(
+			http.StatusOK, "site_management.html",
+			gin.H{"vid": vid},
+		)
+	})
+	//初始化版本站点列表
+	Admin.POST("/site_management/dataForVid", func(c *gin.Context) {
+		vid, _ := c.GetQuery("vid")
+		if vid == "" {
+			data, _ := Mgo.Find("site_management", nil, `{"_id":-1}`, nil, false, -1, -1)
+			c.JSON(200, gin.H{"data": data})
+		} else {
+			data, _ := Mgo.Find("site_management", bson.M{"vid": vid}, `{"_id":-1}`, nil, false, -1, -1)
+			c.JSON(200, gin.H{"data": data})
+		}
+	}) //版本站点列表
+	Admin.POST("/site_management/byId", func(c *gin.Context) {
+		_id := c.PostForm("_id")
+		if  !bson.IsObjectIdHex(_id) {
+			c.JSON(400, gin.H{"rep": false})
+			return
+		}
+		data, _ := Mgo.FindById("site_management", _id, bson.M{})
+		c.JSON(200, gin.H{"rep": true,"data":data})
+	})
+
+	//站点信息保存
+	Admin.POST("/site_management/save", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		data := GetPostForm(c)
+		u, _ := url.Parse(data["site_href"].(string))
+		if u != nil && u.Scheme == "" {
+			data["site_href"] = "http://" + strings.TrimSpace(data["site_href"].(string))
+		}
+		if scripts,ok := data["site_script"].(string);ok{
+			data["site_script"] = strings.Split(scripts,",")
+		}
+		if data["isuse"] == nil{
+			data["isuse"] = "true"
+		}
+		if data["vid"] != nil && bson.IsObjectIdHex(data["vid"].(string)){
+			if aa,b:= Mgo.Find("version",bson.M{"_id":bson.ObjectIdHex(data["vid"].(string))},nil,bson.M{"version":1},true,-1,-1);b {
+				data["version"] = (*aa)[0]["version"]
+			}
+		}
+		if _id != "" {
+			Mgo.UpdateById("site_management", _id, map[string]interface{}{"$set": data})
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			if data["site_name"] == nil || data["site_href"] == nil  {
+				c.JSON(400, gin.H{"rep": false})
+				return
+			}
+			Mgo.Save("site_management", data)
+			c.JSON(200, gin.H{"rep": true, "vid": data["vid"]})
+		}
+	})
+	//站点信息删除
+	Admin.POST("/site_management/delete", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		if _id == "" || !bson.IsObjectIdHex(_id)  {
+			c.JSON(400, gin.H{"rep": false})
+		} else {
+			Mgo.Del("site_management",bson.M{"_id":bson.ObjectIdHex(_id)})
+			c.JSON(200, gin.H{"rep": true})
+		}
+	})
+	//开关按钮
+	Admin.POST("/site_management/use", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("site_management", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//属性
+	Admin.GET("/site_management/info", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		c.HTML(
+			http.StatusOK, "site_versioninfo.html",
+			gin.H{"vid": vid, "pid":pid},
+		)
+	})
+	//属性配置
+	Admin.POST("/site_management/infodata", func(c *gin.Context) {
+		vid := c.PostForm("vid")
+		pid := c.PostForm("pid")
+		list, _ := Mgo.Find("site_versioninfo", `{"vid":"`+vid+`","pid":"`+pid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": list, "vid": vid,"pid":pid})
+	})
+	//属性保存
+	Admin.POST("/site_management/infosave", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		data := GetPostForm(c)
+		if _id != "" {
+			Mgo.UpdateById("site_versioninfo", _id, map[string]interface{}{"$set": data})
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			s_field, _ := c.GetPostForm("s_field")
+			vid, _ := c.GetPostForm("vid")
+			tmp, _ := Mgo.FindOne("site_versioninfo", `{"s_field":"`+s_field+`","vid":"`+vid+`","delete":false}`)
+			if len(*tmp) > 0 {
+				c.JSON(200, gin.H{"rep": false})
+			} else {
+				data["l_createtime"] = time.Now().Unix()
+				data["s_username"] = sessions.Default(c).Get("username")
+				data["l_lasttime"] = time.Now().Unix()
+				data["delete"] = false
+				pid := Mgo.Save("site_versioninfo", data)
+				fromvid, _ := data["s_pversionid"].(string)
+				if fromvid != "" {
+					copyFieldRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string),true)
+				}
+				c.JSON(200, gin.H{"rep": true})
+			}
+		}
+	})
+	//属性use按钮
+	Admin.POST("/site_management/infouse", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("site_versioninfo", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//属性删除按钮
+	Admin.POST("/site_management/infodel", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.UpdateById("site_versioninfo", _id, `{"$set":{"delete":true}}`)
+		v, _ := Mgo.FindById("site_versioninfo", _id, `{"vid":1}`)
+		go DelLogic(util.ObjToString((*v)["vid"]), _id,true)
+		//b := Mgo.Del("site_versioninfo", `{"_id":"`+_id+`"}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+
+	//逻辑页面
+	Admin.GET("/site_management/rulelogic", func(c *gin.Context) {
+		vid := c.Query("vid")
+		p_pid := c.Query("p_pid")
+		pid := c.Query("pid")
+		c.HTML(200, "site_rule_logiclist.html", gin.H{"vid": vid, "pid": pid,"p_pid":p_pid})
+	})
+	//逻辑页面数据展示
+	Admin.POST("/site_management/rulelogic/data", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		pid, _ := c.GetPostForm("pid")
+		data, _ := Mgo.Find("site_rule_logic", `{"vid":"`+vid+`","pid":"`+pid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid})
+	})
+	//逻辑页面数据保存
+	Admin.POST("/site_management/rulelogic/save", func(c *gin.Context) {
+		data := GetPostForm(c)
+		_id, _ := c.GetPostForm("_id")
+		b := false
+		if _id == "" {
+			data["l_createtime"] = time.Now().Unix()
+			data["s_username"] = sessions.Default(c).Get("username")
+			data["delete"] = false
+			b = Mgo.Save("site_rule_logic", data) != ""
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			b = Mgo.Update("site_rule_logic", `{"_id":"`+_id+`"}`, map[string]interface{}{
+				"$set": data,
+			}, true, false)
+		}
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//逻辑页面删除按钮
+	Admin.POST("/site_management/rulelogic/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		//b := Mgo.Del("rule_logic", `{"_id":"`+_id+`"}`)
+		b := Mgo.UpdateById("site_rule_logic", _id, `{"$set":{"delete":true}}`)
+		go DelLogicPre(_id,true)
+		go DelLogicCore(_id,true)
+		go DelLogicBack(_id,true)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//逻辑页面启用按钮
+	Admin.POST("/site_management/rulelogic/use", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("site_rule_logic", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//前置规则
+	Admin.GET("/site_management/logicpre", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		sid := c.Query("sid")
+		c.HTML(200, "site_rule_logicprelist.html", gin.H{"vid": vid, "pid": pid, "sid": sid})
+	})
+	Admin.POST("/site_management/logicpre/data", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		pid, _ := c.GetPostForm("pid")
+		sid, _ := c.GetPostForm("sid")
+		data, _ := Mgo.Find("site_rule_logicpre", `{"sid":"`+sid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid, "sid": sid})
+	})
+
+	Admin.POST("/site_management/logicpre/save", func(c *gin.Context) {
+		data := GetPostForm(c)
+		_id, _ := c.GetPostForm("_id")
+		b := false
+		if _id == "" {
+			data["l_createtime"] = time.Now().Unix()
+			data["s_username"] = sessions.Default(c).Get("username")
+			data["delete"] = false
+			s_type := data["s_type"]
+			code := ""
+			if s_type == "0" { //抽取前置正则E_FE
+				code = getSyncIndex(E_FE)
+			} else { //抽取前置脚本
+				code = getSyncIndex(E_FL)
+			}
+			data["s_code"] = code
+			b = Mgo.Save("site_rule_logicpre", data) != ""
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			b = Mgo.Update("site_rule_logicpre", `{"_id":"`+_id+`"}`, map[string]interface{}{
+				"$set": data,
+			}, true, false)
+		}
+		c.JSON(200, gin.H{"rep": b})
+	})
+
+	Admin.POST("/site_management/logicpre/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		//b := Mgo.Del("rule_logicpre", `{"_id":"`+_id+`"}`)
+		b := Mgo.UpdateById("site_rule_logicpre", _id, `{"$set":{"delete":true}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.GET("/site_management/logicore", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		sid := c.Query("sid")
+		//查询属性字段
+		tmp, _ := Mgo.FindById("site_versioninfo", pid, `{"s_field":1}`)
+		c.HTML(200, "site_rule_logicore.html", gin.H{"vid": vid, "pid": pid, "sid": sid, "field": (*tmp)["s_field"]})
+	})
+	//抽取规则
+	Admin.POST("/site_management/logicore/data", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		pid, _ := c.GetPostForm("pid")
+		sid, _ := c.GetPostForm("sid")
+		data, _ := Mgo.Find("site_rule_logicore", `{"sid":"`+sid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid, "sid": sid})
+	})
+	Admin.POST("/site_management/logicore/save", func(c *gin.Context) {
+		data := GetPostForm(c)
+		_id, _ := c.GetPostForm("_id")
+		b := false
+		if _id == "" {
+			data["l_createtime"] = time.Now().Unix()
+			data["s_username"] = sessions.Default(c).Get("username")
+			data["delete"] = false
+			s_type := data["s_type"]
+			code := ""
+			if s_type == "0" { //抽取逻辑正则
+				code = getSyncIndex(E_CE)
+			} else { //抽取逻辑脚本
+				code = getSyncIndex(E_CL)
+			}
+			data["s_code"] = code
+			b = Mgo.Save("site_rule_logicore", data) != ""
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			b = Mgo.Update("site_rule_logicore", `{"_id":"`+_id+`"}`, map[string]interface{}{
+				"$set": data,
+			}, true, false)
+		}
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/site_management/logicore/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		//b := Mgo.Del("rule_logicore", `{"_id":"`+_id+`"}`)
+		b := Mgo.UpdateById("site_rule_logicore", _id, `{"$set":{"delete":true}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/site_management/logicore/use", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("site_rule_logicore", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+
+	//后置规则
+	Admin.GET("/site_management/logicback", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		sid := c.Query("sid")
+		//查询属性字段
+		tmp, _ := Mgo.FindById("site_versioninfo", pid, `{"s_field":1}`)
+		c.HTML(200, "site_rule_logicbacklist.html", gin.H{"vid": vid, "pid": pid, "sid": sid, "field": (*tmp)["s_field"]})
+	})
+	Admin.POST("/site_management/logicback/data", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		pid, _ := c.GetPostForm("pid")
+		sid, _ := c.GetPostForm("sid")
+		data, _ := Mgo.Find("site_rule_logicback", `{"sid":"`+sid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid, "sid": sid})
+	})
+	Admin.POST("/site_management/logicback/save", func(c *gin.Context) {
+		data := GetPostForm(c)
+		_id, _ := c.GetPostForm("_id")
+		b := false
+		if _id == "" {
+			data["l_createtime"] = time.Now().Unix()
+			data["s_username"] = sessions.Default(c).Get("username")
+			data["delete"] = false
+			s_type := data["s_type"]
+			code := ""
+			if s_type == "0" { //抽取后置正则E_FE
+				code = getSyncIndex(E_BE)
+			} else { //抽取后置脚本
+				code = getSyncIndex(E_BL)
+			}
+			data["s_code"] = code
+			b = Mgo.Save("site_rule_logicback", data) != ""
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			b = Mgo.Update("site_rule_logicback", `{"_id":"`+_id+`"}`, map[string]interface{}{
+				"$set": data,
+			}, true, false)
+		}
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/site_management/logicback/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.UpdateById("site_rule_logicback", _id, `{"$set":{"delete":true}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//站点后置规则
+	Admin.GET("/site_management/ruleback", func(c *gin.Context) {
+		version := c.Query("version")
+		vid := c.Query("vid")
+		c.HTML(200, "site_rule_backlist.html", gin.H{"version": version,"vid":vid})
+	})
+	Admin.POST("/site_management/ruleback/data", func(c *gin.Context) {
+		version, _ := c.GetPostForm("version")
+		data, _ := Mgo.Find("site_rule_back", `{"s_version":"`+version+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data, "version": version})
+	})
+	Admin.POST("/site_management/ruleback/save", func(c *gin.Context) {
+		data := GetPostForm(c)
+		_id, _ := c.GetPostForm("_id")
+		b := false
+		if _id == "" {
+			data["l_createtime"] = time.Now().Unix()
+			data["s_username"] = sessions.Default(c).Get("username")
+			data["delete"] = false
+			s_type := data["s_type"]
+			code := ""
+			if s_type == "0" { //前置正则
+				code = getSyncIndex(B_E)
+			} else { //前置lua脚本
+				code = getSyncIndex(B_L)
+			}
+			data["s_code"] = code
+			b = Mgo.Save("site_rule_back", data) != ""
+		} else {
+			data["l_lasttime"] = time.Now().Unix()
+			b = Mgo.Update("site_rule_back", `{"_id":"`+_id+`"}`, map[string]interface{}{
+				"$set": data,
+			}, true, false)
+		}
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/site_management/ruleback/searchbyid", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		data, _ := Mgo.FindById("/site_rule_back", _id, nil)
+		c.JSON(200, gin.H{"rep": data})
+	})
+	Admin.POST("/site_management/ruleback/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		//b := Mgo.Del("rule_back", `{"_id":"`+_id+`"}`)
+		b := Mgo.UpdateById("site_rule_back", _id, `{"$set":{"delete":true}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	//tag
+	Admin.GET("/site_management/tag", func(c *gin.Context) {
+		version := c.Query("version")
+		vid := c.Query("vid")
+		c.HTML(200, "site_taglist.html", gin.H{"version": version,"vid":vid})
+	})
+	Admin.POST("/site_management/tag/data", TagDataSite)
+	Admin.POST("/site_management/tag/save", TagSaveSite)
+	Admin.POST("/site_management/tag/del", TagDelSite)
+
+	//onetag
+	Admin.GET("/site_management/onetag", func(c *gin.Context) {
+		version := c.Query("version")
+		tagname := c.Query("tagname")
+		tp := c.Query("tp")
+		parentid := c.Query("parentid")
+		c.HTML(200, "site_onetag.html", gin.H{"version": version, "tagname": tagname, "tp": tp, "parentid": parentid})
+	})
+	Admin.POST("/site_management/onetag/data", OneTagDataSite)
+	Admin.POST("/site_management/onetag/create", OneTagCreateSite)
+	Admin.POST("/site_management/onetag/del", OneTagDelSite)
+	Admin.POST("/site_management/onetag/editsave", OneTagEditSaveSite)
+	Admin.POST("/site_management/onetag/searchone", OneTagSearchSite)
+
+	//清理函数
+	Admin.GET("/site_management/clear", func(c *gin.Context) {
+		version := c.Query("version")
+		field, _ := Mgo.Find("fields", nil, `{"_id":-1}`, nil, false, -1, -1)
+		c.HTML(200, "site_clear.html", gin.H{"version": version, "field": field})
+	})
+	Admin.POST("/site_management/clear/data", func(c *gin.Context) {
+		version, _ := c.GetPostForm("version")
+		data, _ := Mgo.Find("site_cleanup", `{"s_version":"`+version+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+		for _, d := range *data {
+			timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
+			d["l_intime"] = timeStr
+		}
+		c.JSON(200, gin.H{"data": data})
+	}) //加载数据
+	Admin.POST("/site_management/clear/save", func(c *gin.Context) {
+		clearTmpArr := make([]string, 0)
+		clear := make([]string, 0)
+		clearInfo := make([]string, 0)
+		save := make(map[string]interface{})
+		clearJsonStr, _ := c.GetPostForm("clearJsonStr")
+		err := json.Unmarshal([]byte(clearJsonStr), &clearTmpArr)
+		if err == nil && len(clearTmpArr) > 0 {
+			for _, v := range clearTmpArr {
+				clearTmpSplitArr := strings.Split(v, "+")
+				clearInfo = append(clearInfo, clearTmpSplitArr[0])
+				clear = append(clear, clearTmpSplitArr[1])
+			}
+		} else {
+			c.JSON(200, gin.H{"rep": false})
+			return
+		}
+		_id, _ := c.GetPostForm("_id")
+		if _id == "" { //保存
+			version, _ := c.GetPostForm("version")
+			username, _ := c.GetPostForm("username")
+			fieldname, _ := c.GetPostForm("fieldname")
+			fieldArr := strings.Split(fieldname, "+")
+			data, _ := Mgo.FindOne("site_cleanup", `{"s_version":"`+version+`","s_field":"`+fieldArr[1]+`","delete":false}`)
+			if len(*data) > 0 { //创建判重
+				c.JSON(200, gin.H{"rep": false})
+				return
+			}
+			save = map[string]interface{}{
+				"s_version": version,
+				"s_creater": username,
+				"l_intime":  time.Now().Unix(),
+				"s_field":   fieldArr[1],
+				"s_name":    fieldArr[0],
+				"clear":     clear,
+				"clearInfo": clearInfo,
+				"delete":    false,
+			}
+			b := Mgo.Save("site_cleanup", save)
+			if b != "" {
+				c.JSON(200, gin.H{"rep": true})
+			} else {
+				c.JSON(200, gin.H{"rep": false})
+			}
+		} else { //更新
+			save = map[string]interface{}{
+				"clear":     clear,
+				"clearInfo": clearInfo,
+				"l_intime":  time.Now().Unix(),
+			}
+			f := Mgo.Update("site_cleanup", `{"_id":"`+_id+`"}`, map[string]interface{}{"$set": save}, true, false)
+			if f {
+				c.JSON(200, gin.H{"rep": true})
+			} else {
+				c.JSON(200, gin.H{"rep": false})
+			}
+		}
+	}) //保存数据
+	Admin.POST("/site_management/clear/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.Update("site_cleanup", `{"_id":"`+_id+`"}`, map[string]interface{}{
+			"$set": map[string]interface{}{"delete": true},
+		}, false, false)
+		if b {
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			c.JSON(200, gin.H{"rep": false})
+		}
+	})   //删除数据
+
+	//校验
+	//正则规则验证
+	Admin.POST("/site_management/check/prerule", func(c *gin.Context) {
+		rule, _ := c.GetPostForm("s_rule")
+		con, _ := c.GetPostForm("s_testcon")
+		str := checkPreReg(con, rule)
+		c.JSON(200, gin.H{"rep": str})
+	})
+	Admin.POST("/site_management/check/extrule", func(c *gin.Context) {
+		rule, _ := c.GetPostForm("s_rule")
+		con, _ := c.GetPostForm("s_testcon")
+		field, _ := c.GetPostForm("s_field")
+		tmp := checkCoreReg(field, con, rule)
+		c.JSON(200, gin.H{"rep": tmp})
+	})
+	Admin.POST("/site_management/check/backrule", func(c *gin.Context) {
+		rule, _ := c.GetPostForm("s_rule")
+		con, _ := c.GetPostForm("s_testcon")
+		str := checkBackReg(con, rule)
+		c.JSON(200, gin.H{"rep": str})
+	})
+
+	//lua脚本验证
+	//通用前置验证
+	Admin.GET("/site_management/check/lua/pre", func(c *gin.Context) {
+		version := c.Query("version")
+		s_code := c.Query("s_code")
+		rule, _ := Mgo.FindOne("site_rule_pre", `{"s_code":"`+s_code+`"}`)
+		(*rule)["_id"] = util.BsonIdToSId((*rule)["_id"])
+		c.HTML(200, "site_check_luapre.html", gin.H{"version": version, "code": s_code, "rule": &rule, "infos": getCheckInfos()})
+	})
+	Admin.POST("/site_management/check/lua/prerule", func(c *gin.Context) {
+		luascript, _ := c.GetPostForm("s_luascript")
+		infoid, _ := c.GetPostForm("infoid")
+		code, _ := c.GetPostForm("s_code")
+		name, _ := c.GetPostForm("s_name")
+		extinfo := checkPreScript(code, name, infoid, luascript)
+		c.JSON(200, gin.H{"rep": extinfo})
+	})
+	//通用后置验证
+	Admin.GET("/site_management/check/lua/back", func(c *gin.Context) {
+		version := c.Query("version")
+		s_code := c.Query("s_code")
+		rule, _ := Mgo.FindOne("site_rule_back", `{"s_code":"`+s_code+`"}`)
+		(*rule)["_id"] = util.BsonIdToSId((*rule)["_id"])
+		c.HTML(200, "site_check_luaback.html", gin.H{"version": version, "code": s_code, "rule": &rule, "infos": getCheckInfos()})
+	})
+	Admin.POST("/site_management/check/lua/backrule", func(c *gin.Context) {
+		luascript, _ := c.GetPostForm("s_luascript")
+		infoid, _ := c.GetPostForm("infoid")
+		version, _ := c.GetPostForm("s_version")
+		code, _ := c.GetPostForm("s_code")
+		name, _ := c.GetPostForm("s_name")
+		extinfo := checkBackScript("site_rule_back", code, name, version, infoid, luascript, true)
+		c.JSON(200, gin.H{"rep": extinfo})
+	})
+	//抽取前置验证
+	Admin.GET("/site_management/check/lua/corepre", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		sid := c.Query("sid")
+		s_code := c.Query("s_code")
+		rule, _ := Mgo.FindOne("site_rule_logicpre", `{"s_code":"`+s_code+`"}`)
+		(*rule)["_id"] = util.BsonIdToSId((*rule)["_id"])
+		c.HTML(200,
+			"site_check_luacorepre.html",
+			gin.H{"code": s_code, "rule": &rule, "infos": getCheckInfos(),
+				"pid": pid, "vid": vid, "sid": sid},
+		)
+	})
+	Admin.POST("/site_management/check/lua/coreprerule", func(c *gin.Context) {
+		luascript, _ := c.GetPostForm("s_luascript")
+		infoid, _ := c.GetPostForm("infoid")
+		code, _ := c.GetPostForm("s_code")
+		name, _ := c.GetPostForm("s_name")
+		extinfo := checkPreScript(code, name, infoid, luascript)
+		c.JSON(200, gin.H{"rep": extinfo})
+	})
+	//抽取验证
+	Admin.GET("/site_management/check/lua/core", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		sid := c.Query("sid")
+		s_code := c.Query("s_code")
+		rule, _ := Mgo.FindOne("site_rule_logicore", `{"s_code":"`+s_code+`"}`)
+		(*rule)["_id"] = util.BsonIdToSId((*rule)["_id"])
+		c.HTML(200,
+			"site_check_luacore.html",
+			gin.H{"code": s_code, "rule": &rule, "infos": getCheckInfos(),
+				"pid": pid, "vid": vid, "sid": sid},
+		)
+	})
+	Admin.POST("/site_management/check/lua/corerule", func(c *gin.Context) {
+		luascript, _ := c.GetPostForm("s_luascript")
+		infoid, _ := c.GetPostForm("infoid")
+		code, _ := c.GetPostForm("s_code")
+		name, _ := c.GetPostForm("s_name")
+		extinfo := checkCoreScript(code, name, infoid, luascript)
+		c.JSON(200, gin.H{"rep": extinfo})
+	})
+	//抽取后置验证
+	Admin.GET("/site_management/check/lua/coreback", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		sid := c.Query("sid")
+		s_code := c.Query("s_code")
+		rule, _ := Mgo.FindOne("site_rule_logicback", `{"s_code":"`+s_code+`"}`)
+		(*rule)["_id"] = util.BsonIdToSId((*rule)["_id"])
+		c.HTML(200,
+			"site_check_luacoreback.html",
+			gin.H{"code": s_code, "rule": &rule, "infos": getCheckInfos(),
+				"pid": pid, "vid": vid, "sid": sid},
+		)
+	})
+
+	Admin.POST("/site_management/check/lua/corebackrule", func(c *gin.Context) {
+		luascript, _ := c.GetPostForm("s_luascript")
+		infoid, _ := c.GetPostForm("infoid")
+		code, _ := c.GetPostForm("s_code")
+		name, _ := c.GetPostForm("s_name")
+		vid, _ := c.GetPostForm("vid")
+		version, _ := Mgo.FindById("version", vid, `{"version":1}`)
+		extinfo := checkBackScript("rule_back", code, name, util.ObjToString((*version)["version"]), infoid, luascript, true)
+		c.JSON(200, gin.H{"rep": extinfo})
+	})
+	//清理逻辑脚本验证
+	Admin.GET("/site_management/check/lua/clearlogic", func(c *gin.Context) {
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		s_code := c.Query("s_code")
+		rule, _ := Mgo.FindOne("site_clearulelogic", `{"s_code":"`+s_code+`"}`)
+		(*rule)["_id"] = util.BsonIdToSId((*rule)["_id"])
+		c.HTML(200,
+			"site_check_luaclearlogic.html",
+			gin.H{"code": s_code, "rule": &rule, "infos": getCheckInfos(),
+				"pid": pid, "vid": vid},
+		)
+	})
+	Admin.POST("/site_management/check/lua/checkclearlua", func(c *gin.Context) {
+		luascript, _ := c.GetPostForm("s_luascript")
+		code, _ := c.GetPostForm("s_code")
+		name, _ := c.GetPostForm("s_name")
+		rid, _ := c.GetPostForm("rid")
+		resultcoll, _ := c.GetPostForm("resultcoll")
+		if rid == "" || resultcoll == "" {
+			c.JSON(200, gin.H{"rep": nil})
+		} else {
+			extinfo := checkClearScript(code, name, resultcoll, rid, luascript)
+			c.JSON(200, gin.H{"rep": extinfo})
+		}
+
+	})
+}
+
+//标签库列表
+func TagDataSite(c *gin.Context) {
+	version, _ := c.GetPostForm("version")
+	data, _ := Mgo.Find("site_tag", `{"s_version":"`+version+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+	for _, d := range *data {
+		timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
+		d["l_intime"] = timeStr
+	}
+	c.JSON(200, gin.H{"data": data})
+}
+
+//添加标签
+func TagSaveSite(c *gin.Context) {
+	tagname, _ := c.GetPostForm("tagname")
+	version, _ := c.GetPostForm("version")
+	username, _ := c.GetPostForm("username")
+	tp, _ := c.GetPostForm("tp")
+	data, _ := Mgo.FindOne("site_tag", `{"s_tagname":"`+tagname+`","s_version":"`+version+`","delete":false}`)
+	if len(*data) > 0 { //判重,防止添加name相同的标签
+		c.JSON(200, gin.H{"rep": false})
+		return
+	}
+	save := map[string]interface{}{
+		"s_tagname": tagname,
+		"s_version": version,
+		"s_creater": username,
+		"s_type":    tp,
+		"l_intime":  time.Now().Unix(),
+		"delete":    false,
+	}
+	b := Mgo.Save("site_tag", save)
+	if b != "" {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+//删除标签
+func TagDelSite(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Update("site_tag", `{"_id":"`+_id+`"}`, map[string]interface{}{
+		"$set": map[string]interface{}{"delete": true},
+	}, false, false)
+	data, _ := Mgo.Find("site_tagdetailinfo", `{"s_parentid":"`+_id+`"}`, `{"_id":-1}`, nil, false, -1, -1)
+	if len(*data) > 0 { //删除父标签下所有详细标签
+		for _, d := range *data {
+			cid := d["_id"].(bson.ObjectId).Hex()
+			//Mgo.Del("tagdetailinfo", `{"_id":"`+cid+`"}`)
+			Mgo.Update("site_tagdetailinfo", `{"_id":"`+cid+`"}`, map[string]interface{}{
+				"$set": map[string]interface{}{"delete": true},
+			}, false, false)
+		}
+	}
+	if b {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+//查找某个tag的信息
+func OneTagDataSite(c *gin.Context) {
+	version, _ := c.GetPostForm("version")
+	parentid, _ := c.GetPostForm("parentid")
+	data, _ := Mgo.Find("site_tagdetailinfo", `{"s_version":"`+version+`","s_parentid":"`+parentid+`","delete":false}`, `{"_id":-1}`, nil, false, -1, -1)
+	for _, d := range *data {
+		timeStr := time.Unix(d["l_intime"].(int64), 0).Format(Date_Short_Layout)
+		d["l_intime"] = timeStr
+	}
+	c.JSON(200, gin.H{"data": data})
+}
+
+//添加详细标签
+func OneTagCreateSite(c *gin.Context) {
+	name, _ := c.GetPostForm("name")
+	version, _ := c.GetPostForm("version")
+	parentid, _ := c.GetPostForm("parentid")
+	data, _ := Mgo.FindOne("site_tagdetailinfo", `{"s_name":"`+name+`","s_parentid":"`+parentid+`","s_version":"`+version+`","delete":false}`)
+	if len(*data) > 0 { //判重
+		c.JSON(200, gin.H{"rep": false})
+		return
+	}
+	tp, _ := c.GetPostForm("tp")
+	field, _ := c.GetPostForm("field")
+	content, _ := c.GetPostForm("content")
+	username, _ := c.GetPostForm("username")
+	pratagname, _ := c.GetPostForm("pratagname")
+	var jsondata interface{}
+	err := json.Unmarshal([]byte(content), &jsondata)
+	if err != nil { //不是json格式
+		c.JSON(200, gin.H{"rep": false})
+		return
+	}
+	save := make(map[string]interface{})
+	save = map[string]interface{}{
+		"s_pratagname": pratagname,
+		"s_name":       name,
+		"s_field":      field,
+		"s_version":    version,
+		"s_creater":    username,
+		"s_type":       tp,
+		"l_intime":     time.Now().Unix(),
+		"content":      jsondata,
+		"s_parentid":   parentid,
+		"delete":       false,
+	}
+	b := Mgo.Save("site_tagdetailinfo", save)
+	if b != "" {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+//删除某个详细标签
+func OneTagDelSite(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Update("site_tagdetailinfo", `{"_id":"`+_id+`"}`, map[string]interface{}{
+		"$set": map[string]interface{}{"delete": true},
+	}, false, false)
+	if b {
+		c.JSON(200, gin.H{"rep": true})
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+//修改某个详细标签
+func OneTagEditSaveSite(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	content, _ := c.GetPostForm("content")
+	var jsondata interface{}
+	err := json.Unmarshal([]byte(content), &jsondata)
+	if err != nil { //不是json格式
+		c.JSON(200, gin.H{"rep": false})
+		return
+	}
+	set := make(map[string]interface{})
+	set["content"] = jsondata
+	if jsondata != nil {
+		b := Mgo.Update("site_tagdetailinfo", `{"_id":"`+_id+`"}`, map[string]interface{}{"$set": set}, false, false)
+		if b {
+			c.JSON(200, gin.H{"rep": true})
+		} else {
+			c.JSON(200, gin.H{"rep": false})
+		}
+	} else {
+		c.JSON(200, gin.H{"rep": false})
+	}
+}
+
+//根据id查找某个标签
+func OneTagSearchSite(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	data, _ := Mgo.FindOne("site_tagdetailinfo", `{"_id":"`+_id+`"}`)
+	c.JSON(200, gin.H{"data": data})
+}
+
+var sysn sync.RWMutex
+func getSyncIndex(code string) string {
+	tmp := ""
+	sysn.Lock()
+	Mgo.Update("site_rule_code", `{"code":"`+code+`"}`, bson.M{"$inc": bson.M{"index": 1}}, true, false)
+	data, _ := Mgo.FindOne("site_rule_code", `{"code":"`+code+`"}`)
+	sysn.Unlock()
+	if len(*data) > 0 {
+		tmp = code + "_" + fmt.Sprint((*data)["index"])
+	}
+	return tmp
+}

+ 35 - 13
src/jy/admin/version.go

@@ -55,6 +55,7 @@ func init() {
 			} else {
 				s_pversionid, _ := c.GetPostForm("s_pversionid")
 				iscopyfiled, _ := data["iscopyfiled"].(bool)
+				iscopysite, _ := data["iscopysite"].(bool)
 				data["l_createtime"] = time.Now().Unix()
 				s_username := sessions.Default(c).Get("username").(string)
 				data["s_username"] = s_username
@@ -63,6 +64,9 @@ func init() {
 				if s_pversionid != "" {
 					copyComRules(version, s_pversionid, s_username)
 				}
+				if iscopysite{
+					scopySites()
+				}
 				if iscopyfiled {
 					list, _ := Mgo.Find("versioninfo", `{"vid":"`+s_pversionid+`","delete":false}`, nil, nil, false, -1, -1)
 					for _, v := range *list {
@@ -75,7 +79,7 @@ func init() {
 						pid := Mgo.Save("versioninfo", v)
 						s_field := qu.ObjToString(v["s_field"])
 						//克隆属性配置
-						copyFieldRules(vid, pid, s_field, s_pversionid, s_username)
+						copyFieldRules(vid, pid, s_field, s_pversionid, s_username,false)
 					}
 					//克隆分包属性
 					list2, _ := Mgo.Find("pkg_info", `{"vid":"`+s_pversionid+`","delete":false}`, nil, nil, false, -1, -1)
@@ -178,7 +182,7 @@ func init() {
 				pid := Mgo.Save("versioninfo", data)
 				fromvid, _ := data["s_pversionid"].(string)
 				if fromvid != "" {
-					copyFieldRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string))
+					copyFieldRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string),false)
 				}
 				c.JSON(200, gin.H{"rep": true})
 			}
@@ -194,7 +198,7 @@ func init() {
 		_id, _ := c.GetPostForm("_id")
 		b := Mgo.UpdateById("versioninfo", _id, `{"$set":{"delete":true}}`)
 		v, _ := Mgo.FindById("versioninfo", _id, `{"vid":1}`)
-		go DelLogic(qu.ObjToString((*v)["vid"]), _id)
+		go DelLogic(qu.ObjToString((*v)["vid"]), _id,false)
 		//b := Mgo.Del("versioninfo", `{"_id":"`+_id+`"}`)
 		c.JSON(200, gin.H{"rep": b})
 	})
@@ -579,11 +583,25 @@ func copyPkgRules(vid, pid, s_field, oldvid, s_username string) {
 }
 
 //克隆版本Field
-func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
-	tmp, _ := Mgo.FindOne("versioninfo", `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
+func copyFieldRules(vid, pid, s_field, oldvid, s_username string,isSite bool) {
+	var versioninfo,rule_logic,rule_logicpre,rule_logicore,rule_logicback string
+	if isSite{
+		versioninfo = "site_versioninfo"
+		rule_logic = "site_rule_logic"
+		rule_logicpre = "site_rule_logicpre"
+		rule_logicore = "site_rule_logicore"
+		rule_logicback = "site_rule_logicback"
+	}else {
+		versioninfo = "versioninfo"
+		rule_logic = "rule_logic"
+		rule_logicpre = "rule_logicpre"
+		rule_logicore = "rule_logicore"
+		rule_logicback = "rule_logicback"
+	}
+	tmp, _ := Mgo.FindOne(versioninfo, `{"vid":"`+oldvid+`","s_field":"`+s_field+`","delete":false}`)
 	oldpid := qu.BsonIdToSId((*tmp)["_id"])
 	//克隆逻辑列表
-	logicList, _ := Mgo.Find("rule_logic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
+	logicList, _ := Mgo.Find(rule_logic, `{"vid":"`+oldvid+`","pid":"`+oldpid+`","delete":false}`, `{"_id":1}`, nil, false, -1, -1)
 	for _, logic := range *logicList {
 		if len(logic) > 0 {
 			oldsid := qu.BsonIdToSId(logic["_id"])
@@ -593,9 +611,9 @@ func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
 			logic["l_createtime"] = time.Now().Unix()
 			logic["l_lasttime"] = time.Now().Unix()
 			logic["s_username"] = s_username
-			sid := Mgo.Save("rule_logic", logic)
+			sid := Mgo.Save(rule_logic, logic)
 			//克隆前置规则
-			plist, _ := Mgo.Find("rule_logicpre", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
+			plist, _ := Mgo.Find(rule_logicpre, `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
 			for _, v := range *plist {
 				delete(v, "_id")
 				v["vid"] = vid
@@ -605,10 +623,10 @@ func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
 				v["s_username"] = s_username
 				v["l_createtime"] = time.Now().Unix()
 				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("rule_logicpre", v)
+				Mgo.Save(rule_logicpre, v)
 			}
 			//克隆抽取规则
-			elist, _ := Mgo.Find("rule_logicore", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
+			elist, _ := Mgo.Find(rule_logicore, `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
 			for _, v := range *elist {
 				delete(v, "_id")
 				v["vid"] = vid
@@ -618,10 +636,10 @@ func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
 				v["s_username"] = s_username
 				v["l_createtime"] = time.Now().Unix()
 				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("rule_logicore", v)
+				Mgo.Save(rule_logicore, v)
 			}
 			//克隆过滤规则
-			blist, _ := Mgo.Find("rule_logicback", `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
+			blist, _ := Mgo.Find(rule_logicback, `{"sid":"`+oldsid+`","delete":false}`, nil, nil, false, -1, -1)
 			for _, v := range *blist {
 				delete(v, "_id")
 				v["vid"] = vid
@@ -631,7 +649,7 @@ func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
 				v["s_username"] = s_username
 				v["l_createtime"] = time.Now().Unix()
 				v["l_lasttime"] = time.Now().Unix()
-				Mgo.Save("rule_logicback", v)
+				Mgo.Save(rule_logicback, v)
 			}
 		}
 	}
@@ -656,6 +674,10 @@ func copyClearRuleLogic(vid, pid, s_field, oldvid, s_username string) {
 
 }
 
+func scopySites()  {
+	
+}
+
 //获取代码
 func getCode(code string) string {
 	tmps := strings.Split(code, "_")

+ 1 - 1
src/jy/clear/tonumber.go

@@ -104,7 +104,7 @@ func ObjToMoney(data []interface{}) []interface{} {
 
 //数字金额转换
 func numMoney(data []interface{}) ([]interface{}, bool) {
-	tmp := fmt.Sprint(data[0])
+	tmp := fmt.Sprintf("%f",data[0])
 	repUnit := float64(1)
 	if regQianw.MatchString(tmp) {
 		tmp = strings.Replace(tmp, "千万", "万", -1)

+ 7 - 2
src/jy/extract/extpackage.go

@@ -82,6 +82,9 @@ func PackageDetail(j *ju.Job, e *ExtractTask) {
 		if len(j.BlockPackage) > 0 {
 			tmpkeys := []string{}
 			for k, _ := range j.BlockPackage {
+				if k == ""{
+					continue
+				}
 				tmpkeys = append(tmpkeys, k)
 			}
 			sort.Strings(tmpkeys)
@@ -110,8 +113,10 @@ func PackageDetail(j *ju.Job, e *ExtractTask) {
 							}
 							sonJobResult["winnerorder"] = wins
 						}
-						sonJobResult["bidamount"] = j.Winnerorder[i]["price"]
-						sonJobResult["winner"] = wins[0]["entname"]
+						if len(wins) >0{
+							sonJobResult["bidamount"] = wins[0]["price"]
+							sonJobResult["winner"] = wins[0]["entname"]
+						}
 					} else {
 						if len(j.Winnerorder) > 0 {
 							sonJobResult["bidamount"] = j.Winnerorder[0]["price"]

+ 2 - 2
src/jy/extract/score_jsondata.go

@@ -28,7 +28,7 @@ func JsonDataMergeProcessing(j *util.Job, e *ExtractTask) map[string][]*util.Ext
 				lockclear.Lock()
 				cfn := e.ClearFn[v]
 				lockclear.Unlock()
-				newNum := clear.DoClearFn(cfn, []interface{}{fmt.Sprint((*j.Jsondata)[v]), ""})
+				newNum := clear.DoClearFn(cfn, []interface{}{util2.Float64All((*j.Jsondata)[v]), ""})
 				if util2.IntAll(newNum[0]) != 0 {
 					extFields := make([]*util.ExtField, 0)
 					extFields = append(extFields, &util.ExtField{Code: "JsonData_" + v, Field: v, ExtFrom: "JsonData_" + v, SourceValue: (*j.Jsondata)[v], Value: newNum[0], Score: 0.1})
@@ -50,7 +50,7 @@ func JsonDataMergeProcessing(j *util.Job, e *ExtractTask) map[string][]*util.Ext
 				lockclear.Lock()
 				cfn := e.ClearFn[v]
 				lockclear.Unlock()
-				newNum := clear.DoClearFn(cfn, []interface{}{fmt.Sprint((*j.Jsondata)[v]), ""})
+				newNum := clear.DoClearFn(cfn, []interface{}{util2.Float64All((*j.Jsondata)[v]), ""})
 				if util2.IntAll(newNum[0]) != 0 {
 					extFields := make([]*util.ExtField, 0)
 					extFields = append(extFields, &util.ExtField{Code: "JsonData_" + v, Field: v, ExtFrom: "JsonData_" + v, SourceValue: (*j.Jsondata)[v], Value: newNum[0], Score: 0.1})

+ 5 - 1
src/jy/pretreated/analystep.go

@@ -88,8 +88,12 @@ func processTableInBlock(bl *util.Block, job *util.Job, packageFlag bool) {
 	tabs, _ := ComputeConRatio(bl.Text, 2)
 	for _, tab := range tabs {
 		job.HasTable = 1
+		tmptag := ""
+		if tab.Nodes[0] != nil && tab.Nodes[0].PrevSibling != nil{
+			tmptag = strings.TrimSpace(tab.Nodes[0].PrevSibling.Data)
+		}
 		//添加标识:文本中有table
-		tabres := AnalyTableV2(tab, job.Category, strings.TrimSpace(tab.Nodes[0].PrevSibling.Data), tab.Text(), 2, job.SourceMid, job.RuleBlock) //解析表格入口 返回:汇总表格对象
+		tabres := AnalyTableV2(tab, job.Category, tmptag, tab.Text(), 2, job.SourceMid, job.RuleBlock) //解析表格入口 返回:汇总表格对象
 		if packageFlag {
 			tabres.PackageMap = nil
 			tabres.IsMultiPackage = false

+ 3 - 0
src/jy/pretreated/analytable.go

@@ -227,6 +227,9 @@ func (table *Table) KVFilter() {
 			if k == "2、建设规模" {
 				k = "预算"
 			}
+			if k == `中标价(万元)\费率(%)`{
+				k = "中标价(万元)"
+			}
 			kvTags, tag := CommonDataAnaly(k, table.Tag, table.Desc, v) //对key标准化处理,没有找到会走中标
 			//qutil.Debug(k, v, k1, w1, v1, tag, b)
 			if tag != "" && table.Tag == "" {

+ 3 - 3
src/web/templates/admin/rule_logiclist.html

@@ -79,9 +79,9 @@ $(function () {
 			}},
 			{"data":"_id","width":"25%",render:function(val,a,row){
 				tmp = '<div class="btn-group">'+
-					'<a class="btn btn-sm btn-primary" href="/admin/logicpre?vid='+{{.vid}}+'&pid='+{{.pid}}+'&sid='+row._id+'">前置规则</a>'+
-					'<a class="btn btn-sm btn-success" href="/admin/logicore?vid='+{{.vid}}+'&pid='+{{.pid}}+'&sid='+row._id+'">抽取规则</a>'+
-					'<a class="btn btn-sm btn-info" href="/admin/logicback?vid='+{{.vid}}+'&pid='+{{.pid}}+'&sid='+row._id+'">后置规则</a>'+
+					'<a class="btn btn-sm btn-primary" href="/admin/logicpre?vid={{.vid}}&pid={{.pid}}&sid='+row._id+'">前置规则</a>'+
+					'<a class="btn btn-sm btn-success" href="/admin/logicore?vid={{.vid}}&pid={{.pid}}&sid='+row._id+'">抽取规则</a>'+
+					'<a class="btn btn-sm btn-info" href="/admin/logicback?vid={{.vid}}&pid={{.pid}}&sid='+row._id+'">后置规则</a>'+
 					'</div>';
 				return  tmp
 			}},

+ 83 - 0
src/web/templates/admin/site_check_luaback.html

@@ -0,0 +1,83 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<ol class="breadcrumb">
+		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li><a href="/admin/site_management/ruleback?version={{.version}}">后置过滤</a></li>
+		  <li class="active"><a href="/admin/site_management/check/lua/back?version={{.version}}&s_code={{.code}}">{{.code}}</a></li>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content"><br/>
+    	<form id="dataform" class="form-horizontal">
+			<div class="form-group">
+				<div class="col-sm-12">
+					<select name="infoid" class="form-control">
+	                	<option value="">请选择测试信息</option>
+						{{if .rule.infoid}}
+							{{$ruleid := .rule.infoid}}
+							{{range .infos}}
+								<option value="{{._id}}" {{if eq ._id $ruleid}} selected {{end}}>{{.title}}</option>
+							{{end}}
+						{{else}}
+							{{range .infos}}
+								<option value="{{._id}}">{{.title}}</option>
+							{{end}}
+						{{end}}
+	              	</select>
+				</div>
+				<label for="code" class="col-sm-1 control-label">代码: {{.rule.s_code}}</label>
+			    <label for="code" class="col-sm-3 control-label">名称: {{.rule.s_name}}</label>
+			</div>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="s_luascript" name="s_luascript">{{.rule.s_luascript}}</textarea>
+			</fieldset>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="result" style="height:400px;width:100%"></textarea>
+			</fieldset>
+			<input type="hidden" name="_id" value="{{.rule._id}}">
+			<input type="hidden" name="s_code" value="{{.rule.s_code}}">
+			<input type="hidden" name="s_name" value="{{.rule.s_name}}">
+			<input type="hidden" name="s_version" value="{{.rule.s_version}}">
+		</form>
+		
+		<h1><div class="btn-center">
+			<button type="button" class="btn btn-success" onclick="check()">测试</button>
+			<button type="button" class="btn btn-primary" onclick="save()">保存</button>
+		</div></h1>
+</section>
+
+</div>
+{{template "luares"}}
+{{template "footer"}}
+<script>
+com.initMirror(400)
+menuActive("version")
+function check(){
+	$.post("/admin/site_management/check/lua/backrule",
+		com.serializeArray("dataform"), 
+		function(r) {
+			if(r.rep){				
+				$("#result").html(JSON.stringify(r.rep, null, 2)) 
+			}
+		}
+	);
+}
+function save(){
+	$.post("/admin/site_management/ruleback/save",
+		com.serializeArray("dataform"),
+		function(r){
+			if(r){
+				showTip("保存成功",1000)
+			}
+		}
+	);
+}
+</script>
+

+ 96 - 0
src/web/templates/admin/site_check_luaclearlogic.html

@@ -0,0 +1,96 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<ol class="breadcrumb">
+		  <li><a href="/admin/versionclear"><i class="fa fa-dashboard"></i>清理版本</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+		  <li>清理逻辑</li>
+		 <li class="active"><a href="/admin/site_management/check/lua/clearlogic?vid={{.vid}}&pid={{.pid}}&s_code={{.code}}">{{.code}}</a></li>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content"><br/>
+    	<form id="dataform" class="form-horizontal">
+			<div class="form-group">
+				<div class="col-sm-12">
+					<div class="col-sm-4">
+						<div class="row form-group">
+							<label for="lastname" class="col-sm-3 control-label">结果表:</label>
+							<div class="col-sm-8">
+								<input type="text" name="resultcoll" class="form-control" must="true">
+							</div>
+						</div>
+					</div>
+					<div class="col-sm-4">
+						<div class="row form-group">
+							<label for="lastname" class="col-sm-2 control-label">id:</label>
+							<div class="col-sm-8">
+								<input type="text" name="rid" class="form-control" must="true">
+							</div>
+						</div>
+					</div>
+					<!--<div class="col-sm-4">
+						<div class="row form-group">
+							<label for="lastname" class="col-sm-3 control-label">合并表:</label>
+							<div class="col-sm-8">
+								<input type="text" name="projectset" class="form-control" must="true">
+							</div>
+						</div>
+					</div>-->
+				</div>
+				<label for="code" class="col-sm-1 control-label">代码: {{.rule.s_code}}</label>
+			    <label for="code" class="col-sm-3 control-label">名称: {{.rule.s_name}}</label>
+			</div>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="s_luascript" name="s_luascript">{{.rule.s_luascript}}</textarea>
+			</fieldset>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="result" style="height:400px;width:100%"></textarea>
+			</fieldset>
+			<input type="hidden" name="_id" value="{{.rule._id}}">
+			<input type="hidden" name="s_code" value="{{.rule.s_code}}">
+			<input type="hidden" name="s_name" value="{{.rule.s_name}}">
+		</form>
+		
+		<h1><div class="btn-center">
+			<button type="button" class="btn btn-success" onclick="check()">测试</button>
+			<button type="button" class="btn btn-primary" onclick="save()">保存</button>
+		</div></h1>
+</section>
+
+</div>
+{{template "luares"}}
+{{template "footer"}}
+<script>
+com.initMirror(400)
+menuActive("versionclear")
+function check(){
+	$.post("/admin/site_management/check/lua/checkclearlua",
+		com.serializeArray("dataform"), 
+		function(r) {
+			if(r.rep){	
+				$("#result").html(JSON.stringify(r.rep, null, 2)) 
+			}else{
+				showTip("表单信息填写错误!",1000)
+			}
+		}
+	);
+}
+function save(){
+	$.post("/admin/site_management/clearulelogic/save",
+		com.serializeArray("dataform"),
+		function(r){
+			if(r){
+				showTip("保存成功",1000)
+			}
+		}
+	);
+}
+</script>
+

+ 84 - 0
src/web/templates/admin/site_check_luacore.html

@@ -0,0 +1,84 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<ol class="breadcrumb">
+		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+		  <li>抽取逻辑</li>
+		  <li>抽取规则</li>
+		  <li class="active"><a href="/admin/site_management/check/lua/core?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}&s_code={{.code}}">{{.code}}</a></li>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content"><br/>
+    	<form id="dataform" class="form-horizontal">
+			<div class="form-group">
+				<div class="col-sm-12">
+					<select name="infoid" class="form-control">
+	                	<option value="">请选择测试信息</option>
+						{{if .rule.infoid}}
+							{{$ruleid := .rule.infoid}}
+							{{range .infos}}
+								<option value="{{._id}}" {{if eq ._id $ruleid}} selected {{end}}>{{.title}}</option>
+							{{end}}
+						{{else}}
+							{{range .infos}}
+								<option value="{{._id}}">{{.title}}</option>
+							{{end}}
+						{{end}}
+	              	</select>
+				</div>
+				<label for="code" class="col-sm-1 control-label">代码: {{.rule.s_code}}</label>
+			    <label for="code" class="col-sm-3 control-label">名称: {{.rule.s_name}}</label>
+			</div>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="s_luascript" name="s_luascript">{{.rule.s_luascript}}</textarea>
+			</fieldset>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="result" style="height:400px;width:100%"></textarea>
+			</fieldset>
+			<input type="hidden" name="_id" value="{{.rule._id}}">
+			<input type="hidden" name="s_code" value="{{.rule.s_code}}">
+			<input type="hidden" name="s_name" value="{{.rule.s_name}}">
+		</form>
+		
+		<h1><div class="btn-center">
+			<button type="button" class="btn btn-success" onclick="check()">测试</button>
+			<button type="button" class="btn btn-primary" onclick="save()">保存</button>
+		</div></h1>
+</section>
+
+</div>
+{{template "luares"}}
+{{template "footer"}}
+<script>
+com.initMirror(400)
+menuActive("version")
+function check(){
+	$.post("/admin/site_management/check/lua/corerule",
+		com.serializeArray("dataform"), 
+		function(r) {
+			if(r.rep){				
+				$("#result").html(JSON.stringify(r.rep, null, 2)) 
+			}
+		}
+	);
+}
+function save(){
+	$.post("/admin/site_management/logicore/save",
+		com.serializeArray("dataform"),
+		function(r){
+			if(r){
+				showTip("保存成功",1000)
+			}
+		}
+	);
+}
+</script>
+

+ 85 - 0
src/web/templates/admin/site_check_luacoreback.html

@@ -0,0 +1,85 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<ol class="breadcrumb">
+		 <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+		  <li>抽取逻辑</li>
+		  <li>后置规则</li>
+		  <li class="active"><a href="/admin/site_management/check/lua/coreback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}&s_code={{.code}}">{{.code}}</a></li>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content"><br/>
+    	<form id="dataform" class="form-horizontal">
+			<div class="form-group">
+				<div class="col-sm-12">
+					<select name="infoid" class="form-control">
+	                	<option value="">请选择测试信息</option>
+						{{if .rule.infoid}}
+							{{$ruleid := .rule.infoid}}
+							{{range .infos}}
+								<option value="{{._id}}" {{if eq ._id $ruleid}} selected {{end}}>{{.title}}</option>
+							{{end}}
+						{{else}}
+							{{range .infos}}
+								<option value="{{._id}}">{{.title}}</option>
+							{{end}}
+						{{end}}
+	              	</select>
+				</div>
+				<label for="code" class="col-sm-1 control-label">代码: {{.rule.s_code}}</label>
+			    <label for="code" class="col-sm-3 control-label">名称: {{.rule.s_name}}</label>
+			</div>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="s_luascript" name="s_luascript">{{.rule.s_luascript}}</textarea>
+			</fieldset>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="result" style="height:400px;width:100%"></textarea>
+			</fieldset>
+			<input type="hidden" name="_id" value="{{.rule._id}}">
+			<input type="hidden" name="s_code" value="{{.rule.s_code}}">
+			<input type="hidden" name="s_name" value="{{.rule.s_name}}">
+			<input type="hidden" name="vid" value="{{.vid}}">
+		</form>
+		
+		<h1><div class="btn-center">
+			<button type="button" class="btn btn-success" onclick="check()">测试</button>
+			<button type="button" class="btn btn-primary" onclick="save()">保存</button>
+		</div></h1>
+</section>
+
+</div>
+{{template "luares"}}
+{{template "footer"}}
+<script>
+com.initMirror(400)
+menuActive("version")
+function check(){
+	$.post("/admin/site_management/check/lua/corebackrule",
+		com.serializeArray("dataform"), 
+		function(r) {
+			if(r.rep){				
+				$("#result").html(JSON.stringify(r.rep, null, 2)) 
+			}
+		}
+	);
+}
+function save(){
+	$.post("/admin/site_management/logicback/save",
+		com.serializeArray("dataform"),
+		function(r){
+			if(r){
+				showTip("保存成功",1000)
+			}
+		}
+	);
+}
+</script>
+

+ 84 - 0
src/web/templates/admin/site_check_luacorepre.html

@@ -0,0 +1,84 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<ol class="breadcrumb">
+		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+		  <li>抽取逻辑</li>
+		  <li>前置规则</li>
+		  <li class="active"><a href="/admin/site_management/check/lua/corepre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}&s_code={{.code}}">{{.code}}</a></li>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content"><br/>
+    	<form id="dataform" class="form-horizontal">
+			<div class="form-group">
+				<div class="col-sm-12">
+					<select name="infoid" class="form-control">
+	                	<option value="">请选择测试信息</option>
+						{{if .rule.infoid}}
+							{{$ruleid := .rule.infoid}}
+							{{range .infos}}
+								<option value="{{._id}}" {{if eq ._id $ruleid}} selected {{end}}>{{.title}}</option>
+							{{end}}
+						{{else}}
+							{{range .infos}}
+								<option value="{{._id}}">{{.title}}</option>
+							{{end}}
+						{{end}}
+	              	</select>
+				</div>
+				<label for="code" class="col-sm-1 control-label">代码: {{.rule.s_code}}</label>
+			    <label for="code" class="col-sm-3 control-label">名称: {{.rule.s_name}}</label>
+			</div>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="s_luascript" name="s_luascript">{{.rule.s_luascript}}</textarea>
+			</fieldset>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="result" style="height:400px;width:100%"></textarea>
+			</fieldset>
+			<input type="hidden" name="_id" value="{{.rule._id}}">
+			<input type="hidden" name="s_code" value="{{.rule.s_code}}">
+			<input type="hidden" name="s_name" value="{{.rule.s_name}}">
+		</form>
+		
+		<h1><div class="btn-center">
+			<button type="button" class="btn btn-success" onclick="check()">测试</button>
+			<button type="button" class="btn btn-primary" onclick="save()">保存</button>
+		</div></h1>
+</section>
+
+</div>
+{{template "luares"}}
+{{template "footer"}}
+<script>
+com.initMirror(400)
+menuActive("version")
+function check(){
+	$.post("/admin/site_management/check/lua/coreprerule",
+		com.serializeArray("dataform"), 
+		function(r) {
+			if(r.rep){				
+				$("#result").html(JSON.stringify(r.rep, null, 2)) 
+			}
+		}
+	);
+}
+function save(){
+	$.post("/admin/site_management/logicpre/save",
+		com.serializeArray("dataform"),
+		function(r){
+			if(r){
+				showTip("保存成功",1000)
+			}
+		}
+	);
+}
+</script>
+

+ 82 - 0
src/web/templates/admin/site_check_luapre.html

@@ -0,0 +1,82 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+		  <li><a href="/admin/site_management/rulepre?version={{.version}}">前置逻辑</a></li>
+		  <li class="active"><a href="/admin/site_management/check/lua/pre?version={{.version}}&s_code={{.code}}">{{.code}}</a></li>
+		</ol>
+    </section>
+  <!-- Main content -->
+  <section class="content"><br/>
+    	<form id="dataform" class="form-horizontal">
+			<div class="form-group">
+				<div class="col-sm-12">
+					<select name="infoid" class="form-control">
+	                	<option value="">请选择测试信息</option>
+						{{if .rule.infoid}}
+							{{$ruleid := .rule.infoid}}
+							{{range .infos}}
+								<option value="{{._id}}" {{if eq ._id $ruleid}} selected {{end}}>{{.title}}</option>
+							{{end}}
+						{{else}}
+							{{range .infos}}
+								<option value="{{._id}}">{{.title}}</option>
+							{{end}}
+						{{end}}
+	              	</select>
+				</div>
+				<label for="code" class="col-sm-1 control-label">代码: {{.rule.s_code}}</label>
+			    <label for="code" class="col-sm-3 control-label">名称: {{.rule.s_name}}</label>
+			</div>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="s_luascript" name="s_luascript">{{.rule.s_luascript}}</textarea>
+			</fieldset>
+			<fieldset class="col-sm-6" data-mode="expert">
+				<textarea id="result" style="height:400px;width:100%"></textarea>
+			</fieldset>
+			<input type="hidden" name="_id" value="{{.rule._id}}">
+			<input type="hidden" name="s_code" value="{{.rule.s_code}}">
+			<input type="hidden" name="s_name" value="{{.rule.s_name}}">
+		</form>
+		
+		<h1><div class="btn-center">
+			<button type="button" class="btn btn-success" onclick="check()">测试</button>
+			<button type="button" class="btn btn-primary" onclick="save()">保存</button>
+		</div></h1>
+</section>
+
+</div>
+{{template "luares"}}
+{{template "footer"}}
+<script>
+com.initMirror(400)
+menuActive("version")
+function check(){
+	$.post("/admin/site_management/check/lua/prerule",
+		com.serializeArray("dataform"), 
+		function(r) {
+			if(r.rep){				
+				$("#result").html(JSON.stringify(r.rep, null, 2)) 
+			}
+		}
+	);
+}
+function save(){
+	$.post("/admin/site_management/rulepre/save",
+		com.serializeArray("dataform"),
+		function(r){
+			if(r){
+				showTip("保存成功",1000)
+			}
+		}
+	);
+}
+</script>
+

+ 231 - 0
src/web/templates/admin/site_clear.html

@@ -0,0 +1,231 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+	<link href="/res/doublebox/css/hdw.css" rel="stylesheet" type="text/css">
+	<script src="/res/doublebox/js/hdw.js"></script>
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><button type="button" class="btn btn-primary" data-toggle="modal" onclick='createOneClear("")'>新增函数清理</button></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i> 抽取版本</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+		  <li class="active"><a href="#">函数清理</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="clearTable" 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>
+<!--新增函数--> 
+<div class="modal fade" id="modal-info-addclear">
+  	<div class="modal-dialog">
+	    <form id="addclear-dataform" 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">函数清理信息</h4>
+		    </div>
+		    <div class="modal-body">
+		     	<div class="form-group">
+				    <label for="code" id="fieldname" class="col-sm-2 control-label">名称:</label>
+				    <div class="col-sm-10">
+					   	<select class="form-control" id="addfieldname"></select>
+					</div>
+				</div>
+				<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">版本:</label>
+				    <div class="col-sm-10">
+				      <input id="clearversion" type="text" value="{{.version}}" class="form-control" disabled>
+				    </div>
+				</div>
+				<div class="form-group">
+				   <label for="code" class="col-sm-2 control-label">清理:</label>
+				    <div class="col-sm-10" id="selectclear">
+						<div class="doublebox">
+							<select multiple="multiple" id="select1" style="overflow-x: scroll;"></select>
+						</div>
+						<div class="move">
+						 	<button type="button" id="up" class="btn btn-primary">上移</button>
+							<button type="button" id="right" class="btn btn-primary">右移</button>
+							<button type="button" id="left" class="btn btn-primary">左移</button>
+							<button type="button" id="down" class="btn btn-primary">下移</button>
+						</div>	
+						<div class="doublebox">
+						  	<select multiple="multiple" id="select2" style="overflow-x: scroll;"></select>
+						</div>
+				    </div>
+				</div>
+		    </div>
+		    <div class="modal-footer">
+		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
+		        <button type="button" class="btn btn-primary" onclick="addclearsave()">保存</button>
+	    	</div>
+		</div>
+	    <!-- /.modal-content -->
+	    </form>
+  	</div>
+  <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+menuActive("version")
+var field = {{.field}};
+var _id = "";
+//var clearArr = ["cutspace","cutallspace","cutSymbol","cutNotPrs","clearAllWord","clearMaxAmount","clearProjectName","toint","tofloat","totimestamp","tomoney","getcurrency","getrate","getPhone","rateToFloat"]; 
+var clearMap = {"中文符号转英文":"chiToEng","去除首尾空格":"cutspace","去除所有空格":"cutallspace","清理符号":"cutSymbol","清理不成对符号后面的内容":"cutNotPrs","清理全部是汉字或者特殊符号的情况":"clearAllWord","过滤大于1万亿":"clearMaxAmount","清理项目名称":"clearProjectName","转int":"toint","转float":"tofloat","转时间戳":"totimestamp","转换金额":"tomoney","获取币种":"getcurrency","获取汇率":"getrate","取手机号":"getPhone","费率转小数":"rateToFloat","处理较长采购联系人":"clearBuyerPerson"}
+$(function () {
+	ttableclear=$('#clearTable').DataTable({
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"paging"	  : true,
+		
+		"ajax": {
+			"url": "/admin/site_management/clear/data",
+			"type": "post",
+			"data":{"version":{{ .version}} }
+		 },
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_name"},
+			{ "data": "s_version"},
+			{ "data": "s_creater"},
+			{ "data": "l_intime"},
+			{ "data": "clearInfo"},
+			{ "data": "_id",render:function(val,a,row){
+				return  "<a href='#' onclick=\"editclear('"+val+"','"+row["s_name"]+"','"+row["clearInfo"]+"')\"><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+						"<a href='#' onclick=\"delclear('"+val+"')\"><i class='fa fa-fw fa-trash text-red'></i></a>"
+			}}
+       	]
+	});
+})
+
+//创建标签
+function createOneClear(){
+	_id = "";
+	$("#addfieldname").removeAttr("disabled");
+	$("#addfieldname").empty();
+	$("#select1").empty();
+	$("#select2").empty();
+	$("#addfieldname").append("<option value=''>--请选择--</option>");
+	for(var i in field){
+		if(field[i]["s_name"] != ""){
+			$("#addfieldname").append("<option value='"+field[i]["s_name"]+"+"+field[i]["s_field"]+"'>"+field[i]["s_name"]+"</option>");
+		}
+	}
+	for(var i in clearMap){
+		$("#select1").append("<option title='"+i+"' value='"+i+"+"+clearMap[i]+"'>"+i+"</option>");
+		//$("#select1").append("<option value='"+clearArr[i]+"'>"+clearArr[i]+"</option>");
+	}
+	$("#modal-info-addclear").modal("show");
+}
+
+//保存
+function addclearsave(){
+	var fieldname = $("#addfieldname").val();
+	var version = $("#clearversion").val();
+	var clearArr = [];
+	$("#select2 option").each(function(i,val){
+		clearArr[i] = this.value
+	})
+	var clearJsonStr = JSON.stringify(clearArr)
+	if(fieldname == "" || clearJsonStr == ""){
+		alert("表单填写不完整!");
+		return false;
+	}
+	$.ajax({
+		url:"/admin/site_management/clear/save",
+		type:"post",
+		data:{"_id":_id,"fieldname":fieldname,"version":version,"clearJsonStr":clearJsonStr,"username":{{index (session "user") "name" }}},
+		success:function(r){
+			if(r.rep){
+				$("#addclear-dataform")[0].reset();
+				$("#modal-info-addclear").modal("hide");
+				ttableclear.ajax.reload();
+			}else{
+				$("#addclear-dataform")[0].reset();
+				$("#modal-info-addclear").modal("hide");
+				alert("保存失败");
+			}
+		}
+	})
+}
+
+//删除
+function delclear(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/clear/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					ttableclear.ajax.reload();
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+
+//编辑
+function editclear(id,name,clearInfo){
+	_id = id; 
+	$("#addfieldname").empty();
+	$("#select1").empty();
+	$("#select2").empty();
+	$("#addfieldname").append("<option value='"+name+"'>"+name+"</option>");
+	$("#addfieldname").attr("disabled",true);
+	var clearData = clearInfo.split(",");
+	for(var i in clearMap){
+		var flag = true;
+		for(var j in clearData){
+			if(i == clearData[j]){
+				$("#select2").append("<option title='"+i+"' value='"+i+"+"+clearMap[i]+"'>"+i+"</option>");
+				flag = false;
+			}
+		}
+		if(flag){
+			$("#select1").append("<option title='"+i+"' value='"+i+"+"+clearMap[i]+"'>"+i+"</option>");
+		}
+	}
+	$("#modal-info-addclear").modal("show");
+}
+
+</script>

+ 323 - 0
src/web/templates/admin/site_management.html

@@ -0,0 +1,323 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<link href="../res/doublebox/css/hdw.css" rel="stylesheet" type="text/css">
+<style>.myred {
+        color: red;
+    }</style>
+<script src="../res/doublebox/js/hdw.js"></script>
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+
+    <section class="content-header">
+        <h1>
+            {{/*<small><a class="btn btn-primary opr" opr="new">新增版本</a></small>*/}}
+            <small>
+                <button type="button" class="btn btn-primary" data-toggle="modal" onclick='createOneVersion("")'>新增站点
+                </button>
+            </small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+            <li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</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>
+                                <th>站点操作</th>
+                            </tr>
+
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+<!--新增函数-->
+<div class="modal fade" id="modal-info-version">
+    <div class="modal-dialog">
+        <form id="dataform" 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" id="version_title">新增站点</h4>
+                </div>
+                <div class="modal-body">
+                    <input name="name" id="vid" type="hidden" value={{.vid}}>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label myred">站点名称:</label>
+                        <div class="col-sm-10">
+                            <input name="name" type="text" id="site_name" value="" class="form-control"
+                                   placeholder="站点名称">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label myred">描述:</label>
+                        <div class="col-sm-10">
+                            <input name="name" type="text" id="site_descript" value="" class="form-control"
+                                   placeholder="描述信息">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" id="fieldname" class="col-sm-2 control-label myred">网址:</label>
+                        <div class="col-sm-10">
+                            <input name="name" type="text" id="site_href" value="" class="form-control"
+                                   placeholder="网址信息">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" id="fieldname" class="col-sm-2 control-label myred">脚本集:</label>
+                        <div class="col-sm-10">
+                            <input name="name" type="text" id="site_script" value="" class="form-control"
+                                   placeholder="脚本号,多个以','号分割">
+                        </div>
+                    </div>
+                    <div class="form-group ckbox">
+                        <label for="code" id="fieldname" class="col-sm-2 control-label myred">启用:</label>
+                        <div class="col-sm-10">
+                            <input id="isuse" name="isuse" type="radio" checked="checked" value="true"><label  for="isuse">启用</label>
+                            <input id="isuse" name="isuse" type="radio" value="false"><label  for="isuse">停用</label>
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default cancel" data-dismiss="modal" onclick="reset()">取消
+                    </button>
+                    <button type="button" class="btn btn-primary save" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+            <input type="hidden" id="_id" value="">
+        </form>
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- footer -->
+{{template "dialog"}}
+{{template "footer"}}
+
+<script>
+    menuActive("version")
+    var vid = $("#vid").val();//版本id
+    $(function () {
+        ttable = $('#dataTable').DataTable({
+            "paging": false,
+            "lengthChange": false,
+            "searching": true,
+            "ordering": false,
+            "info": true,
+            "autoWidth": false,
+            "ajax": {
+                "url": "/admin/site_management/dataForVid?vid=" + vid,
+                "type": "post",
+                "data": {}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                {"data": "site_name"},
+                {"data": "site_descript", "text-overflow": "ellipsis"},
+                {
+                    "data": "site_href", render: function (val, a, row) {
+                        return '<a href=' + val + '   target=' + val + '>' + val + '</a>'
+                    }
+                },
+                {"data": "site_script"},
+                {
+                    "data": "isuse", "width": "7%", render: function (val, a, row) {
+                        tmp = ""
+                        if (val) {
+                            tmp = "<a  title='停用' onclick='use(\"" + row._id + "\"," + false + ")'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+                        } else {
+                            tmp = "<a  title='启用' onclick='use(\"" + row._id + "\"," + true + ")'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+                        }
+                        return tmp
+                    }
+                },
+                {
+                    "data": "_id", render: function (val, a, row) {
+                        tmp = '<div class="btn-group">' +
+                            '<a class="btn btn-sm btn-success" href="/admin/site_management/info?vid=' + row.vid + '&pid='+row._id+'" >属性</a>' +
+                            '<a class="btn btn-sm btn-info" href="/admin/site_management/ruleback?version=' + row.version + '&vid='+row.vid+'&pid='+row._id+'">后置规则</a>' +
+                            '<a class="btn btn-sm btn-warning" href="/admin/site_management/tag?version=' + row.version + '&vid='+row.vid+'&pid='+row._id+'">标签库</a>' +
+                            '<a class="btn btn-sm btn-danger" href="/admin/site_management/clear?version=' + row.version + '&vid='+row.vid+'&pid='+row._id+'">函数清理</a>' +
+                            '</div>';
+                        return tmp
+                    }
+                },
+                {
+                    "data": "_id", render: function (val, a, row) {
+                        tmp_id = row._id
+                        tmp = '<div class="btn-group">' +
+                            '<button  class="btn btn-sm btn-primary "  onclick="edit_table_btn(\'' + tmp_id + '\');"  value=' + row._id + ' >编&nbsp;&nbsp;辑</button > &nbsp;' +
+                            '<button  class="btn btn-sm btn-danger" onclick="delete_table_btn(\'' + tmp_id + '\');"  value=' + row._id + ' >删除站点</button > &nbsp;' +
+                            '</div>';
+                        return tmp
+                    }
+                }
+            ]
+        });
+
+    })
+
+    //创建标签
+    function createOneVersion() {
+        _id = "";
+        $("#version_title").html("新增站点");
+        $("#_id").val("");
+        $("#site_name").val("");
+        $("#site_descript").val("");
+        $("#site_href").val("");
+        $("#site_script").val("");
+        $("#modal-info-version").modal("show");
+    }
+
+    //保存
+    function save() {
+        var _id = $("#_id").val();//版本id
+        var vid = $("#vid").val();//版本id
+        var site_name = $("#site_name").val();//站点名称
+        var site_descript = $("#site_descript").val();//站点描述
+        var site_href = $("#site_href").val()//站点网址
+        var site_script = $("#site_script").val()//站点脚本
+        var isuse = $("input[name='isuse']:checked").val();
+        if (site_name == "" || site_href == "" || site_script == "") {
+            alert("站点填写不完整!");
+            return false;
+        }
+/*
+        console.log({
+            "_id": _id,
+            "site_name": site_name,
+            "site_descript": site_descript,
+            "site_href": site_href,
+            "site_script": site_script,
+            "vid": vid,
+            "isuse":isuse
+        })
+*/
+        // {{/*data:{"_id":_id,"s_descript":s_descript,"version":version,"clearJsonStr":clearJsonStr,"username":{{index (session "user") "name" }}},*/}}
+        $.ajax({
+            url: "/admin/site_management/save",
+            type: "post",
+            data: {
+                "_id": _id,
+                "site_name": site_name,
+                "site_descript": site_descript,
+                "site_href": site_href,
+                "site_script": site_script,
+                "vid": vid,
+                "isuse":isuse
+            },
+            success: function (r) {
+                if (r.rep) {
+                    window.location.href = "/admin/site_management?vid=" + vid
+                } else {
+                    showTip("已存在!", 1000)
+                }
+            }
+        })
+    }
+    //use
+    function use(_id,isuse){
+        smg=""
+        if(isuse){
+            smg="确定启用?"
+        }else{
+            smg="确定停用?"
+        }
+        showConfirm(smg, function() {
+            $.ajax({
+                url:"/admin/site_management/use",
+                type:"post",
+                data:{"_id":_id,"isuse":isuse},
+                success:function(r){
+                    if(r.rep){
+                        window.location.href = "/admin/site_management?vid=" + vid
+                    }else{
+                        showTip("启用失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+
+    //修改
+    function edit_table_btn(obj) {
+        if (obj == "") {
+            showTip("id不存在!", 1500)
+            return
+        }
+        $.ajax({
+            url: "/admin/site_management/byId",
+            type: "post",
+            data: {
+                "_id": obj,
+            },
+            success: function (r) {
+                console.log(r.data.isuse)
+                if (r.rep) {
+                    $("#version_title").html("修改站点");
+                    $("#_id").val(r.data._id);
+                    $("#site_name").val(r.data.site_name);
+                    $("#site_descript").val(r.data.site_descript);
+                    $("#site_href").val(r.data.site_href);
+                    $("#site_script").val(r.data.site_script);
+                    if (!r.data.isuse){
+                        $("input[name='isuse'][value='true']").attr("checked",false);
+                        $("input[name='isuse'][value='false']").attr("checked",true);
+                    }
+                    $("#modal-info-version").modal("show");
+                } else {
+                    showTip("查询错误!", 1200)
+                }
+            }
+        })
+    }
+
+    //删除站点
+    function delete_table_btn(obj) {
+        if (obj == "") {
+            showTip("id不存在!", 1500)
+            return
+        }
+        $.ajax({
+            url: "/admin/site_management/delete",
+            type: "post",
+            data: {
+                "_id": obj,
+            },
+            success: function (r) {
+                if (r.rep) {
+                    window.location.href = "/admin/site_management?vid=" + vid
+                } else {
+                    showTip("删除失败", 1000, function () {
+                    });
+                }
+            }
+        })
+    }
+
+</script>

+ 324 - 0
src/web/templates/admin/site_onetag.html

@@ -0,0 +1,324 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+	<link href="/res/jsoneditor/css/jsoneditor.css" rel="stylesheet" type="text/css">
+ 	<script src="/res/jsoneditor/js/jsoneditor.js"></script>
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><button class="btn btn-primary createOneTag" onclick='createOneTag("")'>新增标签</button></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i> 版本控制</a></li>
+		  <li><a href="/admin/version">版本管理</a></li>
+		  <li>标签库</li>
+		  <li class="active"><a href="#">{{.tagname}}</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="dataTagTable" 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>
+<!--新增标签--> 
+<div class="modal fade" id="modal-info-addonetag">
+  	<div class="modal-dialog">
+	    <form id="addone-dataform" 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">{{.tagname}}信息</h4>
+		    </div>
+		    <div class="modal-body">
+				<div class="form-group">
+				    <label for="code" id="labelname" class="col-sm-2 control-label">名称:</label>
+				    <div class="col-sm-10">
+					   	<select class="form-control" id="addone-name"></select>
+					</div>
+					<!--<span class="modifyCheck hide check">请选择</span>-->
+				</div>
+				<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">版本:</label>
+				    <div class="col-sm-10">
+				      <input id="addone-version" type="text" value="{{.version}}" class="form-control" disabled>
+				    </div>
+				</div>
+				<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">内容:</label>
+				    <div class="col-sm-10">
+						<div id="jsonadd" style="height:300px"></div>
+				    </div>
+				</div>
+		    </div>
+		    <div class="modal-footer">
+		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
+		        <button type="button" class="btn btn-primary" onclick="saveaddone()">保存</button>
+	    	</div>
+		</div>
+	    <!-- /.modal-content -->
+	    </form>
+  	</div>
+  <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+<!--编辑标签--> 
+<div class="modal fade" id="modal-info-editonetag">
+  	<div class="modal-dialog">
+	    <form id="editone-dataform" 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">{{.tagname}}信息</h4>
+		    </div>
+		    <div class="modal-body">
+		     	<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">名称:</label>
+				    <div class="col-sm-10">
+				      <input id="editone-name" type="text" class="form-control" disabled>
+				    </div>
+				</div>
+				<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">内容:</label>
+				    <div class="col-sm-10">
+				    	<div id="jsoneditor" style="height:300px"></div>
+					</div>
+				</div>
+		    </div>
+		    <div class="modal-footer">
+		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
+		        <button type="button" class="btn btn-primary" onclick="saveeditdata()">保存</button>
+	    	</div>
+			<!--<div class="modal-footer">
+		         <input id="editone-id" type="hidden" class="form-control" name="_id">
+	    	</div>-->
+		</div>
+	    <!-- /.modal-content -->
+	    </form>
+  	</div>
+  <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+menuActive("version")
+var ttableonetag
+var tp = {{.tp}};
+var parentid = {{.parentid}}
+var pratagname = {{.tagname}};
+var version = {{ .version}};
+var username = {{index (session "user") "name" }};
+var editor = null;
+var oldcontent = "";
+var id = "";
+$(function () {
+	ttableonetag=$('#dataTagTable').DataTable({
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"paging"	  : true,
+		
+		"ajax": {
+			"url": "/admin/site_management/onetag/data",
+			"type": "post",
+			"data":{"version":{{ .version}},"tagname":{{.tagname}} ,"parentid":{{.parentid}}}
+		 },
+		"language": {
+			"url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		{{if eq .tp "citysim" "cityall"}}
+		"columnDefs": [
+				{ "targets": 4 ,"bVisible": false} //隐藏列
+			],
+		{{end}}
+		"columns": [
+            { "data": "s_name"},
+			{ "data": "s_creater"},
+			{ "data": "l_intime"},
+			{ "data": "s_type"},
+			{ "data": "content",render:function(val,a,row){
+				var strval = JSON.stringify(val);
+				if(strval.length > 50){
+					strval = strval.substr(0,50)+"...";
+				}
+				return  strval;
+			}},
+			{ "data": "_id",render:function(val,a,row){
+				return  "<a href='#' onclick=\"editonetag('"+val+"','"+row["s_name"]+"')\"><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+						"<a href='#' onclick='delonetag(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+			}}
+       	]
+	});
+	//ttableonetag.on('init.dt', function () {});
+})
+
+//编辑
+function editonetag(_id,name){
+	$("#jsoneditor").html('');
+	id = _id;
+	$.ajax({
+		url:"/admin/site_management/onetag/searchone",
+		type:"post",
+		data:{"_id":_id},
+		success:function(r){
+			if(r.data != null){
+				var container = document.getElementById('jsoneditor');
+				showJson(r.data.content,container);
+			}
+		}
+	})
+	$("#editone-name").val(name);
+	$("#modal-info-editonetag").modal("show");
+}
+
+function showJson(content,container){
+	var options = {
+    	mode: 'code',
+    	modes: ['code', 'tree'], // allowed modes
+    	onError: function (err) {
+      	alert(err.toString());
+    	}
+  	};
+	editor =  new JSONEditor(container, options, content);
+	oldcontent = editor.getText();
+}
+
+//编辑保存
+function saveeditdata(){
+	var newcontent = editor.getText();
+	var sy = document.getElementById('errorjson').style.display;
+	if(newcontent == "" || newcontent == oldcontent || sy == "block"){
+		alert("表单填写不完整或内容未修改!");
+			return false;
+	}
+	$.ajax({
+		url:"/admin/site_management/onetag/editsave",
+		type:"post",
+		data:{"_id":id,"content":newcontent},
+		success:function(r){
+			if(r.rep){
+				$("#editone-dataform")[0].reset();
+				$("#modal-info-editonetag").modal("hide");
+				ttableonetag.ajax.reload();
+			}else{
+				alert("保存失败");
+			}
+		}
+	});
+}
+
+
+//删除标签
+function delonetag(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/onetag/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					ttableonetag.ajax.reload();
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+
+//创建标签
+function createOneTag(){
+	$("#jsonadd").html('');
+	var arr = [];
+	var url = "/admin/getfields";
+	if(tp == "citysim" || tp == "cityall"){
+		$("#labelname").html("省/直辖市");
+		url = "/admin/getcitys";
+	}else if(tp == "province"){
+		$("#labelname").html("省份");
+		url = "/admin/getprovinces";
+	}
+	$.ajax({
+		url:url,
+		type:"post",
+		async:false,
+		success:function(r){
+			if(r.data != null){
+				arr = r.data;
+			}
+		}
+	});
+	$("#addone-name").empty();
+	$("#addone-name").append("<option value=''>--请选择--</option>");
+	for(var i in arr){
+		if(arr[i]["s_name"] != ""){
+			$("#addone-name").append("<option value='"+arr[i]["s_name"]+"+"+arr[i]["s_field"]+"'>"+arr[i]["s_name"]+"</option>");
+		}
+	}
+	var container = document.getElementById('jsonadd');
+	showJson("",container);
+	$("#modal-info-addonetag").modal("show");
+}
+
+//保存创建的标签
+function saveaddone(){
+	var name = $("#addone-name").val();
+	namearr = name.split("+");
+	content = editor.getText();
+	var contentrep = content.replace(/\s+/g,"");
+	if(contentrep == "" || contentrep == "[]" || contentrep == "{}" || name == "" || (tp != "citysim" && tp != "cityall" && content[0] == "{")){
+		alert("表单填写不完整或格式不正确!");
+		return false;
+	}
+	if(namearr.length != 2){
+		alert("名称或省/直辖市数据错误!");
+		return false;
+	}
+	$.ajax({
+		url:"/admin/site_management/onetag/create",
+		type:"post",
+		data:{"pratagname":pratagname,"name":namearr[0],"field":namearr[1],"version":version,"tp":tp,
+		"content":content,"username":username,"parentid":parentid},
+		success:function(r){
+			if(r.rep){
+				$("#addone-dataform")[0].reset();
+				$("#modal-info-addonetag").modal("hide");
+				ttableonetag.ajax.reload();
+			}else{
+				alert("保存失败");
+			}
+		}
+	});
+}
+</script>

+ 230 - 0
src/web/templates/admin/site_rule_backlist.html

@@ -0,0 +1,230 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增正则</a></small>
+			<small><a class="btn btn-primary opr" opr="newlua">新增脚本</a></small>
+		</h1>
+		<ol class="breadcrumb">
+		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li>站点列表</li>
+		  <li class="active"><a href="/admin/site_management/ruleback?version={{.version}}">后置逻辑</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>
+{{template "luares"}}
+{{template "dialog"}}
+{{template "footer"}}
+
+<script>
+menuActive("version")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/site_management/ruleback/data",
+			"type": "post",
+			"data":{"version":{{ .version}} }
+		 },
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+			{ "data": "s_code"},
+            { "data": "s_name"},
+			{ "data": "s_username"},
+			{ "data": "s_descript"},
+			{ "data": "s_type",render:function(val,a,row){
+				if(val=="0"){
+					return "正则"
+				}else{
+					return "lua脚本"
+				}
+			}},
+			{ "data": "_id",render:function(val,a,row,pos){
+				tmp=""
+				if(row.s_type=="0"){
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}else{
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="editlua" row="'+pos.row+'" >编辑</a> '+
+						//'<a href="/admin/ruleback/luastr?_id='+val+'" class="btn btn-sm btn-primary">编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}
+				return tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr")
+			var htmlObj={},obj,tag=[]
+			var bts=[{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=="s_luascript"){
+										val=editor_1.getValue()
+										obj[el.id]=val
+									}else{
+										obj[el.id]=$(el).val()
+									}
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+								})
+								if (bcon){								
+									$.post("/admin/site_management/ruleback/save",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/site_management/ruleback?version={{.version}}"
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+			var _tit="" 
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "editlua":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "newlua":
+			case "new":
+				comtag=[{label:"名称",s_label:"s_name",placeholder:"",must:true},{label:"描述",s_label:"s_descript",type:"tpl_text"}]
+				regtag=[{label:"字段",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields"},{label:"正则",s_label:"s_rule",type:"tpl_text",must:true}]
+				luatag=[{label:"脚本",s_label:"s_luascript",type:"tpl_text",must:true}]
+				testcon=[{label:"测试内容",s_label:"s_testcon",type:"tpl_text",must:true}]
+				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"s_version",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"}]
+				islua=false
+				tag = com.pushArry(tag,comtag)
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_name
+					tag = com.pushArry(tag,regtag)
+					tag = com.pushArry(tag,hiddentag)
+					tag = com.pushArry(tag,testcon)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									var obj={}
+									var bcon=true
+									$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+										var val=$(el).val(); 
+										obj[el.id]=$(el).val()
+										if(el.id!="_id"&&$(el).attr("must")&&!val){
+											bcon=false
+											return false
+										}
+									})
+									if (bcon){								
+										$.post("/admin/site_management/check/backrule",obj,function(data){
+											showMsg(data.rep)
+										},'json')
+									}else{
+										alert("红色标签的表单不能为空!")
+									}
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else if(n=="editlua"){
+					_tit="编辑-"+obj.s_name
+					islua=true
+					tag = com.pushArry(tag,luatag)
+					tag = com.pushArry(tag,hiddentag)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									window.location.href="/admin/site_management/check/lua/back?version={{.version}}&s_code="+obj.s_code
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else{
+					_tit="新增规则"
+					if(n=="newlua"){
+						_tit="新增脚本"
+						obj={"s_luascript":"--code脚本代码,result 抽取结果,过滤后返回result,对象结构不可改变\nfunction main(code,result)\n\t--过滤操作\n\treturn result\nend","s_version":"{{.version}}","s_type":"1"}
+						tag = com.pushArry(tag,luatag)
+						tag = com.pushArry(tag,hiddentag)
+						islua=true
+					}else{
+						obj={"s_version":"{{.version}}","s_type":"0"}
+						tag = com.pushArry(tag,regtag)
+						tag = com.pushArry(tag,hiddentag)
+					}
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					lua:islua,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/ruleback/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/site_management/ruleback?version={{.version}}"
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+
+</script>

+ 230 - 0
src/web/templates/admin/site_rule_logicbacklist.html

@@ -0,0 +1,230 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增正则</a></small>
+			<small><a class="btn btn-primary opr" opr="newlua">新增脚本</a></small>
+		</h1>
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+			<li>抽取逻辑</li>
+		  <li class="active"><a href="/admin/site_management/logicback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}">后置规则</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>
+{{template "luares"}}
+{{template "dialog"}}
+{{template "footer"}}
+
+<script>
+menuActive("version")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/site_management/logicback/data",
+			"type": "post",
+			"data":{"vid":{{.vid}},"pid":{{.pid}},"sid":{{ .sid}} }
+		 },
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+			{ "data": "s_code"},
+            { "data": "s_name"},
+			{ "data": "s_username"},
+			{ "data": "s_descript"},
+			{ "data": "s_type",render:function(val,a,row){
+				if(val=="0"){
+					return "正则"
+				}else{
+					return "lua脚本"
+				}
+			}},
+			{ "data": "_id",render:function(val,a,row,pos){
+				tmp=""
+				if(row.s_type=="0"){
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}else{
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="editlua" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}
+				return tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr")
+			var htmlObj={},obj,tag=[]
+			var bts=[{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=="s_luascript"){
+										val=editor_1.getValue()
+										obj[el.id]=val
+									}else{
+										obj[el.id]=$(el).val()
+									}
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+								})
+								if (bcon){								
+									$.post("/admin/site_management/logicback/save",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/site_management/logicback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+			var _tit="" 
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "editlua":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "newlua":
+			case "new":
+				comtag=[{label:"名称",s_label:"s_name",placeholder:"",must:true},{label:"描述",s_label:"s_descript",type:"tpl_text"}]
+				regtag=[{label:"字段",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields",default:{{.field}}},{label:"正则",s_label:"s_rule",type:"tpl_text",must:true}]
+				luatag=[{label:"脚本",s_label:"s_luascript",type:"tpl_text",must:true}]
+				testcon=[{label:"测试内容",s_label:"s_testcon",type:"tpl_text",must:true}]
+				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"vid",type:"tpl_hidden"},{s_label:"pid",type:"tpl_hidden"},{s_label:"sid",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"}]
+				islua=false
+				tag = com.pushArry(tag,comtag)
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_name
+					tag = com.pushArry(tag,regtag)
+					tag = com.pushArry(tag,hiddentag)
+					tag = com.pushArry(tag,testcon)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									var obj={}
+									var bcon=true
+									$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+										var val=$(el).val(); 
+										obj[el.id]=$(el).val()
+										if(el.id!="_id"&&$(el).attr("must")&&!val){
+											bcon=false
+											return false
+										}
+									})
+									if (bcon){								
+										$.post("/admin/site_management/check/backrule",obj,function(data){
+											showMsg(data.rep)
+										},'json')
+									}else{
+										alert("红色标签的表单不能为空!")
+									}
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else if(n=="editlua"){
+					_tit="编辑-"+obj.s_name
+					islua=true
+					tag = com.pushArry(tag,luatag)
+					tag = com.pushArry(tag,hiddentag)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									window.location.href="/admin/site_management/check/lua/coreback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}&s_code="+obj.s_code
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else{
+					_tit="新增规则"
+					if(n=="newlua"){
+						_tit="新增脚本"
+						obj={"s_luascript":"--code脚本代码,result 抽取结果,过滤后返回result,对象结构不可改变\nfunction main(code,result)\n\t--过滤操作\n\treturn result\nend","vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"1"}
+						tag = com.pushArry(tag,luatag)
+						tag = com.pushArry(tag,hiddentag)
+						islua=true
+					}else{
+						obj={"vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"0"}
+						tag = com.pushArry(tag,regtag)
+						tag = com.pushArry(tag,hiddentag)
+					}
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					lua:islua,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/logicback/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/site_management/logicback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
+				}else{
+					showTip("删除失败", 1000);
+				}
+			}
+		})
+	});
+}
+</script>

+ 201 - 0
src/web/templates/admin/site_rule_logiclist.html

@@ -0,0 +1,201 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增逻辑</a></small>
+		</h1>
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+		  	<li>抽取逻辑</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>
+{{template "luares"}}
+{{template "dialog"}}
+{{template "footer"}}
+
+<script>
+menuActive("version")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/site_management/rulelogic/data",
+			"type": "post",
+			"data":{"vid":{{ .vid}} ,"pid":{{ .pid}} }
+		 },
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+			{ "data": "s_name"},
+			{ "data": "s_username"},
+			{ "data": "s_descript"},
+			{ "data": "isuse",render:function(val,a,row){
+				tmp=""
+				if(val){
+					tmp="<a href='#' title='停用' onclick='use(\""+row._id+"\",false)'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+				}else{
+					tmp="<a href='#' title='启用' onclick='use(\""+row._id+"\",true)'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+				}
+				return tmp
+			}},
+			{"data":"_id","width":"25%",render:function(val,a,row){
+				tmp = '<div class="btn-group">'+
+						'<a class="btn btn-sm btn-primary" href="/admin/site_management/logicpre?vid={{.vid}}&pid={{.pid}}&sid='+row._id+'">前置规则</a>'+
+						'<a class="btn btn-sm btn-success" href="/admin/site_management/logicore?vid={{.vid}}&pid={{.pid}}&sid='+row._id+'">抽取规则</a>'+
+						'<a class="btn btn-sm btn-info" href="/admin/site_management/logicback?vid={{.vid}}&pid={{.pid}}&sid='+row._id+'">后置规则</a>'+
+						'</div>';
+				return  tmp
+			}},
+			{"data":"s_version","width":"15%",render:function(val,a,row,pos){
+				return '<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-warning" onclick="del(\''+row._id+'\')">删除</a>';
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr")
+			var htmlObj={},obj,tag=[]
+			var _tit="" 
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data()
+			case "editlua":
+				obj=ttable.row($(this).closest("tr")).data()
+			case "new":
+				tag=[{label:"名称",s_label:"s_name",placeholder:"",must:true},
+					{label:"描述",s_label:"s_descript",type:"tpl_text"},
+					{label:"启用",s_label:"isuse",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:true},
+					{label:"标题抽取",s_label:"extfrom",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
+					{label:"是否适用",s_label:"s_luascript",type:"tpl_text",must:true},
+					{s_label:"_id",type:"tpl_hidden"},
+					{s_label:"vid",type:"tpl_hidden"},{s_label:"pid",type:"tpl_hidden"}]
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_name
+				}else{
+					_tit="新增逻辑"
+					obj={"s_luascript":"function logic(doc)\n\treturn true\nend","vid":"{{.vid}}","pid":"{{.pid}}","s_type":"0"}
+				}
+				
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					lua:true,
+					bts:[
+						{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=="s_luascript"){
+										val=editor_1.getValue()
+										obj[el.id]=val
+									}else{
+										obj[el.id]=$(el).val()
+									}
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+								})
+								if (bcon){
+									$.post("/admin/site_management/rulelogic/save",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/site_management/rulelogic?vid={{.vid}}&pid={{.pid}}"
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/rulelogic/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/site_management/rulelogic?vid={{.vid}}&pid={{.pid}}";
+				}else{
+					showTip("删除失败", 1000);
+				}
+			}
+		})
+	});
+}
+function use(_id,utype){
+	smg=""
+	if(utype){
+		smg="确定启用?"
+	}else{
+		smg="确定停用?"
+	}
+	showConfirm(smg, function() {
+		$.ajax({
+			url:"/admin/site_management/rulelogic/use",
+			type:"post",
+			data:{"_id":_id,"isuse":utype},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/site_management/rulelogic?vid={{.vid}}&pid={{.pid}}"
+				}else{
+					showTip("启用失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+</script>

+ 266 - 0
src/web/templates/admin/site_rule_logicore.html

@@ -0,0 +1,266 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增正则</a></small>
+			<small><a class="btn btn-primary opr" opr="newlua">新增脚本</a></small>
+		</h1>
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+			<li>抽取逻辑</li>
+		  <li class="active"><a href="/admin/site_management/logicore?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}">抽取规则</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>
+						<th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+<!--
+<div class="form-group"><select class="form-control select2" multiple="multiple" data-placeholder="Select a State" style="width: 100%;"><option>Alabama</option><option>Alaska</option></select></div>
+-->
+</div>
+{{template "luares"}}
+{{template "dialog"}}
+{{template "footer"}}
+  
+<script>
+$('.select2').select2()
+menuActive("version")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/site_management/logicore/data",
+			"type": "post",
+			"data":{"vid":{{.vid}},"pid":{{.pid}},"sid":{{ .sid}} }
+		 },
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+			{ "data": "s_code"},
+            { "data": "s_name"},
+			{ "data": "s_username"},
+			{ "data": "s_descript"},
+			{ "data": "s_type",render:function(val,a,row){
+				if(val=="0"){
+					return "正则"
+				}else{
+					return "lua脚本"
+				}
+			}},
+			{ "data": "isuse",render:function(val,a,row){
+				tmp=""
+				if(val){
+					tmp="<a href='#' title='停用' onclick='use(\""+row._id+"\",false)'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+				}else{
+					tmp="<a href='#' title='启用' onclick='use(\""+row._id+"\",true)'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+				}
+				return tmp
+			}},
+			{ "data": "_id",render:function(val,a,row,pos){
+				tmp=""
+				if(row.s_type=="0"){
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}else{
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="editlua" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}
+				return tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr")
+			var htmlObj={},obj,tag=[]
+			var bts=[{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=="s_luascript"){
+										val=editor_1.getValue()
+										obj[el.id]=val
+									}else{
+										obj[el.id]=$(el).val()
+									}
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+								})
+								if (bcon){								
+									$.post("/admin/site_management/logicore/save",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/site_management/logicore?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+			var _tit="" 
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "editlua":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "newlua":
+			case "new":
+				comtag=[{label:"名称",s_label:"s_name",placeholder:"",must:true},{label:"描述",s_label:"s_descript",type:"tpl_text"},{label:"启用",s_label:"isuse",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:true}]
+				regtag=[{label:"字段",s_label:"s_field",type:"tpl_list_local",url:"/admin/site_management/getfields",default:{{.field}}},{label:"正则",s_label:"s_rule",type:"tpl_text",must:true}]
+				luatag=[{label:"字段",s_label:"s_field",type:"tpl_list_local",url:"/admin/site_management/getfields",default:{{.field}}},{label:"脚本",s_label:"s_luascript",type:"tpl_text",must:true}]
+				testcon=[{label:"测试内容",s_label:"s_testcon",type:"tpl_text",must:true}]
+				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"vid",type:"tpl_hidden"},{s_label:"pid",type:"tpl_hidden"},{s_label:"sid",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"}]
+				islua=false
+				tag = com.pushArry(tag,comtag)
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_name
+					tag = com.pushArry(tag,regtag)
+					tag = com.pushArry(tag,hiddentag)
+					tag = com.pushArry(tag,testcon)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									var obj={}
+									var bcon=true
+									$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+										var val=$(el).val(); 
+										obj[el.id]=$(el).val()
+										if(el.id!="_id"&&$(el).attr("must")&&!val){
+											bcon=false
+											return false
+										}
+									})
+									if (bcon){								
+										$.post("/admin/site_management/check/extrule",obj,function(data){
+											showMsg(JSON.stringify(data.rep))
+										},'json')
+									}else{
+										alert("红色标签的表单不能为空!")
+									}
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else if(n=="editlua"){
+					_tit="编辑-"+obj.s_name
+					islua=true
+					tag = com.pushArry(tag,luatag)
+					tag = com.pushArry(tag,hiddentag)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									window.location.href="/admin/site_management/check/lua/core?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}&s_code="+obj.s_code
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else{
+					_tit="新增规则"
+					if(n=="newlua"){
+						_tit="新增脚本"
+						obj={"s_luascript":"--code脚本代码,doc数据源,block块对象,kvs抽取kv对象,返回kvs对象,kvs结构不可改变\nfunction main(code,doc,block,kvs)\n\t--自定义抽取\n\treturn kvs\nend","vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"1"}
+						tag = com.pushArry(tag,luatag)
+						tag = com.pushArry(tag,hiddentag)
+						islua=true
+					}else{
+						obj={"vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"0"}
+						tag = com.pushArry(tag,regtag)
+						tag = com.pushArry(tag,hiddentag)
+					}
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					lua:islua,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/logicore/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/site_management/logicore?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}";
+				}else{
+					showTip("删除失败", 1000);
+				}
+			}
+		})
+	});
+}
+function use(_id,utype){
+	smg=""
+	if(utype){
+		smg="确定启用?"
+	}else{
+		smg="确定停用?"
+	}
+	showConfirm(smg, function() {
+		$.ajax({
+			url:"/admin/site_management/logicore/use",
+			type:"post",
+			data:{"_id":_id,"isuse":utype},
+			success:function(r){
+				if(r.rep){				
+					window.location.reload()
+				}else{
+					showTip("启用失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+</script>

+ 230 - 0
src/web/templates/admin/site_rule_logicprelist.html

@@ -0,0 +1,230 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增正则</a></small>
+			<small><a class="btn btn-primary opr" opr="newlua">新增脚本</a></small>
+		</h1>
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+			<li>属性配置</li>
+			<li>抽取逻辑</li>
+		  <li class="active"><a href="/admin/site_management/logicpre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}">前置规则</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>
+{{template "luares"}}
+{{template "dialog"}}
+{{template "footer"}}
+
+<script>
+menuActive("version")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"ajax": {
+			"url": "/admin/site_management/logicpre/data",
+			"type": "post",
+			"data":{"vid":{{.vid}},"pid":{{.pid}},"sid":{{ .sid}} }
+		 },
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+			{ "data": "s_code"},
+            { "data": "s_name"},
+			{ "data": "s_username"},
+			{ "data": "s_descript"},
+			{ "data": "s_type",render:function(val,a,row){
+				if(val=="0"){
+					return "正则"
+				}else{
+					return "lua脚本"
+				}
+			}},
+			{ "data": "_id",render:function(val,a,row,pos){
+				tmp=""
+				if(row.s_type=="0"){
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}else{
+					tmp = '<div>'+
+						'<a class="btn btn-sm btn-primary opr" opr="editlua" row="'+pos.row+'" >编辑</a> '+
+						'<a class="btn btn-sm btn-warning" onclick="del(\''+val+'\')">删除</a> '+
+						'</div>';
+				}
+				return tmp
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr")
+			var htmlObj={},obj,tag=[]
+			var bts=[{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=="s_luascript"){
+										val=editor_1.getValue()
+										obj[el.id]=val
+									}else{
+										obj[el.id]=$(el).val()
+									}
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+								})
+								if (bcon){								
+									$.post("/admin/site_management/logicpre/save",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/site_management/logicpre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+			var _tit="" 
+			switch(n){
+			case "edit":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "editlua":			
+				obj=ttable.row($(this).closest("tr")).data();
+			case "newlua":
+			case "new":
+				comtag=[{label:"名称",s_label:"s_name",placeholder:"",must:true},{label:"描述",s_label:"s_descript",type:"tpl_text"}]
+				regtag=[{label:"字段",s_label:"s_field"},{label:"正则",s_label:"s_rule",type:"tpl_text",must:true}]
+				luatag=[{label:"脚本",s_label:"s_luascript",type:"tpl_text",must:true}]
+				testcon=[{label:"测试内容",s_label:"s_testcon",type:"tpl_text",must:true}]
+				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"vid",type:"tpl_hidden"},{s_label:"pid",type:"tpl_hidden"},{s_label:"sid",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"}]
+				islua=false
+				tag = com.pushArry(tag,comtag)
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_name
+					tag = com.pushArry(tag,regtag)
+					tag = com.pushArry(tag,hiddentag)
+					tag = com.pushArry(tag,testcon)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									var obj={}
+									var bcon=true
+									$("#_con").find("input[id!=s_show],textarea").each(function(i,el){
+										var val=$(el).val(); 
+										obj[el.id]=$(el).val()
+										if(el.id!="_id"&&$(el).attr("must")&&!val){
+											bcon=false
+											return false
+										}
+									})
+									if (bcon){								
+										$.post("/admin/site_management/check/prerule",obj,function(data){
+											showMsg(data.rep)
+										},'json')
+									}else{
+										alert("红色标签的表单不能为空!")
+									}
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else if(n=="editlua"){
+					_tit="编辑-"+obj.s_name
+					islua=true
+					tag = com.pushArry(tag,luatag)
+					tag = com.pushArry(tag,hiddentag)
+					check=[{label:"测试",class:"btn-warning",
+								fun:function(){
+									window.location.href="/admin/site_management/check/lua/corepre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}&s_code="+obj.s_code
+								}
+							}]
+					bts = com.pushArry(bts,check)
+				}else{
+					_tit="新增规则"
+					if(n=="newlua"){
+						_tit="新增脚本"
+						obj={"s_luascript":"--code脚本代码,doc数据源,过滤后返回doc对象\nfunction main(code,doc)\n\t--过滤操作\n\treturn doc\nend","vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"1"}
+						tag = com.pushArry(tag,luatag)
+						tag = com.pushArry(tag,hiddentag)
+						islua=true
+					}else{
+						obj={"vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"0"}
+						tag = com.pushArry(tag,regtag)
+						tag = com.pushArry(tag,hiddentag)
+					}
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					lua:islua,
+					bts:bts
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/logicpre/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/site_management/logicpre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
+				}else{
+					showTip("删除失败", 1000);
+				}
+			}
+		})
+	});
+}
+</script>

+ 195 - 0
src/web/templates/admin/site_taglist.html

@@ -0,0 +1,195 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal-info-addtag">新增标签</button></small>
+		</h1>
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li class="active"><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+		  <li class="active">标签库</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="dataTagTable" 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>
+<!--新增标签--> 
+<div class="modal fade" id="modal-info-addtag">
+  	<div class="modal-dialog">
+	    <form id="add-dataform" 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">标签信息</h4>
+		    </div>
+		    <div class="modal-body">
+		     	<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">名称:</label>
+				      <div class="col-sm-10" id="add-name">
+				      	<input type="radio" name="name" id="add-str" value="正则类">正则类</input>&nbsp;&nbsp;&nbsp;&nbsp;
+					  	<input type="radio" name="name" id="add-reg" value="字符串类">字符串类</input>&nbsp;&nbsp;&nbsp;&nbsp;
+					   	<input type="radio" name="name" id="add-simarea" value="城市简称">城市简称</input>&nbsp;&nbsp;&nbsp;&nbsp;
+						<input type="radio" name="name" id="add-allarea" value="城市全称">城市全称</input>&nbsp;&nbsp;&nbsp;&nbsp;
+				      	<input type="radio" name="name" id="add-province" value="省份">省份
+					</div>
+					<!--<input id="add-name" type="text" class="form-control" placeholder="请输名称">-->
+				</div>
+				<div class="form-group">
+				    <label for="code" class="col-sm-2 control-label">版本:</label>
+				    <div class="col-sm-10">
+				      <input id="add-version" type="text" value="{{.version}}" class="form-control" disabled>
+				    </div>
+				</div>
+				<!--<div class="form-group">
+				   <label for="code" class="col-sm-2 control-label">类型:</label>
+				    <div class="col-sm-10" id="add-checkbox">
+				      <input type="radio" name="tp" id="add-str" value="str">字符串</input>&nbsp;&nbsp;&nbsp;&nbsp;
+					  <input type="radio" name="tp" id="add-reg" value="reg">正则</input>&nbsp;&nbsp;&nbsp;&nbsp;
+					   <input type="radio" name="tp" id="add-area" value="area">地区</input>
+				    </div>
+				</div>-->
+		    </div>
+		    <div class="modal-footer">
+		        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="reset()">取消</button>
+		        <button type="button" class="btn btn-primary" onclick="addsave()">保存</button>
+	    	</div>
+		</div>
+	    <!-- /.modal-content -->
+	    </form>
+  	</div>
+  <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+menuActive("version")
+$(function () {
+	ttabletag=$('#dataTagTable').DataTable({
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"paging"	  : true,
+		
+		"ajax": {
+			"url": "/admin/site_management/tag/data",
+			"type": "post",
+			"data":{"version":{{ .version}} }
+		 },
+		"language": {
+			"url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"columns": [
+            { "data": "s_tagname",render:function(val,a,row){
+				//return "<a href='#' onclick='searchOneTag(\""+val+"\",\""+row["version"]+"\")'>"+val+"</a>"
+				return '<a href="/admin/site_management/onetag?version='+row.s_version+'&tagname='+row.s_tagname+'&tp='+row.s_type+'&parentid='+row._id+'">'+val+'</a>';
+			}},
+			{ "data": "s_version"},
+			{ "data": "s_creater"},
+			{ "data": "l_intime"},
+			{ "data": "s_type"},
+			{ "data": "_id",render:function(val,a,row){
+				return  "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+				//"<a href='#' onclick='edit(\""+val+"\",\""+row["name"]+"\",\""+row["content"]+"\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+			}}
+       	]
+	});
+	//ttabletag.on('init.dt', function () {});
+})
+//新建保存
+function addsave(){
+	var name = "";
+	$("#add-name input[type=radio]").each(function(){
+		if($(this).prop("checked")){
+			name = $(this).val();
+		}
+	});
+	version=$("#add-version").val();
+	if(name==""){
+		alert("表单填写不完整!");
+		return false;
+	}
+	var tp = "";
+	if(name == "字符串类"){
+		tp = "string";
+	}else if(name == "正则类"){
+		tp = "reg";
+	}else if(name == "城市简称"){
+		tp = "citysim";
+	}else if(name == "城市全称"){
+		tp = "cityall";
+	}else if(name == "省份"){
+		tp = "province";
+	}	
+	
+	$.ajax({
+		url:"/admin/site_management/tag/save",
+		type:"post",
+		data:{"tagname":name,"tp":tp,"version":version,"username":{{index (session "user") "name" }}},
+		success:function(r){
+			if(r.rep){
+				$("#add-dataform")[0].reset();
+				$("#modal-info-addtag").modal("hide");
+				ttabletag.ajax.reload();
+			}else{
+				$("#add-dataform")[0].reset();
+				$("#modal-info-addtag").modal("hide");
+				alert("保存失败");
+			}
+		}
+	})
+}
+
+//删除
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/tag/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					ttabletag.ajax.reload();
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+</script>

+ 199 - 0
src/web/templates/admin/site_versioninfo.html

@@ -0,0 +1,199 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+
+<!-- Content Wrapper. Contains page content -->
+<div class="content-wrapper">
+	<section class="content-header">
+		<h1>
+			<small><a class="btn btn-primary opr" opr="new">新增字段</a></small>
+		</h1>
+		<ol class="breadcrumb">
+			<li><a href="/admin/version"><i class="fa fa-dashboard"></i>抽取版本</a></li>
+			<li><a href="/admin/site_management?vid={{.vid}}">站点列表</a></li>
+		  	<li><a href="/admin/site_management/info?vid={{.vid}}&pid={{.pid}}">属性配置</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>
+						<th>操作</th>
+		              </tr>
+		              </thead>
+		            </table>
+		        </div>
+	          <!-- /.box-body -->
+	        </div>
+        <!-- /.box -->
+		</div>
+	</div>
+  </section>
+</div>
+
+<!-- footer -->
+{{template "dialog"}}
+{{template "footer"}}
+
+<script>
+menuActive("version")
+$(function () {
+	ttable=$('#dataTable').DataTable({
+		"paging"      : false,
+		"lengthChange": false,
+		"searching"   : true,
+		"ordering"    : false,
+		"info"        : true,
+		"autoWidth"   : false,
+		"language": {
+            "url": "/res/dist/js/dataTables.chinese.lang"
+        },
+		"ajax": {
+			"url": "/admin/site_management/infodata",
+			"type": "post",
+			"data":{"pid":{{ .pid}},"vid":{{.vid}} }
+		 },
+		"columns": [
+			{ "data": "s_field"},
+			{ "data": "s_descrip"},
+			{ "data": "s_username"},
+			{ "data": "isaudit",render:function(val,a,row){
+				if(val){
+					return "是";
+				}else{
+					return "否";
+				}
+			}},
+			{ "data": "isuse",render:function(val,a,row){
+				tmp=""
+				if(val){
+					tmp="<a href='#' title='停用' onclick='use(\""+row._id+"\","+false+")'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
+				}else{
+					tmp="<a href='#' title='启用' onclick='use(\""+row._id+"\","+true+")'><i class='fa fa-fw fa-circle text-red'></i></a>未启用"
+				}
+				return tmp
+			}},
+			{"data":"_id",render:function(val,a,row){
+				return '<a class="btn btn-sm btn-success" href="/admin/site_management/rulelogic?vid={{.vid}}&pid='+val+'">配置逻辑</a>'
+			}},
+			{"data":"_id",render:function(val,a,row){
+				return '<a class="btn btn-sm btn-primary opr" opr="edit">编辑</a>&nbsp;<a class="btn btn-sm btn-danger" href="#" onclick="del(\''+val+'\')">删除</a>'
+			}}
+       	]
+	});
+	ttable.on('init.dt', function () {
+		$(".opr").click(function(){
+			var n=$(this).attr("opr")
+			var _tit="",htmlObj={},obj,tag=[]
+			switch(n){
+			case "edit":
+                obj=ttable.row($(this).closest("tr")).data()
+			case "new":
+                tag=[
+						{label:"属性名称",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields",must:true},
+						{label:"描述",s_label:"s_descrip",placeholder:"描述信息"},
+						{label:"是否审核",s_label:"isaudit",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
+						{label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions"},
+                        {s_label:"_id",type:"tpl_hidden"},
+						{s_label:"vid",type:"tpl_hidden"},
+						{s_label:"isuse",type:"tpl_hidden"},
+					]
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_field
+                    tag[0]={label:"属性名称",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields",must:true,disabled:true}
+                    tag[3]={label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions",disabled:true}
+				}else{
+					_tit="新增字段"
+					obj={"vid":"{{.vid}}","isuse":false}
+				}
+				htmlObj={
+					title:_tit,
+					tag:tag,
+					bts:[
+						{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();
+									obj[el.id]=$(el).val()
+									if(el.id!="_id"&&$(el).attr("must")&&!val){
+										bcon=false
+										return false
+									}
+								})
+								if (bcon){
+									obj["pid"]={{.pid}}
+									//console.log(obj)
+									$.post("/admin/site_management/infosave",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/site_management/info?vid={{.vid}}&pid={{.pid}}"
+										}else{
+											showTip("已存在!",1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+function use(_id,isuse){
+	smg=""
+	if(isuse){
+		smg="确定启用?"
+	}else{
+		smg="确定停用?"
+	}
+	showConfirm(smg, function() {
+		$.ajax({
+			url:"/admin/site_management/infouse",
+			type:"post",
+			data:{"_id":_id,"isuse":isuse},
+			success:function(r){
+				if(r.rep){
+					window.location.href="/admin/site_management/info?vid={{.vid}}&pid={{.pid}}"
+				}else{
+					showTip("启用失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/site_management/infodel",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					ttable.ajax.reload();
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+</script>

+ 11 - 8
src/web/templates/admin/version.html

@@ -151,10 +151,10 @@ $(function () {
             "url": "/res/dist/js/dataTables.chinese.lang"
         },
 		"columns": [
-            { "data": "version"},
-			{ "data": "s_username"},
-			{ "data": "s_descript","width":"25%"},
-			{ "data": "isuse",render:function(val,a,row){
+				{ "data": "version","width":"5%"},
+			{ "data": "s_username","width":"5%"},
+			{ "data": "s_descript","width":"27%"},
+			{ "data": "isuse","width":"7%",render:function(val,a,row){
 				tmp=""
 				if(val){
 					tmp="<a href='#' title='停用' onclick='use(\""+row._id+"\","+false+")'><i class='fa fa-fw fa-circle text-green'></i></a>已启用"
@@ -163,7 +163,7 @@ $(function () {
 				}
 				return tmp
 			}},
-			{ "data":"_id","width":"28%",render:function(val,a,row){
+			{ "data":"_id","width":"25%",render:function(val,a,row){
 				tmp = '<div class="btn-group">'+
 					'<a class="btn btn-sm btn-primary" href="/admin/rulepre?version='+row.version+'">前置规则</a>'+
 					'<a class="btn btn-sm btn-info" href="/admin/ruleback?version='+row.version+'">后置规则</a>'+
@@ -172,12 +172,13 @@ $(function () {
 					'</div>';
 				return  tmp
 			}},
-			{ "data":"_id","width":"25%",render:function(val,a,row){
+			{ "data":"_id","width":"29%",render:function(val,a,row){
 				return '<div class="btn-group">'+
 						'<a class="btn btn-sm btn-success" href="/admin/version/info?vid='+val+'" >属性</a>'+
 						'<a class="btn btn-sm btn-warning" href="/admin/version/blockinfo?vid='+val+'" >分块</a>'+
 						'<a class="btn btn-sm btn-info" href="/admin/version/pkginfo?vid='+val+'" >分包</a>'+
 						/*'<a class="btn btn-sm btn-primary opr" opr="edit">编&nbsp;&nbsp;辑1</a>'+*/
+                        '<a class="btn btn-sm btn-default" href="/admin/site_management?vid='+val+'" >站点管理</a>'+
 						"<a class=\"btn btn-sm btn-primary opr\" href='#' onclick=\"edit('"+val+"')\">编&nbsp;&nbsp;辑</a> &nbsp;"+
 						'<a class="btn btn-sm btn-danger" href="#" onclick="del(\''+val+'\',\''+row["version"]+'\')">删&nbsp;&nbsp;除</a>'
 					'</div>';
@@ -198,6 +199,7 @@ $(function () {
 					{label:"城市抽取",s_label:"isextractcity",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
 					{label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions"},
 					{label:"克隆属性",s_label:"iscopyfiled",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
+					{label:"克隆站点",s_label:"iscopysite",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
 					{label:"是否附件",s_label:"isfiles",type:"tpl_list_local",list:[{"s_name":"是","_id":true},{"s_name":"否","_id":false}],default:false},
 					{label:"附件字段",s_label:"s_filefileds",type:"tpl_list_local",url:"/admin/getfields"},
 					{s_label:"isuse",type:"tpl_hidden"},
@@ -332,7 +334,8 @@ function save(){
     var s_descript = $("#s_descript").val();//描述
     var isextractcity = $("#isextractcity").val()//是否抽取城市
     var s_pversionid = $("#s_pversionid").val()//克隆版本
-    var iscopyfiled = $("#iscopyfiled").val()//克隆属性
+	var iscopyfiled = $("#iscopyfiled").val()//克隆属性
+	var iscopysite = $("#iscopysite").val()//克隆属性
     var isfiles = $("#isfiles").val()//是否附件
     var s_filefileds = [];
     $("#select2 option").each(function(i,val){
@@ -349,7 +352,7 @@ function save(){
     $.ajax({
         url:"/admin/version/save",
         type:"post",
-        data:{"_id":_id,"s_descript":s_descript,"version":version,"isextractcity":isextractcity,"s_pversionid":s_pversionid,"iscopyfiled":iscopyfiled,"isfiles":isfiles,"s_filefileds":s_filefiledsJsonStr},
+        data:{"_id":_id,"s_descript":s_descript,"version":version,"isextractcity":isextractcity,"s_pversionid":s_pversionid,"iscopyfiled":iscopyfiled,"iscopysite":iscopysite,"isfiles":isfiles,"s_filefileds":s_filefiledsJsonStr},
         success:function(r){
 			if(r&&r.rep){
 				window.location.href="/admin/version"