Quellcode durchsuchen

用户模块新增爬虫审核日志导出功能

mxs vor 1 Jahr
Ursprung
Commit
30188ab352

+ 175 - 49
src/front/front.go

@@ -3,9 +3,14 @@ package front
 
 import (
 	"fmt"
+	"github.com/go-xweb/httpsession"
+	"github.com/go-xweb/xweb"
+	"github.com/lauyoume/gopinyin"
+	"github.com/tealeg/xlsx"
 	"io/ioutil"
 	"log"
 	"mongodb"
+	"os"
 	qu "qfw/util"
 	"qfw/util/redis"
 	"regexp"
@@ -15,13 +20,9 @@ import (
 	"strconv"
 	"strings"
 	"sync"
+	task "taskManager"
 	"time"
 	u "util"
-
-	"github.com/go-xweb/httpsession"
-	"github.com/go-xweb/xweb"
-	"github.com/lauyoume/gopinyin"
-	"github.com/tealeg/xlsx"
 )
 
 type Front struct {
@@ -32,6 +33,7 @@ type Front struct {
 	spidernew       xweb.Mapper `xweb:"/center/spider"`                 //爬虫新建
 	reg             xweb.Mapper `xweb:"/center/reg"`                    //爬虫注册
 	assign          xweb.Mapper `xweb:"/center/user/assign"`            //分配爬虫
+	auditExport     xweb.Mapper `xweb:"/center/user/auditexport"`       //导出审核日志
 	loadSpider      xweb.Mapper `xweb:"/center/spider/edit/(.*)"`       //爬虫加载
 	viewSpider      xweb.Mapper `xweb:"/center/spider/view/(.*)"`       //爬虫查看
 	downSpider      xweb.Mapper `xweb:"/center/spider/download/(.*)"`   //爬虫下载
@@ -130,7 +132,7 @@ func (f *Front) Login() error {
 	}
 }
 
-//用户管理
+// 用户管理
 func (f *Front) User() {
 	if f.Method() == "POST" {
 		auth := qu.IntAll(f.GetSession("auth"))
@@ -138,21 +140,47 @@ func (f *Front) User() {
 			start, _ := f.GetInteger("start")
 			limit, _ := f.GetInteger("length")
 			draw, _ := f.GetInteger("draw")
+			platform := f.GetString("s_platform")
+			identity, _ := f.GetInteger("i_identity")
+			userauth, _ := f.GetInteger("i_auth")
+			searchStr := f.GetString("search[value]")
+			search := strings.TrimSpace(searchStr)
 			query := map[string]interface{}{
 				"i_delete": 0, //可用用户
 				"i_auth": map[string]interface{}{
-					"$lt": auth,
+					"$lt": 4,
 				},
 			}
-			user, _ := u.MgoEB.Find("user", query, nil, nil, false, start, limit)
+			if platform != "-1" {
+				query["s_platform"] = platform
+			}
+			if identity != -1 {
+				query["i_identity"] = identity
+			}
+			if userauth != -1 {
+				query["i_auth"] = userauth
+			}
+			if search != "" {
+				query["$or"] = []interface{}{
+					map[string]interface{}{"s_name": map[string]interface{}{"$regex": search}},
+					map[string]interface{}{"s_fullname": map[string]interface{}{"$regex": search}},
+				}
+			}
+			sort := `{"%s":%d}`
+			orderIndex := f.GetString("order[0][column]")
+			orderName := f.GetString(fmt.Sprintf("columns[%s][data]", orderIndex))
+			orderType := 1
+			if f.GetString("order[0][dir]") != "desc" {
+				orderType = -1
+			}
+			sort = fmt.Sprintf(sort, orderName, orderType)
+			qu.Debug(query, sort)
+			user, _ := u.MgoEB.Find("user", query, sort, nil, false, start, limit)
 			count := u.MgoEB.Count("user", query)
 			page := start / 10
 			for k, v := range *user {
 				v["num"] = k + 1 + page*10
-
-				v["l_comeintime"] = time.Unix(v["l_comeintime"].(int64), 0).Format("2006-01-02")
 				v["s_pass"] = util.Se.DecodeString(v["s_pass"].(string))
-				v["userid"] = mongodb.BsonIdToSId(v["_id"])
 			}
 			f.ServeJson(map[string]interface{}{
 				"draw":            draw,
@@ -167,7 +195,7 @@ func (f *Front) User() {
 
 }
 
-//删除用户
+// 删除用户
 func (f *Front) DelUser() {
 	userid := f.GetString("userid")
 	auth := qu.IntAll(f.GetSession("auth"))
@@ -198,7 +226,7 @@ func (f *Front) DelUser() {
 	}
 }
 
-//修改用户
+// 修改用户
 func (f *Front) UpdateUser() {
 	//	username := f.GetString("username")
 	password := f.GetString("password")
@@ -207,46 +235,31 @@ func (f *Front) UpdateUser() {
 	userAuth := f.GetString("userAuth")
 	auth := qu.IntAll(f.GetSession("auth"))
 	self := f.GetString("self")
-	//log.Println("userid----:", userid, "username----:", username, "password----:", password, "auth----:", auth, "self----:", self)
+	identity, _ := f.GetInteger("identity")
+	platform := f.GetString("platform")
+	//log.Println("userid----:", userid, "platform----:", platform, "identity----:", identity, "password----:", password, "auth----:", auth, "self----:", self)
 	query := map[string]interface{}{
 		"_id": mongodb.StringTOBsonId(userid),
 	}
 	update := map[string]interface{}{}
 	if "y" == self { //修改个人信息 只修改个人密码
 		password = util.Se.EncodeString(password)
-		update = map[string]interface{}{
-			"$set": map[string]interface{}{
-				"s_pass": password,
-			},
-		}
-	} else if "y" != self && auth == 4 { //修改他人信息 只修改他人权限
-		if userAuth == "开发员" || userAuth == "审核员" || userAuth == "管理员" {
-			switch userAuth {
-			case "开发员":
-				update = map[string]interface{}{
-					"$set": map[string]interface{}{
-						"i_auth": 1,
-					},
-				}
-			case "审核员":
-				update = map[string]interface{}{
-					"$set": map[string]interface{}{
-						"i_auth": 2,
-					},
-				}
-			case "管理员":
-				update = map[string]interface{}{
-					"$set": map[string]interface{}{
-						"i_auth": 3,
-					},
-				}
-			}
+		update["s_pass"] = password
+	} else if "y" != self && auth == 4 { //修改他人信息
+		update["i_identity"] = identity
+		update["s_platform"] = platform
+		if userAuth == "开发员" {
+			update["i_auth"] = 1
+		} else if userAuth == "审核员" {
+			update["i_auth"] = 2
+		} else if userAuth == "管理员" {
+			update["i_auth"] = 3
 		}
 	} else {
 		f.ServeJson("没有权限!")
 		return
 	}
-	ok := u.MgoEB.Update("user", query, update, false, false)
+	ok := u.MgoEB.Update("user", query, map[string]interface{}{"$set": update}, false, false)
 	if ok {
 		f.ServeJson(map[string]interface{}{
 			"status": "y",
@@ -298,7 +311,7 @@ func (f *Front) CheckEmail() {
 	}
 }
 
-//新增用户
+// 新增用户
 func (f *Front) SaveNewUser() {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if auth != 4 {
@@ -312,6 +325,8 @@ func (f *Front) SaveNewUser() {
 		password = util.Se.EncodeString(password)
 		email := f.GetString("email")
 		userAuth := f.GetString("userAuth")
+		platform := f.GetString("platform")
+		identity, _ := f.GetInteger("identity")
 		if userAuth == "开发员" {
 			i_auth = 1
 		} else if userAuth == "审核员" {
@@ -328,6 +343,9 @@ func (f *Front) SaveNewUser() {
 			"i_auth":       i_auth,
 			"i_delete":     0,
 			"l_comeintime": time,
+			"i_identity":   identity,
+			"i_scope":      -1,
+			"s_platform":   platform,
 		}
 		ok := u.MgoEB.Save("user", save)
 		if ok != "" {
@@ -355,7 +373,7 @@ func (f *Front) Logout() {
 	f.Redirect("/center")
 }
 
-//控制中心
+// 控制中心
 func (f *Front) LoadIndex() {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if f.Method() == "POST" {
@@ -370,6 +388,7 @@ func (f *Front) LoadIndex() {
 		state, _ := f.GetInteger("state")
 		urgency, _ := f.GetInteger("urgency") //节点
 		platform := f.GetString("platform")
+		modifyuser := f.GetString("modifyuser")
 		infoformat, _ := f.GetInteger("infoformat") //节点
 		query := map[string]interface{}{}
 		if event > -1 {
@@ -381,6 +400,9 @@ func (f *Front) LoadIndex() {
 		if platform != "-1" {
 			query["platform"] = platform
 		}
+		if modifyuser != "-1" {
+			query["modifyuser"] = modifyuser
+		}
 		if infoformat > -1 {
 			query["infoformat"] = infoformat
 		}
@@ -451,6 +473,7 @@ func (f *Front) LoadIndex() {
 		for k, _ := range util.Config.Uploadevents {
 			events = append(events, k)
 		}
+		f.T["modifyusers"] = task.GetModifyUsers()
 		sort.Strings(events)
 		f.T["events"] = events
 		f.Render("index.html", &f.T)
@@ -469,7 +492,7 @@ func (f *Front) Checkrepeat() {
 
 }
 
-//新建
+// 新建
 func (f *Front) Spidernew() error {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if auth != u.Role_Admin {
@@ -496,7 +519,7 @@ func (f *Front) Spidernew() error {
 	return f.Render("spideredit.html", &f.T)
 }
 
-//得到模型
+// 得到模型
 func (f *Front) SpiderModel() {
 	f.ServeJson(util.Config.Model)
 }
@@ -859,7 +882,7 @@ func (f *Front) FindName() {
 	}
 }
 
-//分配爬虫
+// 分配爬虫
 func (f *Front) Assign() {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if auth != u.Role_Admin {
@@ -885,6 +908,7 @@ func (f *Front) Assign() {
 				"createuseremail": (*user)["s_email"],
 				"modifyuser":      name,
 				"modifyuserid":    userid,
+				"platform":        (*user)["s_platform"],
 			},
 		}
 		//b := u.MgoE.Update("luaconfig", query, set, false, true)
@@ -901,7 +925,109 @@ func (f *Front) Assign() {
 
 }
 
-//修改维护人
+// 审核日志导出
+func (f *Front) AuditExport() {
+	auth := qu.IntAll(f.GetSession("auth"))
+	if auth > u.Role_Admin {
+		exportnames := f.GetString("exportnames")
+		exporttype := f.GetString("exporttype")
+		starttime := f.GetString("starttime")
+		endtime := f.GetString("endtime")
+		qu.Debug(exportnames, exporttype, starttime, endtime)
+		file, err := xlsx.OpenFile("爬虫审核记录.xlsx")
+		if err != nil {
+			f.Write("文件打开失败!")
+			return
+		}
+		sheet := file.Sheets[0]
+		exportLogs(sheet, exportnames, exporttype, starttime, endtime) //导出数据
+		fname := fmt.Sprintf("爬虫审核打回记录%d.xlsx", time.Now().Unix())
+		err = file.Save(fname)
+		if err != nil {
+			qu.Debug("Save Excel" + fname + "Error")
+			f.ServeJson("导出失败")
+			return
+		}
+		f.ResponseWriter.Header().Add("Content-Disposition", "attachment;filename=爬虫审核打回记录.xlsx")
+		f.ServeFile(fname)
+		go func(path string) { //删除
+			time.Sleep(time.Second * 30)
+			os.Remove(path)
+		}(fname)
+	} else {
+		f.Write("您没有权限")
+	}
+}
+func exportLogs(sheet *xlsx.Sheet, exportnames, exporttype, starttime, endtime string) {
+	st, _ := time.ParseInLocation(qu.Date_Short_Layout, starttime, time.Local)
+	et, _ := time.ParseInLocation(qu.Date_Short_Layout, endtime, time.Local)
+	query := map[string]interface{}{
+		"comeintime": map[string]interface{}{
+			"$gte": st.Unix(),
+			"$lt":  et.Unix(),
+		},
+	}
+	if exporttype == "repulse" { //打回
+		query["types"] = "打回"
+	} else if exporttype == "audit" { //审核
+		query["types"] = "审核"
+	}
+	users := map[string]bool{}
+	for _, user := range strings.Split(exportnames, ",") {
+		users[user] = true
+	}
+	qu.Debug("audit log query:", query)
+	sess := u.MgoEB.GetMgoConn()
+	defer u.MgoEB.DestoryMongoConn(sess)
+	lock := &sync.Mutex{}
+	wg := &sync.WaitGroup{}
+	ch := make(chan bool, 10)
+	n := 0
+	it := sess.DB(u.MgoEB.DbName).C("lua_logs_auditor").Find(&query).Iter()
+	count, _ := sess.DB(u.MgoEB.DbName).C("lua_logs_auditor").Find(&query).Count()
+	qu.Debug("count:", count)
+	for tmp := map[string]interface{}{}; it.Next(tmp); n++ {
+		ch <- true
+		wg.Add(1)
+		go func(tmp map[string]interface{}) {
+			defer func() {
+				<-ch
+				wg.Done()
+			}()
+			id := mongodb.BsonIdToSId(tmp["_id"])
+			auditor := qu.ObjToString(tmp["auditor"])
+			code := qu.ObjToString(tmp["code"])
+			comeintime := qu.Int64All(tmp["comeintime"])
+			comeintime_z := qu.FormatDateByInt64(&comeintime, qu.Date_Full_Layout)
+			event := qu.IntAll(tmp["event"])
+			modifytime := qu.Int64All(tmp["modifytime"])
+			modifytime_z := qu.FormatDateByInt64(&modifytime, qu.Date_Full_Layout)
+			reason := qu.ObjToString(tmp["reason"])
+			types := qu.ObjToString(tmp["types"])
+			spideruser := qu.ObjToString(tmp["spideruser"])
+			if !users[spideruser] {
+				return
+			}
+			lock.Lock()
+			row := sheet.AddRow()
+			lock.Unlock()
+			row.AddCell().SetValue(id)
+			row.AddCell().SetValue(auditor)
+			row.AddCell().SetValue(code)
+			row.AddCell().SetValue(comeintime)
+			row.AddCell().SetValue(comeintime_z)
+			row.AddCell().SetValue(event)
+			row.AddCell().SetValue(modifytime)
+			row.AddCell().SetValue(modifytime_z)
+			row.AddCell().SetValue(reason)
+			row.AddCell().SetValue(spideruser)
+			row.AddCell().SetValue(types)
+		}(tmp)
+		tmp = make(map[string]interface{})
+	}
+}
+
+// 修改维护人
 func editModify(codesarr []string, userid, name string) {
 	qu.Debug("修改爬虫对应任务的维护人:", name, codesarr)
 	//修改modifyid和modify
@@ -923,7 +1049,7 @@ func editModify(codesarr []string, userid, name string) {
 	qu.Debug("任务重新分配成功", b)
 }
 
-//清理Redis
+// 清理Redis
 func (f *Front) DelRedis() {
 	hrefs := f.GetString("href")
 	hrefsarr := strings.Split(hrefs, ",")

+ 138 - 96
src/front/spider.go

@@ -85,7 +85,7 @@ type OtherBase struct {
 	SpiderMoveEvent      string //爬虫采集完历史后要转移到的节点 comm:队列模式、bid:高性能模式
 }
 
-//加载某个爬虫
+// 加载某个爬虫
 func (f *Front) LoadSpider(codeTaskIdReState string) error {
 	tmpStr := strings.Split(codeTaskIdReState, "__")
 	code := tmpStr[0]
@@ -194,7 +194,7 @@ func (f *Front) LoadSpider(codeTaskIdReState string) error {
 	return nil
 }
 
-//查看某个爬虫
+// 查看某个爬虫
 func (f *Front) ViewSpider(id string) error {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if auth >= 1 {
@@ -579,76 +579,78 @@ func LuaSaveLog(code, user string, data *map[string]interface{}, stype int) {
 	}
 }
 
-/*爬虫保存时,检查列表页和三级页代码中是否含lua原生方法
-func LuaTextCheck(code, list, detail string, type_list, infoformat int, model map[string]interface{}, msgResult map[string]string) bool {
-	defer qu.Catch()
-	//1、异常校验
-	var errmsg, warnmsg string
-	if LuaReg.MatchString(list) || LuaReg.MatchString(detail) {
-		errmsg += "代码中含有lua原生方法;"
-	}
-	if ListFilterReg.MatchString(detail) && !strings.Contains(detail, "delete") { //三级页含过滤但是没有data["delete"]="true"
-		errmsg += `三级页缺少data["delete"]="true";`
-	}
-	sln_reg := regexp.MustCompile(`sendListNum\(pageno,list\)`)
-	slnIndexArr := sln_reg.FindAllStringIndex(list, -1)
-	if type_list != 0 && len(slnIndexArr) == 0 { //列表页专家模式且不含sendListNum
-		errmsg += "代码中缺少sendListNum(pageno,list)方法;"
-	} else if type_list == 1 && len(slnIndexArr) > 0 { //判断sendListNum方法的位置
-		trim_reg := regexp.MustCompile("trim")
-		insert_reg := regexp.MustCompile("insert")
+/*
+爬虫保存时,检查列表页和三级页代码中是否含lua原生方法
 
-		trIndexArr := trim_reg.FindAllStringIndex(list, -1)
-		irIndexArr := insert_reg.FindAllStringIndex(list, -1)
-		slIndex := slnIndexArr[len(slnIndexArr)-1] //sendListNum位置
-		trIndex := trIndexArr[len(trIndexArr)-1]   //com.trim位置
-		irIndex := irIndexArr[len(irIndexArr)-1]   //insert位置
-		qu.Debug("sendListNum位置:", trIndex, slIndex, irIndex)
-		if slIndex[1] < trIndex[0] || slIndex[0] > irIndex[1] { //sendListNum方法必须在com.trim方法后,table.insert方法前
-			errmsg += "sendListNum方法位置错误;"
-		}
-	}
-	if type_list == 1 {
-		//校验列表页area、city、distric
-		if !strings.Contains(list, "area") {
-			errmsg += `模板item["area"]不存在;`
-		}
-		if !strings.Contains(list, "city") {
-			errmsg += `模板item["city"]不存在;`
-		}
-		if !strings.Contains(list, "district") {
-			errmsg += `模板item["district"]不存在;`
-		}
-		area := qu.ObjToString(model["area"])
-		city := qu.ObjToString(model["city"])
-		district := qu.ObjToString(model["district"])
-		if area != "" && !strings.Contains(list, area) {
-			errmsg += "省份信息与模板不一致;"
-		}
-		if city != "" && !strings.Contains(list, city) {
-			errmsg += "城市信息与模板不一致;"
-		}
-		if district != "" && !strings.Contains(list, district) {
-			errmsg += "区/县信息与模板不一致;"
+	func LuaTextCheck(code, list, detail string, type_list, infoformat int, model map[string]interface{}, msgResult map[string]string) bool {
+		defer qu.Catch()
+		//1、异常校验
+		var errmsg, warnmsg string
+		if LuaReg.MatchString(list) || LuaReg.MatchString(detail) {
+			errmsg += "代码中含有lua原生方法;"
+		}
+		if ListFilterReg.MatchString(detail) && !strings.Contains(detail, "delete") { //三级页含过滤但是没有data["delete"]="true"
+			errmsg += `三级页缺少data["delete"]="true";`
+		}
+		sln_reg := regexp.MustCompile(`sendListNum\(pageno,list\)`)
+		slnIndexArr := sln_reg.FindAllStringIndex(list, -1)
+		if type_list != 0 && len(slnIndexArr) == 0 { //列表页专家模式且不含sendListNum
+			errmsg += "代码中缺少sendListNum(pageno,list)方法;"
+		} else if type_list == 1 && len(slnIndexArr) > 0 { //判断sendListNum方法的位置
+			trim_reg := regexp.MustCompile("trim")
+			insert_reg := regexp.MustCompile("insert")
+
+			trIndexArr := trim_reg.FindAllStringIndex(list, -1)
+			irIndexArr := insert_reg.FindAllStringIndex(list, -1)
+			slIndex := slnIndexArr[len(slnIndexArr)-1] //sendListNum位置
+			trIndex := trIndexArr[len(trIndexArr)-1]   //com.trim位置
+			irIndex := irIndexArr[len(irIndexArr)-1]   //insert位置
+			qu.Debug("sendListNum位置:", trIndex, slIndex, irIndex)
+			if slIndex[1] < trIndex[0] || slIndex[0] > irIndex[1] { //sendListNum方法必须在com.trim方法后,table.insert方法前
+				errmsg += "sendListNum方法位置错误;"
+			}
 		}
-		if infoformat == 2 && !strings.Contains(detail, "projectname") {
-			errmsg += "拟建/审批数据缺少projectname字段;"
+		if type_list == 1 {
+			//校验列表页area、city、distric
+			if !strings.Contains(list, "area") {
+				errmsg += `模板item["area"]不存在;`
+			}
+			if !strings.Contains(list, "city") {
+				errmsg += `模板item["city"]不存在;`
+			}
+			if !strings.Contains(list, "district") {
+				errmsg += `模板item["district"]不存在;`
+			}
+			area := qu.ObjToString(model["area"])
+			city := qu.ObjToString(model["city"])
+			district := qu.ObjToString(model["district"])
+			if area != "" && !strings.Contains(list, area) {
+				errmsg += "省份信息与模板不一致;"
+			}
+			if city != "" && !strings.Contains(list, city) {
+				errmsg += "城市信息与模板不一致;"
+			}
+			if district != "" && !strings.Contains(list, district) {
+				errmsg += "区/县信息与模板不一致;"
+			}
+			if infoformat == 2 && !strings.Contains(detail, "projectname") {
+				errmsg += "拟建/审批数据缺少projectname字段;"
+			}
+			//校验爬虫代码的一致性
+			if !strings.Contains(list, code) {
+				errmsg += `模板item["spidercode"]值错误;`
+			}
 		}
-		//校验爬虫代码的一致性
-		if !strings.Contains(list, code) {
-			errmsg += `模板item["spidercode"]值错误;`
+		//2、提醒校验
+		if !strings.Contains(detail, "downloadFile") && !strings.Contains(detail, "getFileAttachmentsArrayWithTag") {
+			warnmsg += "三级页缺少下载附件方法;"
 		}
+		msgResult["warn"] += warnmsg
+		msgResult["err"] = errmsg
+		return errmsg != ""
 	}
-	//2、提醒校验
-	if !strings.Contains(detail, "downloadFile") && !strings.Contains(detail, "getFileAttachmentsArrayWithTag") {
-		warnmsg += "三级页缺少下载附件方法;"
-	}
-	msgResult["warn"] += warnmsg
-	msgResult["err"] = errmsg
-	return errmsg != ""
-}*/
+*/
 func LuaTextCheck(infoformat int, param map[string]interface{}, param_list_chrome, param_list_rangechrome, param_content_chrome []sp.ChromeActions, msgResult map[string]string) bool {
-	code := qu.ObjToString(param["code"])
 	list := qu.ObjToString(param["str_list"])
 	detail := qu.ObjToString(param["str_content"])
 	type_list := qu.IntAll(param["type_list"])
@@ -657,15 +659,10 @@ func LuaTextCheck(infoformat int, param map[string]interface{}, param_list_chrom
 	defer qu.Catch()
 	//1、异常校验
 	var errmsg, warnmsg string
-	if LuaReg.MatchString(list) || LuaReg.MatchString(detail) {
-		errmsg += "代码中含有lua原生方法;"
-	}
-	if ListFilterReg.MatchString(detail) && !strings.Contains(detail, "delete") { //三级页含过滤但是没有data["delete"]="true"
-		errmsg += `三级页缺少data["delete"]="true";`
-	}
-	sln_reg := regexp.MustCompile(`sendListNum\(pageno,list\)`)
-	slnIndexArr := sln_reg.FindAllStringIndex(list, -1)
 	if type_list == 1 {
+		if LuaReg.MatchString(list) || LuaReg.MatchString(detail) {
+			errmsg += "代码中含有lua原生方法;"
+		}
 		if strings.Contains(list, "downloadByChrome") { //chrome下载方法动作参数判断
 			for _, act := range param_list_chrome {
 				if act.Action != "changeip" && act.Param == "" {
@@ -680,6 +677,16 @@ func LuaTextCheck(infoformat int, param map[string]interface{}, param_list_chrom
 				}
 			}
 		}
+		if strings.Contains(list, `item["title"]="a"`) {
+			if !strings.Contains(detail, `data["title"]`) {
+				errmsg += "检查代码title的完整性;"
+			}
+		}
+		if strings.Contains(list, "stringFind") && !strings.Contains(list, "--关键词过滤") {
+			errmsg += "列表页代码有过滤方法stringFind但缺少注释:--关键词过滤;"
+		}
+		sln_reg := regexp.MustCompile(`sendListNum\(pageno,list\)`)
+		slnIndexArr := sln_reg.FindAllStringIndex(list, -1)
 		if len(slnIndexArr) == 0 { //列表页专家模式且不含sendListNum
 			errmsg += "代码中缺少sendListNum(pageno,list)方法;"
 		} else if len(slnIndexArr) > 0 { //判断sendListNum方法的位置
@@ -695,6 +702,14 @@ func LuaTextCheck(infoformat int, param map[string]interface{}, param_list_chrom
 				errmsg += "sendListNum方法位置错误;"
 			}
 		}
+		if param, ok := param["param_common"].([]interface{}); ok && len(param) >= 3 {
+			spidercode := qu.ObjToString(param[0])
+			site := qu.ObjToString(param[1])
+			checkText := fmt.Sprintf(`item["spidercode"]="%s";item["site"]="%s"`, spidercode, site)
+			if strings.Contains(list, `item["spidercode"]`) && !strings.Contains(list, checkText) {
+				errmsg += `item["spidercode"]、item["site"]的值与模板不一致;`
+			}
+		}
 		//校验列表页area、city、distric
 		if !strings.Contains(list, "area") {
 			errmsg += `模板item["area"]不存在;`
@@ -721,11 +736,38 @@ func LuaTextCheck(infoformat int, param map[string]interface{}, param_list_chrom
 			errmsg += "拟建/审批数据缺少projectname字段;"
 		}
 		//校验爬虫代码的一致性
-		if !strings.Contains(list, code) {
-			errmsg += `模板item["spidercode"]值错误;`
+		//if !strings.Contains(list, code) {
+		//	errmsg += `模板item["spidercode"]值错误;`
+		//}
+		isHttps := false
+		for _, text := range u.DomainNameReg.FindAllString(list, -1) {
+			if strings.Contains(text, "https") {
+				isHttps = true
+			}
+		}
+		if isHttps {
+			for tmpStr, tmpText := range map[string]string{"列表页": list, "三级页": detail} {
+				downLoadText := u.DownLoadReg.FindString(tmpText)
+				if downLoadText != "" {
+					textArr := strings.Split(downLoadText, ",")
+					if len(textArr) < 4 {
+						errmsg += "download方法添加下载参数;"
+					} else if len(textArr) == 4 {
+						if !u.CodeTypeReg.MatchString(textArr[0]) || (textArr[1] != "true" && textArr[1] != "false") {
+							errmsg += tmpStr + "download方法添加下载参数;"
+						}
+					}
+				}
+			}
 		}
 	}
 	if type_content == 1 {
+		if ListFilterReg.MatchString(detail) && !strings.Contains(detail, "delete") { //三级页含过滤但是没有data["delete"]="true"
+			errmsg += `三级页缺少data["delete"]="true";`
+		}
+		if !strings.Contains(detail, "s_title") {
+			errmsg += "三级页缺少s_title;"
+		}
 		if strings.Contains(detail, "downloadByChrome") { //chrome下载方法动作参数判断
 			for _, act := range param_content_chrome {
 				if act.Action != "changeip" && act.Param == "" {
@@ -743,7 +785,7 @@ func LuaTextCheck(infoformat int, param map[string]interface{}, param_list_chrom
 	return errmsg != ""
 }
 
-//方法测试
+// 方法测试
 func (f *Front) RunStep() {
 	imodal, _ := f.GetInteger("imodal")
 	script, _ := f.GetBool("script")
@@ -923,7 +965,7 @@ func (f *Front) RunStep() {
 	}
 }
 
-//爬虫测试数据json
+// 爬虫测试数据json
 func (f *Front) GetJson() {
 	code := f.GetString("code")
 	username := f.GetSession("username").(string)
@@ -970,7 +1012,7 @@ func (f *Front) GetJson() {
 
 var TestResultMap = map[string]*TestResult{} //username+code
 
-//某个爬虫整体测试结果
+// 某个爬虫整体测试结果
 type TestResult struct {
 	task_remark     string
 	task_rateremark []string
@@ -981,7 +1023,7 @@ type TestResult struct {
 	dataInfo        map[string]interface{}
 }
 
-//整体测试
+// 整体测试
 func (f *Front) SpiderPass() {
 	defer mu.Catch()
 	tr := &TestResult{}
@@ -1189,7 +1231,7 @@ func (f *Front) DownSpider(code string) {
 	u.MgoEB.Save("luadownlogs", downlogs)
 }
 
-//下架删除心跳
+// 下架删除心跳
 func DelSpiderHeart(code string) bool {
 	return u.MgoS.Update("spider_heart", map[string]interface{}{"code": code}, map[string]interface{}{"$set": map[string]interface{}{"del": true}}, false, true)
 }
@@ -1207,7 +1249,7 @@ func DelSpiderHeart(code string) bool {
 //	}
 //}
 
-//爬虫核对
+// 爬虫核对
 func (f *Front) Checktime() {
 	code := f.GetString("code")
 	auth := qu.IntAll(f.GetSession("auth"))
@@ -1224,7 +1266,7 @@ func (f *Front) Checktime() {
 	}
 }
 
-//批量作废
+// 批量作废
 func (f *Front) Disables() error {
 	auth := qu.IntAll(f.GetSession("auth"))
 	events := strings.Split(f.GetString("events"), ",")
@@ -1264,7 +1306,7 @@ func (f *Front) Disables() error {
 	return nil
 }
 
-//批量上下架
+// 批量上下架
 func (f *Front) BatchShelves() {
 	codes := strings.Split(f.GetString("codes"), ",")
 	state, _ := f.GetInteger("state")
@@ -1299,7 +1341,7 @@ func (f *Front) BatchShelves() {
 	f.ServeJson(errCode)
 }
 
-//更新爬虫状态
+// 更新爬虫状态
 func (f *Front) UpState() error {
 	username := f.GetSession("username").(string)
 	code := f.GetString("code")
@@ -1420,7 +1462,7 @@ func (f *Front) Assort() {
 	f.ServeJson(map[string]interface{}{"success": success, "msg": msg})
 }
 
-//更新爬虫状态,并判断是否更新节点爬虫
+// 更新爬虫状态,并判断是否更新节点爬虫
 func UpStateAndUpSpider(code, id, reason, username string, state int) (bool, error) {
 	upresult := false
 	var err error
@@ -1570,7 +1612,7 @@ func UpStateAndUpSpider(code, id, reason, username string, state int) (bool, err
 	return upresult, err
 }
 
-//保存记录信息
+// 保存记录信息
 func SaveRemark(taskid []string, reason, username string) {
 	timeNow := time.Now().Unix()
 	if reason == "" {
@@ -1601,7 +1643,7 @@ func SaveRemark(taskid []string, reason, username string) {
 	}
 }
 
-//修改任务状态
+// 修改任务状态
 func UpTaskState(code []string, num int, reason string, startTime int64) {
 	query := map[string]interface{}{}
 	update := map[string]interface{}{}
@@ -1667,7 +1709,7 @@ func UpTaskState(code []string, num int, reason string, startTime int64) {
 	}
 }
 
-//更新节点
+// 更新节点
 func (f *Front) ChangeEvent() {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if auth != u.Role_Admin {
@@ -1720,7 +1762,7 @@ func (f *Front) ChangeEvent() {
 	}
 }
 
-//验证用户是否有更改状态权限
+// 验证用户是否有更改状态权限
 func IsHasUpState(auth, state int) bool {
 	rep := false
 	switch auth {
@@ -1741,7 +1783,7 @@ func IsHasUpState(auth, state int) bool {
 
 var list_fields = `{"_id":1,"code":1,"createuser":1,"modifyuser":1,"modifytime":1,"l_uploadtime":1,"l_checktime":1,"state":1,"param_common":1,"event":1,"urgency":1,"platform":1,"pendstate":1}`
 
-//脚本管理,结合爬虫运行信息
+// 脚本管理,结合爬虫运行信息
 func (f *Front) LuaList() {
 	auth := qu.IntAll(f.GetSession("auth"))
 	if auth != u.Role_Admin {
@@ -1847,7 +1889,7 @@ func (f *Front) LuaList() {
 	}
 }
 
-//心跳监控
+// 心跳监控
 func (f *Front) Heart() {
 	if f.Method() == "POST" {
 		event, _ := f.GetInteger("event")
@@ -1937,7 +1979,7 @@ func (f *Front) Heart() {
 	}
 }
 
-//爬虫信息
+// 爬虫信息
 type spinfo struct {
 	code                                   string
 	todayDowncount, toDayRequestNum        int
@@ -1949,7 +1991,7 @@ type spinfo struct {
 	lstate                                 string
 }
 
-//爬虫信息
+// 爬虫信息
 func SpiderInfo(data string) {
 	data = sp.Se.DecodeString(data)
 	infos := []map[string]interface{}{}
@@ -1979,7 +2021,7 @@ func SpiderInfo(data string) {
 	}
 }
 
-//接受维护任务信息
+// 接受维护任务信息
 func SpiderModifyTask(data string) {
 	data = sp.Se.DecodeString(data)
 	mtasks := []map[string]interface{}{}
@@ -1992,7 +2034,7 @@ func SpiderModifyTask(data string) {
 	}
 }
 
-//查看是否有该任务
+// 查看是否有该任务
 func checkTask(codes []string, num int) []string {
 	//	var id string = ""
 	query := map[string]interface{}{}

+ 84 - 69
src/util/util.go

@@ -1,6 +1,7 @@
 package util
 
 import (
+	"bytes"
 	"fmt"
 	mgo "mongodb"
 	qu "qfw/util"
@@ -16,21 +17,22 @@ import (
 const Role_Admin, Role_Examine, Role_Dev = 3, 2, 1 //管理员,审核员,开发员
 var (
 	//MgoE            *mgo.MongodbSim //编辑器87
-	MgoEB           *mgo.MongodbSim //编辑器163
-	MgoS            *mgo.MongodbSim
-	Province        map[string][]string
-	City            map[string][]string
-	DomainNameReg   = regexp.MustCompile(`(http|https)[::]+`)
-	DownLoadReg     = regexp.MustCompile(`download\(.*?\)`)
-	CodeTypeReg     = regexp.MustCompile(`(utf8|utf-8|gbk)`)
-	TitleFilterReg1 = regexp.MustCompile(`[\p{Han}]`)
-	TitleFilterReg2 = regexp.MustCompile(`((上|下)一页|阅读次数)`)
-	Area            []string //省份
-	DomainReg       = regexp.MustCompile(`(?://).+?(?:[::/])`)
-	SymbolReg       = regexp.MustCompile("[,,\\s\u3000\u2003\u00a0]+")
-	ReplaceReg      = regexp.MustCompile(`[]::/]+`)
-	CheckText       = `item["spidercode"]="%s";item["site"]="%s";item["channel"]="%s"`
-	JsonDataMap     = map[string]bool{ //jsondata
+	MgoEB            *mgo.MongodbSim //编辑器163
+	MgoS             *mgo.MongodbSim
+	Province         map[string][]string
+	City             map[string][]string
+	DomainNameReg    = regexp.MustCompile(`(http|https)[::]+`)
+	DownLoadReg      = regexp.MustCompile(`download\(.*?\)`)
+	CodeTypeReg      = regexp.MustCompile(`(utf8|utf-8|gbk)`)
+	TitleFilterReg1  = regexp.MustCompile(`[\p{Han}]`)
+	TitleFilterReg2  = regexp.MustCompile(`((上|下)一(页|篇)|阅读次数)`)
+	DetailFilterReg1 = regexp.MustCompile(`((上|下)一(页|篇)|阅读次数|浏览次数|扫一扫|分享|区块链存证)`)
+	Area             []string //省份
+	DomainReg        = regexp.MustCompile(`(?://).+?(?:[::/])`)
+	SymbolReg        = regexp.MustCompile("[,,\\s\u3000\u2003\u00a0]+")
+	ReplaceReg       = regexp.MustCompile(`[]::/]+`)
+	CheckText        = `item["spidercode"]="%s";item["site"]="%s";item["channel"]="%s"`
+	JsonDataMap      = map[string]bool{ //jsondata
 		"extweight":          true,
 		"projecthref":        true,
 		"sourcewebsite":      true,
@@ -112,7 +114,7 @@ func InitMgo() {
 	MgoS.InitPool()
 }
 
-//初始化省市行政区划信息
+// 初始化省市行政区划信息
 func InitAreaCity() {
 	//qu.ReadConfig("areacity.json", &Province)
 	//Area = append(Area, "全国")
@@ -144,68 +146,67 @@ func InitAreaCity() {
 	}
 }
 
-//爬虫整体测试时校验爬虫代码
+// 爬虫整体测试时校验爬虫代码
 func SpiderPassCheckLua(liststr, contentstr string, lua map[string]interface{}) (msg []string) {
 	//校验含过滤方法stringFind但没有过滤注释“--关键词过滤”
-	if strings.Contains(liststr, "stringFind") && !strings.Contains(liststr, "--关键词过滤") {
-		msg = append(msg, "列表页代码有过滤方法stringFind但缺少注释:--关键词过滤")
-	}
-	if strings.Contains(contentstr, "--关键词过滤") && !strings.Contains(contentstr, "delete") {
-		msg = append(msg, `三级页代码有过滤方法但缺少data["delete"]="true"`)
-	}
-	if !strings.Contains(contentstr, "s_title") {
-		msg = append(msg, "三级页缺少s_title")
-	}
+	//if strings.Contains(liststr, "stringFind") && !strings.Contains(liststr, "--关键词过滤") {
+	//	msg = append(msg, "列表页代码有过滤方法stringFind但缺少注释:--关键词过滤")
+	//}
+	//if strings.Contains(contentstr, "--关键词过滤") && !strings.Contains(contentstr, "delete") {
+	//	msg = append(msg, `三级页代码有过滤方法但缺少data["delete"]="true"`)
+	//}
+	//if !strings.Contains(contentstr, "s_title") {
+	//	msg = append(msg, "三级页缺少s_title")
+	//}
 	if !strings.Contains(contentstr, "getFileAttachmentsArrayWithTag") && !strings.Contains(contentstr, "downloadFile") {
 		msg = append(msg, "三级页缺少下载附件方法")
 	}
 	//1.检测spidercode、site、channel
-	if param, ok := lua["param_common"].([]interface{}); ok && len(param) >= 3 {
-		spidercode := qu.ObjToString(param[0])
-		site := qu.ObjToString(param[1])
-		channel := qu.ObjToString(param[2])
-		checkText := fmt.Sprintf(CheckText, spidercode, site, channel)
-		if strings.Contains(liststr, `item["spidercode"]`) && !strings.Contains(liststr, checkText) {
-			msg = append(msg, "检查代码spidercode、site、channel字段值")
-		}
-	}
+	//if param, ok := lua["param_common"].([]interface{}); ok && len(param) >= 3 {
+	//	spidercode := qu.ObjToString(param[0])
+	//	site := qu.ObjToString(param[1])
+	//	channel := qu.ObjToString(param[2])
+	//	checkText := fmt.Sprintf(CheckText, spidercode, site, channel)
+	//	if strings.Contains(liststr, `item["spidercode"]`) && !strings.Contains(liststr, checkText) {
+	//		msg = append(msg, "检查代码spidercode、site、channel字段值")
+	//	}
+	//}
 	//2.检测https
-	isHttps := false
-	for _, text := range DomainNameReg.FindAllString(liststr, -1) {
-		if strings.Contains(text, "https") {
-			isHttps = true
-		}
-	}
-	if isHttps {
-		for tmpStr, tmpText := range map[string]string{"列表页": liststr, "三级页": contentstr} {
-			downLoadText := DownLoadReg.FindString(tmpText)
-			if downLoadText != "" {
-				textArr := strings.Split(downLoadText, ",")
-				if len(textArr) < 4 {
-					msg = append(msg, tmpStr+"download方法添加下载参数")
-				} else if len(textArr) == 4 {
-					if !CodeTypeReg.MatchString(textArr[0]) || (textArr[1] != "true" && textArr[1] != "false") {
-						msg = append(msg, tmpStr+"download方法添加下载参数")
-					}
-				}
-			}
-		}
-
-	}
+	//isHttps := false
+	//for _, text := range DomainNameReg.FindAllString(liststr, -1) {
+	//	if strings.Contains(text, "https") {
+	//		isHttps = true
+	//	}
+	//}
+	//if isHttps {
+	//	for tmpStr, tmpText := range map[string]string{"列表页": liststr, "三级页": contentstr} {
+	//		downLoadText := DownLoadReg.FindString(tmpText)
+	//		if downLoadText != "" {
+	//			textArr := strings.Split(downLoadText, ",")
+	//			if len(textArr) < 4 {
+	//				msg = append(msg, tmpStr+"download方法添加下载参数")
+	//			} else if len(textArr) == 4 {
+	//				if !CodeTypeReg.MatchString(textArr[0]) || (textArr[1] != "true" && textArr[1] != "false") {
+	//					msg = append(msg, tmpStr+"download方法添加下载参数")
+	//				}
+	//			}
+	//		}
+	//	}
+	//}
 	//3.检测title
-	if strings.Contains(liststr, `item["title"]="a"`) {
-		if !strings.Contains(contentstr, `data["title"]`) {
-			msg = append(msg, "检查代码title的完整性")
-		}
-	}
+	//if strings.Contains(liststr, `item["title"]="a"`) {
+	//	if !strings.Contains(contentstr, `data["title"]`) {
+	//		msg = append(msg, "检查代码title的完整性")
+	//	}
+	//}
 	// 4.检测sendListNum
-	if !strings.Contains(liststr, "sendListNum") {
-		msg = append(msg, "sendListNum方法缺失")
-	}
+	//if !strings.Contains(liststr, "sendListNum") {
+	//	msg = append(msg, "sendListNum方法缺失")
+	//}
 	return
 }
 
-//爬虫整体测试时校验列表页和详情页内容
+// 爬虫整体测试时校验列表页和详情页内容
 func SpiderPassCheckListAndDetail(result map[int64][]map[string]interface{}, data map[string]interface{}) (msg []string) {
 	msgMap := map[string]bool{}
 	//校验列表页信息
@@ -251,8 +252,8 @@ func SpiderPassCheckListAndDetail(result map[int64][]map[string]interface{}, dat
 			msgMap["contenthtml中含有iframe是否下载"] = true
 		}
 		detail := qu.ObjToString(data["detail"])
-		if TitleFilterReg2.MatchString(detail) {
-			msgMap["三级页正文提取异常"] = true
+		if DetailFilterReg1.MatchString(detail) {
+			msgMap["三级页正文提取包含无效内容"] = true
 		}
 		//校验jsondata
 		if jsondata, ok := data["jsondata"].(map[string]interface{}); ok && len(jsondata) > 0 {
@@ -269,7 +270,7 @@ func SpiderPassCheckListAndDetail(result map[int64][]map[string]interface{}, dat
 	return
 }
 
-//爬虫整体测试时校验列表页和详情页内容
+// 爬虫整体测试时校验列表页和详情页内容
 func SpiderPassCheckListAndDetail_back(list []map[string]interface{}, data map[string]interface{}) (msg []string) {
 	if len(list) > 0 {
 		p_zero := 0
@@ -516,3 +517,17 @@ func (vs *StringValSorter) Swap(i, j int) {
 	vs.Vals[i], vs.Vals[j] = vs.Vals[j], vs.Vals[i]
 	vs.Keys[i], vs.Keys[j] = vs.Keys[j], vs.Keys[i]
 }
+
+type MyWrite struct {
+	Byte *bytes.Buffer
+}
+
+func (m *MyWrite) Write(p []byte) (n int, err error) {
+	n, err = m.Byte.Write(p)
+	return
+}
+
+func (m *MyWrite) Reader(p []byte) (n int, err error) {
+	n, err = m.Byte.Read(p)
+	return
+}

+ 5 - 3
src/web/staticres/js/head.js

@@ -196,12 +196,14 @@ function cancel(){
 //保存修改密码
 function editUser(){
 	var password = $("#password").val().trim().replace(/\s/g,"");
-	var $auth = $("input:radio[name='auth-box']:checked").val();
+	var auth = $("input:radio[name='auth-box']:checked").val();
+	var identity = $("input:radio[name='identity-box']:checked").val();
+	var platform = $("input:radio[name='platform-box']:checked").val();
 	$("#myModal-edit").modal("hide");
 	var self =sessionStorage.getItem("self");
 	var id =sessionStorage.getItem("userid");
 	//console.log(id+"  "+$auth+"  "+username+"  "+self+"  "+password)
-	$.post("/center/user/updateUser",{"password":password,"userAuth":$auth,"self":self,"userid":id},function(r){
+	$.post("/center/user/updateUser",{"password":password,"userAuth":auth,"self":self,"userid":id,"identity":identity,"platform":platform},function(r){
 		if("y" == r.status){
 			//alert("修改成功");
 			showTip("修改成功", 1000);
@@ -210,7 +212,7 @@ function editUser(){
 			showTip("修改失败", 1000);
 		}
 		$('#com-alert').on('hidden.bs.modal', function () {
-				window.location.reload();
+			window.location.reload();
 		})
 	})
 }

+ 14 - 0
src/web/templates/head.html

@@ -449,6 +449,20 @@
 								<input type="radio" name="auth-box" class="auth" id="gly" value="管理员">管理员</input>
 						    </div>
 						  </div>
+							<div class="form-group">
+								<label for="identity" class="col-sm-2 control-label">身份:</label>
+								<div class="col-sm-10 checkbox-style">
+									<input type="radio" name="identity-box" class="identity" id="nbry" value="1">内部人员</input>
+									<input type="radio" name="identity-box" class="identity" id="wbry" value="0">外包人员</input>
+								</div>
+							</div>
+							<div class="form-group">
+								<label for="platform" class="col-sm-2 control-label">身份:</label>
+								<div class="col-sm-10 checkbox-style">
+									<input type="radio" name="platform-box" class="identity" id="platform-lua" value="golua平台">golua平台</input>
+									<input type="radio" name="platform-box" class="identity" id="platform-python" value="python">python</input>
+								</div>
+							</div>
 						 <div class="form-group">
 						    <label for="comeintime" class="col-sm-2 control-label">注册日期:</label>
 						    <div class="col-sm-10">

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

@@ -57,7 +57,7 @@
 		"info": true,
         "paging": true,
 		"autoWidth": false,
-    "iDisplayLength": 50, //每页初始显示5条记录
+        "iDisplayLength": 50, //每页初始显示5条记录
 
 		"ajax": {
 			"url": "/center/heart",

+ 21 - 1
src/web/templates/index.html

@@ -513,6 +513,7 @@ $(function(){
 			var urgency = $("#luaurgency").val();
 			var platform = $("#platform").val();
 			var infoformat = $("#infoformat").val();
+			var modifyuser = $("#modifyuser").val();
 			//紧急度
 			if(urgency){
 				e.urgency=urgency
@@ -543,6 +544,12 @@ $(function(){
 			}else{
 				e.infoformat="-1"
 			}
+			//类型
+			if(modifyuser){
+				e.modifyuser=modifyuser
+			}else{
+				e.modifyuser="-1"
+			}
 		}
 	});
 	common.setActive("index");
@@ -621,7 +628,20 @@ $(function(){
 			"</select></div>"
 		$("#spider_filter").prepend("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
 		$("#spider_filter").prepend(platform);
-
+		//开发
+		{{if gt (session "auth") 2}}
+		var modifyuser="<option value='-1'>全部</option>"
+		var modifyusers={{.T.modifyusers}}
+		for(k in modifyusers){
+			modifyuser+="<option value='"+modifyusers[k]["s_name"]+"'>"+modifyusers[k]["s_name"]+"</option>"
+		}
+		var selectModifyuser="<div class='form-group'><label for='name'>维护人:</label>"+
+				"<select id='modifyuser' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+				modifyuser+
+				"</select></div>"
+		$("#spider_filter").prepend("&nbsp;&nbsp;");
+		$("#spider_filter").prepend(selectModifyuser);
+		{{end}}
     	$("#spider_wrapper .col-sm-6").css({width:"100%"})//样式
 	});
 })

+ 7 - 7
src/web/templates/newtasklist.html

@@ -89,13 +89,13 @@
   var assigncode = "";
   var assignid = "";
 	$(function(){
-		window.setInterval(function(){
-			$.post("/center/task/getJumpMark",function(r){
-				if(r){
-					ttabletask.ajax.reload();
-				}
-			})
-		}, 3000); 
+		// window.setInterval(function(){
+		// 	$.post("/center/task/getJumpMark",function(r){
+		// 		if(r){
+		// 			ttabletask.ajax.reload();
+		// 		}
+		// 	})
+		// }, 3000);
 		
 		taskConst = true;
 		setCookie("task","");

+ 7 - 7
src/web/templates/question.html

@@ -58,13 +58,13 @@
 <script>
 	common.setActive("index_wtgl");
 	$(function(){
-		window.setInterval(function(){
-			$.post("/center/task/getJumpMark",function(r){
-				if(r){
-					ttableques.ajax.reload();
-				}
-			})
-		}, 3000); 
+		// window.setInterval(function(){
+		// 	$.post("/center/task/getJumpMark",function(r){
+		// 		if(r){
+		// 			ttableques.ajax.reload();
+		// 		}
+		// 	})
+		// }, 3000);
 		
 		taskConst = true;
 		setCookie("ques","");

+ 2 - 2
src/web/templates/sitelist.html

@@ -666,7 +666,7 @@ $(function(){
 	common.setActive("index_site");
 	ttable.on('init.dt', function () {
         //平台
-        var urgency="<div class='form-group'><label for='name'>平台:</label>"+
+        var platform="<div class='form-group'><label for='name'>平台:</label>"+
             "<select id='platform' onchange='checkclick(this.value,\"platform\")' class='form-control input-sm'>"+
             "<option value='-1'>全部</option>"+
             "<option value='golua平台'>golua平台</option>"+
@@ -676,7 +676,7 @@ $(function(){
             "<option value='通用爬虫'>通用爬虫</option>"+
             "</select></div>"
 		$("#sitelist_filter").prepend("&nbsp;&nbsp;");
-		$("#sitelist_filter").prepend(urgency);
+		$("#sitelist_filter").prepend(platform);
 		//节点
         var event="<option value='-1'>全部</option>"
         var events={{.T.events}}

+ 50 - 19
src/web/templates/spiderbase.html

@@ -1,4 +1,15 @@
 <style>
+	#popoverid {
+		position: absolute;
+		display: none;
+		background-color: #F8F9FA;
+		border: 1px solid #CED4DA;
+		padding: 10px;
+		margin-left: 5px;
+		margin-top: -10px;
+		width: max-content;
+		box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+	}
 	.chrome-actions{
 		display: flex;
 		align-items: center;
@@ -215,7 +226,8 @@
 						是否下载三级页 
 					</label>
 					<div class="col-sm-2 checkbox-inputs">
-						<input type="checkbox" {{if .T.lua.param_common}}{{if eq (index .T.lua.param_common 3) true}}checked="checked" {{end}} {{end}} value="{{if .T.lua.param_common}}{{index .T.lua.param_common 3}}{{else}}true{{end}}" id="spiderDownDetailPage" name="Base.SpiderDownDetailPage" />
+<!--						<input type="checkbox" {{if .T.lua.param_common}}{{if eq (index .T.lua.param_common 3) true}}checked="checked" {{end}} {{end}} value="{{if .T.lua.param_common}}{{index .T.lua.param_common 3}}{{else}}true{{end}}" id="spiderDownDetailPage" name="Base.SpiderDownDetailPage" />-->
+						<input type="checkbox" disabled checked="checked" value="true" id="spiderDownDetailPage" name="Base.SpiderDownDetailPage" />
 					</div>
 					<script>
 						if ($("#spiderDownDetailPage").val() == true) {
@@ -329,7 +341,6 @@
 									$("#historymaxpage").removeClass("hide");
 									// $("#movevent").removeClass("hide");
 								}
-
 							</script>
 						</div>
 					</div>
@@ -363,9 +374,9 @@
 									var event = events[k];
 									var endtext = " value="+event+">"+event+"</option>";
 									var midtext = "";
-									// if(event == 7000){
-									// 	midtext = midtext +" disabled style='color:#DADADA'";
-									// }
+									if(event == 7000){
+										midtext = midtext +" disabled style='color:#DADADA'";
+									}
 									if ({{.T.spidertype}} == "increment" && event == {{.T.lua.event}}) {//增量爬虫展示event
 										midtext = midtext + " selected";
 									} else if({{.T.spidertype}} == "history" && event == {{.T.lua.incrementevent}}){//历史展示incrementevent
@@ -420,11 +431,11 @@
 					</div>
 					<script>
 						$(function() {
-					    if ($("#spiderLastDownloadTime").val() == "") {
-					        var timezone = new Date().Format("yyyy-MM-dd hh:mm:ss");
-					        $("#spiderLastDownloadTime").val(timezone);
-					    }
-					})
+							if ($("#spiderLastDownloadTime").val() == "") {
+								var timezone = new Date().Format("yyyy-MM-dd hh:mm:ss");
+								$("#spiderLastDownloadTime").val(timezone);
+							}
+						})
 					</script>
 				</div>
 				<div class="form-group">
@@ -471,17 +482,32 @@
 					</label>
 					<div class="col-sm-2 checkbox-inputs">
 						<input type="checkbox" {{if .T.lua.param_common}}{{if ge (len .T.lua.param_common) 14}}{{if eq (index .T.lua.param_common 13) true}}checked="checked"{{end}}{{end}}{{end}} value="{{if .T.lua.param_common}}{{if ge (len .T.lua.param_common) 14}}{{index .T.lua.param_common 13}}{{else}}false{{end}}{{else}}false{{end}}" id="spiderIsHistoricalMend" name="Base.SpiderIsHistoricalMend" />
+						<span id="popoverid"></span>
 					</div>
 					<script>
+						$(document).ready(function() {
+							$("body").on("click", function(event) {
+								if (!$(event.target).is("#spiderIsHistoricalMend")){
+									$("#popoverid").css("display","none");
+								}
+							});
+						});
 						if ($("#spiderIsHistoricalMend").val() == "true") {
 						    $("#spiderIsHistoricalMend").attr("checked", true);
 						}else{
 							 $("#spiderIsHistoricalMend").removeAttr("checked");
 						}
+						if ({{.T.spidertype}} != "increment") {
+							$("#spiderIsHistoricalMend").attr("disabled", true);
+						}
 						$("#spiderIsHistoricalMend").click(function() {
 						    if ($(this).prop("checked")) {
+								$("#popoverid").text("选中:补采完历史数据,爬虫下架!");
+								$("#popoverid").css("display","inline-block") ;
 						        $(this).val("true")
 						    } else {
+								$("#popoverid").text("未选中:爬虫采集增量数据!");
+								// $("#popoverid").css("display","none");
 						        $(this).val("false")
 						    }
 						});
@@ -492,7 +518,8 @@
 						是否强制下载 &nbsp&nbsp&nbsp 
 					</label>
 					<div class="col-sm-2 checkbox-inputs">
-						<input type="checkbox" {{if .T.lua.param_common}}{{if ge (len .T.lua.param_common) 15}} {{if eq (index .T.lua.param_common 14) true}} checked="checked"{{end}}{{end}}{{else}} checked=""{{end}} value="{{if .T.lua.param_common}}{{if ge (len .T.lua.param_common) 15}}{{index .T.lua.param_common 14}}{{else}}false{{end}}{{else}}false{{end}}" id="spiderIsMustDownload" name="Base.SpiderIsMustDownload" />
+<!--						<input type="checkbox" {{if .T.lua.param_common}}{{if ge (len .T.lua.param_common) 15}} {{if eq (index .T.lua.param_common 14) true}} checked="checked"{{end}}{{end}}{{else}} checked=""{{end}} value="{{if .T.lua.param_common}}{{if ge (len .T.lua.param_common) 15}}{{index .T.lua.param_common 14}}{{else}}false{{end}}{{else}}false{{end}}" id="spiderIsMustDownload" name="Base.SpiderIsMustDownload" />-->
+						<input type="checkbox" disabled checked="" value="false" id="spiderIsMustDownload" name="Base.SpiderIsMustDownload" />
 					</div>
 					<script>
 						if ($("#spiderIsMustDownload").val()=="true") {
@@ -784,13 +811,17 @@
 			</div>`,
 	}
 	function spiderTypeChange(){
-    var val = $("#spiderType").val();
-    if (val == "increment") {//选择增量模式
-      $("#historymaxpage").addClass("hide");
-      	// $("#movevent").addClass("hide");
-	} else {//选择历史模式
-      $("#historymaxpage").removeClass("hide");
-      // $("#movevent").removeClass("hide");
-	}
+		var val = $("#spiderType").val();
+		if (val == "increment") {//选择增量模式
+			$("#historymaxpage").addClass("hide");
+			$("#spiderIsHistoricalMend").attr("disabled",false);
+			// $("#movevent").addClass("hide");
+		} else {//选择历史模式
+			$("#historymaxpage").removeClass("hide");
+		  // $("#movevent").removeClass("hide");
+			$("#spiderIsHistoricalMend").attr("checked",false);
+			$("#spiderIsHistoricalMend").attr("disabled",true);
+			$("#spiderIsHistoricalMend").val(false);
+		}
   }
 </script>

+ 7 - 7
src/web/templates/task.html

@@ -93,13 +93,13 @@
   var assigncode = "";
   var assignid = "";
 	$(function(){
-		window.setInterval(function(){
-			$.post("/center/task/getJumpMark",function(r){
-				if(r){
-					ttabletask.ajax.reload();
-				}
-			})
-		}, 3000); 
+		// window.setInterval(function(){
+		// 	$.post("/center/task/getJumpMark",function(r){
+		// 		if(r){
+		// 			ttabletask.ajax.reload();
+		// 		}
+		// 	})
+		// }, 3000);
 		
 		taskConst = true;
 		setCookie("task","");

+ 4 - 3
src/web/templates/taskedit.html

@@ -367,15 +367,16 @@
 			{"modify":$modify,"id":id,"descript":$descript,"urgency":$urgency,"complete":$complete,"completeChange":completeChange,"urgencyChange":urgencyChange},
 			function(r){
 				if(r.state == "ok"){
+					// window.close();
 					showTip("保存成功", 1000);
 					$('#com-alert').on('hidden.bs.modal', function () {
 						//window.location.href = "/center/managerTask";
-						window.location.reload();
+						// window.location.reload();
+						window.close();
 					})
 				}else{
 					showTip("保存失败", 1000);
-
-				}	
+				}
 			}
 		)
 	}

+ 343 - 131
src/web/templates/user.html

@@ -5,6 +5,9 @@
 			用户管理
 		<small>
 			<button type="button" class="btn btn-primary addUser" data-dismiss="modal">添加用户</button>
+			<button type="button" class="btn btn-warning" data-dismiss="modal" onclick="exportLog('all','')">全部导出</button>
+			<button type="button" class="btn btn-success" data-dismiss="modal" onclick="exportLog('audit','')">审核导出</button>
+			<button type="button" class="btn btn-danger" data-dismiss="modal" onclick="exportLog('repulse','')">打回导出</button>
 		</small>
   		 </h1>
   		<ol class="breadcrumb">
@@ -13,98 +16,149 @@
   	 	</ol>
 	</section>
 	<section class="content">
-			<div class="box">
-			
+		<div class="box">
 			<!-- 模态框(Modal) -->
 			<div class="modal fade" id="myModal-addUser" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-			    <div class="modal-dialog">
-			        <div class="modal-content">
+			<div class="modal-dialog">
+				<div class="modal-content">
+					<div class="modal-header">
 						<div class="modal-header">
-							<div class="modal-header">
-				                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-								<div class="edit-form">
-									<div class="edit-info">
-										<span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span>
-										<span class="info">添加用户<span>
+							<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+							<div class="edit-form">
+								<div class="edit-info">
+									<span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span>
+									<span class="info">添加用户<span>
+								</div>
+								<form class="form-horizontal" role="form">
+								  <div class="form-group">
+									<label for="username" class="col-sm-2 control-label">用户名:</label>
+									<div class="col-sm-10">
+									  <input type="text" class="form-control" id="username" placeholder="请输入用户名">
+									</div>
+									<span class="usernameCheck hide check">用户名不能为空</span>
+								  </div>
+								<div class="form-group">
+									<label for="relname" class="col-sm-2 control-label">真实姓名:</label>
+									<div class="col-sm-10">
+									  <input type="text" class="form-control" id="relname" placeholder="请输入用户名">
+									</div>
+									<span class="relnameCheck hide check">真实姓名不能为空</span>
+								  </div>
+								 <div class="form-group">
+									<label for="password" class="col-sm-2 control-label">密码:</label>
+									<div class="col-sm-10">
+									  <input type="text" class="form-control" id="password" placeholder="请输入密码">
+									</div>
+									<span class="passwordCheck hide check">密码不能为空</span>
+								  </div>
+								 <div class="form-group">
+									<label for="email" class="col-sm-2 control-label">邮箱:</label>
+									<div class="col-sm-10">
+									  <input type="email" class="form-control" id="email" placeholder="请输入邮箱">
+									</div>
+									<span class="emailCheck hide check">邮箱不能为空</span>
+								  </div>
+								 <div class="form-group">
+									<label for="auth" class="col-sm-2 control-label">权限:</label>
+									<div class="col-sm-10 checkbox-style">
+										<input type="radio" name="auth-box" class="auth" id="kfy" value="开发员">开发员</input>
+										<input type="radio" name="auth-box" class="auth" id="shy" value="审核员">审核员</input>
+										<input type="radio" name="auth-box" class="auth" id="gly" value="管理员">管理员</input>
+									</div>
+								  </div>
+								<div class="form-group">
+									<label for="identity" class="col-sm-2 control-label">身份:</label>
+									<div class="col-sm-10 checkbox-style">
+										<input type="radio" name="identity-box" class="identity" id="nbry" value="1">内部人员</input>
+										<input type="radio" name="identity-box" class="identity" id="wbry" value="0">外包人员</input>
+									</div>
+								</div>
+								<div class="form-group">
+									<label for="platform" class="col-sm-2 control-label">身份:</label>
+									<div class="col-sm-10 checkbox-style">
+										<input type="radio" name="platform-box" class="identity" id="platform-lua" value="golua平台">golua平台</input>
+										<input type="radio" name="platform-box" class="identity" id="platform-python" value="python">python</input>
+									</div>
+								</div>
+								 <div class="form-group">
+									<label for="comeintime" class="col-sm-2 control-label">注册日期:</label>
+									<div class="col-sm-10">
+									  <input type="text"  class="form-control" id="comeintime">
 									</div>
-									<form class="form-horizontal" role="form">
-									  <div class="form-group">
-									    <label for="username" class="col-sm-2 control-label">用户名:</label>
-									    <div class="col-sm-10">
-									      <input type="text" class="form-control" id="username" placeholder="请输入用户名">
-									    </div>
-										<span class="usernameCheck hide check">用户名不能为空</span>
-									  </div>
-									<div class="form-group">
-									    <label for="relname" class="col-sm-2 control-label">真实姓名:</label>
-									    <div class="col-sm-10">
-									      <input type="text" class="form-control" id="relname" placeholder="请输入用户名">
-									    </div>
-										<span class="relnameCheck hide check">真实姓名不能为空</span>
-									  </div>
-									 <div class="form-group">
-									    <label for="password" class="col-sm-2 control-label">密码:</label>
-									    <div class="col-sm-10">
-									      <input type="text" class="form-control" id="password" placeholder="请输入密码">
-									    </div>
-										<span class="passwordCheck hide check">密码不能为空</span>
-									  </div>
-									 <div class="form-group">
-									    <label for="email" class="col-sm-2 control-label">邮箱:</label>
-									    <div class="col-sm-10">
-									      <input type="email" class="form-control" id="email" placeholder="请输入邮箱">
-									    </div>
-										<span class="emailCheck hide check">邮箱不能为空</span>
-									  </div>
-									 <div class="form-group">
-									    <label for="auth" class="col-sm-2 control-label">权限:</label>
-									    <div class="col-sm-10 checkbox-style">
-											<input type="radio" name="auth-box" class="auth" id="kfy" value="开发员">开发员</input>
-											<input type="radio" name="auth-box" class="auth" id="shy" value="审核员">审核员</input>
-											<input type="radio" name="auth-box" class="auth" id="gly" value="管理员">管理员</input>
-									    </div>
-									  </div>
-									 <div class="form-group">
-									    <label for="comeintime" class="col-sm-2 control-label">注册日期:</label>
-									    <div class="col-sm-10">
-									      <input type="text"  class="form-control" id="comeintime">
-									    </div>
-									  </div>
-									  <div class="form-group">
-									    <div class="col-sm-offset-2 col-sm-10 operateStyle">
-									      	<input type="button" disabled="true" onclick="saveNewUser()" class="btn btn-primary saveBtn" value="保存">
-											<input type="button" onclick="cancelAdd()" class="btn btn-default" value="取消">
-									    </div>
-									  </div>
-									</form>
-								</div>	
+								  </div>
+								  <div class="form-group">
+									<div class="col-sm-offset-2 col-sm-10 operateStyle">
+										<input type="button" disabled="true" onclick="saveNewUser()" class="btn btn-primary saveBtn" value="保存">
+										<input type="button" data-dismiss="modal" class="btn btn-default" value="取消">
+									</div>
+								  </div>
+								</form>
 							</div>
-					 	</div>
-			        </div><!-- /.modal-content -->
-			    </div><!-- /.modal -->
-			</div>
-			
-            <div class="box-body">
-              <table id="user" class="table table-bordered table-striped">
-                <thead>
-                <tr>
+						</div>
+					</div>
+				</div><!-- /.modal-content -->
+			</div><!-- /.modal -->
+		</div>
+			<div class="box-body">
+		  <table id="user" class="table table-bordered table-striped">
+			<thead>
+				<tr>
+					<th><input type="checkbox" id="selrow" onclick="selectrow(this)"/></th>
 					<th>编号</th>
-					<th>姓名</th>
+					<th>用户</th>
 					<th>真实姓名</th>
+					<th>身份</th>
+					<th>权限</th>
+					<th>平台</th>
 					<th>密码</th>
-					<th>用户id</th>
 					<th>邮箱</th>
-					<th>权限</th>
-					<th>注册时间</th>
-                  <th class="hidden-xs">操作</th>
-                </tr>
-                </thead>
-              </table>
-            </div>
-            <!-- /.box-body -->
-          </div>
+					<th class="hidden-xs">操作</th>
+					<th class="hidden-xs">导出</th>
+				</tr>
+			</thead>
+		  </table>
+		</div>
+		<!-- /.box-body -->
+	  	</div>
 	</section>
 </div>
+<div class="modal fade" id="auditexport" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+	<div class="modal-dialog">
+		<div class="modal-content">
+			<div class="modal-header">
+				<div class="modal-header">
+					<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+					<div class="edit-form">
+						<div class="edit-info">
+							<span class="glyphicon glyphicon-export"  style="margin-left:20px" aria-hidden="true"></span>
+							<span class="info">记录导出<span>
+						</div>
+						<form class="form-horizontal" role="form">
+							<div class="form-group">
+								<label for="starttime" class="col-sm-2 control-label">起始日期:</label>
+								<div class="col-sm-10">
+									<input type="text"  class="form-control" id="starttime" placeholder="例:2024-01-01(含当天)">
+								</div>
+							</div>
+							<div class="form-group">
+								<label for="endtime" class="col-sm-2 control-label">截止日期:</label>
+								<div class="col-sm-10">
+									<input type="text"  class="form-control" id="endtime" placeholder="例:2024-02-01(不含当天)">
+								</div>
+							</div>
+							<div class="form-group">
+								<div class="col-sm-offset-2 col-sm-10 operateStyle">
+									<input type="button" onclick="exportRun()" class="btn btn-primary" value="导出">
+									<input type="button" data-dismiss="modal" class="btn btn-default" value="取消">
+								</div>
+							</div>
+						</form>
+					</div>
+				</div>
+			</div>
+		</div><!-- /.modal-content -->
+	</div><!-- /.modal -->
+</div>
 <!-- 模态框(Modal) -->
 <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
     <div class="modal-dialog">
@@ -123,41 +177,47 @@
 </div>
 <script>
 	var focusO;
-	var focusT;
-	
+	var exportNames = [];
+	var exportType = ""
+	var dataid = "";
 	$(function(){
-		var dataid = "";
 		ttable=$('#user').DataTable({
 			"language": {
-	              "url": "/js/dataTables.chinese.lang"
-	         	},
+				"url": "/js/dataTables.chinese.lang"
+			},
 			"columnDefs": [
-			    { "orderable": false, "targets": 0 },
-				{ "orderable": false, "targets": 1 },
-				{ "orderable": false, "targets": 2 },
-				{ "orderable": false, "targets": 3 ,"bVisible": false},
-				{ "orderable": false, "targets": 4 ,"bVisible": false},
-				{ "orderable": false, "targets": 5 },
-				{ "orderable": false, "targets": 6 }
-			  ],
+				{ "orderable": false, "targets": [0,1,2,6,7,8,9,10] } //设置列不可排序
+			],
+			"order": [[3,"asc"]], //默认排序列
+			"iDisplayLength": 100,
 			"processing":true,
 			"serverSide": true,
-			"searching": false,
-			"ordering": false,
-			"info": false,
-				
+			"searching": true,
+			"ordering": true,
+			"info": true,
+			"paging": true,
+			"autoWidth": true,
 			"ajax": {
-					"url": "/center/user.html",
-					"type": "POST"
-				},
+				"url": "/center/user.html",
+				"type": "POST"
+			},
 			"columns": [
-					{ "data": "num"},
-					{ "data": "s_name",sWidth:"15%"},
-					{ "data": "s_fullname"},
-					{ "data": "s_pass"},
-					{ "data": "userid"},
-	           		{ "data": "s_email",sWidth:"20%"},
-					{ "data": "i_auth",render:function(val){
+				{ "data": "s_name",render:function(val,a,row){
+					if(row.s_platform != "golua平台" || row.i_auth != 1){
+						return "<input type='checkbox' disabled platform='"+row.s_platform+"' auth='"+row.i_auth+"' value='"+val+"'/>"
+					}
+					return "<input type='checkbox' platform='"+row.s_platform+"' auth='"+row.i_auth+"' value='"+val+"'/>"
+				}},
+				{ "data": "num"},
+				{ "data": "s_name"},
+				{ "data": "s_fullname"},
+				{ "data": "i_identity",render:function (val) {
+						if (val == 1){
+							return "内部人员";
+						}
+						return "外包人员";
+					}},
+				{ "data": "i_auth",render:function(val){
 						if(val == 1){
 							val = "开发员";
 							return val;
@@ -170,27 +230,176 @@
 							val = "管理员";
 							return val;
 						}
-						
+
 					}},
-					{ "data": "l_comeintime",sWidth:"15%"},
-					{ "data": "s_name",render:function(val,a,row){
+				{ "data": "s_platform"},
+				{ "data": "s_pass"},
+				{ "data": "s_email"},
+				{ "data": "s_name",render:function(val,a,row){
 						var div=$("<div><div class=\"btn-group\"></div></div>")
 						var buttonEdit=$('<a type="button" class="btn btn-sm btn-default">编辑</a>');
 						var buttonDel=$('<a type="button" class="btn btn-sm btn-default">删除</a>');
 						buttonDel.attr("onclick","del('"+row['userid']+"')");
-						buttonEdit.attr("onclick","editUserInfo('"+row['s_name']+"','"+row['s_pass']+"','"+row['s_email']+"','"+row['i_auth']+"','"+row['userid']+"','"+row['l_comeintime']+"')");
+						buttonEdit.attr("onclick","editUserInfo('"+row['s_name']+"','"+row['s_pass']+"','"+row['s_email']+"','"+row['i_auth']+"','"+row['_id']+"','"+row['l_comeintime']+"','"+row['i_identity']+"','"+row['s_platform']+"')");
 						div.find(".btn-group").append(buttonEdit);
 						div.find(".btn-group").append(buttonDel);
 						return div.html()
-					}}
-				]
+					}},
+				{ "data": "s_name",render:function(val,a,row){
+					var div=$("<div><div class=\"btn-group\"></div></div>")
+					var allLog=$('<a type="button" class="btn btn-sm btn-warning">全部记录</a>');
+					var auditLog=$('<a type="button" class="btn btn-sm btn-success">审核记录</a>');
+					var repulseLog=$('<a type="button" class="btn btn-sm btn-danger">打回记录</a>');
+					repulseLog.attr("onclick","exportLog('repulse','"+row['s_name']+"')");
+					auditLog.attr("onclick","exportLog('audit','"+row['s_name']+"')");
+					allLog.attr("onclick","exportLog('all','"+row['s_name']+"')");
+					if(row.i_auth == 1 && row.s_platform == "golua平台"){
+						div.find(".btn-group").append(allLog);
+						div.find(".btn-group").append(auditLog);
+						div.find(".btn-group").append(repulseLog);
+					}
+					return div.html()
+				}},
+			],
+			"fnServerParams": function (e) {
+				var platform = $("#platform").val();
+				var auth = $("#auth").val();
+				var identity = $("#identity").val();
+				if(platform){
+					e.s_platform = platform;
+				}else{
+					e.s_platform="-1";
+				}
+				if(auth){
+					e.i_auth = auth;
+				}else{
+					e.i_auth="-1";
+				}
+				if(identity){
+					e.i_identity = identity;
+				}else{
+					e.i_identity="-1";
+				}
+			}
 		})
+		common.setActive("index_yhgl");
+		ttable.on('init.dt', function () {
+			//平台
+			var platform="<div class='form-group'><label for='platform'>平台:</label>"+
+					"<select id='platform' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+					"<option value='-1'>全部</option>"+
+					"<option value='golua平台'>golua平台</option>"+
+					"<option value='python'>python</option>"+
+					"</select></div>"
+			$("#user_filter").prepend("&nbsp;&nbsp;");
+			$("#user_filter").prepend(platform);
+			//权限
+			var auth="<div class='form-group'><label for='auth'>权限:</label>"+
+					"<select id='auth' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+					"<option value='-1'>全部</option>"+
+					"<option value='1'>开发员</option>"+
+					"<option value='2'>审核员</option>"+
+					"<option value='3'>管理员</option>"+
+					"</select></div>"
+			$("#user_filter").prepend("&nbsp;&nbsp;");
+			$("#user_filter").prepend(auth);
+			//身份
+			var identity="<div class='form-group'><label for='identity'>身份:</label>"+
+					"<select id='identity' onchange='checkclick(this.value)' class='form-control input-sm'>"+
+					"<option value='-1'>全部</option>"+
+					"<option value='1'>内部人员</option>"+
+					"<option value='0'>外包人员</option>"+
+					"</select></div>"
+			$("#user_filter").prepend("&nbsp;&nbsp;");
+			$("#user_filter").prepend(identity);
+		});
 	})
+
+	function checkclick(val){
+		$("#selrow").prop('checked',false);
+		ttable.ajax.reload();
+	}
+	function selectrow(me){
+		var sel=$(me);
+		var isSelected=sel.prop('checked');
+		if(isSelected){
+			$("#user td input[type=checkbox][auth=1][platform='golua平台']").prop("checked",true);
+		}else{
+			$("#user td input[type=checkbox][auth=1][platform='golua平台']").prop("checked",false);
+		}
+	}
+	//导出
+	function exportLog(t,u) {
+		var names=[];
+		if(u == ""){
+			$("#user td input[type=checkbox][auth=1][platform='golua平台']").each(function(){
+				if($(this).prop("checked")){
+					names.push($(this).val());
+				}
+			});
+			if (names.length == 0){
+				alert("请选择要导出记录的人员!");
+				return
+			}
+		}else {
+			names.push(u);
+		}
+		exportNames = names;
+		exportType = t;
+		$("#auditexport").modal("show");
+	}
+	//执行导出
+	function exportRun(){
+		var starttime = $("#starttime").val();
+		var endtime = $("#endtime").val();
+		var st = new Date(starttime).getTime();
+		var et = new Date(endtime).getTime();
+		if (et <= st){
+			alert("日期填写错误!")
+			return
+		}
+		$("#auditexport").modal("hide");
+		$.ajax({
+			type:"post",
+			url:"/center/user/auditexport",
+			data:{"exportnames":exportNames.join(","),"exporttype":exportType,"starttime":starttime,"endtime":endtime},
+			xhrFields: { responseType: 'arraybuffer'},
+			success:function (r){
+				downloadFile(r, "爬虫审核记录")
+			}
+		})
+	}
+	function downloadFile(res, fileName) { // res为后端传来的文件流,// fileName为文件名称,自己根据实际情况赋值
+		if (!res) {
+			return
+		}
+		if (window.navigator.msSaveBlob) { // IE以及IE内核的浏览器
+			try {
+				window.navigator.msSaveBlob(res, fileName) // res为接口返回数据,这里请求的时候已经处理了,如果没处理需要在此之前自行处理var data = new Blob([res.data]) 注意这里需要是数组形式的,fileName就是下载之后的文件名
+				// window.navigator.msSaveOrOpenBlob(res, fileName);  //此方法类似上面的方法,区别可自行百度
+			} catch (e) {
+				console.log(e)
+			}
+		} else {
+			let url = window.URL.createObjectURL(new Blob([res], {
+				type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' // 前后端一定要同意utf-8编码,否则会是乱码
+			}));
+			let link = document.createElement('a')
+			link.style.display = 'none'
+			link.href = url
+			link.setAttribute('download', fileName) // 文件名
+			document.body.appendChild(link)
+			link.click()
+			document.body.removeChild(link) // 下载完成移除元素
+			window.URL.revokeObjectURL(url) // 释放掉blob对象
+		}
+	}
+
 	function del(data){
 		dataid = data;
 		$("#myModal").modal("show");
 	}
-	function editUserInfo(name,password,email,auth,userid,comeintime){
+	function editUserInfo(name,password,email,auth,userid,comeintime,identity,platform){
 		$(".saveBtnClass").attr("disabled",false);
 		sessionStorage.setItem("self","n")
 		sessionStorage.setItem("userid",userid);
@@ -199,17 +408,21 @@
 		$(".edit-form #password").attr("readOnly","true");
 		$(".edit-form #email").val(email);
 		if(auth == 1){
-			$("#shy").prop("checked",false);
-			$("#gly").prop("checked",false);
-			$("#kfy").prop("checked",true);
+			$("#myModal-edit #kfy").prop("checked",true);
 		}else if(auth == 2){
-			$("#kfy").prop("checked",false);
-			$("#gly").prop("checked",false);
-			$("#shy").prop("checked",true);
+			$("#myModal-edit #shy").prop("checked",true);
+		}else{
+			$("#myModal-edit #gly").prop("checked",true);
+		}
+		if(identity == 1){
+			$("#myModal-edit #nbry").prop("checked",true);
 		}else{
-			$("#kfy").prop("checked",false);
-			$("#shy").prop("checked",false);
-			$("#gly").prop("checked",true);
+			$("#myModal-edit #wbry").prop("checked",true);
+		}
+		if(platform == "golua平台"){
+			$("#myModal-edit #platform-lua").prop("checked",true);
+		}else{
+			$("#myModal-edit #platform-python").prop("checked",true);
 		}
 		$(".auth").prop("disabled",false);
 		$(".edit-form #auth").removeAttr("readOnly");
@@ -333,6 +546,8 @@
 		$("#myModal-addUser #email").val("");
 		$("#myModal-addUser .auth").attr("disabled",false);
 		$("#myModal-addUser #kfy").prop("checked",true);
+		$("#myModal-addUser #nbry").prop("checked",true);
+		$("#myModal-addUser #platform-lua").prop("checked",true);
 		$("#myModal-addUser #comeintime").val(date);
 		$("#myModal-addUser #comeintime").attr("readOnly",true);
 		$("#myModal-addUser").modal("show");
@@ -341,7 +556,7 @@
 		$(".relnameCheck").addClass("hide");
 		$(".emailCheck").addClass("hide");
 	})
-	
+
 	//保存用户信息
 	function saveNewUser(){
 		$("#myModal-addUser").modal("hide");
@@ -350,9 +565,11 @@
 		var password = $("#myModal-addUser #password").val();
 		var email = $("#myModal-addUser #email").val();
 		var auth = $("input:radio[name='auth-box']:checked").val();
+		var identity = $("input:radio[name='identity-box']:checked").val();
+		var platform = $("input:radio[name='platform-box']:checked").val();
 		$.post(
 			"/center/user/saveNewUser",
-			{"username":username,"relname":relname,"password":password,"email":email,"userAuth":auth},
+			{"username":username,"relname":relname,"password":password,"email":email,"userAuth":auth,"identity":identity,"platform":platform},
 			function(r){
 				if(r.status == "y"){
 					showTip("保存成功",1000);
@@ -423,10 +640,5 @@
 		})
 		return checkflagEmail;
 	}
-	
-	function cancelAdd(){
-		$("#myModal-addUser").modal("hide");
-	}
-	
 </script>
 {{include "bottom.html"}}

BIN
src/爬虫审核记录.xlsx