Просмотр исходного кода

Merge branch 'dev2.0' of 192.168.3.17:qmx/jy into dev2.0

[wangkaiyue] 8 лет назад
Родитель
Сommit
e1f0c62713
46 измененных файлов с 2754 добавлено и 1220 удалено
  1. 8 0
      .idea/misc.xml
  2. 46 22
      src/jfw/front/entsearch.go
  3. 4 1
      src/jfw/front/front.go
  4. 11 12
      src/jfw/front/search.go
  5. 46 38
      src/jfw/front/supsearch.go
  6. 184 92
      src/jfw/front/swordfish.go
  7. 2 2
      src/jfw/jylabutil/entsearch.go
  8. 3 2
      src/jfw/jyutil/jyutil.go
  9. 1 1
      src/jfw/modules/behaviorcollect/README.md
  10. 4 0
      src/jfw/modules/entsesearch/.idea/misc.xml
  11. 0 603
      src/jfw/modules/entsesearch/.idea/workspace.xml
  12. 39 23
      src/jfw/modules/entsesearch/src/search/entsesearch.go
  13. BIN
      src/jfw/modules/entsesearch/src/web/staticres/jylab/entsesearch/images/wx/jysorry_1.png
  14. BIN
      src/jfw/modules/entsesearch/src/web/staticres/jylab/entsesearch/images/wx/jyyjfk.png
  15. 383 88
      src/jfw/modules/entsesearch/src/web/templates/weixin/entseSearch.html
  16. 0 0
      src/jfw/modules/push/src/config.json
  17. 47 30
      src/jfw/modules/push/src/qfw/push/dopush/dopush.go
  18. 3 1
      src/jfw/modules/push/src/qfw/push/dopush/dopushes.go
  19. 115 0
      src/jfw/modules/push/src/qfw/push/dopush/excel.go
  20. 1 0
      src/jfw/modules/push/src/xlsx/readme.txt
  21. 16 0
      src/jfw/modules/pushent/src/config.json
  22. 11 0
      src/jfw/modules/pushent/src/config/config.go
  23. 71 0
      src/jfw/modules/pushent/src/filterdata/filterdata.go
  24. 14 0
      src/jfw/modules/pushent/src/followpush/config.json
  25. 138 0
      src/jfw/modules/pushent/src/followpush/datastruct.go
  26. 44 0
      src/jfw/modules/pushent/src/followpush/followpush.go
  27. 18 0
      src/jfw/modules/pushent/src/followpush/followpush_test.go
  28. 233 0
      src/jfw/modules/pushent/src/followpush/push.go
  29. 46 0
      src/jfw/modules/pushent/src/main.go
  30. 27 0
      src/jfw/modules/pushent/src/main_test.go
  31. 33 0
      src/jfw/modules/pushent/src/rpcpush/findData.go
  32. 21 0
      src/jfw/modules/pushent/src/rpcpush/rpcpush.go
  33. 23 0
      src/jfw/modules/pushent/src/timetask/clearredis.go
  34. 18 0
      src/jfw/modules/pushent/src/tools/mongo.go
  35. 1 0
      src/jfw/modules/pushent/src/tools/tools.go
  36. 76 0
      src/jfw/modules/pushent/src/weixinrpc/weixinrpc.go
  37. 5 3
      src/jfw/modules/pushproject/src/followpush/push.go
  38. 2 1
      src/seo.json
  39. 4 4
      src/web/staticres/css/dev2/biddingSearch.css
  40. 1 1
      src/web/staticres/css/dev2/biddingSearch1.css
  41. 4 4
      src/web/staticres/js/biddingSearch.js
  42. 16 23
      src/web/staticres/js/superSearch.js
  43. 1 1
      src/web/templates/common/pnc.html
  44. 200 17
      src/web/templates/pc/biddingsearch_enterprise.html
  45. 653 243
      src/web/templates/pc/classifylist.html
  46. 181 8
      src/web/templates/pc/supsearch.html

+ 8 - 0
.idea/misc.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+<<<<<<< HEAD
+  <component name="GOROOT" path="/usr/local/go" />
+=======
+  <component name="GOROOT" path="C:/go" />
+>>>>>>> b673ea6b82d098a5040ba1bd5d56ac194a55394d
+</project>

+ 46 - 22
src/jfw/front/entsearch.go

@@ -3,28 +3,19 @@ package front
 import (
 	"fmt"
 	"jfw/jylabutil"
+	_ "jfw/jyutil"
 	"log"
-	//"math/rand"
 	"qfw/util"
-	//"qfw/util/redis"
-
 	"time"
 
-	"jfw/jyutil"
-	//"regexp"
 	"strconv"
-	//"strings"
-	//"sync"
 
 	"github.com/go-xweb/xweb"
-
-	//. "github.com/thinxer/go-word2vec"
-	//"gopkg.in/mgo.v2/bson"
 )
 
 type Entsearch struct {
 	*xweb.Action
-	bidsearchforent  xweb.Mapper `xweb:"/jylab/bidsearchforent"`
+	bidsearchforent  xweb.Mapper `xweb:"/jylab/bidsearchforent.html"`
 	pcSearchZbqyAjax xweb.Mapper `xweb:"/jylab/pcSearchZbqyAjax"`
 }
 
