Browse Source

fenzhihebing

lianbingjie 1 year ago
parent
commit
2c53477092
46 changed files with 2257 additions and 503 deletions
  1. 1 1
      src/config.json
  2. 1 1
      src/go.mod
  3. 2 2
      src/go.sum
  4. 2 3
      src/jfw/config/config.go
  5. 6 11
      src/jfw/front/classificationTag.go
  6. 143 18
      src/jfw/front/pcIndex.go
  7. 658 412
      src/jfw/front/tags.go
  8. 2 0
      src/jfw/modules/app/src/app/filter/loginfilter.go
  9. 142 3
      src/jfw/modules/app/src/app/front/tags.go
  10. 516 0
      src/jfw/modules/app/src/app/jyutil/strategy.go
  11. 10 1
      src/jfw/modules/app/src/app/jyutil/tags.go
  12. 43 1
      src/jfw/modules/app/src/seo.json
  13. 7 0
      src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/j-icons.css
  14. 92 0
      src/jfw/modules/app/src/web/staticres/jyapp/tags/css/tags-module-common.css
  15. 232 0
      src/jfw/modules/app/src/web/staticres/jyapp/tags/css/tags-strategy.css
  16. BIN
      src/jfw/modules/app/src/web/staticres/jyapp/tags/img/strategy-ad-bg.png
  17. 43 0
      src/jfw/modules/app/src/web/templates/tags/class.html
  18. 73 0
      src/jfw/modules/app/src/web/templates/tags/details.html
  19. 48 0
      src/jfw/modules/app/src/web/templates/tags/strategy.html
  20. 1 1
      src/jfw/modules/app/src/web/templates/tags/template/tag-breadcrumb-navigation.html
  21. 24 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-strategy-recommend.html
  22. 31 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-strategy-title.html
  23. 23 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-card-strategy.html
  24. 0 12
      src/jfw/modules/app/src/web/templates/tags/template/tag-footer.html
  25. 19 0
      src/jfw/modules/app/src/web/templates/tags/template/tag-strategy-nav.html
  26. 4 4
      src/jfw/modules/app/src/web/templates/weixin/tabbar.html
  27. 1 1
      src/jfw/modules/publicapply/src/go.mod
  28. 2 0
      src/jfw/modules/publicapply/src/go.sum
  29. 1 1
      src/jfw/modules/subscribepay/src/go.mod
  30. 2 2
      src/jfw/modules/subscribepay/src/go.sum
  31. 10 4
      src/seo.json
  32. 1 1
      src/web/staticres/css/pc/index.css
  33. 1 0
      src/web/staticres/frontRouter/pc/industryInfo/css/industry_detail.css
  34. 6 2
      src/web/staticres/js/superSearch.js
  35. 5 1
      src/web/staticres/public-pc/js/article-content.js
  36. 1 0
      src/web/staticres/site/page/industryInfo/css/industry_detail.css
  37. 1 0
      src/web/staticres/site/page/jySchool/css/introduction_detail.css
  38. 5 1
      src/web/staticres/tags/js/no-login-detail.js
  39. 1 1
      src/web/templates/common/pcbottom.html
  40. 23 3
      src/web/templates/pc/biddetail.html
  41. 15 3
      src/web/templates/pc/biddetail_rec.html
  42. 26 5
      src/web/templates/pc/index.html
  43. 29 4
      src/web/templates/pc/tags/detail.html
  44. 2 2
      src/web/templates/pc/tags/index.html
  45. 1 1
      src/web/templates/site/page/jySchool/class.html
  46. 1 1
      src/web/templates/site/page/jySchool/search.html

File diff suppressed because it is too large
+ 1 - 1
src/config.json


+ 1 - 1
src/go.mod

@@ -6,7 +6,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230308011651-df591d32df88
 	app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230825092743-3bfc415bb5bb
+	app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/bwmarrin/snowflake v0.3.0

+ 2 - 2
src/go.sum

@@ -9,8 +9,8 @@ app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40 h1:/FcBvpf/KW8g6GB
 app.yhyue.com/moapp/jybase v0.0.0-20230901064756-2fc66b18db40/go.mod h1:Hv9U/7oHRucqH315Tr1+d03NCvS9mOKPfk8pwwlOIwQ=
 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/jypkg v0.0.0-20230825092743-3bfc415bb5bb h1:J9CQ60meKlABYqeOB6zdZXJtBHAsJqnHeWhd/OOCUtU=
-app.yhyue.com/moapp/jypkg v0.0.0-20230825092743-3bfc415bb5bb/go.mod h1:VaHDi3twSg4G84k2+UFOe7ZCw5EqUZVAkW2N2dHeMbU=
+app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d h1:uSr/OJCLEnquTTF5rUnxlcPD1gwoCiTi1nAd+e0Cx8E=
+app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d/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/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

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

@@ -28,7 +28,6 @@ var (
 	Middleground         *middleground.Middleground
 	HotWinnerConfig      HotConfig
 	HotBuyerConfig       HotConfig
-	SubjectMatter        []map[string]interface{}
 	IpList               *ipmatch.WhiteIp
 	IpInitLock           sync.RWMutex //锁
 )
