Browse Source

Merge branch 'feature/v4.8.58' into dev/v4.8.58_yf

yangfeng 1 year ago
parent
commit
f0c1f50f2d

+ 5 - 5
src/jfw/config/config.go

@@ -105,8 +105,8 @@ func GetLetterMap(names string) []map[string]interface{} {
 	for _, v := range nameArr {
 	for _, v := range nameArr {
 		nameArr1 = append(nameArr1, fmt.Sprintf(`"%s"`, v))
 		nameArr1 = append(nameArr1, fmt.Sprintf(`"%s"`, v))
 	}
 	}
+	dataArr2 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state1=2 order by id desc`, strings.Join(nameArr1, ",")))
 	dataArr1 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.state=1 and  a.class_1 in (%s) and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`, strings.Join(nameArr1, ",")))
 	dataArr1 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.state=1 and  a.class_1 in (%s) and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`, strings.Join(nameArr1, ",")))
-	dataArr2 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=1 order by id desc`, strings.Join(nameArr1, ",")))
 	for _, v1 := range nameArr {
 	for _, v1 := range nameArr {
 		var isNormal bool
 		var isNormal bool
 		if dataArr1 != nil && len(*dataArr1) > 0 {
 		if dataArr1 != nil && len(*dataArr1) > 0 {
@@ -115,7 +115,7 @@ func GetLetterMap(names string) []map[string]interface{} {
 					isNormal = true
 					isNormal = true
 					data = append(data, map[string]interface{}{
 					data = append(data, map[string]interface{}{
 						"name": v1 + util.ObjToString(Seoconfig["seoKeywordSuffix"]),
 						"name": v1 + util.ObjToString(Seoconfig["seoKeywordSuffix"]),
-						"url":  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", util.Int64All(v2["id"]), util.Int64All(v2["class_id"])),
+						"url":  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", util.Int64All(v2["class_id"]), util.Int64All(v2["id"])),
 					})
 					})
 				}
 				}
 			}
 			}
@@ -140,12 +140,12 @@ func GetLetterMap(names string) []map[string]interface{} {
 			nameArr2 = append(nameArr2, v1)
 			nameArr2 = append(nameArr2, v1)
 			nameArr3 = append(nameArr3, fmt.Sprintf(`"%s"`, v1))
 			nameArr3 = append(nameArr3, fmt.Sprintf(`"%s"`, v1))
 			letter := getFirstLetter(v1)
 			letter := getFirstLetter(v1)
-			nameArr4 = append(nameArr4, fmt.Sprintf(`("%s", "%s", 1)`, v1, letter))
+			nameArr4 = append(nameArr4, fmt.Sprintf(`("%s", "%s", 2)`, v1, letter))
 		}
 		}
 	}
 	}
 	if len(nameArr2) > 0 {
 	if len(nameArr2) > 0 {
-		public.BaseMysql.SelectBySql(fmt.Sprintf(`INSERT INTO seo_words.seo_resource (name, letter, state) VALUES %s`, strings.Join(nameArr4, ",")))
-		dataArr3 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=1 order by id desc`, strings.Join(nameArr3, ",")))
+		public.BaseMysql.SelectBySql(fmt.Sprintf(`INSERT INTO seo_words.seo_resource (name, letter, state1) VALUES %s`, strings.Join(nameArr4, ",")))
+		dataArr3 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state1=2 order by id desc`, strings.Join(nameArr3, ",")))
 		if dataArr3 != nil {
 		if dataArr3 != nil {
 			for _, v3 := range *dataArr3 {
 			for _, v3 := range *dataArr3 {
 				letter := util.ObjToString(v3["letter"])
 				letter := util.ObjToString(v3["letter"])

+ 2 - 1
src/jfw/front/classificationTag.go

@@ -358,7 +358,8 @@ func NewIndexbids(session *httpsession.Session, r *http.Request) []map[string]in
 		_, total, _ := so.GetBidSearchList(true)
 		_, total, _ := so.GetBidSearchList(true)
 		data.Count = total
 		data.Count = total
 	*/
 	*/
-	_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "拟建,招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 10, "")
+	// p397 收回查看拟建权限
+	_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 10, "")
 	if lists != nil {
 	if lists != nil {
 		for _, v1 := range *lists {
 		for _, v1 := range *lists {
 			v1["_id"] = encrypt.CommonEncodeArticle("content", v1["_id"].(string))
 			v1["_id"] = encrypt.CommonEncodeArticle("content", v1["_id"].(string))

+ 116 - 9
src/jfw/front/pcIndex.go

@@ -3,6 +3,7 @@ package front
 import (
 import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jy/src/jfw/config"
 	"jy/src/jfw/config"
 	"jy/src/jfw/site/jySchool"
 	"jy/src/jfw/site/jySchool"
 	"jy/src/jfw/wx"
 	"jy/src/jfw/wx"
@@ -92,6 +93,10 @@ func (m *PcIndex) NewSordfish(flag string) error {
 	m.T["activestart"] = config.ActiveConfig.DoubleEleven.Active_Start
 	m.T["activestart"] = config.ActiveConfig.DoubleEleven.Active_Start
 	m.T["activeend"] = config.ActiveConfig.DoubleEleven.Active_End
 	m.T["activeend"] = config.ActiveConfig.DoubleEleven.Active_End
 	regex, _ := regexp.Compile("(Android|Mobile)")
 	regex, _ := regexp.Compile("(Android|Mobile)")
+	var isLogin bool
+	if util.ObjToString(m.GetSession("userId")) != "" {
+		isLogin = true
+	}
 	if ispc == 0 && len(regex.FindAllString(m.Header("User-Agent"), -1)) > 0 {
 	if ispc == 0 && len(regex.FindAllString(m.Header("User-Agent"), -1)) > 0 {
 		m.T["s_m_openid"] = util.ObjToString(m.GetSession("s_m_openid"))
 		m.T["s_m_openid"] = util.ObjToString(m.GetSession("s_m_openid"))
 		m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
 		m.T["signature"] = wx.SignJSSDK(m.Site() + m.Url())
@@ -104,13 +109,43 @@ func (m *PcIndex) NewSordfish(flag string) error {
 		//最新资讯
 		//最新资讯
 		if flag == "old" {
 		if flag == "old" {
 			//最新公告信息
 			//最新公告信息
-			for _, v := range []int{1, 2, 3, 4} { //1拟建 2招标预告 3招标公告 4招标结果
+			// p397 未登录信息类型不展示拟建
+			rangeInfoType := []int{2, 3, 4}
+			if isLogin {
+				rangeInfoType = []int{1, 2, 3, 4}
+			}
+			for _, v := range rangeInfoType { //1拟建 2招标预告 3招标公告 4招标结果
 				m.T[fmt.Sprintf("newArticle_%d", v)] = GetNewArticle(v, pageSize)
 				m.T[fmt.Sprintf("newArticle_%d", v)] = GetNewArticle(v, pageSize)
 			}
 			}
 			//前端需要跳转的路由
 			//前端需要跳转的路由
 			for _, v := range []int{1, 2, 3} {
 			for _, v := range []int{1, 2, 3} {
 				m.T[fmt.Sprintf("labUrl_%d", v)] = GetLabUrl(v) //1地域 2信息类型 3热门招标
 				m.T[fmt.Sprintf("labUrl_%d", v)] = GetLabUrl(v) //1地域 2信息类型 3热门招标
 			}
 			}
+			if !isLogin {
+				appendData := []interface{}{}
+				if labUrl_2, ok := m.T["labUrl_2"].([]interface{}); ok {
+					for i := 0; i < len(labUrl_2); i++ {
+						labUrl_ := util.ObjToMap(labUrl_2[i])
+						if labUrl_ != nil {
+							if _, ok := (*labUrl_)["拟建项目"]; ok {
+								continue
+							}
+							appendData = append(appendData, labUrl_)
+						}
+					}
+				} else if labUrl_2, ok := m.T["labUrl_2"].([]map[string][]map[string]interface{}); ok {
+					for i := 0; i < len(labUrl_2); i++ {
+						labUrl_ := labUrl_2[i]
+						if labUrl_ != nil {
+							if _, ok := (labUrl_)["拟建项目"]; ok {
+								continue
+							}
+							appendData = append(appendData, labUrl_)
+						}
+					}
+				}
+				m.T["labUrl_2"] = appendData
+			}
 			return m.Render("/pc/index_old.html", &m.T)
 			return m.Render("/pc/index_old.html", &m.T)
 		} else if flag == "tmp" {
 		} else if flag == "tmp" {
 			return m.Render("/pc/index_tmp.html", &m.T)
 			return m.Render("/pc/index_tmp.html", &m.T)
@@ -124,6 +159,32 @@ func (m *PcIndex) NewSordfish(flag string) error {
 			for k, v := range RegionAndInformationAndTender() {
 			for k, v := range RegionAndInformationAndTender() {
 				m.T[k] = v
 				m.T[k] = v
 			}
 			}
+			// p397 未登录信息类型不展示拟建
+			if !isLogin {
+				appendData := []interface{}{}
+				if labUrl_2, ok := m.T["labUrl_2"].([]interface{}); ok {
+					for i := 0; i < len(labUrl_2); i++ {
+						labUrl_ := util.ObjToMap(labUrl_2[i])
+						if labUrl_ != nil {
+							if _, ok := (*labUrl_)["拟建项目"]; ok {
+								continue
+							}
+							appendData = append(appendData, labUrl_)
+						}
+					}
+				} else if labUrl_2, ok := m.T["labUrl_2"].([]map[string][]map[string]interface{}); ok {
+					for i := 0; i < len(labUrl_2); i++ {
+						labUrl_ := labUrl_2[i]
+						if labUrl_ != nil {
+							if _, ok := (labUrl_)["拟建项目"]; ok {
+								continue
+							}
+							appendData = append(appendData, labUrl_)
+						}
+					}
+				}
+				m.T["labUrl_2"] = appendData
+			}
 			//热门标的物
 			//热门标的物
 			m.T["hotSubject"] = subjectMatter
 			m.T["hotSubject"] = subjectMatter
 			//实用内容推荐
 			//实用内容推荐
@@ -357,6 +418,11 @@ func (f *PcIndex) SearchResult(at, name string) error {
 	//	return f.Redirect("/jylab/supsearch/proposedProject.html")
 	//	return f.Redirect("/jylab/supsearch/proposedProject.html")
 	//}
 	//}
 	userId := util.ObjToString(f.GetSession("userId"))
 	userId := util.ObjToString(f.GetSession("userId"))
+	// p397 未登录收回查看拟建项目权限
+	// 如果用户未登录访问拟建项目 重定向到登录页面
+	if userId == "" && name == "NJXM" {
+		return f.Redirect("/notin/page")
+	}
 	var no = 5
 	var no = 5
 	var area = ""
 	var area = ""
 	var stype = ""
 	var stype = ""
@@ -512,11 +578,11 @@ func (f *PcIndex) SearchResult(at, name string) error {
 		query1 += `],"should": [],"minimum_should_match": 0}}}`
 		query1 += `],"should": [],"minimum_should_match": 0}}}`
 		//p353包含采购意向与拟建
 		//p353包含采购意向与拟建
 		//获取到昨天数据
 		//获取到昨天数据
-		if stype == "" && userId == "" {
+		if stype == "" {
 			// stype = "招标预告,招标公告,招标结果,招标信用信息"
 			// stype = "招标预告,招标公告,招标结果,招标信用信息"
-			stype = "拟建,招标,询价,竞谈,变更,单一,竞价,邀标,成交,中标,废标,流标,结果变更,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果"
+			// p397 不查拟建
+			stype = "招标,询价,竞谈,变更,单一,竞价,邀标,成交,中标,废标,流标,结果变更,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果"
 		}
 		}
-
 		var datas *[]map[string]interface{}
 		var datas *[]map[string]interface{}
 		if list == nil || len(list.([]interface{})) == 0 {
 		if list == nil || len(list.([]interface{})) == 0 {
 			if keywords == "" {
 			if keywords == "" {
@@ -531,7 +597,7 @@ func (f *PcIndex) SearchResult(at, name string) error {
 				datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","buyer","bidamount","budget","s_subscopeclass","projectname"`, startPage, limitcount)
 				datas = elastic.GetPage(INDEX, TYPE, query, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","bidopentime","winner","buyer","bidamount","budget","s_subscopeclass","projectname"`, startPage, limitcount)
 			} else {
 			} else {
 				//关键词  如果规定时间内未取到数据 则按照老规则取数据   //规则开发一半被砍 暂时注释
 				//关键词  如果规定时间内未取到数据 则按照老规则取数据   //规则开发一半被砍 暂时注释
-				_, _, datas = bidsearch.GetPcBidSearchData(keywords, "", "", "", "", key_industry, "", "", "", "", "", "", "", 0, true, nil, bidSearch_field_1, "", false, false, "", 300, "")
+				_, _, datas = bidsearch.GetPcBidSearchData(keywords, "", "", "", stype, key_industry, "", "", "", "", "", "", "", 0, true, nil, bidSearch_field_1, "", false, false, "", 300, "")
 				if datas != nil && len(*datas) > limitcount {
 				if datas != nil && len(*datas) > limitcount {
 					*datas = (*datas)[0:limitcount]
 					*datas = (*datas)[0:limitcount]
 				}
 				}
@@ -749,7 +815,7 @@ var getIndexHotKeyNoLoginFunc = func() func() []*hotKeyWord {
 	limit := util.IntAll(config.Sysconfig["pcIndexHotKeyLimit"])
 	limit := util.IntAll(config.Sysconfig["pcIndexHotKeyLimit"])
 	//获取未登录关键词
 	//获取未登录关键词
 	configVal, _ := config.Sysconfig["pcIndexHotKeyUnLogin"].([]interface{})
 	configVal, _ := config.Sysconfig["pcIndexHotKeyUnLogin"].([]interface{})
-	rData := getLetterMap(util.ObjArrToStringArr(configVal))
+	rData := getKeyWord(util.ObjArrToStringArr(configVal))
 	rLen := len(rData)
 	rLen := len(rData)
 	return func() (final []*hotKeyWord) {
 	return func() (final []*hotKeyWord) {
 		if rData == nil {
 		if rData == nil {
@@ -776,6 +842,47 @@ type hotKeyWord struct {
 	Url  string
 	Url  string
 }
 }
 
 
+type keyWordConfig struct {
+	NAME        string `json:"NAME"`
+	TITLE       string `json:"TITLE"`
+	KEYWORDS    string `json:"KEYWORDS"`
+	DESCRIPTION string `json:"DESCRIPTION"`
+	INDUSTRY    string `json:"INDUSTRY"`
+	Url         string
+}
+
+// getKeyWord 获取拼音关键词
+func getKeyWord(nameArr []string) []*hotKeyWord {
+	keywordsArr, _ := config.Seoconfig["keywordsArr"]
+	var fullData []map[string]*keyWordConfig
+	err := gconv.Struct(keywordsArr, &fullData)
+	if err != nil {
+		return nil
+	}
+	mapping := map[string]*keyWordConfig{}
+	for _, i2 := range fullData {
+		for k, v := range i2 {
+			v.Url = fmt.Sprintf("/list/keywords/%s.html", k)
+			mapping[v.NAME] = v
+		}
+	}
+	var finalData []*hotKeyWord
+	existsMap := map[string]bool{}
+	for _, name := range nameArr {
+		if existsMap[name] {
+			continue
+		}
+		if val, ok := mapping[name]; ok {
+			finalData = append(finalData, &hotKeyWord{
+				Name: val.NAME,
+				Url:  val.Url,
+			})
+			existsMap[name] = true
+		}
+	}
+	return finalData
+}
+
 // getLetterMap 获取关键词对应的链接,若没有则插入
 // getLetterMap 获取关键词对应的链接,若没有则插入
 func getLetterMap(nameArr []string) []*hotKeyWord {
 func getLetterMap(nameArr []string) []*hotKeyWord {
 	var (
 	var (
@@ -789,7 +896,7 @@ func getLetterMap(nameArr []string) []*hotKeyWord {
 		nameArr1 = append(nameArr1, fmt.Sprintf(`"%s"`, v))
 		nameArr1 = append(nameArr1, fmt.Sprintf(`"%s"`, v))
 	}
 	}
 	dataArr1 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on  a.class_1 in (%s) and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`, strings.Join(nameArr1, ",")))
 	dataArr1 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on  a.class_1 in (%s) and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`, strings.Join(nameArr1, ",")))
-	dataArr2 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=1 order by id desc`, strings.Join(nameArr1, ",")))
+	dataArr2 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=2 order by id desc`, strings.Join(nameArr1, ",")))
 	for _, v1 := range nameArr {
 	for _, v1 := range nameArr {
 		var isNormal bool
 		var isNormal bool
 		if dataArr1 != nil && len(*dataArr1) > 0 {
 		if dataArr1 != nil && len(*dataArr1) > 0 {
@@ -823,12 +930,12 @@ func getLetterMap(nameArr []string) []*hotKeyWord {
 			nameArr2 = append(nameArr2, v1)
 			nameArr2 = append(nameArr2, v1)
 			nameArr3 = append(nameArr3, fmt.Sprintf(`"%s"`, v1))
 			nameArr3 = append(nameArr3, fmt.Sprintf(`"%s"`, v1))
 			letter := getFirstLetter(v1)
 			letter := getFirstLetter(v1)
-			nameArr4 = append(nameArr4, fmt.Sprintf(`("%s", "%s", 1)`, v1, letter))
+			nameArr4 = append(nameArr4, fmt.Sprintf(`("%s", "%s", 2)`, v1, letter))
 		}
 		}
 	}
 	}
 	if len(nameArr2) > 0 {
 	if len(nameArr2) > 0 {
 		public.BaseMysql.SelectBySql(fmt.Sprintf(`INSERT INTO seo_words.seo_resource (name, letter, state) VALUES %s`, strings.Join(nameArr4, ",")))
 		public.BaseMysql.SelectBySql(fmt.Sprintf(`INSERT INTO seo_words.seo_resource (name, letter, state) VALUES %s`, strings.Join(nameArr4, ",")))
-		dataArr3 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=1 order by id desc`, strings.Join(nameArr3, ",")))
+		dataArr3 := public.BaseMysql.SelectBySql(fmt.Sprintf(`select id,name,letter from seo_words.seo_resource where name in (%s) and state=2 order by id desc`, strings.Join(nameArr3, ",")))
 		if dataArr3 != nil {
 		if dataArr3 != nil {
 			for _, v3 := range *dataArr3 {
 			for _, v3 := range *dataArr3 {
 				letter := util.ObjToString(v3["letter"])
 				letter := util.ObjToString(v3["letter"])

+ 10 - 8
src/jfw/front/shorturl.go

@@ -187,7 +187,7 @@ func (s *Short) LoginCommon(userId, stype, id string, bm bool) error {
 					var retMap = make(map[string]interface{})
 					var retMap = make(map[string]interface{})
 					stype = "content"
 					stype = "content"
 					_id := encrypt.CommonDecodeArticle(stype, id)[0]
 					_id := encrypt.CommonDecodeArticle(stype, id)[0]
-					_, _, _, obj := pcVRT(_id, "", stype, true)
+					_, _, _, obj := pcVRT(_id, "", stype, true, true)
 					if obj != nil && len(obj) > 0 {
 					if obj != nil && len(obj) > 0 {
 						retMap["_id"] = id
 						retMap["_id"] = id
 						retMap["title"], _ = obj["title"].(string)
 						retMap["title"], _ = obj["title"].(string)
@@ -231,7 +231,7 @@ func (s *Short) LoginCommon(userId, stype, id string, bm bool) error {
 			s.T["shareid"] = se.EncodeString(shareid)
 			s.T["shareid"] = se.EncodeString(shareid)
 			s.T["keywords"] = s.GetString("kds")
 			s.T["keywords"] = s.GetString("kds")
 			ssOpenid := getsession["s_m_openid"]
 			ssOpenid := getsession["s_m_openid"]
-			po, bo, wo, obj := pcVRT(sid, industry, stype, true)
+			po, bo, wo, obj := pcVRT(sid, industry, stype, true, true)
 			if obj != nil && len(obj) > 0 {
 			if obj != nil && len(obj) > 0 {
 
 
 				if len(po) > 0 {
 				if len(po) > 0 {
@@ -406,7 +406,7 @@ func (s *Short) LoginCommon(userId, stype, id string, bm bool) error {
 			s.T["canRead"] = canRead
 			s.T["canRead"] = canRead
 		}
 		}
 		if len(obj) > 0 {
 		if len(obj) > 0 {
-			if canRead || util.ObjToString(obj["subtype"]) == "拟建" {
+			if canRead {
 				FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, true)
 				FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, true)
 				//免费用户正文手机号替换
 				//免费用户正文手机号替换
 				if obj["site"] == "剑鱼信息发布平台" && !isMember {
 				if obj["site"] == "剑鱼信息发布平台" && !isMember {
@@ -530,7 +530,7 @@ func (s *Short) LoginCommon(userId, stype, id string, bm bool) error {
 			s.T["shareid"] = se.EncodeString(shareid)
 			s.T["shareid"] = se.EncodeString(shareid)
 			s.T["keywords"] = s.GetString("kds")
 			s.T["keywords"] = s.GetString("kds")
 			s.DisableHttpCache()
 			s.DisableHttpCache()
-			po, bo, wo, obj := pcVRT(sid, industry, stype, isVip || isMember || isEntniche || newCanRead)
+			po, bo, wo, obj := pcVRT(sid, industry, stype, isVip || isMember || isEntniche || newCanRead, true)
 			if obj != nil && len(obj) > 0 {
 			if obj != nil && len(obj) > 0 {
 				var node bool
 				var node bool
 				if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理 白名单
 				if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理 白名单
@@ -548,8 +548,9 @@ func (s *Short) LoginCommon(userId, stype, id string, bm bool) error {
 				s.T["canRead"] = node
 				s.T["canRead"] = node
 				if newCanRead {
 				if newCanRead {
 					s.T["canRead"] = newCanRead
 					s.T["canRead"] = newCanRead
+					node = newCanRead
 				}
 				}
-				if node || util.ObjToString(obj["subtype"]) == "拟建" {
+				if node {
 					if len(po) > 0 {
 					if len(po) > 0 {
 						s.T["projectOther"] = po
 						s.T["projectOther"] = po
 					}
 					}
@@ -1220,10 +1221,11 @@ func (s *Short) NologinCommon(userId, stype, id, sid string) error {
 		s.T["shareid"] = se.EncodeString(shareid)
 		s.T["shareid"] = se.EncodeString(shareid)
 		//s.T["keywords"] = s.GetString("kds")
 		//s.T["keywords"] = s.GetString("kds")
 		s.DisableHttpCache()
 		s.DisableHttpCache()
-		po, bo, wo, obj := pcVRT(sid, industry, stype, false)
+		po, bo, wo, obj := pcVRT(sid, industry, stype, false, false)
 		if obj != nil && len(obj) > 0 {
 		if obj != nil && len(obj) > 0 {
-			if !ipTrue && obj["subtype"] == "采购意向" { //未登录不能访问采购意向
-				return s.Redirect("/notin/page", 302)
+			// p397 未登录不能查看拟建项目
+			if !ipTrue && (obj["subtype"] == "采购意向" || obj["subtype"] == "拟建") { //未登录不能访问采购意向
+				return s.Redirect(fmt.Sprintf("/notin/page?backTo=%s", s.Request.URL), 302)
 			}
 			}
 			if len(po) > 0 {
 			if len(po) > 0 {
 				s.T["projectOther"] = po
 				s.T["projectOther"] = po

+ 4 - 3
src/jfw/front/supsearch.go

@@ -348,17 +348,18 @@ func (p *Pcsearch) PcSearchIndex(module string) error {
 	noLoginBl := false
 	noLoginBl := false
 	if userId == "" {
 	if userId == "" {
 		//未登录用户访问全部信息类型 需要过滤掉 拟建
 		//未登录用户访问全部信息类型 需要过滤掉 拟建
-		if strings.Contains(subtype, "采购意向") {
+		// p397 未登录用户收回查看拟建权限
+		if strings.Contains(subtype, "采购意向") || strings.Contains(subtype, "拟建") {
 			var ss []string
 			var ss []string
 			for _, v := range strings.Split(subtype, ",") {
 			for _, v := range strings.Split(subtype, ",") {
-				if v != "采购意向" {
+				if v != "采购意向" && !strings.Contains(v, "拟建") {
 					ss = append(ss, v)
 					ss = append(ss, v)
 				}
 				}
 			}
 			}
 			subtype = strings.Join(ss, ",")
 			subtype = strings.Join(ss, ",")
 		}
 		}
 		if subtype == "" {
 		if subtype == "" {
-			subtype = "拟建,招标预告,招标公告,招标结果,招标信用信息"
+			subtype = "招标预告,招标公告,招标结果,招标信用信息"
 			noLoginBl = true
 			noLoginBl = true
 		}
 		}
 	}
 	}

+ 46 - 14
src/jfw/front/swordfish.go

@@ -115,17 +115,18 @@ func (m *Front) PcAjaxReq() {
 	}
 	}
 	if userId == "" {
 	if userId == "" {
 		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
 		//未登录用户访问全部信息类型 需要过滤掉 拟建和采购意向
-		if strings.Contains(subtype, "采购意向") {
+		// p397 未登录用户收回查看拟建权限
+		if strings.Contains(subtype, "采购意向") || strings.Contains(subtype, "拟建") {
 			var ss []string
 			var ss []string
 			for _, v := range strings.Split(subtype, ",") {
 			for _, v := range strings.Split(subtype, ",") {
-				if v != "采购意向" {
+				if v != "采购意向" && !strings.Contains(v, "拟建") {
 					ss = append(ss, v)
 					ss = append(ss, v)
 				}
 				}
 			}
 			}
 			subtype = strings.Join(ss, ",")
 			subtype = strings.Join(ss, ",")
 		}
 		}
 		if subtype == "" {
 		if subtype == "" {
-			subtype = "拟建,招标预告,招标公告,招标结果,招标信用信息"
+			subtype = "招标预告,招标公告,招标结果,招标信用信息"
 		}
 		}
 
 
 	}
 	}
@@ -766,7 +767,7 @@ func ObjData(isPayUser bool, sid, content string, lent int) (t bool, obj map[str
 
 
 // pc三级页跳转
 // pc三级页跳转
 // 20170821增加查询字段s_subscopeclass
 // 20170821增加查询字段s_subscopeclass
-func pcVRT(sid, industry, content string, isPayUser bool) (po, bo, wo []map[string]interface{}, objdata map[string]interface{}) {
+func pcVRT(sid, industry, content string, isPayUser bool, isLogin bool) (po, bo, wo []map[string]interface{}, objdata map[string]interface{}) {
 	defer util.Catch()
 	defer util.Catch()
 	var projectOther, buyerOther, winnerOther []map[string]interface{}
 	var projectOther, buyerOther, winnerOther []map[string]interface{}
 	if len(sid) > 5 {
 	if len(sid) > 5 {
@@ -814,26 +815,44 @@ func pcVRT(sid, industry, content string, isPayUser bool) (po, bo, wo []map[stri
 				if util.IntAll(config.Sysconfig["biddingRelatesLevel"]) > 0 && (!isPayUser || content == "bdcontent" || content == "advancedProject") {
 				if util.IntAll(config.Sysconfig["biddingRelatesLevel"]) > 0 && (!isPayUser || content == "bdcontent" || content == "advancedProject") {
 					return nil //elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
 					return nil //elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
 				}
 				}
-				return elastic.GetPage("bidding", "bidding", queryStr, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
+				return elastic.Get("bidding", "bidding", queryStr)
+				//, bidSearch_sort, `"_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"`, 0, 11)
+			}
+			// p397 收回未登录查看拟建权限调整
+			mustNotStr := ""
+			if isLogin {
+				mustNotStr = ""
+			} else {
+				mustNotStr = `{"terms":{"subtype":["采购意向","拟建"]}}`
 			}
 			}
+			baseQuery := `{"query":{"bool":{"must":%s,"must_not":[` + mustNotStr + `]}},"sort":[{"dataweight":"desc","publishtime":"desc"}],"size":11,"_source":["_id","title","publishtime","toptype","subtype","type","area","href","s_subscopeclass","spidercode","site"]}`
 			//同一个项目的其他招标信息
 			//同一个项目的其他招标信息
 			projectName, _ := obj["projectname"].(string)
 			projectName, _ := obj["projectname"].(string)
 			projectCode, _ := obj["projectcode"].(string)
 			projectCode, _ := obj["projectcode"].(string)
 			if projectName != "" || projectCode != "" {
 			if projectName != "" || projectCode != "" {
-				projectNameCode := fmt.Sprintf("projectNameCode_%s_%s_%s", projectName, projectCode, util.If(isPayUser, "pay", "free"))
+				// p397 收回未登录查看拟建权限调整
+				// 缓存登录和未登录分开存 因为未登录的不查拟建采购意向
+				projectNameCode := ""
+				if isLogin {
+					projectNameCode = fmt.Sprintf("projectNameCode_%s_%s_%s", projectName, projectCode, util.If(isPayUser, "pay", "free"))
+				} else {
+					projectNameCode = fmt.Sprintf("projectNameCode_%s_%s_noLogin", projectName, projectCode)
+				}
 				projectOther = EntAssociated(projectNameCode)
 				projectOther = EntAssociated(projectNameCode)
 				if projectOther == nil {
 				if projectOther == nil {
+					tmpQuery := ""
 					if projectName != "" && projectCode != "" {
 					if projectName != "" && projectCode != "" {
 						projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
 						projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
 						projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
 						projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
-						queryStr = `{"$or":[{"TERM_projectname":"` + projectName + `"},{"TERM_projectcode":"` + projectCode + `"}]}`
+						tmpQuery = fmt.Sprintf(`{"bool": {"should": [{"term": {"projectname": "%s"}}, {"term": {"projectcode": "%s"}}]}}`, projectName, projectCode)
 					} else if projectName != "" && projectCode == "" {
 					} else if projectName != "" && projectCode == "" {
 						projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
 						projectName = strings.ReplaceAll(projectName, "\"", "###剑鱼###")
-						queryStr = `{"TERM_projectname":"` + projectName + `"}`
+						tmpQuery = `{"term":{"projectname":"` + projectName + `"}}`
 					} else if projectName == "" && projectCode != "" {
 					} else if projectName == "" && projectCode != "" {
 						projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
 						projectCode = strings.ReplaceAll(projectCode, "\"", "###剑鱼###")
-						queryStr = `{"TERM_projectcode":"` + projectCode + `"}`
+						tmpQuery = `{"term":{"projectcode":"` + projectCode + `"}}`
 					}
 					}
+					queryStr = fmt.Sprintf(baseQuery, tmpQuery)
 					projectOther = bidDataConvert(sid, commonQuery(queryStr))
 					projectOther = bidDataConvert(sid, commonQuery(queryStr))
 					if projectOther != nil && len(projectOther) > 0 {
 					if projectOther != nil && len(projectOther) > 0 {
 						if bytes, err := json.Marshal(projectOther); err == nil && len(bytes) > 0 {
 						if bytes, err := json.Marshal(projectOther); err == nil && len(bytes) > 0 {
@@ -845,10 +864,17 @@ func pcVRT(sid, industry, content string, isPayUser bool) (po, bo, wo []map[stri
 			//同一个业主最近的其他招标信息
 			//同一个业主最近的其他招标信息
 			buyer, _ := obj["buyer"].(string) //采购单位
 			buyer, _ := obj["buyer"].(string) //采购单位
 			if buyer != "" {
 			if buyer != "" {
-				buyerNameOther := fmt.Sprintf("buyerNameOther_%s_%s", buyer, util.If(isPayUser, "pay", "free"))
+				// P397 调整
+				buyerNameOther := ""
+				if isLogin {
+					buyerNameOther = fmt.Sprintf("buyerNameOther_%s_%s", buyer, util.If(isPayUser, "pay", "free"))
+				} else {
+					buyerNameOther = fmt.Sprintf("buyerNameOther_%s_noLogin", buyer)
+				}
 				buyerOther = EntAssociated(buyerNameOther)
 				buyerOther = EntAssociated(buyerNameOther)
 				if buyerOther == nil {
 				if buyerOther == nil {
-					queryStr = `{"TERM_buyer":"` + buyer + `"}`
+					tmpQuery := `[{"term":{"buyer":"` + buyer + `"}}]`
+					queryStr = fmt.Sprintf(baseQuery, tmpQuery)
 					buyerOther = bidDataConvert(sid, commonQuery(queryStr))
 					buyerOther = bidDataConvert(sid, commonQuery(queryStr))
 					if buyerOther != nil && len(buyerOther) > 0 {
 					if buyerOther != nil && len(buyerOther) > 0 {
 						if bytes, err := json.Marshal(buyerOther); err == nil && len(bytes) > 0 {
 						if bytes, err := json.Marshal(buyerOther); err == nil && len(bytes) > 0 {
@@ -860,10 +886,16 @@ func pcVRT(sid, industry, content string, isPayUser bool) (po, bo, wo []map[stri
 			//同一中标人最近中标的其他信息
 			//同一中标人最近中标的其他信息
 			winner, _ := obj["winner"].(string) //中标人
 			winner, _ := obj["winner"].(string) //中标人
 			if winner != "" {
 			if winner != "" {
-				winnerNameOther := fmt.Sprintf("winnerNameOther_%s_%s", winner, util.If(isPayUser, "pay", "free"))
+				winnerNameOther := ""
+				if isLogin {
+					winnerNameOther = fmt.Sprintf("winnerNameOther_%s_%s", winner, util.If(isPayUser, "pay", "free"))
+				} else {
+					winnerNameOther = fmt.Sprintf("winnerNameOther_%s_noLogin", winner)
+				}
 				winnerOther = EntAssociated(winnerNameOther)
 				winnerOther = EntAssociated(winnerNameOther)
 				if winnerOther == nil {
 				if winnerOther == nil {
-					queryStr = `{"TERM_s_winner":"` + winner + `"}`
+					tmpQuery := `[{"term":{"s_winner":"` + winner + `"}}]`
+					queryStr = fmt.Sprintf(baseQuery, tmpQuery)
 					winnerOther = bidDataConvert(sid, commonQuery(queryStr))
 					winnerOther = bidDataConvert(sid, commonQuery(queryStr))
 					if winnerOther != nil && len(winnerOther) > 0 {
 					if winnerOther != nil && len(winnerOther) > 0 {
 						if bytes, err := json.Marshal(winnerOther); err == nil && len(bytes) > 0 {
 						if bytes, err := json.Marshal(winnerOther); err == nil && len(bytes) > 0 {
@@ -961,7 +993,7 @@ func (m *Front) PcVisitRedirect(sid string) {
 		if href != "" && !strings.HasPrefix(href, "http") {
 		if href != "" && !strings.HasPrefix(href, "http") {
 			href = "http://" + href
 			href = "http://" + href
 		}
 		}
-		po, bo, wo, obj := pcVRT(sid, "", "", true)
+		po, bo, wo, obj := pcVRT(sid, "", "", true, true)
 		if obj != nil && len(obj) > 0 {
 		if obj != nil && len(obj) > 0 {
 			if len(po) > 0 {
 			if len(po) > 0 {
 				m.T["projectOther"] = po
 				m.T["projectOther"] = po

+ 745 - 742
src/jfw/front/tags.go

@@ -1,37 +1,37 @@
 package front
 package front
 
 
 import (
 import (
-    "context"
-    "fmt"
-    "jy/src/jfw/config"
-    "jy/src/jfw/jyutil"
-    "jy/src/jfw/paging"
-    "log"
-    "math"
-    "math/rand"
-    "net/http"
-    "strconv"
-    "strings"
-    "time"
-
-    qu "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jybase/date"
-    "app.yhyue.com/moapp/jybase/encrypt"
-    elastic "app.yhyue.com/moapp/jybase/es"
-    "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
-    "app.yhyue.com/moapp/jybase/redis"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
-    "app.yhyue.com/moapp/jypkg/public"
+	"context"
+	"fmt"
+	"jy/src/jfw/config"
+	"jy/src/jfw/jyutil"
+	"jy/src/jfw/paging"
+	"log"
+	"math"
+	"math/rand"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+
+	qu "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/bidsearch"
+	"app.yhyue.com/moapp/jypkg/public"
 )
 )
 
 
 const cacheTime = 60 * 60 * 8
 const cacheTime = 60 * 60 * 8
 
 
 // 剑鱼标签页
 // 剑鱼标签页
 type Tags struct {
 type Tags struct {
-    *xweb.Action
-    // searchResult xweb.Mapper `xweb:"/list/(\\w+)/(\\w+).html"` //剑鱼标讯分类 地区结果列表
-    index xweb.Mapper `xweb:"/tags/(\\w+)/(\\w+).html"`
+	*xweb.Action
+	// searchResult xweb.Mapper `xweb:"/list/(\\w+)/(\\w+).html"` //剑鱼标讯分类 地区结果列表
+	index xweb.Mapper `xweb:"/tags/(\\w+)/(\\w+).html"`
 }
 }
 
 
 var LetterArr = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
 var LetterArr = []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
@@ -40,29 +40,29 @@ var bidField = `"_id","site","title","publishtime","toptype","subtype","type","a
 var seoBidField = `"_id","title","publishtime","subtype","area","href","bidamount","budget","s_subscopeclass","projectname"`
 var seoBidField = `"_id","title","publishtime","subtype","area","href","bidamount","budget","s_subscopeclass","projectname"`
 
 
 type reqLimit struct {
 type reqLimit struct {
-    doPool   chan struct{}
-    waitPool chan struct{}
+	doPool   chan struct{}
+	waitPool chan struct{}
 }
 }
 
 
 var reqLimitInit *reqLimit
 var reqLimitInit *reqLimit
 
 
 func init() {
 func init() {
-    xweb.AddAction(&Tags{})
-    do := qu.IntAll(config.Sysconfig["executionNum"])
-    wait := qu.IntAll(config.Sysconfig["awaitNum"])
-    //创建执行池 等待池
-    doPool := make(chan struct{}, do)
-    for i := 0; i < do; i++ {
-        doPool <- struct{}{}
-    }
-    waitPool := make(chan struct{}, wait)
-    for i := 0; i < wait; i++ {
-        waitPool <- struct{}{}
-    }
-    reqLimitInit = &reqLimit{
-        doPool:   doPool,
-        waitPool: waitPool,
-    }
+	xweb.AddAction(&Tags{})
+	do := qu.IntAll(config.Sysconfig["executionNum"])
+	wait := qu.IntAll(config.Sysconfig["awaitNum"])
+	//创建执行池 等待池
+	doPool := make(chan struct{}, do)
+	for i := 0; i < do; i++ {
+		doPool <- struct{}{}
+	}
+	waitPool := make(chan struct{}, wait)
+	for i := 0; i < wait; i++ {
+		waitPool <- struct{}{}
+	}
+	reqLimitInit = &reqLimit{
+		doPool:   doPool,
+		waitPool: waitPool,
+	}
 }
 }
 
 
 /*
 /*
@@ -73,252 +73,253 @@ func init() {
 */
 */
 
 
 func (this *Tags) Index(types, name string) {
 func (this *Tags) Index(types, name string) {
-    defer qu.Catch()
-    info := strings.Split(name, "_")
-    checkedInfoType := "all" //选择的信息类型
-    checkedArea := "all"     //选择的地区
-    checkedProvince, checkedCity := "", ""
-    checkedIndustry := "all"                          //选择的行业 一级
-    checkedIndustry_2 := ""                           //选择的行业 二级
-    checkedLetter := "all"                            //选择的字母
-    checkedSite := ""                                 //选择的站点名称
-    checkedKeywords := ""                             //选择的关键词
-    haveList := false                                 //用于判断是否有bidding数据
-    filters := map[string]interface{}{}               //用于前端展示高亮的
-    keywordSuffix := ""                               //关键词后缀
-    areaHref := "/tags/area/all_%v.html"              //用于拼接省份跳转地址
-    industryHref := "/tags/industry/all_all_all.html" //用于拼接行业跳转地址
-    if len(info) > 2 {
-        checkedInfoType = info[2]
-        haveList = true
-    }
-    if len(info) >= 2 {
-        checkedIndustry = info[0]
-        checkedArea = info[1]
-    }
-    crumbsNav1, crumbsNav2 := map[string]interface{}{}, map[string]interface{}{} //面包屑导航1,面包屑导航2
-    pageNum := 0
-    //获取seo地区对应关系
-    provinceArr, cityArr, _, _, AreaCodeToName, _ := this.GetSEOArea()
-    //获取seo站点名称对应关系
-    bidPlatformNameToCode, bidPlatformCodeToName := GetBiddingPlatformType()
-    //判断是哪个省份城市
-    if checkedArea != "all" {
-        //获取seo的对应关系
-        i_area, _ := strconv.Atoi(checkedArea)
-        s_area := AreaCodeToName[int64(i_area)]
-        this.T["area"] = s_area
-        if IsInArr(provinceArr, s_area) {
-            checkedProvince = s_area
-        }
-        if IsInArr(cityArr, s_area) {
-            checkedCity = s_area
-        }
-    } else {
-        this.T["area"] = "全国"
-    }
-
-    if checkedIndustry == "all" {
-        checkedIndustry = ""
-    }
-    filters["area"] = this.T["area"]
-
-    InfoType, filterInfoType := this.GetInfoType(checkedInfoType)
-    infotypeStr := ""
-    if checkedInfoType != "all" {
-        filters["stype"] = filterInfoType
-        infotypeStr = filterInfoType
-    } else {
-        filters["stype"] = "全部"
-    }
-    //类型
-    switch types {
-    case "area":
-        crumbsNav1 = map[string]interface{}{
-            "name": "招标地区分类",
-            "url":  "/tags/area/all.html",
-        }
-        if len(info) >= 4 { //length大于4 说明为标签详情页
-            i_site, _ := strconv.Atoi(info[3])
-            site := bidPlatformCodeToName[int64(i_site)]
-            checkedSite = qu.ObjToString(this.T["area"]) + site
-
-            crumbsNav2 = map[string]interface{}{
-                "name": qu.ObjToString(this.T["area"]) + site + infotypeStr,
-            }
-            checkedKeywords = site
-        }
-        filters["keywords"] = qu.If(checkedSite != "", checkedSite, this.T["area"])
-        //便利获取地区招标标签词
-        areaPlatform := []map[string]interface{}{}
-        for _, v := range qu.ObjArrToStringArr(config.Seoconfig["areaSite"].([]interface{})) {
-            area := qu.ObjToString(this.T["area"])
-            areaPlatform = append(areaPlatform, map[string]interface{}{
-                "name": fmt.Sprintf("%s%s", area, v),
-                "url":  fmt.Sprintf("/tags/area/all_%v_all_%v.html", checkedArea, bidPlatformNameToCode[v]),
-            })
-        }
-        if len(info) == 4 {
-            areaHref = fmt.Sprintf("/tags/area/%v_%v_%v_%v.html", info[0], "%v", info[2], info[3])
-        } else if len(info) == 3 {
-            areaHref = fmt.Sprintf("/tags/area/%v_%v_%v.html", info[0], "%v", info[2])
-        }
-        this.T["areaPlatformWordsList"] = areaPlatform
-    case "letter":
-        //只有两位时,默认为汇总页,大于两位为标签页
-        if len(info) == 2 {
-            checkedLetter = info[0]
-            pageNum, _ = strconv.Atoi(info[1])
-            //按字母分类
-            this.T["letterList"], this.T["letterListCount"], this.T["pagingMap"] = this.GetLetterPaging(pageNum, checkedLetter)
-        } else if len(info) > 3 {
-            checkedLetter = info[3]
-            checkedKeywordsId := info[4]
-            checkedKeywords, keywordSuffix = this.GetSeoKeyWords(checkedKeywordsId)
-            areaHref = fmt.Sprintf("/tags/letter/all_%s_%s_%s_%s", "%v", checkedInfoType, checkedLetter, checkedKeywordsId)
-            filters["keywords"] = checkedKeywords
-        }
-        filters["letter"] = checkedLetter
-        crumbsNav1 = map[string]interface{}{
-            "name": fmt.Sprintf("招标采购%s类汇总", qu.If(checkedLetter == "all", "全部", checkedLetter)),
-            "url":  fmt.Sprintf("/tags/letter/%s_1.html", checkedLetter),
-        }
-        crumbsNav2 = map[string]interface{}{
-            "name": checkedKeywords + keywordSuffix,
-        }
-    //行业_地区_信息类型
-    case "industry":
-        //areaHref = fmt.Sprintf("/tags/industry/all_%s_all.html", "%v")
-        if len(info) > 3 {
-            checkedKeywords, checkedIndustry, checkedIndustry_2 = this.GetInsturyKeywords(info[3])
-            crumbsNav2 = map[string]interface{}{
-                // "name": qu.ObjToString(this.T["area"]) + checkedIndustry + checkedKeywords,
-                "name": qu.ObjToString(this.T["area"]) + checkedKeywords + qu.ObjToString(config.Seoconfig["seoKeywordSuffix"]) + infotypeStr,
-            }
-            filters["industry"] = checkedIndustry
-            filters["keywords"] = checkedKeywords
-            areaHref = fmt.Sprintf("/tags/industry/%s_%s_%s_%s.html", info[0], "%v", info[2], info[3])
-            industryHref = fmt.Sprintf("/tags/industry/%s_%s_%s_%s.html", "%v", info[1], info[3], "%v")
-            checkedIndustry += "_" + checkedIndustry_2
-        } else {
-            haveList = false
-            areaHref = fmt.Sprintf("/tags/industry/%s_%s_all.html", info[0], "%v")
-            industryHref = fmt.Sprintf("/tags/industry/%s_%s_all_%s.html", "%v", checkedArea, "%v")
-            //行业标签获取
-            this.T["industryList"] = this.GetIndustry(industryHref) //需要根据地区获取不同的标的物
-        }
-        crumbsNav1 = map[string]interface{}{
-            "name": fmt.Sprintf("招标行业分类"),
-            "url":  fmt.Sprintf("/tags/industry/all.html"),
-        }
-    }
-    //地区标签获取
-    this.T["areaList"] = this.GetArea(areaHref)
-
-    //标的物标签获取
-
-    //字母表获取
-    this.T["alphabet"] = this.GetAlphabet()
-    //老的按地域、按信息类型、热门招标
-    //前端需要跳转的路由
-    //for _, v := range []int{1, 2, 3} {
-    //	this.T[fmt.Sprintf("labUrl_%d", v)] = GetLabUrl(v) //1地域 2信息类型 3热门招标
-    //}
-    //右侧模块 最新招投标信息
-    this.T["newBidInfoList"] = this.GetNewBidInfo()
-
-    //右侧模块 行业咨询
-    this.T["industryInfoList"] = this.GetConsult()
-
-    //右侧模块 热词
-    this.T["hotLabelList"] = this.GetHotLabel(30)
-
-    //猜你喜欢
-    this.T["guessLikeList"] = this.GetHotLabel(60)
-    //信息类型
-    thisUrl := this.Url()
-    log.Println(strings.Split(thisUrl, "/"))
-    thisUrlArr := strings.Split(thisUrl, "/")
-    stypeHref := "/" + thisUrlArr[1] + "/" + thisUrlArr[2] + "/"
-    if url2 := strings.Split(thisUrlArr[3], "_"); len(url2) > 2 {
-        url2[2] = "%v"
-        for k, v := range url2 {
-            if k != 0 {
-                stypeHref += "_"
-            }
-            stypeHref += v
-        }
-        if !strings.Contains(stypeHref, ".html") {
-            stypeHref += ".html"
-        }
-    }
-    this.T["stypeList"] = this.GetStype(stypeHref)
-    this.T["selectorAll"] = map[string]interface{}{
-        "area":     fmt.Sprintf(areaHref, "all"),
-        "infoType": fmt.Sprintf(stypeHref, "all"),
-    }
-    //TDK
-    this.T["tdk"] = this.GetTDK(haveList, types, checkedKeywords, pageNum, checkedLetter, qu.ObjToString(this.T["area"])+checkedKeywords, qu.ObjToString(this.T["area"])+checkedKeywords+infotypeStr, checkedKeywords, filterInfoType)
-    if haveList {
-        //信息类型
-        isLimit := false
-        this.T["biddingList"], this.T["biddingCount"], isLimit = this.GetBidding(checkedIndustry, checkedProvince, checkedCity, InfoType, checkedKeywords, this.Request, this.ResponseWriter, this.Session())
-        if isLimit {
-            this.Redirect("/504.html")
-            return
-        }
-        filters["biddingCount"] = this.T["biddingCount"]
-        if qu.Int64All(this.T["biddingCount"]) == 0 && types == "letter" {
-            this.T["letterList"], this.T["letterListCount"], this.T["pagingMap"] = this.GetLetterPaging(pageNum, checkedLetter)
-        }
-    }
-    this.T["crumbsNav1"], this.T["crumbsNav2"] = crumbsNav1, crumbsNav2
-
-    filters["searchKeywords"] = checkedKeywords
-    this.T["type"] = types
-    this.T["haveList"] = haveList
-    this.T["downLoadQr"] = "https://www.jianyu360.cn/front/downloadJyApp/qr?page=pc_seo&source=pc_scan"
-    this.T["url"] = this.Url()
-    this.T["filters"] = filters
-    this.T["nologin"] = qu.ObjToString(this.GetSession("userId")) == ""
-    this.T["simpleTemplateData"] = map[string]interface{}{
-        "filters":  filters,
-        "haveList": haveList,
-        "type":     types,
-    }
-    this.Render("/pc/tags/index.html", &this.T)
+	defer qu.Catch()
+	info := strings.Split(name, "_")
+	checkedInfoType := "all" //选择的信息类型
+	checkedArea := "all"     //选择的地区
+	checkedProvince, checkedCity := "", ""
+	checkedIndustry := "all"                          //选择的行业 一级
+	checkedIndustry_2 := ""                           //选择的行业 二级
+	checkedLetter := "all"                            //选择的字母
+	checkedSite := ""                                 //选择的站点名称
+	checkedKeywords := ""                             //选择的关键词
+	haveList := false                                 //用于判断是否有bidding数据
+	filters := map[string]interface{}{}               //用于前端展示高亮的
+	keywordSuffix := ""                               //关键词后缀
+	areaHref := "/tags/area/all_%v.html"              //用于拼接省份跳转地址
+	industryHref := "/tags/industry/all_all_all.html" //用于拼接行业跳转地址
+	if len(info) > 2 {
+		checkedInfoType = info[2]
+		if checkedInfoType == "1" { // 1是拟建  p397 页面上已经没有入口了,在接口里面再过滤一下
+			checkedInfoType = "all"
+		}
+		haveList = true
+	}
+	if len(info) >= 2 {
+		checkedIndustry = info[0]
+		checkedArea = info[1]
+	}
+	crumbsNav1, crumbsNav2 := map[string]interface{}{}, map[string]interface{}{} //面包屑导航1,面包屑导航2
+	pageNum := 0
+	//获取seo地区对应关系
+	provinceArr, cityArr, _, _, AreaCodeToName, _ := this.GetSEOArea()
+	//获取seo站点名称对应关系
+	bidPlatformNameToCode, bidPlatformCodeToName := GetBiddingPlatformType()
+	//判断是哪个省份城市
+	if checkedArea != "all" {
+		//获取seo的对应关系
+		i_area, _ := strconv.Atoi(checkedArea)
+		s_area := AreaCodeToName[int64(i_area)]
+		this.T["area"] = s_area
+		if IsInArr(provinceArr, s_area) {
+			checkedProvince = s_area
+		}
+		if IsInArr(cityArr, s_area) {
+			checkedCity = s_area
+		}
+	} else {
+		this.T["area"] = "全国"
+	}
+
+	if checkedIndustry == "all" {
+		checkedIndustry = ""
+	}
+	filters["area"] = this.T["area"]
+	InfoType, filterInfoType := this.GetInfoType(checkedInfoType)
+	infotypeStr := ""
+	if checkedInfoType != "all" {
+		filters["stype"] = filterInfoType
+		infotypeStr = filterInfoType
+	} else {
+		filters["stype"] = "全部"
+	}
+	//类型
+	switch types {
+	case "area":
+		crumbsNav1 = map[string]interface{}{
+			"name": "招标地区分类",
+			"url":  "/tags/area/all.html",
+		}
+		if len(info) >= 4 { //length大于4 说明为标签详情页
+			i_site, _ := strconv.Atoi(info[3])
+			site := bidPlatformCodeToName[int64(i_site)]
+			checkedSite = qu.ObjToString(this.T["area"]) + site
+
+			crumbsNav2 = map[string]interface{}{
+				"name": qu.ObjToString(this.T["area"]) + site + infotypeStr,
+			}
+			checkedKeywords = site
+		}
+		filters["keywords"] = qu.If(checkedSite != "", checkedSite, this.T["area"])
+		//便利获取地区招标标签词
+		areaPlatform := []map[string]interface{}{}
+		for _, v := range qu.ObjArrToStringArr(config.Seoconfig["areaSite"].([]interface{})) {
+			area := qu.ObjToString(this.T["area"])
+			areaPlatform = append(areaPlatform, map[string]interface{}{
+				"name": fmt.Sprintf("%s%s", area, v),
+				"url":  fmt.Sprintf("/tags/area/all_%v_all_%v.html", checkedArea, bidPlatformNameToCode[v]),
+			})
+		}
+		if len(info) == 4 {
+			areaHref = fmt.Sprintf("/tags/area/%v_%v_%v_%v.html", info[0], "%v", info[2], info[3])
+		} else if len(info) == 3 {
+			areaHref = fmt.Sprintf("/tags/area/%v_%v_%v.html", info[0], "%v", info[2])
+		}
+		this.T["areaPlatformWordsList"] = areaPlatform
+	case "letter":
+		//只有两位时,默认为汇总页,大于两位为标签页
+		if len(info) == 2 {
+			checkedLetter = info[0]
+			pageNum, _ = strconv.Atoi(info[1])
+			//按字母分类
+			this.T["letterList"], this.T["letterListCount"], this.T["pagingMap"] = this.GetLetterPaging(pageNum, checkedLetter)
+		} else if len(info) > 3 {
+			checkedLetter = info[3]
+			checkedKeywordsId := info[4]
+			checkedKeywords, keywordSuffix = this.GetSeoKeyWords(checkedKeywordsId)
+			areaHref = fmt.Sprintf("/tags/letter/all_%s_%s_%s_%s", "%v", checkedInfoType, checkedLetter, checkedKeywordsId)
+			filters["keywords"] = checkedKeywords
+		}
+		filters["letter"] = checkedLetter
+		crumbsNav1 = map[string]interface{}{
+			"name": fmt.Sprintf("招标采购%s类汇总", qu.If(checkedLetter == "all", "全部", checkedLetter)),
+			"url":  fmt.Sprintf("/tags/letter/%s_1.html", checkedLetter),
+		}
+		crumbsNav2 = map[string]interface{}{
+			"name": checkedKeywords + keywordSuffix,
+		}
+	//行业_地区_信息类型
+	case "industry":
+		//areaHref = fmt.Sprintf("/tags/industry/all_%s_all.html", "%v")
+		if len(info) > 3 {
+			checkedKeywords, checkedIndustry, checkedIndustry_2 = this.GetInsturyKeywords(info[3])
+			crumbsNav2 = map[string]interface{}{
+				// "name": qu.ObjToString(this.T["area"]) + checkedIndustry + checkedKeywords,
+				"name": qu.ObjToString(this.T["area"]) + checkedKeywords + qu.ObjToString(config.Seoconfig["seoKeywordSuffix"]) + infotypeStr,
+			}
+			filters["industry"] = checkedIndustry
+			filters["keywords"] = checkedKeywords
+			areaHref = fmt.Sprintf("/tags/industry/%s_%s_%s_%s.html", info[0], "%v", info[2], info[3])
+			industryHref = fmt.Sprintf("/tags/industry/%s_%s_%s_%s.html", "%v", info[1], info[3], "%v")
+			checkedIndustry += "_" + checkedIndustry_2
+		} else {
+			haveList = false
+			areaHref = fmt.Sprintf("/tags/industry/%s_%s_all.html", info[0], "%v")
+			industryHref = fmt.Sprintf("/tags/industry/%s_%s_all_%s.html", "%v", checkedArea, "%v")
+			//行业标签获取
+			this.T["industryList"] = this.GetIndustry(industryHref) //需要根据地区获取不同的标的物
+		}
+		crumbsNav1 = map[string]interface{}{
+			"name": fmt.Sprintf("招标行业分类"),
+			"url":  fmt.Sprintf("/tags/industry/all.html"),
+		}
+	}
+	//地区标签获取
+	this.T["areaList"] = this.GetArea(areaHref)
+
+	//标的物标签获取
+
+	//字母表获取
+	this.T["alphabet"] = this.GetAlphabet()
+	//老的按地域、按信息类型、热门招标
+	//前端需要跳转的路由
+	//for _, v := range []int{1, 2, 3} {
+	//	this.T[fmt.Sprintf("labUrl_%d", v)] = GetLabUrl(v) //1地域 2信息类型 3热门招标
+	//}
+	//右侧模块 最新招投标信息
+	this.T["newBidInfoList"] = this.GetNewBidInfo()
+
+	//右侧模块 行业咨询
+	this.T["industryInfoList"] = this.GetConsult()
+
+	//右侧模块 热词
+	this.T["hotLabelList"] = this.GetHotLabel(30)
+
+	//猜你喜欢
+	this.T["guessLikeList"] = this.GetHotLabel(60)
+	//信息类型
+	thisUrl := this.Url()
+	log.Println(strings.Split(thisUrl, "/"))
+	thisUrlArr := strings.Split(thisUrl, "/")
+	stypeHref := "/" + thisUrlArr[1] + "/" + thisUrlArr[2] + "/"
+	if url2 := strings.Split(thisUrlArr[3], "_"); len(url2) > 2 {
+		url2[2] = "%v"
+		for k, v := range url2 {
+			if k != 0 {
+				stypeHref += "_"
+			}
+			stypeHref += v
+		}
+		if !strings.Contains(stypeHref, ".html") {
+			stypeHref += ".html"
+		}
+	}
+	this.T["stypeList"] = this.GetStype(stypeHref)
+	this.T["selectorAll"] = map[string]interface{}{
+		"area":     fmt.Sprintf(areaHref, "all"),
+		"infoType": fmt.Sprintf(stypeHref, "all"),
+	}
+	//TDK
+	this.T["tdk"] = this.GetTDK(haveList, types, checkedKeywords, pageNum, checkedLetter, qu.ObjToString(this.T["area"])+checkedKeywords, qu.ObjToString(this.T["area"])+checkedKeywords+infotypeStr, checkedKeywords, filterInfoType)
+	if haveList {
+		//信息类型
+		isLimit := false
+		this.T["biddingList"], this.T["biddingCount"], isLimit = this.GetBidding(checkedIndustry, checkedProvince, checkedCity, InfoType, checkedKeywords, this.Request, this.ResponseWriter, this.Session())
+		if isLimit {
+			this.Redirect("/504.html")
+			return
+		}
+		filters["biddingCount"] = this.T["biddingCount"]
+		if qu.Int64All(this.T["biddingCount"]) == 0 && types == "letter" {
+			this.T["letterList"], this.T["letterListCount"], this.T["pagingMap"] = this.GetLetterPaging(pageNum, checkedLetter)
+		}
+	}
+	this.T["crumbsNav1"], this.T["crumbsNav2"] = crumbsNav1, crumbsNav2
+	filters["searchKeywords"] = checkedKeywords
+	this.T["type"] = types
+	this.T["haveList"] = haveList
+	this.T["downLoadQr"] = "https://www.jianyu360.cn/front/downloadJyApp/qr?page=pc_seo&source=pc_scan"
+	this.T["url"] = this.Url()
+	this.T["filters"] = filters
+	this.T["nologin"] = qu.ObjToString(this.GetSession("userId")) == ""
+	this.T["simpleTemplateData"] = map[string]interface{}{
+		"filters":  filters,
+		"haveList": haveList,
+		"type":     types,
+	}
+	this.Render("/pc/tags/index.html", &this.T)
 }
 }
 
 
 // 标签行业获取
 // 标签行业获取
 // 地区汇总页:"/tags/area/all_%v_all.html"
 // 地区汇总页:"/tags/area/all_%v_all.html"
 func (this *Tags) GetArea(href string) []map[string]interface{} {
 func (this *Tags) GetArea(href string) []map[string]interface{} {
-    m := []map[string]interface{}{}
-    provinceArr, _, _, nameToCode, codeToName, codeArr := this.GetSEOArea()
-
-    //组成省市县的map
-    for _, v := range provinceArr {
-        cityMap := []map[string]interface{}{}
-        for _, vv := range codeArr[nameToCode[v]] {
-            districtMap := []map[string]interface{}{}
-            for _, vvv := range codeArr[vv] {
-                districtMap = append(districtMap, map[string]interface{}{
-                    "name": codeToName[vvv],
-                    "url":  fmt.Sprintf(href, vvv),
-                })
-            }
-            cityMap = append(cityMap, map[string]interface{}{
-                "name": codeToName[vv],
-                "url":  fmt.Sprintf(href, vv),
-                "area": districtMap,
-            })
-        }
-        m = append(m, map[string]interface{}{
-            "name": v,
-            "url":  fmt.Sprintf(href, nameToCode[v]),
-            "area": cityMap,
-        })
-    }
-    return m
+	m := []map[string]interface{}{}
+	provinceArr, _, _, nameToCode, codeToName, codeArr := this.GetSEOArea()
+
+	//组成省市县的map
+	for _, v := range provinceArr {
+		cityMap := []map[string]interface{}{}
+		for _, vv := range codeArr[nameToCode[v]] {
+			districtMap := []map[string]interface{}{}
+			for _, vvv := range codeArr[vv] {
+				districtMap = append(districtMap, map[string]interface{}{
+					"name": codeToName[vvv],
+					"url":  fmt.Sprintf(href, vvv),
+				})
+			}
+			cityMap = append(cityMap, map[string]interface{}{
+				"name": codeToName[vv],
+				"url":  fmt.Sprintf(href, vv),
+				"area": districtMap,
+			})
+		}
+		m = append(m, map[string]interface{}{
+			"name": v,
+			"url":  fmt.Sprintf(href, nameToCode[v]),
+			"area": cityMap,
+		})
+	}
+	return m
 }
 }
 
 
 /*
 /*
@@ -330,534 +331,536 @@ codeToName  //根据code获取名称
 codeArr   //code 及 pcode的从属关系
 codeArr   //code 及 pcode的从属关系
 */
 */
 func (this *Tags) GetSEOArea() (provinceArr, cityArr, districtArr []string, nameToCode map[string]int64, codeToName map[int64]string, codeArr map[int64][]int64) {
 func (this *Tags) GetSEOArea() (provinceArr, cityArr, districtArr []string, nameToCode map[string]int64, codeToName map[int64]string, codeArr map[int64][]int64) {
-    provinceArr = []string{}        //省份数组
-    cityArr = []string{}            //市数组
-    districtArr = []string{}        //区县数组
-    nameToCode = map[string]int64{} //根据名称获取code
-    codeToName = map[int64]string{} //根据code获取名称
-    codeArr = map[int64][]int64{}   //code 及 pcode的从属关系
-    data := []map[string]interface{}{}
-    rediskey := fmt.Sprintf("pcseo_area")
-    if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
-        data = qu.ObjArrToMapArr(l)
-    } else {
-        list := public.BaseMysql.SelectBySql(`select name,code,level,pcode from seo_words.seo_area order by code`)
-        //获取组合成必要参数
-        if list != nil && len(*list) > 0 {
-            redis.Put("seoCache", rediskey, *list, cacheTime)
-            data = *list
-        }
-    }
-    for _, v := range data {
-        name := qu.ObjToString(v["name"]) //名称
-        code := qu.Int64All(v["code"])    //行政区号
-        level := qu.Int64All(v["level"])
-        pcode := qu.Int64All(v["pcode"])
-        if level == 1 {
-            provinceArr = append(provinceArr, name)
-
-        } else if level == 2 {
-            cityArr = append(cityArr, name)
-        } else {
-            districtArr = append(districtArr, name)
-        }
-        nameToCode[name] = code
-        codeToName[code] = name
-        if pcode != 0 {
-            codeArr[pcode] = append(codeArr[pcode], code)
-        }
-    }
-    return
+	provinceArr = []string{}        //省份数组
+	cityArr = []string{}            //市数组
+	districtArr = []string{}        //区县数组
+	nameToCode = map[string]int64{} //根据名称获取code
+	codeToName = map[int64]string{} //根据code获取名称
+	codeArr = map[int64][]int64{}   //code 及 pcode的从属关系
+	data := []map[string]interface{}{}
+	rediskey := fmt.Sprintf("pcseo_area")
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+		data = qu.ObjArrToMapArr(l)
+	} else {
+		list := public.BaseMysql.SelectBySql(`select name,code,level,pcode from seo_words.seo_area order by code`)
+		//获取组合成必要参数
+		if list != nil && len(*list) > 0 {
+			redis.Put("seoCache", rediskey, *list, cacheTime)
+			data = *list
+		}
+	}
+	for _, v := range data {
+		name := qu.ObjToString(v["name"]) //名称
+		code := qu.Int64All(v["code"])    //行政区号
+		level := qu.Int64All(v["level"])
+		pcode := qu.Int64All(v["pcode"])
+		if level == 1 {
+			provinceArr = append(provinceArr, name)
+
+		} else if level == 2 {
+			cityArr = append(cityArr, name)
+		} else {
+			districtArr = append(districtArr, name)
+		}
+		nameToCode[name] = code
+		codeToName[code] = name
+		if pcode != 0 {
+			codeArr[pcode] = append(codeArr[pcode], code)
+		}
+	}
+	return
 }
 }
 
 
 // 获取字母表跳转
 // 获取字母表跳转
 func (this *Tags) GetAlphabet() []map[string]interface{} {
 func (this *Tags) GetAlphabet() []map[string]interface{} {
-    m := []map[string]interface{}{}
-    for _, v := range LetterArr {
-        m = append(m, map[string]interface{}{
-            "name": v,
-            "url":  fmt.Sprintf("/tags/letter/%s_1.html", v),
-        })
-    }
-    return m
+	m := []map[string]interface{}{}
+	for _, v := range LetterArr {
+		m = append(m, map[string]interface{}{
+			"name": v,
+			"url":  fmt.Sprintf("/tags/letter/%s_1.html", v),
+		})
+	}
+	return m
 }
 }
 
 
 func (this *Tags) GetkeysMap() []map[string][]map[string]interface{} {
 func (this *Tags) GetkeysMap() []map[string][]map[string]interface{} {
-    mar := []map[string][]map[string]interface{}{}
-    m := map[string][]map[string]interface{}{}
-    sortArr := qu.ObjArrToStringArr(config.Seoconfig["hotlabkeywordsSort"].([]interface{}))
-    data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_industry_class`)
-    if data != nil && len(*data) > 0 {
-        for _, v := range *data {
-            name := qu.ObjToString(v["name"])
-            id := qu.Int64All(v["id"])
-            r := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_industry where class_1 =? and state =1  limit 10`, name)
-            if r != nil && len(*r) > 0 {
-                for _, vv := range *r {
-                    name2 := qu.ObjToString(vv["name"])
-                    id2 := qu.Int64All(vv["id"])
-                    m[name] = append(m[name], map[string]interface{}{
-                        "key": name2,
-                        "url": fmt.Sprintf("/tags/industry/%v_all_all_%v.html", id, id2),
-                    })
-                }
-            }
-        }
-    }
-    for _, v := range sortArr {
-        mar = append(mar, map[string][]map[string]interface{}{v: m[v]})
-    }
-    return mar
+	mar := []map[string][]map[string]interface{}{}
+	m := map[string][]map[string]interface{}{}
+	sortArr := qu.ObjArrToStringArr(config.Seoconfig["hotlabkeywordsSort"].([]interface{}))
+	data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_industry_class`)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			name := qu.ObjToString(v["name"])
+			id := qu.Int64All(v["id"])
+			r := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_industry where class_1 =? and state =1  limit 10`, name)
+			if r != nil && len(*r) > 0 {
+				for _, vv := range *r {
+					name2 := qu.ObjToString(vv["name"])
+					id2 := qu.Int64All(vv["id"])
+					m[name] = append(m[name], map[string]interface{}{
+						"key": name2,
+						"url": fmt.Sprintf("/tags/industry/%v_all_all_%v.html", id, id2),
+					})
+				}
+			}
+		}
+	}
+	for _, v := range sortArr {
+		mar = append(mar, map[string][]map[string]interface{}{v: m[v]})
+	}
+	return mar
 }
 }
 
 
 func (this *Tags) GetIndustry(industryHref string) interface{} {
 func (this *Tags) GetIndustry(industryHref string) interface{} {
-    rediskey := fmt.Sprintf("pcindex_getIndustry_%s", industryHref)
-    if l := redis.Get("seoCache", rediskey); l != nil {
-        return l
-    } else {
-        data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.state =1 and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
-        industryArr := []string{}
-        industryMap := map[string][]map[string]interface{}{}
-        if len(*data) > 0 && data != nil {
-            for _, v := range *data {
-                class := qu.ObjToString(v["class_1"])
-                name := qu.ObjToString(v["name"])
-                id := qu.Int64All(v["id"])
-                industryId := qu.Int64All(v["class_id"])
-                if !IsInArr(industryArr, class) {
-                    industryArr = append(industryArr, class)
-                }
-                industryMap[class] = append(industryMap[class], map[string]interface{}{
-                    "name": name + qu.ObjToString(config.Seoconfig["seoKeywordSuffix"]),
-                    // "url":  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", industryId, id),
-                    "url": fmt.Sprintf(industryHref, industryId, id),
-                })
-            }
-        }
-        m := []map[string][]map[string]interface{}{}
-        //
-        for _, v := range industryArr {
-            m = append(m, map[string][]map[string]interface{}{
-                v: industryMap[v],
-            })
-        }
-        redis.Put("seoCache", rediskey, m, cacheTime)
-        return m
-    }
+	rediskey := fmt.Sprintf("pcindex_getIndustry_%s", industryHref)
+	if l := redis.Get("seoCache", rediskey); l != nil {
+		return l
+	} else {
+		data := public.BaseMysql.SelectBySql(`select a.id,a.name,b.id class_id,b.name class_1 from seo_words.seo_industry a inner join  seo_words.seo_industry_class b on a.state =1 and a.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
+		industryArr := []string{}
+		industryMap := map[string][]map[string]interface{}{}
+		if len(*data) > 0 && data != nil {
+			for _, v := range *data {
+				class := qu.ObjToString(v["class_1"])
+				name := qu.ObjToString(v["name"])
+				id := qu.Int64All(v["id"])
+				industryId := qu.Int64All(v["class_id"])
+				if !IsInArr(industryArr, class) {
+					industryArr = append(industryArr, class)
+				}
+				industryMap[class] = append(industryMap[class], map[string]interface{}{
+					"name": name + qu.ObjToString(config.Seoconfig["seoKeywordSuffix"]),
+					// "url":  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", industryId, id),
+					"url": fmt.Sprintf(industryHref, industryId, id),
+				})
+			}
+		}
+		m := []map[string][]map[string]interface{}{}
+		//
+		for _, v := range industryArr {
+			m = append(m, map[string][]map[string]interface{}{
+				v: industryMap[v],
+			})
+		}
+		redis.Put("seoCache", rediskey, m, cacheTime)
+		return m
+	}
 }
 }
 
 
 // 判断字符串是否再数组str内
 // 判断字符串是否再数组str内
 func IsInArr(arr []string, s string) bool {
 func IsInArr(arr []string, s string) bool {
-    for _, v := range arr {
-        if v == s {
-            return true
-        }
-    }
-    return false
+	for _, v := range arr {
+		if v == s {
+			return true
+		}
+	}
+	return false
 }
 }
 
 
 // 获取最新招标信息
 // 获取最新招标信息
 func (this *Tags) GetNewBidInfo() (list []map[string]interface{}) {
 func (this *Tags) GetNewBidInfo() (list []map[string]interface{}) {
-    rediskey := fmt.Sprintf("pcindex_newArticle")
-    if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
-        list = qu.ObjArrToMapArr(l)
-    } else {
-        _, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "拟建,招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 50, "")
-        if lists != nil && len(*lists) > 10 {
-            *lists = (*lists)[0:10]
-            for _, v := range *lists {
-                v["_id"] = encrypt.CommonEncodeArticle("content", v["_id"].(string))
-                delete(v, "toptype")
-                delete(v, "s_subscopeclass")
-                tmpdate := v["publishtime"]
-                v["publishtime"] = qu.Int64All(tmpdate.(float64))
-                v["date"] = time.Unix(qu.Int64All(tmpdate.(float64)), 0).Format(date.Date_Short_Layout)
-                if v["budget"] != nil {
-                    v["budget"] = ConversionMoeny(v["budget"])
-                } else if v["bidamount"] != nil {
-                    v["budget"] = ConversionMoeny(v["bidamount"])
-                }
-            }
-            list = *lists
-            redis.Put("seoCache", rediskey, list, cacheTime)
-        }
-    }
-    return list
+	rediskey := fmt.Sprintf("pcindex_newArticle")
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+		list = qu.ObjArrToMapArr(l)
+	} else {
+		// p397 未登录详情页最新招投标信息去掉拟建
+		_, _, lists := bidsearch.GetPcBidSearchData("", "", "", "", "招标预告,招标公告,招标结果,招标信用信息", "", "", "", "", "", "", "", "", 1, false, nil, bidSearch_field_1, "", false, false, "", 50, "")
+		if lists != nil && len(*lists) > 10 {
+			*lists = (*lists)[0:10]
+			for _, v := range *lists {
+				v["_id"] = encrypt.CommonEncodeArticle("content", v["_id"].(string))
+				delete(v, "toptype")
+				delete(v, "s_subscopeclass")
+				tmpdate := v["publishtime"]
+				v["publishtime"] = qu.Int64All(tmpdate.(float64))
+				v["date"] = time.Unix(qu.Int64All(tmpdate.(float64)), 0).Format(date.Date_Short_Layout)
+				if v["budget"] != nil {
+					v["budget"] = ConversionMoeny(v["budget"])
+				} else if v["bidamount"] != nil {
+					v["budget"] = ConversionMoeny(v["bidamount"])
+				}
+			}
+			list = *lists
+			redis.Put("seoCache", rediskey, list, cacheTime)
+		}
+	}
+	return list
 }
 }
 
 
 // 获取信息类型相关url
 // 获取信息类型相关url
 func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
 func (this *Tags) GetStype(href string) (list []map[string]interface{}) {
-    rediskey := fmt.Sprintf("pcseo_stypelist_%s", href)
-    if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
-        list = qu.ObjArrToMapArr(l)
-    } else {
-        m := []map[string]interface{}{}
-        data := public.BaseMysql.SelectBySql(`select id,name,pid from seo_words.seo_stype where name !="拟建项目" and name != "采购意向" and pid=0 order by id`)
-        codeMap := map[int64][]int64{}
-        level1 := []int64{}
-        nameToCode := map[string]int64{}
-        codeToName := map[int64]string{}
-        if data != nil && len(*data) > 0 {
-            for _, v := range *data {
-                name := qu.ObjToString(v["name"])
-                pid := qu.Int64All(v["pid"])
-                id := qu.Int64All(v["id"])
-                nameToCode[name] = id
-                codeToName[id] = name
-                codeMap[pid] = append(codeMap[pid], id)
-                if pid == 0 {
-                    level1 = append(level1, id)
-                }
-            }
-            for _, v := range level1 {
-                m2 := []map[string]interface{}{}
-                for _, vv := range codeMap[v] {
-                    m2 = append(m2, map[string]interface{}{
-                        "url":  fmt.Sprintf(href, vv),
-                        "name": codeToName[vv],
-                    })
-                }
-                m = append(m, map[string]interface{}{
-                    "url":   fmt.Sprintf(href, v),
-                    "name":  codeToName[v],
-                    "stype": m2,
-                })
-            }
-        }
-        list = m
-        redis.Put("seoCache", rediskey, list, cacheTime)
-    }
-    return list
+	rediskey := fmt.Sprintf("pcseo_stypelist_%s", href)
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+		list = qu.ObjArrToMapArr(l)
+	} else {
+		m := []map[string]interface{}{}
+		data := public.BaseMysql.SelectBySql(`select id,name,pid from seo_words.seo_stype where name !="拟建项目" and name != "采购意向" and pid=0 order by id`)
+		codeMap := map[int64][]int64{}
+		level1 := []int64{}
+		nameToCode := map[string]int64{}
+		codeToName := map[int64]string{}
+		if data != nil && len(*data) > 0 {
+			for _, v := range *data {
+				name := qu.ObjToString(v["name"])
+				pid := qu.Int64All(v["pid"])
+				id := qu.Int64All(v["id"])
+				nameToCode[name] = id
+				codeToName[id] = name
+				codeMap[pid] = append(codeMap[pid], id)
+				if pid == 0 {
+					level1 = append(level1, id)
+				}
+			}
+			for _, v := range level1 {
+				m2 := []map[string]interface{}{}
+				for _, vv := range codeMap[v] {
+					m2 = append(m2, map[string]interface{}{
+						"url":  fmt.Sprintf(href, vv),
+						"name": codeToName[vv],
+					})
+				}
+				m = append(m, map[string]interface{}{
+					"url":   fmt.Sprintf(href, v),
+					"name":  codeToName[v],
+					"stype": m2,
+				})
+			}
+		}
+		list = m
+		redis.Put("seoCache", rediskey, list, cacheTime)
+	}
+	return list
 }
 }
 
 
 // 剑鱼博客
 // 剑鱼博客
 func (this *Tags) GetConsult() (list []map[string]interface{}) {
 func (this *Tags) GetConsult() (list []map[string]interface{}) {
-    rediskey := fmt.Sprintf("pcseo_jybk")
-    if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
-        list = qu.ObjArrToMapArr(l)
-    } else {
-
-        rs, _, _ := jyutil.JyCmsSearch(map[string]string{
-            "perPage": "10",
-        }, "/jyblog/index_%s.html")
-        if rs != nil {
-            for _, v := range *rs {
-                delete(v, "praise")
-                delete(v, "s_contenttype")
-                delete(v, "s_source")
-                v["url"] = fmt.Sprintf("/jyblog/%s.html", qu.ObjToString(v["_id"]))
-            }
-            list = *rs
-            redis.Put("seoCache", rediskey, list, cacheTime)
-        }
-    }
-    return list
+	rediskey := fmt.Sprintf("pcseo_jybk")
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+		list = qu.ObjArrToMapArr(l)
+	} else {
+
+		rs, _, _ := jyutil.JyCmsSearch(map[string]string{
+			"perPage": "10",
+		}, "/jyblog/index_%s.html")
+		if rs != nil {
+			for _, v := range *rs {
+				delete(v, "praise")
+				delete(v, "s_contenttype")
+				delete(v, "s_source")
+				v["url"] = fmt.Sprintf("/jyblog/%s.html", qu.ObjToString(v["_id"]))
+			}
+			list = *rs
+			redis.Put("seoCache", rediskey, list, cacheTime)
+		}
+	}
+	return list
 }
 }
 
 
 func (this *Tags) GetLetterMap(pageSize, pageNum int64, letter string) ([]map[string]interface{}, int64) {
 func (this *Tags) GetLetterMap(pageSize, pageNum int64, letter string) ([]map[string]interface{}, int64) {
-    m := []map[string]interface{}{}
-    sql := `select id,name,letter from seo_words.seo_resource where letter = ? and state=1 order by id desc`
-    cql := `select count(1) from seo_words.seo_resource where letter = ? and state=1 `
-    offset := (pageNum - 1) * pageSize
-    sql += fmt.Sprintf(" limit %v,%v", offset, pageSize)
-    data := public.BaseMysql.SelectBySql(sql, letter)
-    count := public.BaseMysql.CountBySql(cql, letter)
-    if data != nil {
-        for _, v := range *data {
-            letter := qu.ObjToString(v["letter"])
-            id := qu.Int64All(v["id"])
-            name := qu.ObjToString(v["name"])
-            name += qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
-            m = append(m, map[string]interface{}{
-                "name": name,
-                "url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
-            })
-        }
-    }
-    return m, count
+	m := []map[string]interface{}{}
+	sql := `select id,name,letter from seo_words.seo_resource where letter = ? and state1=2 order by id desc`
+	cql := `select count(1) from seo_words.seo_resource where letter = ? and state1=2 `
+	offset := (pageNum - 1) * pageSize
+	sql += fmt.Sprintf(" limit %v,%v", offset, pageSize)
+	data := public.BaseMysql.SelectBySql(sql, letter)
+	count := public.BaseMysql.CountBySql(cql, letter)
+	if data != nil {
+		for _, v := range *data {
+			letter := qu.ObjToString(v["letter"])
+			id := qu.Int64All(v["id"])
+			name := qu.ObjToString(v["name"])
+			name += qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
+			m = append(m, map[string]interface{}{
+				"name": name,
+				"url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
+			})
+		}
+	}
+	return m, count
 }
 }
 
 
 func (this *Tags) GetHotLabel(length int64) []map[string]interface{} {
 func (this *Tags) GetHotLabel(length int64) []map[string]interface{} {
-    rediskey := fmt.Sprintf("pcseo_getHotLabel_%v", length)
-    if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
-        return qu.ObjArrToMapArr(l)
-    } else {
-        m := []map[string]interface{}{}
-        sql := `select id,name,letter from seo_words.seo_resource where state=1`
-        cql := `select count(1) from seo_words.seo_resource where state=1`
-        count := public.BaseMysql.CountBySql(cql)
-        rand.Seed(time.Now().UnixNano())
-        offset := rand.Intn(int(count / length))
-        sql += fmt.Sprintf(" limit %v,%v", offset, length)
-        data := public.BaseMysql.SelectBySql(sql)
-        if data != nil {
-            for _, v := range *data {
-                letter := qu.ObjToString(v["letter"])
-                id := qu.Int64All(v["id"])
-                name := qu.ObjToString(v["name"])
-                name += qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
-                m = append(m, map[string]interface{}{
-                    "name": name,
-                    "url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
-                })
-            }
-        }
-        redis.Put("seoCache", rediskey, m, cacheTime)
-        return m
-    }
-    return nil
+	rediskey := fmt.Sprintf("pcseo_getHotLabel_%v", length)
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil && len(l) > 0 {
+		return qu.ObjArrToMapArr(l)
+	} else {
+		m := []map[string]interface{}{}
+		sql := `select id,name,letter from seo_words.seo_resource where state1=2`
+		cql := `select count(1) from seo_words.seo_resource where state1=2`
+		count := public.BaseMysql.CountBySql(cql)
+		rand.Seed(time.Now().UnixNano())
+		offset := rand.Intn(int(count / length))
+		sql += fmt.Sprintf(" limit %v,%v", offset, length)
+		data := public.BaseMysql.SelectBySql(sql)
+		if data != nil {
+			for _, v := range *data {
+				letter := qu.ObjToString(v["letter"])
+				id := qu.Int64All(v["id"])
+				name := qu.ObjToString(v["name"])
+				name += qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
+				m = append(m, map[string]interface{}{
+					"name": name,
+					"url":  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
+				})
+			}
+		}
+		redis.Put("seoCache", rediskey, m, cacheTime)
+		return m
+	}
+	return nil
 }
 }
 
 
 // 获取招标平台类型
 // 获取招标平台类型
 func GetBiddingPlatformType() (nameToCode map[string]int64, codeToName map[int64]string) {
 func GetBiddingPlatformType() (nameToCode map[string]int64, codeToName map[int64]string) {
-    nameToCode = map[string]int64{}
-    codeToName = map[int64]string{}
-    data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_site`)
-    if data != nil && len(*data) > 0 {
-        for _, v := range *data {
-            name := qu.ObjToString(v["name"])
-            id := qu.Int64All(v["id"])
-            nameToCode[name] = id
-            codeToName[id] = name
-        }
-    }
-    return
+	nameToCode = map[string]int64{}
+	codeToName = map[int64]string{}
+	data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_site`)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			name := qu.ObjToString(v["name"])
+			id := qu.Int64All(v["id"])
+			nameToCode[name] = id
+			codeToName[id] = name
+		}
+	}
+	return
 }
 }
 
 
 // -2 等待池已满
 // -2 等待池已满
 // -1 超时
 // -1 超时
 // 1:可以执行查询
 // 1:可以执行查询
 func (r *reqLimit) Limit(ctx context.Context) int {
 func (r *reqLimit) Limit(ctx context.Context) int {
-    ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
-    defer cancel()
-    select {
-    case <-r.waitPool:
-        defer func() {
-            r.waitPool <- struct{}{}
-        }()
-        select {
-        case <-r.doPool:
-            return 1
-        case <-ctx.Done(): //超时
-            return -1
-        }
-    default:
-        return -2
-    }
+	ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
+	defer cancel()
+	select {
+	case <-r.waitPool:
+		defer func() {
+			r.waitPool <- struct{}{}
+		}()
+		select {
+		case <-r.doPool:
+			return 1
+		case <-ctx.Done(): //超时
+			return -1
+		}
+	default:
+		return -2
+	}
 }
 }
 
 
 func (r *reqLimit) Release() {
 func (r *reqLimit) Release() {
-    r.doPool <- struct{}{}
+	r.doPool <- struct{}{}
 }
 }
 
 
 // GetBidding
 // GetBidding
 // 金额限制在"1000"~"100000000";需求因es压力过大,只返回60%的数据
 // 金额限制在"1000"~"100000000";需求因es压力过大,只返回60%的数据
 func (this *Tags) GetBidding(industry, area, city, stype, keyword string, request *http.Request, responseWriter http.ResponseWriter, session *httpsession.Session) ([]map[string]interface{}, int64, bool) {
 func (this *Tags) GetBidding(industry, area, city, stype, keyword string, request *http.Request, responseWriter http.ResponseWriter, session *httpsession.Session) ([]map[string]interface{}, int64, bool) {
-    rediskey := fmt.Sprintf("pcseo_getbidding_%s_%s_%s_%s_%s", industry, area, city, stype, keyword)
-    rediskeyCount := fmt.Sprintf("pcseo_getbidding_count_%s_%s_%s_%s_%s", industry, area, city, stype, keyword)
-
-    if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil {
-        count := redis.GetInt("seoCache", rediskeyCount)
-        return qu.ObjArrToMapArr(l), int64(count), false
-    } else {
-        if area != "" || stype != "" || industry != "" || city != "" || keyword != "" {
-            if flag := reqLimitInit.Limit(context.Background()); flag == 1 {
-                defer reqLimitInit.Release()
-            } else {
-                if flag == -2 {
-                    log.Println("等待队列已满")
-                } else if flag == -1 {
-                    log.Println("等待超时")
-                }
-                return nil, 0, true
-            }
-
-            if public.Lst.IsLimited(request, responseWriter, session, false) == 1 { //没有被限制
-                defer public.Lst.Limit()
-            } else {
-                return nil, 0, true
-            }
-            now := time.Now()
-            starttime := fmt.Sprint(time.Date(now.Year()-1, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
-            endtime := fmt.Sprint(now.Unix())
-            var datas *[]map[string]interface{}
-            //var startPage int
-            var count int64
-            //currentPage := 5
-            limitCount := qu.IntAllDef(config.Seoconfig["tagsLimitCount"], 50)
-            if keyword == "" {
-                query := bidsearch.GetSearchQuery("", industry, "0.1", "1000", "", "", "", "", bidsearch.GetBidSearchQuery(area, city, fmt.Sprintf("%s_%s", starttime, endtime), stype, "", ""), "", false, seoBidField)
-                //count = elastic.Count(INDEX, TYPE, query)
-                //if count == 0 {
-                //	return nil, 0, false
-                //}
-                //startPage = rand.New(rand.NewSource(time.Now().UnixNano())).Intn(currentPage * limitCount)
-                //count1 := qu.IntAll(count)
-                //if count1 < startPage || startPage < 0 {
-                //	startPage = 0
-                //}
-                var countTmp int
-                datas, countTmp = elastic.GetOAPage(INDEX, TYPE, query, bidSearch_sort, seoBidField, 0, limitCount)
-                count = qu.Int64All(countTmp)
-                if count == 0 {
-                    return nil, 0, false
-                }
-            } else {
-                count, _, datas = bidsearch.GetPcBidSearchData(keyword, area, city, fmt.Sprintf("%s_%s", starttime, endtime), stype, industry, "0.1", "1000", "", "", "", "", "", 0, true, []string{"title", "detail", "purchasing"}, seoBidField, "", false, false, "", limitCount, "")
-                if datas != nil && len(*datas) > limitCount {
-                    *datas = (*datas)[0:limitCount]
-                }
-            }
-            if datas != nil && len(*datas) > 0 {
-                for _, v := range *datas {
-                    v["_id"] = encrypt.CommonEncodeArticle("content", qu.ObjToString(v["_id"]))
-                    v["date"] = time.Unix(qu.Int64All(v["publishtime"]), 0).Format(date.Date_Short_Layout)
-                    highlight, _ := v["highlight"].(map[string][]string)
-                    detail := ""
-                    for _, val := range highlight["detail"] {
-                        detail += public.ClearHtml.ReplaceAllString(val, "")
-                    }
-                    if detail != "" {
-                        v["detail"] = detail
-                    }
-                }
-                if strings.Contains(industry, "_") {
-                    industry = strings.Split(industry, "_")[0]
-                }
-                public.BidListConvert(industry, datas)
-                redis.Put("seoCache", rediskey, datas, cacheTime)      //生产环境配置4G单独redis,超出4G自动清除
-                redis.Put("seoCache", rediskeyCount, count, cacheTime) //生产环境配置4G单独redis,超出4G自动清除
-                return *datas, count, false
-            }
-        }
-    }
-    return nil, 0, false
+	rediskey := fmt.Sprintf("pcseo_getbidding_%s_%s_%s_%s_%s", industry, area, city, stype, keyword)
+	rediskeyCount := fmt.Sprintf("pcseo_getbidding_count_%s_%s_%s_%s_%s", industry, area, city, stype, keyword)
+
+	if l, ok := redis.Get("seoCache", rediskey).([]interface{}); ok && l != nil {
+		count := redis.GetInt("seoCache", rediskeyCount)
+		return qu.ObjArrToMapArr(l), int64(count), false
+	} else {
+		if area != "" || stype != "" || industry != "" || city != "" || keyword != "" {
+			if flag := reqLimitInit.Limit(context.Background()); flag == 1 {
+				defer reqLimitInit.Release()
+			} else {
+				if flag == -2 {
+					log.Println("等待队列已满")
+				} else if flag == -1 {
+					log.Println("等待超时")
+				}
+				return nil, 0, true
+			}
+
+			if public.Lst.IsLimited(request, responseWriter, session, false) == 1 { //没有被限制
+				defer public.Lst.Limit()
+			} else {
+				return nil, 0, true
+			}
+			now := time.Now()
+			starttime := fmt.Sprint(time.Date(now.Year()-1, now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second(), 0, time.Local).Unix())
+			endtime := fmt.Sprint(now.Unix())
+			var datas *[]map[string]interface{}
+			//var startPage int
+			var count int64
+			//currentPage := 5
+			limitCount := qu.IntAllDef(config.Seoconfig["tagsLimitCount"], 50)
+			if keyword == "" {
+				query := bidsearch.GetSearchQuery("", industry, "0.1", "1000", "", "", "", "", bidsearch.GetBidSearchQuery(area, city, fmt.Sprintf("%s_%s", starttime, endtime), stype, "", ""), "", false, seoBidField)
+				//count = elastic.Count(INDEX, TYPE, query)
+				//if count == 0 {
+				//	return nil, 0, false
+				//}
+				//startPage = rand.New(rand.NewSource(time.Now().UnixNano())).Intn(currentPage * limitCount)
+				//count1 := qu.IntAll(count)
+				//if count1 < startPage || startPage < 0 {
+				//	startPage = 0
+				//}
+				var countTmp int
+				datas, countTmp = elastic.GetOAPage(INDEX, TYPE, query, bidSearch_sort, seoBidField, 0, limitCount)
+				count = qu.Int64All(countTmp)
+				if count == 0 {
+					return nil, 0, false
+				}
+			} else {
+				count, _, datas = bidsearch.GetPcBidSearchData(keyword, area, city, fmt.Sprintf("%s_%s", starttime, endtime), stype, industry, "", "", "", "", "", "", "", 0, true, []string{"title", "detail", "purchasing"}, seoBidField, "", false, false, "", limitCount, "")
+				if datas != nil && len(*datas) > limitCount {
+					*datas = (*datas)[0:limitCount]
+				}
+			}
+			if datas != nil && len(*datas) > 0 {
+				for _, v := range *datas {
+					v["_id"] = encrypt.CommonEncodeArticle("content", qu.ObjToString(v["_id"]))
+					v["date"] = time.Unix(qu.Int64All(v["publishtime"]), 0).Format(date.Date_Short_Layout)
+					highlight, _ := v["highlight"].(map[string][]string)
+					detail := ""
+					for _, val := range highlight["detail"] {
+						detail += public.ClearHtml.ReplaceAllString(val, "")
+					}
+					if detail != "" {
+						v["detail"] = detail
+					}
+				}
+				if strings.Contains(industry, "_") {
+					industry = strings.Split(industry, "_")[0]
+				}
+				public.BidListConvert(industry, datas)
+				redis.Put("seoCache", rediskey, datas, cacheTime)      //生产环境配置4G单独redis,超出4G自动清除
+				redis.Put("seoCache", rediskeyCount, count, cacheTime) //生产环境配置4G单独redis,超出4G自动清除
+				return *datas, count, false
+			}
+		}
+	}
+	return nil, 0, false
 }
 }
 
 
 // 获取关键词
 // 获取关键词
 func (this *Tags) GetSeoKeyWords(id string) (string, string) {
 func (this *Tags) GetSeoKeyWords(id string) (string, string) {
-    i_id, _ := strconv.Atoi(id)
-    data := public.BaseMysql.SelectBySql(`select name from seo_words.seo_resource where id=? limit 1`, i_id)
-    if data != nil && len(*data) > 0 {
-        name := qu.ObjToString((*data)[0]["name"])
-        return name, qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
-    }
-    return "", ""
+	i_id, _ := strconv.Atoi(id)
+	data := public.BaseMysql.SelectBySql(`select name from seo_words.seo_resource where id=? limit 1`, i_id)
+	if data != nil && len(*data) > 0 {
+		name := qu.ObjToString((*data)[0]["name"])
+		return name, qu.ObjToString(config.Seoconfig["seoKeywordSuffix"])
+	}
+	return "", ""
 }
 }
 
 
 // 获取行业分类下的标签
 // 获取行业分类下的标签
 func (this *Tags) GetInsturyKeywords(idstr string) (name, class_1, class_2 string) {
 func (this *Tags) GetInsturyKeywords(idstr string) (name, class_1, class_2 string) {
-    id, _ := strconv.Atoi(idstr)
-    data := public.BaseMysql.SelectBySql(`select id,class_1,class_2,name from seo_words.seo_industry where id =?`, id)
-    if data != nil && len(*data) > 0 {
-        for _, v := range *data {
-            class_1 = qu.ObjToString(v["class_1"])
-            name = qu.ObjToString(v["name"])
-            class_2 = qu.ObjToString(v["class_2"])
-            return name, class_1, class_2
-        }
-    }
-    return "", "", ""
+	id, _ := strconv.Atoi(idstr)
+	data := public.BaseMysql.SelectBySql(`select id,class_1,class_2,name from seo_words.seo_industry where id =?`, id)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			class_1 = qu.ObjToString(v["class_1"])
+			name = qu.ObjToString(v["name"])
+			class_2 = qu.ObjToString(v["class_2"])
+			return name, class_1, class_2
+		}
+	}
+	return "", "", ""
 }
 }
 
 
 // 获取信息类型 【全部是虚假的全部、实则是不包含拟建和采购意向的全部】
 // 获取信息类型 【全部是虚假的全部、实则是不包含拟建和采购意向的全部】
 // p353包含采购意向与拟建
 // p353包含采购意向与拟建
+// p397 不包含拟建
 func (this *Tags) GetInfoType(idstr string) (string, string) {
 func (this *Tags) GetInfoType(idstr string) (string, string) {
-    if idstr == "all" {
-        return "拟建,招标,邀标,询价,竞谈,单一,竞价,变更,中标,成交,废标,流标,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果", ""
-        //return "", ""
-    }
-    id, _ := strconv.Atoi(idstr)
-    data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_stype where id =?`, id)
-    if data != nil && len(*data) > 0 {
-        for _, v := range *data {
-            name := qu.ObjToString(v["name"])
-            return getstype(name), name
-        }
-    }
-    return "", ""
+	if idstr == "all" {
+		return "招标,邀标,询价,竞谈,单一,竞价,变更,中标,成交,废标,流标,合同,验收,违规,预告,需求公示,预审,论证意见,预审结果", ""
+		//return "", ""
+	}
+	id, _ := strconv.Atoi(idstr)
+	data := public.BaseMysql.SelectBySql(`select id,name from seo_words.seo_stype where id =?`, id)
+	if data != nil && len(*data) > 0 {
+		for _, v := range *data {
+			name := qu.ObjToString(v["name"])
+			return getstype(name), name
+		}
+	}
+	return "", ""
 }
 }
 
 
 // this.T["letterList"],this.T["letterListCount"],this.T["pagingMap"]=this.GetLetterPaging(pageNum,checkedLetter)
 // this.T["letterList"],this.T["letterListCount"],this.T["pagingMap"]=this.GetLetterPaging(pageNum,checkedLetter)
 func (this *Tags) GetLetterPaging(pageNum int, checkedLetter string) (letterList []map[string]interface{}, letterListCount int64, pagingMap map[string]interface{}) {
 func (this *Tags) GetLetterPaging(pageNum int, checkedLetter string) (letterList []map[string]interface{}, letterListCount int64, pagingMap map[string]interface{}) {
-    seoLetterPageSize := qu.Int64All(config.Seoconfig["seoLetterPageSize"])
-    if pageNum == 0 {
-        pageNum = 1
-    }
-    letterList, letterListCount = this.GetLetterMap(seoLetterPageSize, int64(pageNum), checkedLetter)
-    pagecount := int(math.Ceil(qu.Float64All(letterListCount) / float64(seoLetterPageSize)))
-    paging := paging.PaggingHtml(pageNum, pagecount, fmt.Sprintf("/tags/letter/%s", checkedLetter)+"_%v.html")
-
-    pagingMap = map[string]interface{}{
-        "paging":    paging,
-        "pageNum":   pageNum,
-        "pageCount": pagecount,
-        "pageSize":  seoLetterPageSize,
-    }
-    return
+	seoLetterPageSize := qu.Int64All(config.Seoconfig["seoLetterPageSize"])
+	if pageNum == 0 {
+		pageNum = 1
+	}
+	letterList, letterListCount = this.GetLetterMap(seoLetterPageSize, int64(pageNum), checkedLetter)
+	pagecount := int(math.Ceil(qu.Float64All(letterListCount) / float64(seoLetterPageSize)))
+	paging := paging.PaggingHtml(pageNum, pagecount, fmt.Sprintf("/tags/letter/%s", checkedLetter)+"_%v.html")
+
+	pagingMap = map[string]interface{}{
+		"paging":    paging,
+		"pageNum":   pageNum,
+		"pageCount": pagecount,
+		"pageSize":  seoLetterPageSize,
+	}
+	return
 }
 }
 
 
 // itype 1:汇总页 2:标签页
 // itype 1:汇总页 2:标签页
 // stype area:地区  industy:行业 letter:字母类
 // stype area:地区  industy:行业 letter:字母类
 func (this *Tags) GetTDK(isDetails bool, stype string, keywords string, pagenum int, letter string, industryWord string, areaWord, letterWord, infoType string) map[string]interface{} {
 func (this *Tags) GetTDK(isDetails bool, stype string, keywords string, pagenum int, letter string, industryWord string, areaWord, letterWord, infoType string) map[string]interface{} {
-    title, keywordsContent, descriptionContent := "", "", ""
-    if !isDetails {
-        //汇总页
-        if stype == "area" {
-            title = fmt.Sprintf("%s招标采购网站大全-剑鱼标讯", areaWord)
-            keywordsContent = fmt.Sprintf("%s招标采购网站、%s政府采购中心、%s工程交易中心、%s公共资源交易网", areaWord, areaWord, areaWord, areaWord)
-            descriptionContent = "剑鱼标讯提供全国各省市区县的招标采购网站大全,覆盖省市招标网、政府采购网、公共资源交易网、招投标交易中心、政府采购中心、工程交易中心、公共资源交易中心等招标平台。通过专业可靠的招投标服务,赋能企业"
-        } else if stype == "industry" {
-            title = fmt.Sprintf("%s招标采购行业大全-剑鱼标讯", areaWord)
-            keywordsContent = fmt.Sprintf("%s招标采购分类,%s招标行业分类,%s招标采购行业,%s招标采购信息", areaWord, areaWord, areaWord, areaWord)
-            descriptionContent = "剑鱼标讯提供全国各行各业的招标采购公告、预告、变更、中标等招标分类信息搜索、查看、发布服务。有详细的招标采购信息、政府采购信息、标书制作、招投标课程、企业合作需求等招标分类信息。借助高流量的主站使信息推广变得更加简单,快速,效率。"
-        } else if stype == "letter" {
-            title = fmt.Sprintf("热门招标采购关键词%s类-剑鱼标讯", letter)
-            if pagenum != 1 && pagenum != 0 {
-                title = fmt.Sprintf("热门招标采购关键词%s类第%v页-剑鱼标讯", letter, pagenum)
-            }
-            keywordsContent = fmt.Sprintf("热门招标采购关键词%s类", letter)
-            descriptionContent = fmt.Sprintf("剑鱼标讯招标采购热门关键词%s类为您提供全国各行业招标,采购,中标,商机供应信息,各类建筑建设工程项目标讯数据,全面、及时、专业、可靠的招标采购信息就用剑鱼标讯。", letter)
-
-        }
-    } else {
-        //标签页
-        if stype == "area" {
-            title = fmt.Sprintf("%s-招标采购信息", areaWord)
-            keywordsContent = fmt.Sprintf("%s,%s招标,%s采购", areaWord, areaWord, areaWord)
-            descriptionContent = fmt.Sprintf("提供%s全部招标采购信息,登录后可以免费查看,涵盖%s拟建项目、采购意向、招标公告,中标结果等招投标信息。%s为您提供专业全面的招投标服务!", areaWord, areaWord, areaWord)
-        } else if stype == "industry" {
-            if infoType == "招标预告" {
-                title = fmt.Sprintf("%s免费招标预告_%s采购信息预告-剑鱼标讯", industryWord, keywords)
-                keywordsContent = fmt.Sprintf("%s免费招标预告,%s招投标预告,%s采购预告", industryWord, industryWord, industryWord)
-                descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息预告专栏,免费提供%s招标采购预告信息,寻找优质免费%s招标预告信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
-            } else if infoType == "招标公告" {
-                title = fmt.Sprintf("%s免费招标公告_%s采购信息公告-剑鱼标讯", industryWord, keywords)
-                keywordsContent = fmt.Sprintf("%s免费招标公告,%s招投标公告,%s采购公告", industryWord, industryWord, industryWord)
-                descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息公告专栏,免费提供%s招标采购公告信息,寻找优质免费%s招标公告信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
-            } else if infoType == "招标结果" {
-                title = fmt.Sprintf("%s免费招标结果_%s采购信息结果-剑鱼标讯", industryWord, keywords)
-                keywordsContent = fmt.Sprintf("%s免费招标结果,%s招投标结果,%s采购结果", industryWord, industryWord, industryWord)
-                descriptionContent = fmt.Sprintf("剑鱼标讯%s招标结果专栏,免费提供%s招标采购结果内容,寻找优质免费%s招标结果信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
-            } else if infoType == "招标信用信息" {
-                title = fmt.Sprintf("%s招标采购信用信息查询网-剑鱼标讯", industryWord)
-                keywordsContent = fmt.Sprintf("%s招标信用,%s投标信用,%s采购信用查询", industryWord, industryWord, industryWord)
-                descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息查询专栏,免费提供%s招标信息查询内容,寻找优质免费%s招标信用查询网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
-            } else {
-                title = fmt.Sprintf("%s免费招标信息_%s采购服务平台-剑鱼标讯", industryWord, keywords)
-                keywordsContent = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", industryWord, industryWord, industryWord, industryWord, industryWord)
-                descriptionContent = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord, industryWord, industryWord)
-            }
-
-        } else if stype == "letter" {
-            title = fmt.Sprintf("%s免费招标信息_%s采购平台-剑鱼标讯", letterWord, letterWord)
-            keywordsContent = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", letterWord, letterWord, letterWord, letterWord, letterWord)
-            descriptionContent = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供全国%s招标采购信息、招标公告、中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", letterWord, letterWord, letterWord, letterWord, letterWord)
-        }
-    }
-    return map[string]interface{}{
-        "title":              title,
-        "keywordsContent":    keywordsContent,
-        "descriptionContent": descriptionContent,
-    }
+	title, keywordsContent, descriptionContent := "", "", ""
+	if !isDetails {
+		//汇总页
+		if stype == "area" {
+			title = fmt.Sprintf("%s招标采购网站大全-剑鱼标讯", areaWord)
+			keywordsContent = fmt.Sprintf("%s招标采购网站、%s政府采购中心、%s工程交易中心、%s公共资源交易网", areaWord, areaWord, areaWord, areaWord)
+			descriptionContent = "剑鱼标讯提供全国各省市区县的招标采购网站大全,覆盖省市招标网、政府采购网、公共资源交易网、招投标交易中心、政府采购中心、工程交易中心、公共资源交易中心等招标平台。通过专业可靠的招投标服务,赋能企业"
+		} else if stype == "industry" {
+			title = fmt.Sprintf("%s招标采购行业大全-剑鱼标讯", areaWord)
+			keywordsContent = fmt.Sprintf("%s招标采购分类,%s招标行业分类,%s招标采购行业,%s招标采购信息", areaWord, areaWord, areaWord, areaWord)
+			descriptionContent = "剑鱼标讯提供全国各行各业的招标采购公告、预告、变更、中标等招标分类信息搜索、查看、发布服务。有详细的招标采购信息、政府采购信息、标书制作、招投标课程、企业合作需求等招标分类信息。借助高流量的主站使信息推广变得更加简单,快速,效率。"
+		} else if stype == "letter" {
+			title = fmt.Sprintf("热门招标采购关键词%s类-剑鱼标讯", letter)
+			if pagenum != 1 && pagenum != 0 {
+				title = fmt.Sprintf("热门招标采购关键词%s类第%v页-剑鱼标讯", letter, pagenum)
+			}
+			keywordsContent = fmt.Sprintf("热门招标采购关键词%s类", letter)
+			descriptionContent = fmt.Sprintf("剑鱼标讯招标采购热门关键词%s类为您提供全国各行业招标,采购,中标,商机供应信息,各类建筑建设工程项目标讯数据,全面、及时、专业、可靠的招标采购信息就用剑鱼标讯。", letter)
+
+		}
+	} else {
+		//标签页
+		if stype == "area" {
+			title = fmt.Sprintf("%s-招标采购信息", areaWord)
+			keywordsContent = fmt.Sprintf("%s,%s招标,%s采购", areaWord, areaWord, areaWord)
+			descriptionContent = fmt.Sprintf("提供%s全部招标采购信息,登录后可以免费查看,涵盖%s拟建项目、采购意向、招标公告,中标结果等招投标信息。%s为您提供专业全面的招投标服务!", areaWord, areaWord, areaWord)
+		} else if stype == "industry" {
+			if infoType == "招标预告" {
+				title = fmt.Sprintf("%s免费招标预告_%s采购信息预告-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标预告,%s招投标预告,%s采购预告", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息预告专栏,免费提供%s招标采购预告信息,寻找优质免费%s招标预告信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else if infoType == "招标公告" {
+				title = fmt.Sprintf("%s免费招标公告_%s采购信息公告-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标公告,%s招投标公告,%s采购公告", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息公告专栏,免费提供%s招标采购公告信息,寻找优质免费%s招标公告信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else if infoType == "招标结果" {
+				title = fmt.Sprintf("%s免费招标结果_%s采购信息结果-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标结果,%s招投标结果,%s采购结果", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标结果专栏,免费提供%s招标采购结果内容,寻找优质免费%s招标结果信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else if infoType == "招标信用信息" {
+				title = fmt.Sprintf("%s招标采购信用信息查询网-剑鱼标讯", industryWord)
+				keywordsContent = fmt.Sprintf("%s招标信用,%s投标信用,%s采购信用查询", industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s招标信息查询专栏,免费提供%s招标信息查询内容,寻找优质免费%s招标信用查询网站,就用剑鱼标讯!", industryWord, industryWord, industryWord)
+			} else {
+				title = fmt.Sprintf("%s免费招标信息_%s采购服务平台-剑鱼标讯", industryWord, keywords)
+				keywordsContent = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", industryWord, industryWord, industryWord, industryWord, industryWord)
+				descriptionContent = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", industryWord, industryWord, industryWord, industryWord, industryWord)
+			}
+
+		} else if stype == "letter" {
+			title = fmt.Sprintf("%s免费招标信息_%s采购平台-剑鱼标讯", letterWord, letterWord)
+			keywordsContent = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", letterWord, letterWord, letterWord, letterWord, letterWord)
+			descriptionContent = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供全国%s招标采购信息、招标公告、中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", letterWord, letterWord, letterWord, letterWord, letterWord)
+		}
+	}
+	return map[string]interface{}{
+		"title":              title,
+		"keywordsContent":    keywordsContent,
+		"descriptionContent": descriptionContent,
+	}
 }
 }

+ 18 - 7
src/jfw/modules/app/src/app/front/shorturl.go

@@ -144,8 +144,14 @@ func (s *Short) Article(contentType, stype, id string) error {
 	log.Printf("三级页userid:%s ips %v", userId, ips)
 	log.Printf("三级页userid:%s ips %v", userId, ips)
 	obj = wxvisitD(sid, userId, (isVip && isOldVip) || isEntniche || isMember)
 	obj = wxvisitD(sid, userId, (isVip && isOldVip) || isEntniche || isMember)
 	if len(obj) > 0 {
 	if len(obj) > 0 {
-		if userId == "" && util.ObjToString(obj["subtype"]) == "采购意向" && !ipTrue {
-			return s.Redirect("/jyapp/free/login")
+		if userId == "" && !ipTrue {
+			if util.ObjToString(obj["subtype"]) == "采购意向" || util.ObjToString(obj["subtype"]) == "拟建" {
+				rUrl := "/jyapp/free/login"
+				if util.ObjToString(obj["subtype"]) == "拟建" {
+					rUrl = fmt.Sprintf("%s?DisUrl=%s", rUrl, s.Request.URL)
+				}
+				return s.Redirect(rUrl)
+			}
 		}
 		}
 		if userId != "" {
 		if userId != "" {
 			if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
 			if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
@@ -207,7 +213,11 @@ func (s *Short) Article(contentType, stype, id string) error {
 			}
 			}
 			s.T["canRead"] = canRead
 			s.T["canRead"] = canRead
 		}
 		}
-		if canRead || userId == "" || util.ObjToString(obj["subtype"]) == "拟建" {
+		// 未登录但是在白名单可以看 不遮挡
+		if userId == "" && ipTrue {
+			canRead = true
+		}
+		if canRead || (userId == "" && !ipTrue) {
 			if belongUserId != "" && belongUserId != userId && util.ObjToString(obj["subtype"]) != "拟建" && userId != "" { //分享开打的
 			if belongUserId != "" && belongUserId != userId && util.ObjToString(obj["subtype"]) != "拟建" && userId != "" { //分享开打的
 				article_id := encrypt.CommonDecodeArticle(stype, id)[0]
 				article_id := encrypt.CommonDecodeArticle(stype, id)[0]
 				key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, belongUserId, userId)
 				key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, belongUserId, userId)
@@ -284,10 +294,11 @@ func (s *Short) Article(contentType, stype, id string) error {
 					obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
 					obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
 				}
 				}
 			}
 			}
-			if !canRead && util.ObjToString(obj["subtype"]) == "拟建" && !(userId == "" && ipTrue) { //登录拟建&采购不展示遮罩 只打码
-				otherFilter(obj, userId != "")
-				//s.T["canRead"] = true
-			} else if userId == "" && !ipTrue {
+			//if !canRead && util.ObjToString(obj["subtype"]) == "拟建" && !(userId == "" && ipTrue) { //登录拟建&采购不展示遮罩 只打码
+			//	otherFilter(obj, userId != "")
+			//	//s.T["canRead"] = true
+			//} else
+			if userId == "" && !ipTrue {
 				obj = Filter(obj)
 				obj = Filter(obj)
 				obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
 				obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
 				s.T["canRead"] = true
 				s.T["canRead"] = true

+ 7 - 3
src/jfw/modules/app/src/app/front/tags.go

@@ -1,6 +1,7 @@
 package front
 package front
 
 
 import (
 import (
+	"app.yhyue.com/moapp/jybase/encrypt"
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"jy/src/jfw/modules/app/src/app/jyutil"
 	"jy/src/jfw/modules/app/src/app/jyutil"
@@ -120,17 +121,20 @@ func (tg *Tags) IsLogin() error {
 	if userId, _ := tg.GetSession("userId").(string); userId != "" {
 	if userId, _ := tg.GetSession("userId").(string); userId != "" {
 		i = 1
 		i = 1
 	}
 	}
-	log.Println("------islogin----", i)
+	//log.Println("------islogin----", i)
 	return tg.Write(strconv.Itoa(i))
 	return tg.Write(strconv.Itoa(i))
 }
 }
 
 
 func (tg *Tags) TagsIndex(first, types, name string) error {
 func (tg *Tags) TagsIndex(first, types, name string) error {
 	defer qu.Catch()
 	defer qu.Catch()
 	if userId, _ := tg.GetSession("userId").(string); userId != "" {
 	if userId, _ := tg.GetSession("userId").(string); userId != "" {
-		if c := jyutil.ChangeLoginCookie(20, tg.ResponseWriter, tg.Request, fmt.Sprintf("mobile_logined_%s", userId)); c < cookieNum {
-			return tg.Redirect("/jyapp/jylab/mainSearch")
+		if c := jyutil.ChangeLoginCookie(20, tg.ResponseWriter, tg.Request, fmt.Sprintf("mobile_logined_%s", encrypt.SE.EncodeString(userId))); c < cookieNum {
+			return tg.Redirect("/jyapp/jylab/mainSearch?DisUrl=/jyapp/jylab/mainSearch")
 		}
 		}
 	}
 	}
+	if types == "stype" && (strings.Contains(name, "NJXM") || jyutil.NameReg.MatchString(name)) {
+		return tg.Redirect("/jyapp/free/login?flag=kicked&back=index")
+	}
 	var (
 	var (
 		platform = "PC"
 		platform = "PC"
 	)
 	)

+ 7 - 5
src/jfw/modules/app/src/app/jyutil/tags.go

@@ -15,6 +15,7 @@ import (
 	"log"
 	"log"
 	"math/rand"
 	"math/rand"
 	"reflect"
 	"reflect"
+	"regexp"
 	"strconv"
 	"strconv"
 	"strings"
 	"strings"
 	"sync"
 	"sync"
@@ -22,6 +23,7 @@ import (
 )
 )
 
 
 var (
 var (
+	NameReg             = regexp.MustCompile("^1_\\d")
 	mobileHref          = "/list/%s/%s.html"
 	mobileHref          = "/list/%s/%s.html"
 	infoTypeRedisKey    = "mobile_seo_infoType_home"
 	infoTypeRedisKey    = "mobile_seo_infoType_home"
 	biddingListKey      = "mobile_seo_list_%s_%s_%d"
 	biddingListKey      = "mobile_seo_list_%s_%s_%d"
@@ -308,11 +310,11 @@ var (
 			Name: "招标信用信息",
 			Name: "招标信用信息",
 			Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[5]),
 			Url:  fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[5]),
 		},
 		},
-		{
-			Name:     "拟建项目",
-			Url:      fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[1]),
-			Nickname: "拟建",
-		},
+		//{
+		//	Name:     "拟建项目",
+		//	Url:      fmt.Sprintf(mobileHref, Label["infoType"], CodeToInfoType[1]),
+		//	Nickname: "拟建",
+		//},
 	}
 	}
 	AreaMap        = map[string]tkd{}
 	AreaMap        = map[string]tkd{}
 	CityMap        = map[string]tkd{}
 	CityMap        = map[string]tkd{}

+ 1 - 2
src/jfw/modules/app/src/app/jyutil/util.go

@@ -7,7 +7,6 @@ import (
 	"app.yhyue.com/moapp/jypkg/public"
 	"app.yhyue.com/moapp/jypkg/public"
 	"encoding/json"
 	"encoding/json"
 	. "jy/src/jfw/modules/app/src/jfw/config"
 	. "jy/src/jfw/modules/app/src/jfw/config"
-	"log"
 	"net/http"
 	"net/http"
 	"reflect"
 	"reflect"
 	"regexp"
 	"regexp"
@@ -268,7 +267,7 @@ func ChangeLoginCookie(timeOut int, w http.ResponseWriter, r *http.Request, name
 		}
 		}
 	}
 	}
 	c++
 	c++
-	log.Println(c, "-------------", err)
+	//log.Println(c, "-------------", err)
 	http.SetCookie(w, &http.Cookie{
 	http.SetCookie(w, &http.Cookie{
 		Name:     name,
 		Name:     name,
 		Value:    strconv.Itoa(c),
 		Value:    strconv.Itoa(c),

+ 4 - 0
src/jfw/modules/app/src/web/templates/me/login.html

@@ -707,6 +707,10 @@
 				1000)
 				1000)
 			}
 			}
 		}
 		}
+    // 修复浏览器安全限制无法获取填充 input value
+    document.addEventListener('touchstart', function(event) {
+      changeBtnStatus()
+    })
 	</script>
 	</script>
 	<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/js/fast-login.js?v={{Msg "seo" "version" }}'></script>
 	<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/common-module/account/js/fast-login.js?v={{Msg "seo" "version" }}'></script>
 	<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/js/login.js?v={{Msg "seo" "version" }}'></script>
 	<script src='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/me/js/login.js?v={{Msg "seo" "version" }}'></script>

+ 10 - 14
src/jfw/modules/app/src/web/templates/weixin/wxinfocontent.html

@@ -631,12 +631,10 @@
             </div>
             </div>
         </div>
         </div>
         <!--    免费用户或未登录-->
         <!--    免费用户或未登录-->
-        <div class="big-ad-img free-btn-reword">
-            <!--        拟建项目显示-->
-            <img class="nj-ad" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/focontent/ad_bigmember2.png"/>
-            <!--        采购意向显示-->
-            <img class="cgyx-ad" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/focontent/ad_bigmember.png"/>
-        </div>
+        <!-- <div class="big-ad-img free-btn-reword">
+            <img class="nj-ad" alt="拟建项目" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/focontent/ad_bigmember2.png"/>
+            <img class="cgyx-ad" alt="采购意向" src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/focontent/ad_bigmember.png"/>
+        </div> -->
         <div class="newuser hidden">
         <div class="newuser hidden">
             <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/wx/newuser.png?v={{Msg "seo" "version"}}"/>
             <img src="{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/images/wx/newuser.png?v={{Msg "seo" "version"}}"/>
         </div>
         </div>
@@ -1429,13 +1427,11 @@
         // 显示隐藏
         // 显示隐藏
         if (!canRead) {
         if (!canRead) {
             // $(".prebuilt").remove()
             // $(".prebuilt").remove()
-            if(subtype != '拟建') {
-              $('#tab2').hide() // 摘要tab1+正文tab2
-              $(".tab-ct").hide() // 正文信息
-              $(".abs").hide() // 阅读原文和意见反馈
-              $(".atta-list").hide() // 附件列表
-              $(".mask-zz").removeClass("hidden");
-            }
+            $('#tab2').hide() // 摘要tab1+正文tab2
+            $(".tab-ct").hide() // 正文信息
+            $(".abs").hide() // 阅读原文和意见反馈
+            $(".atta-list").hide() // 附件列表
+            $(".mask-zz").removeClass("hidden");
 
 
         } else {
         } else {
             $(".prebuilt").css('height', 'unset')
             $(".prebuilt").css('height', 'unset')
@@ -1449,7 +1445,7 @@
   // 是否展示详情上方的广告位
   // 是否展示详情上方的广告位
   function showTopAd () {
   function showTopAd () {
     if(!canRead && userId && subtype == '拟建') {
     if(!canRead && userId && subtype == '拟建') {
-      $('.big-ad-img').show()
+      // $('.big-ad-img').show()
       $('.nj-ad').show()
       $('.nj-ad').show()
     }
     }
   }
   }

+ 1 - 1
src/jfw/modules/subscribepay/src/go.mod

@@ -5,7 +5,7 @@ go 1.18
 require (
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b
 	app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230811011214-d7e0fd4ddb13
+	app.yhyue.com/moapp/jypkg v0.0.0-20230911091435-88ab01ace30b
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d
 	bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67

+ 2 - 2
src/jfw/modules/subscribepay/src/go.sum

@@ -9,8 +9,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b h1:Wtytm2QqQWtBV+s
 app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jybase v0.0.0-20230718012114-37013054344b/go.mod h1:D40Ae0rQilH8Hc5o2Vtt04Tjh/DNEFpcS3/WkJMPJb8=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloOsvp8AJ+0XeX/+PGp9QP550xlbBQ=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
-app.yhyue.com/moapp/jypkg v0.0.0-20230811011214-d7e0fd4ddb13 h1:SHHxYLu6EQRvwykoQk55vuAITLDV5dwWt1MACiXr9bs=
-app.yhyue.com/moapp/jypkg v0.0.0-20230811011214-d7e0fd4ddb13/go.mod h1:VaHDi3twSg4G84k2+UFOe7ZCw5EqUZVAkW2N2dHeMbU=
+app.yhyue.com/moapp/jypkg v0.0.0-20230911091435-88ab01ace30b h1:R9+pbsrxvLjlsIPRgMj0hxSz6VYDstqijFk0k8GWcmQ=
+app.yhyue.com/moapp/jypkg v0.0.0-20230911091435-88ab01ace30b/go.mod h1:SJnjdte+Hc5Akxp+YOfu8Mjx7G0kvKVv04LZwuM0l5s=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8viTSzEBwKYOFWq14TMfuBivSazUZMz4=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

+ 226 - 2
src/seo.json

@@ -3452,7 +3452,15 @@
 				"DESCRIPTION": "医疗器械",
 				"DESCRIPTION": "医疗器械",
 				"INDUSTRY": "YLWS"
 				"INDUSTRY": "YLWS"
 			}
 			}
-		}, {
+		},{
+        "YIYUAN": {
+          "NAME": "医院",
+          "TITLE": "医院",
+          "KEYWORDS": "医院",
+          "DESCRIPTION": "医院",
+          "INDUSTRY": "YLWS"
+        }
+    },{
 			"CT": {
 			"CT": {
 				"NAME": "CT",
 				"NAME": "CT",
 				"TITLE": "CT",
 				"TITLE": "CT",
@@ -4540,7 +4548,223 @@
 				"DESCRIPTION": "电子围栏",
 				"DESCRIPTION": "电子围栏",
 				"INDUSTRY": "RDAF"
 				"INDUSTRY": "RDAF"
 			}
 			}
-		}
+		},{
+        "XINXIHUA": {
+          "NAME": "信息化",
+          "TITLE": "信息化",
+          "KEYWORDS": "信息化",
+          "DESCRIPTION": "信息化",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "SHUJU": {
+          "NAME": "数据",
+          "TITLE": "数据",
+          "KEYWORDS": "数据",
+          "DESCRIPTION": "数据",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "XINXIXITONG": {
+          "NAME": "信息系统",
+          "TITLE": "信息系统",
+          "KEYWORDS": "信息系统",
+          "DESCRIPTION": "信息系统",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "SHUJUANQUAN": {
+          "NAME": "数据安全",
+          "TITLE": "数据安全",
+          "KEYWORDS": "数据安全",
+          "DESCRIPTION": "数据安全",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "XITONGANQUAN": {
+          "NAME": "系统安全",
+          "TITLE": "系统安全",
+          "KEYWORDS": "系统安全",
+          "DESCRIPTION": "系统安全",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "JIFANG": {
+          "NAME": "机房",
+          "TITLE": "机房",
+          "KEYWORDS": "机房",
+          "DESCRIPTION": "机房",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "CUNCHU": {
+          "NAME": "存储",
+          "TITLE": "存储",
+          "KEYWORDS": "存储",
+          "DESCRIPTION": "存储",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "ZHIHUIDANAO": {
+          "NAME": "智慧大脑",
+          "TITLE": "智慧大脑",
+          "KEYWORDS": "智慧大脑",
+          "DESCRIPTION": "智慧大脑",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "RENGONGZHINNEG": {
+          "NAME": "人工智能",
+          "TITLE": "人工智能",
+          "KEYWORDS": "人工智能",
+          "DESCRIPTION": "人工智能",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "ZHIHUIJIAOSHI": {
+          "NAME": "智慧教室",
+          "TITLE": "智慧教室",
+          "KEYWORDS": "智慧教室",
+          "DESCRIPTION": "智慧教室",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "SHIPINHUIYI": {
+          "NAME": "视频会议",
+          "TITLE": "视频会议",
+          "KEYWORDS": "视频会议",
+          "DESCRIPTION": "视频会议",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "SHUJUZHONGXIN": {
+          "NAME": "数据中心",
+          "TITLE": "数据中心",
+          "KEYWORDS": "数据中心",
+          "DESCRIPTION": "数据中心",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "JINGMIKONGTIAO": {
+          "NAME": "精密空调",
+          "TITLE": "精密空调",
+          "KEYWORDS": "精密空调",
+          "DESCRIPTION": "精密空调",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "YUNWEI": {
+          "NAME": "运维",
+          "TITLE": "运维",
+          "KEYWORDS": "运维",
+          "DESCRIPTION": "运维",
+          "INDUSTRY": "XXJS"
+        }
+      },{
+        "JIANKONG": {
+          "NAME": "监控",
+          "TITLE": "监控",
+          "KEYWORDS": "监控",
+          "DESCRIPTION": "监控",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "ANFANG": {
+          "NAME": "安防",
+          "TITLE": "安防",
+          "KEYWORDS": "安防",
+          "DESCRIPTION": "安防",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "RUODIAN": {
+          "NAME": "弱电",
+          "TITLE": "弱电",
+          "KEYWORDS": "弱电",
+          "DESCRIPTION": "弱电",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "JIAOHUANJI": {
+          "NAME": "交换机",
+          "TITLE": "交换机",
+          "KEYWORDS": "交换机",
+          "DESCRIPTION": "交换机",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "UPS": {
+          "NAME": "UPS",
+          "TITLE": "UPS",
+          "KEYWORDS": "UPS",
+          "DESCRIPTION": "UPS",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "LED": {
+          "NAME": "LED",
+          "TITLE": "LED",
+          "KEYWORDS": "LED",
+          "DESCRIPTION": "LED",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "LUYOUQI": {
+          "NAME": "路由器",
+          "TITLE": "路由器",
+          "KEYWORDS": "路由器",
+          "DESCRIPTION": "路由器",
+          "INDUSTRY": "RDAF"
+        }
+      },{
+        "HUANWEI": {
+          "NAME": "环卫",
+          "TITLE": "环卫",
+          "KEYWORDS": "环卫",
+          "DESCRIPTION": "环卫",
+          "INDUSTRY": "SZSS"
+        }
+      },{
+        "BIJIBEN": {
+          "NAME": "笔记本",
+          "TITLE": "笔记本",
+          "KEYWORDS": "笔记本",
+          "DESCRIPTION": "笔记本",
+          "INDUSTRY": "XZBG"
+        }
+      },{
+        "YIKATONG": {
+          "NAME": "一卡通",
+          "TITLE": "一卡通",
+          "KEYWORDS": "一卡通",
+          "DESCRIPTION": "一卡通",
+          "INDUSTRY": "XZBG"
+        }
+      },{
+        "TAISHIJI": {
+          "NAME": "台式机",
+          "TITLE": "台式机",
+          "KEYWORDS": "台式机",
+          "DESCRIPTION": "台式机",
+          "INDUSTRY": "XZBG"
+        }
+      },{
+        "DENGJIBAOHU": {
+          "NAME": "等级保护",
+          "TITLE": "等级保护",
+          "KEYWORDS": "等级保护",
+          "DESCRIPTION": "等级保护",
+          "INDUSTRY": "FWCG"
+        }
+      },{
+        "JIANCE": {
+          "NAME": "检测",
+          "TITLE": "检测",
+          "KEYWORDS": "检测",
+          "DESCRIPTION": "检测",
+          "INDUSTRY": "FWCG"
+        }
+      }
 	],
 	],
 	"hotlabcitySort":["北京", "上海", "天津", "重庆", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "广西", "四川", "贵州", "云南", "海南", "陕西", "甘肃", "宁夏", "青海", "新疆", "西藏", "香港", "澳门", "台湾"],
 	"hotlabcitySort":["北京", "上海", "天津", "重庆", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "广西", "四川", "贵州", "云南", "海南", "陕西", "甘肃", "宁夏", "青海", "新疆", "西藏", "香港", "澳门", "台湾"],
 	"hotlabkeywordsSort":["建筑工程", "水利水电", "能源化工", "弱电安防", "信息技术", "行政办公", "机械设备", "交通工程", "医疗卫生", "市政设施", "服务采购", "农林牧渔"],
 	"hotlabkeywordsSort":["建筑工程", "水利水电", "能源化工", "弱电安防", "信息技术", "行政办公", "机械设备", "交通工程", "医疗卫生", "市政设施", "服务采购", "农林牧渔"],

+ 46 - 46
src/web/staticres/tags/js/no-login-detail.js

@@ -1048,35 +1048,35 @@ $(function(){
   })
   })
 })
 })
 function companyAdd(){
 function companyAdd(){
-  if(s_winner){
-    var winner_con = $(".winner");
-    for(var i=0;i<winner_con.length;i++){
-      var top = getElementTop(winner_con[i]) - $(".public-nav")[0].offsetHeight - 30 + 10 + winner_con[i].offsetHeight;
-      var left = getElementLeft(winner_con[i])-getElementLeft($(".biddetail-content")[0])-110;
-      if(left>670){
-        left = 670;
-      }else if(left<-70){
-        left = -70;
-      }
-//            var top = winner_con[i].offsetTop + winner_con[i].offsetHeight + 10;
-//            var left = winner_con[i].offsetLeft;
-      $(winner_con[i]).attr("dataNum",(i+1));
-      $(winner_con[i]).append('<div id="outhistory"><div class="animathistory_ent" style="display:none;top:'+top+'px;left:'+left+'px;">'
-        +'<span class="hyone"></span>'
-        +'<span class="hytwo"></span>'
-        +'<div  id="myhtlist" style="max-height: 500px;overflow-y: auto;">'
-        +'<div class="hthead">'
-        +'<span>企业最新信息</span><span onclick="htclosed_ent()"><img src="'+goTemplateData.cdn+'/images/wx/close.png"/></span>'
-        +'</div>'
-        +'<div class="htcontent">'
-        +'</div>'
-        +'<div class="htfoot">'
-        +''
-        +'</div>'
-        +'</div>'
-        +'</div></div>');
-    }
-  }
+//   if(s_winner){
+//     var winner_con = $(".winner");
+//     for(var i=0;i<winner_con.length;i++){
+//       var top = getElementTop(winner_con[i]) - $(".public-nav")[0].offsetHeight - 30 + 10 + winner_con[i].offsetHeight;
+//       var left = getElementLeft(winner_con[i])-getElementLeft($(".biddetail-content")[0])-110;
+//       if(left>670){
+//         left = 670;
+//       }else if(left<-70){
+//         left = -70;
+//       }
+// //            var top = winner_con[i].offsetTop + winner_con[i].offsetHeight + 10;
+// //            var left = winner_con[i].offsetLeft;
+//       $(winner_con[i]).attr("dataNum",(i+1));
+//       $(winner_con[i]).append('<div id="outhistory"><div class="animathistory_ent" style="display:none;top:'+top+'px;left:'+left+'px;">'
+//         +'<span class="hyone"></span>'
+//         +'<span class="hytwo"></span>'
+//         +'<div  id="myhtlist" style="max-height: 500px;overflow-y: auto;">'
+//         +'<div class="hthead">'
+//         +'<span>企业最新信息</span><span onclick="htclosed_ent()"><img src="'+goTemplateData.cdn+'/images/wx/close.png"/></span>'
+//         +'</div>'
+//         +'<div class="htcontent">'
+//         +'</div>'
+//         +'<div class="htfoot">'
+//         +''
+//         +'</div>'
+//         +'</div>'
+//         +'</div></div>');
+//     }
+//   }
 
 
   function getElementLeft(element){
   function getElementLeft(element){
     var actualLeft = 0
     var actualLeft = 0
@@ -1122,23 +1122,23 @@ function companyAdd(){
   })
   })
 
 
   //
   //
-  if(insertflog){
-    var titleCopyNew = $("#hst");
-    titleCopyNew.append('<div id="outhistory"><div class="animathistory" style="display:none;">'
-      +'<span class="hyone"></span>'
-      +'<span class="hytwo"></span>'
-      +'<div  id="myhtlist" style="max-height: 500px;overflow-y: auto;">'
-      +'<div class="hthead">'
-      +'<span>项目公告</span><span onclick="htclosed()"><img src="'+goTemplateData.cdn+'/images/wx/close.png"/></span>'
-      +'</div>'
-      +'<div class="htcontent">'
-      +'</div>'
-      +'<div class="htfoot">'
-      +''
-      +'</div>'
-      +'</div>'
-      +'</div></div>');
-  }
+  // if(insertflog){
+  //   var titleCopyNew = $("#hst");
+  //   titleCopyNew.append('<div id="outhistory"><div class="animathistory" style="display:none;">'
+  //     +'<span class="hyone"></span>'
+  //     +'<span class="hytwo"></span>'
+  //     +'<div  id="myhtlist" style="max-height: 500px;overflow-y: auto;">'
+  //     +'<div class="hthead">'
+  //     +'<span>项目公告</span><span onclick="htclosed()"><img src="'+goTemplateData.cdn+'/images/wx/close.png"/></span>'
+  //     +'</div>'
+  //     +'<div class="htcontent">'
+  //     +'</div>'
+  //     +'<div class="htfoot">'
+  //     +''
+  //     +'</div>'
+  //     +'</div>'
+  //     +'</div></div>');
+  // }
   $("#hst").hover(function(){
   $("#hst").hover(function(){
     thishtlists();
     thishtlists();
     hstShowFlag = true;
     hstShowFlag = true;

+ 14 - 11
src/web/templates/pc/biddetail_rec.html

@@ -628,7 +628,7 @@
               }
               }
             </script>
             </script>
             <div class="cutline"></div>
             <div class="cutline"></div>
-            <div class="top-guide-container nijian-guide hidden">
+            <!-- <div class="top-guide-container nijian-guide hidden">
               <a href="/big/page/index" target="_blank">
               <a href="/big/page/index" target="_blank">
                 <img src='{{Msg "seo" "cdn"}}/images/pc/nijian-guide.png?v={{Msg "seo" "version"}}' alt="guideBanner" />
                 <img src='{{Msg "seo" "cdn"}}/images/pc/nijian-guide.png?v={{Msg "seo" "version"}}' alt="guideBanner" />
               </a>
               </a>
@@ -637,7 +637,7 @@
               <a href="/big/page/index" target="_blank">
               <a href="/big/page/index" target="_blank">
                 <img src='{{Msg "seo" "cdn"}}/images/pc/caigouyixiang-guide.png?v={{Msg "seo" "version"}}' alt="guideBanner" />
                 <img src='{{Msg "seo" "cdn"}}/images/pc/caigouyixiang-guide.png?v={{Msg "seo" "version"}}' alt="guideBanner" />
               </a>
               </a>
-            </div>
+            </div> -->
             <div class="cutline"></div>
             <div class="cutline"></div>
             <div class="com-prebuilt hidden" style="position:relative;">
             <div class="com-prebuilt hidden" style="position:relative;">
                 <div class="mask-zz hidden" style="position:absolute; top:0;width: 900px;padding:0;height: 408px;background-color:white;z-index: 1;">
                 <div class="mask-zz hidden" style="position:absolute; top:0;width: 900px;padding:0;height: 408px;background-color:white;z-index: 1;">
@@ -1677,16 +1677,19 @@ var ucbs_source="pc_rec",ucbsId="{{.T.obj.ucbsId}}";
         checkunPreBuildCanRead()
         checkunPreBuildCanRead()
         if (!canRead && !privatedata){
         if (!canRead && !privatedata){
           if (subType === '拟建') {
           if (subType === '拟建') {
-            $('.nijian-guide').removeClass('hidden')
-          } else {
-            $(".com-prebuilt").removeClass("hidden");
-            $(".com-prebuilt").css('height', '408px')
-            $('.original-text').hide()
-            $(".mask-zz").removeClass("hidden");
-            $(".tabfat").remove()
-            $(".recoveryfat").remove()
-            $("#attach-list").remove()
+            // $('.nijian-guide').removeClass('hidden')
+          }
+          if (subType === '采购意向') {
+            // $('.caigouyixiang-guide').removeClass('hidden')
           }
           }
+          $(".com-prebuilt").removeClass("hidden");
+          $(".com-prebuilt").css('height', '408px')
+          $(".mask-zz").removeClass("hidden");
+
+          $('.original-text').hide()
+          $(".tabfat").remove()
+          $(".recoveryfat").remove()
+          $("#attach-list").remove()
         } else {
         } else {
           getFileData()
           getFileData()
           $(".com-prebuilt").css('height', 'unset')
           $(".com-prebuilt").css('height', 'unset')

+ 3 - 3
src/web/templates/pc/classifylist.html

@@ -640,14 +640,14 @@ function priceCss(){
 				<div class="info-content">
 				<div class="info-content">
 					<span id="infoBtn" class=" active">全部</span>
 					<span id="infoBtn" class=" active">全部</span>
 					<i class="diver"></i>
 					<i class="diver"></i>
-					<font class="parent-node infoFist">拟建项目</font>
+					<font class="parent-node infoFist nologin-hide">拟建项目</font>
 					<font data-value="拟建" class="hidden">拟建</font>
 					<font data-value="拟建" class="hidden">拟建</font>
-					<a id="whole"><img class="q-mark" id="q-mark"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
+					<a id="whole"><img class="q-mark nologin-hide" id="q-mark"  src="{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png" alt="" /></a>
 					<i class="diver nologin-hide"></i>
 					<i class="diver nologin-hide"></i>
 					<font class="parent-node nologin-hide">采购意向</font>
 					<font class="parent-node nologin-hide">采购意向</font>
 					<font data-value="采购意向" class="hidden">采购意向</font>
 					<font data-value="采购意向" class="hidden">采购意向</font>
 					<a id="whole"><img class="q-mark-buyer nologin-hide" id="q-mark-buyer"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
 					<a id="whole"><img class="q-mark-buyer nologin-hide" id="q-mark-buyer"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
-					<i class="diver"></i>
+					<i class="diver nologin-hide"></i>
 					<font class="parent-node">招标预告</font>
 					<font class="parent-node">招标预告</font>
 					<font data-value="预告">预告</font>
 					<font data-value="预告">预告</font>
 					<font data-value="预审">预审</font>
 					<font data-value="预审">预审</font>

+ 4 - 5
src/web/templates/pc/index.html

@@ -114,11 +114,10 @@
             <div class="hot-banner">
             <div class="hot-banner">
               <div class="left yellow">项目数据</div>
               <div class="left yellow">项目数据</div>
               <div class="right">
               <div class="right">
-                <!-- {{if .T.hasLogin}}
-                <a href="/page_workDesktop/work-bench/page?link=/jylab/supsearch/index.html?subtype=拟建">拟建项目</a>
-                {{else}}
-                <a href="/list/stype/NJXM.html">拟建项目</a>
-                {{end}} -->
+<!--                {{if .T.hasLogin}}-->
+<!--                <a href="/page_workDesktop/work-bench/page?link=/jylab/supsearch/index.html?subtype=拟建">拟建项目</a>-->
+<!--                {{end}}-->
+
 <!--                {{if .T.hasLogin}}-->
 <!--                {{if .T.hasLogin}}-->
 <!--                <a href="/page_workDesktop/work-bench/page?link=/jylab/supsearch/index.html?subtype=采购意向">采购意向</a>-->
 <!--                <a href="/page_workDesktop/work-bench/page?link=/jylab/supsearch/index.html?subtype=采购意向">采购意向</a>-->
 <!--                {{else}}-->
 <!--                {{else}}-->

+ 8 - 0
src/web/templates/pc/index_old.html

@@ -392,13 +392,18 @@
       <div class="newNotice">
       <div class="newNotice">
         <h3 class="CfadeInUp">最新公告信息</h3>
         <h3 class="CfadeInUp">最新公告信息</h3>
           <div class="newNotice-header CfadeInUp">
           <div class="newNotice-header CfadeInUp">
+            {{ if .T.newArticle_1 }}
             <span class="active">拟建项目</span>
             <span class="active">拟建项目</span>
             <span>招标预告</span>
             <span>招标预告</span>
+            {{ else }}
+            <span class="active">招标预告</span>
+            {{end}}
             <span>招标公告</span>
             <span>招标公告</span>
             <span>招标结果</span>
             <span>招标结果</span>
             <i></i>
             <i></i>
          </div>
          </div>
          <div class="newNotice-content CfadeInUp">
          <div class="newNotice-content CfadeInUp">
+           {{if .T.newArticle_1}}
             <div class="tab-content-list" style="display: block;">
             <div class="tab-content-list" style="display: block;">
               <ul>
               <ul>
                 {{range $i, $v := .T.newArticle_1}}
                 {{range $i, $v := .T.newArticle_1}}
@@ -416,6 +421,9 @@
               </ul>
               </ul>
             </div>
             </div>
             <div class="tab-content-list">
             <div class="tab-content-list">
+              {{else}}
+              <div class="tab-content-list"  style="display: block;">
+              {{end}}
               <ul>
               <ul>
                 {{range $i, $v := .T.newArticle_2}}
                 {{range $i, $v := .T.newArticle_2}}
                  <li><a data-id="{{$v._id}}" href="/article/indexcontent/{{$v._id}}.html" target="_blank">
                  <li><a data-id="{{$v._id}}" href="/article/indexcontent/{{$v._id}}.html" target="_blank">

+ 3 - 3
src/web/templates/pc/supsearch.html

@@ -1220,14 +1220,14 @@
             <div class="info-content bi-change-group">
             <div class="info-content bi-change-group">
               <span id="infoBtn" class="active">全部</span>
               <span id="infoBtn" class="active">全部</span>
               <i v-show="showCQ" class="diver"></i>
               <i v-show="showCQ" class="diver"></i>
-              <font v-show="showCQ" class="parent-node">拟建项目</font>
+              <font v-show="showCQ" class="parent-node nologin-hide">拟建项目</font>
               <font v-show="showCQ" data-value="拟建" class="hidden">拟建</font>
               <font v-show="showCQ" data-value="拟建" class="hidden">拟建</font>
-              <a v-show="showCQ" id="whole"><img class="q-mark" id="q-mark"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
+              <a v-show="showCQ" id="whole"><img class="q-mark nologin-hide" id="q-mark"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
               <i v-show="showCQ" class="diver nologin-hide"></i>
               <i v-show="showCQ" class="diver nologin-hide"></i>
               <font v-show="showCQ" class="parent-node nologin-hide">采购意向</font>
               <font v-show="showCQ" class="parent-node nologin-hide">采购意向</font>
               <font v-show="showCQ" data-value="采购意向" class="hidden">采购意向</font>
               <font v-show="showCQ" data-value="采购意向" class="hidden">采购意向</font>
               <a v-show="showCQ" id="whole"><img class="q-mark-buyer nologin-hide" id="q-mark-buyer"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
               <a v-show="showCQ" id="whole"><img class="q-mark-buyer nologin-hide" id="q-mark-buyer"  src='{{Msg "seo" "cdn"}}/images/biddingSearch/info-icon1.png' alt="" /></a>
-              <i v-show="hideCQ" class="diver"></i>
+              <i v-show="hideCQ" class="diver nologin-hide"></i>
               <font v-show="hideCQ" class="parent-node">招标预告</font>
               <font v-show="hideCQ" class="parent-node">招标预告</font>
               <font v-show="hideCQ" data-value="预告">预告</font>
               <font v-show="hideCQ" data-value="预告">预告</font>
               <font v-show="hideCQ" data-value="预审">预审</font>
               <font v-show="hideCQ" data-value="预审">预审</font>

+ 0 - 28
src/web/templates/pc/tags/index.html

@@ -43,34 +43,6 @@
                         {{end}}
                         {{end}}
                     </h2>
                     </h2>
                 </section>
                 </section>
-
-                {{if ne .T.type "letter" }}
-                    <!-- 筛选器 -->
-                    <section class="section section-card selector-card-container" hidden>
-                        <!-- 项目地区模块  -->
-                        <section class="selector-card" >
-                            <header class="selector-card-header">项目地区:</header>
-                            <div class="selector-card-content">
-                            {{if eq .T.type "area"}}
-                            <!--  行业选择器不要地市-->
-                                {{include "/pc/tags/template/area-selector.html"}}
-                            {{else}}
-                              <!-- 地区模块儿需要地市选择  -->
-                              {{include "/pc/tags/template/area-selector-without-city.html"}}
-                            {{end}}
-                            </div>
-                        </section>
-                        <!-- 信息类型模块  -->
-                        {{if eq .T.haveList true}}
-                        <section class="selector-card">
-                            <header class="selector-card-header">信息类型:</header>
-                            <div class="selector-card-content">
-                                {{include "/pc/tags/template/info-type-selector.html"}}
-                            </div>
-                        </section>
-                        {{end}}
-                    </section>
-                {{end}}
                 <!-- 筛选结果列表模块 -->
                 <!-- 筛选结果列表模块 -->
                 {{if eq .T.haveList true}}
                 {{if eq .T.haveList true}}
                     {{include "/pc/tags/template/search-list.html"}}
                     {{include "/pc/tags/template/search-list.html"}}

+ 11 - 15
src/web/templates/weixin/wxinfocontent_rec.html

@@ -1066,12 +1066,10 @@ body .loading_ p span {
 	<img src="{{Msg "seo" "cdn"}}/images/wx/newuser.png"/>
 	<img src="{{Msg "seo" "cdn"}}/images/wx/newuser.png"/>
 	</div>
 	</div>
 <!--    免费用户或未登录-->
 <!--    免费用户或未登录-->
-    <div class="big-ad-img free-btn-reword">
-<!--        拟建项目显示-->
-        <img class="nj-ad" src="{{Msg "seo" "cdn"}}/images/focontent/ad_bigmember2.png"/>
-<!--        采购意向显示-->
-        <img class="cgyx-ad" src="{{Msg "seo" "cdn"}}/images/focontent/ad_bigmember.png"/>
-    </div>
+    <!-- <div class="big-ad-img free-btn-reword">
+        <img class="nj-ad" alt="拟建项目" src="{{Msg "seo" "cdn"}}/images/focontent/ad_bigmember2.png"/>
+        <img class="cgyx-ad" alt="采购意向" src="{{Msg "seo" "cdn"}}/images/focontent/ad_bigmember.png"/>
+    </div> -->
 	<div class="fatNav" style="display:none;">
 	<div class="fatNav" style="display:none;">
 		<div class="childNav">
 		<div class="childNav">
 			<div class="tab1 active" onclick="tabCh(1)">
 			<div class="tab1 active" onclick="tabCh(1)">
@@ -1852,14 +1850,12 @@ function checkShowDialog () {
 	// 显示隐藏
 	// 显示隐藏
 	if (!canRead) {
 	if (!canRead) {
 		// $(".prebuilt").remove()
 		// $(".prebuilt").remove()
-       if(subtype != '拟建') {
-         $('#tab2').hide() // 摘要tab1+正文tab2
-         $(".tab-ct").hide() // 正文信息
-         $(".abs").hide() // 阅读原文和意见反馈
-         $(".atta-list").hide() // 附件列表
-         $(".mask-zz").removeClass("hidden");
-         $(".reward").hide();
-       }
+		$('#tab2').hide() // 摘要tab1+正文tab2
+		$(".tab-ct").hide() // 正文信息
+		$(".abs").hide() // 阅读原文和意见反馈
+		$(".atta-list").hide() // 附件列表
+		$(".mask-zz").removeClass("hidden");
+		$(".reward").hide();
 	} else {
 	} else {
 		$(".prebuilt").css('height', 'unset')
 		$(".prebuilt").css('height', 'unset')
 		$('.third-party-verify').show()
 		$('.third-party-verify').show()
@@ -1868,7 +1864,7 @@ function checkShowDialog () {
 // 是否展示详情上方的广告位
 // 是否展示详情上方的广告位
 function showTopAd () {
 function showTopAd () {
   if(!canRead && subtype == '拟建') {
   if(!canRead && subtype == '拟建') {
-    $('.big-ad-img').show()
+    // $('.big-ad-img').show()
     $('.nj-ad').show()
     $('.nj-ad').show()
   }
   }
 }
 }