浏览代码

版本管理

zhangjinkun 6 年之前
父节点
当前提交
2c047374c8

+ 12 - 0
src/jy/admin/admin.go

@@ -4,6 +4,7 @@ import (
 	"html/template"
 	. "jy/mongodbutil"
 	. "jy/router"
+	qu "qfw/util"
 	"strconv"
 
 	"github.com/gin-gonic/gin"
@@ -43,6 +44,17 @@ func init() {
 		data = append(data, *list...)
 		c.JSON(200, gin.H{"data": data})
 	})
+	//获取字段列表
+	Admin.POST("/getversions", func(c *gin.Context) {
+		list, b := Mgo.Find("version", `{}`, `{"_id":-1}`, `{"version":1}`, false, -1, -1)
+		if b && list != nil {
+			for _, v := range *list {
+				v["_id"] = qu.BsonIdToSId(v["_id"])
+				v["s_name"] = v["version"]
+			}
+		}
+		c.JSON(200, gin.H{"data": list})
+	})
 }
 
 func GetPostForm(c *gin.Context) map[string]interface{} {

+ 35 - 14
src/jy/admin/rule.go

@@ -52,32 +52,46 @@ func init() {
 
 	//rulelogic
 	Admin.GET("/rulelogic", func(c *gin.Context) {
-		version := c.Query("version")
-		c.HTML(200, "rule_logiclist.html", gin.H{"version": version})
+		vid := c.Query("vid")
+		pid := c.Query("pid")
+		c.HTML(200, "rule_logiclist.html", gin.H{"vid": vid, "pid": pid})
 	})
 	Admin.POST("/rulelogic/data", RuleLogicData)
 	Admin.POST("/rulelogic/save", RuleLogicSave)
+	Admin.POST("/rulelogic/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.Del("rule_logic", `{"_id":"`+_id+`"}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+
 	Admin.POST("/rulelogic/use", RuleLogicUse)
 	Admin.GET("/logicpre", func(c *gin.Context) {
-		version := c.Query("version")
+		vid := c.Query("vid")
+		pid := c.Query("pid")
 		sid := c.Query("sid")
-		c.HTML(200, "rule_logicprelist.html", gin.H{"version": version, "sid": sid})
+		c.HTML(200, "rule_logicprelist.html", gin.H{"vid": vid, "pid": pid, "sid": sid})
 	})
 	Admin.POST("/logicpre/data", RuleLogicPreData)
 	Admin.POST("/logicpre/save", RuleLogicPreSave)
 	Admin.POST("/logicpre/del", RuleLogicPreDel)
 	Admin.GET("/logicback", func(c *gin.Context) {
-		version := c.Query("version")
+		vid := c.Query("vid")
+		pid := c.Query("pid")
 		sid := c.Query("sid")
-		c.HTML(200, "rule_logicbacklist.html", gin.H{"version": version, "sid": sid})
+		//查询属性字段
+		tmp, _ := Mgo.FindById("versioninfo", pid, `{"s_field":1}`)
+		c.HTML(200, "rule_logicbacklist.html", gin.H{"vid": vid, "pid": pid, "sid": sid, "field": (*tmp)["s_field"]})
 	})
 	Admin.POST("/logicback/data", RuleLogicBackData)
 	Admin.POST("/logicback/save", RuleLogicBackSave)
 	Admin.POST("/logicback/del", RuleLogicBackDel)
 	Admin.GET("/logicore", func(c *gin.Context) {
-		version := c.Query("version")
+		vid := c.Query("vid")
+		pid := c.Query("pid")
 		sid := c.Query("sid")
-		c.HTML(200, "rule_logicore.html", gin.H{"version": version, "sid": sid})
+		//查询属性字段
+		tmp, _ := Mgo.FindById("versioninfo", pid, `{"s_field":1}`)
+		c.HTML(200, "rule_logicore.html", gin.H{"vid": vid, "pid": pid, "sid": sid, "field": (*tmp)["s_field"]})
 	})
 	Admin.POST("/logicore/data", RuleLogicCoreData)
 	Admin.POST("/logicore/save", RuleLogicCoreSave)
@@ -204,9 +218,10 @@ func RuleBackLua(c *gin.Context) {
 }
 
 func RuleLogicData(c *gin.Context) {
-	version, _ := c.GetPostForm("version")
-	data, _ := Mgo.Find("rule_logic", `{"s_version":"`+version+`"}`, `{"_id":-1}`, nil, false, -1, -1)
-	c.JSON(200, gin.H{"data": data, "version": version})
+	vid, _ := c.GetPostForm("vid")
+	pid, _ := c.GetPostForm("pid")
+	data, _ := Mgo.Find("rule_logic", `{"vid":"`+vid+`","pid":"`+pid+`"}`, `{"_id":-1}`, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid})
 }
 func RuleLogicSave(c *gin.Context) {
 	data := GetPostForm(c)
@@ -231,9 +246,11 @@ func RuleLogicUse(c *gin.Context) {
 	c.JSON(200, gin.H{"rep": b})
 }
 func RuleLogicPreData(c *gin.Context) {
+	vid, _ := c.GetPostForm("vid")
+	pid, _ := c.GetPostForm("pid")
 	sid, _ := c.GetPostForm("sid")
 	data, _ := Mgo.Find("rule_logicpre", `{"sid":"`+sid+`"}`, `{"_id":-1}`, nil, false, -1, -1)
-	c.JSON(200, gin.H{"data": data, "sid": sid})
+	c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid, "sid": sid})
 }
 func RuleLogicPreSave(c *gin.Context) {
 	data := GetPostForm(c)
@@ -265,9 +282,11 @@ func RuleLogicPreDel(c *gin.Context) {
 	c.JSON(200, gin.H{"rep": b})
 }
 func RuleLogicBackData(c *gin.Context) {
+	vid, _ := c.GetPostForm("vid")
+	pid, _ := c.GetPostForm("pid")
 	sid, _ := c.GetPostForm("sid")
 	data, _ := Mgo.Find("rule_logicback", `{"sid":"`+sid+`"}`, `{"_id":-1}`, nil, false, -1, -1)
-	c.JSON(200, gin.H{"data": data, "sid": sid})
+	c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid, "sid": sid})
 }
 func RuleLogicBackSave(c *gin.Context) {
 	data := GetPostForm(c)
@@ -299,9 +318,11 @@ func RuleLogicBackDel(c *gin.Context) {
 	c.JSON(200, gin.H{"rep": b})
 }
 func RuleLogicCoreData(c *gin.Context) {
+	vid, _ := c.GetPostForm("vid")
+	pid, _ := c.GetPostForm("pid")
 	sid, _ := c.GetPostForm("sid")
 	data, _ := Mgo.Find("rule_logicore", `{"sid":"`+sid+`"}`, `{"_id":-1}`, nil, false, -1, -1)
-	c.JSON(200, gin.H{"data": data, "sid": sid})
+	c.JSON(200, gin.H{"data": data, "vid": vid, "pid": pid, "sid": sid})
 }
 func RuleLogicCoreSave(c *gin.Context) {
 	data := GetPostForm(c)

+ 187 - 36
src/jy/admin/version.go

@@ -3,57 +3,208 @@ package admin
 
 import (
 	. "jy/mongodbutil"
+	"jy/util"
+	"log"
 	"net/http"
+	qu "qfw/util"
+	"strings"
 	"time"
 
+	"github.com/gin-contrib/sessions"
 	"github.com/gin-gonic/gin"
 )
 
 func init() {
 	Admin.GET("/version", func(c *gin.Context) {
-		//版本列表
-		v, _ := Mgo.Find("version", `{}`, `{"_id":-1}`, nil, false, -1, -1)
 		c.HTML(
 			http.StatusOK, "version.html",
-			gin.H{"version": v},
+			gin.H{},
 		)
 	})
-	Admin.POST("/version/data", Version)
-	Admin.POST("/version/save", VersionSave)
-	Admin.POST("/version/use", VersionUse)
-}
+	Admin.POST("/version/data", func(c *gin.Context) {
+		data, _ := Mgo.Find("version", `{}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": data})
+	})
+	Admin.POST("/version/save", func(c *gin.Context) {
+		version, _ := c.GetPostForm("version")
+		tmp, _ := Mgo.FindOne("version", `{"version":"`+version+`"}`)
+		if len(*tmp) > 0 {
+			c.JSON(200, gin.H{"rep": false})
+		} else {
+			s_pversionid, _ := c.GetPostForm("s_pversionid")
+			data := GetPostForm(c)
+			data["l_createtime"] = time.Now().Unix()
+			s_username := sessions.Default(c).Get("username").(string)
+			data["s_username"] = s_username
+			Mgo.Save("version", data)
+			copyComRules(version, s_pversionid, s_username)
+			c.JSON(200, gin.H{"rep": true})
+		}
+	})
+	Admin.POST("/version/use", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		if isuse == "1" { //启用确保只有一个版本
+			l, _ := Mgo.Find("version", `{"isuse":"1"}`, nil, nil, false, -1, -1)
+			if len(*l) > 0 {
+				c.JSON(200, gin.H{"rep": false})
+				return
+			}
+		}
+		b := Mgo.UpdateById("version", _id, `{"$set":{"isuse":"`+isuse+`"}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/version/del", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.Del("version", `{"_id":"`+_id+`"}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.GET("/version/info", func(c *gin.Context) {
+		vid := c.Query("vid")
+		v, _ := Mgo.Find("version", `{}`, `{"_id":-1}`, `{"version":1}`, false, -1, -1)
+		c.HTML(
+			http.StatusOK, "versioninfo.html",
+			gin.H{"vid": vid, "versions": v},
+		)
+	})
+	Admin.POST("/version/infodata", func(c *gin.Context) {
+		vid, _ := c.GetPostForm("vid")
+		list, _ := Mgo.Find("versioninfo", `{"vid":"`+vid+`"}`, `{"_id":-1}`, nil, false, -1, -1)
+		c.JSON(200, gin.H{"data": list, "vid": vid})
+	})
+	Admin.POST("/version/infosave", func(c *gin.Context) {
+		s_field, _ := c.GetPostForm("s_field")
+		vid, _ := c.GetPostForm("vid")
+		data := GetPostForm(c)
+		data["l_createtime"] = time.Now().Unix()
+		data["s_username"] = sessions.Default(c).Get("username")
+		data["l_lasttime"] = time.Now().Unix()
+		tmp, _ := Mgo.FindOne("versioninfo", `{"s_field":"`+s_field+`","vid":"`+vid+`"}`)
+		if len(*tmp) > 0 {
+			c.JSON(200, gin.H{"rep": false})
+		} else {
+			pid := Mgo.Save("versioninfo", data)
+			fromvid, _ := data["s_pversionid"].(string)
+			if fromvid != "" {
+				copyFieldRules(vid, pid, s_field, fromvid, sessions.Default(c).Get("username").(string))
+			}
+			c.JSON(200, gin.H{"rep": true})
+		}
 
-func Version(c *gin.Context) {
-	data, _ := Mgo.Find("version", `{}`, `{"_id":-1}`, nil, false, -1, -1)
-	c.JSON(200, gin.H{"data": data})
+	})
+	Admin.POST("/version/infouse", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		isuse, _ := c.GetPostForm("isuse")
+		b := Mgo.UpdateById("versioninfo", _id, `{"$set":{"isuse":`+isuse+`}}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
+	Admin.POST("/version/infodel", func(c *gin.Context) {
+		_id, _ := c.GetPostForm("_id")
+		b := Mgo.Del("versioninfo", `{"_id":"`+_id+`"}`)
+		c.JSON(200, gin.H{"rep": b})
+	})
 }
-func VersionSave(c *gin.Context) {
-	version, _ := c.GetPostForm("version")
-	preversion, _ := c.GetPostForm("preversion")
-	cname, _ := c.GetPostForm("cname")
-	descript, _ := c.GetPostForm("descript")
-	isuse, _ := c.GetPostForm("isuse")
-	data := map[string]interface{}{
-		"version":    version,
-		"preversion": preversion,
-		"cname":      cname,
-		"descript":   descript,
-		"isuse":      isuse,
-		"time":       time.Now().Unix(),
+
+//克隆版本通用属性
+func copyComRules(version, pvid, s_username string) {
+	tmp, _ := Mgo.FindById("version", pvid, nil)
+	oldversion := (*tmp)["version"].(string)
+	//克隆前置规则
+	plist, _ := Mgo.Find("rule_pre", `{"s_version":"`+oldversion+`"}`, nil, nil, false, -1, -1)
+	for _, v := range *plist {
+		delete(v, "_id")
+		v["s_version"] = version
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_pre", v)
 	}
-	b := Mgo.Save("version", data)
-	c.JSON(200, gin.H{"rep": b})
-}
-func VersionUse(c *gin.Context) {
-	_id, _ := c.GetPostForm("_id")
-	isuse, _ := c.GetPostForm("isuse")
-	if isuse == "1" { //启用确保只有一个版本
-		l, _ := Mgo.Find("version", `{"isuse":"1"}`, nil, nil, false, -1, -1)
-		if len(*l) > 0 {
-			c.JSON(200, gin.H{"rep": false})
-			return
+	//克隆后置规则
+	blist, _ := Mgo.Find("rule_back", `{"s_version":"`+oldversion+`"}`, nil, nil, false, -1, -1)
+	for _, v := range *blist {
+		delete(v, "_id")
+		v["s_version"] = version
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_back", v)
+	}
+	//克隆tag
+	/*
+		tlist, _ := Mgo.Find("tag", `{"s_version":"`+oldversion+`"}`, nil, nil, false, -1, -1)
+		for _, v := range *tlist {
+			oldId := qu.BsonIdToSId(v["_id"])
+			delete(v, "_id")
+			v["s_version"] = version
+			v["s_creater"] = s_username
+			v["l_intime"] = time.Now().Unix()
+			id := Mgo.Save("tag", v)
 		}
+	*/
+	//克隆函数
+}
+
+//克隆版本Field
+func copyFieldRules(vid, pid, s_field, oldvid, s_username string) {
+	tmp, _ := Mgo.FindOne("versioninfo", `{"vid":"`+oldvid+`","s_field":"`+s_field+`"}`)
+	oldpid := qu.BsonIdToSId((*tmp)["_id"])
+	log.Println(s_field, oldvid, oldpid, s_username)
+	//克隆逻辑列表
+	logic, _ := Mgo.FindOne("rule_logic", `{"vid":"`+oldvid+`","pid":"`+oldpid+`"}`)
+	oldsid := qu.BsonIdToSId((*logic)["_id"])
+	delete(*logic, "_id")
+	(*logic)["vid"] = vid
+	(*logic)["pid"] = pid
+	(*logic)["l_createtime"] = time.Now().Unix()
+	(*logic)["l_lasttime"] = time.Now().Unix()
+	(*logic)["s_username"] = s_username
+	sid := Mgo.Save("rule_logic", logic)
+	//克隆前置规则
+	plist, _ := Mgo.Find("rule_logicpre", `{"sid":"`+oldsid+`"}`, nil, nil, false, -1, -1)
+	for _, v := range *plist {
+		delete(v, "_id")
+		v["vid"] = vid
+		v["pid"] = pid
+		v["sid"] = sid
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_logicpre", v)
+	}
+	//克隆抽取规则
+	elist, _ := Mgo.Find("rule_logicore", `{"sid":"`+oldsid+`"}`, nil, nil, false, -1, -1)
+	for _, v := range *elist {
+		delete(v, "_id")
+		v["vid"] = vid
+		v["pid"] = pid
+		v["sid"] = sid
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_logicore", v)
 	}
-	b := Mgo.UpdateById("version", _id, `{"$set":{"isuse":"`+isuse+`"}}`)
-	c.JSON(200, gin.H{"rep": b})
+	//克隆过滤规则
+	blist, _ := Mgo.Find("rule_logicback", `{"sid":"`+oldsid+`"}`, nil, nil, false, -1, -1)
+	for _, v := range *blist {
+		delete(v, "_id")
+		v["vid"] = vid
+		v["pid"] = pid
+		v["sid"] = sid
+		v["s_code"] = util.GetSyncIndex(getCode(v["s_code"].(string)))
+		v["s_username"] = s_username
+		v["l_createtime"] = time.Now().Unix()
+		v["l_lasttime"] = time.Now().Unix()
+		Mgo.Save("rule_logicback", v)
+	}
+}
+
+//获取代码
+func getCode(code string) string {
+	tmps := strings.Split(code, "_")
+	tmp := tmps[:len(tmps)-1]
+	return strings.Join(tmp, "_")
 }

+ 5 - 6
src/jy/extract/extract.go

@@ -205,11 +205,10 @@ func (e *ExtractTask) ExtractProcess(j *ju.Job) {
 				ExtRegBack(j, v, e.TaskInfo)
 			}
 			//log.Println("抽取-后置规则", tmp)
-
-			//全局后置规则
-			for _, v := range e.RuleBacks {
-				ExtRegBack(j, v, e.TaskInfo)
-			}
+		}
+		//全局后置规则
+		for _, v := range e.RuleBacks {
+			ExtRegBack(j, v, e.TaskInfo)
 		}
 		//函数清理
 		for key, val := range j.Result {
@@ -219,7 +218,7 @@ func (e *ExtractTask) ExtractProcess(j *ju.Job) {
 			}
 		}
 		bs, _ := json.Marshal(j.Result)
-		log.Println("抽取结果", j.SourceMid, string(bs))
+		log.Println("抽取结果", j.Title, j.SourceMid, string(bs))
 		//分析抽取结果并保存 todo
 		AnalysisSaveResult(j.Data, j.Result, e.TaskInfo)
 

+ 109 - 101
src/jy/extract/extractInit.go

@@ -11,7 +11,7 @@ import (
 type RegLuaInfo struct { //正则或脚本信息
 	Code, Name, Field  string        //
 	RuleText           string        //
-	IsLua, IsHasFields bool          //IsHasFields脚本配置有属性字段
+	IsLua, IsHasFields bool          //IsHasFields正则配置有属性字段
 	RegPreBac          *ExtReg       //
 	RegCore            *ExtReg       //
 	LFields            []interface{} //lua抽取字段属性组
@@ -25,17 +25,17 @@ type ExtReg struct {
 type RuleCore struct {
 	LuaLogic  string        //进入逻辑
 	ExtFrom   string        //从哪个字段抽取
-	RulePres  []*RegLuaInfo //前置规则
-	RuleBacks []*RegLuaInfo //后置规则
+	RulePres  []*RegLuaInfo //抽取前置规则
+	RuleBacks []*RegLuaInfo //抽取后置规则
 	RuleCores []*RegLuaInfo //抽取规则
 }
 type TaskInfo struct {
-	Name, Version, TrackColl     string    //名称、版本、追踪记录表
-	FromDbAddr, FromDB, FromColl string    //抽取数据库地址、库名、表名
-	SaveColl, LastExtId          string    //抽取结果表、上次抽取信息id
-	DB                           *db.Pool  //数据库连接池
-	IsEtxLog                     bool      //是否开启抽取日志
-	ProcessPool                  chan bool //任务进程池
+	Name, Version, VersionId, TrackColl string    //名称、版本、版本id、追踪记录表
+	FromDbAddr, FromDB, FromColl        string    //抽取数据库地址、库名、表名
+	SaveColl, LastExtId                 string    //抽取结果表、上次抽取信息id
+	DB                                  *db.Pool  //数据库连接池
+	IsEtxLog                            bool      //是否开启抽取日志
+	ProcessPool                         chan bool //任务进程池
 }
 type Tag struct {
 	Type string         //标签类型 string 字符串、regexp 正则
@@ -47,8 +47,8 @@ type ExtractTask struct {
 	IsRun     bool                //是否启动
 	Content   string              //信息内容
 	TaskInfo  *TaskInfo           //任务信息
-	RulePres  []*RegLuaInfo       //前置规则
-	RuleBacks []*RegLuaInfo       //后置规则
+	RulePres  []*RegLuaInfo       //通用前置规则
+	RuleBacks []*RegLuaInfo       //通用后置规则
 	RuleCores []*RuleCore         //抽取规则
 	Tag       map[string][]*Tag   //标签库
 	ClearFn   map[string][]string //清理函数
@@ -63,9 +63,11 @@ func init() {
 func (e *ExtractTask) InitTaskInfo() {
 	task, _ := db.Mgo.FindById("task", e.Id, nil)
 	if len(*task) > 1 {
+		v, _ := db.Mgo.FindOne("version", `{"version":"`+(*task)["s_version"].(string)+`"}`)
 		e.TaskInfo = &TaskInfo{
 			Name:        (*task)["s_taskname"].(string),
 			Version:     (*task)["s_version"].(string),
+			VersionId:   qu.BsonIdToSId((*v)["_id"]),
 			TrackColl:   (*task)["s_trackcoll"].(string),
 			FromDbAddr:  (*task)["s_mgoaddr"].(string),
 			FromDB:      (*task)["s_mgodb"].(string),
@@ -80,7 +82,7 @@ func (e *ExtractTask) InitTaskInfo() {
 	}
 }
 
-//加载前置规则
+//加载通用前置规则
 func (e *ExtractTask) InitRulePres() {
 	defer qu.Catch()
 	list, _ := db.Mgo.Find("rule_pre", `{"s_version":"`+e.TaskInfo.Version+`"}`, nil, nil, false, -1, -1)
@@ -105,7 +107,7 @@ func (e *ExtractTask) InitRulePres() {
 	}
 }
 
-//加载后置规则
+//加载通用后置规则
 func (e *ExtractTask) InitRuleBacks() {
 	defer qu.Catch()
 	list, _ := db.Mgo.Find("rule_back", `{"s_version":"`+e.TaskInfo.Version+`"}`, nil, nil, false, -1, -1)
@@ -133,111 +135,117 @@ func (e *ExtractTask) InitRuleBacks() {
 //加载抽取规则
 func (e *ExtractTask) InitRuleCore() {
 	defer qu.Catch()
-	list, _ := db.Mgo.Find("rule_logic", `{"s_version":"`+e.TaskInfo.Version+`"}`, nil, nil, false, -1, -1)
-	for _, vv := range *list {
-		if b, _ := vv["isuse"].(bool); !b {
+	vinfos, _ := db.Mgo.Find("versioninfo", `{"vid":"`+e.TaskInfo.VersionId+`"}`, nil, nil, false, -1, -1)
+	for _, vinfo := range *vinfos {
+		if b, _ := vinfo["isuse"].(bool); !b {
 			continue
 		}
-		rcore := &RuleCore{}
-		rcore.LuaLogic = qu.ObjToString(vv["s_luascript"]) //是否进入逻辑脚本
-		rcore.ExtFrom = qu.If(vv["extfrom"].(bool), "title", "detail").(string)
-		//前置规则
-		rulePres := []*RegLuaInfo{}
-		plist, _ := db.Mgo.Find("rule_logicpre", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","s_version":"`+e.TaskInfo.Version+`"}`, nil, nil, false, -1, -1)
-		for _, v := range *plist {
-			rinfo := &RegLuaInfo{
-				Code:  v["s_code"].(string),
-				Name:  v["s_name"].(string),
-				IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
+		pid := qu.BsonIdToSId(vinfo["_id"])
+		list, _ := db.Mgo.Find("rule_logic", `{"pid":"`+pid+`"}`, nil, nil, false, -1, -1)
+		for _, vv := range *list {
+			if b, _ := vv["isuse"].(bool); !b {
+				continue
 			}
-			if rinfo.IsLua {
-				rinfo.RuleText = v["s_luascript"].(string)
-			} else {
-				rinfo.RuleText = v["s_rule"].(string)
-				rinfo.Field = v["s_field"].(string)
-				tmp := strings.Split(rinfo.RuleText, "__")
-				if len(tmp) == 2 {
-					rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: tmp[1]}
+			rcore := &RuleCore{}
+			rcore.LuaLogic = qu.ObjToString(vv["s_luascript"]) //是否进入逻辑脚本
+			rcore.ExtFrom = qu.If(vv["extfrom"].(bool), "title", "detail").(string)
+			//前置规则
+			rulePres := []*RegLuaInfo{}
+			plist, _ := db.Mgo.Find("rule_logicpre", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`"}`, nil, nil, false, -1, -1)
+			for _, v := range *plist {
+				rinfo := &RegLuaInfo{
+					Code:  v["s_code"].(string),
+					Name:  v["s_name"].(string),
+					IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
+				}
+				if rinfo.IsLua {
+					rinfo.RuleText = v["s_luascript"].(string)
 				} else {
-					rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: ""}
+					rinfo.RuleText = v["s_rule"].(string)
+					rinfo.Field = v["s_field"].(string)
+					tmp := strings.Split(rinfo.RuleText, "__")
+					if len(tmp) == 2 {
+						rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: tmp[1]}
+					} else {
+						rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: ""}
+					}
 				}
+				rulePres = append(rulePres, rinfo)
 			}
-			rulePres = append(rulePres, rinfo)
-		}
-		rcore.RulePres = rulePres
+			rcore.RulePres = rulePres
 
-		//后置规则
-		ruleBacks := []*RegLuaInfo{}
-		blist, _ := db.Mgo.Find("rule_logicback", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","s_version":"`+e.TaskInfo.Version+`"}`, nil, nil, false, -1, -1)
-		for _, v := range *blist {
-			rinfo := &RegLuaInfo{
-				Code:  v["s_code"].(string),
-				Name:  v["s_name"].(string),
-				IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
-			}
-			if rinfo.IsLua {
-				rinfo.RuleText = v["s_luascript"].(string)
-			} else {
-				rinfo.RuleText = v["s_rule"].(string)
-				rinfo.Field = v["s_field"].(string)
-				tmp := strings.Split(rinfo.RuleText, "__")
-				if len(tmp) == 2 {
-					rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: tmp[1]}
+			//后置规则
+			ruleBacks := []*RegLuaInfo{}
+			blist, _ := db.Mgo.Find("rule_logicback", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`"}`, nil, nil, false, -1, -1)
+			for _, v := range *blist {
+				rinfo := &RegLuaInfo{
+					Code:  v["s_code"].(string),
+					Name:  v["s_name"].(string),
+					IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
+				}
+				if rinfo.IsLua {
+					rinfo.RuleText = v["s_luascript"].(string)
 				} else {
-					rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: ""}
+					rinfo.RuleText = v["s_rule"].(string)
+					rinfo.Field = v["s_field"].(string)
+					tmp := strings.Split(rinfo.RuleText, "__")
+					if len(tmp) == 2 {
+						rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: tmp[1]}
+					} else {
+						rinfo.RegPreBac = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Replace: ""}
+					}
 				}
+				ruleBacks = append(ruleBacks, rinfo)
 			}
-			ruleBacks = append(ruleBacks, rinfo)
-		}
-		rcore.RuleBacks = ruleBacks
+			rcore.RuleBacks = ruleBacks
 
-		//抽取规则
-		ruleCores := []*RegLuaInfo{}
-		clist, _ := db.Mgo.Find("rule_logicore", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`","s_version":"`+e.TaskInfo.Version+`"}`, nil, nil, false, -1, -1)
-		for _, v := range *clist {
-			if b, _ := v["isuse"].(bool); !b {
-				continue
-			}
-			rinfo := &RegLuaInfo{
-				Code:  v["s_code"].(string),
-				Name:  v["s_name"].(string),
-				IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
-			}
-			if rinfo.IsLua {
-				rinfo.RuleText = v["s_luascript"].(string)
-				//暂时提取全部属性
-				rinfo.LFields = getALLFields()
-				rinfo.IsHasFields = true
-				/*rinfo.LFields, _ = v["s_fields"].([]interface{})
-				if len(rinfo.LFields) > 0 {
+			//抽取规则
+			ruleCores := []*RegLuaInfo{}
+			clist, _ := db.Mgo.Find("rule_logicore", `{"sid":"`+qu.BsonIdToSId(vv["_id"])+`"}`, nil, nil, false, -1, -1)
+			for _, v := range *clist {
+				if b, _ := v["isuse"].(bool); !b {
+					continue
+				}
+				rinfo := &RegLuaInfo{
+					Code:  v["s_code"].(string),
+					Name:  v["s_name"].(string),
+					IsLua: qu.If(v["s_type"].(string) == "1", true, false).(bool),
+				}
+				if rinfo.IsLua {
+					rinfo.RuleText = v["s_luascript"].(string)
+					//暂时提取全部属性
+					rinfo.LFields = getALLFields()
 					rinfo.IsHasFields = true
-				}*/
-			} else {
-				rinfo.RuleText = v["s_rule"].(string)
-				rinfo.Field = v["s_field"].(string)
-				tmp := strings.Split(rinfo.RuleText, "__")
-				if len(tmp) == 2 {
-					epos := strings.Split(tmp[1], ",")
-					posm := map[string]int{}
-					for _, v := range epos {
-						ks := strings.Split(v, ":")
-						if len(ks) == 2 { //(.*)招标公告(.*)__2:projectname,4:area
-							posm[ks[1]] = qu.IntAll(ks[0])
-						} else { //(.*)招标公告__2
-							posm[rinfo.Field] = qu.IntAll(ks[0])
+					/*rinfo.LFields, _ = v["s_fields"].([]interface{})
+					if len(rinfo.LFields) > 0 {
+						rinfo.IsHasFields = true
+					}*/
+				} else {
+					rinfo.RuleText = v["s_rule"].(string)
+					rinfo.Field = v["s_field"].(string)
+					tmp := strings.Split(rinfo.RuleText, "__")
+					if len(tmp) == 2 {
+						epos := strings.Split(tmp[1], ",")
+						posm := map[string]int{}
+						for _, v := range epos {
+							ks := strings.Split(v, ":")
+							if len(ks) == 2 { //(.*)招标公告(.*)__2:projectname,4:area
+								posm[ks[1]] = qu.IntAll(ks[0])
+							} else { //(.*)招标公告__2
+								posm[rinfo.Field] = qu.IntAll(ks[0])
+							}
 						}
+						rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Bextract: true, ExtractPos: posm}
+					} else {
+						rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Bextract: false}
 					}
-					rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Bextract: true, ExtractPos: posm}
-				} else {
-					rinfo.RegCore = &ExtReg{Reg: regexp.MustCompile(tmp[0]), Bextract: false}
 				}
+				ruleCores = append(ruleCores, rinfo)
 			}
-			ruleCores = append(ruleCores, rinfo)
+			rcore.RuleCores = ruleCores
+			//
+			e.RuleCores = append(e.RuleCores, rcore)
 		}
-		rcore.RuleCores = ruleCores
-
-		//
-		e.RuleCores = append(e.RuleCores, rcore)
 	}
 }
 

+ 1 - 1
src/web/templates/admin/com_memu.html

@@ -5,7 +5,7 @@
         <li class="header">HEADER</li>
         <!-- Optionally, you can add icons to the links -->
 		<li><a href="/admin/task"><i class="fa fa-clock-o"></i> <span>任务管理</span></a></li>
-	    <li><a href="/admin/version"><i class="fa fa-navicon"></i>版本管理</a></li>
+	    <li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>
 		<li class="treeview">
           	<a href="#"><i class="fa fa-laptop"></i> <span>中标单位库</span>
             <span class="pull-right-container">

+ 10 - 9
src/web/templates/admin/rule_logicbacklist.html

@@ -13,8 +13,9 @@
 		</h1>
 		<ol class="breadcrumb">
 		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
-		  <li><a href="/admin/rulelogic?version={{.version}}">抽取逻辑</a></li>
-		  <li class="active"><a href="/admin/logicback?version={{.version}}&sid={{.sid}}">后置规则</a></li>
+		  <li><a href="/admin/version/info?vid={{.vid}}&pid={{.pid}}">属性配置</a></li>
+		  <li><a href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}">抽取逻辑</a></li>
+		  <li class="active"><a href="/admin/logicback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}">后置规则</a></li>
 		</ol>
     </section>
   <!-- Main content -->
@@ -60,7 +61,7 @@ $(function () {
 		"ajax": {
 			"url": "/admin/logicback/data",
 			"type": "post",
-			"data":{"sid":{{ .sid}} }
+			"data":{"vid":{{.vid}},"pid":{{.pid}},"sid":{{ .sid}} }
 		 },
 		"language": {
             "url": "/res/dist/js/dataTables.chinese.lang"
@@ -107,9 +108,9 @@ $(function () {
 			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}]
+				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}]
-				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"sid",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"},{s_label:"s_version",type:"tpl_hidden"}]
+				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"){
@@ -125,12 +126,12 @@ $(function () {
 					_tit="新增规则"
 					if(n=="newlua"){
 						_tit="新增脚本"
-						obj={"s_luascript":"--code脚本代码,result 抽取结果,过滤后返回result,对象结构不可改变\nfunction main(code,result)\n\t--过滤操作\n\treturn result\nend","sid":"{{.sid}}","s_type":"1","s_version":"{{.version}}"}
+						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={"sid":"{{.sid}}","s_type":"0","s_version":"{{.version}}"}
+						obj={"vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"0"}
 						tag = com.pushArry(tag,regtag)
 						tag = com.pushArry(tag,hiddentag)
 					}
@@ -160,7 +161,7 @@ $(function () {
 								if (bcon){								
 									$.post("/admin/logicback/save",obj,function(data){
 										if(data&&data.rep){
-											window.location.href="/admin/logicback?version={{.version}}&sid={{.sid}}"								
+											window.location.href="/admin/logicback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"								
 										}else{
 											showTip(data.msg,1000)
 										}
@@ -187,7 +188,7 @@ function del(_id){
 			data:{"_id":_id},
 			success:function(r){
 				if(r.rep){				
-					window.location.href="/admin/logicback?version={{.version}}&sid={{.sid}}"
+					window.location.href="/admin/logicback?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
 				}else{
 					showTip("删除失败", 1000);
 				}

+ 28 - 12
src/web/templates/admin/rule_logiclist.html

@@ -12,7 +12,8 @@
 		</h1>
 		<ol class="breadcrumb">
 		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
-		  <li class="active"><a href="/admin/rulelogic?version={{.version}}">抽取逻辑</a></li>
+		  <li class="active"><a href="/admin/version/info?vid={{.vid}}">属性配置</a></li>
+		  <li class="active"><a href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}">抽取逻辑</a></li>
 		</ol>
     </section>
   <!-- Main content -->
@@ -58,7 +59,7 @@ $(function () {
 		"ajax": {
 			"url": "/admin/rulelogic/data",
 			"type": "post",
-			"data":{"version":{{ .version}} }
+			"data":{"vid":{{ .vid}} ,"pid":{{ .pid}} }
 		 },
 		"language": {
             "url": "/res/dist/js/dataTables.chinese.lang"
@@ -78,15 +79,15 @@ $(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?version='+{{.version}}+'&sid='+row._id+'">前置规则</a>'+
-					//'<a class="btn btn-sm btn-success opr" opr="editlua">抽取规则</a>'+
-					'<a class="btn btn-sm btn-success" href="/admin/logicore?version='+{{.version}}+'&sid='+row._id+'">抽取规则</a>'+
-					'<a class="btn btn-sm btn-info" href="/admin/logicback?version='+{{.version}}+'&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
 			}},
 			{"data":"s_version","width":"15%",render:function(val,a,row,pos){
-				return '<div><a class="btn btn-sm btn-primary opr" opr="edit" row="'+pos.row+'" >编辑</a></div>';
+				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>';
 			}}
        	]
 	});
@@ -107,12 +108,12 @@ $(function () {
 					{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:"s_version",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","s_version":"{{.version}}","s_type":"0"}
+					obj={"s_luascript":"function logic(doc)\n\treturn true\nend","vid":"{{.vid}}","pid":"{{.pid}}","s_type":"0"}
 				}
 				
 				htmlObj={
@@ -140,7 +141,7 @@ $(function () {
 								if (bcon){								
 									$.post("/admin/rulelogic/save",obj,function(data){
 										if(data&&data.rep){
-											window.location.href="/admin/rulelogic?version={{.version}}"	
+											window.location.href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}"	
 										}else{
 											showTip(data.msg,1000)
 										}
@@ -158,7 +159,22 @@ $(function () {
 		});
 	})
 })
-
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/rulelogic/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}";
+				}else{
+					showTip("删除失败", 1000);
+				}
+			}
+		})
+	});
+}
 function use(_id,utype){
 	smg=""
 	if(utype){
@@ -173,7 +189,7 @@ function use(_id,utype){
 			data:{"_id":_id,"isuse":utype},
 			success:function(r){
 				if(r.rep){				
-					window.location.href="/admin/rulelogic?version={{.version}}"
+					window.location.href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}"
 				}else{
 					showTip("启用失败", 1000, function() {});
 				}

+ 10 - 9
src/web/templates/admin/rule_logicore.html

@@ -13,8 +13,9 @@
 		</h1>
 		<ol class="breadcrumb">
 		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
-		  <li><a href="/admin/rulelogic?version={{.version}}">抽取逻辑</a></li>
-		  <li class="active"><a href="/admin/logicore?version={{.version}}&sid={{.sid}}">抽取规则</a></li>
+		  <li><a href="/admin/version/info?vid={{.vid}}&pid={{.pid}}">属性配置</a></li>
+		  <li><a href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}">抽取逻辑</a></li>
+		  <li class="active"><a href="/admin/logicore?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}">抽取规则</a></li>
 		</ol>
     </section>
   <!-- Main content -->
@@ -65,7 +66,7 @@ $(function () {
 		"ajax": {
 			"url": "/admin/logicore/data",
 			"type": "post",
-			"data":{"sid":{{ .sid}} }
+			"data":{"vid":{{.vid}},"pid":{{.pid}},"sid":{{ .sid}} }
 		 },
 		"language": {
             "url": "/res/dist/js/dataTables.chinese.lang"
@@ -121,9 +122,9 @@ $(function () {
 			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/getfields"},{label:"正则",s_label:"s_rule",type:"tpl_text",must:true}]
+				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}]
-				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"sid",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"},{s_label:"s_version",type:"tpl_hidden"}]
+				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"){
@@ -139,12 +140,12 @@ $(function () {
 					_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","sid":"{{.sid}}","s_type":"1","s_version":"{{.version}}"}
+						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={"sid":"{{.sid}}","s_type":"0","s_version":"{{.version}}"}
+						obj={"vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"0"}
 						tag = com.pushArry(tag,regtag)
 						tag = com.pushArry(tag,hiddentag)
 					}
@@ -174,7 +175,7 @@ $(function () {
 								if (bcon){								
 									$.post("/admin/logicore/save",obj,function(data){
 										if(data&&data.rep){
-											window.location.reload()								
+											window.location.href="/admin/logicore?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"					
 										}else{
 											showTip(data.msg,1000)
 										}
@@ -201,7 +202,7 @@ function del(_id){
 			data:{"_id":_id},
 			success:function(r){
 				if(r.rep){				
-					window.location.reload();
+					window.location.href="/admin/logicore?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}";
 				}else{
 					showTip("删除失败", 1000);
 				}

+ 9 - 8
src/web/templates/admin/rule_logicprelist.html

@@ -13,8 +13,9 @@
 		</h1>
 		<ol class="breadcrumb">
 		  <li><a href="/admin/version"><i class="fa fa-dashboard"></i>版本管理</a></li>
-		  <li><a href="/admin/rulelogic?version={{.version}}">抽取逻辑</a></li>
-		  <li class="active"><a href="/admin/logicpre?version={{.version}}&sid={{.sid}}">前置规则</a></li>
+		  <li><a href="/admin/version/info?vid={{.vid}}&pid={{.pid}}">属性配置</a></li>
+		  <li><a href="/admin/rulelogic?vid={{.vid}}&pid={{.pid}}">抽取逻辑</a></li>
+		  <li class="active"><a href="/admin/logicpre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}">前置规则</a></li>
 		</ol>
     </section>
   <!-- Main content -->
@@ -60,7 +61,7 @@ $(function () {
 		"ajax": {
 			"url": "/admin/logicpre/data",
 			"type": "post",
-			"data":{"sid":{{ .sid}} }
+			"data":{"vid":{{.vid}},"pid":{{.pid}},"sid":{{ .sid}} }
 		 },
 		"language": {
             "url": "/res/dist/js/dataTables.chinese.lang"
@@ -109,7 +110,7 @@ $(function () {
 				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}]
-				hiddentag=[{s_label:"_id",type:"tpl_hidden"},{s_label:"sid",type:"tpl_hidden"},{s_label:"s_type",type:"tpl_hidden"},{s_label:"s_version",type:"tpl_hidden"}]
+				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"){
@@ -125,12 +126,12 @@ $(function () {
 					_tit="新增规则"
 					if(n=="newlua"){
 						_tit="新增脚本"
-						obj={"s_luascript":"--code脚本代码,doc数据源,过滤后返回doc对象\nfunction main(code,doc)\n\t--过滤操作\n\treturn doc\nend","sid":"{{.sid}}","s_type":"1","s_version":"{{.version}}"}
+						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={"sid":"{{.sid}}","s_type":"0","s_version":"{{.version}}"}
+						obj={"vid":"{{.vid}}","pid":"{{.pid}}","sid":"{{.sid}}","s_type":"0"}
 						tag = com.pushArry(tag,regtag)
 						tag = com.pushArry(tag,hiddentag)
 					}
@@ -160,7 +161,7 @@ $(function () {
 								if (bcon){								
 									$.post("/admin/logicpre/save",obj,function(data){
 										if(data&&data.rep){
-											window.location.href="/admin/logicpre?version={{.version}}&sid={{.sid}}"								
+											window.location.href="/admin/logicpre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"								
 										}else{
 											showTip(data.msg,1000)
 										}
@@ -187,7 +188,7 @@ function del(_id){
 			data:{"_id":_id},
 			success:function(r){
 				if(r.rep){				
-					ttable.ajax.reload();
+					window.location.href="/admin/logicpre?vid={{.vid}}&pid={{.pid}}&sid={{.sid}}"
 				}else{
 					showTip("删除失败", 1000);
 				}

+ 79 - 92
src/web/templates/admin/version.html

@@ -8,7 +8,7 @@
 <div class="content-wrapper">
 	<section class="content-header">
 		<h1>
-			<small><button type="button" class="btn btn-primary" data-toggle="modal" data-target="#modal-info">新增版本</button></small>
+			<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>
@@ -24,11 +24,11 @@
 		              <thead>
 		              <tr>
 		                <th>版本号</th>
-						<th>依赖版本</th>
 						<th>创建人</th>
 						<th>描述</th>
 						<th>是否启用</th>
-						<th>配置规则</th>
+						<th>通用规则</th>
+						<th>操作</th>
 		              </tr>
 		              </thead>
 		            </table>
@@ -40,63 +40,9 @@
 	</div>
   </section>
 </div>
-  
-<div class="modal fade" id="modal-info">
-  	<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">版本信息</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="version" type="text" class="form-control" placeholder="请输入版本号">
-				    </div>
-				</div>
-				<div class="form-group">
-				    <label for="modify" class="col-sm-2 control-label">依赖版本:</label>
-				    <div class="col-sm-10">
-				     	<select id="preversion" class="form-control">
-							<option value="">不依赖</option>
-							{{ range .version }}  
-								<option value={{.version}}>{{.version}} </option>
-							{{ end }} 
-						</select>
-				    </div>
-				</div>	
-				<div class="form-group">
-				    <label for="code" class="col-sm-2 control-label">描述:</label>
-				    <div class="col-sm-10">
-				      <input id="descript" type="text" class="form-control" placeholder="描述">
-				    </div>
-				</div>
-				<!--
-				<div class="form-group">
-				    <label for="site" class="col-sm-2 control-label">是否启用:</label>
-					<div class="col-sm-10">
-						不启用&nbsp;<input type="radio" name="isuse" value="0" checked>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-						启用&nbsp;<input type="radio" name="isuse" value="1">
-					</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="save()">保存</button>
-	    	</div>
-		</div>
-	    <!-- /.modal-content -->
-	    </form>
-  	</div>
-  <!-- /.modal-dialog -->
-</div>
-<!-- /.modal -->
 	
 <!-- footer -->
+{{template "dialog"}}
 {{template "footer"}}
 
 <script>
@@ -119,9 +65,8 @@ $(function () {
         },
 		"columns": [
             { "data": "version"},
-			{ "data": "preversion"},
-			{ "data": "cname"},
-			{ "data": "descript","width":"25%"},
+			{ "data": "s_username"},
+			{ "data": "s_descript","width":"25%"},
 			{ "data": "isuse",render:function(val,a,row){
 				tmp=""
 				if(val=="1"){
@@ -134,45 +79,71 @@ $(function () {
 			{"data":"_id","width":"30%",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-success" href="/admin/rulelogic?version='+row.version+'">抽取逻辑</a>'+
 					'<a class="btn btn-sm btn-info" href="/admin/ruleback?version='+row.version+'">后置规则</a>'+
 					'<a class="btn btn-sm btn-warning" href="/admin/tag?version='+row.version+'">标签库</a>'+
-					'<a class="btn btn-sm btn-danger" href="/admin/clear?version='+row.version+'">函数清理</a>';
-					//'<a class="btn btn-sm btn-success" href="/admin/rulelogic?version='+row.version+'">抽取逻辑</a>'+
-					//'<a class="btn btn-sm btn-info" href="/admin/ruleback?version='+row.version+'">后置规则</a>'+
-					//'<a class="btn btn-sm btn-warning" href="/admin/ruletag?version='+row.version+'">标签库</a>'+
-					//'</div>';
+					'<a class="btn btn-sm btn-danger" href="/admin/clear?version='+row.version+'">函数清理</a>'+
+					'</div>';
 				return  tmp
+			}},
+			{"data":"_id",render:function(val,a,row){
+				return '<a class="btn btn-sm btn-success" href="/admin/version/info?vid='+val+'" >属性配置</a>'+
+					'&nbsp;&nbsp;<a class="btn btn-sm btn-danger" href="#" onclick="del(\''+val+'\')">删&nbsp;&nbsp;除</a>'
 			}}
        	]
 	});
-	//ttable.on('init.dt', function () {});
-})
-function save(){
-	version=$("#version").val()
-	preversion=$("#preversion").val()
-	descript=$("#descript").val()
-	//isuse = $("input[name='isuse']:checked").val();
-	if(version==""||descript==""){
-		alert("表单填写不完整!")
-		return false;
-	}
-	$.ajax({
-		url:"/admin/version/save",
-		type:"post",
-		data:{"version":version,"preversion":preversion,
-		"cname":{{index (session "user") "name" }},"descript":descript,"isuse":"0"},
-		success:function(r){
-			if(r.rep){
-				$("#dataform")[0].reset();
-				$("#modal-info").modal("hide");
-				ttable.ajax.reload();
-			}else{
-				alert("保存失败");
+	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":
+				_tit="新增版本"
+				tag=[
+					{label:"版本名称",s_label:"version",placeholder:"版本名称",must:true},
+					{label:"描述",s_label:"s_descript",placeholder:"描述信息",must:true},
+					{label:"克隆版本",s_label:"s_pversionid",type:"tpl_list_local",url:"/admin/getversions"},
+					{s_label:"isuse",type:"tpl_hidden"},
+				]
+				obj={"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){								
+									$.post("/admin/version/save",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/version"			
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+				}
+			OpenDialog(htmlObj,obj)
+			break;
 			}
-		}
+		});
 	})
-}
+})
 function use(_id,utype){
 	smg=""
 	if(utype=="1"){
@@ -195,4 +166,20 @@ function use(_id,utype){
 		})
 	});
 }
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/version/del",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					ttable.ajax.reload();
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
 </script>

+ 185 - 0
src/web/templates/admin/versioninfo.html

@@ -0,0 +1,185 @@
+{{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 class="active"><a href="/admin/version/info?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>
+		              </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/version/infodata",
+			"type": "post",
+			"data":{"vid":{{ .vid}} }
+		 },
+		"columns": [
+			{ "data": "s_field"},
+			{ "data": "s_descrip"},
+			{ "data": "s_username"},
+			{ "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/rulelogic?vid={{.vid}}&pid='+val+'">配置逻辑</a>'
+			}},
+			{"data":"_id",render:function(val,a,row){
+				return '<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":
+				if(n=="edit"){
+					_tit="编辑-"+obj.s_field
+				}else{
+					_tit="新增字段"
+					tag=[
+						{label:"属性名称",s_label:"s_field",type:"tpl_list_local",url:"/admin/getfields",must:true},
+						{label:"描述",s_label:"s_descrip",placeholder:"描述信息"},
+						{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"},
+					]
+					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){								
+									$.post("/admin/version/infosave",obj,function(data){
+										if(data&&data.rep){
+											window.location.href="/admin/version/info?vid={{.vid}}"			
+										}else{
+											showTip(data.msg,1000)
+										}
+									},'json')
+								}else{
+									alert("红色标签的表单不能为空!")
+								}
+							}
+						}
+					]
+				}
+			OpenDialog(htmlObj,obj)
+			break;
+			}
+		});
+	})
+})
+function use(_id,isuse){
+	smg=""
+	if(isuse){
+		smg="确定启用?"
+	}else{
+		smg="确定停用?"
+	}
+	showConfirm(smg, function() {
+		$.ajax({
+			url:"/admin/version/infouse",
+			type:"post",
+			data:{"_id":_id,"isuse":isuse},
+			success:function(r){
+				if(r.rep){				
+					window.location.href="/admin/version/info?vid={{.vid}}"
+				}else{
+					showTip("启用失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+function del(_id){
+	showConfirm("确定删除?", function() {
+		$.ajax({
+			url:"/admin/version/infodel",
+			type:"post",
+			data:{"_id":_id},
+			success:function(r){
+				if(r.rep){				
+					ttable.ajax.reload();
+				}else{
+					showTip("删除失败", 1000, function() {});
+				}
+			}
+		})
+	});
+}
+</script>