@@ -75,7 +74,7 @@ func init() {
 		RegResourceCenter(g.Cfg().MustGet(ctx, "resourceCenterKey").String()).
 		RegEntManageApplication(g.Cfg().MustGet(ctx, "entManageApplication").String()).
 		RegPublicservice(g.Cfg().MustGet(ctx, "publicserviceKey").String())
-	SubjectMatter = GetLetterMap(util.InterfaceToStr(Sysconfig["hotSubjectMatter"]))
+	//SubjectMatter = GetLetterMap(util.InterfaceToStr(Sysconfig["hotSubjectMatter"]))
 }
 
 func IpInit() {
@@ -106,7 +105,7 @@ func GetLetterMap(names string) []map[string]interface{} {
 	for _, v := range nameArr {
 		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.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 {
 		var isNormal bool

+ 6 - 11
src/jfw/front/classificationTag.go

@@ -52,14 +52,6 @@ func RegionAndInformationAndTender() map[string]interface{} {
 	return data
 }
 
-// HotSubjectMatter 热门标的物
-func HotSubjectMatter() []map[string]interface{} {
-	if config.SubjectMatter == nil || len(config.SubjectMatter) == 0 {
-		config.SubjectMatter = config.GetLetterMap(qu.InterfaceToStr(config.Seoconfig["hotSubjectMatter"]))
-	}
-	return config.SubjectMatter
-}
-
 // 最新更新的200中标企业
 func GetWinnerInfo() (data []*BuyerList) {
 	// 取缓存
@@ -186,9 +178,10 @@ func ContentRecommendation() []KeyType {
 }
 
 type Signal struct {
-	Name string                   `json:"name"`
-	Url  string                   `json:"url"`
-	Data []map[string]interface{} `json:"data"`
+	Name       string                   `json:"name"`
+	Url        string                   `json:"url"`
+	UnLoginUrl string                   `json:"unLoginUrl"`
+	Data       []map[string]interface{} `json:"data"`
 }
 
 // 推荐标讯
@@ -205,6 +198,7 @@ func RecommendationBeacon() []Signal {
 	sy := sync.RWMutex{}
 	wg := sync.WaitGroup{}
 	var data, dataArr []Signal
+	infoType := qu.ObjToMap(config.Seoconfig["infoTypeToLetter"])
 	for _, v := range []string{"招标预告", "招标公告", "招标结果", "招标信用信息"} {
 		wg.Add(1)
 		go func(vst string) {
@@ -228,6 +222,7 @@ func RecommendationBeacon() []Signal {
 			}
 			var d Signal
 			d.Name = vst
+			d.UnLoginUrl = fmt.Sprintf("/list/stype/%s.html", (*infoType)[vst])
 			d.Url = fmt.Sprintf("/jylab/supsearch/index.html?subtype=%s", vst)
 			d.Data = list
 			sy.Lock()

+ 143 - 18
src/jfw/front/pcIndex.go

@@ -12,6 +12,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode"
 
 	util "app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/encrypt"
@@ -38,18 +39,23 @@ type PcIndex struct {
 	searchResult  xweb.Mapper `xweb:"/list/(\\w+)/(\\w+).html"` //剑鱼标讯分类 地区结果列表
 }
 
-var hotKeyArr = []string{}
+var (
+	hotKeyArrLoginEd                []string
+	subjectMatter, hotKeyArrUnLogin []*hotKeyWord
+)
 
 func init() {
 	xweb.AddAction(&PcIndex{})
 	// 每隔5分钟更新一次随机词
 	go func() {
-		hotKeyArr = GetIndexHotKey()
-		ticker := time.NewTicker(300 * time.Second)
-		for range ticker.C {
-			hotKeyArr = GetIndexHotKey()
+		getIndexHotKeyNoLogin := getIndexHotKeyNoLoginFunc()
+		hotKeyArrLoginEd, hotKeyArrUnLogin = GetIndexHotKey(), getIndexHotKeyNoLogin()
+		for range time.NewTicker(300 * time.Second).C {
+			hotKeyArrLoginEd, hotKeyArrUnLogin = GetIndexHotKey(), getIndexHotKeyNoLogin()
 		}
 	}()
+
+	subjectMatter = getLetterMap(strings.Split(util.InterfaceToStr(config.Sysconfig["hotSubjectMatter"]), ","))
 }
 
 func (this PcIndex) BrandIndex() error {
@@ -71,6 +77,7 @@ func (m *PcIndex) NewSordfish(flag string) error {
 		pageSize = 50
 	}
 	var shareid = m.GetString("id")
+	userId, _ := m.GetSession("userId").(string)
 	pcindexKey := "jypcindex"
 	if cacheKey, _ := config.Sysconfig["pcindexCacheKey"].(string); cacheKey != "" {
 		pcindexKey = cacheKey
@@ -143,7 +150,7 @@ func (m *PcIndex) NewSordfish(flag string) error {
 			return m.Render("/pc/index_tmp.html", &m.T)
 		} else {
 			var entIsNew bool
-			if m.GetSession("userId") != "" {
+			if userId != "" {
 				bigBaseMsg := jy.GetBigVipUserBaseMsg(m.Session(), *config.Middleground)
 				entIsNew = bigBaseMsg.EntIsNew
 			}
@@ -178,7 +185,7 @@ func (m *PcIndex) NewSordfish(flag string) error {
 				m.T["labUrl_2"] = appendData
 			}
 			//热门标的物
-			m.T["hotSubject"] = HotSubjectMatter()
+			m.T["hotSubject"] = subjectMatter
 			//实用内容推荐
 			m.T["recommend"] = ContentRecommendation()
 			m.T["jycmsLink"] = GetJycmsAreaLink()
@@ -198,11 +205,12 @@ func (m *PcIndex) NewSordfish(flag string) error {
 				}
 			}
 			m.T["strategyList"] = strategyList
-			m.T["hasLogin"] = util.ObjToString(m.GetSession("userId")) != ""
+			m.T["hasLogin"] = userId != ""
 			m.T["includedInfo"] = GetIncludedInfo()
 			m.T["hotWinner"] = GetWinnerInfo()
 			m.T["newbids"] = NewIndexbids(m.Session(), m.Request)
-			m.T["hotkey"] = hotKeyArr
+			m.T["hotkey"] = hotKeyArrLoginEd
+			m.T["hotKeyArrUnLogin"] = hotKeyArrUnLogin
 			m.T["simpleTemplateData"] = map[string]interface{}{"XwebVer": m.T["XwebVer"]} //清除前端js获取模版标签变量
 			return m.Render("/pc/index.html", &m.T)
 		}
@@ -647,12 +655,13 @@ func getstypeMap() []map[string][]map[string]interface{} {
 			stypename := util.ObjToString(stype["NAME"])
 			if stypename == "拟建" {
 				stypename = "拟建项目"
+				continue
 			}
 			m[stypename] = k
 		}
 	}
 	m2 := []map[string][]map[string]interface{}{} //结构整理 返给前端
-	stype_1reg := []string{"招标公告", "招标结果", "招标信用信息", "招标预告", "拟建项目"}
+	stype_1reg := []string{"招标公告", "招标结果", "招标信用信息", "招标预告"}
 	hotlabstypSort := config.Seoconfig["hotlabstypSort"].([]interface{})
 	notice := util.ObjArrToStringArr(hotlabstypSort[0].([]interface{}))
 	result := util.ObjArrToStringArr(hotlabstypSort[1].([]interface{}))
@@ -680,9 +689,10 @@ func getstypeMap() []map[string][]map[string]interface{} {
 func stypeformat(k int, v string, m map[string]interface{}, m1 []map[string][]map[string]interface{}, arr []string) []map[string][]map[string]interface{} {
 	for _, vv := range arr {
 		vvstr := vv
-		if strings.Contains(vv, "其它") {
-			vvstr = "其它"
-		}
+		//log.Println("按信息类型1111:", vv)
+		//if strings.Contains(vv, "其它") {
+		//	//vvstr = "其它"
+		//}
 		m1[k][v] = append(m1[k][v], map[string]interface{}{"key": vvstr, "url": fmt.Sprintf("/list/stype/%s.html", m[vv])})
 	}
 	return m1
@@ -782,20 +792,135 @@ func InSeoContent(arr *[]map[string]interface{}) {
 	}
 }
 
-func GetIndexHotKey() []string {
-	pcIndexHotKey := util.ObjArrToStringArr(config.Sysconfig["pcIndexHotKey"].([]interface{}))
+func GetIndexHotKey() (loginEd []string) {
 	pcIndexHotKeyLimit := util.Int64All(config.Sysconfig["pcIndexHotKeyLimit"])
+	pcIndexHotKey := util.ObjArrToStringArr(config.Sysconfig["pcIndexHotKey"].([]interface{}))
+
 	// 定义一个函数,用于从数组words中随机取出几个词
 	m := map[string]bool{}
 	for _, v := range pcIndexHotKey {
 		m[v] = true
 	}
-	result := []string{}
 	for key, _ := range m {
-		result = append(result, key)
-		if len(result) == int(pcIndexHotKeyLimit) {
+		loginEd = append(loginEd, key)
+		if len(loginEd) == int(pcIndexHotKeyLimit) {
 			break
 		}
 	}
+	return
+}
+
+var getIndexHotKeyNoLoginFunc = func() func() []*hotKeyWord {
+	limit := util.IntAll(config.Sysconfig["pcIndexHotKeyLimit"])
+	//获取未登录关键词
+	configVal, _ := config.Sysconfig["pcIndexHotKeyUnLogin"].([]interface{})
+	rData := getLetterMap(util.ObjArrToStringArr(configVal))
+	rLen := len(rData)
+	return func() (final []*hotKeyWord) {
+		if rData == nil {
+			return nil
+		}
+		if limit > rLen {
+			return rData
+		}
+
+		repeat := map[string]bool{}
+		for len(final) < limit {
+			rand.Seed(time.Now().UnixNano())
+			if val := rData[rand.Intn(rLen)]; !repeat[val.Name] {
+				final = append(final, val)
+				repeat[val.Name] = true
+			}
+		}
+		return
+	}
+}
+
+type hotKeyWord struct {
+	Name string
+	Url  string
+}
+
+// getLetterMap 获取关键词对应的链接,若没有则插入
+func getLetterMap(nameArr []string) []*hotKeyWord {
+	var (
+		data                                   []*hotKeyWord
+		nameArr1, nameArr2, nameArr3, nameArr4 []string
+	)
+	if len(nameArr) == 0 {
+		return nil
+	}
+	for _, v := range nameArr {
+		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, ",")))
+	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 {
+		var isNormal bool
+		if dataArr1 != nil && len(*dataArr1) > 0 {
+			for _, v2 := range *dataArr1 {
+				if v1 == v2["name"] {
+					isNormal = true
+					data = append(data, &hotKeyWord{
+						Name: v1 + util.ObjToString(config.Seoconfig["seoKeywordSuffix"]),
+						Url:  fmt.Sprintf("/tags/industry/%v_all_all_%v.html", util.Int64All(v2["class_id"]), util.Int64All(v2["id"])),
+					})
+				}
+			}
+		}
+		if !isNormal {
+			if dataArr2 != nil && len(*dataArr2) > 0 {
+				for _, v2 := range *dataArr2 {
+					if v1 == v2["name"] {
+						isNormal = true
+						letter := util.ObjToString(v2["letter"])
+						id := util.Int64All(v2["id"])
+						v1 += util.ObjToString(config.Seoconfig["seoKeywordSuffix"])
+						data = append(data, &hotKeyWord{
+							Name: v1,
+							Url:  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
+						})
+					}
+				}
+			}
+		}
+		if !isNormal {
+			nameArr2 = append(nameArr2, v1)
+			nameArr3 = append(nameArr3, fmt.Sprintf(`"%s"`, v1))
+			letter := getFirstLetter(v1)
+			nameArr4 = append(nameArr4, fmt.Sprintf(`("%s", "%s", 1)`, v1, letter))
+		}
+	}
+	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, ",")))
+		if dataArr3 != nil {
+			for _, v3 := range *dataArr3 {
+				letter := util.ObjToString(v3["letter"])
+				id := util.Int64All(v3["id"])
+				n := util.ObjToString(v3["name"])
+				n += util.ObjToString(config.Seoconfig["seoKeywordSuffix"])
+				data = append(data, &hotKeyWord{
+					Name: n,
+					Url:  fmt.Sprintf("/tags/letter/all_all_all_%v_%v.html", letter, id),
+				})
+			}
+		}
+	}
+	return data
+}
+
+// 获取字符串的首字母大写形式
+func getFirstLetter(s string) string {
+	words := strings.Fields(s) // 将字符串分割成单词
+	var result string
+	for _, word := range words {
+		firstChar := []rune(word)[0] // 获取单词的第一个字符
+
+		// 检查字符是否为汉字或英文字母
+		if unicode.Is(unicode.Han, firstChar) || unicode.IsLetter(firstChar) {
+			result += strings.ToUpper(string(firstChar))
+		}
+	}
 	return result
 }

File diff suppressed because it is too large
+ 658 - 412
src/jfw/front/tags.go


+ 2 - 0
src/jfw/modules/app/src/app/filter/loginfilter.go

@@ -32,6 +32,8 @@ var urls = []*regexp.Regexp{
 	regexp.MustCompile("^/jyapp/big/page/ent_portrait$"),
 	regexp.MustCompile("^/jyapp/big/page/ent_portrait_change$"),
 	regexp.MustCompile("^/jyapp/s/.*"),
+	regexp.MustCompile("^/jySchool/.*"),
+	regexp.MustCompile("^/jySite/.*"),
 	regexp.MustCompile("^/jyapp/initialize/whiteList"),
 }
 

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

@@ -39,10 +39,18 @@ var (
 	cookieNum = 4
 )
 
+const (
+	pageSize = 20
+	indexNum = 8
+)
+
 type Tags struct {
 	*xweb.Action
-	tagsIndex xweb.Mapper `xweb:"/jyapp/s/(\\w+)/(\\w+)/(\\w+).html"`
-	isLogin   xweb.Mapper `xweb:"/jyapp/free/isLogin"`
+	//tagsIndex     xweb.Mapper `xweb:"/jyapp/s/(\\w+)/(\\w+)/(\\w+).html"`
+	isLogin       xweb.Mapper `xweb:"/jyapp/free/isLogin"`
+	strategyIndex xweb.Mapper `xweb:"/jySchool/strategy"`
+	class         xweb.Mapper `xweb:"/jySchool/(.*)/index([^.]*).html"`
+	details       xweb.Mapper `xweb:"/jySite/([^.]*).html"`
 }
 
 func init() {
@@ -101,6 +109,8 @@ func init() {
 	jyutil.GetAllArea()
 	//热门地区
 	jyutil.GetHotArea()
+	//招投标攻略
+	jyutil.InitColumnData()
 	//cookie num
 	cookieNum = qu.If(config.Seoconfig["cookieNum"] != nil, qu.IntAll(config.Seoconfig["cookieNum"]), cookieNum).(int)
 }
@@ -300,7 +310,16 @@ onceAgain:
 			tg.T["adList"] = jyutil.GetAdInfo(tg.Request.Host)
 		}
 		if biddingInfo.IsSearch {
-			tg.T["biddingList"] = biddingInfo.GetBiddingInfo(types, codes, currentLocation, isInfoList)
+			biddingList := biddingInfo.GetBiddingInfo(types, codes, currentLocation, isInfoList)
+			if types == "home" {
+				strategyList := jyutil.GetNewStrategy(qu.ObjToString(config.Seoconfig["strategyCode"]), indexNum)
+				biddingList = append(biddingList, &jyutil.InfoRes{
+					Name: "招投标攻略",
+					Url:  fmt.Sprintf("/jySchool/strategy"),
+					List: strategyList,
+				})
+			}
+			tg.T["biddingList"] = biddingList
 		}
 		if biddingInfo.PageNum == 1 {
 			prevPage = ""
@@ -344,3 +363,123 @@ onceAgain:
 		return tg.SetBody([]byte(res.(string)))
 	}
 }
+
+// 招投标攻略列表页面
+func (tg *Tags) StrategyIndex() {
+	var (
+		platform = "PC"
+	)
+	//是否是移动端
+	if bm := mobileUrl.MatchString(tg.Request.Referer()) || mobileUrl.MatchString(tg.Request.Host); bm {
+		platform = "Mobile"
+	}
+	infoTypeList, _ := jyutil.GetInfoType()
+	var strategyList []map[string]interface{}
+	for _, item := range jyutil.GuidelineColumn().SeedData {
+		if res := jyutil.Guideline(item.Code, 3); res != nil && len(*res) > 0 {
+			strategyList = append(strategyList, map[string]interface{}{
+				"name": item.Name,
+				"code": item.Code,
+				"list": res,
+			})
+		}
+	}
+	tg.T["strategyList"] = strategyList
+	tg.T["hotArea"] = jyutil.HotAreas
+	tg.T["infoTypeList"] = infoTypeList
+	tg.T["areaList"] = jyutil.AreaInfo
+	tg.T["tdk"] = jyutil.GetTdk("strategy", qu.ObjToString(config.Seoconfig["strategyCode"]))
+	tg.T["Home"] = qu.If(platform == "PC", "/", "/jyapp/jylab/mainSearch").(string)
+	tg.T["currentLocation"] = jyutil.NavigationBar(qu.ObjToString(config.Seoconfig["strategyCode"]), false)
+	tg.Render("/tags/strategy.html", &tg.T)
+}
+
+// 招投标攻略分类页面
+func (tg *Tags) Class(thisCode string, pageNumStr string) {
+	var (
+		platform = "PC"
+	)
+	//是否是移动端
+	if bm := mobileUrl.MatchString(tg.Request.Referer()) || mobileUrl.MatchString(tg.Request.Host); bm {
+		platform = "Mobile"
+	}
+	var classList []map[string]interface{}
+	var prevPage, nextPage string
+	for _, v := range jyutil.GuidelineColumn().SeedData {
+		if v.Name != "" && v.Code != "" {
+			classList = append(classList, map[string]interface{}{
+				"name": v.Name,
+				"code": v.Code,
+			})
+		}
+	}
+	// 列表正文
+	var pageNum string = "1"
+	if pageNumStr != "" {
+		pageNum = pageNumStr[1:]
+	}
+	data, _, total := jyutil.JyCmsSearch(map[string]string{
+		"perPage":              fmt.Sprint(pageSize),
+		"currentPage":          pageNum,
+		"s_secondclassifytype": thisCode,
+	}, "")
+	if pageNum != "1" {
+		prevPage = fmt.Sprintf("%d", qu.IntAll(pageNum)-1)
+	}
+	nextPage = fmt.Sprintf("%d", qu.IntAll(pageNum)+1)
+	if qu.IntAll(pageNum) == (total-1)/pageSize+1 {
+		nextPage = ""
+	}
+	// 分页
+	infoTypeList, _ := jyutil.GetInfoType()
+	tg.T["list"] = data
+	tg.T["total"] = total
+	tg.T["code"] = thisCode
+	tg.T["classNav"] = jyutil.ClassNavBar()
+	tg.T["hotArea"] = jyutil.HotAreas
+	tg.T["infoTypeList"] = infoTypeList
+	tg.T["currentLocation"] = jyutil.NavigationBar(thisCode, false)
+	tg.T["areaList"] = jyutil.AreaInfo
+	tg.T["Home"] = qu.If(platform == "PC", "/", "/jyapp/jylab/mainSearch").(string)
+	tg.T["prevPage"] = qu.If(prevPage != "", fmt.Sprintf("/jySchool/%s/index_%s.html", thisCode, prevPage), "").(string)
+	tg.T["nextPage"] = qu.If(nextPage != "", fmt.Sprintf("/jySchool/%s/index_%s.html", thisCode, nextPage), "").(string)
+	tg.T["totalPage"] = (total-1)/qu.IntAll(pageSize) + 1
+	tg.T["pageNum"] = qu.IntAll(pageNum)
+	tg.T["tdk"] = jyutil.GetTdk("strategy", thisCode)
+	tg.Render("/tags/class.html", &tg.T)
+}
+
+// 详情
+func (tg *Tags) Details(id string) {
+	var (
+		platform = "PC"
+	)
+	//是否是移动端
+	if bm := mobileUrl.MatchString(tg.Request.Referer()) || mobileUrl.MatchString(tg.Request.Host); bm {
+		platform = "Mobile"
+	}
+	sid := se.DecodeString(id)
+	sCode, tCode := jyutil.GetSiteInfo(sid)
+	// 文章栏目名
+	tg.T["pCode"] = sCode
+	// 文章内容
+	data := jyutil.GetBlogDetail(id)
+	infoTypeList, _ := jyutil.GetInfoType()
+	tg.T["data"] = data
+	//上一页、下一页
+	tg.T["lastId"], tg.T["nextId"] = jyutil.GetNextInfo(sid)
+	tg.T["bottomInfo"] = jyutil.GuidelineDetails(sid)
+
+	tg.T["hotArea"] = jyutil.HotAreas
+	tg.T["infoTypeList"] = infoTypeList
+	tg.T["areaList"] = jyutil.AreaInfo
+	tg.T["Home"] = qu.If(platform == "PC", "/", "/jyapp/jylab/mainSearch").(string)
+	currentLocation := jyutil.NavigationBar(tCode, true)
+	tg.T["currentLocation"] = append(currentLocation, jyutil.Navigation{Name: qu.ObjToString((*data)["s_title"])})
+	tg.T["tdk"] = jyutil.TdkStruct{
+		Title:       fmt.Sprintf("%s-剑鱼标讯", qu.ObjToString((*data)["s_title"])),
+		Keywords:    qu.ObjToString((*data)["s_keywords"]),
+		Description: qu.ObjToString((*data)["s_description"]),
+	}
+	tg.Render("/tags/details.html", &tg.T)
+}

+ 516 - 0
src/jfw/modules/app/src/app/jyutil/strategy.go

@@ -0,0 +1,516 @@
+package jyutil
+
+import (
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	mgo "app.yhyue.com/moapp/jybase/mongodb"
+	"app.yhyue.com/moapp/jypkg/public"
+	"fmt"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"html/template"
+	"jy/src/jfw/modules/app/src/jfw/config"
+	"log"
+	"math/rand"
+	"regexp"
+	"sort"
+	"strconv"
+	"strings"
+	"time"
+)
+
+var (
+	ColumnRelationship map[string]Navigation
+	se                 = &encrypt.SimpleEncrypt{Key: "topnet2015topnet2015"}
+	Date_yyyyMMdd_Bias = "2006/01/02"
+)
+
+type Navigation struct {
+	Name string
+	Code string
+	Href string
+	Pid  string
+	Url  string
+}
+
+type HelpColumn struct {
+	Id       string       `json:"id"`       //文章id
+	Name     string       `json:"name"`     //栏目名称或文章标题
+	Code     string       `json:"code"`     //栏目code
+	IsColumn int          `json:"isColumn"` //0 栏目 1 文章 2 视频
+	Href     string       `json:"href"`
+	SeedData []HelpColumn `json:"seedData"` //子集
+}
+
+func InitColumnData() {
+	ColumnRelationship = make(map[string]Navigation)
+	jySchoolUrl, _ := config.Seoconfig["strategyUrl"].(map[string]interface{})
+	fmt.Println("获取url", jySchoolUrl)
+	jySchoolCode := util.InterfaceToStr(config.Seoconfig["strategyCode"])
+
+	column, _ := mongodb.Find("column", nil, "", "", false, -1, -1)
+	if column != nil && len(*column) > 0 {
+		for _, v := range *column {
+			var (
+				data Navigation
+				href string
+			)
+			code := util.InterfaceToStr(v["s_columncode"])
+			pid := util.InterfaceToStr(v["pid"])
+			if code == jySchoolCode {
+				href = util.InterfaceToStr(jySchoolUrl["homeUrl"])
+			} else if pid == jySchoolCode {
+				href = fmt.Sprintf(util.InterfaceToStr(jySchoolUrl["towUrl"]), code)
+			} else {
+				log.Printf("未知栏目code,code:%s", code)
+				continue
+			}
+			data.Url = href
+			data.Code = code
+			data.Name = util.InterfaceToStr(v["s_columnname"])
+			data.Pid = pid
+			ColumnRelationship[code] = data
+		}
+	}
+}
+
+func GetNewStrategy(t string, num int) (res []*InfoList) {
+	query := map[string]interface{}{"s_contenttype": t, "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	data, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	if data != nil {
+		for _, v := range *data {
+			s_title := util.InterfaceToStr(v["s_title"])
+			res = append(res, &InfoList{
+				Title: s_title,
+				Url:   fmt.Sprintf("/jySite/%s.html", se.EncodeString(util.InterfaceToStr(v["_id"]))),
+			})
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+		}
+	}
+	return res
+}
+
+// GuidelineColumn 攻略一级栏目与二级栏目
+func GuidelineColumn() HelpColumn {
+	return GuidelineAndIndustry(util.ObjToString(config.Seoconfig["strategyCode"]))
+}
+
+// 首页剑鱼攻略 s二级栏目
+func Guideline(s string, num int) *[]map[string]interface{} {
+	//columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+	return GuidelineAndInformation(util.ObjToString(config.Seoconfig["strategyCode"]), s, num)
+}
+
+// GuidelineAndInformation t:一级栏目 s二级栏目 (首页剑鱼攻略与行业资讯首页公用)
+func GuidelineAndInformation(t, s string, num int) *[]map[string]interface{} {
+	query := map[string]interface{}{"s_contenttype": t, "s_secondclassifytype": s, "i_status": 1, "releasetime": map[string]interface{}{"$lt": time.Now().Unix()}}
+	data, _ := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, num)
+	if data != nil {
+		for _, v := range *data {
+			s_title, _ := v["s_title"].(string)
+			v["s_title"] = template.HTML(s_title)
+			tmpdate1, _ := v["releasetime"]
+			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			v["time"] = reltime.Format(Date_yyyyMMdd_Bias) //首页展示
+			v["date"] = reltime                            //首页展示
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+			v["s_pic"] = SPic(util.InterfaceToStr(v["s_pic"]))
+			v["s_pic1"] = SPic(util.InterfaceToStr(v["s_pic1"]))
+		}
+	}
+	return data
+}
+
+// GuidelineAndIndustry 获取攻略&资讯一级栏目与二级栏目 columnCode栏目code
+func GuidelineAndIndustry(columnCode string) HelpColumn {
+	var res HelpColumn
+	data1, ok := mongodb.FindOne("column", map[string]interface{}{
+		"s_columncode": columnCode,
+	})
+	//招投标攻略栏目一二级栏目获取
+	if ok && data1 != nil && len(*data1) > 0 {
+		res.Code = util.InterfaceToStr((*data1)["s_columncode"])
+		res.Name = util.InterfaceToStr((*data1)["s_columnname"])
+		data2, ok1 := mongodb.Find("column", map[string]interface{}{
+			"pid": columnCode,
+		}, `{"i_order":1}`, nil, false, -1, -1)
+		if ok1 && data2 != nil && len(*data2) > 0 {
+			var ss []HelpColumn
+			for _, v := range *data2 {
+				var s HelpColumn
+				s.Code = util.InterfaceToStr(v["s_columncode"])
+				s.Name = util.InterfaceToStr(v["s_columnname"])
+				ss = append(ss, s)
+			}
+			res.SeedData = ss
+		}
+	}
+	return res
+}
+
+func JyCmsSearch(query map[string]string, makePageFormat string) (*[]map[string]interface{}, *[]interface{}, int) {
+	perPage, _ := strconv.Atoi(query["perPage"])
+	currentPage, _ := strconv.Atoi(query["currentPage"])
+	//限制每页数量
+	if perPage <= 0 || perPage > 20 {
+		perPage = 5
+	}
+	if currentPage < 1 {
+		currentPage = 1
+	}
+
+	queryStr := query["query"]
+	queryMap := map[string]interface{}{
+		"i_status": 1,
+	}
+	for _, v := range []string{"s_contenttype", "s_secondclassifytype", "s_threeclassifytype"} {
+		if query[v] != "" {
+			queryMap[v] = query[v]
+		}
+	}
+	queryStrType := query["queryType"]
+	if queryStr != "" {
+		//攻略搜索只搜索标题
+		if queryStrType == "" {
+			queryMap["$or"] = []interface{}{
+				map[string]interface{}{
+					"s_title": map[string]interface{}{"$regex": queryStr},
+				},
+				map[string]interface{}{
+					"s_content": map[string]interface{}{"$regex": queryStr},
+				},
+			}
+		} else {
+			queryMap["$or"] = []interface{}{
+				map[string]interface{}{
+					"s_title": map[string]interface{}{"$regex": queryStr},
+				},
+			}
+		}
+	}
+
+	total := public.MQFW.Count("content", queryMap)
+	if total == 0 {
+		return nil, nil, 0
+	}
+	//查询列表数据
+	searchResult, _ := public.MQFW.Find("content", queryMap, `{"releasetime":-1}`, `{"s_title":1,"s_contenttype":1,"s_content":1,"releasetime":1,"s_description":1,"praise":1,"s_source":1,"s_pic":1,"s_pic1":1,"l_createdate":1,"_id":1,"s_author":1,"i_viewnum":1}`, false, (currentPage-1)*perPage, perPage)
+
+	var res []map[string]interface{}
+	if searchResult != nil && len(*searchResult) > 0 {
+		for _, m := range *searchResult {
+			s_content, _ := m["s_content"].(string)
+			if len(s_content) > 500 {
+				m["s_content"] = ""
+			} else {
+				con, _ := regexp.Compile("^[^<]*?>")
+				content := con.ReplaceAllString(s_content, "")
+				con1, _ := regexp.Compile("<[^>]*$")
+				m["s_content"] = template.HTML(con1.ReplaceAllString(content, ""))
+			}
+
+			s_title, _ := m["s_title"].(string)
+			m["s_title"] = template.HTML(s_title)
+
+			tmpdate, _ := m["l_createdate"]
+			m["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+			tmpdate1, _ := m["releasetime"]
+			m["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			m["time"] = reltime.Format(Date_yyyyMMdd_Bias) //首页展示
+			s_pic, _ := m["s_pic"].(string)
+			if s_pic != "" {
+				s_pic = config.Seoconfig["jyadd"].(string) + s_pic
+			}
+			m["s_pic"] = s_pic
+			s_pic1, _ := m["s_pic1"].(string)
+			if s_pic1 != "" {
+				s_pic1 = config.Seoconfig["jyadd"].(string) + s_pic1
+			}
+			m["s_pic1"] = s_pic1
+			m["_id"] = se.EncodeString(mgo.BsonIdToSId(m["_id"]))
+			res = append(res, m)
+		}
+	}
+	//生成分页
+	/*if makePageFormat != "" {
+		pagination := MakePagination(perPage, currentPage, total, query, makePageFormat)
+		return &res, &pagination, total
+	}*/
+	return &res, nil, total
+}
+
+// 顶部分类导航
+func ClassNavBar() []Navigation {
+	var (
+		navigation []Navigation
+	)
+
+	column, ok := mongodb.Find("column", map[string]interface{}{"pid": util.ObjToString(config.Seoconfig["strategyCode"])}, `{"i_order":1}`, "", false, -1, -1)
+	if ok && column == nil || len(*column) == 0 {
+		return nil
+	}
+	for _, v := range *column {
+		navigation = append(navigation, Navigation{
+			Name: util.ObjToString(v["s_columnname"]),
+			Code: util.ObjToString(v["s_columncode"]),
+			Pid:  util.ObjToString(v["pid"]),
+			Href: fmt.Sprintf("/jySchool/%s/index.html", util.ObjToString(v["s_columncode"])),
+		})
+	}
+	return navigation
+}
+
+// GetBlogDetail 获取详情页内容
+func GetBlogDetail(_id string) (data *map[string]interface{}) {
+	id := se.DecodeString(_id)
+	r, _ := public.MQFW.FindById("content", id, `{"s_title":1,"s_contenttype":1,"s_content":1,"releasetime":1,"s_description":1,"praise":1,"s_source":1,"s_pic":1,"s_pic1":1,"l_createdate":1,"_id":1,"s_author":1,"s_editorname":1,"s_url":1,"s_subcontent":1,"s_keywords":1,"i_viewnum":1}`)
+	if r != nil {
+		tmpdate1, _ := (*r)["l_createdate"]
+		(*r)["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+		tmpdate2, _ := (*r)["releasetime"]
+		(*r)["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate2), 0))
+		newImg := fmt.Sprintf(`<img src="%simgFile`, util.InterfaceToStr(config.Seoconfig["jyadd"]))
+		s_content := strings.Replace(util.InterfaceToStr((*r)["s_content"]), `<img src="/imgFile`, newImg, -1)
+		(*r)["s_content"] = template.HTML(s_content)
+		(*r)["_id"] = se.EncodeString(mgo.BsonIdToSId((*r)["_id"]))
+		s_pic, _ := (*r)["s_pic"].(string)
+		if s_pic != "" {
+			s_pic = config.Seoconfig["jyadd"].(string) + s_pic
+		}
+		(*r)["s_pic"] = s_pic
+		s_pic1, _ := (*r)["s_pic1"].(string)
+		if s_pic1 != "" {
+			s_pic1 = config.Seoconfig["jyadd"].(string) + s_pic1
+		}
+		(*r)["s_pic1"] = s_pic1
+		i_viewnum := util.IntAll((*r)["i_viewnum"])
+		(*r)["i_viewnum"] = i_viewnum + 1
+		data = r
+
+		//增加浏览次数
+		go Browsing(id, i_viewnum)
+	}
+	return
+}
+
+// GuidelineDetails 详情页 推荐
+func GuidelineDetails(id string, keyWord ...string) []map[string]interface{} {
+	doc, _ := mongodb.FindById("content", id, `{"releasetime":1,"i_viewnum":1,"s_contenttype":1,"s_secondclassifytype":1,"s_threeclassifytype":1}`)
+	if doc == nil || len(*doc) == 0 {
+		return nil
+	}
+	query := map[string]interface{}{
+		"i_status":    1,
+		"releasetime": map[string]interface{}{"$lt": time.Now().Unix()},
+	}
+	for _, t := range []string{"s_contenttype", "s_secondclassifytype", "s_threeclassifytype"} {
+		if tv, _ := (*doc)[t].(string); tv != "" && tv != "0" {
+			query[t] = tv
+		}
+	}
+	_id, _ := primitive.ObjectIDFromHex(id)
+	if len(keyWord) > 0 {
+		query["s_title"] = map[string]interface{}{
+			"$regex": keyWord[0],
+		}
+	}
+	//相关内容推荐
+	query["_id"] = map[string]interface{}{
+		"$ne": _id,
+	}
+
+	log.Println(" 详情页 推荐3", query)
+	var recommend []map[string]interface{}
+	dataRe, ok := mongodb.Find("content", query, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,"s_title":1,"s_pic1":1,"s_pic":1,"releasetime":1,"s_description":1,"l_createdate":1,"s_contenttype":1,"s_secondclassifytype":1}`, false, 0, 500)
+	if ok && dataRe != nil && len(*dataRe) > 0 {
+		if len(*dataRe) > 3 {
+			for _, key := range GenerateRandomNumber(0, len(*dataRe), 3) {
+				recommend = append(recommend, (*dataRe)[key])
+			}
+		} else {
+			recommend = append(recommend, *dataRe...)
+		}
+		for _, v := range recommend {
+			v["_id"] = se.EncodeString(util.InterfaceToStr(v["_id"]))
+			s_title, _ := v["s_title"].(string)
+			v["s_title"] = template.HTML(s_title)
+
+			tmpdate, _ := v["l_createdate"]
+			v["l_createdate"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate), 0))
+			tmpdate1, _ := v["releasetime"]
+			//v["releasetime"] = util.TimeDiff(time.Unix(util.Int64All(tmpdate1), 0))
+			reltime := time.Unix(util.Int64All(tmpdate1), 0)
+			v["time"] = reltime.Format(Date_yyyyMMdd_Bias) //首页展示
+			v["s_pic"] = SPic(util.InterfaceToStr(v["s_pic"]))
+			v["s_pic1"] = SPic(util.InterfaceToStr(v["s_pic1"]))
+		}
+	}
+	//IdFormat(&recommend)
+	return recommend
+}
+
+// GetNextInfo 获取同类别上一篇、下一篇
+func GetNextInfo(_id string, keyWord ...string) (lastId, nextId string) {
+	doc, _ := mongodb.FindById("content", _id, `{"releasetime":1,"i_viewnum":1,s_contenttype":1,"s_secondclassifytype":1,"s_threeclassifytype":1}`)
+	if doc == nil || len(*doc) == 0 {
+		return
+	}
+	commonQuery := map[string]interface{}{
+		"i_status": 1,
+		"releasetime": map[string]interface{}{
+			"$lt": time.Now().Unix(),
+		},
+	}
+	for _, t := range []string{"s_contenttype", "s_secondclassifytype", "s_threeclassifytype"} {
+		if tv, _ := (*doc)[t].(string); tv != "" && tv != "0" {
+			commonQuery[t] = tv
+		}
+	}
+	if len(keyWord) > 0 {
+		commonQuery["s_title"] = map[string]interface{}{
+			"$regex": keyWord[0],
+		}
+	}
+	log.Println("content上下文query:", commonQuery)
+	dataOn, ok := mongodb.Find("content", commonQuery, `{"releasetime":-1}`, `{"_id":1,"i_viewnum":1,releasetime":-1,"l_createdate":1}`, false, -1, -1)
+	if ok && dataOn != nil && len(*dataOn) > 0 {
+		for k, v := range *dataOn {
+			if util.InterfaceToStr(v["_id"]) == _id {
+				if k != 0 {
+					lastId = se.EncodeString(util.InterfaceToStr((*dataOn)[k-1]["_id"]))
+				}
+				if k < len(*dataOn)-1 {
+					nextId = se.EncodeString(util.InterfaceToStr((*dataOn)[k+1]["_id"]))
+				}
+				break
+			}
+		}
+	}
+	return
+}
+
+// Browsing 浏览次数增加
+func Browsing(id string, viewNum int) {
+	mongodb.UpdateById("content", id, map[string]interface{}{
+		"$set": map[string]interface{}{
+			"i_viewnum": viewNum + 1,
+		}})
+}
+
+// GetSiteInfo 获取栏目
+func GetSiteInfo(id string) (sType, tType string) {
+	if res, _ := mongodb.FindById("content", id, `{"s_contenttype":1,"s_secondclassifytype":1}`); res != nil && len(*res) > 0 {
+		if value, ok := (*res)["s_contenttype"]; ok {
+			sType, _ = value.(string)
+		}
+		if value, ok := (*res)["s_secondclassifytype"]; ok {
+			tType, _ = value.(string)
+		}
+	}
+	return
+}
+
+// 导航栏 isdetail是否是详情页面
+func NavigationBar(code string, isdetail bool) []Navigation {
+	var (
+		contentNavigat Navigation
+		navigation     []Navigation
+	)
+	if mgo.IsObjectIdHex(code) {
+		doc, ok := mongodb.FindById("content", code, `{"s_title":1,"s_contente":1,"s_stypecondclassifytype":1}`)
+		if ok && doc == nil || len(*doc) == 0 {
+			return nil
+		}
+		contentNavigat = Navigation{Name: util.InterfaceToStr((*doc)["s_title"])}
+		for _, v := range []string{"s_stypecondclassifytype", "s_contente"} {
+			if util.InterfaceToStr((*doc)[v]) != "" {
+				code = util.InterfaceToStr((*doc)[v])
+				break
+			}
+		}
+	}
+	navigation = PidColumn(code)
+	if contentNavigat.Name != "" {
+		navigation = append(navigation, contentNavigat)
+	}
+	//除去详情页面 移动端招投标攻略面包屑最后一个不加url
+	if !isdetail {
+		last := navigation[len(navigation)-1]
+		navigation[len(navigation)-1] = Navigation{
+			Name: last.Name,
+			Code: last.Code,
+			Url:  "",
+			Href: "",
+			Pid:  last.Pid,
+		}
+	}
+	return navigation
+}
+
+func PidColumn(id string) []Navigation {
+	var allColumn []Navigation
+	if ColumnRelationship[id].Pid != "" {
+		//存在父级目录
+		allColumn = append(allColumn, PidColumn(ColumnRelationship[id].Pid)...)
+		allColumn = append(allColumn, ColumnRelationship[id])
+	} else {
+		//剑鱼首页地址
+		//allColumn = append(allColumn, Navigation{Name: "剑鱼标讯", Url: "/"})
+		/*columnCode, _ := config.Sysconfig["columnCode"].(map[string]interface{})
+		  if id == util.InterfaceToStr(columnCode["招投标攻略"]) {
+		  	//剑鱼课堂首页地址
+		  	allColumn = append(allColumn, Navigation{Name: "剑鱼学堂", Href: "/jySchool/index"})
+		  }*/
+		//上级地址
+		allColumn = append(allColumn, ColumnRelationship[id])
+	}
+
+	return allColumn
+
+}
+
+// SPic 图片链接处理
+func SPic(sPic string) string {
+	if sPic != "" && !strings.HasPrefix(sPic, "http") {
+		if strings.HasPrefix(sPic, "/") &&
+			strings.HasSuffix(util.InterfaceToStr(config.Seoconfig["jyadd"]), "/") {
+			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + sPic[1:]
+		} else if !strings.HasPrefix(sPic, "/") &&
+			!strings.HasSuffix(util.InterfaceToStr(config.Seoconfig["jyadd"]), "/") {
+			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + "/" + sPic
+		} else {
+			sPic = util.InterfaceToStr(config.Seoconfig["jyadd"]) + sPic
+		}
+	}
+	return sPic
+}
+
+// 生成count个[start,end)结束的不重复的随机数
+func GenerateRandomNumber(start int, end int, count int) []int {
+	//范围检查
+	if end < start || (end-start) < count {
+		return nil
+	}
+	//存放结果的slice
+	nums := make([]int, 0)
+	//随机数生成器,加入时间戳保证每次生成的随机数不一样
+	r := rand.New(rand.NewSource(time.Now().UnixNano()))
+	for len(nums) < count {
+		//生成随机数
+		num := r.Intn(end-start) + start
+		//查重
+		exist := false
+		for _, v := range nums {
+			if v == num {
+				exist = true
+				break
+			}
+		}
+		if !exist {
+			nums = append(nums, num)
+		}
+	}
+	sort.Ints(nums)
+	return nums
+}

+ 10 - 1
src/jfw/modules/app/src/app/jyutil/tags.go

@@ -42,6 +42,7 @@ var (
 		"buyer":    "buyer",
 		"winner":   "winner",
 		"home":     "home",
+		"strategy": "strategy",
 	}
 	areaLock       = &sync.Mutex{}
 	infoTypeLock   = &sync.Mutex{}
@@ -220,7 +221,7 @@ func GetIndustry(industryHref string) *IndustryStruct {
 	if l, err := GetIndustryCache(redisKey); l != nil && (l.List != nil) && len(l.List) > 0 && err == 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.class_1=b.name and  a.class_2 !='药品'  order by a.class_1`)
+		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][]IndustryStruct{}
 		if len(*data) > 0 && data != nil {
@@ -859,6 +860,14 @@ func GetTdk(types, name string) (tdk TdkStruct) {
 		title = fmt.Sprintf("%s免费招标信息_%s采购服务平台-剑鱼标讯", area_name, name)
 		keywords = fmt.Sprintf("%s免费招标信息,%s招标公告,%s中标公告,%s招标采购,%s招标网", area_name, area_name, area_name, area_name, area_name)
 		description = fmt.Sprintf("剑鱼标讯%s专栏,是%s招标采购的免费信息平台,免费提供%s招标采购信息、招标公告,中标结果等所有%s相关的招投标信息,寻找优质免费%s招标信息网站,就用剑鱼标讯!", area_name, area_name, area_name, area_name, area_name)
+	case Label["strategy"]:
+		strategyTdk := (config.Seoconfig["strategyTdk"]).(map[string]interface{})
+		newTdk := (strategyTdk[name]).(map[string]interface{})
+		if newTdk != nil {
+			title = qu.ObjToString(newTdk["title"])
+			keywords = qu.ObjToString(newTdk["key"])
+			description = qu.ObjToString(newTdk["description"])
+		}
 	}
 	tdk = TdkStruct{
 		Title:       title,

+ 43 - 1
src/jfw/modules/app/src/seo.json

@@ -2785,5 +2785,47 @@
       "DESCRIPTION": "澳门"
     }
   },
-  "cookieNum": 5
+  "cookieNum": 5,
+  "strategyCode": "ztbgl",
+  "strategyUrl":{
+    "homeUrl": "/jySchool/strategy",
+    "towUrl": "/jySchool/%s/index.html"
+  },
+  "strategyTdk": {
+    "ztbgl": {
+      "description": "剑鱼标讯是国内专业的招标大数据服务平台,专注于全国招标采购信息的搜索查询、订阅推送和数据定制化服务。提供涵盖拟在建项目、招标预告、招标公告、中标公告、政府采购、企业工商信息等多种信息类型,帮助企业全方位掌握市场动态变化。招投标大数据平台就用剑鱼标讯。",
+      "key": "招标,招标网,招投标,招标信息,招标采购,政府采购,拟在建项目,中标信息,中标公示,大数据,人工智能,剑鱼,剑鱼招标,剑鱼招标订阅,剑鱼标讯",
+      "title": "剑鱼学堂-招投标攻略"
+    },
+    "zbcg": {
+      "description": "剑鱼标讯招标采购栏目致力于为您提供招标采购流程,招标采购文件,招标采购方式,招标采购注意事项等一系列招标采购信息服务,查看招标采购更多干货内容,请关注剑鱼标讯。",
+      "key": "招标采购流程,招标采购文件,招标采购方式,招标采购注意事项,招标采购,剑鱼标讯",
+      "title": "招标采购方式_流程_文件及注意事项_招标采购 - 剑鱼标讯"
+    },
+    "tbzn": {
+      "description": "剑鱼标讯投标指南栏目致力于为您提供怎么投标,投标流程,投标文件怎么做,投标报价,投标技巧,投标策略等一系列和投标相关的干货知识服务,让您轻松玩转招投标。",
+      "key": "怎么投标,投标流程,投标文件怎么做,投标报价,投标技巧,投标策略",
+      "title": "怎么投标_投标流程_投标文件怎么做_投标指南 - 剑鱼标讯"
+    },
+    "zbjq": {
+      "description": "剑鱼标中标技巧栏目致力于为您提供怎么查询中标,中标候选人公示,中标通知书等一系列和中标技巧相关的专业内容服务,全面获取中标动态和注意事项,就上剑鱼标讯。",
+      "key": "怎么查询中标,中标候选人公示,中标通知书,中标技巧,剑鱼标讯",
+      "title": "怎么查询中标_中标候选人公示_中标通知书_中标技巧 - 剑鱼标讯"
+    },
+    "zcfg": {
+      "description": "剑鱼标政策法规栏目致力于为您提供全国的招投标法律法规,招标投标法,招标投标法实施条例,招标管理办法,招标采购法,采购管理办法信息,搜索查看招标采购法律法规,就上剑鱼标讯。",
+      "key": "招投标法律法规,招标投标法,招标投标法实施条例,招标管理办法,招标采购法,采购管理办法,剑鱼标讯",
+      "title": "招投标法律法规及采购政策 - 剑鱼标讯"
+    },
+    "wdbk": {
+      "description": "剑鱼标讯问答百科栏目为广大招投标从业者解决招标采购活动前中后所遇到的各种招标问题,涵盖招标采购、投标指南、中标技巧、政策法规、电子招投标等一系列招标采购问答大全服务。招标采购流程有哪些?怎么投标,中标多久后开工?剑鱼标讯问答百科为您答疑解惑。",
+      "key": "招标问答,采购问答,招投标问答,工程招标问答,电子招投标答疑,招标采购问答百科,剑鱼标讯",
+      "title": "招标采购问答大全_专业招投标问答平台 - 剑鱼标讯"
+    },
+    "dzztb": {
+      "description": "剑鱼标讯电子招投标栏目为广大招投标从业者提供什么是电子招投标,电子招投标步骤流程,电子招投标优劣势,电子招投标办法等一系列和电子招投标相关的信息服务。全面了解电子招投标动态,就上剑鱼标讯",
+      "key": "什么是电子招投标,电子招投标步骤流程,电子招投标优劣势,电子招投标办法,电子招投标,剑鱼标讯",
+      "title": "电子招投标含义_文件_步骤流程_优劣势_电子招投标 - 剑鱼标讯"
+    }
+  }
 }

+ 7 - 0
src/jfw/modules/app/src/web/staticres/jyapp/big-member/css/j-icons.css

@@ -401,6 +401,13 @@
     background-image: url(/common-module/big-member/image/canbiao-active.png);
 }
 
+.icon-arrow-right-gray{
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADmSURBVHgB7ZZBDoIwEEWnJCzYeQO9gmxJjDfwCt7Eo+gR9ARFY5fYK+g5DNSSqTFssEOmdNO3onSa/2ZISAESCUak1AsgkgETV9UcRN5qpR5LyjkBDNyU3nWmPbvlMxfZtqrKl89ZlglsqvXF9nJyy9XbdLXvJFgm8KW+N0cAs3dLr0mwCkyRYBegSgQRoEgEE/CVCCrgIxFc4J/ELAJjEmy/YhJ928XvMTiD7oXtvrDdlzN9grFwfBUxHF9HDMetiOG4HTEcSyKGY1nEcCxlYHAlI4RjORP9pdTYCVDC2ZGafi1PJD70/51UBEfDsQAAAABJRU5ErkJggg==);
+}
+.icon-arrow-left-white{
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABeSURBVHgB7ZaxDYAwDARfTMAIbMRIjMJojGLcIKVIQ/NOojvJ9Z3k5iWAn0TEripSfuQ9eZfcNPKPUy468lsukCNHvrx80yiUvoAIIoiYNcI3yToR/lHaRNTNcliSFxcyeu3W54LGAAAAAElFTkSuQmCC);
+}
+
 /******** img背景图 **********/
 .j-img {
     display: inline-block;

+ 92 - 0
src/jfw/modules/app/src/web/staticres/jyapp/tags/css/tags-module-common.css

@@ -757,3 +757,95 @@ body.loading {
   height: .64rem;
 }
 /* back-to-top */
+.tag-strategy-nav-container {
+  /* padding: .16rem .32rem;
+  background: #fff; */
+}
+.tag-strategy-nav-container .tag-strategy-nav-list{
+  display: flex;
+  align-items: center;
+  flex-wrap: nowrap;
+  overflow-x: auto;
+  padding: .16rem .32rem;
+  background: #fff;
+}
+.tag-strategy-nav-container .tag-strategy-nav-list .tag-strategy-nav-item{
+  padding: .08rem .2rem;
+  margin-right: .16rem;
+  background: #F5F6F7;
+  border-radius: 0.08rem;
+  font-size: .28rem;
+  line-height: .4rem;
+  white-space: nowrap;
+}
+.tag-strategy-nav-list .tag-strategy-nav-item > a{
+  color: #171826;
+}
+.tag-strategy-nav-container .tag-strategy-nav-list .tag-strategy-nav-item.active{
+  background: #2ABED1;
+  color: #fff;
+}
+.tag-strategy-nav-list .tag-strategy-nav-item.active > a{
+  color: #fff;
+}
+.strategy-list:not(:first-child){
+  margin-top: 0.24rem;
+}
+.strategy-list .tag-card-bd{
+  padding: .16rem 0;
+}
+.tag-card-strategy-item,
+.tag-card-strategy-item > a{
+  display: flex;
+  background: #fff;
+}
+.tag-card-strategy-item > a{
+  width: 100%;
+  padding: .16rem .32rem;
+}
+.tag-card-strategy-item:not(:last-child) {
+  margin-bottom: 0.08rem;
+}
+.tag-card-strategy-item .card-item-left{
+  width: 2.2rem;
+  height: 1.44rem;
+  border-radius: 0.08rem;
+  overflow: hidden;
+  flex-shrink: 0;
+}
+.tag-card-strategy-item .card-item-left > img{
+  width: 100%;
+  height: 100%;
+  object-fit: fill;
+  border: 0;
+  border-radius: 0.08rem;
+}
+.tag-card-strategy-item .card-item-right{
+  flex: 1;
+  margin-left: .32rem;
+  width: calc(100% - 2.52rem);
+}
+.tag-card-strategy-item .card-item-right .item-title{
+  font-size: .3rem;
+  line-height: .44rem;
+  color: #171826;
+}
+.tag-card-strategy-item .card-item-right .item-desc{
+  margin-top: .04rem;
+  font-size: .26rem;
+  line-height: .4rem;
+  color: #5F5E64;
+}
+.tag-card-strategy-item .card-item-right .item-time{
+  margin-top: .16rem;
+  font-size: .24rem;
+  line-height: .36rem;
+  color: #9B9CA3;
+}
+
+.strategy-list-container .tag-card-bd{
+  padding: .16rem 0;
+  background-color: #fff;
+  border-top: 1px solid rgba(0, 0, 0, 0.08);
+  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
+}

+ 232 - 0
src/jfw/modules/app/src/web/staticres/jyapp/tags/css/tags-strategy.css

@@ -0,0 +1,232 @@
+.page-container-strategy{}
+.page-container-strategy .strategy-ad{
+  width: 100%;
+  height: 1.76rem;
+  padding: .32rem;
+  background: url(/jyapp/tags/img/strategy-ad-bg.png) no-repeat center;
+  background-size: 100% 100%;
+}
+.page-container-strategy .strategy-ad > h1{
+  font-size: .44rem;
+  line-height: .64rem;
+  color: #171826;
+}
+.page-container-strategy .strategy-ad > p{
+  margin-top: .08rem;
+  font-size: .28rem;
+  line-height: .4rem;
+  color: #5F5E64;
+}
+
+.page-container-strategy-details .strategy-list{
+  margin-top: .24rem;
+  margin-bottom: 0;
+}
+.strategy-details{
+  padding: .32rem;
+  background: #fff;
+}
+.strategy-details h1{
+  font-size: .4rem;
+  line-height: .6rem;
+  color: #171826;
+}
+.strategy-details .details-sub-title{
+  margin-top: .08rem;
+  font-size: .24rem;
+  line-height: .36rem;
+  color: #5F5E64;
+}
+.strategy-details .details-sub-title span:nth-child(1){
+  margin-right: .32rem;
+}
+.strategy-details .details-main{
+  margin-top: .32rem;
+  text-align: justify;
+  font-size: .28rem;
+  line-height: .4rem;
+  color: #171826;
+  word-break: break-all;
+}
+.strategy-details .details-main img{
+  width: 100%;
+  height: auto;
+}
+.turn-page-container{
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: .96rem 0 .64rem;
+}
+.page-button{
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 1.92rem;
+  height: .64rem;
+  text-align: center;
+  color: #5F5E64;
+  font-size: .28rem;
+  line-height: .4rem;
+  border-radius: 0.08rem;
+  border: 1px solid rgba(0, 0, 0, 0.1);
+}
+.page-button.last-page{
+  margin-right: .64rem;
+}
+.page-button.next-page {
+  /* margin-right: .64rem; */
+}
+
+.page-button.last-page .icon-arrow-right-gray{
+  transform: rotate(180deg);
+  width: .32rem;
+  height: .32rem;
+  margin-right: 0.08rem;
+}
+.page-button.next-page .icon-arrow-right-gray{
+  width: .32rem;
+  height: .32rem;
+  margin-left: 0.08rem;
+}
+
+.page-button.active{
+  background: #2ABED1;
+  color: #fff;
+  border: 0;
+}
+.page-button.last-page.active .icon-arrow-right-gray {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABeSURBVHgB7ZaxDYAwDARfTMAIbMRIjMJojGLcIKVIQ/NOojvJ9Z3k5iWAn0TEripSfuQ9eZfcNPKPUy468lsukCNHvrx80yiUvoAIIoiYNcI3yToR/lHaRNTNcliSFxcyeu3W54LGAAAAAElFTkSuQmCC);
+  transform: rotate(0deg);
+}
+.page-button.next-page.active .icon-arrow-right-gray {
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAABeSURBVHgB7ZaxDYAwDARfTMAIbMRIjMJojGLcIKVIQ/NOojvJ9Z3k5iWAn0TEripSfuQ9eZfcNPKPUy468lsukCNHvrx80yiUvoAIIoiYNcI3yToR/lHaRNTNcliSFxcyeu3W54LGAAAAAElFTkSuQmCC);
+  transform: rotate(180deg);
+}
+
+.details-main strong,
+.details-main h1,
+.details-main h2,
+.details-main h3,
+.details-main h4,
+.details-main h5,
+.details-main h6 {
+  font-weight: bold;
+}
+
+.details-main h1 {
+  font-size: 2em;
+  margin: 1em 0;
+
+}
+
+.details-main h2 {
+  font-size: 1.5em;
+  margin: 1em 0;
+
+}
+
+.details-main h3 {
+  font-size: 1.3em;
+  margin: 1em 0;
+
+}
+
+.details-main h4 {
+  font-size: 1em;
+  margin: 1em 0;
+
+}
+
+.details-main h5 {
+  font-size: 0.8em;
+  margin: 1em 0;
+
+}
+
+.details-main h6 {
+  font-size: 0.7em;
+  margin: 1em 0;
+
+}
+.details-main p {
+  margin: 1em 0;
+}
+
+
+.details-main div,
+.details-main span,
+.details-main applet,
+.details-main object,
+.details-main iframe,
+.details-main h1,
+.details-main h2,
+.details-main h3,
+.details-main h4,
+.details-main h5,
+.details-main h6,
+.details-main p,
+.details-main blockquote,
+.details-main pre,
+.details-main a,
+.details-main abbr,
+.details-main acronym,
+.details-main address,
+.details-main big,
+.details-main cite,
+.details-main code,
+.details-main del,
+.details-main dfn,
+.details-main em,
+.details-main font,
+.details-main img,
+.details-main ins,
+.details-main kbd,
+.details-main q,
+.details-main s,
+.details-main samp,
+.details-main small,
+.details-main strike,
+.details-main strong,
+.details-main sub,
+.details-main sup,
+.details-main tt,
+.details-main var,
+.details-main dl,
+.details-main dt,
+.details-main dd,
+.details-main ol,
+.details-main ul,
+.details-main li,
+.details-main fieldset,
+.details-main form,
+.details-main label,
+.details-main legend,
+.details-main table,
+.details-main caption,
+.details-main tbody,
+.details-main tfoot,
+.details-main thead,
+.details-main tr,
+.details-main th,
+.details-main td {
+  all: revert;
+}
+
+.details-main a {
+  color: #0987ff
+}
+
+.details-main li {
+  float: none;
+}
+
+.details-main ul,
+.details-main ol{
+  list-style: disc;
+  margin-block-start: 1em;
+  margin-block-end: 1em;
+  margin-inline-start: 0px;
+  margin-inline-end: 0px;
+  padding-inline-start: 40px;
+}

BIN
src/jfw/modules/app/src/web/staticres/jyapp/tags/img/strategy-ad-bg.png


+ 43 - 0
src/jfw/modules/app/src/web/templates/tags/class.html

@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+  {{include "/tags/template/tag-meta.html"}}
+  <title>{{.T.tdk.Title}}</title>
+  {{include "/tags/template/tag-header-common-assets.html"}}
+  <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/tags/css/tags-strategy.css?v={{Msg "seo" "version"}}'>
+</head>
+<body>
+  <section class="page-container page-container-strategy">
+    <header class="page-header">
+      {{include "/tags/template/tag-header.html"}}
+    </header>
+    <main class="page-main">
+      <div class="module-wrapper">
+        {{include "/tags/template/tag-register-login-group.html"}}
+        {{include "/tags/template/tag-info-type-nav.html"}}
+        {{include "/tags/template/tag-area-nav.html"}}
+        {{include "/tags/template/tag-strategy-nav.html"}}
+        {{include "/tags/template/tag-card-strategy.html"}}
+        {{if .T.currentLocation}}
+            {{include "/tags/template/tag-breadcrumb-navigation.html"}}
+        {{end}}
+        {{include "/tags/template/tag-footer.html"}}
+      </div>
+    </main>
+  </section>
+  <div class="loading-wrapper" style="display: none;">
+    <div class="loading-icon"></div>
+  </div>
+  {{include "/tags/template/tag-footer-common-assets.html"}}
+  <script>
+    var templateData = {
+      homeLink: {{.T.HomeOrigin}},
+      areaTopTitle: {{.T.areaTopTip}}
+    }
+  </script>
+  <script src='/common-module/public/js/china-map-data.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/tag-common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/index.js?v={{Msg "seo" "version"}}'></script>
+</body>
+</html>

+ 73 - 0
src/jfw/modules/app/src/web/templates/tags/details.html

@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+  {{include "/tags/template/tag-meta.html"}}
+  <title>{{.T.tdk.Title}}</title>
+  {{include "/tags/template/tag-header-common-assets.html"}}
+  <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/tags/css/tags-strategy.css?v={{Msg "seo" "version"}}'>
+</head>
+<body>
+  <section class="page-container page-container-strategy-details">
+    <header class="page-header">
+      {{include "/tags/template/tag-header.html"}}
+    </header>
+    <main class="page-main">
+      <div class="module-wrapper">
+        {{include "/tags/template/tag-register-login-group.html"}}
+        {{include "/tags/template/tag-info-type-nav.html"}}
+        {{include "/tags/template/tag-area-nav.html"}}
+       <div class="strategy-details">
+        <h1 class="details-title">{{.T.data.s_title}}</h1>
+        <p class="details-sub-title">
+          <span>文/{{.T.data.s_author}}</span>
+          <span>{{.T.data.releasetime}}</span>
+        </p>
+        <div class="details-main">
+          <p>{{.T.data.s_content}}</p>
+          {{if .T.data.s_pic}}
+          <img src="{{.T.data.s_pic}}" alt="{{.T.data.s_title}}">
+          {{end}}
+        </div>
+        <div class="turn-page-container">
+          {{if .T.lastId}}<a href="/jySite/{{.T.lastId}}.html" class="page-button last-page active"><i class="j-icon base-icon icon-arrow-right-gray"></i>上一篇</a>{{end}}
+          {{if .T.nextId}}<a href="/jySite/{{.T.nextId}}.html" class="page-button next-page">下一篇<i class="j-icon base-icon icon-arrow-right-gray"></i></a>{{end}}
+        </div>
+       </div>
+       {{include "/tags/template/tag-card-strategy-recommend.html"}}
+        {{if .T.currentLocation}}
+            {{include "/tags/template/tag-breadcrumb-navigation.html"}}
+        {{end}}
+        {{include "/tags/template/tag-footer.html"}}
+      </div>
+    </main>
+  </section>
+  <div class="loading-wrapper" style="display: none;">
+    <div class="loading-icon"></div>
+  </div>
+  {{include "/tags/template/tag-footer-common-assets.html"}}
+  <script>
+    var templateData = {
+      homeLink: {{.T.HomeOrigin}},
+      areaTopTitle: {{.T.areaTopTip}}
+    }
+    
+    function delTrimP(){ // 删除正文中所有无内容p标签
+        var paragraphs = $('.details-main p')
+      // 遍历每个 <p> 标签
+      for (var i = 0; i < paragraphs.length; i++) {
+        var paragraph = paragraphs[i];
+      // 检查 <p> 标签的文本内容是否为空白或不存在
+        if (!paragraph.textContent.trim() && !paragraph.querySelector('img')) {
+        // 删除空白无内容的 <p> 标签
+          paragraph.parentNode.removeChild(paragraph);
+        }
+      } 
+    }
+    delTrimP()
+  </script>
+  <script src='/common-module/public/js/china-map-data.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/tag-common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/index.js?v={{Msg "seo" "version"}}'></script>
+</body>
+</html>

+ 48 - 0
src/jfw/modules/app/src/web/templates/tags/strategy.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html lang="zh-CN" style="font-size: 50px;">
+<head>
+  {{include "/tags/template/tag-meta.html"}}
+  <title>{{.T.tdk.Title}}</title>
+  {{include "/tags/template/tag-header-common-assets.html"}}
+  <link rel="stylesheet" href='{{Cdns .Host "seo" "cdn"|SafeUrl}}/jyapp/tags/css/tags-strategy.css?v={{Msg "seo" "version"}}'>
+</head>
+<body>
+  <section class="page-container page-container-strategy">
+    <header class="page-header">
+      {{include "/tags/template/tag-header.html"}}
+    </header>
+    <main class="page-main">
+      <div class="module-wrapper">
+        {{include "/tags/template/tag-register-login-group.html"}}
+        {{include "/tags/template/tag-info-type-nav.html"}}
+        {{include "/tags/template/tag-area-nav.html"}}
+        <div class="strategy-ad">
+          <h1>招投标攻略</h1>
+          <p>专业知识库,满足您的学习需求</p>
+        </div>
+
+            {{include "/tags/template/tag-card-strategy-title.html"}}
+
+        {{if .T.currentLocation}}
+            {{include "/tags/template/tag-breadcrumb-navigation.html"}}
+        {{end}}
+        {{include "/tags/template/tag-footer.html"}}
+      </div>
+    </main>
+  </section>
+  <div class="loading-wrapper" style="display: none;">
+    <div class="loading-icon"></div>
+  </div>
+  {{include "/tags/template/tag-footer-common-assets.html"}}
+  <script>
+    var templateData = {
+      homeLink: {{.T.HomeOrigin}},
+      areaTopTitle: {{.T.areaTopTip}}
+    }
+  </script>
+  <script src='/common-module/public/js/china-map-data.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/js/common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/tag-common.js?v={{Msg "seo" "version"}}'></script>
+  <script src='/jyapp/tags/js/index.js?v={{Msg "seo" "version"}}'></script>
+</body>
+</html>

+ 1 - 1
src/jfw/modules/app/src/web/templates/tags/template/tag-breadcrumb-navigation.html

@@ -1,4 +1,4 @@
-<section class="tag-breadcrumb-navigation">
+<section class="tag-breadcrumb-navigation ellipsis">
   <span>当前位置:</span>
   <a href="{{.T.Home}}">剑鱼标讯首页</a>
   {{range $l:=.T.currentLocation}}

+ 24 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-strategy-recommend.html

@@ -0,0 +1,24 @@
+<section class="tag-card bg-white strategy-list">
+  <header class="tag-card-hd">
+    <h3 class="tag-card-title">相关内容推荐</h3>
+    <div class="tag-card-actions"></div>
+  </header>
+  <main class="tag-card-bd">
+    <ul class="tag-card-list">
+      {{range $k,$v:= .T.bottomInfo}}
+      <li class="tag-card-item tag-card-strategy-item">
+        <a href="/jySite/{{$v._id}}.html">
+          <div class="card-item-left">
+            <img src="{{$v.s_pic1}}" alt="{{$v.s_title}}" onerror="">
+          </div>
+          <div class="card-item-right">
+            <h3 class="item-title ellipsis" title="{{$v.s_title}}">{{$v.s_title}}</h3>
+            <p class="item-desc ellipsis" title="{{$v.s_description}}">{{$v.s_description}}</p>
+            <p class="item-time">{{$v.time}}</p>
+          </div>
+        </a>
+      </li>
+      {{end}}
+    </ul>
+  </main>
+</section>

+ 31 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-strategy-title.html

@@ -0,0 +1,31 @@
+<section>
+  {{range $column:=.T.strategyList}}
+  <section class="tag-card bg-white strategy-list">
+    <header class="tag-card-hd">
+      <h3 class="tag-card-title">{{$column.name}}</h3>
+      <div class="tag-card-actions">
+        <a href="/jySchool/{{$column.code}}/index.html">更多<i class="j-icon base-icon icon-arrow-up"></i></a>
+      </div>
+    </header>
+    <main class="tag-card-bd">
+      <ul class="tag-card-list">
+      {{range $article := $column.list}}
+        <li class="tag-card-item tag-card-strategy-item">
+          <a href="/jySite/{{$article._id}}.html">
+            <div class="card-item-left">
+              <img src="{{$article.s_pic1}}" alt="{{$article.s_title}}" onerror="">
+            </div>
+            <div class="card-item-right">
+              <h3 class="item-title ellipsis" title="{{$article.s_title}}">{{$article.s_title}}</h3>
+              <p class="item-desc ellipsis" title="{{$article.s_description}}">{{$article.s_description}}</p>
+              <p class="item-time">{{$article.time}}</p>
+            </div>
+          </a>
+        </li>
+      {{end}}
+      </ul>
+    </main>
+  </section>
+  {{end}}
+</section>
+

+ 23 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-card-strategy.html

@@ -0,0 +1,23 @@
+<section class="tag-card strategy-list-container">
+  <main class="tag-card-bd">
+    <ul class="tag-card-list">
+      {{range $v := .T.list}}
+      <li class="tag-card-item tag-card-strategy-item">
+        <a href="/jySite/{{$v._id}}.html">
+          <div class="card-item-left">
+            <img src="{{$v.s_pic1}}" alt="{{$v.s_title}}" onerror="">
+          </div>
+          <div class="card-item-right">
+            <h3 class="item-title ellipsis" title="{{$v.s_title}}">{{$v.s_title}}</h3>
+            <p class="item-desc ellipsis" title="{{$v.s_description}}">{{$v.s_description}}</p>
+            <p class="item-time">{{$v.time}}</p>
+          </div>
+        </a>
+      </li>
+      {{end}}
+    </ul>
+  </main>
+  <footer class="tag-card-ft">
+    {{include "/tags/template/tag-pagination.html"}}
+  </footer>
+</section>

+ 0 - 12
src/jfw/modules/app/src/web/templates/tags/template/tag-footer.html

@@ -12,18 +12,6 @@
     <p class="footer-card-line copyright">版权所有-剑鱼标讯</p>
   </div>
 </section>
-<section class="tag-footer-container fixed">
-  <div class="footer-button-group">
-    <a class="seo-button theme-main radius phone-concat-customer" data-tel="400-108-6670" href="tel:400-108-6670">
-      <span class="j-icon base-icon icon-phone-white-solid"></span>
-      <p>电话咨询</p>
-    </a>
-    <a class="seo-button theme-main radius" href="/jyapp/free/login?DisUrl=/jyapp/jylab/mainSearch">
-      <span class="j-icon base-icon icon-person-white-solid"></span>
-      <p>登录/注册</p>
-    </a>
-  </div>
-</section>
 <section class="back-to-top">
   <i class="j-icon base-icon icon-arrow-up2"></i>
 </section>

+ 19 - 0
src/jfw/modules/app/src/web/templates/tags/template/tag-strategy-nav.html

@@ -0,0 +1,19 @@
+<section class="tag-strategy-nav-container">
+  <ul class="tag-strategy-nav-list">
+    {{$thisCode := .T.code}}
+    {{ range $v := .T.classNav }}
+    <li {{if eq $v.Code $thisCode}} class="tag-strategy-nav-item active" {{else}} class="tag-strategy-nav-item"{{end}} >
+      <a href="{{$v.Href}}" title="{{$v.Name}}">{{ $v.Name }}</a>
+    </li>
+    {{end}}
+
+  </ul>
+</section>
+<script>
+  $(function(){
+    try {
+      var active = document.querySelector('.tag-strategy-nav-item.active').offsetLeft
+      document.querySelector('.tag-strategy-nav-list').scrollTo(active, 0)
+    } catch (error) {}
+  })
+</script>

+ 4 - 4
src/jfw/modules/app/src/web/templates/weixin/tabbar.html

@@ -21,10 +21,10 @@
     display: none;
   }
   body.inject-app-tabbar .back-to-top {
-    transform: translateY(-50px);
+    transform: translateY(-20px);
   }
   body.inject-app-tabbar .tag-footer-container .footer-card-line.copyright {
-    padding-bottom: 50px;
+    padding-bottom: 20px;
   }
   body.inject-app-tabbar .tag-footer-container.fixed {
     bottom: 50px;
@@ -32,8 +32,8 @@
   /* 兼容ios底部 */
   @supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
     body.inject-app-tabbar .tag-footer-container .footer-card-line.copyright {
-      padding-bottom: calc(50px +  constant(safe-area-inset-bottom));
-      padding-bottom: calc(50px +  env(safe-area-inset-bottom));
+      padding-bottom: calc(20px +  constant(safe-area-inset-bottom));
+      padding-bottom: calc(20px +  env(safe-area-inset-bottom));
     }
     body.inject-app-tabbar .tag-footer-container.fixed {
       bottom: calc(50px +  constant(safe-area-inset-bottom));

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

@@ -5,7 +5,7 @@ go 1.18
 require (
 	app.yhyue.com/moapp/jybase v0.0.0-20230727083622-4dfc804ea6cf
 	app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545
-	app.yhyue.com/moapp/jypkg v0.0.0-20230901083756-4a2b88d5bf6f
+	app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d
 	bp.jydev.jianyu360.cn/BaseService/userCenter v1.2.13
 	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4

+ 2 - 0
src/jfw/modules/publicapply/src/go.sum

@@ -11,6 +11,8 @@ app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545 h1:+Lak4m1zgsigQloO
 app.yhyue.com/moapp/jylog v0.0.0-20230522075550-05d7230ca545/go.mod h1:uFrsdUBFbETiJlEmr4PtJWPsZlUpPj2bHQRhryu6ggk=
 app.yhyue.com/moapp/jypkg v0.0.0-20230901083756-4a2b88d5bf6f h1:R+30KpHwY/OgDAzaWjknnB8Djux+XO0XmQcuG62Z2qY=
 app.yhyue.com/moapp/jypkg v0.0.0-20230901083756-4a2b88d5bf6f/go.mod h1:SJnjdte+Hc5Akxp+YOfu8Mjx7G0kvKVv04LZwuM0l5s=
+app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d h1:uSr/OJCLEnquTTF5rUnxlcPD1gwoCiTi1nAd+e0Cx8E=
+app.yhyue.com/moapp/jypkg v0.0.0-20230911032646-c7a25edb885d/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/go.mod h1:b0zZHev3gmJao1Fo+2Z2KPVjsuLOJVvVxf+kCnu9WkA=
 bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e h1:h+VEI3o1qC0jeCzkFGTrLI4f27cfa/W/y+0sXokWMgE=

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

@@ -21,7 +21,7 @@ require (
 	app.yhyue.com/moapp/jyMarketing v0.0.2-0.20230304035551-21bb1eedf547 // indirect
 	app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae // indirect
 	bp.jydev.jianyu360.cn/BaseService/entManageApplication v0.0.0-20230214091519-89a98c01ab0e // indirect
-	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230222052351-9d6fad062447 // indirect
+	bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a // indirect
 	bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7 // indirect
 	github.com/BurntSushi/toml v1.1.0 // indirect
 	github.com/beorn7/perks v1.0.1 // indirect

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

@@ -15,8 +15,8 @@ app.yhyue.com/moapp/message v0.0.0-20221223100203-6402e389d9ae h1:6rDDaz6yxvE8vi
 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/go.mod h1:7Xhygw0KBuL4h0G76FnFg4otQcA9bmOO0c8M0FCjAyQ=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230222052351-9d6fad062447 h1:hrBqrsf2QHTrnoR9VTV4w7g2akDfbpQ+umNQvkkNs+Y=
-bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230222052351-9d6fad062447/go.mod h1:5nimT8GJh46AyfeeDeyRlDQygMlO7TRM8Pwm41Gxemc=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a h1:JX2jEMrbdLzXfVC/nTUvdFOkqNj5DUxkJFjl3XE1gyg=
+bp.jydev.jianyu360.cn/BaseService/powerCheckCenter v0.0.0-20230225125145-431a4f70093a/go.mod h1:5nimT8GJh46AyfeeDeyRlDQygMlO7TRM8Pwm41Gxemc=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d h1:mqOFpjEX8eNNskmu0cejgA8fqmbDjFG/ggeNrUO3shw=
 bp.jydev.jianyu360.cn/BaseService/pushpkg v0.0.0-20230225061813-384daf716c9d/go.mod h1:UKLwPLx9be595yaiIwqqdKSloKK/Kdf/wTLr4XUClV0=
 bp.jydev.jianyu360.cn/BaseService/resourceCenter v0.0.7 h1:G6PHMWAHfYEuY6kbl7OM/KnCQf1Xa54mdhuP7JzK8/I=

+ 10 - 4
src/seo.json

@@ -4545,10 +4545,10 @@
 	"hotlabcitySort":["北京", "上海", "天津", "重庆", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江", "江苏", "浙江", "安徽", "福建", "江西", "山东", "河南", "湖北", "湖南", "广东", "广西", "四川", "贵州", "云南", "海南", "陕西", "甘肃", "宁夏", "青海", "新疆", "西藏", "香港", "澳门", "台湾"],
 	"hotlabkeywordsSort":["建筑工程", "水利水电", "能源化工", "弱电安防", "信息技术", "行政办公", "机械设备", "交通工程", "医疗卫生", "市政设施", "服务采购", "农林牧渔"],
 	"hotlabstypSort":[
-		["招标", "询价", "竞谈", "变更", "单一", "竞价", "邀标", "招标公告其它"],
-		["成交", "中标", "废标", "流标", "结果变更","招标结果其它"],
-		["合同", "验收", "违规", "招标信用信息其它"],
-		["预告","需求公示", "预审", "论证意见", "预审结果", "招标预告其它"]
+		["招标", "询价", "竞谈", "变更", "单一", "竞价", "邀标"],
+		["成交", "中标", "废标", "流标", "结果变更"],
+		["合同", "验收", "违规"],
+		["预告","需求公示", "预审", "论证意见", "预审结果"]
 	],
 	"buryingPointUrl":"https://md.jianyu360.com",
 	"areaSite":["招标采购网","政府采购网","招标投标公共服务平台","公共资源交易网","公共资源交易中心","政府采购中心","工程交易中心","招投标信息网","招标办","招投标交易中心","建设工程招投标网","工程造价信息网","供求信息平台","物资采购网","电子采购平台"],
@@ -4566,5 +4566,11 @@
     "cacheKey": "hotBuyerCache",
     "cacheTimeout": 86400,
     "limit": 200
+  },
+  "infoTypeToLetter": {
+    "招标预告":   "ZBYG",
+    "招标公告":   "ZBGG",
+    "招标结果":   "ZBJG",
+    "招标信用信息": "ZBXYXX"
   }
 }

+ 1 - 1
src/web/staticres/css/pc/index.css

@@ -554,7 +554,7 @@
   max-width: 185px;
   display: flex;
   flex-direction: row;
-  align-items: center;
+  /* align-items: center; */
   justify-content: flex-start;
   flex-wrap: wrap;
   min-height: 54px;

+ 1 - 0
src/web/staticres/frontRouter/pc/industryInfo/css/industry_detail.css

@@ -177,6 +177,7 @@
   /* width: 530px; */
 }
 .school_tabs .art_list .art_l_left .art_l_l_title{
+  display: inline-block;
   font-weight: 400;
   font-size: 20px;
   line-height: 30px;

+ 6 - 2
src/web/staticres/js/superSearch.js

@@ -367,8 +367,12 @@ function appendDatas(datas,flag,isNew,onlyUpdateTable){
                 } else {
                   listHtml += '<a href="#" style="display:none;"></a>';
                 }
-                if (typeof(type) != "undefined" && type != null && type != ""&&type.indexOf("免费注册")<0) {
-                  listHtml += '<a class="tags-item" href="javascript:;"'+'onclick="gologin('+"'/list/stype/"+datas[i].stypeadd+".html')"+'">'+type+'</a>';
+                if (typeof(type) != "undefined" && type != null && type != "" &&type.indexOf("免费注册")<0) {
+                  if (type==="拟建"||type==="采购意向"){
+                    listHtml += '<a class="tags-item" href="javascript:;">'+type+'</a>';
+                  }else{
+                    listHtml += '<a class="tags-item" href="javascript:;"'+'onclick="gologin('+"'/list/stype/"+datas[i].stypeadd+".html')"+'">'+type+'</a>';
+                  }
                 } else {
                   listHtml += '<a href="#" style="display:none;"></a>';
                 }

+ 5 - 1
src/web/staticres/public-pc/js/article-content.js

@@ -1826,7 +1826,11 @@ if(typeof(type) == "undefined" || type == null || type == ""){
   }
 }
 if(typeof(type) != "undefined" && type != null && type != ""){ // 标签栏插入标签
-  $(".com-tagsbar").append('<span class="com-type"><a href="/list/stype/'+goTemplateData.params.obj.stypeadd+'.html">'+type+'</a></span>');
+  if(type=="拟建"||type=="采购意向"){
+    $(".com-tagsbar").append('<span class="com-type"><a href="javascript:volid(0);">'+type+'</a></span>');
+  }else{
+    $(".com-tagsbar").append('<span class="com-type"><a href="/list/stype/'+goTemplateData.params.obj.stypeadd+'.html">'+type+'</a></span>');
+  }
 }
 // 2023-5-24 P341去掉
 // if(industry && industry!="undefined"){

+ 1 - 0
src/web/staticres/site/page/industryInfo/css/industry_detail.css

@@ -188,6 +188,7 @@
   /* width: 530px; */
 }
 .school_tabs .art_list .art_l_left .art_l_l_title{
+  display: block;
   width: 530px;
   font-weight: 400;
   font-size: 20px;

+ 1 - 0
src/web/staticres/site/page/jySchool/css/introduction_detail.css

@@ -179,6 +179,7 @@
   /* width: 530px; */
 }
 .school_tabs .art_list .art_l_left .art_l_l_title{
+  display: block;
   width: 530px;
   font-weight: 400;
   font-size: 20px;

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

@@ -1456,7 +1456,11 @@ if(typeof(type) == "undefined" || type == null || type == ""){
   }
 }
 if(typeof(type) != "undefined" && type != null && type != ""){
-  $(".com-statusbar").append('<span class="com-type"><a href="/list/stype/'+goTemplateData.params.obj.stypeadd+'.html">'+type+'</a></span>');
+  if(type=="拟建"||type=="采购意向"){
+    $(".com-statusbar").append('<span class="com-type"><a href="javascript:volid(0);">'+type+'</a></span>');
+  }else{
+    $(".com-statusbar").append('<span class="com-type"><a href="/list/stype/'+goTemplateData.params.obj.stypeadd+'.html">'+type+'</a></span>');
+  }
 }
 //
 if(industry && industry!="undefined"){

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

@@ -119,7 +119,7 @@
 <!--S-侧边栏-->
 <div class="right-side-box right-side-box-only" data-backside>
 <!--      <div id="shareslider" style="width: 88px"></div>-->
-    <div id="sideIcon" class="" style="right: 1px;width: 88px;height: 88px;">
+    <div id="sideIcon" class="" style="right: 1px;width: 88px;height: 88px;display: none;">
 <!--        <a href="/swordfish/frontPage/share/sess/index"><img src="{{Msg "seo" "cdn"}}/share/img/active-icon.png"  alt="" style="width: 88px;"></a>-->
     </div>
       <div class="right-side-phone right-side-pop">

+ 23 - 3
src/web/templates/pc/biddetail.html

@@ -455,7 +455,15 @@ function isWechat() {
 					<div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
 					<div class="com-status">
 						{{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-						{{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+            {{if $v.type}}
+              {{if eq  $v.stypeadd "NJXM"}}
+              <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+              {{else if eq  $v.stypeadd "ZBCGYX"}}
+              <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+              {{else}}
+              <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+              {{end}}
+            {{end}}
 						{{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
 						{{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
 					</div>
@@ -473,7 +481,15 @@ function isWechat() {
 					<div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
 					<div class="com-status">
 						{{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-						{{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+            {{if $v.type}}
+            {{if eq  $v.stypeadd "NJXM"}}
+            <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+            {{else if eq  $v.stypeadd "ZBCGYX"}}
+            <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+            {{else}}
+            <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+            {{end}}
+            {{end}}
 						{{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
 						{{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
 					</div>
@@ -1146,7 +1162,11 @@ if(typeof(type) == "undefined" || type == null || type == ""){
 	}
 }
 if(typeof(type) != "undefined" && type != null && type != ""){
-		$(".com-statusbar").append('<span class="com-type"><a href="/list/stype/'+{{.T.obj.stypeadd}}+'.html">'+type+'</a></span>');
+  if(type=="拟建"||type=="采购意向"){
+    $(".com-statusbar").append('<span class="com-type"><a href="javascript:volid(0);">'+type+'</a></span>');
+  }else{
+    $(".com-statusbar").append('<span class="com-type"><a href="/list/stype/'+{{.T.obj.stypeadd}}+'.html">'+type+'</a></span>');
+  }
 }
 //
 if(industry && industry!="undefined"){

+ 15 - 3
src/web/templates/pc/biddetail_rec.html

@@ -1345,7 +1345,11 @@
                         <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
                         <div class="com-status">
                             {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-                            {{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+                            {{if or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
+                            <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                            {{else}}
+                            <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+                            {{end}}
                             {{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
                             {{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
                         </div>
@@ -1363,7 +1367,11 @@
                         <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
                         <div class="com-status">
                             {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-                            {{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+                            {{if or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
+                            <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                            {{else}}
+                            <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+                            {{end}}
                             {{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
                             {{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
                         </div>
@@ -1381,7 +1389,11 @@
                         <div class="com-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
                         <div class="com-status">
                             {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-                            {{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+                            {{if or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
+                            <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                            {{else}}
+                            <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+                            {{end}}
                             {{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
                             {{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
                         </div>

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

@@ -64,9 +64,20 @@
           <div class="right-con">
             <div class="a_box">
             {{$hasLogin := .T.hasLogin}}
-            {{range $i,$v := .T.hotkey}}
+            {{if $hasLogin }}
+              {{range $i,$v := .T.hotkey}}
               <a href="{{if  $hasLogin}}/page_workDesktop/work-bench/page?link={{end}}/jylab/supsearch/index.html?keywords={{$v}}&searchvalue=&selectType=title">{{$v}}</a>
+              {{end}}
+            {{else if .T.hotKeyArrUnLogin}}
+              {{range $i,$v := .T.hotKeyArrUnLogin}}
+              <a href="{{$v.Url}}">{{$v.Name}}</a>
+              {{end}}
+            {{else}}
+              {{range $i,$v := .T.hotkey}}
+              <a href="{{if  $hasLogin}}/page_workDesktop/work-bench/page?link={{end}}/jylab/supsearch/index.html?keywords={{$v}}&searchvalue=&selectType=title">{{$v}}</a>
+              {{end}}
             {{end}}
+
             </div>
           </div>
         </div>
@@ -103,9 +114,15 @@
             <div class="hot-banner">
               <div class="left yellow">项目数据</div>
               <div class="right">
-                {{if .T.hasLogin}}
+                <!-- {{if .T.hasLogin}}
                 <a href="/page_workDesktop/work-bench/page?link=/jylab/supsearch/index.html?subtype=拟建">拟建项目</a>
+<<<<<<< HEAD
                 {{end}}
+=======
+                {{else}}
+                <a href="/list/stype/NJXM.html">拟建项目</a>
+                {{end}} -->
+>>>>>>> master
 <!--                {{if .T.hasLogin}}-->
 <!--                <a href="/page_workDesktop/work-bench/page?link=/jylab/supsearch/index.html?subtype=采购意向">采购意向</a>-->
 <!--                {{else}}-->
@@ -199,7 +216,11 @@
                     {{range $y, $x := $v}}
                       {{if lt (len $x) 3}}
                         {{range $yi, $xi := $x}}
-                          {{if eq $yi 0}}<a class="tab-link tab-label" href="{{$xi.url}}" target="_blank">{{ $xi.city }}</a>{{end}}
+                          {{if or (eq $xi.city "台湾") (eq $xi.city "香港") (eq $xi.city "澳门") }}
+                            {{if eq $yi 0}}<a class="tab-link tab-label" href="javascript:volid(0);"  stype="pointer-events: none;">{{ $xi.city }}</a>{{end}}
+                          {{else}}
+                            {{if eq $yi 0}}<a class="tab-link tab-label" href="{{$xi.url}}" target="_blank">{{ $xi.city }}</a>{{end}}
+                          {{end}}
                         {{end}}
                       {{end}}
                     {{end}}
@@ -259,7 +280,7 @@
             </div>
             <div class="hot-subject-content simple-show">
               {{range $i,$v := .T.hotSubject}}
-              <a href="{{$v.url}}" target="_blank">{{$v.name}}</a>
+              <a href="{{$v.Url}}" target="_blank">{{$v.Name}}</a>
               {{end}}
             </div>
             <div class="hot-winner-content simple-show">
@@ -344,7 +365,7 @@
               {{if $hasLogin}}
               <a href="/page_workDesktop/work-bench/page?link={{$v.Url}}" target="_blank" class="more">查看更多</a>
               {{else}}
-              <a href="{{$v.Url}}" target="_blank" class="more">查看更多</a>
+              <a href="{{$v.UnLoginUrl}}" target="_blank" class="more">查看更多</a>
               {{end}}
             </div>
             <ul>

+ 29 - 4
src/web/templates/pc/tags/detail.html

@@ -64,7 +64,7 @@
   <div class="no-login-detail">
     <div class="w1200">
       <div class="bread-nav">
-        <span><a style="color: #686868;" href="/">剑鱼标讯</a></span><span> > </span><span><a style="color: #686868;" href="/list/stype/{{.T.obj.stypeadd}}.html">{{if .T.obj.subtype}}{{.T.obj.subtype}}{{else}}{{.T.obj.toptype}}{{end}}项目</a></span><span> > </span><span class="active">{{.T.obj.title}}</span>
+        <span><a style="color: #686868;" href="/">剑鱼标讯</a></span><span> > </span><span><a style="color: #686868;" {{if eq  .T.obj.stypeadd "NJXM"}} href="javascript:volid(0);" {{else if eq  .T.obj.stypeadd "ZBCGYX" }} href="javascript:volid(0);" {{else}} href="/list/stype/{{.T.obj.stypeadd}}.html" {{end}}>{{if .T.obj.subtype}}{{.T.obj.subtype}}{{else}}{{.T.obj.toptype}}{{end}}项目</a></span><span> > </span><span class="active">{{.T.obj.title}}</span>
       </div>
       <div class="page-content">
         <!-- 正文内容 -->
@@ -118,7 +118,7 @@
                       <span>{{.T.obj.buyer}}</span>
                       {{if .T.obj.buyer}}
                         {{if ne  .T.obj.buyer ""}}
-                        <a href="/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyer}}" target="_blank" class="go-detail">立即查看</a>
+                        <a href="/swordfish/page_big_pc/unit_portrayal/{{.T.obj.buyer}}" target="_blank" class="go-detail" rel="nofollow">立即查看</a>
                         {{end}}
                       {{end}}
                     </td>
@@ -217,7 +217,15 @@
                   <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
                   <div class="com-status">
                     {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-                    {{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+                    {{if $v.type}}
+                      {{if eq  $v.stypeadd "NJXM"}}
+                        <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                      {{else if eq  $v.stypeadd "ZBCGYX"}}
+                        <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                      {{else}}
+                        <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+                      {{end}}
+                    {{end}}
                     {{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
                     {{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
                   </div>
@@ -235,7 +243,15 @@
                   <div class="com-title"><a href="/nologin/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank">{{$v.title}}</a></div>
                   <div class="com-status">
                     {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
-                    {{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+                    {{if $v.type}}
+                      {{if eq  $v.stypeadd "NJXM"}}
+                      <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                      {{else if eq  $v.stypeadd "ZBCGYX"}}
+                      <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                      {{else}}
+                      <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+                      {{end}}
+                    {{end}}
                     {{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
                     {{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
                   </div>
@@ -254,6 +270,15 @@
                   <div class="com-status">
                     {{if $v.area}}<span class="com-area"><a href="/list/area/{{$v.areaadd}}.html">{{$v.area}}</a></span>{{end}}
                     {{if $v.type}}<span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>{{end}}
+                    {{if $v.type}}
+                      {{if eq  $v.stypeadd "NJXM"}}
+                      <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                      {{else if eq  $v.stypeadd "ZBCGYX"}}
+                      <span class="com-type"><a href="javascript:volid(0);">{{$v.type}}</a></span>
+                      {{else}}
+                      <span class="com-type"><a href="/list/stype/{{$v.stypeadd}}.html">{{$v.type}}</a></span>
+                      {{end}}
+                    {{end}}
                     {{if $v.industry}}<span class="com-industry"><a href="/list/industry/{{$v.indadd}}.html">{{$v.industry}}</a></span>{{end}}
                     {{if $v.publishtime}}<span class="com-time" data-value="{{$v.pbtime}}"><i class="glyphicon bofangjilu"></i>{{$v.publishtime}}</span>{{end}}
                   </div>

+ 2 - 2
src/web/templates/pc/tags/index.html

@@ -46,9 +46,9 @@
 
                 {{if ne .T.type "letter" }}
                     <!-- 筛选器 -->
-                    <section class="section section-card selector-card-container">
+                    <section class="section section-card selector-card-container" hidden>
                         <!-- 项目地区模块  -->
-                        <section class="selector-card">
+                        <section class="selector-card" >
                             <header class="selector-card-header">项目地区:</header>
                             <div class="selector-card-content">
                             {{if eq .T.type "area"}}

+ 1 - 1
src/web/templates/site/page/jySchool/class.html

@@ -78,7 +78,7 @@
                 {{range $k,$v := .T.list}}
                 <div class="art_list">
                   <div class="art_l_left">
-                    <a class="art_l_l_title ellipsis" href="/jySite/{{$v._id}}.html">
+                    <a class="art_l_l_title ellipsis" href="/jySite/{{$v._id}}.html" title="{{$v.s_title}}">
                       {{$v.s_title}}
                     </a>
                     <div class="art_l_l_content">

+ 1 - 1
src/web/templates/site/page/jySchool/search.html

@@ -59,7 +59,7 @@
             {{range $k,$v := .T.list}}
             <div class="art_list">
               <div class="art_l_left">
-                <div class="art_l_l_title ellipsis"  onclick="window.location.href='/jySite/{{$v._id}}.html'">
+                <div class="art_l_l_title ellipsis" title="{{$v.s_title}}" onclick="window.location.href='/jySite/{{$v._id}}.html'">
                   {{$v.s_title}}
                 </div>
                 <div class="art_l_l_content">

Some files were not shown because too many files changed in this diff