@@ -36,13 +27,21 @@ func (e *Entsearch) Bidsearchforent() error {
 	defer util.Catch()
 	searchvalue := e.GetString("searchvalue")
 	area := e.GetString("area")
-	minprice, _ := strconv.Atoi(e.GetString("minprice"))
-	maxprice, _ := strconv.Atoi(e.GetString("maxprice"))
+	pricetype := e.GetString("pricetype")
+	minprice, _ := strconv.ParseFloat(e.GetString("minprice"), 64)
+	maxprice, _ := strconv.ParseFloat(e.GetString("maxprice"), 64)
+	if pricetype == "y" {
+		//搜索minprice和maxprice价格区间的数据
+	}
+	if pricetype == "n" || pricetype == "" {
+		//搜索所有价格
+	}
 
-	fmt.Println("searchvalue==", searchvalue)
-	fmt.Println("area==", area)
-	fmt.Println("lower==", minprice)
-	fmt.Println("upper==", maxprice)
+	fmt.Println("searchvalue1==", searchvalue)
+	fmt.Println("area1==", area)
+	fmt.Println("lower1==", minprice)
+	fmt.Println("upper1==", maxprice)
+	fmt.Println("pricetype1==", pricetype)
 
 	if minprice == 0 {
 		e.T["minprice"] = ""
@@ -57,12 +56,12 @@ func (e *Entsearch) Bidsearchforent() error {
 
 	e.T["searchvalue"] = searchvalue
 	e.T["area"] = area
-
+	e.T["pricetype"] = pricetype
 	log.Println("-------中标企业搜索:")
 
 	list := []map[string]interface{}{}
 	list = jylabutil.GetProjectByEntName("", "", 0, 0, 1, 10)
-	jyutil.BidListConvert("", &list)
+	//jyutil.BidListConvert("", &list)
 
 	for k, v := range list {
 		v["k"] = k + 1
@@ -84,14 +83,39 @@ func (e *Entsearch) PcSearchZbqyAjax() error {
 	defer util.Catch()
 	searchvalue := e.GetString("searchvalue")
 	area := e.GetString("area")
-	minprice, _ := strconv.Atoi(e.GetString("minprice"))
-	maxprice, _ := strconv.Atoi(e.GetString("maxprice"))
+	pricetype := e.GetString("pricetype")
+	minprice, _ := strconv.ParseFloat(e.GetString("minprice"), 64)
+	maxprice, _ := strconv.ParseFloat(e.GetString("maxprice"), 64)
 
+	if pricetype == "y" {
+		//搜索minprice和maxprice价格区间的数据
+	}
+	if pricetype == "n" {
+		//搜索所有价格
+	}
 	fmt.Println("searchvalue==", searchvalue)
 	fmt.Println("area==", area)
 	fmt.Println("lower==", minprice)
 	fmt.Println("upper==", maxprice)
+	fmt.Println("pricetype==", pricetype)
 
-	return nil
+	list := []map[string]interface{}{}
+	list = jylabutil.GetProjectByEntName(searchvalue, area, minprice, maxprice, 1, 10)
+	//jyutil.BidListConvert("", &list)
 
+	for k, v := range list {
+		v["k"] = k + 1
+		t1 := time.Unix(util.Int64All(v["createtime"]), 0)
+		v["time1"] = util.TimeDiff(t1)
+		t2 := time.Unix(util.Int64All(v["zbtime"]), 0)
+		v["time2"] = util.TimeDiff(t2)
+
+		//fmt.Println(v["industry"])
+		//for i,z := range v{
+		//	fmt.Println(i)
+		//	fmt.Println(z)
+		//}
+	}
+	e.T["list"] = list
+	return e.Render("/pc/biddingsearch_enterprise.html", &e.T)
 }

+ 4 - 1
src/jfw/front/front.go

@@ -87,7 +87,7 @@ type Front struct {
 	historypush       xweb.Mapper `xweb:"/swordfish/historypush"`        //历时推送记录
 	historypushPaging xweb.Mapper `xweb:"/swordfish/historypush/paging"` //历时推送记录--分页
 	aboutus           xweb.Mapper `xweb:"/front/aboutus.html"`           //关于我们
-	busicooperation	  xweb.Mapper `xweb:"/front/busicooperation.html"`   //商务合作
+	busicooperation   xweb.Mapper `xweb:"/front/busicooperation.html"`   //商务合作
 	//bidsearchforent	  xweb.Mapper `xweb:"/front/bidsearchforent.html"`   //中标企业搜索
 
 	/********************wxkeyset:v1.8**************************/
@@ -102,6 +102,9 @@ type Front struct {
 	mobtopics       xweb.Mapper `xweb:"/promotional/mobtopics.html"` //移动端专题推广
 	saveuserlogs    xweb.Mapper `xweb:"/front/saveuserlogs"`         //保存用户关注日志
 	followinfo      xweb.Mapper `xweb:"/front/followinfo"`           //redis用户关注日志
+
+	/********************dev:2.0**************************/
+	getClassifyList xweb.Mapper `xweb:"/front/getClassifyList"` //得到标签页表格数据
 }
 
 var sewx util.SimpleEncrypt //微信的加密方法

+ 11 - 12
src/jfw/front/search.go

@@ -1,20 +1,20 @@
 package front
 
 import (
+	"fmt"
 	"github.com/go-xweb/xweb"
-	"strings"
+	"gopkg.in/mgo.v2/bson"
+	"jfw/wx"
 	"qfw/util"
 	"qfw/util/redis"
-	"jfw/wx"
-	"gopkg.in/mgo.v2/bson"
-	"fmt"
+	"strings"
 )
 
 type Search struct {
 	*xweb.Action
 	/********************剑鱼搜索dev2.0**************************/
-	mainSearch  xweb.Mapper `xweb:"/jylab/mainSearch"`				//剑鱼搜索主页面
-	superSearch xweb.Mapper `xweb:"/jylab/superSearch"`				//超级搜索
+	mainSearch  xweb.Mapper `xweb:"/jylab/mainSearch"`  //剑鱼搜索主页面
+	superSearch xweb.Mapper `xweb:"/jylab/superSearch"` //超级搜索
 }
 
 func init() {
@@ -49,14 +49,14 @@ func (s *Search) MainSearch() error {
 	}
 	return s.Render("/weixin/search/mainSearch.html", &s.T)
 }
-func (m *Search) SuperSearch() error{
+func (m *Search) SuperSearch() error {
 	defer util.Catch()
 	searchvalue := strings.Trim(m.GetString("searchvalue"), " ")
 	var list *[]map[string]interface{}
 	if userid := m.GetSession("userId"); userid != nil {
 		if len(searchvalue) > 0 {
 			searchname := strings.Replace(strings.Replace(searchvalue, " ", "+", -1), "++", "+", -1)
-			list = getWxsearchlistData(searchvalue, searchname, "", "", "","", 1, "all")
+			list = getWxsearchlistData(searchvalue, searchname, "", "", "", "", "", "", 1, "all")
 			history := redis.GetStr("other", "s_"+userid.(string))
 			arrs := strings.Split(history, ",")
 			if history == "" {
@@ -112,9 +112,8 @@ func (m *Search) SuperSearch() error{
 		m.T["avatar"] = myavatar
 		//行业信息数据
 		industry, sortArray := getindustrys()
-		m.T["industry"]=industry
-		m.T["sortArray"]=sortArray
+		m.T["industry"] = industry
+		m.T["sortArray"] = sortArray
 	}
-	return  m.Render("/weixin/search/superSearch.html", &m.T)
+	return m.Render("/weixin/search/superSearch.html", &m.T)
 }
-

+ 46 - 38
src/jfw/front/supsearch.go

@@ -59,11 +59,10 @@ func (p *Pcsearch) PcSearchIndex() error {
 	publishtime := p.GetString("publishtime") //发布时间
 	toptype := p.GetString("toptype")         //信息类型
 	subtype := p.GetString("subtype")         //信息类型
-	minprice, _ := p.GetFloat("minprice")     //最低价格
-	maxprice, _ := p.GetFloat("maxprice")     //最高价格
-	log.Println(minprice, "---", maxprice)
-	industry := p.GetString("industry")     //选中的行业
-	selectType := p.GetString("selectType") //标题或全文
+	minprice := p.GetString("minprice")       //最低价格
+	maxprice := p.GetString("maxprice")       //最高价格
+	industry := p.GetString("industry")       //选中的行业
+	selectType := p.GetString("selectType")   //标题或全文
 	selectTypesess := p.GetSession("selectType")
 	if selectTypesess != nil && selectTypesess != "" {
 		selectType = selectTypesess.(string)
@@ -73,10 +72,21 @@ func (p *Pcsearch) PcSearchIndex() error {
 	}
 	var count int64
 	var list *[]map[string]interface{}
+	var status = 1
+	log.Println(searchvalue, "___:", p.Method())
 	if len(searchvalue) > 0 {
-		count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, 0, true, selectType)
+		status = 2
+		count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType)
 	} else if p.Method() == "POST" {
-		count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, 0, true)
+		status = 2
+		count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, true)
+	} else {
+		p.DisableHttpCache()
+		Newbids()
+		data := redis.Get("other", "index_list").([]interface{})
+		p.T["list"] = data[0]
+	}
+	if status == 2 {
 		if list != nil {
 			for _, v := range *list {
 				v["_id"] = util.EncodeArticleId2ByCheck(v["_id"].(string))
@@ -96,37 +106,35 @@ func (p *Pcsearch) PcSearchIndex() error {
 			}
 		}
 		p.T["list"] = list
-		p.T["area"] = area
-		p.T["publishtime"] = publishtime
-		p.T["timeslot"] = p.GetString("timeslot")
-		p.T["toptype"] = toptype
-		p.T["subtype"] = subtype
-		p.T["count"] = count
-		p.T["keywords"] = keywords
-		p.T["searchvalue"] = searchvalue
-		p.T["selectType"] = selectType
-		p.T["login"] = p.Session().Get("user")
-		p.SetSession("paramkey", keywords)
-		if publishtime == "lately-7" {
-			p.SetSession("parampublishtime", "最近7天")
-		} else if publishtime == "lately-30" {
-			p.SetSession("parampublishtime", "最近30天")
-		} else if publishtime == "thisyear" {
-			p.SetSession("parampublishtime", "去年")
-		} else {
-			p.SetSession("parampublishtime", publishtime)
-		}
-		p.SetSession("paramarea", area)
-		if subtype != "" {
-			p.SetSession("paraminfotype", subtype)
-		} else {
-			p.SetSession("paraminfotype", toptype)
-		}
+	}
+	p.T["area"] = area
+	p.T["publishtime"] = publishtime
+	p.T["timeslot"] = p.GetString("timeslot")
+	p.T["toptype"] = toptype
+	p.T["subtype"] = subtype
+	p.T["count"] = count
+	p.T["keywords"] = keywords
+	p.T["searchvalue"] = searchvalue
+	p.T["selectType"] = selectType
+	p.T["industry"] = industry
+	p.T["minprice"] = minprice
+	p.T["maxprice"] = maxprice
+	p.T["login"] = p.Session().Get("user")
+	p.SetSession("paramkey", keywords)
+	if publishtime == "lately-7" {
+		p.SetSession("parampublishtime", "最近7天")
+	} else if publishtime == "lately-30" {
+		p.SetSession("parampublishtime", "最近30天")
+	} else if publishtime == "thisyear" {
+		p.SetSession("parampublishtime", "去年")
 	} else {
-		p.DisableHttpCache()
-		Newbids()
-		data := redis.Get("other", "index_list").([]interface{})
-		p.T["list"] = data[0]
+		p.SetSession("parampublishtime", publishtime)
+	}
+	p.SetSession("paramarea", area)
+	if subtype != "" {
+		p.SetSession("paraminfotype", subtype)
+	} else {
+		p.SetSession("paraminfotype", toptype)
 	}
 	industrylist, sortArray := getindustrys()
 	p.T["industrylist"] = industrylist
@@ -199,7 +207,7 @@ func Newbids() {
 			}
 		}
 		for i := 0; i < 10; i++ {
-			_, list = getLastNewsData("", "", "", "", "", intns[i], true)
+			_, list = getLastNewsData("", "", "", "", "", "", "", intns[i], true, false)
 			jyutil.BidListConvert("", list)
 			for k, v := range *list {
 				v["k"] = (k + 1) + i*50

+ 184 - 92
src/jfw/front/swordfish.go

@@ -30,7 +30,7 @@ const (
 	bidSearch_maxPageSize = 10 //招标搜索分页--最大页数
 	wx_maxPageNum         = 20
 	wx_pageSize           = 50
-	bidSearch_field_1     = `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","agency","bidamount","budget","biddingcontent","projectname"`
+	bidSearch_field_1     = `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","agency","bidamount","budget","s_subscopeclass","projectname"`
 	bidSearch_field       = bidSearch_field_1 + `,"detail"`
 	bidSearch_sort        = `{"publishtime":-1}`
 )
@@ -139,7 +139,7 @@ func (m *Front) NewSordfish() error {
 			return m.SetBody([]byte(ret.(string)))
 		} else {
 			m.DisableHttpCache()
-			lastBids := elastic.GetPage("bidding", "bidding", "{}", bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","biddingcontent"`, 0, 18)
+			lastBids := elastic.GetPage("bidding", "bidding", "{}", bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass"`, 0, 18)
 			if lastBids != nil && len(*lastBids) > 0 {
 				jyutil.BidListConvert("", lastBids)
 				lbnHtml, olHtml := structureLastBidsHtml(lastBids)
@@ -283,6 +283,8 @@ func (m *Front) Searchinfolist(p string) error {
 	toptype := m.GetString("toptype")
 	subtype := m.GetString("subtype")
 	industry := m.GetString("industry")
+	minprice := m.GetString("minprice") //最低价格
+	maxprice := m.GetString("maxprice") //最高价格
 	selectType := m.GetString("selectType")
 	selectTypesess := m.GetSession("selectType")
 	if selectTypesess != nil && selectTypesess != "" {
@@ -296,10 +298,10 @@ func (m *Front) Searchinfolist(p string) error {
 	var list *[]map[string]interface{}
 	pages := make([]interface{}, 0)
 	if len(searchvalue) > 0 {
-		count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, 0, true, selectType)
+		count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType)
 	} else if m.Method() == "POST" {
 		status = 2
-		count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, 0, true)
+		count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, false)
 	} else {
 		status = 2
 		if redis.Get("other", "index_list") == nil {
@@ -318,7 +320,7 @@ func (m *Front) Searchinfolist(p string) error {
 				}
 			}
 			for i := 0; i < 10; i++ {
-				count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, intns[i], true)
+				count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, intns[i], true, false)
 				for k, v := range *list {
 					v["k"] = (k + 1) + i*50
 					t := time.Unix(util.Int64All(v["publishtime"]), 0)
@@ -444,20 +446,22 @@ func (m *Front) PcAjaxReq() {
 	publishtime := m.GetString("publishtime")
 	selectType := m.GetString("selectType")
 	industry := m.GetString("industry")
+	minprice := m.GetString("minprice") //最低价格
+	maxprice := m.GetString("maxprice") //最高价格
 	m.SetSession("selectType", selectType)
 	var list *[]map[string]interface{}
 	var count int64
 	status, _ := m.GetInteger("status")
 	if reqType == "filter" {
 		if status == 1 {
-			count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, 0, true, selectType)
+			count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, selectType)
 		} else if status == 2 {
-			count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, 0, true)
+			count, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, 0, true, true)
 		}
 	} else if reqType == "bidSearch" {
-		count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, start, true, selectType)
+		count, list = getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, start, true, selectType)
 	} else if reqType == "lastNews" {
-		_, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, start, false)
+		_, list = getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice, start, false, true)
 	}
 	if list != nil && len(*list) > 0 {
 		for _, v := range *list {
@@ -489,11 +493,13 @@ func (m *Front) PcAjaxReq() {
 /**
 **页面搜索
 **/
-func getBidSearchData(searchvalue, area, publishtime, subtype, industry string, start int, isGetCount bool, selectType string) (count int64, list *[]map[string]interface{}) {
-	query := getBidSearchQuery(area, publishtime, subtype, industry)
+func getBidSearchData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice string, start int, isGetCount bool, selectType string) (count int64, list *[]map[string]interface{}) {
 	//selectType:全文搜索(all)、标题搜索(title)
-	var qstr string
-	qstr = elastic.GetNgramQuery(searchvalue, query, `"title","detail"` /*FINDF*/)
+	findfields := `"title"`
+	if selectType == "all" {
+		findfields = `"title","detail"`
+	}
+	qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype))
 	if isGetCount && qstr != "" {
 		count = elastic.Count(INDEX, TYPE, qstr)
 	}
@@ -501,10 +507,10 @@ func getBidSearchData(searchvalue, area, publishtime, subtype, industry string,
 		var repl *[]map[string]interface{}
 		if selectType == "all" {
 			//全文搜索
-			repl = elastic.GetByNgramOther(INDEX, TYPE, searchvalue, query, `"title","detail"` /*FINDF*/, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize, true, false, 115)
+			repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize, 115, true)
 		} else {
 			//标题搜索
-			repl = elastic.GetByNgram(INDEX, TYPE, searchvalue, query, `"title"` /*FINDF*/, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize)
+			repl = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize, 0, false)
 		}
 		if repl != nil && *repl != nil && len(*repl) > 0 {
 			jyutil.BidListConvert(industry, repl)
@@ -517,20 +523,15 @@ func getBidSearchData(searchvalue, area, publishtime, subtype, industry string,
 	}
 	return
 }
-func getLastNewsData(searchvalue, area, publishtime, subtype, industry string, start int, isGetCount bool) (count int64, list *[]map[string]interface{}) {
+func getLastNewsData(searchvalue, area, publishtime, subtype, industry, minprice, maxprice string, start int, isGetCount bool, highlight bool) (count int64, list *[]map[string]interface{}) {
 	//最新招标信息
-	query := getBidSearchQuery(area, publishtime, subtype, industry)
-	strquery := `{"query":{"bool":{"must":[` + query + `],"must_not":[],"should":[],"minimum_should_match" : 1}}}`
+	findfields := `"title","detail"`
+	qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(area, publishtime, subtype))
 	if isGetCount {
-		count = elastic.Count(INDEX, TYPE, strquery)
-		//count = elastic.Count(INDEX, TYPE, elastic.MakeQuery(query, "", "", -1, -1))
+		count = elastic.Count(INDEX, TYPE, qstr)
 	}
 	if !isGetCount || count > 0 {
-		//repl := elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize)
-		if query == "{}" {
-			query = ""
-		}
-		repl := elastic.GetByNgramOther(INDEX, TYPE, searchvalue, query, `"title","detail"` /*FINDF*/, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize, true, false, 115)
+		repl := elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, start, bidSearch_pageSize, 115, highlight)
 		if repl != nil && *repl != nil && len(*repl) > 0 {
 			jyutil.BidListConvert(industry, repl)
 			list = repl
@@ -542,7 +543,7 @@ func getLastNewsData(searchvalue, area, publishtime, subtype, industry string, s
 	}
 	return
 }
-func getBidSearchQuery(area, publishtime, subtype, industry string) string {
+func getBidSearchQuery(area, publishtime, subtype string) string {
 	query := ``
 	if area != "" {
 		query += `{"terms":{"area":[`
@@ -602,19 +603,6 @@ func getBidSearchQuery(area, publishtime, subtype, industry string) string {
 		}
 		query += `]}}`
 	}
-	if industry != "" {
-		if len(query) > 0 {
-			query += ","
-		}
-		query += `{"regexp":{"industry":".*(`
-		for k, v := range strings.Split(industry, ",") {
-			if k > 0 {
-				query += `|`
-			}
-			query += "," + v + ","
-		}
-		query += `).*"}}`
-	}
 	return query
 }
 func getLastNewsQuery(area, publishtime, subtype string) string {
@@ -771,6 +759,8 @@ func (m *Front) Wxsearchlist() error {
 	toptype := m.GetString("toptype")
 	subtype := m.GetString("subtype")
 	industry := m.GetString("industry")
+	minprice := m.GetString("minprice")
+	maxprice := m.GetString("maxprice")
 	scope := m.GetString("scope")
 	publishtime := m.GetString("publishtime")
 	selectType := m.GetString("selectType")
@@ -778,6 +768,8 @@ func (m *Front) Wxsearchlist() error {
 	m.SetSession("toptype", toptype)
 	m.SetSession("subtype", subtype)
 	m.SetSession("industry", industry)
+	m.SetSession("minprice", minprice)
+	m.SetSession("maxprice", maxprice)
 	m.SetSession("scope", scope)
 	m.SetSession("publishtime", publishtime)
 	var list *[]map[string]interface{}
@@ -786,7 +778,7 @@ func (m *Front) Wxsearchlist() error {
 			if selectType == "" { //默认设置为全文搜索
 				selectType = "all"
 			}
-			list = getWxsearchlistData(keywords, searchvalue, scope, publishtime, subtype, industry, 1, selectType)
+			list = getWxsearchlistData(keywords, searchvalue, scope, publishtime, subtype, industry, minprice, maxprice, 1, selectType)
 
 			r := redis.GetStr("other", "s_"+userid.(string))
 			arrs := strings.Split(r, ",")
@@ -831,6 +823,7 @@ func (m *Front) Wxsearchlist() error {
 
 //搜索结果,ajax分页请求
 func (m *Front) WxsearchlistPaging() {
+
 	defer util.Catch()
 	userid := m.GetSession("userId")
 	var list *[]map[string]interface{}
@@ -844,55 +837,56 @@ func (m *Front) WxsearchlistPaging() {
 		publishtime := m.GetString("publishtime")
 		selectType := m.GetString("selectType")
 		industry := m.GetString("industry")
-		list = getWxsearchlistData(searchvalue, searchname, scope, publishtime, subtype, industry, pageNum, selectType)
+		minprice := m.GetString("minprice")
+		maxprice := m.GetString("maxprice")
+		list = getWxsearchlistData(searchvalue, searchname, scope, publishtime, subtype, industry, minprice, maxprice, pageNum, selectType)
 
 		//历史记录和订阅查询
 		//if userId := m.GetSession("userId"); userId != nil {
-			one, _ := mongodb.FindOneByField("user", bson.M{"_id": bson.ObjectIdHex(userid.(string))}, `{"o_jy":1}`)
-			history := redis.GetStr("other", "s_"+userid.(string))
-			arrs := strings.Split(history, ",")
+		one, _ := mongodb.FindOneByField("user", bson.M{"_id": bson.ObjectIdHex(userid.(string))}, `{"o_jy":1}`)
+		history := redis.GetStr("other", "s_"+userid.(string))
+		arrs := strings.Split(history, ",")
 
-			if history == "" {
-				arrs = make([]string, 0)
-			}
-			var historyFlag= 0
-			for _, v := range arrs {
-				if v == strings.Trim(searchvalue, " ") {
-					historyFlag = 1
-					break
-				}
-			}
-			if historyFlag != 1 {
-				arrs = append(arrs, searchvalue)
-				if len(arrs) > 5 {
-					arrs = arrs[1:6]
-				}
-				redis.Del("other", "s_"+userid.(string))
-				redis.Put("other", "s_"+userid.(string), strings.Join(arrs, ","), -1)
+		if history == "" {
+			arrs = make([]string, 0)
+		}
+		var historyFlag = 0
+		for _, v := range arrs {
+			if v == strings.Trim(searchvalue, " ") {
+				historyFlag = 1
+				break
 			}
-			l := len(arrs) - 1
-			for i := 0; i < len(arrs)/2; i++ {
-				tmp := arrs[l-i]
-				arrs[l-i] = arrs[i]
-				arrs[i] = tmp
+		}
+		if historyFlag != 1 {
+			arrs = append(arrs, searchvalue)
+			if len(arrs) > 5 {
+				arrs = arrs[1:6]
 			}
-			m.T["history"] = arrs
+			redis.Del("other", "s_"+userid.(string))
+			redis.Put("other", "s_"+userid.(string), strings.Join(arrs, ","), -1)
+		}
+		l := len(arrs) - 1
+		for i := 0; i < len(arrs)/2; i++ {
+			tmp := arrs[l-i]
+			arrs[l-i] = arrs[i]
+			arrs[i] = tmp
+		}
+		m.T["history"] = arrs
 
-			if one != nil && len(*one) > 0 {
-				o_jy, _ := (*one)["o_jy"].(map[string]interface{})
-				a_key, _ := o_jy["a_key"].([]interface{})
-				var keys []interface{}
-				for _, v := range a_key {
-					keyMap, _ := v.(map[string]interface{})
-					key, _ := keyMap["key"].([]interface{})
-					keys = append(keys, key)
-				}
-				m.T["msgset"] = keys
+		if one != nil && len(*one) > 0 {
+			o_jy, _ := (*one)["o_jy"].(map[string]interface{})
+			a_key, _ := o_jy["a_key"].([]interface{})
+			var keys []interface{}
+			for _, v := range a_key {
+				keyMap, _ := v.(map[string]interface{})
+				key, _ := keyMap["key"].([]interface{})
+				keys = append(keys, key)
 			}
+			m.T["msgset"] = keys
+		}
 
 	}
 
-
 	m.ServeJson(map[string]interface{}{
 		"list":        list,
 		"hasNextPage": list != nil && len(*list) == wx_pageSize && pageNum < wx_maxPageNum,
@@ -917,14 +911,19 @@ func (m *Front) DelWxHistorySearch() {
 }
 
 //微信端搜索
-func getWxsearchlistData(keywords, searchvalue, scope, publishtime, subtype, industry string, pageNum int, selectType string) (list *[]map[string]interface{}) {
-	query := getBidSearchQuery(scope, publishtime, subtype, industry) //scope是地区对应传进的areas, stype是类型对应scope
-	fmt.Print("keywords>>>",keywords,"searchvalue>>",searchvalue)
+func getWxsearchlistData(keywords, searchvalue, scope, publishtime, subtype, industry, minprice, maxprice string, pageNum int, selectType string) (list *[]map[string]interface{}) {
+	//scope是地区对应传进的areas, stype是类型对应scope
+	fmt.Print("keywords>>>", keywords, "searchvalue>>", searchvalue)
+	findfields := `"title"`
+	if selectType == "all" {
+		findfields = `"title","detail"`
+	}
+	qstr := getSearchQuery(searchvalue, industry, minprice, maxprice, findfields, getBidSearchQuery(scope, publishtime, subtype))
 	if len(keywords) > 0 {
 		if selectType == "all" { //全文搜索
-			list = elastic.GetByNgramOther(INDEX, TYPE, searchvalue, query, `"title","detail"`, bidSearch_sort, bidSearch_field_1, (pageNum-1)*wx_pageSize, wx_pageSize, true, false, 100)
+			list = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, (pageNum-1)*wx_pageSize, wx_pageSize, 100, true)
 		} else { //标题搜索
-			list = elastic.GetByNgram(INDEX, TYPE, searchvalue, query, `"title"` /*FINDF*/, bidSearch_sort, bidSearch_field_1, (pageNum-1)*wx_pageSize, wx_pageSize)
+			list = elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field_1, (pageNum-1)*wx_pageSize, wx_pageSize, 100, false)
 		}
 
 		if list != nil {
@@ -1928,9 +1927,9 @@ func searchresulthtml(list *[]map[string]interface{}) string {
 	for i := 0; i < len(*list); i++ {
 		listdata := (*list)[i]
 		j = i + 1
-		listhtml += `<li><div>` + strconv.Itoa(j) + `.</div>`
+		listhtml += `<li><div class="liLuceneList"><div class="luce-left"><em>` + strconv.Itoa(j) + `.</em>`
 		if listdata["title"] != "" {
-			listhtml += `<div><a onclick="noIn(this)" dataId="` + util.EncodeArticleId2ByCheck(util.ObjToString(listdata["_id"])) + `" target="_blank">` + util.ObjToString(listdata["title"]) + `</a></div><div>`
+			listhtml += `<div class="left-title"><a onclick="noIn(this)" dataId="` + util.EncodeArticleId2ByCheck(util.ObjToString(listdata["_id"])) + `" target="_blank">` + util.ObjToString(listdata["title"]) + `</a></div></div><div class="luce-right">`
 		}
 		area, _ := listdata["area"].(string)
 		area = strings.TrimSpace(area)
@@ -1950,19 +1949,29 @@ func searchresulthtml(list *[]map[string]interface{}) string {
 		}
 		stpadd, areaadd := classify(finalType, area)
 		if area != "" && area != "A" {
-			listhtml += `<span class="com-area"><a href="/list/area/` + areaadd + `.html">` + area + `</a></span>`
+			listhtml += `<a href="/list/area/` + areaadd + `.html">` + area + `</a>`
+		} else {
+			listhtml += `<a href="#" style="display:none;"></a>`
 		}
 		if finalType != "" {
-			listhtml += `<span class="com-type"><a href="/list/stype/` + stpadd + `.html">` + finalType + `</a></span>`
+			listhtml += `<a href="/list/stype/` + stpadd + `.html">` + finalType + `</a>`
+		} else {
+			listhtml += `<a href="#" style="display:none;"></a>`
+		}
+		industry, _ := listdata["industry"].(string)
+		if industry != "" {
+			listhtml += `<a href="javascript:volid(0);">` + industry + `</a>`
+		} else {
+			listhtml += `<a href="#" style="display:none;"></a>`
 		}
 		publishtime, _ := listdata["publishtime"].(float64)
 		if publishtime != 0 {
 			diff := util.TimeDiff(time.Unix(util.Int64All(publishtime), 0))
 			if diff != "" {
-				listhtml += `<span class="com-time"><i class="glyphicon bofangjilu"></i>` + diff + `</span>`
+				listhtml += `<span class="com-time">` + diff + `</span>`
 			}
 		}
-		listhtml += `</div></li>`
+		listhtml += `</div></div></li>`
 	}
 	return listhtml
 }
@@ -1973,12 +1982,14 @@ func (f *Front) SearchResult(at, name string) error {
 	var no = 5
 	var area = ""
 	var stype = ""
+	var industry = ""
 	var startPage, currentPage, limitcount int
 	limitcount = util.IntAll(config.Seoconfig["limitcount"])
 	var res = ""
 	var seotitle = ""
 	var seokeywords = ""
 	var seodescription = ""
+	f.T["industrylist"], f.T["sortArray"] = getindustrys()
 	var shareid = f.GetString("id")
 	if len(shareid) == 0 {
 		shareid = fmt.Sprintf("%s%d", config.Seoconfig["jybqy"].(string)+fmt.Sprintf("%d", time.Now().UnixNano())[8:14], rand.Intn(9))
@@ -2015,13 +2026,15 @@ func (f *Front) SearchResult(at, name string) error {
 	if area == "全国" {
 		return f.Redirect("/swordfish/searchinfolist.html")
 	}
-	if area != "" || stype != "" {
+	if area != "" || stype != "" || industry != "" {
 		list := redis.Get("other", "classify_"+name)
 		query1 := `{"query": {"bool": {"must":[`
 		if area != "" {
 			query1 += `{"term":{"area":"` + area + `"}}`
 		} else if stype != "" {
 			query1 += `{"term":{"subtype":"` + stype + `"}}`
+		} else if industry != "" {
+			query1 += `{"term":{"industry":"` + industry + `"}}`
 		}
 		query1 += `],"should": [],"minimum_should_match": 1}}}`
 		query := getLastNewsQuery(area, "", stype)
@@ -2035,17 +2048,18 @@ func (f *Front) SearchResult(at, name string) error {
 			if count1 < startPage || startPage < 0 {
 				startPage = 0
 			}
-			datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href"`, startPage, limitcount)
+			datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","agency","bidamount","budget","s_subscopeclass","projectname"`, startPage, limitcount)
 			redis.Put("other", "classify_"+name, datas, 2*60*60)
 		} else {
 			b, _ := json.Marshal(list)
 			json.Unmarshal(b, &datas)
 		}
-
+		jyutil.BidListConvert(industry, datas)
 		res = searchresulthtml(datas)
 		f.T["res"] = res
 		f.T["area"] = area
 		f.T["stype"] = stype
+		f.T["classifyname"] = name
 		f.SetSession("paramarea", area)
 		f.SetSession("paraminfotype", stype)
 		f.T["shareid"] = se.EncodeString(shareid)
@@ -2053,6 +2067,19 @@ func (f *Front) SearchResult(at, name string) error {
 	return f.Render("/pc/classifylist.html", &f.T)
 }
 
+//
+func (f *Front) GetClassifyList() error {
+	defer util.Catch()
+	//判断用户是否开启超级搜索?
+
+	classifyname := f.GetString("classifyname")
+	data := redis.Get("other", "classify_"+classifyname)
+	f.ServeJson(map[string]interface{}{
+		"data": data,
+	})
+	return nil
+}
+
 //
 func classify(stp, area string) (string, string) {
 	var areas, _ = config.Seoconfig["area"].(map[string]interface{})
@@ -2176,3 +2203,68 @@ func (m *Front) Subscribe() error {
 	m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
 	return m.Render("/pc/subscribe.html", &m.T)
 }
+
+//获取高级查询所需的参数
+func getShouldQueryMap(findfield, searchvalue, industry string) []map[string]string {
+	mps := []map[string]string{}
+	for _, v := range strings.Split(industry, ",") {
+		mp := map[string]string{}
+		for _, v := range strings.Split(searchvalue, "+") {
+			mp[v] = findfield
+		}
+		mp[v] = "s_subscopeclass"
+		mps = append(mps, mp)
+	}
+	return mps
+}
+
+func getSearchQuery(keyword, industry, minprice, maxprice, findfields, mustquery string) (qstr string) {
+	multi_match := `{"multi_match": {"query": "%s","type": "phrase", "fields": [%s],"analyzer": "my_ngram"}}`
+	match_phrase := `{"match_phrase": {"s_subscopeclass": "%s"}}`
+	query := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}}`
+	query_bool := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
+	rge := `{"range": {"bidamount": {%s}}},{"range": {"budget": {%s}}}`
+	gte := `"gte": %s`
+	lte := `"lte": %s`
+	bools := []string{}
+	if keyword != "" {
+		multi_match = fmt.Sprintf(multi_match, "%s", findfields)
+		shoulds := []string{}
+		for _, v := range strings.Split(keyword, "+") {
+			shoulds = append(shoulds, fmt.Sprintf(multi_match, elastic.ReplaceYH(v)))
+		}
+		bools = append(bools, fmt.Sprintf(elastic.NgramMust, strings.Join(shoulds, ",")))
+	}
+	if industry != "" {
+		shoulds := []string{}
+		for _, v := range strings.Split(industry, ",") {
+			shoulds = append(shoulds, fmt.Sprintf(match_phrase, ","+v+","))
+		}
+		bools = append(bools, fmt.Sprintf(query_bool, strings.Join(shoulds, ",")))
+	}
+	if minprice != "" || maxprice != "" {
+		sq := ``
+		if minprice != "" {
+			min, _ := strconv.ParseFloat(minprice, 64)
+			minprice = fmt.Sprintf("%.0f", min*10000)
+		}
+		if maxprice != "" {
+			max, _ := strconv.ParseFloat(maxprice, 64)
+			maxprice = fmt.Sprintf("%.0f", max*10000)
+		}
+		log.Println(minprice, maxprice)
+		if minprice != "0" {
+			sq += fmt.Sprintf(gte, minprice)
+		}
+		if minprice != "0" && maxprice != "0" {
+			sq += `,`
+		}
+		if maxprice != "0" {
+			sq += fmt.Sprintf(lte, maxprice)
+		}
+		bools = append(bools, fmt.Sprintf(query_bool, fmt.Sprintf(rge, sq, sq)))
+	}
+	qstr = fmt.Sprintf(query, mustquery, strings.Join(bools, ","), len(bools))
+	log.Println("getSearchQuery:", qstr)
+	return
+}

+ 2 - 2
src/jfw/jylabutil/entsearch.go

@@ -36,7 +36,7 @@ upper	上限单位万
 pagenum	页码
 pagesize每页数量
 */
-func GetProjectByEntName(entname string, area string, lower, upper, pagenum, pagesize int) []map[string]interface{} {
+func GetProjectByEntName(entname string, area string, lower, upper float64, pagenum, pagesize int) []map[string]interface{} {
 	if pagenum < 1 {
 		pagenum = 1
 	}
@@ -50,7 +50,7 @@ func GetProjectByEntName(entname string, area string, lower, upper, pagenum, pag
 	return list
 }
 
-func getSearchQuery(area string, lower, upper int) string {
+func getSearchQuery(area string, lower, upper float64) string {
 	query := ``
 	if area != "" {
 		query += `{"terms":{"area":[`

+ 3 - 2
src/jfw/jyutil/jyutil.go

@@ -109,8 +109,9 @@ func BidListConvert(industry string, list *[]map[string]interface{}) {
 	}
 	for _, v := range *list {
 		value := ""
-		biddingcontent, _ := v["biddingcontent"].([]interface{})
-		bct := util.ObjArrToStringArr(biddingcontent)
+		subscopeclass, _ := v["s_subscopeclass"].(string)
+		subscopeclass = strings.Trim(subscopeclass, ",")
+		bct := strings.Split(subscopeclass, ",")
 		if bct == nil || len(bct) == 0 {
 			continue
 		}

+ 1 - 1
src/jfw/modules/behaviorcollect/README.md

@@ -1,5 +1,5 @@
 ajx调用,model,s_url属性必填
-var content='{"model":"accesslog","s_url":"/jylab/entsearch/","s_describe":"剑鱼实验室企业查询"}'
+var content='{"model":"accesslog","s_url":"/jylab/entsearch/","s_describe":"剑鱼实验室企业查询",...}'
 
 
 $.post('/accessinfo/byajax',{json:content},function(r){

+ 4 - 0
src/jfw/modules/entsesearch/.idea/misc.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="GOROOT" path="C:/go" />
+</project>

+ 0 - 603
src/jfw/modules/entsesearch/.idea/workspace.xml

@@ -1,603 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ChangeListManager">
-    <list default="true" id="8aeecff7-7661-418b-8b35-28dd61a91106" name="Default" comment="" />
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
-    <option name="TRACKING_ENABLED" value="true" />
-    <option name="SHOW_DIALOG" value="false" />
-    <option name="HIGHLIGHT_CONFLICTS" value="true" />
-    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
-    <option name="LAST_RESOLUTION" value="IGNORE" />
-  </component>
-  <component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
-  <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="main.go" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/main.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="200">
-              <caret line="21" column="13" lean-forward="false" selection-start-line="21" selection-start-column="13" selection-end-line="21" selection-end-column="13" />
-              <folding>
-                <element signature="e#14#173#0" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="entinfo.go" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/search/entinfo.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="0">
-              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="entsesearch.go" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/search/entsesearch.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="1220">
-              <caret line="70" column="0" lean-forward="false" selection-start-line="70" selection-start-column="0" selection-end-line="70" selection-end-column="0" />
-              <folding>
-                <element signature="e#16#129#0" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="config.json" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/config.json">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="20">
-              <caret line="1" column="23" lean-forward="true" selection-start-line="1" selection-start-column="23" selection-end-line="1" selection-end-column="41" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="entseSearch.html" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/src/web/templates/weixin/entseSearch.html">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="20">
-              <caret line="263" column="50" lean-forward="false" selection-start-line="263" selection-start-column="50" selection-end-line="263" selection-end-column="50" />
-              <folding>
-                <element signature="n#style#0;n#div#0;n#div#0;n#form#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-              </folding>
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="mongo.go" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/../../tools/mongo.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="114">
-              <caret line="12" column="34" lean-forward="true" selection-start-line="12" selection-start-column="34" selection-end-line="12" selection-end-column="34" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="config.go" pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/../../config/config.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="80">
-              <caret line="6" column="4" lean-forward="false" selection-start-line="6" selection-start-column="4" selection-end-line="6" selection-end-column="4" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="entsearch.go" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/../../jylabutil/entsearch.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="302">
-              <caret line="84" column="0" lean-forward="false" selection-start-line="84" selection-start-column="0" selection-end-line="84" selection-end-column="0" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-      <file leaf-file-name="tools.go" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/../../tools/tools.go">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="0">
-              <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
-  </component>
-  <component name="FindInProjectRecents">
-    <findStrings>
-      <find>recList</find>
-    </findStrings>
-  </component>
-  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
-  <component name="JsGulpfileManager">
-    <detection-done>true</detection-done>
-    <sorting>DEFINITION_ORDER</sorting>
-  </component>
-  <component name="ProjectFrameBounds">
-    <option name="x" value="-8" />
-    <option name="y" value="-8" />
-    <option name="width" value="1382" />
-    <option name="height" value="744" />
-  </component>
-  <component name="ProjectView">
-    <navigator currentView="ProjectPane" proportions="" version="1">
-      <flattenPackages />
-      <showMembers />
-      <showModules />
-      <showLibraryContents />
-      <hideEmptyPackages />
-      <abbreviatePackageNames />
-      <autoscrollToSource />
-      <autoscrollFromSource />
-      <sortByType />
-      <manualOrder />
-      <foldersAlwaysOnTop value="true" />
-    </navigator>
-    <panes>
-      <pane id="Scope" />
-      <pane id="Scratches" />
-      <pane id="ProjectPane">
-        <subPane>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="web" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="templates" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="weixin" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="web" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="templates" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="web" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-          <PATH>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="entsesearch" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="src" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-            <PATH_ELEMENT>
-              <option name="myItemId" value="search" />
-              <option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
-            </PATH_ELEMENT>
-          </PATH>
-        </subPane>
-      </pane>
-    </panes>
-  </component>
-  <component name="PropertiesComponent">
-    <property name="settings.editor.selected.configurable" value="com.goide.configuration.GoLibrariesConfigurableProvider" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/src/main.go" />
-    <property name="configurable.Global.GOPATH.is.expanded" value="true" />
-    <property name="configurable.Project.GOPATH.is.expanded" value="true" />
-    <property name="configurable.Module.GOPATH.is.expanded" value="true" />
-  </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
-  <component name="RunManager" selected="Go Application.entseSearch">
-    <configuration default="true" type="GoApplicationRunConfiguration" factoryName="Go Application">
-      <module name="" />
-      <working_directory value="$PROJECT_DIR$" />
-      <go_parameters value="-i" />
-      <filePath value="$PROJECT_DIR$" />
-      <kind value="FILE" />
-      <method />
-    </configuration>
-    <configuration default="true" type="GoRunFileConfiguration" factoryName="Go Single File">
-      <module name="" />
-      <working_directory value="$PROJECT_DIR$" />
-      <filePath value="$PROJECT_DIR$" />
-      <method />
-    </configuration>
-    <configuration default="true" type="GoTestRunConfiguration" factoryName="Go Test">
-      <module name="" />
-      <working_directory value="$PROJECT_DIR$" />
-      <go_parameters value="-i" />
-      <framework value="gotest" />
-      <kind value="DIRECTORY" />
-      <method />
-    </configuration>
-    <configuration default="true" type="JavaScriptTestRunnerJest" factoryName="Jest">
-      <node-interpreter value="project" />
-      <working-dir value="" />
-      <envs />
-      <scope-kind value="ALL" />
-      <method />
-    </configuration>
-    <configuration default="true" type="JavaScriptTestRunnerProtractor" factoryName="Protractor">
-      <config-file value="" />
-      <node-interpreter value="project" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug">
-      <method />
-    </configuration>
-    <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
-      <node-interpreter>project</node-interpreter>
-      <node-options />
-      <gulpfile />
-      <tasks />
-      <arguments />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="true" type="js.build_tools.npm" factoryName="npm">
-      <command value="run" />
-      <scripts />
-      <node-interpreter value="project" />
-      <envs />
-      <method />
-    </configuration>
-    <configuration default="false" name="entseSearch" type="GoApplicationRunConfiguration" factoryName="Go Application">
-      <output_file path="D:\jianyu\jy\src\jfw\modules\entsesearch\src" />
-      <module name="entsesearch" />
-      <working_directory value="$PROJECT_DIR$" />
-      <go_parameters value="-i" />
-      <filePath value="D:\jianyu\jy\src\jfw\modules\entsesearch\src\main.go" />
-      <kind value="FILE" />
-      <method />
-    </configuration>
-    <list size="1">
-      <item index="0" class="java.lang.String" itemvalue="Go Application.entseSearch" />
-    </list>
-  </component>
-  <component name="ShelveChangesManager" show_recycled="false">
-    <option name="remove_strategy" value="false" />
-  </component>
-  <component name="ToolWindowManager">
-    <frame x="-8" y="-8" width="1382" height="744" extended-state="6" />
-    <layout>
-      <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2489019" sideWeight="0.5" order="1" side_tool="false" content_ui="combo" />
-      <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="9" side_tool="false" content_ui="tabs" />
-      <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
-      <window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
-      <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4148265" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
-      <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-      <window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="true" content_ui="tabs" />
-      <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
-      <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
-      <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
-      <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
-      <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
-      <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="3" side_tool="false" content_ui="combo" />
-      <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
-      <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
-    </layout>
-  </component>
-  <component name="TypeScriptGeneratedFilesManager">
-    <option name="processedProjectFiles" value="true" />
-  </component>
-  <component name="VcsContentAnnotationSettings">
-    <option name="myLimit" value="2678400000" />
-  </component>
-  <component name="XDebuggerManager">
-    <breakpoint-manager />
-    <watches-manager />
-  </component>
-  <component name="editorHistoryManager">
-    <entry file="file://$PROJECT_DIR$/src/main.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="200">
-          <caret line="21" column="13" lean-forward="false" selection-start-line="21" selection-start-column="13" selection-end-line="21" selection-end-column="13" />
-          <folding>
-            <element signature="e#14#173#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/search/entinfo.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/search/entsesearch.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1400">
-          <caret line="70" column="0" lean-forward="false" selection-start-line="70" selection-start-column="0" selection-end-line="70" selection-end-column="0" />
-          <folding>
-            <element signature="e#16#129#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/config.json">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="60">
-          <caret line="3" column="25" lean-forward="true" selection-start-line="3" selection-start-column="25" selection-end-line="3" selection-end-column="25" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/web/templates/weixin/entseSearch.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="5260">
-          <caret line="263" column="50" lean-forward="true" selection-start-line="263" selection-start-column="50" selection-end-line="263" selection-end-column="50" />
-          <folding>
-            <element signature="n#style#0;n#div#0;n#div#0;n#form#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../jylabutil/entsearch.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1600">
-          <caret line="84" column="0" lean-forward="false" selection-start-line="84" selection-start-column="0" selection-end-line="84" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../tools/tools.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../tools/mongo.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="160">
-          <caret line="12" column="0" lean-forward="false" selection-start-line="12" selection-start-column="0" selection-end-line="12" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="200">
-          <caret line="21" column="13" lean-forward="false" selection-start-line="21" selection-start-column="13" selection-end-line="21" selection-end-column="13" />
-          <folding>
-            <element signature="e#14#173#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/search/entinfo.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/search/entsesearch.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1220">
-          <caret line="70" column="0" lean-forward="false" selection-start-line="70" selection-start-column="0" selection-end-line="70" selection-end-column="0" />
-          <folding>
-            <element signature="e#16#129#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/config.json">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="60">
-          <caret line="3" column="25" lean-forward="true" selection-start-line="3" selection-start-column="25" selection-end-line="3" selection-end-column="25" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../tools/mongo.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="160">
-          <caret line="12" column="54" lean-forward="false" selection-start-line="12" selection-start-column="40" selection-end-line="12" selection-end-column="54" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../jylabutil/entsearch.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1600">
-          <caret line="84" column="0" lean-forward="false" selection-start-line="84" selection-start-column="0" selection-end-line="84" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../tools/tools.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/web/templates/weixin/entseSearch.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="5260">
-          <caret line="263" column="50" lean-forward="true" selection-start-line="263" selection-start-column="50" selection-end-line="263" selection-end-column="50" />
-          <folding>
-            <element signature="n#style#0;n#div#0;n#div#0;n#form#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/main.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="200">
-          <caret line="21" column="13" lean-forward="false" selection-start-line="21" selection-start-column="13" selection-end-line="21" selection-end-column="13" />
-          <folding>
-            <element signature="e#14#173#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/search/entinfo.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/search/entsesearch.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="1220">
-          <caret line="70" column="0" lean-forward="false" selection-start-line="70" selection-start-column="0" selection-end-line="70" selection-end-column="0" />
-          <folding>
-            <element signature="e#16#129#0" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../tools/tools.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="0">
-          <caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../jylabutil/entsearch.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="302">
-          <caret line="84" column="0" lean-forward="false" selection-start-line="84" selection-start-column="0" selection-end-line="84" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/web/templates/weixin/entseSearch.html">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="20">
-          <caret line="263" column="50" lean-forward="false" selection-start-line="263" selection-start-column="50" selection-end-line="263" selection-end-column="50" />
-          <folding>
-            <element signature="n#style#0;n#div#0;n#div#0;n#form#0;n#div#0;n#body#0;n#html#0;n#!!top" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/src/config.json">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="20">
-          <caret line="1" column="23" lean-forward="true" selection-start-line="1" selection-start-column="23" selection-end-line="1" selection-end-column="41" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../tools/mongo.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="114">
-          <caret line="12" column="34" lean-forward="true" selection-start-line="12" selection-start-column="34" selection-end-line="12" selection-end-column="34" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-    <entry file="file://$PROJECT_DIR$/../../config/config.go">
-      <provider selected="true" editor-type-id="text-editor">
-        <state relative-caret-position="80">
-          <caret line="6" column="4" lean-forward="false" selection-start-line="6" selection-start-column="4" selection-end-line="6" selection-end-column="4" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
-  </component>
-</project>

+ 39 - 23
src/jfw/modules/entsesearch/src/search/entsesearch.go

@@ -11,6 +11,10 @@ import (
 	"qfw/util"
 )
 
+const (
+	wx_maxPageNum         = 20
+	wx_pageSize           = 1
+)
 type EntSeSearch struct {
 	*xweb.Action
 	toSearch  xweb.Mapper `xweb:"/jylab/entsesearch/search"`  //跳转到中标企业查询页面
@@ -24,7 +28,7 @@ func init() {
 }
 
 func (e *EntSeSearch) ToSearch() error{
-	e.T["pageSize"] = "10"
+	e.T["pageSize"] = wx_pageSize
 	return e.Render("/weixin/entseSearch.html", &e.T)
 }
 
@@ -43,30 +47,42 @@ func (e *EntSeSearch) RecList() {
 func (e *EntSeSearch) ProList() {
 	var searchname = e.GetString("searchname")
 	var scope = e.GetString("scope")
-	//var money = e.GetString("money")
-	var money_from,_ = strconv.Atoi(e.GetString("money_from"))
-	var money_to,_ = strconv.Atoi(e.GetString("money_to"))
-	fmt.Println(searchname,scope,money_from,money_to)
-	proMap := jylabutil.GetProjectByEntName(searchname,scope,money_from,money_to,1,10)
-	fmt.Println("proMap------------------",proMap)
-	for _,val := range proMap{
-		var jgtime = val["jgtime"]
-		if jgtime!=nil{
-			val["jgtime"] = time.Unix(int64(jgtime.(float64)),0).Format("20060102")
-		}else{
-			val["jgtime"] = ""
-		}
-		var bidamount = val["bidamount"]
-		if bidamount!=nil{
-			var bidamount_f = bidamount.(float64)/10000
-			val["bidamount"] = strings.Replace(fmt.Sprintf("%.2f", bidamount_f),".00","",-1)
-		}else{
-			val["bidamount"] = ""
-		}
+	var money_from = e.GetString("money_from")
+	var money_to = e.GetString("money_to")
+	var money_from_p = float64(0)
+	var money_to_p = float64(0)
+	if money_from !=""{
+		money_from_p,_ = strconv.ParseFloat(money_from, 64)
+	}
+	if money_to !=""{
+		money_to_p,_ = strconv.ParseFloat(money_to, 64)
+	}
+	var pageNum,_ = strconv.Atoi(e.GetString("pageNum"))
 
-		val["sourceinfoid"] = util.EncodeArticleId2ByCheck(val["sourceinfoid"].(string))
+	fmt.Println(searchname,scope,money_from_p,money_to_p)
+	proList := make([]map[string]interface{},0)
+	if pageNum<=wx_maxPageNum {
+		proList = jylabutil.GetProjectByEntName(searchname,scope,money_from_p,money_to_p,pageNum,wx_pageSize)
+		fmt.Println("proList------------------2",len(proList))
+		for _,val := range proList{
+			var jgtime = val["jgtime"]
+			if jgtime!=nil{
+				val["jgtime"] = time.Unix(int64(jgtime.(float64)),0).Format("20060102")
+			}else{
+				val["jgtime"] = ""
+			}
+			var bidamount = val["bidamount"]
+			if bidamount!=nil{
+				var bidamount_f = bidamount.(float64)/10000
+				val["bidamount"] = strings.Replace(fmt.Sprintf("%.2f", bidamount_f),".00","",-1)
+			}else{
+				val["bidamount"] = ""
+			}
+			val["sourceinfoid"] = util.EncodeArticleId2ByCheck(val["sourceinfoid"].(string))
+		}
 	}
 	e.ServeJson(map[string]interface{}{
-		"proList": proMap,
+		"proList": proList,
+		"hasNextPage": proList != nil && len(proList) == wx_pageSize && pageNum < wx_maxPageNum,
 	})
 }

BIN
src/jfw/modules/entsesearch/src/web/staticres/jylab/entsesearch/images/wx/jysorry_1.png


BIN
src/jfw/modules/entsesearch/src/web/staticres/jylab/entsesearch/images/wx/jyyjfk.png


+ 383 - 88
src/jfw/modules/entsesearch/src/web/templates/weixin/entseSearch.html

@@ -7,6 +7,7 @@
 <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,initial-scale=1.0" user-scalable="no" />
 <meta name="renderer" content="webkit"/>
 <link href="/jylab/entsesearch/wxswordfish/style.css?v={{Msg "seo" "version"}}" rel="stylesheet">
+<link href="/jylab/entsesearch/css/dropload.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 {{include "/common/pnc.html"}}
 <link href="/jylab/entsesearch/css/wxlist.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
@@ -16,9 +17,129 @@
 <script src="/jylab/entsesearch/wxswordfish/search.js?v={{Msg "seo" "version"}}"></script>
 <script src="/jylab/entsesearch/wxswordfish/jquery.resize.js"></script>
 <script src="/jylab/entsesearch/js/dropload.js?v={{Msg "seo" "version"}}"></script>
-
 <script src="/jylab/entsesearch/js/rem.js"></script>
 <link rel="stylesheet" href="/jylab/entsesearch/css/reset.css" />
+
+<script>
+    var scrollTop = 0;
+    var listCache = "";
+    var pageNumCache = 1;
+    var noMoreCache = false;
+    var moneyFromCache = "";
+    var moneyToCache = "";
+    var scopeCache = "";
+    var pageSize = {{.T.pageSize}};
+    var pageNum = "1";
+    //是否有列表数据
+    var dataListFlag = true;
+    //查询参数
+    var reqParam = null;
+    $(function () {
+        reqParam = {
+            "searchname": $.trim($(".searchname").val()),
+            "money_from": "",
+            "money_to": "",
+            "scope": "",
+            "pageNum": pageNum
+        };
+        //返回时 在缓存取数据
+        var loadCacheData = false;
+        if (sessionStorage && sessionStorage.wxsearchScrollTop && sessionStorage.wxsearchListCache) {
+            loadCacheData = true;
+            pageNum = sessionStorage.wxsearchPageNumCache;
+            noMoreCache = sessionStorage.wxsearchNoMoreCache;
+            $("#list").css("visibility", "hidden");
+            appendListHtml(sessionStorage.wxsearchListCache, pageNum);
+            if (noMoreCache == "true") {
+                initDroploadNoMoreData();
+            }else{
+                initDropload();
+            }
+            sessionStorage.removeItem("wxsearchPageNumCache");
+            sessionStorage.removeItem("wxsearchListCache");
+
+            moneyFromCache = sessionStorage.wxsearchMoneyFromCache;
+            moneyToCache = sessionStorage.wxsearchMoneyToCache;
+            $("#money_from").val(moneyFromCache);
+            $("#money_to").val(moneyToCache);
+            if(moneyFromCache!="" || moneyToCache!=""){
+                $(".money-inp").addClass("money-inp-active");
+                $(".money .btn").removeClass("active_m");
+            }else{
+                $(".money .btn").addClass("active_m");
+                $(".money-inp").removeClass("money-inp-active");
+            }
+            sessionStorage.removeItem("wxsearchMoneyFromCache");
+            sessionStorage.removeItem("wxsearchMoneyToCache");
+
+            scopeCache = sessionStorage.wxsearchScopeCache;
+            if(scopeCache != ""){
+                $(".contentone").find("ul:first li:first .btn").removeClass("active");
+                scopeCache = scopeCache.split(",");
+                for(var i=0;i<scopeCache.length;i++){
+                    $(".contentone").find(".btn").each(function(){
+                        if($(this).text() == scopeCache[i]){
+                            $(this).addClass("active");
+                            if($(this).parent("li").find(".btn").length == $(this).parent("li").find(".btn.active").length){
+                                $(this).prevAll('div[id="dqbtn"]').addClass("active");
+                            };
+                            return false;
+                        }
+                    });
+                }
+            }
+            sessionStorage.removeItem("wxsearchScopeCache");
+
+            setTimeout(function () {
+                $(window).scrollTop(sessionStorage.wxsearchScrollTop);
+                sessionStorage.removeItem("wxsearchScrollTop");
+                $("#list").css("visibility", "visible");
+            }, 300);
+        } else {
+            $(window).scrollTop(0);
+        }
+    });
+
+    function initDropload(){
+        $(".dropload-down,.dropload-noData").remove();
+        //上拉分页
+        $('#wrapper').dropload({
+            scrollArea: window,
+            loadDownFn: function (me) {
+                beforeSubmit();
+                pageNum++;
+                reqParam["pageNum"] = pageNum;
+                $.ajax({
+                    type: 'post',
+                    url: '/jylab/entsesearch/proList',
+                    data: reqParam,
+                    dataType: 'json',
+                    success: function (data) {
+                        //没有数据
+                        if (data["proList"] == null || data["proList"].length == 0) {
+                            noMoreData(me);
+                            return;
+                        }
+                        var html = getHtml(data["proList"], reqParam["pageNum"]);
+                        // 每次数据插入,必须重置
+                        appendListHtml(html, pageNum);
+                        //没有下一页了
+                        if (!data.hasNextPage) {
+                            // 锁定
+                            me.lock();
+                            // 无数据
+                            me.noData();
+                        }
+                        me.resetload();
+                    },
+                    error: function (xhr, type) {
+                        noMoreData(me);
+                    }
+                });
+            }
+        });
+    }
+</script>
 <style>
 #searchDiv .searchform{
 	width:79%;
@@ -68,9 +189,9 @@
 	transform: translateZ(0);
 }
 .select{
-	height:40px;
+	height:45px;
 	width:100%;
-	line-height:40px;
+	line-height:45px;
 	border-bottom: 1px solid #ccc;
 }
 .select ul li{
@@ -81,15 +202,15 @@
 }
 .select ul li img{
 	width: 10px;
-    padding-bottom: 5px;
+    padding-bottom: 3px;
     margin-left: 8px;
 }
 .shuxian{
 	border-right: 1px solid #ccc;
     color: #2cb7ca;
-    line-height: 30px;
-    height: 30px;
-    margin-top: 4px;
+    line-height: 35px;
+    height: 35px;
+    margin-top: 5px;
 }
 .selecter{
 	padding:10px;
@@ -127,6 +248,7 @@
 }
 .money-inp input{
 	width:100%;
+	padding-right: 45px;
 }
 .money-inp .min-price{
 	width:42%;
@@ -172,7 +294,7 @@
 }
 .bottom_btn .reset{
 	background-color:#eff9fa;
-	color:2cb7ca;
+	color:#2cb7ca;
 }
 .bottom_btn .sure{
 	background-color:#2cb7ca;
@@ -199,7 +321,8 @@
 }
 
 #jytables{
-	padding: .3rem;
+	/*padding: .3rem;*/
+	padding-bottom: .3rem;
 	padding-top: .4rem;
 }
 #jytables table{
@@ -229,14 +352,18 @@
 	color: #2cb7ca;
 }
 
+.money-inp-active{
+	background-color: #2cb7ca;
+}
+
 .tip_m{
 	font-size: 14px;
-	padding: 0 .3rem;
+	/*padding: 0 .3rem;*/
 	margin-bottom:70px;
 	line-height: 20px;
 }
 #recList{
-	z-index: 1;
+	z-index: 1000;
 	position: absolute;
 	background: rgb(255, 255, 255);
 	width: 79%;
@@ -246,10 +373,27 @@
 	background-color: #24C0D7;
 	color: #FFFFFF;
 }
+
+#wrapper,.nullcontent{
+	/*padding:0px 20px;*/
+	padding:0px 15px;
+	background-color:#fff;
+}
+.nullcontent{
+	padding-top: 10%;
+	position: absolute;
+	top: 65px;
+	left: 0px;
+	right: 0px;
+	border-top: 1px solid #f4f4f9;
+}
+#wrapper{
+	margin-bottom: 52px;
+}
 </style>
 </head>
 <body>
-<!-->顶部搜索<-->
+<!--顶部搜索-->
 <div id="searchDiv">
 	<form class="searchform" id="searchform" method="post" target="listf">
 	<div class="wxhead">
@@ -268,7 +412,7 @@
 	</div>
 	</form>
 </div>
-<!-->过滤搜索<-->
+<!--过滤搜索-->
 <div id="set_search" class="hidden">
 	<div class="select">
 		<ul>
@@ -285,12 +429,16 @@
 						<li>价格区间</li>
 						<li class="money-inp">
 							<div class="min-price">
-								<input class="form-control money-input" id="money_from"  placeholder="最低价" type="number"/>
+								<input class="form-control money-input" id="money_from"  placeholder="最低价" type="number"
+									   onkeyup="(this.v=function(){this.value=/^\d+(\.\d{0,2})?$/.test(this.value)==true?this.value:'';}).call(this)"
+									   onblur="this.v();"/>
 								<span class="min-unit">万元</span>
 								<span class="fgx"></span>
 							</div>
 							<div class="max-price">
-								<input class="form-control money-input"  id="money_to" placeholder="最高价" type="number"/>
+								<input class="form-control money-input"  id="money_to" placeholder="最高价" type="number"
+									   onkeyup="(this.v=function(){this.value=/^\d+(\.\d{0,2})?$/.test(this.value)==true?this.value:'';}).call(this)"
+									   onblur="this.v();"/>
 								<span class="max-unit">万元</span>
 							</div>
 						</li>
@@ -368,42 +516,51 @@
 	</div>	
 </div>
 <!--数据列表-->
-<div id="searchList" style="margin-top:.2rem;border-top: 1px solid #E0E0E0;">
-	<section id="jytables">
+<div id="wrapper" style="margin-top:.2rem;border-top: 1px solid #E0E0E0;">
+	<div id="list">
+		<section id="jytables">
 		<table>
 			<thead>
 			<tr>
-				<td>序号</td>
-				<td>中标日期</td>
-				<td>项目名称</td>
-				<td>中标金额(万元)</td>
+				<td width="10%">序号</td>
+				<td width="20%">中标日期</td>
+				<td width="50%">项目名称</td>
+				<td width="20%">中标金额(万元)</td>
 			</tr>
 			</thead>
 			<tbody>
 			</tbody>
 		</table>
 	</section>
+	</div>
+	<!--tip-->
+	<div class="tip_m">提示:为了获得更佳的体验,推荐使用电脑浏览器访问剑鱼网站jianyu360.com查看数据表格。</div>
+</div>
+<!--no data-->
+<!--<div class="nullcontent text-center  hidden">-->
+	<!--<div style="font-size:16px;color:#1d1d1d;">没有找到和该企业匹配的中标项目信息</div>-->
+<!--</div>-->
+<div class="nullcontent text-center  hidden">
+	<div >
+		<img style="width:150px;margin:0px 0 50px 0;" src="/jylab/entsesearch/images/wx/jysorry_1.png">
+	</div>
+	<div style="font-size:16px;color:#1d1d1d;">没有找到和该关键词匹配的信息</div>
+	<div style="width:100%;" class="text-center">
+		<img onClick="window.open('/swordfish/feedback')" style="width: 200px;margin-top: 25px;" src="/jylab/entsesearch/images/wx/jyyjfk.png">
+	</div>
 </div>
-<!--tip-->
-<div class="tip_m">提示:为了获得更佳的体验,推荐使用电脑浏览器访问剑鱼网站jianyu360.com查看数据表格。</div>
 </body>
 <script>
-	var pageSize = {{.T.pageSize}};
-	var pageNum = "1";
-	//查询参数
-    var reqParam = {
-        "searchname": $.trim($(".searchname").val()),
-        "money_from": $.trim($("#money_from").val()),
-        "money_to": $.trim($("#money_to").val()),
-        "scope": "",
-        "pageNum": pageNum
-    };
-	$(function () {
+    $(function () {
+        //
+		if($("#wrapper tbody tr").length==0){
+            $("#wrapper").addClass("hidden");
+            $(".tip_m").addClass("hidden");
+		}
         $(".qc").addClass("hidden");
         $(".tubiao").addClass("hidden");
         $(".jydqsure").css("background","#ccc");
-        $("#searchList").addClass("hidden");
-        $(".tip_m").addClass("hidden");
+        $(".jydqsure").removeClass("jydqsure_active");
 
         //选项卡
         $("#set_search .select ul li:eq(0)").css("color","#2cb7ca");
@@ -411,18 +568,33 @@
         $(".money").removeClass("hidden");
         $(".jydq-dialog").addClass("hidden");
 
-        //搜索框
+        //搜索框输入
         $("#searchname").on("input propertychange",function(){
             var snqc = $(".searchname").val();
             if(snqc.length > 0){
                 $(".qc").removeClass("hidden");
                 $(".tubiao").removeClass("hidden");
                 $(".jydqsure").css("background","#2cb7ca");
+                $(".jydqsure").addClass("jydqsure_active");
                 getRecList(snqc);
             }else{
                 $(".qc").addClass("hidden");
                 $(".tubiao").addClass("hidden");
                 $(".jydqsure").css("background","#ccc");
+                $(".jydqsure").removeClass("jydqsure_active");
+                $("#recList").hide();
+            }
+        });
+
+        //搜索框选中
+        $("#searchname").focus(function(){
+            var snqc = $(".searchname").val();
+            if(snqc.length > 0){
+                $(".qc").removeClass("hidden");
+                $(".tubiao").removeClass("hidden");
+            }else{
+                $(".qc").addClass("hidden");
+                $(".tubiao").addClass("hidden");
             }
         });
 
@@ -432,22 +604,25 @@
             $(".qc").addClass("hidden");
             $(".tubiao").addClass("hidden");
             $(".jydqsure").css("background","#ccc");
+            $(".jydqsure").removeClass("jydqsure_active");
             $(".wxhead").find("[name='searchname']").focus();
         });
-
-        $("body").click(function () {
-            $("#recList").hide();
+        $("body").on("touchstart",function (e) {
+            if(e.target.id != "recList" && e.target.className !="rec"){
+                $("#recList").hide();
+            }
         });
-
         //金额输入
         $(".money-input").on("input propertychange",function(){
             var money_from = $.trim($("#money_from").val());
             var money_to = $.trim($("#money_to").val());
             var val = $.trim($(this).val());
             if(val!="" ||  money_from!="" || money_to!=""){
+                $(".money-inp").addClass("money-inp-active");
                 $(".money .btn").removeClass("active_m");
 			}else{
                 $(".money .btn").addClass("active_m");
+                $(".money-inp").removeClass("money-inp-active");
 			}
         });
 
@@ -465,6 +640,7 @@
 
         $(".money .btn").click(function () {
             $(".money .btn").addClass("active_m");
+            $(".money-inp").removeClass("money-inp-active");
         });
 
         //重置
@@ -473,11 +649,14 @@
             $(".contentone").find(".btn").first().addClass("active");
 
             $(".money .btn").addClass("active_m");
+            $(".money-inp").removeClass("money-inp-active");
         });
 
         //搜索企业项目信息
         $(".jydqsure").click(function () {
-            formSubmit();
+            if($(this).attr("class").indexOf("jydqsure_active")>0){
+                formSubmit();
+			}
         });
 
         $(".tubiao").click(function(){
@@ -487,11 +666,26 @@
         //显示筛选过滤选择
         $(".shaixuan").click(function(){
             if($("#set_search").attr("class")=="hidden"){
+                if($.trim($("#searchname").val())!=""){
+                    $(".jydqsure").css("background","#2cb7ca");
+                    $(".jydqsure").addClass("jydqsure_active");
+                }
                 $("#set_search").removeClass("hidden");
-                $("#searchList").addClass("hidden");
+                $("#wrapper").addClass("hidden");
                 $(".tip_m").addClass("hidden");
+                $(".nullcontent").addClass("hidden");
             }else{
-                shaixuanHide();
+                $("#set_search").addClass("hidden");
+                //if($("#wrapper tbody tr").length==0){
+                if(!dataListFlag){
+                    $("#wrapper").addClass("hidden");
+                    $(".tip_m").addClass("hidden");
+                    $(".nullcontent").removeClass("hidden");
+                }else if($("#wrapper tbody tr").length>0){
+                    $("#wrapper").removeClass("hidden");
+                    $(".tip_m").removeClass("hidden");
+                    $(".nullcontent").addClass("hidden");
+				}
             }
         });
 
@@ -513,13 +707,17 @@
             $(".jydq-dialog").removeClass("hidden");
         })
 
-        $('#searchList').dropload({
-            scrollArea: window.top.isIOS ? window.top : window,
-            loadDownFn: function (me) {
-                alert(111);
+        document.onkeydown = function () {
+            if (window.event && window.event.keyCode == 13) {
+                window.event.returnValue = false;
+                if($.trim($(".searchname").val()) == ""){
+                    return;
+                }
+                $("#searchname").blur();
+                $("#recList").hide();
+                formSubmit();
             }
-        });
-
+        }
     });
 
     //企业推荐列表
@@ -544,9 +742,11 @@
             $(".rec").click(function(){
                 if($(this).text()!=""){
                     $("#searchname").val($(this).text());
+                    setSearchCursor();
                     $("#recList").hide();
                     $(".qc").addClass("hidden");
                     $(".tubiao").removeClass("hidden");
+                    //formSubmit();
                 }
             });
         });
@@ -554,16 +754,59 @@
 
     //确定
     function formSubmit(){
+		beforeSubmit();
+        pageNum = "1";
+        //default
+        scrollTop = 0;
+        listCache = "";
+        pageNumCache = 1;
+        noMoreCache = false;
+
+        reqParam["pageNum"]=pageNum;
+        $.post("/jylab/entsesearch/proList",reqParam,function(r){
+            if(r){
+                var proList = r.proList;
+                if(typeof (proList)!="undefined" && proList.length>0){
+                    $("#wrapper tbody tr").remove();
+                    var html = "";
+                    for(var i=0;i<proList.length;i++){
+                        var bidamount = parseNToEmpty(proList[i].bidamount);
+                        var projectname = parseNToEmpty(proList[i].projectname);
+                        var jgtime = parseNToEmpty(proList[i].jgtime);
+                        var sourceinfoid = parseNToEmpty(proList[i].sourceinfoid);
+                        var projectcode = parseNToEmpty(proList[i].projectcode);
+                        //var obj =$("<tr onclick=\"toDetail('"+sourceinfoid+"','"+projectcode+"','"+projectname+"')\"><td>"+(i+1)+"</td><td>"+jgtime+"</td><td>"+projectname+"</td><td>"+bidamount+"</td></tr>");
+                        //$("#wrapper tbody").append(obj);
+                        html +="<tr onclick=\"toDetail('"+sourceinfoid+"','"+projectcode+"','"+projectname+"')\"><td>"+(i+1)+"</td><td>"+jgtime+"</td><td>"+projectname+"</td><td>"+bidamount+"</td></tr>";
+                    }
+                    appendListHtml(html,1);
+                    shaixuanHide();
+                    initDropload();
+                }else{
+                    dataListFlag = false;
+                    hasNoData();
+				}
+            }
+        });
+    }
+
+    function beforeSubmit() {
         var searchname = $.trim($(".searchname").val().replace(/^\s+|\s+$/g,"").replace(/\s+/g,"+"));
-        var dataObj = {};
 
         var money = "";
+        var money_from  = "";
+        var money_to = "";
         //金额
         if($(".money .btn.active_m").first().length>0){
             money = $(".money .btn.active_m").first().text();
         }
-        var money_from = $.trim($("#money_from").val());
-        var money_to = $.trim($("#money_to").val());
+        if(money!=""){
+            money_from = "";
+            money_to = "";
+        }else{
+            money_from = $.trim($("#money_from").val());
+            money_to = $.trim($("#money_to").val());
+        }
 
         //项目地区
         this.setScope = function(){
@@ -580,41 +823,12 @@
             return scope.join(",");
         };
         reqParam["scope"] = this.setScope();
-        dataObj["searchname"] = searchname;
-        dataObj["scope"] = this.setScope();
-        dataObj["money"] = money;
-        dataObj["money_from"] = money_from;
-        dataObj["money_to"] = money_to;
-        dataObj["pagenum"] = "1";
-        dataObj["pagesize"] = "10";
-
-//			  $("#searchform [name='scope']").val(this.setScope());
-//            $("#searchform [name='money']").val(money);
-//            $("#searchform [name='money_from']").val(money_from);
-//            $("#searchform [name='money_to']").val(money_to);
-//            $(".searchform").submit();
-
-        $.post("/jylab/entsesearch/proList",dataObj,function(r){
-            if(r){
-                if(typeof (r.proList)!="undefined"){
-                    var proList = r.proList;
-                    //$("#searchList tbody tr").remove();
-                    for(var i=0;i<proList.length;i++){
-                        var bidamount = proList[i].bidamount;
-                        var projectname = proList[i].projectname;
-                        var zbtime = proList[i].jgtime;
-                        var sourceinfoid = proList[i].sourceinfoid;
-                        var projectcode = proList[i].projectcode;
-                        var obj =$("<tr onclick=\"toDetail('"+sourceinfoid+"','"+projectcode+"','"+projectname+"')\"><td>"+(i+1)+"</td><td>"+zbtime+"</td><td>"+projectname+"</td><td>"+bidamount+"</td></tr>");
-                        $("#searchList tbody").append(obj);
-                    }
-                }
-                shaixuanHide();
-            }
-        });
+        reqParam["searchname"] = searchname;
+        reqParam["money_from"] = money_from;
+        reqParam["money_to"] = money_to;
     }
 
-    //
+    //项目历程
     function toDetail(id,projectcode,projectname) {
         if(id!="" && typeof (id)!="undefined" && projectcode!="" && typeof(projectcode)!="undefined" && projectname!="" && typeof(projectname)!="undefined"){
             window.location.href="/follow/photo/"+id+"__"+projectname+"__"+projectcode;
@@ -623,10 +837,91 @@
 
     //筛选隐藏
 	function shaixuanHide() {
+        $(".nullcontent").addClass("hidden");
         $("#set_search").addClass("hidden");
-        $("#searchList").removeClass("hidden");
+        $("#wrapper").removeClass("hidden");
         $(".tip_m").removeClass("hidden");
     }
-	
+
+    //null || undefined to empty
+    function parseNToEmpty(str) {
+        if(str==null || typeof (str)=="undefined"){
+            str = "";
+		}
+		return str;
+    }
+
+    //搜索框光标位置
+    function setSearchCursor() {
+        $("#searchname").focus();
+        try{
+            setCursorPos(document.getElementById("searchname"),$("#searchname").val().length);
+        }catch(e){}
+    }
+
+    function noMoreData(me){
+        noMoreCache = "true";
+        // 锁定
+        me.lock();
+        // 无数据
+        me.noData();
+        me.resetload();
+    }
+    function getHtml(list,pageNum){
+        var html = '';
+        for(var i=0;i<list.length;i++){
+            var index = (pageNum-1)*pageSize+i+1;
+            var bidamount = parseNToEmpty(list[i].bidamount);
+            var projectname = parseNToEmpty(list[i].projectname);
+            var jgtime = parseNToEmpty(list[i].jgtime);
+            var sourceinfoid = parseNToEmpty(list[i].sourceinfoid);
+            var projectcode = parseNToEmpty(list[i].projectcode);
+            html +="<tr onclick=\"toDetail('"+sourceinfoid+"','"+projectcode+"','"+projectname+"')\"><td>"+(index)+"</td><td>"+jgtime+"</td><td>"+projectname+"</td><td>"+bidamount+"</td></tr>";
+        }
+        return html;
+    }
+    function hasNoData(){
+        $(".nullcontent").removeClass("hidden");
+        $("#wrapper tbody tr").remove();
+        //window.top.$(".resbm").addClass("hidden");
+        $("#set_search").addClass("hidden");
+        $("#wrapper").addClass("hidden");
+        $(".tip_m").addClass("hidden");
+    }
+    function appendListHtml(html,pageNum){
+        //缓存数据
+        if(sessionStorage){
+            listCache += html;
+            pageNumCache = pageNum;
+        }
+        // 插入数据到页面,放到最后面
+        var htmlObj = $(html);
+        htmlObj.on("click", function(event){
+            putToSessionStorage();
+        });
+        $('#wrapper tbody').append(htmlObj);
+    }
+    function initDroploadNoMoreData(){
+        setTimeout(function(){
+            $('#wrapper').dropload({
+                scrollArea : window,
+                loadDownFn : function(me){
+                    noMoreData(me);
+                }
+            });
+        },0);
+    }
+    //put to sessionstorage
+	function  putToSessionStorage() {
+        if(sessionStorage){
+            sessionStorage.wxsearchScrollTop = scrollTop;
+            sessionStorage.wxsearchListCache = listCache;
+            sessionStorage.wxsearchPageNumCache = pageNumCache;
+            sessionStorage.wxsearchNoMoreCache = noMoreCache;
+            sessionStorage.wxsearchMoneyFromCache = reqParam["money_from"];
+            sessionStorage.wxsearchMoneyToCache = reqParam["money_to"];
+            sessionStorage.wxsearchScopeCache = reqParam["scope"];
+        }
+    }
 </script>
 </html>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
src/jfw/modules/push/src/config.json


+ 47 - 30
src/jfw/modules/push/src/qfw/push/dopush/dopush.go

@@ -4,6 +4,7 @@ import (
 	"container/list"
 	"fmt"
 	"log"
+	"os"
 	"qfw/push"
 	"qfw/util"
 	"qfw/util/mail"
@@ -12,7 +13,6 @@ import (
 	"regexp"
 	"strconv"
 	"strings"
-	"sync"
 	"time"
 )
 
@@ -22,10 +22,7 @@ var re *regexp.Regexp
 var MAXLen = 200
 var TitleLen, ContentLen, GroupLen int
 var WxTitle, WxContent, WxGroup string
-var Mailpos = 0
-var MailposLock = &sync.Mutex{}
-var MailMap = []*mail.MailAuth{}
-var MailFrom = "剑鱼招标订阅"
+var GmailMap *mail.GmailAuth
 var Domain = ""
 var (
 	mail_html    = ""
@@ -33,18 +30,6 @@ var (
 	mail_title   = ""
 )
 
-//获取邮箱配置
-func GetSMail() (auth *mail.MailAuth) {
-	defer util.Catch()
-	MailposLock.Lock()
-	defer MailposLock.Unlock()
-	Mailpos %= len(MailMap)
-	auth = MailMap[Mailpos]
-	Mailpos++
-	time.Sleep(80 * time.Millisecond)
-	return
-}
-
 //初始化推送信息
 func Inits() {
 	//推送标题
@@ -68,11 +53,12 @@ func Inits() {
 	//初始化服务邮箱
 	arrMap := util.ObjArrToMapArr(push.PushConfig["mails"].([]interface{}))
 	for i := 0; i < len(arrMap); i++ {
-		MailMap = append(MailMap,
-			&mail.MailAuth{util.ObjToString(arrMap[i]["addr"]),
-				util.IntAll(arrMap[i]["port"]),
-				util.ObjToString(arrMap[i]["user"]),
-				util.ObjToString(arrMap[i]["pwd"])})
+		GmailMap = &mail.GmailAuth{
+			SmtpHost: util.ObjToString(arrMap[i]["addr"]),
+			SmtpPort: util.IntAll(arrMap[i]["port"]),
+			User:     util.ObjToString(arrMap[i]["user"]),
+			Pwd:      util.ObjToString(arrMap[i]["pwd"]),
+		}
 	}
 	Domain = push.PushConfig["bidViewDomain"].(string)
 }
@@ -109,6 +95,8 @@ func DealSend(k *push.MemberInterest, v *list.List, now time.Time, MaxPushSize i
 	publishTitle := map[string]bool{}
 	FilterData.Start(k.Openid)
 	defer FilterData.End()
+	//邮件附件
+	var fmdatas = []map[string]interface{}{}
 	for ks := v.Front(); ks != nil; ks = ks.Next() {
 		k2 := *(ks.Value.(*map[string]interface{}))
 		title := strings.Replace(k2["title"].(string), "\n", "", -1)
@@ -140,6 +128,21 @@ func DealSend(k *push.MemberInterest, v *list.List, now time.Time, MaxPushSize i
 						types = "其他"
 					}
 				}
+				classIndustry := "industry"
+				industry := util.ObjToString(k2["industry"])
+				if industry != "" {
+					industry = strings.TrimLeft(industry, ",")
+					industry = strings.TrimRight(industry, ",")
+					inds := strings.Split(industry, ",")
+					if len(inds) > 0 {
+						inds_ins := strings.Split(inds[0], "_")
+						if len(inds_ins) > 1 {
+							industry = inds_ins[len(inds_ins)-1]
+						} else {
+							industry = inds_ins[0]
+						}
+					}
+				}
 				dates := util.LongToDate(k2["publishtime"], false)
 				//标题替换
 				otitle := util.ObjToString(k2["otitle"])
@@ -161,7 +164,7 @@ func DealSend(k *push.MemberInterest, v *list.List, now time.Time, MaxPushSize i
 						break
 					}
 				}
-				mailContent += fmt.Sprintf(mail_content, i, url, otitle, classArea, area, classType, types, dates)
+				mailContent += fmt.Sprintf(mail_content, i, url, otitle, classArea, area, classType, types, classIndustry, industry, dates)
 			}
 			//str += "<div class='tslist'><span class='xh'>" + fmt.Sprintf("%d", i) + ".</span><a class='bt' target='_blank' sid='" + _sid + "' href='" + util.ObjToString(k2["href"]) + "'>" + title + "</a></div>"
 			str += "<div class='tslist'><span class='xh'>" + fmt.Sprintf("%d", i) + ".</span><a class='bt' target='_blank' eid='" + _sid + "' href='" + util.ObjToString(k2["href"]) + "'>" + title + "</a></div>"
@@ -174,6 +177,18 @@ func DealSend(k *push.MemberInterest, v *list.List, now time.Time, MaxPushSize i
 			if k2["highlight"] != nil {
 				o_pushinfo[strconv.Itoa(i)]["highlight"] = k2["highlight"]
 			}
+			//附件数据
+			fmdata := map[string]interface{}{
+				"publishtime": k2["publishtime"],
+				"subtype":     k2["subtype"],
+				"buyer":       k2["buyer"],
+				"projectname": k2["projectname"],
+				"budget":      k2["budget"],
+				"bidopentime": k2["bidopentime"],
+				"winner":      k2["winner"],
+				"bidamount":   k2["bidamount"],
+			}
+			fmdatas = append(fmdatas, fmdata)
 			if i >= MaxPushSize {
 				//限制最大信息条数
 				break
@@ -252,22 +267,24 @@ func DealSend(k *push.MemberInterest, v *list.List, now time.Time, MaxPushSize i
 		log.Println("-----", k.Openid)
 		wid = SendWeixin(k, str, now, Tip1+WXTitle+LastTip, o_pushinfo, ratemode, infoTypeName)
 	}
-
 	//3、发送邮件
 	if bmail {
 		html := fmt.Sprintf(mail_html, strings.Replace(strings.Join(k.Interest, ";"), "+", " ", -1), mailContent)
-		go SendEmail(k.Email, html, fmt.Sprintf(mail_title, infoTypeName))
+		subject := fmt.Sprintf(mail_title, infoTypeName)
+		go SendFmail(k.Email, subject, html, fmdatas)
 		if wid == "" { //保存信息
 			SaveSendInfo(k, now, html, o_pushinfo, ratemode)
 		}
 	}
 }
 
-//推送邮件
-func SendEmail(email, str, title string) {
-	auth := GetSMail()
-	if auth != nil {
-		mail.SendMail(auth, &mail.Message{title, MailFrom, []string{email}, str})
+//推送邮件(含附件)
+func SendFmail(email, subject, html string, fmdatas []map[string]interface{}) {
+	//生成附件
+	fname := GetBidInfoXlsx(fmdatas)
+	b := mail.GSendMail(email, "", "", subject, html, fname, GmailMap)
+	if b {
+		os.Remove(fname)
 	}
 }
 

+ 3 - 1
src/jfw/modules/push/src/qfw/push/dopush/dopushes.go

@@ -16,7 +16,8 @@ import (
 )
 
 const (
-	ShowField  = `"_id","title","publishtime","toptype","subtype","type","area","href","areaval","infoformat"`
+	ShowField = `"_id","title","publishtime","toptype","subtype","type","area","href","areaval","infoformat",` +
+		`"projectname","buyer","winner","agency","budget","bidamount","bidopentime","industry"`
 	FindField  = `"title"`
 	SortQuery  = `{"publishtime":"desc"}`
 	DB         = "bidding"
@@ -137,6 +138,7 @@ func PushInfoByEs(MaxPushSize int, Config *map[string]interface{}, i_ratemode in
 	} else {
 		q["o_jy.i_ratemode"] = i_ratemode
 	}
+	//q["s_m_openid"] = "oHwE_wI94DGaSDks9ky5Yj8qqSx8"
 	query := session.DB("qfw").C("user").Find(&q).Select(&map[string]interface{}{
 		"_id":        1,
 		"o_jy":       1,

+ 115 - 0
src/jfw/modules/push/src/qfw/push/dopush/excel.go

@@ -0,0 +1,115 @@
+package dopush
+
+import (
+	"fmt"
+	"math/rand"
+	qu "qfw/util"
+	"time"
+
+	"github.com/xuri/excelize"
+)
+
+var fMailTitle = map[string]map[string]interface{}{
+	"A1": {"title": "发布时间", "width": 3},
+	"B1": {"title": "公告类型", "width": 3},
+	"C1": {"title": "招标单位", "width": 5},
+	"D1": {"title": "项目名称", "width": 5},
+	"E1": {"title": "预算(万元)", "width": 3},
+	"F1": {"title": "开标时间", "width": 4},
+	"G1": {"title": "中标单位", "width": 5},
+	"H1": {"title": "中标金额(万元)", "width": 3},
+}
+var kv = map[string]string{
+	"publishtime": "A",
+	"subtype":     "B",
+	"buyer":       "C",
+	"projectname": "D",
+	"budget":      "E",
+	"bidopentime": "F",
+	"winner":      "G",
+	"bidamount":   "H",
+}
+var font = `"font":{"color":"#FFFFFF"}`
+var fill = `"fill":{"type":"gradient","color":["#4F81BD","#4F81BD"],"shading":6}`
+var border = `"border":[{"type":"left","color":"000000","style":1},{"type":"top","color":"000000","style":1},{"type":"bottom","color":"000000","style":1},{"type":"right","color":"000000","style":1}]`
+var alignment = `"alignment":{"horizontal":"center","vertical":"center","wrap_text":true}`
+var alignmentleft = `"alignment":{"horizontal":"left","vertical":"center","wrap_text":true}`
+var alignmentright = `"alignment":{"horizontal":"right","vertical":"center","wrap_text":true}`
+var sheet = "Sheet1"
+var sheetName = "剑鱼推送"
+
+func GetBidInfoXlsx(data []map[string]interface{}) string {
+	xlsx := excelize.NewFile()
+	xlsx.NewSheet(2, "Sheet2")
+	var style, styleleft, styleright int
+	style, _ = xlsx.NewStyle(`{` + font + `,` + fill + `,` + alignment + `,` + border + `}`)
+	for k, v := range fMailTitle {
+		title := v["title"].(string)
+		width := float64(v["width"].(int) * 5)
+		xlsx.SetCellStr(sheet, k, title)
+		xlsx.SetColWidth(sheet, k[0:1], k[0:1], width)
+		xlsx.SetRowHeight(sheet, 0, 25)
+		xlsx.SetCellStyle(sheet, k, k, style)
+	}
+	//信息
+	style, _ = xlsx.NewStyle(`{` + alignment + `,` + border + `}`)
+	styleleft, _ = xlsx.NewStyle(`{` + alignmentleft + `,` + border + `}`)
+	styleright, _ = xlsx.NewStyle(`{` + alignmentright + `,` + border + `}`)
+	for k, v := range data {
+		pt := v["publishtime"]
+		publishtime := qu.FormatDateWithObj(&pt, qu.Date_Short_Layout)
+		key := kv["publishtime"] + fmt.Sprint(k+2)
+		xlsx.SetCellValue(sheet, key, publishtime)
+		xlsx.SetCellStyle(sheet, key, key, style)
+
+		key = kv["subtype"] + fmt.Sprint(k+2)
+		xlsx.SetCellValue(sheet, key, v["subtype"])
+		xlsx.SetCellStyle(sheet, key, key, style)
+
+		key = kv["buyer"] + fmt.Sprint(k+2)
+		xlsx.SetCellValue(sheet, key, v["buyer"])
+		xlsx.SetCellStyle(sheet, key, key, styleleft)
+
+		key = kv["projectname"] + fmt.Sprint(k+2)
+		xlsx.SetCellValue(sheet, key, v["projectname"])
+		xlsx.SetCellStyle(sheet, key, key, styleleft)
+
+		key = kv["budget"] + fmt.Sprint(k+2)
+		budget := qu.Float64All(v["budget"]) / float64(10000)
+		if budget != 0 {
+			xlsx.SetCellValue(sheet, key, budget)
+		} else {
+			xlsx.SetCellValue(sheet, key, "")
+		}
+		xlsx.SetCellStyle(sheet, key, key, styleright)
+
+		bpt := v["bidopentime"]
+		bidopentime := qu.FormatDateWithObj(&bpt, "2006-01-02 15:04")
+		key = kv["bidopentime"] + fmt.Sprint(k+2)
+		xlsx.SetCellValue(sheet, key, bidopentime)
+		xlsx.SetCellStyle(sheet, key, key, style)
+
+		key = kv["winner"] + fmt.Sprint(k+2)
+		xlsx.SetCellValue(sheet, key, v["winner"])
+		xlsx.SetCellStyle(sheet, key, key, styleleft)
+
+		key = kv["bidamount"] + fmt.Sprint(k+2)
+		bidamount := qu.Float64All(v["bidamount"]) / float64(10000)
+		if bidamount != 0 {
+			xlsx.SetCellValue(sheet, key, bidamount)
+		} else {
+			xlsx.SetCellValue(sheet, key, "")
+		}
+		xlsx.SetCellStyle(sheet, key, key, styleright)
+	}
+	xlsx.SetSheetName(sheet, sheetName)
+	xlsx.DeleteSheet("Sheet2")
+	fname := time.Now().Format("20060102150405")
+	fname = "./xlsx/" + fname + fmt.Sprint(rand.Intn(10000)) + ".xlsx"
+	err := xlsx.SaveAs(fname)
+	if err != nil {
+		return ""
+	} else {
+		return fname
+	}
+}

+ 1 - 0
src/jfw/modules/push/src/xlsx/readme.txt

@@ -0,0 +1 @@
+excel数据导出临时目录

+ 16 - 0
src/jfw/modules/pushent/src/config.json

@@ -0,0 +1,16 @@
+{
+    "durationMinutes": "3",
+    "elasticPoolSize": 30,
+    "elasticsearch": "http://192.168.3.18:9800",
+    "lastid": "58579a5a012a9abbe627de52",
+    "mongodbName": "qfw",
+    "mongodbPoolSize": "20",
+    "mongodbServers": "192.168.3.18:27080",
+    "redisServers": "sso=192.168.3.14:1379,other=192.168.3.14:1379,push=192.168.3.14:3379", 
+    "rpcPort": "8759",
+    "viewDomain": "192.168.3.78",
+    "weixinRpcServer": "123.56.103.12:8202",
+    "wxcontent": "剑鱼推送",
+    "wxgroup": "关注企业",
+    "wxtitle": "您关注的企业《%s》有新的公告信息!"
+}

+ 11 - 0
src/jfw/modules/pushent/src/config/config.go

@@ -0,0 +1,11 @@
+package config
+
+import (
+	"qfw/util"
+)
+
+var Sysconfig map[string]interface{}
+
+func init() {
+	util.ReadConfig(&Sysconfig)
+}

+ 71 - 0
src/jfw/modules/pushent/src/filterdata/filterdata.go

@@ -0,0 +1,71 @@
+package filterdata
+
+import (
+	"encoding/json"
+	"log"
+	"qfw/util/redis"
+)
+
+var FilterData *filterDataEntity
+
+type filterDataEntity struct {
+	Array  []string
+	OpenId string
+}
+
+func init() {
+	FilterData = &filterDataEntity{
+		Array: []string{},
+	}
+}
+
+//获取数据
+func (fde *filterDataEntity) Start(openid string) {
+	if openid == "" {
+		return
+	}
+	fde.OpenId = openid
+	data := redis.Get("push", "push_ent_"+openid)
+	if data == nil {
+		return
+	}
+	b, err := json.Marshal(data)
+	if err != nil {
+		log.Println("从redis中取出的数据转成byte数组出错!")
+		return
+	}
+	var array []string
+	if json.Unmarshal(b, &array) != nil {
+		log.Println("byte数组转成string数组出错!")
+		return
+	}
+	fde.Array = array
+}
+
+//判断数据是否存在
+func (fde *filterDataEntity) IsExists(_id string) bool {
+	if _id == "" {
+		return false
+	}
+	for _, v := range fde.Array {
+		if _id == v {
+			return true
+		}
+	}
+	//log.Println(fde.Array)
+	fde.Array = append(fde.Array, _id)
+	return false
+}
+
+//添加数据
+func (fde *filterDataEntity) End(flag int) {
+	if fde.OpenId != "" && flag == 0 {
+		if len(fde.Array) > 0 {
+			redis.Put("push", "push_ent_"+fde.OpenId, fde.Array, -1)
+		} else {
+			redis.Del("push", "push_ent_"+fde.OpenId)
+		}
+	}
+	fde.Array = []string{}
+	fde.OpenId = ""
+}

+ 14 - 0
src/jfw/modules/pushent/src/followpush/config.json

@@ -0,0 +1,14 @@
+{
+    "durationMinutes": "1",
+    "lastid": "168418e062684db687cb0624",
+    "mongodbName": "qfw",
+    "mongodbPoolSize": "20",
+    "mongodbServers": "192.168.3.18:27080",
+    "redisServers": "sso=192.168.3.14:1379,other=192.168.3.14:1379,push=192.168.3.14:3379",
+    "rpcPort": "8759",
+    "viewDomain": "192.168.3.78",
+    "weixinRpcServer": "127.0.0.1:80",
+    "wxcontent": "剑鱼推送",
+    "wxgroup": "关注项目",
+    "wxtitle": "您关注的项目《%s》有新的公告信息!"
+}

+ 138 - 0
src/jfw/modules/pushent/src/followpush/datastruct.go

@@ -0,0 +1,138 @@
+package followpush
+
+import (
+	"qfw/util"
+	"tools"
+)
+
+//构建推送时需要排序的map
+type Arr []*map[string]interface{}
+
+func (a *Arr) Len() int {
+	return len(*a)
+}
+func (a *Arr) Less(i, j int) bool {
+	return util.Int64All((*(*a)[i])["publishtime"]) < util.Int64All((*(*a)[j])["publishtime"])
+}
+func (a *Arr) Swap(i, j int) {
+	tmp := (*a)[i]
+	(*a)[i] = (*a)[j]
+	(*a)[j] = tmp
+}
+
+type DFA struct {
+	Link map[string]interface{}
+}
+
+func (d *DFA) AddWord(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"] = false
+				(*nowMap)[kc] = &newMap
+				nowMap = &newMap
+			}
+			if i == len(key)-1 {
+				(*nowMap)["YN"] = true
+				(*nowMap)["K"] = key
+			}
+		}
+	}
+}
+
+//适合一次查找
+func (d *DFA) CheckSensitiveWord(src string) string {
+	pos := 0
+	nowMap := &d.Link
+	res := ""
+	for i := 0; i < len(src); i++ {
+		word := src[i : i+1]
+		nowMap, _ = (*nowMap)[word].(*map[string]interface{})
+		if nowMap != nil { // 存在,则判断是否为最后一个
+			if pos == 0 {
+				pos = i
+			}
+			if (*nowMap)["YN"].(bool) { // 如果为最后一个匹配规则,结束循环,返回匹配标识数
+				res = util.ObjToString((*nowMap)["K"])
+				pos = 0
+				break
+			}
+		} else {
+			nowMap = &d.Link
+			if pos > 0 {
+				i = pos
+				pos = 0
+			}
+		}
+	}
+	return res
+}
+
+var titleSensitiveDFA DFA
+
+//2.用户关注标题敏感词构建
+func CreateTSM() {
+	titleSensitiveDFA = DFA{}
+	keys := []string{}
+	for k, _ := range Setting {
+		keys = append(keys, k)
+	}
+	titleSensitiveDFA.AddWord(keys...)
+}
+
+//1.用户关注普通map构建
+func UpdateUserSetting() bool {
+	//绝对相等才可以
+	//包括项目名称、项目编号
+	res := false
+	defer util.Catch()
+	//【项目编号|项目名称】*【openid】【title|项目名称】
+	////【项目编号|项目名称】[]*tmp
+	//pcode = &Setting{map[string]*map[string]string{}}
+	Setting = map[string]*[]*map[string]interface{}{}
+	sess := tools.MQFW.GetMgoConn()
+	defer tools.MQFW.DestoryMongoConn(sess)
+	cur := sess.DB(tools.MQFW.DbName).C(FOLLOW_COLLECTION).Find(&map[string]interface{}{
+		"s_openid": map[string]interface{}{
+			"$exists": true,
+		},
+		"i_ispush": map[string]interface{}{
+			"$ne": 0,
+		},
+	}).Select(map[string]interface{}{
+		"s_projectcode": 1,
+		"s_projectname": 1,
+		"s_title":       1,
+		"s_openid":      1,
+		"_id":           1,
+	}).Iter()
+	j := 0
+	for tmp := make(map[string]interface{}); cur.Next(tmp); j++ {
+		defer util.Catch()
+		mtmp := tmp
+		for _, v := range []string{"s_projectcode", "s_projectname"} {
+			pc := util.ObjToString(mtmp[v])
+			if len(pc) > 3 {
+				map1 := Setting[pc]
+				if map1 == nil {
+					map1 = &([]*map[string]interface{}{})
+					Setting[pc] = map1
+				}
+				*map1 = append(*map1, &mtmp)
+			}
+		}
+		tmp = make(map[string]interface{})
+	}
+	res = true
+	//构建敏感词
+	CreateTSM()
+	return res
+}

+ 44 - 0
src/jfw/modules/pushent/src/followpush/followpush.go

@@ -0,0 +1,44 @@
+package followpush
+
+import (
+	. "config"
+	"log"
+	"qfw/util"
+	"sync"
+)
+
+const (
+	FOLLOW_COLLECTION = "jylab_followent"
+	FOLLOW_PUSH_LOG   = "jylab_followent_pushlog"
+)
+
+//每次推前构建用户关注内存结构 项目名称和项目代码对应 用户组
+var Setting map[string]*[]*map[string]interface{}
+var WxTitle, WxContent, WxGroup, ViewDomain string
+var Lock = sync.Mutex{}
+
+//加密串
+var se util.SimpleEncrypt
+
+//推送不能大于200个字
+var LastLen int
+
+func init() {
+	se = util.SimpleEncrypt{Key: "topnet"}
+	WxTitle = util.ObjToString(Sysconfig["wxtitle"])
+	WxContent = util.ObjToString(Sysconfig["wxcontent"])
+	WxGroup = util.ObjToString(Sysconfig["wxgroup"])
+	ViewDomain = util.ObjToString(Sysconfig["viewDomain"])
+	LastLen = 200 - len([]rune(WxContent)) - len([]rune(WxGroup))
+}
+
+//开始查询最新的数据,推给用户
+var muser map[*map[string]interface{}]*[]*map[string]interface{}
+
+func Job() {
+	Lock.Lock()
+	defer Lock.Unlock()
+	lastid := util.ObjToString(Sysconfig["lastid"])
+	log.Println("start push followent info..", lastid)
+	pushByEs(lastid)
+}

+ 18 - 0
src/jfw/modules/pushent/src/followpush/followpush_test.go

@@ -0,0 +1,18 @@
+package followpush
+
+import (
+	"log"
+	"testing"
+	"time"
+)
+
+func Test_updateSetting(t *testing.T) {
+	UpdateUserSetting()
+	for k, v := range Setting {
+		for _, vv := range *v {
+			log.Println(k, (*vv)["s_openid"])
+		}
+	}
+	Job()
+	time.Sleep(100 * time.Second)
+}

+ 233 - 0
src/jfw/modules/pushent/src/followpush/push.go

@@ -0,0 +1,233 @@
+package followpush
+
+import (
+	. "config"
+	"filterdata"
+	"fmt"
+	"log"
+	"qfw/util"
+	"qfw/util/elastic"
+	qrpc "qfw/util/rpc"
+	"sort"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+	"tools"
+	"weixinrpc"
+
+	"gopkg.in/mgo.v2/bson"
+)
+
+var (
+	MaxId   = `{"query":{"filtered":{"filter":{"bool":{"must":{"range":{"id":{"gt":"%s"}}}}}}},"_source":["_id","comeintime"],"sort":{"id":"desc"},"from":0,"size":1}`
+	Query   = `{ "query": { "bool": { "must": [%s], "should": [%s], "minimum_should_match": 1 } }, "_source": [ "_id","title","publishtime","area","type","toptype","subtype","projectname","projectcode","href","infoformat" ], "sort": [ { "publishtime": "desc" } ], "from": 0, "size": 50 }`
+	IDRange = `{"range":{"id":{"gt":"%s","lte":"%s"}}}`
+	TERM    = `{"term":{"%s":"%s"}}`
+	DB      = "bidding"
+)
+
+//开始推送
+func pushByEs(_id string) bool {
+	defer util.Catch()
+	resId := elastic.Get(DB, DB, fmt.Sprintf(MaxId, _id))
+	lastid := ""
+	log.Println("push-lastid", _id, resId)
+	if resId != nil && *resId != nil && len(*resId) == 1 {
+		lastid = util.ObjToString((*resId)[0]["_id"])
+	} else {
+		log.Println("未查找到数据...", fmt.Sprintf(MaxId, _id))
+		return false
+	}
+	idrange := fmt.Sprintf(IDRange, _id, lastid)
+	sess := tools.MQFW.GetMgoConn()
+	defer tools.MQFW.DestoryMongoConn(sess)
+	cur := sess.DB(tools.MQFW.DbName).C(FOLLOW_COLLECTION).Find(&map[string]interface{}{
+		"s_openid": map[string]interface{}{
+			"$exists": true,
+		},
+		"i_ispush": map[string]interface{}{
+			"$ne": 0,
+		},
+	}).Select(map[string]interface{}{
+		"s_entname": 1,
+		"s_userid":  1,
+		"s_openid":  1,
+		"_id":       1,
+	}).Iter()
+	j := 0
+	for tmp := make(map[string]interface{}); cur.Next(tmp); j++ {
+		util.Try(func() {
+			entname := util.ObjToString(tmp["s_entname"])
+			openid := util.ObjToString(tmp["s_openid"])
+			go FindData(tmp["_id"], util.ObjToString(tmp["s_title"]), entname, openid, idrange, true, true)
+		}, func(e interface{}) {
+			log.Println(e)
+		})
+		tmp = make(map[string]interface{})
+	}
+	log.Println("push-over,user-count:", j)
+	Sysconfig["lastid"] = lastid
+	return true
+}
+
+var findpool = make(chan bool, 10)
+var Pushlock = sync.Mutex{}
+
+//不保存不推送-只保存不推送-保存推送
+func FindData(fid interface{}, title, sname, openid, idrange string, bsave, bpush bool) *Arr {
+	findpool <- true
+	defer func() {
+		<-findpool
+	}()
+	q1 := []string{}
+	if sname != "" {
+		q1 = append(q1, fmt.Sprintf(TERM, "winner", elastic.ReplaceYH(sname)))
+		//q1 = append(q1, fmt.Sprintf(TERM, "subtype", "中标"))
+	}
+	var pushArray = &Arr{}
+	if len(q1) > 0 {
+		res := elastic.Get(DB, DB, fmt.Sprintf(Query, idrange, strings.Join(q1, ",")))
+		if res != nil && *res != nil && len(*res) > 0 {
+			//顺序处理,后序会有性能瓶颈,filterdata
+			util.Try(func() {
+				if !bsave {
+					for _, info := range *res {
+						tmp := map[string]interface{}{}
+						sid := util.BsonIdToSId(info["_id"])
+						if title != sid { //title在此处传的是关注信息id
+							tmp["s_id"] = sid
+							tmp["s_eid"] = util.EncodeArticleId2ByCheck(sid)
+							tmp["s_title"] = info["title"]
+							tmp["l_publishtime"] = info["publishtime"]
+							tmp["s_province"] = info["area"]
+							tmp["s_type"] = util.ObjToString(info["type"])
+							tmp["s_toptype"] = util.ObjToString(info["toptype"])
+							tmp["s_subtype"] = util.ObjToString(info["subtype"])
+							tmp["s_entname"] = util.ObjToString(info["winner"])
+							tmp["s_url"] = util.ObjToString(info["href"])
+							*pushArray = append(*pushArray, &tmp)
+						}
+					}
+				} else {
+					Pushlock.Lock()
+					defer Pushlock.Unlock()
+					filterdata.FilterData.Start(openid)
+					defer filterdata.FilterData.End(0)
+					//1.组织信息、
+					//a_relationinfo s_id s_title s_projectname  s_projectcode  l_publishtime s_url
+					var ids []string
+					for _, info := range *res {
+						tmp := map[string]interface{}{}
+						sid := util.BsonIdToSId(info["_id"])
+						tmp["s_id"] = sid
+						tmp["s_eid"] = util.EncodeArticleId2ByCheck(sid)
+						tmp["s_title"] = info["title"]
+						tmp["l_publishtime"] = info["publishtime"]
+						tmp["s_province"] = info["area"]
+						tmp["s_type"] = util.ObjToString(info["type"])
+						tmp["s_toptype"] = util.ObjToString(info["toptype"])
+						tmp["s_subtype"] = util.ObjToString(info["subtype"])
+						tmp["s_entname"] = util.ObjToString(info["winner"])
+						tmp["s_url"] = util.ObjToString(info["href"])
+						if filterdata.FilterData.IsExists(sid) {
+							continue
+						}
+						ids = append(ids, sid)
+						*pushArray = append(*pushArray, &tmp)
+					}
+					go func() {
+						//2.推送、
+						if pushArray.Len() > 0 {
+							sort.Sort(pushArray)
+							//更新用户关注的a_relationinfo、保存到推送记录表、推送给用户
+							//log.Println(fid, ids)
+							if fid != nil && tools.MQFW.Update(FOLLOW_COLLECTION, &bson.M{
+								"_id": fid,
+							}, &bson.M{
+								"$set": bson.M{
+									"l_lastpushtime": (*((*pushArray)[0]))["l_publishtime"],
+									"a_lastpushids":  ids,
+								},
+								/*
+									"$pushAll": bson.M{
+										"a_relationinfo": pushArray,
+									},
+								*/
+							}, false, false) && bpush {
+								//进入推送逻辑
+								tit := sname
+								if tit == "" {
+									tit = title
+								}
+								if tit != "" {
+									//go func() {
+									followid := util.BsonIdToSId(fid)
+									infoid := tools.MQFW.Save(FOLLOW_PUSH_LOG, &bson.M{
+										"s_openid":       openid,
+										"a_relationinfo": pushArray,
+										"l_date":         time.Now().Unix(),
+										"s_title":        title,
+										"s_entname":      sname,
+										"s_followid":     followid,
+									})
+									if infoid != "" {
+										lastTime := util.Int64All((*(*pushArray)[0])["l_publishtime"])
+										pushtt := fmt.Sprintf(WxTitle, tit)
+										Tip1 := ""
+										minute := time.Now().Unix() - lastTime
+										if minute > -1 && minute < 61 {
+											Tip1 = fmt.Sprintf("%d秒前发布的:\n", minute)
+										} else {
+											minute = minute / 60
+											if minute < 121 {
+												if minute < 1 {
+													minute = 1
+												}
+												Tip1 = fmt.Sprintf("%d分钟前发布的:\n", minute)
+											}
+										}
+										LastTip := ""
+										pushnum := len(*pushArray)
+										if pushnum > 1 {
+											LastTip = fmt.Sprintf("...(共%d条)", pushnum)
+										}
+										LastLen = LastLen - len([]rune(pushtt)) - len([]rune(Tip1))
+										Remark := ""
+										bshow := false
+										for n := 1; n < pushnum+1; n++ {
+											Remark += fmt.Sprintf("%d %s\n", n, (*(*pushArray)[n-1])["s_title"])
+											if len([]rune(Remark)) > LastLen {
+												if n == pushnum {
+													bshow = true
+												}
+												break
+											}
+										}
+										if bshow {
+											LastTip = ""
+										}
+										go log.Println("push", openid, pushnum, tit)
+										weixinrpc.SendWinXin(&qrpc.NotifyMsg{
+											Openid:  openid,
+											Title:   fmt.Sprintf(WxTitle, tit),
+											Remark:  Tip1 + Remark + LastTip,
+											Detail:  WxContent,
+											Service: WxGroup,
+											Url:     ViewDomain + "/front/sess/" + se.EncodeString(openid+",uid,"+strconv.Itoa(int(time.Now().Unix()))+",wxpushfollowlist") + "__" + infoid + "__" + followid,
+										})
+									}
+									//}()
+								}
+								//推送结束
+							}
+						}
+					}()
+				}
+			}, func(e interface{}) {
+				log.Println("给用户推送关注信息时出错:", e)
+			})
+		}
+	}
+	return pushArray
+}

+ 46 - 0
src/jfw/modules/pushent/src/main.go

@@ -0,0 +1,46 @@
+package main
+
+import (
+	"config"
+	"followpush"
+	"log"
+	"net"
+	"net/http"
+	_ "net/http/pprof"
+	"net/rpc"
+	"qfw/util"
+	"qfw/util/elastic"
+	"qfw/util/redis"
+	"rpcpush"
+	"time"
+	"timetask"
+)
+
+func init() {
+	redis.InitRedisBySize(config.Sysconfig["redisServers"].(string), 200, 30, 300)
+	elastic.InitElasticSize(config.Sysconfig["elasticsearch"].(string), util.IntAllDef(config.Sysconfig["elasticPoolSize"], 30))
+}
+
+func main() {
+	time.Sleep(2 * time.Second)
+	log.Println(config.Sysconfig["rpcPort"], config.Sysconfig)
+	go runJob()
+	go timetask.ClearRedis()
+	crpc := new(rpcpush.FollowPushRpc)
+	rpc.Register(crpc)
+	rpc.HandleHTTP()
+	port, _ := config.Sysconfig["rpcPort"].(string)
+	l, _ := net.Listen("tcp", ":"+port)
+	go http.Serve(l, nil)
+	log.Println("启动关注推送系统", port)
+	b := make(chan bool)
+	<-b
+}
+
+func runJob() {
+	util.Try(func() {
+		followpush.Job()
+		util.WriteSysConfig(config.Sysconfig)
+	}, func(e interface{}) {})
+	time.AfterFunc(time.Duration(util.IntAll(config.Sysconfig["durationMinutes"]))*time.Minute, runJob)
+}

+ 27 - 0
src/jfw/modules/pushent/src/main_test.go

@@ -0,0 +1,27 @@
+package main
+
+import (
+	"log"
+	"strings"
+	"testing"
+
+	"gopkg.in/mgo.v2/bson"
+)
+
+func Test_main(t *testing.T) {
+	tmp := make(map[string]interface{})
+	tmp["ss"] = "ssss"
+	ss := tmp
+	m1 := map[string]*map[string]interface{}{}
+	m1["aa"] = &ss
+	tmp = make(map[string]interface{})
+	log.Println(m1["aa"])
+
+	log.Println(bson.ObjectIdHex("100000ee36b82b12a0000001").Hex())
+
+}
+
+func Test_1(t *testing.T) {
+	log.Println(strings.Contains("aassdf", "0"))
+
+}

+ 33 - 0
src/jfw/modules/pushent/src/rpcpush/findData.go

@@ -0,0 +1,33 @@
+package rpcpush
+
+import (
+	"filterdata"
+	"followpush"
+	"log"
+
+	"gopkg.in/mgo.v2/bson"
+)
+
+func RpcFindFollow(entname, followid, thisid, openid string, flag int) *followpush.Arr {
+	bsave := false
+	var ff interface{}
+	if len(followid) > 5 {
+		bsave = true
+		ff = bson.ObjectIdHex(followid)
+	}
+	if thisid != "" && bsave {
+		log.Println(thisid, "--add follow")
+		go func() {
+			followpush.Pushlock.Lock()
+			defer followpush.Pushlock.Unlock()
+			filterdata.FilterData.Start(openid)
+			defer filterdata.FilterData.End(0)
+			filterdata.FilterData.IsExists(thisid)
+		}()
+	}
+	res := followpush.FindData(ff, thisid, entname, openid, "", bsave, false)
+	if flag == 1 {
+		return res
+	}
+	return nil
+}

+ 21 - 0
src/jfw/modules/pushent/src/rpcpush/rpcpush.go

@@ -0,0 +1,21 @@
+package rpcpush
+
+import (
+	"encoding/json"
+	"qfw/util"
+	qrpc "qfw/util/rpc"
+)
+
+type FollowPushRpc struct {
+}
+
+//RPC调用结果预览
+func (p *FollowPushRpc) FollowPushEnt(data *qrpc.FollowPushEnt, Reply *[]byte) error {
+	util.Try(func() {
+		res := RpcFindFollow(data.Entname, data.FollowId, data.InfoId, data.OpenId, data.Flag)
+		if res != nil {
+			*Reply, _ = json.Marshal([]*map[string]interface{}(*res))
+		}
+	}, func(e interface{}) {})
+	return nil
+}

+ 23 - 0
src/jfw/modules/pushent/src/timetask/clearredis.go

@@ -0,0 +1,23 @@
+package timetask
+
+import (
+	"log"
+	"qfw/util/redis"
+	"time"
+)
+
+//每天凌晨清redis
+func ClearRedis() {
+	for {
+		time.Sleep(30 * time.Second)
+		now := time.Now()
+		//每天凌晨
+		next := time.Date(now.Year(), now.Month(), now.Day()+1, 0, 0, 0, 0, now.Location())
+		timer := time.NewTimer(next.Sub(now)) //自动删除
+		select {
+		case <-timer.C:
+			log.Println("每天凌晨清redis数据。")
+			redis.DelByCodePattern("push", "push_*")
+		}
+	}
+}

+ 18 - 0
src/jfw/modules/pushent/src/tools/mongo.go

@@ -0,0 +1,18 @@
+package tools
+
+import (
+	. "config"
+	"qfw/util"
+	"qfw/util/mongodb"
+)
+
+var MQFW mongodb.MongodbSim
+
+func init() {
+	MQFW = mongodb.MongodbSim{
+		MongodbAddr: Sysconfig["mongodbServers"].(string),
+		Size:        util.IntAll(Sysconfig["mongodbPoolSize"]),
+		DbName:      Sysconfig["mongodbName"].(string),
+	}
+	MQFW.InitPool()
+}

+ 1 - 0
src/jfw/modules/pushent/src/tools/tools.go

@@ -0,0 +1 @@
+package tools

+ 76 - 0
src/jfw/modules/pushent/src/weixinrpc/weixinrpc.go

@@ -0,0 +1,76 @@
+package weixinrpc
+
+import (
+	"config"
+	"log"
+	"net/rpc"
+	"qfw/util"
+	qrpc "qfw/util/rpc"
+	"strings"
+	"time"
+	"tools"
+)
+
+var wxpool chan bool = make(chan bool, 30)
+
+//微信远程调用,实现模板发送消息
+func SendWinXin(p *qrpc.NotifyMsg) {
+	wxpool <- true
+	defer func() {
+		<-wxpool
+	}()
+	util.Try(func() {
+		client, err := rpc.DialHTTP("tcp", config.Sysconfig["weixinRpcServer"].(string))
+		defer client.Close()
+		if err != nil {
+			log.Println(err.Error())
+			return
+		}
+		var repl qrpc.RpcResult
+		err = client.Call("WeiXinRpc.SendPushMsg", p, &repl)
+		if err != nil {
+			log.Println(err.Error())
+		}
+		res := string(repl)
+		if strings.Contains(res, "[46004]") || strings.Contains(res, "[65302]") || strings.Contains(res, "[43004]") || strings.Contains(res, "[40003]") {
+			updateIsPush(p.Openid, 0)
+		}
+	}, func(e interface{}) {})
+	time.Sleep(10 * time.Millisecond)
+}
+
+//微信远程调用,实现模板发送消息
+func FollowPush(p *qrpc.NotifyMsg) {
+	wxpool <- true
+	defer func() {
+		<-wxpool
+	}()
+	util.Try(func() {
+		client, err := rpc.DialHTTP("tcp", config.Sysconfig["weixinRpcServer"].(string))
+		defer client.Close()
+		if err != nil {
+			log.Println(err.Error())
+			return
+		}
+		var repl qrpc.RpcResult
+		err = client.Call("WeiXinRpc.SendPushMsg", p, &repl)
+		if err != nil {
+			log.Println(err.Error())
+		}
+	}, func(e interface{}) {})
+	time.Sleep(10 * time.Millisecond)
+}
+
+//修改是否推送的状态
+func updateIsPush(openid string, status int) {
+	tools.MQFW.Update("user", map[string]interface{}{"s_m_openid": openid}, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"i_ispush": status,
+		},
+	}, false, false)
+	tools.MQFW.Update("jylab_followent", map[string]interface{}{"s_openid": openid}, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"i_ispush": status,
+		},
+	}, false, true)
+}

+ 5 - 3
src/jfw/modules/pushproject/src/followpush/push.go

@@ -155,9 +155,11 @@ func FindData(fid interface{}, title, sname, scode, openid, idrange string, bsav
 									"l_lastpushtime": (*((*pushArray)[0]))["l_publishtime"],
 									"a_lastpushids":  ids,
 								},
-								"$pushAll": bson.M{
-									"a_relationinfo": pushArray,
-								},
+								/*
+									"$pushAll": bson.M{
+										"a_relationinfo": pushArray,
+									},
+								*/
 							}, false, false) && bpush {
 								//进入推送逻辑
 								tit := sname

+ 2 - 1
src/seo.json

@@ -299,6 +299,7 @@
 		"360SEM":"360SEM",
 		"QQqun":"QQ群广告",
 		"BDwangmeng":"百度网盟",
-		"PCwailian":"PC端外链"
+		"PCwailian":"PC端外链",
+		"email":"邮箱广告"
 	}
 }

+ 4 - 4
src/web/staticres/css/dev2/biddingSearch.css

@@ -66,7 +66,7 @@
   font-size: 16px;
 }
 
-#searchInner .searchHeader .searchHeader-container .searchInput form input[type='button'] {
+#searchInner .searchHeader .searchHeader-container .searchInput form input[type='submit'] {
   float: left;
   width: 106px;
   height: 42px;
@@ -628,7 +628,7 @@
   font-size: 16px;
 }
 #searchInner .searchControl .seaTender-inner .tabContainer-2 .lucene li {
-  padding: 15px 20px 0;
+  padding: 20px 20px 0;
   overflow: hidden;
   font-size: 16px;
 }
@@ -638,14 +638,14 @@
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .liLuceneList {
-  border-bottom: 1px solid #e0e0e0;
+  border-bottom: 1px solid #EBEBEB;
   overflow: hidden;
   padding-bottom: 20px;
 width:1160px;
 }
 
 #searchInner .searchControl .seaTender-inner .tabContainer-2 .lucene li .liLuceneList {
-	padding-bottom: 15px;
+	padding-bottom: 20px;
 }
 #searchInner .searchControl .seaTender-inner .tabContainer .lucene li .luce-left {
   float: left;

+ 1 - 1
src/web/staticres/css/dev2/biddingSearch1.css

@@ -10,7 +10,7 @@
     background-color: #fff;
 	padding: 3px 5px;
 }
-.active{
+#searchInner .active{
 	background-color: #2cb7ca;
 }
 .hasNoData{

+ 4 - 4
src/web/staticres/js/biddingSearch.js

@@ -70,7 +70,10 @@ $(function() {
 
 	function superSearchToggle() {
 		var $superSearch = $(".searchInput .superSearch");
-		$superSearch.on("click", function() {
+		$superSearch.mouseover(function() {
+			$(this).toggleClass("active")
+		})
+		$superSearch.mouseout(function() {
 			$(this).toggleClass("active")
 		})
 	}
@@ -142,8 +145,6 @@ $(function() {
 			} else {
 				$induAll.addClass("active");
 			}
-			beforeSubmit();
-
 		})
 		/*全部点击*/
 		$induAll.on("click", function() {
@@ -187,7 +188,6 @@ $(function() {
 			$tabDIv = $(".tabContainer");
 
 		$tab.on("click", function() {
-			console.log(submitflag+"----)))))")
 			if(submitflag){
 				$(this).find("a").addClass("active").parent().siblings().find("a").removeClass("active");
 				$tabDIv.eq($(this).index()).show().siblings().not(".tabTitle").hide()

+ 16 - 23
src/web/staticres/js/superSearch.js

@@ -2,8 +2,6 @@ var pageSize = 50;
 var nbflag = false;//是否显示的是最新招标数据
 var currentPage = 1;//当前页
 var submitflag = true;
-var searchvalue = "";//关键词
-var searchtype = "all"//全文或标题
 
 $(function() {
 	$("#minprice").click(function(){
@@ -91,17 +89,12 @@ $(function() {
 			localStorage.setItem("hideorshow", "D");
 		}
 	})
-	//
-	$("#zbSeatchT input[type='button']").click(function(){
-		currentPage=1;
-		beforeSubmit(1)
-	})
 	//全文检索和标题检索切换
 	$("#newsclass li:nth-child(1)").click(function(){
 		$("#zbSeatchT [name='selectType']").val("all");
 		currentPage=1;
 		if(submitflag){
-			searchtype = "all";
+			selectType = "all";
 			searchOnsubmit();
 			submitflag=false;
 		}
@@ -111,7 +104,7 @@ $(function() {
 		$("#zbSeatchT [name='selectType']").val("title");
 		currentPage=1;
 		if(submitflag){
-			searchtype = "title";
+			selectType = "title";
 			searchOnsubmit();
 			submitflag=false;
 		}
@@ -200,6 +193,13 @@ function appendDatas(datas,flag){
 	var tableHtml = '';
 	var searchvalueArray = searchvalue.split("+");
 	$(".pagination-inner").find("span").text(currentPage);
+	if(flag&&selectType == "all"){
+		$("#allnews").show();
+		$(".tabContainer-2").hide();
+	}else{
+		$("#allnews").hide();
+		$(".tabContainer-2").show();
+	}
 	for(var i=0;i<datas.length;i++){
 		var index = (currentPage - 1) * pageSize + i + 1;
 		var title = datas[i].title;
@@ -231,20 +231,13 @@ function appendDatas(datas,flag){
 				type = "";
 			}
 		}
-		if(flag&&searchtype == "all"){
-			$("#allnews").show();
-			$(".tabContainer-2").hide();
-		}else{
-			$("#allnews").hide();
-			$(".tabContainer-2").show();
-		}
 		listHtml += '<li>'
-					+'<div class="liLuceneList">'
+					+'<div class="liLuceneList" style="border-bottom: 1px solid #EBEBEB;">'
 					+'<div class="luce-left"><em>'+index+'.</em>'
 					+'<div class="left-title">'
 					+'<a href="'+aHref+'"> '+title+'</a>'
 					+'</div>'
-		if(flag&&searchtype == "all"){
+		if(flag&&selectType == "all"&&detail!=""){
 			listHtml += '<div class="left-content">'
 					+'<a href="javascript:volid(0);">'+detail+'...</a>'
 					+'</div>'
@@ -264,7 +257,7 @@ function appendDatas(datas,flag){
 		if(typeof(datas[i].industry) != "undefined" && datas[i].industry != null && datas[i].industry != ""){
 			listHtml += '<a href="javascript:volid(0);">'+datas[i].industry+'</a>';
 		}else{
-			listHtml += '<a href="#" style="display:none;"></a>';
+			listHtml += '<a href="javascript:volid(0);" style="display:none;"></a>';
 		}
 		
 		//
@@ -339,11 +332,11 @@ function appendDatas(datas,flag){
 		}
 			tableHtml+='</tr>'
 	}
-	if(!flag||searchtype=="title"){
+	if(!flag||selectType=="title"){
 		$(".tabContainer-2 .lucene ul").html(listHtml);
 		$(".tabContainer-2 .lucene-table table tbody").html(tableHtml);
 	}else{
-		if(searchtype=="all"){
+		if(selectType=="all"){
 			$(".tabContainer .lucene ul").html(listHtml);
 			$(".tabContainer .lucene-table table tbody").html(tableHtml);
 		}
@@ -353,7 +346,7 @@ function appendDatas(datas,flag){
 }
 //
 //
-function   formatDate(date,sl)   { 
+function formatDate(date,sl)   { 
 	var myDate = new Date(date*1000);      
     var   year=myDate.getFullYear();
     var   month=myDate.getMonth()+1; 
@@ -491,7 +484,7 @@ function beforeSubmit(n){
 		$("#zbSeatchT [name='maxprice']").val(selectMaxPrices);
 		//搜索关键词
 		var searchname = $("#zbSeatchT input[name='keywords']").val();
-		$("#zbSeatchT input[name='searchvalue']").val($.trim(searchname))
+		$("#zbSeatchT input[name='searchvalue']").val($.trim(searchname));
 		if(n!="F"){
 			if(submitflag){	
 				if($.trim(searchname)==""){

+ 1 - 1
src/web/templates/common/pnc.html

@@ -11,7 +11,7 @@
 <link href="/css/animate.css" rel="stylesheet">
 <link rel="stylesheet" href="/css/unicorn.main.css" />
 <link rel="stylesheet" href="/css/unicorn.grey.css" />
-<script src="/js/jquery.js"></script>
+<script src="/js/jquery-3.2.1.min.js?v={{Msg "seo" "version"}}"></script>
 <script src="/js/jquery.cookie.js"></script>
 <script src="/js/bootstrap.min.js"></script>
 <script src="/js/jy.js?v={{Msg "seo" "version"}}"></script>

+ 200 - 17
src/web/templates/pc/biddingsearch_enterprise.html

@@ -13,7 +13,6 @@
 		<link href="/css/dev2/biddingSearch.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 		<link href="/css/dev2/biddingSearch1.css?v={{Msg "seo" "version"}}" rel="stylesheet">
 		<script src="/js/jquery.cookie.js"></script>
-		<script src="/js/jquery-3.2.1.min.js?v={{Msg "seo" "version"}}"></script>
 		<script src="/js/biddingSearch.js?v={{Msg "seo" "version"}}"></script>
 		<script language="javascript" type="text/javascript" src="/My97DatePicker/WdatePicker.js"></script>
 		
@@ -97,11 +96,66 @@
 				     -o-animation-fill-mode:forwards;
 				        animation-fill-mode:forwards;
 			}
+			#keyImg{
+				width:198px;
+			}
+			#layerImg{
+				position:absolute;
+				width: 150px !important;
+			    height: 150px !important;
+			    left: 198px;
+			    top: 148px;
+			}
+			.layheader{
+				position: absolute;
+			    color: #fff;
+			    left: 138px;
+			    top: 40px;
+			    line-height: 32px;
+			    font-family: 微软雅黑;
+			    font-weight: bold;
+			}
+			.layheader div:nth-child(1){
+				font-size:20px;
+			}
+			.layheader div:nth-child(2){
+				font-size:16px;
+				margin-top:10px;
+			}
+			.modal-footer{
+				text-align: center;
+			    position: absolute;
+			    bottom: 65px;
+			    left: 110px;
+			    font-size: 14px;
+			    line-height: 22px;
+			    color: #686868;
+			}
+			.modal-dialog{
+				width:500px;
+			}
 		</style>
 	</head>
 
 	<body>
 	{{include "/common/pchead.html"}}
+		<div class="modal fade" id="labModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+		    <div class="modal-dialog">
+		        <div class="modal-content" id="labmodalcont">
+		            <div class="modal-body" id="labmodalbody">
+						<div class="layheader">
+							<div>超级搜索</div>
+							<div>按行业、金额搜索、结果可按表格显示</div>
+						</div>
+						<img src="/images/biddingSearch/labbkimg.png"/>
+						<img id="layerImg" src="/front/share/{{.T.shareid}}"/>
+					</div>
+		            <div class="modal-footer">
+		                此功能尚处在实验阶段,请扫码进入<br>剑鱼实验室,打开相应开关后,即可体验!
+		            </div>
+		        </div><!-- /.modal-content -->
+		    </div><!-- /.modal -->
+		</div>
 		<section id="searchInner">
 			<!--搜索头部 START-->
 			<div class="searchHeader">
@@ -113,10 +167,10 @@
 					</div>
 					<!--搜索-->
 					<div class="searchInput clearfix">
-						<form action="/jylab/bidsearchforent" method="post" id="zbSeatchT" class="clearfix" onsubmit="return true">
-							<input class="searchname" autocomplete="off" type="search" name="keywords" id="searchinput" value="" placeholder="高速公路" />
+						<form action="/jylab/bidsearchforent.html" method="post" id="zbSeatchT" class="clearfix" onsubmit="return true">
+							<input class="searchname" autocomplete="off" type="search" name="keywords" id="searchinput" value="{{.T.searchvalue}}" placeholder="高速公路" />
 
-							<input type="button" class="searchBtn" value="搜索" />
+							<input type="submit" class="searchBtn" value="搜索" />
 							<!--<div class="searchSlideText">
 								<ul>
 									<li>大连<i>万达集团</i>股份有限公司北京投资管理分公司</li>
@@ -150,6 +204,18 @@
 						<!--二维码-->
 						<div class="search-right-wx">
 							<img src="/images/biddingSearch/sea-right-wx.png" />
+							<div class="search-right-wx-inner">
+								<div class="wx-inner-title">
+									扫码关注剑鱼招标订阅
+								</div>
+								<div class="wx-inner-ewm">
+									<img  id="keyImg" src="/front/share/{{.T.shareid}}"/>
+								</div>
+								<div class="wx-inner-bottom">
+									微信扫一扫<br>随时随地掌握招标信息
+		<!--						微信扫一扫,及时获取及时获取<i>"1"</i>相关招标信息-->
+								</div>
+							</div>
 						</div>
 					</div>
 				</div>
@@ -159,7 +225,7 @@
 			<!--招标搜索页面 START-->
 			<div class="searchControl">
 				<!--头部功能-->
-				<div class="searchTender w">
+				<div class="searchTender w" style="display:none;">
 					<!--价格区间-->
 					<div class="Price clearfix">
 						<div class="leftTitle">
@@ -242,8 +308,8 @@
 							</li>
 						</ul>
 						<div class="right-tabBtn">
-							<button class="active">列表</button>
-							<button>表格</button>
+							<button id="listBtn" class="active">列表</button>
+							<button id="tableBtn">表格</button>
 						</div>
 					</div>
 					<!--tab切换内容-->
@@ -262,7 +328,7 @@
 										<div class="luce-right">
 											<a href="#">{{$v.area}}</a>
 											<a href="#">{{$v.bidtype}}</a>
-											<a href="#">{{$v.industry}}</a>
+											<!--<a href="#">{{$v.industry}}</a>-->
 											<span>{{$v.time1}}</span>
 										</div>
 									</div>
@@ -299,9 +365,9 @@
 				<!--分页-->
 				<div class="pagination clearfix w">
 					<div class="pagination-inner fr">
-						<a href="#"><i><</i>上一页</a>
+						<a class="nbprev disabled" href="#"><i><</i>上一页</a>
 						<span>1</span>
-						<a href="#">下一页<i>></i></a>
+						<a class="nbnext" href="#">下一页<i>></i></a>
 					</div>
 				</div>
 			</div>
@@ -312,11 +378,80 @@
 	{{include "/common/baiducc.html"}}
 	<script>
 		var mainList = {{.T.list}};
+		var submitflag = true;
+		var pricetype = "";
+		var areas = {{.T.area}};
+		var searchvalue = {{.T.searchvalue}};
+		
+		//地区回显样式设置
+		if(areas != ""){
+			$("#regionBtn").removeClass("active");
+			areas = areas.split(",");
+			for(var i=0;i<areas.length;i++){
+				$(".region-content>font:not('.parent-node')").each(function(){
+					if($(this).text() == areas[i]){
+						$(this).addClass("active");
+						return false;
+					}
+				});
+			}
+		}
+		$(".region-content .parent-node").each(function(){
+			var fontLen = $(this).nextUntil(".parent-node").filter("font").length;
+			var activeLen = $(this).nextUntil(".parent-node").filter(".active").length;
+			if(fontLen == activeLen){
+				$(this).addClass("active");
+			}
+			if(activeLen >0 && activeLen < fontLen){
+				$(this).addClass("secondActice");
+			}
+		});
+		
+		//搜索关键词回显页面样式设置
+		if(searchvalue != "" && searchvalue != null){
+			$(".seaTender-inner").css({'border':'0px'});
+			$(".lucene-table").css({'padding':'0px','border-bottom':'0px','display':'block'});		
+			$(".tabTitle").addClass("hidden");
+			$(".lucene").attr("style","display:none");
+		}
 		
+		//价格回显样式设置
+		if({{.T.pricetype}} == "y"){
+			$(".Price-content").find("span:first-child").removeClass("active");
+			$(".pricefat").addClass("active");
+		}
 		
 		$(function(){
 			haslogin({{.T.logid}});
 			
+			//筛选关闭和打开
+			//根据cookie值设置筛选是否显示
+			var rsw = localStorage.getItem("entstore");
+			console.log("00000"+rsw);
+			if(rsw == null){
+				setTimeout(function(){
+					$(".searchTender").stop(false,true).slideDown(1000);
+					localStorage.setItem("entstore", "D");
+				},500);
+			}else{
+				if(rsw=="U"){
+					$("#screenBtn").addClass("down");
+					$(".searchTender").hide();
+				}else{
+					$("#screenBtn").removeClass("down");
+					$(".searchTender").show();
+				}
+			}
+				
+			//记录用户刷选按钮状态
+			$("#screenBtn").click(function(){
+				if($(this).attr("class").indexOf("down")>0){
+					localStorage.setItem("entstore", "U");
+				}else{
+					localStorage.setItem("entstore", "D");
+				}
+			})
+					
 			//价格
 			$("#minprice").click(function(){
 				$(".pricebut").show();
@@ -326,10 +461,15 @@
 				$(".pricebut").show();
 				$(".pricefat").addClass("customtime-active");
 			})
+			//价格的全部按钮
 			$(".Price-content").find("span:first-child").click(function(){
 				$(this).addClass("active");
 				$(".pricefat").removeClass("active");
+				pricetype = "n"
+				$("#zbSeatchT input[name='pricetype']").val(pricetype);
+				beforeSubmit();
 			})
+			//价格的确定按钮
 			$(".pricebut").click(function(){
 				var minp = $("#minprice").val();
 				var maxp = $("#maxprice").val();
@@ -344,8 +484,28 @@
 				$(".pricefat").addClass("active");
 				$(".Price-content").find("span:first-child").removeClass("active");
 				$(".pricefat").removeClass("customtime-active");
+				pricetype = "y";
+				$("#zbSeatchT input[name='pricetype']").val(pricetype);
 				beforeSubmit();
-			})		
+			})	
+			
+			//搜索按钮
+			$(".searchBtn").click(function(){
+				var searchname = $("#zbSeatchT input[name='keywords']").val();
+				$("#zbSeatchT input[name='searchvalue']").val($.trim(searchname));
+				$("#zbSeatchT").submit();
+			})	
+			
+			//点击超级搜索按钮
+			$(".superSearch").click(function(){
+				$("#labModal").modal("show");
+			})
+			
+			//关闭登录二维码
+			$(".code-close").click(function(){
+				$("#bidLogin").modal("hide");
+			})
+			
         });
 		function beforeSubmit(){			
 			//地区
@@ -366,28 +526,51 @@
 			var selectMaxPrices =  $(".PriceInput [name='maxprice']").val();
 			$("#zbSeatchT [name='minprice']").val(selectMinPrices);
 			$("#zbSeatchT [name='maxprice']").val(selectMaxPrices);
+			
 			//搜索关键词
 			var searchname = $("#zbSeatchT input[name='keywords']").val();
-			console.log("----"+searchname)
 			$("#zbSeatchT input[name='searchvalue']").val($.trim(searchname))
-			searchOnsubmit();
+			console.log("关键词============"+searchname);
+			if(submitflag){	
+				if($.trim(searchname) != ""){
+					console.log("搜索关键词不为空");
+					getTableInfo();
+				}else{
+					console.log("搜索关键词为空"+"--------------------");
+					
+					$(".tabTitle").removeClass("hidden");
+					$(".lucene").attr("style","display:block");
+					$(".lucene-table").attr("style","display:none");
+					searchOnsubmit();
+				}
+				submitflag=false;
+			}	
+			setTimeout(function(){
+				submitflag=true
+			},200);
 			return true
 		}
-//
+	
+		function getTableInfo(){
+			$(".seaTender-inner").css({'border':'0px'});
+			$(".lucene-table").css({'padding':'0px','border-bottom':'0px','display':'block'});		
+			$(".tabTitle").addClass("hidden");
+			$(".lucene").attr("style","display:none");
+			searchOnsubmit();
+		}
+
 		function searchOnsubmit(){
 			var param = {
 						searchvalue: $("#zbSeatchT [name='searchvalue']").val(),
 						area: $("#zbSeatchT [name='area']").val(),
 						minprice: $("#zbSeatchT [name='minprice']").val(),
 						maxprice: $("#zbSeatchT [name='maxprice']").val(),
+						pricetype: $("#zbSeatchT [name='pricetype']").val()
 					};
 			$.post("/jylab/pcSearchZbqyAjax",param,function(r){
 				
 			});
 		}
-
-
-
 	</script>
 	</body>
 

Разница между файлами не показана из-за своего большого размера
+ 653 - 243
src/web/templates/pc/classifylist.html


+ 181 - 8
src/web/templates/pc/supsearch.html

@@ -134,11 +134,106 @@ a{
 .modal-dialog{
 	width:500px;
 }
+.superSearch:hover{
+	background: #2cb7ca url(/images/biddingSearch/sea-header-btnImg-bai.png) 16px center no-repeat;
+    color: #ffffff;
+    background-size: 15px 16px;
+}
+#labmodalbody .code-close{
+	width: 40px;
+    height: 40px;
+    position: absolute;
+    right: 40px;
+    top: -20px;
+    cursor: pointer;
+    -webkit-transition: all 1s;
+    -o-transition: all 1s;
+    -moz-transition: all 1s;
+    transition: all 1s;
+}
+#labmodalbody .code-close:hover{
+	-webkit-transform: scale(1.2);
+	   -moz-transform: scale(1.2);
+	    -ms-transform: scale(1.2);
+	     -o-transform: scale(1.2);
+	        transform: scale(1.2);
+}
+.j-clearicon{
+	right:118px !important;
+}
 </style>
 <script>
+var areas = {{.T.area}};
+var selectPublishtime = {{.T.publishtime}};
+var selectTimeslot = {{.T.timeslot}};
+var toptype = {{.T.toptype}};
+var subtype = {{.T.subtype}};
+var isopen = {{.T.isopen}};
+var keys = {{.T.keywords}};
+var selectType = {{.T.selectType}};//全文或标题
+var industry = {{.T.industry}}
+var industrylist = {{.T.industrylist}}
+var sortArray = {{.T.sortArray}}
+var list = {{.T.list}}
+var searchvalue = {{.T.searchvalue}};
+var searchvalueArray = searchvalue.split("+");
 $(function(){
-	var industrylist = {{.T.industrylist}}
-	var sortArray = {{.T.sortArray}}
+	if(selectType=="all"){
+		$("#newsclass li:nth-child(1) a").addClass("active");
+		$("#newsclass li:nth-child(2) a").removeClass("active");
+	}else{
+		$("#newsclass li:nth-child(1) a").removeClass("active");
+		$("#newsclass li:nth-child(2) a").addClass("active");
+	};
+	$("#zbSeatchT [name='selectType']").val(selectType);
+	//
+	$("#zbSeatchT [name='keywords']").val($.trim(keys));
+	$("#zbSeatchT [name='searchvalue']").val($.trim(keys));
+	$("#searchinput").focus();
+	if($.trim(keys)!=""){
+		searchvalue = $.trim(keys);
+		searchvalueArray = searchvalue.split("+");
+		$("#newsclass").show();
+		$("#newsnow").hide();
+		if(list == null || list.length == 0){
+			$(".tabContainer").hide();
+			$(".pagination").hide();
+			$(".hasNoData").show();
+			submitflag=true;
+		}else{
+			$(".tabContainer").show();
+			$(".pagination").show();
+			$(".hasNoData").hide();
+			appendDatas(list,true);
+		}
+	}else{
+		if(list!=null&&list.length>0){
+			$(".tabContainer").show();
+			$(".pagination").show();
+			$(".hasNoData").hide();
+			appendDatas(list,false);
+		}else{
+			$(".tabContainer").hide();
+			$(".pagination").hide();
+			$(".hasNoData").show();
+			submitflag=true;
+		}
+	}
+	//
+	$(".searchname").on("input propertychange",function(){
+		var kw = $("#zbSeatchT [name='keywords']").val();
+    	$("#zbSeatchT [name='searchvalue']").val($.trim(kw));
+		if($.trim(kw)!=""){
+			$("#t-clear").show();
+		}else{
+			$("#t-clear").hide();
+		}
+  	});
+	$("#t-clear").click(function(){
+		$("#t-clear").hide();
+		$("#searchinput").val("").focus();
+	})
+	
 	var industryhtml = '<span id="induAll" class="active">全部</span>';
 	if (sortArray!=null&&sortArray.length>0){
 		for(var i in sortArray){
@@ -153,6 +248,80 @@ $(function(){
 		$(".industry-content").html(industryhtml)
 	}
 	
+	//
+	if(industry!=""){
+		$("#induAll").removeClass("active");
+		industry = industry.split(",");
+		for(var i=0;i<industry.length;i++){
+			$(".industry-content>font:not('.parent-node')").each(function(){
+				if($(this).attr("data-value") == industry[i]){
+					$(this).addClass("active");
+					return false;
+				}
+			});
+		}
+	}
+	$(".industry-content .parent-node").each(function(){
+		if($(this).nextUntil(".parent-node").filter("font").length == $(this).nextUntil(".parent-node").filter(".active").length){
+			$(this).addClass("active");
+		}
+	});
+	//
+	if(selectPublishtime != ""){
+		$("#timerAll").removeClass("active");
+		$(".timer [data-value='"+selectPublishtime+"']").addClass("active");
+		if(selectPublishtime.indexOf("_") > -1){
+			$(".timerInput").addClass("active");
+		}
+	}
+	if(selectTimeslot != "" && selectTimeslot.indexOf("_") > -1){
+		var spTimeArray = selectTimeslot.split("_");
+		if(spTimeArray[0] != ""){
+			$("#starttime").val(new Date(new Number(spTimeArray[0]+"000")).Format("yyyy年MM月dd日"));
+			$("#starttime").attr("data-value",spTimeArray[0]);
+		}
+		if(spTimeArray[1] != ""){
+			$("#endtime").val(new Date(new Number(spTimeArray[1]+"000")).Format("yyyy年MM月dd日"));
+			$("#endtime").attr("data-value",spTimeArray[1]);
+		}
+	}
+	//
+	if(areas != ""){
+		$("#regionBtn").removeClass("active");
+		areas = areas.split(",");
+		for(var i=0;i<areas.length;i++){
+			$(".region-content>font:not('.parent-node')").each(function(){
+				if($(this).text() == areas[i]){
+					$(this).addClass("active");
+					return false;
+				}
+			});
+		}
+	}
+	$(".region-content .parent-node").each(function(){
+		if($(this).nextUntil(".parent-node").filter("font").length == $(this).nextUntil(".parent-node").filter(".active").length){
+			$(this).addClass("active");
+		}
+	});
+	//
+	if(subtype != ""){
+		$("#infoBtn").removeClass("active");
+		subtype = subtype.split(",");
+		for(var i=0;i<subtype.length;i++){
+			$(".info-content>font:not('.parent-node')").each(function(){
+				if($(this).attr("data-value") == subtype[i]){
+					$(this).addClass("active");
+					return false;
+				}
+			});
+		}
+	}
+	$(".info-content .parent-node").each(function(){
+		if($(this).nextUntil(".parent-node").filter("font").length == $(this).nextUntil(".parent-node").filter(".active").length){
+			$(this).addClass("active");
+		}
+	});
+	
 })
 </script>
 <script src="/js/biddingSearch.js?v={{Msg "seo" "version"}}"></script>
@@ -164,6 +333,7 @@ $(function(){
     <div class="modal-dialog">
         <div class="modal-content" id="labmodalcont">
             <div class="modal-body" id="labmodalbody">
+				<img class="code-close" src="/images/j-wx-code-close.png" alt="" onclick="labClose();">
 				<div class="layheader">
 					<div>超级搜索</div>
 					<div>按行业、金额搜索、结果可按表格显示</div>
@@ -190,9 +360,9 @@ $(function(){
 			<!--搜索-->
 			<div class="searchInput clearfix">
 				<form action="/jylab/supsearch/index.html" method="post"  id="zbSeatchT" class="clearfix" onsubmit="return beforeSubmit('F')">
-					<input class="searchname" autocomplete="off" type="search" id="searchinput" value="" name="keywords" placeholder="高速公路" />
-
-					<input type="button" value="搜索" />
+					<input class="searchname" autocomplete="off" type="search" id="searchinput" value="{{.T.keywords}}" name="keywords" placeholder="高速公路" />
+					<img src="/images/pc_20.png" id="t-clear" class="j-clearicon" style="display: none;">
+					<input type="submit" value="搜索" />
 <!--					<div class="searchSlideText">
 						<ul>
 							<li>大连<i>万达集团</i>股份有限公司北京投资管理分公司</li>
@@ -209,7 +379,7 @@ $(function(){
 							<li>大连<i>万达集团</i>股份有限公司北京投资管理分公司</li>
 						</ul>
 					</div>-->
-					<input type="hidden" name="searchvalue" value="{{.T.searchvalue}}">
+					<input type="hidden" name="searchvalue" value="{{.T.keywords}}">
 					<input type="hidden" name="publishtime" value="{{.T.publishtime}}">
 					<input type="hidden" name="timeslot" value="{{.T.timeslot}}">
 					<input type="hidden" name="area" value="{{.T.area}}">
@@ -505,6 +675,7 @@ $(function(){
 	haslogin({{.T.logid}});
 	console.log(loginflag+"-------")
 	//
+	$(".j-nav .j-nav-link:eq(2)").addClass("active");
 	$(".q-mark").click(function(){
 		$(".remind").fadeIn();
 	})
@@ -519,9 +690,11 @@ $(function(){
 			$("#backTop").hide();
 		}
 	});
-	var list = {{.T.list}}
-	appendDatas(list,false);
 })
+//关闭遮罩层
+function labClose(){
+	$("#labModal").modal("hide");
+}
 </script>
 </body>
 </html>

Некоторые файлы не были показаны из-за большого количества измененных файлов