Explorar o código

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

fengweiqiang %!s(int64=6) %!d(string=hai) anos
pai
achega
635c6a1dac

+ 121 - 0
src/extractbrand/src/brand.go

@@ -0,0 +1,121 @@
+package main
+
+import (
+	"log"
+	"regexp"
+	"time"
+	//"qfw/util"
+	"sync"
+
+	. "gopkg.in/mgo.v2/bson"
+)
+
+var wg *sync.WaitGroup
+var lock *sync.Mutex
+var letter *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z]+&?`)
+
+func InitBrand() {
+	//初始化db
+	sess := brandMgo.GetMgoConn()
+	defer brandMgo.DestoryMongoConn(sess)
+
+	BrandDFA = &DFA{
+		Link: make(map[string]interface{}),
+	}
+	//查品牌库品牌
+	var res []M
+	//c, _ := sess.DB("spider").C("JD_commodity").Count()
+	sess.DB(brandDbname).C(brandCollname).Pipe([]M{M{"$group": M{"_id": "$brand"}}}).All(&res)
+	n := 0
+	for _, b := range res {
+		brand := b["_id"].(string)
+		if len(brand) > 50 || len(brand) == 1 || (len(brand) == 3 && !letter.MatchString(brand)) {
+			log.Println("err brand:", brand)
+			continue
+		}
+		n++
+		BrandDFA.AddWord(brand) //将品牌库加入DFA
+	}
+	log.Println("brand num :", n)
+}
+
+func UdpTask(sid, eid string) {
+	t := time.Now()
+	log.Println("执行任务")
+	query := M{"_id": M{"$gte": ObjectIdHex(sid), "$lte": ObjectIdHex(eid)}}
+	//附件库
+	sess := appendixMgo.GetMgoConn()
+	defer appendixMgo.DestoryMongoConn(sess)
+
+	poolSize := make(chan bool, pool)
+	wg = &sync.WaitGroup{}
+	lock = &sync.Mutex{}                   //控制读写
+	update := [][]map[string]interface{}{} //批量更新的数据
+
+	data := sess.DB(appendixDbname).C(appendixCollname).Find(query).Sort("_id").Iter()
+	sum := 0
+	for tmp := make(map[string]interface{}); data.Next(tmp); sum++ {
+		if sum%100 == 0 {
+			log.Println("current:", sum)
+		}
+		poolSize <- true
+		wg.Add(1)
+		go func(d map[string]interface{}) {
+			defer func() {
+				<-poolSize
+				wg.Done()
+			}()
+
+			brandArr := GetBrand(d)
+			if len(brandArr) > 0 { //匹配到品牌再处理
+				tmpArr := []map[string]interface{}{} //存储某条数据的id和要更新内容
+				_id := map[string]interface{}{
+					"_id": d["_id"],
+				}
+				tmpArr = append(tmpArr, _id)
+				//				pushAll := map[string]interface{}{
+				//					"$pushAll": map[string]interface{}{
+				//						"conbrand": brandArr,
+				//					},
+				//				}
+				addToSet := map[string]interface{}{
+					"$addToSet": map[string]interface{}{
+						"conbrand": map[string]interface{}{
+							"$each": brandArr,
+						},
+					},
+				}
+				tmpArr = append(tmpArr, addToSet)
+				lock.Lock()
+				update = append(update, tmpArr)
+				if len(update) > savesize {
+					appendixMgo.UpdateBulk(appendixCollname, update...)
+					update = [][]map[string]interface{}{} //更新后把数据置空
+				}
+				lock.Unlock()
+			}
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+	wg.Wait()
+	lock.Lock()
+	if len(update) > 0 {
+		appendixMgo.UpdateBulk(appendixCollname, update...)
+		update = [][]map[string]interface{}{} //更新后把数据置空
+	}
+	lock.Unlock()
+	log.Println("--task over--", time.Since(t).Seconds())
+}
+
+func GetBrand(data map[string]interface{}) (brandArr []string) {
+	if projectinfo, ok := data["projectinfo"].(map[string]interface{}); ok {
+		attachments := projectinfo["attachments"].(map[string]interface{})
+		for _, m := range attachments {
+			val := m.(map[string]interface{})
+			if content, ok := val["content"].(string); ok { //附件文本
+				brandArr = append(brandArr, BrandDFA.CheckSensitiveWord(content)...)
+			}
+		}
+	}
+	return
+}

+ 17 - 0
src/extractbrand/src/config.json

@@ -0,0 +1,17 @@
+{
+	"udpport":"1482",
+	"pool":6,
+	"savesize":200,
+	"brand":{
+		"mgodb":"192.168.3.207:27082",
+		"dbsize": 2,
+		"dbname":"spider",
+		"collname":"JD_commodity"
+	},
+	"appendix":{
+		"mgodb":"192.168.3.207:27082",
+		"dbsize": 2,
+		"dbname":"mxs",
+		"collname":"bidding_file"
+	}
+}

+ 59 - 0
src/extractbrand/src/dfa.go

@@ -0,0 +1,59 @@
+package main
+
+import (
+	"qfw/util"
+)
+
+var BrandDFA *DFA
+
+type DFA struct {
+	Link map[string]interface{}
+}
+
+func (d *DFA) AddWord(keys ...string) {
+	d.AddWordAll(true, keys...)
+}
+func (d *DFA) AddWordAll(haskey bool, keys ...string) {
+	if d.Link == nil {
+		d.Link = make(map[string]interface{})
+	}
+	for _, key := range keys {
+		nowMap := &d.Link
+		for i := 0; i < len(key); i++ {
+			kc := key[i : i+1]
+			if v, ok := (*nowMap)[kc]; ok {
+				nowMap, _ = v.(*map[string]interface{})
+			} else {
+				newMap := map[string]interface{}{}
+				newMap["YN"] = "0" //不是最后一个
+				(*nowMap)[kc] = &newMap
+				nowMap = &newMap
+			}
+			if i == len(key)-1 {
+				(*nowMap)["YN"] = "1" //最后一个
+				if haskey {
+					(*nowMap)["K"] = key
+				}
+			}
+		}
+	}
+}
+
+func (d *DFA) CheckSensitiveWord(src string) []string {
+	res := make([]string, 0)
+	for j := 0; j < len(src); j++ {
+		nowMap := &d.Link
+		for i := j; i < len(src); i++ {
+			word := src[i : i+1]
+			nowMap, _ = (*nowMap)[word].(*map[string]interface{})
+			if nowMap != nil { // 存在,则判断是否为最后一个
+				if "1" == util.ObjToString((*nowMap)["YN"]) {
+					res = append(res, util.ObjToString((*nowMap)["K"]))
+				}
+			} else {
+				break
+			}
+		}
+	}
+	return res
+}

+ 96 - 0
src/extractbrand/src/main.go

@@ -0,0 +1,96 @@
+package main
+
+import (
+	"encoding/json"
+	"log"
+	mu "mfw/util"
+	"net"
+	"qfw/util"
+	. "qfw/util/mongodb"
+	"time"
+)
+
+var (
+	Sysconfig   map[string]interface{} //配置文件
+	brandMgo    *MongodbSim            //mongodb操作对象
+	appendixMgo *MongodbSim            //mongodb操作对象
+	udpclient   mu.UdpClient           //udp对象
+	udpport     string                 //udp端口
+	pool        int                    //并发数
+	savesize    int
+	//品牌库信息
+	brandMgodb    string
+	brandDbname   string
+	brandDbsize   int
+	brandCollname string
+	//附件库信息
+	appendixMgodb    string
+	appendixDbname   string
+	appendixDbsize   int
+	appendixCollname string
+)
+
+func init() {
+	util.ReadConfig("config.json", &Sysconfig)
+	udpport, _ = Sysconfig["udpport"].(string)
+	pool = util.IntAllDef(Sysconfig["pool"], 5)
+	savesize = util.IntAllDef(Sysconfig["savesize"], 200)
+	//品牌库
+	brand := Sysconfig["brand"].(map[string]interface{})
+	brandMgodb, _ = brand["mgodb"].(string)
+	brandDbname, _ = brand["dbname"].(string)
+	brandDbsize = util.IntAllDef(brand["dbsize"], 5)
+	brandCollname, _ = brand["collname"].(string)
+	brandMgo = &MongodbSim{
+		MongodbAddr: brandMgodb,
+		Size:        brandDbsize,
+		DbName:      brandDbname,
+	}
+	brandMgo.InitPool()
+	//附件库
+	appendix := Sysconfig["appendix"].(map[string]interface{})
+	appendixMgodb, _ = appendix["mgodb"].(string)
+	appendixDbname, _ = appendix["dbname"].(string)
+	appendixDbsize = util.IntAllDef(appendix["dbsize"], 5)
+	appendixCollname, _ = appendix["collname"].(string)
+	appendixMgo = &MongodbSim{
+		MongodbAddr: appendixMgodb,
+		Size:        appendixDbsize,
+		DbName:      appendixDbname,
+	}
+
+	appendixMgo.InitPool()
+	//初始化品牌库
+	InitBrand()
+
+}
+func main() {
+	log.Println("udpport", udpport)
+	udpclient = mu.UdpClient{Local: ":" + udpport, BufSize: 1024}
+	udpclient.Listen(processUdpMsg)
+	log.Println("Udp服务监听", udpport)
+	time.Sleep(99999 * time.Hour)
+}
+
+func processUdpMsg(act byte, data []byte, ra *net.UDPAddr) {
+	defer util.Catch()
+	switch act {
+	case mu.OP_TYPE_DATA: //上个节点的数据
+		var mapInfo map[string]interface{}
+		err := json.Unmarshal(data, &mapInfo)
+		log.Println("err:", err, "mapInfo:", mapInfo)
+		if err != nil {
+			udpclient.WriteUdp([]byte("err:"+err.Error()), mu.OP_NOOP, ra)
+		} else if mapInfo != nil {
+			sid, _ := mapInfo["gtid"].(string)
+			eid, _ := mapInfo["lteid"].(string)
+			udpclient.WriteUdp([]byte("udpok"), mu.OP_NOOP, ra)
+			UdpTask(sid, eid)
+		}
+	case mu.OP_NOOP: //下个节点回应
+		ok := string(data)
+		if ok != "" {
+			log.Println("ok:", ok)
+		}
+	}
+}

+ 292 - 2
src/jy/admin/user.go

@@ -6,17 +6,55 @@ import (
 	. "jy/util"
 	"net/http"
 	"time"
-
 	"github.com/gin-gonic/gin"
+	"github.com/gin-contrib/sessions"
+	"strconv"
+	"gopkg.in/mgo.v2/bson"
+	qu "qfw/util"
+	"encoding/json"
 )
 
 func init() {
 	Admin.GET("/index", func(c *gin.Context) {
-		c.HTML(http.StatusOK, "index.html", gin.H{})
+		c.HTML(http.StatusOK, "index.html",nil)
 	})
 	Admin.GET("/user", func(c *gin.Context) {
 		c.HTML(http.StatusOK, "user.html", gin.H{})
 	})
+	Admin.GET("/menu", func(c *gin.Context) {
+		c.HTML(http.StatusOK, "menu.html", gin.H{})
+	})
+	Admin.GET("/role", func(c *gin.Context) {
+		c.HTML(http.StatusOK, "role.html", gin.H{})
+	})
+	Admin.GET("/role/menu", func(c *gin.Context) {
+		role:=c.Query("role")
+		c.HTML(http.StatusOK, "rolemenu.html", gin.H{"role":role})
+	})
+	Admin.GET("/role/secondmenu", func(c *gin.Context) {
+		role:=c.Query("role")
+		_id:=c.Query("_id")
+		c.HTML(http.StatusOK, "rolesecondmenu.html", gin.H{"role":role,"_id":_id})
+	})
+	Admin.GET("/secondmenu", func(c *gin.Context) {
+		_id := c.Query("id")
+		c.HTML(http.StatusOK, "secondmenu.html", gin.H{"_id":_id})
+	})
+	Admin.POST("/menu", Menu)
+	Admin.POST("/menu/save",MenuSave)
+	Admin.POST("/menu/data",MenuData)
+	Admin.POST("/menu/searchbyid", MenuSearchById)
+	Admin.POST("/menu/del", MenuDel)
+	Admin.POST("/role/menu/data",RoleMenuData)
+	Admin.POST("/role/menu/save",RoleMenuSave)
+	Admin.POST("/role/select",RoleSelect)
+	Admin.POST("/role/secondmenu/data",RoleSecondMenuData)
+	Admin.POST("/role/menu/del",RoleMenuDel)
+	Admin.POST("/role/secondmenu/del",RoleSecondMenuDel)
+	Admin.POST("/secondmenu/data",SecondMenuData)
+	Admin.POST("/secondmenu/save",SecondMenuSave)
+	Admin.POST("/secondmenu/searchbyid", SecondMenuSearchById)
+	Admin.POST("/secondmenu/del", SecondMenuDel)
 	Admin.POST("/user/data", User)
 	Admin.POST("/user/save", UserSave)
 	Admin.POST("/user/searchbyid", UserSearchById)
@@ -28,7 +66,197 @@ func User(c *gin.Context) {
 	data, _ := Mgo.Find("user", `{}`, nil, nil, false, -1, -1)
 	c.JSON(200, gin.H{"data": data})
 }
+func MenuData(c *gin.Context) {
+	data, _ := Mgo.Find("menu", `{}`, nil, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": data})
+}
+func SecondMenuData(c *gin.Context) {
+	_id,_:= c.GetPostForm("_id")
+	maps:=map[string]interface{}{
+		"menuid":_id,
+	}
+	data, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": data})
+}
+func RoleMenuData(c *gin.Context) {
+	role,_:=c.GetPostForm("role")
+	maps := map[string]interface{}{
+		"role."+role: true,
+	}
+	datas, _ := Mgo.Find("menu",maps, nil, nil, false, -1, -1)
+	list:=[]map[string]interface{}{}
+	for _,value:= range *datas{
+		_id:=qu.BsonIdToSId(value["_id"])
+		maps:=map[string]interface{}{
+			"menuid": _id,
+		}
+		count, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
+		if len(*count)!=0{
+			value["secondmenu"]=true
+		}else{
+			value["secondmenu"]=false
+		}
+		list=append(list,value)
+	}
+	c.JSON(200, gin.H{"data": list})
+}
+func RoleMenuSave(c *gin.Context){
+	menu,_:=c.GetPostForm("menu")
+	secondmenuStr, _ := c.GetPostForm("secondmenuStr")
+	role,_:=c.GetPostForm("role")
+	secondmenus := make([]string, 0)
+	err := json.Unmarshal([]byte(secondmenuStr), &secondmenus)
+	if err == nil && len(secondmenus) > 0 {
+		for _, v := range secondmenus {
+			maps:=map[string]interface{}{
+				"_id":bson.ObjectIdHex(v),
+			}
+			data:=map[string]interface{}{
+				"role."+role:true,
+			}
+			data2:=map[string]interface{}{
+				"$set":data,
+			}
+			Mgo.Update("secondmenu", maps, data2, true, false)
+		}
+	}
+	maps:=map[string]interface{}{
+		"_id":bson.ObjectIdHex(menu),
+	}
+	data:=map[string]interface{}{
+		"role."+role:true,
+	}
+	data2:=map[string]interface{}{
+		"$set":data,
+	}
+	b:=Mgo.Update("menu", maps, data2, true, false)
+	c.JSON(200, gin.H{"rep": b})
+}
+func RoleSelect(c *gin.Context){
+	menuid,_:=c.GetPostForm("_id")
+	maps := map[string]interface{}{
+		"menuid":menuid,
+	}
+	datas, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
+	c.JSON(200, gin.H{"data": datas})
+}
+func RoleSecondMenuData(c *gin.Context) {
+	role,_:=c.GetPostForm("role")
+	_id,_:=c.GetPostForm("_id")
+	maps := map[string]interface{}{
+		"menuid":_id,
+		"role."+role: true,
+	}
+	datas, _ := Mgo.Find("secondmenu",maps, nil, nil, false, -1, -1)
 
+	c.JSON(200, gin.H{"data": datas})
+}
+func Menu(c *gin.Context) {
+	//管理员0,审核员1.开发员2,超级管理3
+	session := sessions.Default(c)
+	role:=session.Get("role").(string)
+	maps:=map[string]interface{}{
+	}
+	if role=="3"{
+		maps=map[string]interface{}{
+		}
+	}else {
+		maps = map[string]interface{}{
+			"role." + role: true,
+		}
+	}
+	data, _ := Mgo.Find("menu", maps, nil, nil, false, -1, -1)
+	list:=[]map[string]interface{}{}
+	for _,value:=range *data{
+		_id:=value["_id"]
+		if role=="3"{
+			maps=map[string]interface{}{
+				"menuid":qu.BsonIdToSId(_id),
+			}
+		}else {
+			maps = map[string]interface{}{
+				"role." + role: true,
+				"menuid":qu.BsonIdToSId(_id),
+			}
+		}
+		secdatas, _ := Mgo.Find("secondmenu", maps, nil, nil, false, -1, -1)
+		secmenumap:=map[string]interface{}{}
+		for index,secdata:=range *secdatas{
+			secmenumap[strconv.Itoa(index+1)]=secdata
+		}
+		if len(secmenumap)!=0{
+			value["secondmenu"]=secmenumap
+		}
+		list=append(list,value)
+	}
+	c.JSON(200, gin.H{"data": list,"role":role})
+}
+func MenuSave(c *gin.Context) {
+	name, _ := c.GetPostForm("name")
+	href, _ := c.GetPostForm("href")
+	pic, _ := c.GetPostForm("pic")
+	_id,_:=c.GetPostForm("_id")
+	data := map[string]interface{}{
+	}
+	if _id==""{
+		data = map[string]interface{}{
+			"name": name,
+			"href":   href,
+			"pic":  pic,
+		}
+		b:=Mgo.Save("menu",data)
+		c.JSON(200, gin.H{"rep": b})
+	}else{
+		data = map[string]interface{}{
+			"name": name,
+			"href":   href,
+			"pic":  pic,
+		}
+		data2:=map[string]interface{}{
+			"$set":data,
+		}
+		maps:=map[string]interface{}{
+			"_id":bson.ObjectIdHex(_id),
+		}
+		b := Mgo.Update("menu", maps, data2, true, false)
+		c.JSON(200, gin.H{"rep": b})
+	}
+
+}
+func SecondMenuSave(c *gin.Context) {
+	name, _ := c.GetPostForm("name")
+	href, _ := c.GetPostForm("href")
+	pic, _ := c.GetPostForm("pic")
+	_id, _ := c.GetPostForm("_id")
+	menuid, _ := c.GetPostForm("menuid")
+	data := map[string]interface{}{
+	}
+	if _id==""{
+		data = map[string]interface{}{
+			"name": name,
+			"href":   href,
+			"pic":  pic,
+			"menuid":menuid,
+		}
+		b:=Mgo.Save("secondmenu",data)
+		c.JSON(200, gin.H{"rep": b})
+	}else {
+		data = map[string]interface{}{
+			"name":   name,
+			"href":   href,
+			"pic":    pic,
+		}
+		data2:=map[string]interface{}{
+			"$set":data,
+		}
+		maps:=map[string]interface{}{
+			"_id":bson.ObjectIdHex(_id),
+		}
+		b := Mgo.Update("secondmenu",maps, data2, true, false)
+		c.JSON(200, gin.H{"rep": b})
+	}
+
+}
 func UserSave(c *gin.Context) {
 	email, _ := c.GetPostForm("email")
 	pwd, _ := c.GetPostForm("pwd")
@@ -51,13 +279,75 @@ func UserSearchById(c *gin.Context) {
 	(*data)["pwd"] = Se.DecodeString((*data)["pwd"].(string))
 	c.JSON(200, gin.H{"rep": data})
 }
+func MenuSearchById(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	data, _ := Mgo.FindById("menu", _id, nil)
+	c.JSON(200, gin.H{"rep": data})
+}
+func SecondMenuSearchById(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	data, _ := Mgo.FindById("secondmenu", _id, nil)
+	c.JSON(200, gin.H{"rep": data})
+}
 
 func UserDel(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
 	b := Mgo.Del("user", `{"_id":"`+_id+`"}`)
 	c.JSON(200, gin.H{"rep": b})
 }
+func MenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Del("menu", `{"_id":"`+_id+`"}`)
+	c.JSON(200, gin.H{"rep": b})
+}
+func SecondMenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	b := Mgo.Del("secondmenu", `{"_id":"`+_id+`"}`)
+	c.JSON(200, gin.H{"rep": b})
+}
+func RoleMenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	role, _ := c.GetPostForm("role")
+	maps:=map[string]interface{}{
+		"_id":bson.ObjectIdHex(_id),
+	}
+	data:=map[string]interface{}{
+		"role."+role:false,
+	}
+	data2:=map[string]interface{}{
+		"$set":data,
+	}
+	b := Mgo.Update("menu", maps, data2, true, false)
+	maps=map[string]interface{}{
+		"menuid":_id,
+	}
+	count,_:=Mgo.Find("secondmenu",maps,nil,nil,false,-1,-1)
+	if len(*count)!=0{
+		for _,c:=range *count{
+			maps=map[string]interface{}{
+				"_id":c["_id"],
+			}
+			Mgo.Update("secondmenu", maps, data2, true, false)
+		}
 
+	}
+	c.JSON(200, gin.H{"rep": b})
+}
+func RoleSecondMenuDel(c *gin.Context) {
+	_id, _ := c.GetPostForm("_id")
+	role, _ := c.GetPostForm("role")
+	maps:=map[string]interface{}{
+		"_id":bson.ObjectIdHex(_id),
+	}
+	data:=map[string]interface{}{
+		"role."+role:false,
+	}
+	data2:=map[string]interface{}{
+		"$set":data,
+	}
+	b := Mgo.Update("secondmenu", maps, data2, true, false)
+	c.JSON(200, gin.H{"rep": b})
+}
 func UserUppwd(c *gin.Context) {
 	_id, _ := c.GetPostForm("_id")
 	pwd, _ := c.GetPostForm("pwd")

+ 1 - 1
src/jy/extract/extract.go

@@ -1063,7 +1063,7 @@ func AnalysisSaveResult(j *ju.Job, e *ExtractTask) {
 				"haskey":   j.HasKey,
 			}
 			if len(j.BrandData) > 0 {
-				tmp["brand"] = j.BrandData
+				tmp["tablebrand"] = j.BrandData
 			}
 			//log.Println("============", j.HasBrand, j.HasGoods, j.HasKey, j.HasTable, j.BrandData)
 		}

+ 1 - 0
src/jy/front/front.go

@@ -32,6 +32,7 @@ func Login(c *gin.Context) {
 		(*res)["_id"] = qu.BsonIdToSId((*res)["_id"])
 		session.Set("user", res)
 		session.Set("username", (*res)["name"])
+		session.Set("role", (*res)["role"])
 		session.Save()
 		c.JSON(200, gin.H{"checked": true})
 	} else {

+ 59 - 326
src/jy/pretreated/analytable.go

@@ -2686,37 +2686,39 @@ func (table *Table) analyBrand() {
 					"商品":["",""],
 					"商品_"["",""],
 				}
-
 			*/
-			valArr, f := filterval(realTypeVal...) //过滤数据
-			if f {
+			valArr, allempty := filterVal(realTypeVal...) //过滤数据
+			if allempty {
 				continue
 			}
 			realTypeVal = valArr
 			line := underline.FindString(key)
 			lineValMap1 := lineMapArr[line]
-			i := 1
-		L:
-			for { //去除数组空数据
-				last := realTypeVal[len(realTypeVal)-i]
-				if last == "" {
-					i++
-					if i > len(realTypeVal) {
-						break
-					}
-					goto L
+			//			i := 1
+			//		L:
+			//			for { //去除数组空数据
+			//				last := realTypeVal[len(realTypeVal)-i]
+			//				if last == "" {
+			//					i++
+			//					if i > len(realTypeVal) {
+			//						break
+			//					}
+			//					goto L
+			//				} else {
+			//					break
+			//				}
+			//			}
+			//			dislodgeNull := realTypeVal[:(len(realTypeVal) - i + 1)] //去除数组中空数据
+			if len(realTypeVal) > 0 {
+				if lineValMap1 == nil {
+					tmp := NewSortMap()
+					tmp.AddKey(key, realTypeVal)
+					lineMapArr[line] = tmp
 				} else {
-					break
+					lineValMap1.AddKey(key, realTypeVal)
 				}
 			}
-			dislodgeNull := realTypeVal[:(len(realTypeVal) - i + 1)] //去除数组中空数据
-			if lineValMap1 == nil && len(realTypeVal) != 0 {
-				tmp := NewSortMap()
-				tmp.AddKey(key, dislodgeNull)
-				lineMapArr[line] = tmp
-			} else {
-				lineValMap1.AddKey(key, dislodgeNull)
-			}
+
 			//qutil.Debug("lineMapArr---", lineMapArr[line].Keys, lineMapArr[line].Map)
 		} else if realTypeVal, b := val.(string); b { //val为字符串 {"数量":"1"}
 			/*
@@ -2726,19 +2728,19 @@ func (table *Table) analyBrand() {
 					"商品__:"",名称__:"",
 				}
 			*/
-			valArr, f := filterval(realTypeVal) //过滤数据
-			if f {
+			valArr, allempty := filterVal(realTypeVal) //过滤数据
+			if allempty {
 				continue
 			}
 			realTypeVal = valArr[0]
 			line := underline.FindString(key)
-			lineValMap1 := lineMap[line]
-			if lineValMap1 == nil {
+			lineValMap2 := lineMap[line]
+			if lineValMap2 == nil {
 				tmp := NewSortMap()
 				tmp.AddKey(key, realTypeVal)
 				lineMap[line] = tmp
 			} else {
-				lineValMap1.AddKey(key, realTypeVal)
+				lineValMap2.AddKey(key, realTypeVal)
 			}
 			//qutil.Debug("lineMap---", lineMap[line].Keys, lineMap[line].Map)
 		} else {
@@ -2770,7 +2772,7 @@ func (table *Table) analyBrand() {
 						if nameM == "itemname" || nameM == "modal" {
 							hasGoods(table, v0...) //判断itemname和modal中有没有商品
 							if nameM == "itemname" {
-								v0tmp1 = filteritem(v0...) //过滤itemname
+								v0tmp1 = filterItem(v0...) //过滤itemname
 							}
 						}
 						if nameM == "brandname" || nameM == "modal" {
@@ -2876,7 +2878,7 @@ func (table *Table) analyBrand() {
 						if nameM == "itemname" || nameM == "modal" { //特殊处理itemname
 							hasGoods(table, v1)
 							if nameM == "itemname" {
-								v1tmp1 = filteritem(v1)[0] //过滤itemname
+								v1tmp1 = filterItem(v1)[0] //过滤itemname
 								if v1tmp1 == "" {
 									break
 								}
@@ -3005,11 +3007,9 @@ func assembleData(m interface{}, n int) []map[string]string {
 						data[k4] = v4[i]
 					} else {
 						delete(data, k4)
-						//continue
 					}
 				} else {
 					fmt.Println("err table")
-					//continue
 				}
 			}
 			datas[i] = data
@@ -3101,7 +3101,7 @@ func convert(key, r string) bool {
 	reg, err := regexp.Compile(r)
 	if err != nil {
 		fmt.Println("reg err:", err)
-		return flag
+		return false
 	}
 	flag = reg.MatchString(key)
 	return flag
@@ -3136,6 +3136,24 @@ func hasGoods(table *Table, data ...string) {
 		}
 	}
 }
+
+//func hasBrand(table *Table, data ...string) {
+//	defer qutil.Catch()
+//	if table.TableResult.HasBrand == 1 {
+//		return
+//	}
+//	for i, d := range data {
+//		if d != "" {
+//			brand := u.BrandGet.CheckSensitiveWord(d)
+//			qutil.Debug(d, brand)
+//			if brand != "" {
+//				table.TableResult.HasBrand = 1
+//				break
+//			}
+//		}
+//	}
+//}
+
 func hasBrand(table *Table, data ...string) ([]string, bool) {
 	defer qutil.Catch()
 	//fmt.Println("table.TableResult.HasBrand---------", table.TableResult.HasBrand)
@@ -3161,24 +3179,26 @@ func hasBrand(table *Table, data ...string) ([]string, bool) {
 }
 
 //过滤td值
-func filterval(val ...string) ([]string, bool) {
+func filterVal(val ...string) ([]string, bool) {
 	defer qutil.Catch()
-	flag := false
+	n := 0 //记录被过滤的个数
 	for i, v := range val {
 		afterFilter := tabletdclear.ReplaceAllString(v, "")
 		afterFilter = NullVal.ReplaceAllString(afterFilter, "")
 		if afterFilter == "" {
-			flag = true
-		} else {
-			flag = false
+			n++
 		}
 		val[i] = afterFilter
 	}
-	return val, flag
+	allempty := false
+	if n == len(val) { //所有都被过滤掉
+		allempty = true
+	}
+	return val, allempty
 }
 
 //过滤itemname全是数字
-func filteritem(itemval ...string) []string {
+func filterItem(itemval ...string) []string {
 	defer qutil.Catch()
 	result := []string{}
 	for _, v := range itemval {
@@ -3227,290 +3247,3 @@ func dealNumber(val ...string) ([]string, []string) {
 	}
 	return result, unitnameArr
 }
-
-//func (table *Table) analyBrand() {
-//	//5c2d8c05a5cb26b9b782572b
-//	//产品名称 品牌 规格 单价 单位 数量  小计 质保期
-//	lineMap := make(map[string]map[string]string)
-//	lineMapArr := make(map[string]map[string][]string)
-//	brandRule := u.BrandRules
-//	//将val为数组和string的分开
-//	//qutil.Debug("table.SortKV.Map====", table.SortKV.Map)
-//	for key, val := range table.SortKV.Map {
-//		key = regReplAllSpace.ReplaceAllString(key, "")
-//		key = strings.Replace(key, "", "", -1)    //处理一个特殊的采购量 经上层处理空格后未处理掉
-//		if realTypeVal, ok := val.([]string); ok { //val为数组 {"数量":["1","2","3"]}
-//			/*
-//				{
-//					"商品":["",""],
-//					"商品_"["",""],
-//				}
-
-//			*/
-//			//			valArr, f := filterval(realTypeVal...)
-//			//			if f {
-//			//				qutil.Debug("----", key, valArr)
-//			//				continue
-//			//			}
-//			//			realTypeVal = valArr
-//			//hasGoods1(table, realTypeVal) //判断val中是否含产品
-//			//hasBrand1(table, realTypeVal) //判断val中是否含品牌
-//			line := underline.FindString(key)
-//			lineValMap := lineMapArr[line]
-//			//qutil.Debug("----", key, line, lineValMap)
-//			i := 1
-//		L:
-//			for { //去除数组空数据
-//				last := realTypeVal[len(realTypeVal)-i]
-//				if last == "" {
-//					i++
-//					if i > len(realTypeVal) {
-//						break
-//					}
-//					goto L
-//				} else {
-//					break
-//				}
-//			}
-//			dislodgeNull := realTypeVal[:(len(realTypeVal) - i + 1)] //去除数组中空数据
-//			if len(lineValMap) == 0 && len(realTypeVal) != 0 {       //没有数据
-//				lineMapArr[line] = map[string][]string{key: dislodgeNull}
-//			} else { //新增数据
-//				if len(dislodgeNull) != 0 {
-//					lineValMap[key] = dislodgeNull
-//				}
-//			}
-//			//qutil.Debug("lineMapArr---", lineMapArr)
-//		} else if realTypeVal, b := val.(string); b { //val为字符串 {"数量":"1"}
-//			/*
-//				{
-//					"商品:"",名称:"",
-//					"商品_:"",名称_:"",
-//					"商品__:"",名称__:"",
-//				}
-//			*/
-//			//			valArr, f := filterval(realTypeVal)
-//			//			if f {
-//			//				continue
-//			//			}
-//			//			realTypeVal = valArr[0]
-//			//hasGoods1(table, realTypeVal) //判断val中是否含产品
-//			//hasBrand1(table, realTypeVal) //判断val中是否含品牌
-//			line := underline.FindString(key)
-//			lineValMap := lineMap[line]
-//			if len(lineValMap) == 0 { //没有数据
-//				lineMap[line] = map[string]string{key: realTypeVal}
-//			} else {
-//				lineValMap[key] = realTypeVal
-//			}
-//		} else {
-//			// "_id" : ObjectId("5c2c3802a5cb26b9b78646c4")
-//			//成交供应商排名 [map[entname:昆明合优科技有限公司 sortstr:第一中标候选人 sort:1] map[sort:2 entname:昆明厚起科技有限公司 sortstr:第二中标候选人] map[entname:云南远安科技发展有限公司 sortstr:第三中标候选人 sort:3]]
-//			//fmt.Println("err data:", key, val)
-//		}
-//	}
-
-//	//处理数组数据后,匹配必须title和替换要保存的title
-//	if len(lineMapArr) > 0 {
-//		for _, aMap := range lineMapArr {
-//			maxNum := 0
-//			arrcount1 := 0 //记录key是否存在必须title(数组数据)
-//			arrcount2 := 0
-//			ka := make(map[string][]string) //最终存储数据
-//			//fmt.Println("++++++++++++", aMap)
-//			for k0, v0 := range aMap {
-//				//qutil.Debug("k0:", k0, "v0:", v0, len(v0))
-//				//匹配必须title
-//				for nameM, r := range brandRule["must"] {
-//					if convert(k0, r) { //匹配成功
-//						if len(ka[nameM]) != 0 && strings.Contains(k0, "描述") { //防止k0匹配到多次 和特殊情况 物料名称 物料描述同时出现
-//							continue
-//						}
-//						if nameM == "itemname" || nameM == "modal" {
-//							if nameM == "itemname" {
-//								varr, f := filteritem(v0...) //过滤品目
-//								if f {
-//									break
-//								}
-//								v0 = varr
-//							}
-//							hasGoods(table, v0...) //判断itemname和modal中有没有商品
-//						}
-//						if nameM == "brandname" || nameM == "modal" {
-//							//qutil.Debug(nameM, "++++++", len(ka["brandname"]), len(v0))
-//							if len(ka["brandname"]) == 0 {
-//								brand, allNull := hasBrand(table, v0...)
-//								//qutil.Debug(len(brand), "-------", nameM, brand)
-//								if !allNull {
-//									ka["brandname"] = brand
-//								}
-//								//qutil.Debug("brandname====", len(ka["brandname"]), ka["brandname"])
-//							}
-//						}
-//						if nameM != "brandname" {
-//							ka[nameM] = v0
-//						}
-//						arrcount1++
-//					}
-//				}
-//				//替换其它要保存字段
-//				for nameR, r := range brandRule["replace"] {
-//					if convert(k0, r) { //匹配成功
-//						ka[nameR] = v0
-//						arrcount2++
-//					}
-//				}
-//			}
-//			//找最终存储数据的最小len(arr)
-//			//			for _, vf := range ka {
-//			//				//找最短的数组
-//			//				lenVal := len(vf)
-//			//				if minNum == 0 || minNum > lenVal { //maxNum = len(最短数组)
-//			//					minNum = lenVal
-//			//				}
-//			//			}
-//			//找最终存储数据的最大len(arr),小的补空
-//			//fmt.Println("ka==============", ka)
-//			for _, vf1 := range ka {
-//				lenVal := len(vf1)
-//				if lenVal > maxNum {
-//					maxNum = lenVal
-//				}
-//			}
-//			finishKa := make(map[string][]string)
-//			for vf2K, vf2 := range ka {
-//				if len(vf2) < maxNum {
-//					lenMv := maxNum - len(vf2)
-//					for i := 0; i < lenMv; i++ {
-//						vf2 = append(vf2, "")
-//					}
-//				}
-//				finishKa[vf2K] = vf2
-//			}
-//			hasKey(table, arrcount1) //是否匹配到table中的标题
-//			if arrcount1 >= 1 {
-//				if arrcount1+arrcount2 == 1 { //删除只匹配到一个价钱(总价)
-//					delete(finishKa, "unitprice")
-//				}
-//				finishData := dealArrData(maxNum, finishKa)
-//				table.BrandData = append(table.BrandData, finishData)
-//			}
-//		}
-//	}
-//	//处理string数据后,匹配必须title和替换要保存的title
-//	if len(lineMap) > 0 {
-//		for _, sMap := range lineMap {
-//			strcount1 := 0 //记录key是否存在必须title(字符串数据)
-//			strcount2 := 0
-//			endStrMap := make(map[string]string)
-//			for k1, v1 := range sMap {
-//				//qutil.Debug(k1, "++++++++++", v1)
-//				//匹配必须title
-//				for nameM, r := range brandRule["must"] {
-//					if convert(k1, r) { //匹配成功
-//						if nameM == "itemname" || nameM == "modal" { //特殊处理itemname
-//							if nameM == "itemname" {
-//								varr, f := filteritem(v1) //过滤品目
-//								if f {
-//									break
-//								}
-//								v1 = varr[0]
-//							}
-//							hasGoods(table, v1)
-//						}
-//						if nameM == "brandname" || nameM == "modal" { //特殊处理brandname
-//							if len(endStrMap["brandname"]) == 0 {
-//								brand, allNull := hasBrand(table, v1)
-//								if !allNull {
-//									endStrMap["brandname"] = brand[0]
-//								}
-//							}
-//						}
-//						if nameM != "brandname" {
-//							endStrMap[nameM] = v1
-//						}
-//						strcount1++
-//					}
-//				}
-//				//替换其它要保存字段
-//				for nameR, r := range brandRule["replace"] {
-//					if convert(k1, r) { //匹配成功
-//						endStrMap[nameR] = v1
-//						strcount2++
-//					}
-//				}
-//			}
-//			//原始字符串数据处理
-//			hasKey(table, strcount1) //是否匹配到table中的标题
-//			if strcount1 >= 1 {
-//				if strcount1+strcount2 == 1 { //删除只匹配到一个价钱(总价)
-//					delete(endStrMap, "unitprice")
-//				}
-//				finishData := dealStrData(endStrMap) //处理数据
-//				if len(finishData) > 0 {
-//					table.BrandData = append(table.BrandData, finishData)
-//				}
-//			}
-//		}
-//	}
-//}
-
-////是否有商品
-//func hasGoods1(table *Table, data interface{}) {
-//	if table.TableResult.HasGoods == 1 {
-//		return
-//	}
-//	sData, ok := data.(string)
-//	proFlag := ""
-//	if ok { //string数据检查goods
-//		if sData != "" {
-//			proFlag = u.GoodsGet.CheckSensitiveWord(sData)
-//			if len(proFlag) > 0 {
-//				table.TableResult.HasGoods = 1
-//			}
-//		}
-//	} else { //arr数据检查goods
-//		arrData := data.([]string)
-//		if len(arrData) > 0 {
-//			for _, src := range arrData {
-//				if src != "" {
-//					proFlag = u.GoodsGet.CheckSensitiveWord(src)
-//					if len(proFlag) > 0 {
-//						table.TableResult.HasGoods = 1
-//						break
-//					}
-//				}
-//			}
-//		}
-//	}
-//}
-
-////是否有品牌
-//func hasBrand1(table *Table, data interface{}) {
-//	if table.TableResult.HasBrand == 1 {
-//		return
-//	}
-//	sData, ok := data.(string)
-//	if ok { //string数据检查brand
-//		if sData != "" {
-//			brand := u.BrandGet.CheckSensitiveWord(sData)
-//			if len(brand) > 0 {
-//				fmt.Println("brand:", brand, sData)
-//				table.TableResult.HasBrand = 1
-//			}
-//		}
-//	} else { //arr数据检查brand
-//		arrData := data.([]string)
-//		if len(arrData) > 0 {
-//			for _, src := range arrData {
-//				if src != "" {
-//					brand := u.BrandGet.CheckSensitiveWord(src)
-//					if len(brand) > 0 {
-//						table.TableResult.HasBrand = 1
-//						break
-//					}
-//				}
-//			}
-//		}
-//	}
-//}

+ 2 - 2
src/res/brandrule.json

@@ -1,6 +1,6 @@
 {
 	"must":{
-		"itemname":"((^(货物|品目|产品|标项|商品|物资|印刷品|物料|材料|设备|成交标(的)?)(名称|种类|内容|服务)+|服务产品|(采购|机械)(目录|设备)|^(品名|品目)$)和?)+",
+		"itemname":"(^(货物|品目|产品|标项|商品|物资|印刷品|物料|材料|设备)(名称|种类|内容|服务)?|服务产品|(采购|机械)(目录|设备))+",
 		"brandname":"^(品牌(名称)?|厂家)",
 		"modal":"^(规格)?(型号|参数)|规格$|技术规格", 
 		"unitprice":"单价|^价格|(预算|采购预算)(金额)?$|(单个商品|包件)最高限价|(中标成交|单次服务|控制)+金额|^金额$"
@@ -8,7 +8,7 @@
 	"replace":{	
 		"unitname":"(产品|计量|数量)单位|^单位",
 		"number":"(采购|需求|预估)(数)?量|^数量|服务次数",
-		"totalprice":"小计|总价|预算总价|合计|报价总金额",
+		"totalprice":"小计|(报价|预算)?总(价|金额)|合计",
 		"guaranteetime":"(免费)?质保期|服务期(限)?|服务时间"
 	}	
 }

+ 2 - 2
src/web/res/doublebox/css/hdw.css

@@ -1,5 +1,5 @@
 
-#selectclear select { 
+#selectclear select {
 	width:190px; 
 	height:167px;
 	padding:5px;
@@ -17,7 +17,7 @@
 	margin: 1px 0px;
     padding: 4px 6px;
 }
-#selectclear .doublebox { 
+#selectclear .doublebox {
 	text-align:center; 
 }
 

+ 29 - 1
src/web/res/doublebox/js/hdw.js

@@ -34,5 +34,33 @@ $(document).ready(function(){
 	
 	//$("#remove_all").click(function(){
 	//	$("#select2 option").appendTo("#select1");
-	//});	
+	//});
+    $("#selectclear2 #right2").click(function(){
+        $("#select3 option:selected").appendTo("#select4");
+    });
+    //左移
+    $("#selectclear2 #left2").click(function(){
+        $("#select4 option:selected").appendTo("#select3");
+    });
+    //上移下移
+    $("#selectclear2 #up2,#selectclear2 #down2").click(function() {
+        var $opt = $("#select4 option:selected:first");
+        if (!$opt.length){
+            return;
+        }
+        if (this.id == "up2"){
+            $opt.prev().before($opt);
+        }else{
+            $opt.next().after($opt);
+        }
+    });
+
+    //双击右移
+    $("#selectclear2 #select3").dblclick(function(){
+        $("#selectclear2 #select3 option:selected").appendTo("#select4");
+    });
+    //双击左移
+    $("#selectclear2 #select4").dblclick(function(){
+        $("#selectclear2 #select4 option:selected").appendTo("#select3");
+    });
 });

+ 49 - 20
src/web/templates/admin/com_memu.html

@@ -1,10 +1,10 @@
 {{ define "memu" }}
 <aside class="main-sidebar">
     <section class="sidebar">
-      <ul class="sidebar-menu" data-widget="tree">
+      <ul id="menu" class="sidebar-menu" data-widget="tree">
         <li class="header">HEADER</li>
         <!-- Optionally, you can add icons to the links -->
-		<li class="treeview">
+		<!--<li class="treeview">
           	<a href="#"><i class="fa fa-clock-o"></i> <span>任务管理</span>
             <span class="pull-right-container">
                 <i class="fa fa-angle-left pull-right"></i>
@@ -12,22 +12,10 @@
           	</a>
           	<ul class="treeview-menu">
 	            <li><a href="/admin/task"><i class="fa fa-link"></i>抽取任务</a></li>
-				<li><a href="/admin/taskclear"><i class="fa fa-link"></i>清理任务</a></li>
 				<li><a href="/admin/task/export"><i class="fa fa-link"></i>导出任务</a></li>
 			</ul>
-        </li>
-		<li class="treeview">
-          	<a href="#"><i class="fa fa-clock-o"></i> <span>版本管理</span>
-            <span class="pull-right-container">
-                <i class="fa fa-angle-left pull-right"></i>
-            </span>
-          	</a>
-          	<ul class="treeview-menu">
-	            <li><a href="/admin/version"><i class="fa fa-link"></i>抽取版本</a></li>
-				<li><a href="/admin/versionclear"><i class="fa fa-link"></i>清理版本</a></li>
-			</ul>
-        </li>
-		<!--<li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>-->
+        </li>-->
+		<!--<li><a href="/admin/version"><i class="fa fa-navicon"></i><span>版本管理</span></a></li>
 		<li><a href="/admin/audit/recogfield"><i class="fa fa-navicon"></i><span>质量审核</span></a></li>
 		<li class="treeview">
           	<a href="#"><i class="fa fa-laptop"></i> <span>统计</span>
@@ -41,11 +29,52 @@
         </li>
 		<li><a href="/admin/resulttrack"><i class="fa fa-laptop"></i>结果追踪</a></li>
         <li><a href="/admin/distribution"><i class="fa fa-laptop"></i> <span>分布式抽取</span></a></li>
-		<li><a href="/admin/user"><i class="fa fa-link"></i> <span>人员管理</span></a></li>
+		<li class="treeview">
+			<a href="/admin/user"><i class="fa fa-link"></i> <span>权限管理</span>
+			<span class="pull-right-container">
+                <i class="fa fa-angle-left pull-right"></i>
+            </span></a>
+          	<ul class="treeview-menu">
+	            <li><a href="/admin/user"><i class="fa fa-circle-o"></i>人员管理</a></li>
+				<li><a href="/admin/rule/pre"><i class="fa fa-circle-o"></i>角色管理</a></li>
+				<li><a href="/admin/rule/pre"><i class="fa fa-circle-o"></i>菜单管理</a></li>
+			</ul>
+
+		</li>-->
       </ul>
     </section>
+	<span id="role" class="hidden">{{session "role"}}</span>
 </aside>
 <script>
+$(function () {
+	$.post('/admin/menu','',function (data,status) {
+		for(var a=0;a<data.data.length;a++) {
+            var info=data.data[a]
+            console.log(info)
+		    if (info.secondmenu){
+                var str=""
+                for(var sec=1;sec<=Object.keys(info.secondmenu).length;sec++){
+                    var ro=$("#role").text()
+                    if(ro=="3" || info.secondmenu[sec.toString(10)].role[ro] ) {
+                        str = str + '<li><a href=' + info.secondmenu[sec.toString(10)].href + '><i class="' + info.secondmenu[sec.toString(10)].pic + '"></i>' + info.secondmenu[sec.toString(10)].name + '</a></li>'
+                    }
+                }
+                $('#menu').append('<li class="treeview">\n' +
+                        '          \t<a href="#"><i class="'+info.pic+'"></i> <span>'+info.name+'</span>\n' +
+                        '            <span class="pull-right-container">\n' +
+                        '                <i class="fa fa-angle-left pull-right"></i>\n' +
+                        '            </span>\n' +
+                        '          \t</a>\n' +
+                        '          \t<ul class="treeview-menu">\n' + str+
+                        '\t\t\t</ul>\n' +
+                        '        </li>')
+			}else{
+                $('#menu').append('<li><a href='+info.href+'><i class="'+info.pic+'"></i> <span>'+info.name+'</span></a></li>')
+			}
+
+        }
+    })
+})
 function menuActive(name){
 	$(".sidebar-menu").tree();
 	$(".sidebar-menu").filter(".menu-open").removeClass("menu-open");
@@ -56,9 +85,9 @@ function menuActive(name){
 			a=$(this)
 		}
 	});
-	a.parent().addClass("active");
-	a.parent().parent().parent().addClass("active");
-	a.parent().parent().parent().addClass("menu-open");
+	// a.parent().addClass("active");
+	// a.parent().parent().parent().addClass("active");
+	// a.parent().parent().parent().addClass("menu-open");
 }
 </script>
 {{ end }}

+ 203 - 0
src/web/templates/admin/menu.html

@@ -0,0 +1,203 @@
+{{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" onclick="formReset()">新增菜单</button></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/menu"><i class="fa fa-dashboard"></i> 菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>名字</th>
+                                <th>链接</th>
+                                <th>样式</th>
+                                <th>二级菜单</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<div class="modal fade" id="modal-info">
+    <div class="modal-dialog">
+        <form id="userform" 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="name" name="name" type="text" class="form-control" placeholder="请输入名称">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">链接:</label>
+                        <div class="col-sm-10">
+                            <input id="href" name="href" 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">
+                            <input id="pic"  name="pic" type="text" class="form-control" placeholder="请输入图标样式" value="fa fa-laptop">
+                        </div>
+                    </div>
+                    <!--<div class="form-group">
+                        <label for="modify" class="col-sm-2 control-label">二级菜单:</label>
+                        <div id="secondmenu" class="col-sm-10">
+                            <input type="button" value="+" onclick="append()"></input>
+                        </div>
+                    </div>-->
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal" onclick="formReset()">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+        <input type="hidden" id="_id">
+
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/menu/data",
+                "type": "post",
+                "data":{}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                { "data": "href",render:function(val,a,row){
+                    if(row.href){
+                        return row.href
+                    }else{
+                        return ""
+                    }
+                }},
+                { "data": "pic"},
+                {"data":"secondmenu",render:function(val,a,row){
+                    return '<a class="btn btn-sm btn-success" href="/admin/secondmenu?id='+row._id+'">进入二级菜单</a>'
+                    }},
+                {"data":"_id",render:function(val,a,row){
+                        return  "<a href='#' onclick='edit(\""+val+"\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+                                "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+
+    function save(){
+        na=$("#name").val()
+        href=$("#href").val()
+        pic=$("#pic").val()
+        if(na==""||pic==""){
+            alert("表单填写不完整!")
+            return false;
+        }
+        _id=$("#_id").val()
+        if (_id){
+            map={"name":na,"href":href,"pic":pic,"_id":_id}
+        }else{
+            map={"name":na,"href":href,"pic":pic}
+        }
+        $.ajax({
+            url:"/admin/menu/save",
+            type:"post",
+            data:map,
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+
+    function edit(_id){
+        $.ajax({
+            url:"/admin/menu/searchbyid",
+            type:"post",
+            data:{"_id":_id},
+            success:function(r){
+                if(r.rep){
+                    $("#_id").val(r.rep._id)
+                    $.setForm('#userform',r.rep);
+                    $("#name").attr("disabled",false);
+                }
+            }
+        })
+        $("#modal-info").modal("show");
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/menu/del",
+                type:"post",
+                data:{"_id":_id},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#email").attr("disabled",false);
+        $("#name").attr("disabled",false);
+        $("#userform")[0].reset();
+        $("#_id").removeAttr("value")
+    }
+</script>

+ 56 - 0
src/web/templates/admin/role.html

@@ -0,0 +1,56 @@
+{{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/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <br>
+        <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>
+                            </tr>
+                            </thead>
+                            <tbody>
+                                <tr>
+                                    <td>管理员</td>
+                                    <td><a class="btn btn-sm btn-success" href="/admin/role/menu?role=0">编辑</a></td>
+                                </tr>
+                                <tr>
+                                    <td>审核员</td>
+                                    <td><a class="btn btn-sm btn-success" href="/admin/role/menu?role=1">编辑</a></td>
+                                </tr>
+                                <tr>
+                                    <td>开发员</td>
+                                    <td><a class="btn btn-sm btn-success" href="/admin/role/menu?role=2">编辑</a></td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}

+ 255 - 0
src/web/templates/admin/rolemenu.html

@@ -0,0 +1,255 @@
+{{template "inc"}}
+<!-- Main Header -->
+{{template "header"}}
+<!-- Left side column. 权限菜单 -->
+{{template "memu"}}
+<head>
+    <style>
+
+        #selectclear2 select {
+            width:190px;
+            height:167px;
+            padding:5px;
+        }
+        #selectclear2{
+            display: flex;
+            flex-direction: row;
+        }
+        #selectclear2 .move{
+            display: flex;
+            flex-direction: column;
+            margin: 20px 25px
+        }
+        #selectclear2 .move button{
+            margin: 1px 0px;
+            padding: 4px 6px;
+        }
+        #selectclear2 .doublebox {
+            text-align:center;
+        }
+
+
+    </style>
+</head>
+
+<!-- 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" onclick="formReset()">新增角色菜单</button></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
+            <li><a href="/admin/rolemenu"><i class="fa fa-dashboard"></i> 角色菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>一级菜单</th>
+                                <th>二级菜单</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<div class="modal fade" id="modal-info">
+    <div class="modal-dialog">
+        <form id="userform" 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">
+                            <select id="menu2" name="role" class="form-control" onclick="menu()">
+                            </select>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">二级菜单:</label>
+                        <div class="col-sm-10" id="selectclear2">
+                            <div class="doublebox">
+                                <select multiple="multiple" id="select3" style="overflow-x: scroll;"></select>
+                            </div>
+                            <div class="move">
+                                <button type="button" id="up2" class="btn btn-primary">上移</button>
+                                <button type="button" id="right2" class="btn btn-primary">右移</button>
+                                <button type="button" id="left2" class="btn btn-primary">左移</button>
+                                <button type="button" id="down2" class="btn btn-primary">下移</button>
+                            </div>
+                            <div class="doublebox">
+                                <select multiple="multiple" id="select4" style="overflow-x: scroll;"></select>
+                            </div>
+                        </div>
+                    </div>
+                    <!--<div class="form-group">
+                        <label for="modify" class="col-sm-2 control-label">二级菜单:</label>
+                        <div id="secondmenu" class="col-sm-10">
+                            <input type="button" value="+" onclick="append()"></input>
+                        </div>
+                    </div>-->
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal" onclick="formReset()">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/role/menu/data",
+                "type": "post",
+                "data":{"role":{{.role}}}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                {"data":"_id",render:function (val,a,row) {
+                        if (row.secondmenu) {
+                            role={{.role}}
+                            return '<a class="btn btn-sm btn-success" href="/admin/role/secondmenu?_id=' + row._id + '&role='+role+'">进入二级菜单</a>'
+                        }else{
+                            return "无二级菜单"
+                        }
+                }},
+                {"data":"_id",render:function(val,a,row){
+                        return "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+    function menu() {
+        console.log($("#menu2").val())
+        $("#select3").empty();
+        $("#select4").empty();
+        $.post("/admin/role/select",{"_id":$("#menu2").val()},function (data,status) {
+            if(data.data){
+                for(var a=0;a<data.data.length;a++){
+                    $("#select3").append("<option title='"+data.data[a].name+"' value='"+data.data[a]._id+"'>"+data.data[a].name+"</option>");
+                }
+            }
+        })
+    }
+    function save(){
+        menu=$("#menu2").val()
+        var clearArr = [];
+        $("#select4 option").each(function(i,val){
+            clearArr[i] = this.value
+        })
+        var secondmenuStr = JSON.stringify(clearArr)
+        if(menu == ""){
+            alert("表单填写不完整!");
+            return false;
+        }
+        $.ajax({
+            url:"/admin/role/menu/save",
+            type:"post",
+            data:{"role":{{.role}},"menu":menu,"secondmenuStr":secondmenuStr},
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/role/menu/del",
+                type:"post",
+                data:{"_id":_id,"role":{{.role}}},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#menu2").empty()
+        $("#select3").empty();
+        $("#select4").empty();
+        $("#menu2").append("<option value=''>--请选择--</option>")
+        $.post("/admin/menu/data",'',function (data,status) {
+            for(var a=0;a<data.data.length;a++) {
+                console.log(a)
+                $("#menu2").append("<option value="+data.data[a]._id+">"+data.data[a].name+"</option>")
+            }
+        })
+        $("#modal-info-addclear").modal("show");
+    }
+    $("#selectclear2 #right2").click(function(){
+        $("#select3 option:selected").appendTo("#select4");
+    });
+    //左移
+    $("#selectclear2 #left2").click(function(){
+        $("#select4 option:selected").appendTo("#select3");
+    });
+    $("#selectclear2 #up2,#selectclear2 #down2").click(function() {
+        var $opt = $("#select4 option:selected:first");
+        if (!$opt.length){
+            return;
+        }
+        if (this.id == "up2"){
+            $opt.prev().before($opt);
+        }else{
+            $opt.next().after($opt);
+        }
+    });
+    //双击右移
+    $("#selectclear2 #select3").dblclick(function(){
+        $("#selectclear2 #select3 option:selected").appendTo("#select4");
+    });
+    //双击左移
+    $("#selectclear2 #select4").dblclick(function(){
+        $("#selectclear2 #select4 option:selected").appendTo("#select3");
+    });
+</script>

+ 123 - 0
src/web/templates/admin/rolesecondmenu.html

@@ -0,0 +1,123 @@
+{{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/role"><i class="fa fa-dashboard"></i> 角色管理</a></li>
+            <li><a href="/admin/rolemenu"><i class="fa fa-dashboard"></i> 角色菜单管理</a></li>
+            <li><a href="/admin/rolesecondmenu"><i class="fa fa-dashboard"></i> 角色二级菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>名字</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/role/secondmenu/data",
+                "type": "post",
+                "data":{"role":{{.role}},"_id":{{._id}}}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                {"data":"_id",render:function(val,a,row){
+                        return "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+
+    function save(){
+        na=$("#name").val()
+        href=$("#href").val()
+        pic=$("#pic").val()
+        if(na==""||pic==""){
+            alert("表单填写不完整!")
+            return false;
+        }
+        _id=$("#_id").val()
+        if (_id){
+            map={"name":na,"href":href,"pic":pic,"_id":_id}
+        }else{
+            map={"name":na,"href":href,"pic":pic}
+        }
+        $.ajax({
+            url:"/admin/menu/save",
+            type:"post",
+            data:map,
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/role/secondmenu/del",
+                type:"post",
+                data:{"_id":_id,"role":{{.role}}},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#email").attr("disabled",false);
+        $("#name").attr("disabled",false);
+        $("#userform")[0].reset();
+        $("#_id").removeAttr("value")
+    }
+</script>

+ 194 - 0
src/web/templates/admin/secondmenu.html

@@ -0,0 +1,194 @@
+{{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" onclick="formReset()">新增二级菜单</button></small>
+        </h1>
+        <ol class="breadcrumb">
+            <li><a href="/admin/secondmenu?id={{._id}}"><i class="fa fa-dashboard"></i> 二级菜单管理</a></li>
+        </ol>
+    </section>
+    <!-- Main content -->
+    <section class="content">
+        <div class="row">
+            <div class="col-xs-12">
+                <div class="box">
+                    <div class="box-body">
+                        <table id="dataTable" class="table table-bordered table-hover">
+                            <thead>
+                            <tr>
+                                <th>名字</th>
+                                <th>链接</th>
+                                <th>样式</th>
+                                <th>操作</th>
+                            </tr>
+                            </thead>
+                        </table>
+                    </div>
+                    <!-- /.box-body -->
+                </div>
+                <!-- /.box -->
+            </div>
+        </div>
+    </section>
+</div>
+
+<div class="modal fade" id="modal-info">
+    <div class="modal-dialog">
+        <form id="userform" 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="name" name="name" type="text" class="form-control" placeholder="请输入名称">
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label for="code" class="col-sm-2 control-label">链接:</label>
+                        <div class="col-sm-10">
+                            <input id="href" name="href" 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">
+                            <input id="pic"  name="pic" type="text" class="form-control" placeholder="请输入图标样式" value="fa fa-circle-o">
+                        </div>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal" onclick="formReset()">取消</button>
+                    <button type="button" class="btn btn-primary" onclick="save()">保存</button>
+                </div>
+            </div>
+            <!-- /.modal-content -->
+        </form>
+        <input type="hidden" id="_id">
+    </div>
+    <!-- /.modal-dialog -->
+</div>
+<!-- /.modal -->
+
+<!-- footer -->
+{{template "footer"}}
+
+<script>
+    menuActive("user")
+    $(function () {
+        ttable=$('#dataTable').DataTable({
+            "paging"      : true,
+            "lengthChange": false,
+            "searching"   : true,
+            "ordering"    : true,
+            "info"        : true,
+            "autoWidth"   : false,
+            "ajax": {
+                "url": "/admin/secondmenu/data",
+                "type": "post",
+                "data":{"_id":{{._id}}}
+            },
+            "language": {
+                "url": "/res/dist/js/dataTables.chinese.lang"
+            },
+            "columns": [
+                { "data": "name",render:function(val,a,row){
+                        return row.name}},
+                { "data": "href",render:function(val,a,row){
+                        if(row.href){
+                            return row.href
+                        }else{
+                            return ""
+                        }
+                    }},
+                { "data": "pic"},
+                {"data":"_id",render:function(val,a,row){
+                        return  "<a href='#' onclick='edit(\""+val+"\")'><i class='fa fa-fw fa-edit text-yellow'></i></a> &nbsp;"+
+                                "<a href='#' onclick='del(\""+val+"\")'><i class='fa fa-fw fa-trash text-red'></i></a>"
+                    }}
+
+            ]
+        });
+        //ttable.on('init.dt', function () {});
+    })
+    count=0
+
+    function save(){
+        na=$("#name").val()
+        href=$("#href").val()
+        pic=$("#pic").val()
+        if(na==""||href==""||pic==""){
+            alert("表单填写不完整!")
+            return false;
+        }
+        _id=$("#_id").val()
+        if (_id){
+            map={"name":na,"href":href,"pic":pic,"_id":_id,"menuid":{{._id}}}
+        }else{
+            map={"name":na,"href":href,"pic":pic,"menuid":{{._id}}}
+        }
+        $.ajax({
+            url:"/admin/secondmenu/save",
+            type:"post",
+            data:map,
+            success:function(r){
+                if(r.rep){
+                    $("#userform")[0].reset();
+                    $("#modal-info").modal("hide");
+                    ttable.ajax.reload();
+                }else{
+                    alert("保存失败");
+                }
+            }
+        })
+    }
+
+    function edit(_id){
+        $.ajax({
+            url:"/admin/secondmenu/searchbyid",
+            type:"post",
+            data:{"_id":_id},
+            success:function(r){
+                if(r.rep){
+                    $("#_id").val(r.rep._id)
+                    $.setForm('#userform',r.rep);
+                    $("#name").attr("disabled",false);
+                }
+            }
+        })
+        $("#modal-info").modal("show");
+    }
+    function del(_id){
+        showConfirm("确定删除?", function() {
+            $.ajax({
+                url:"/admin/secondmenu/del",
+                type:"post",
+                data:{"_id":_id},
+                success:function(r){
+                    if(r.rep){
+                        ttable.ajax.reload();
+                    }else{
+                        showTip("删除失败", 1000, function() {});
+                    }
+                }
+            })
+        });
+    }
+    function formReset(){
+        $("#email").attr("disabled",false);
+        $("#name").attr("disabled",false);
+        $("#userform")[0].reset();
+        $("#_id").removeAttr("value")
+    }
+</script>

+ 6 - 4
src/web/templates/admin/user.html

@@ -124,8 +124,10 @@ $(function () {
 					role="开发员"
 				}else if(val==1){
 					role="审核员"
-				}else{
-					role="管理员"
+				}else if(val==0){
+                    role="管理员"
+                }else{
+					role="超级管理员"
 				}
 				return role
 			}},
@@ -140,9 +142,9 @@ $(function () {
 function save(){
 	email=$("#email").val()
 	pwd=$("#pwd").val()
-	name=$("#name").val()
+	na=$("#name").val()
 	role=$("#role").val()
-	if(email==""||name==""||role==""||pwd==""){
+	if(email==""||na==""||role==""||pwd==""){
 		alert("表单填写不完整!")
 		return false;
 	}