Browse Source

Merge branch 'feature/v4.8.91' into dev/v4.8.91_rjj

renjiaojiao 1 year ago
parent
commit
a38e4e1dcb

+ 15 - 14
src/jfw/front/nzjProject.go

@@ -358,7 +358,7 @@ func timeFmt(tm string) string {
 
 func getNzjList(infoMap map[string]interface{}) (count int64, list *[]map[string]interface{}) {
 	pageNum := common.If(common.IntAll(infoMap["pageNum"]) <= 0, 1, common.IntAll(infoMap["pageNum"])).(int)
-	pageSize := common.IntAll(infoMap["pageSize"])
+	pageSize := common.If(common.IntAll(infoMap["pageSize"]) <= 0, 50, common.IntAll(infoMap["pageSize"])).(int)
 	if pageNum*pageSize > common.IntAll(config.Sysconfig["nzjLimit"]) { //工作台外 默认只能搜索搜索100
 		pageNum = 1
 		pageSize = 50
@@ -376,7 +376,6 @@ func getNzjList(infoMap map[string]interface{}) (count int64, list *[]map[string
 		infoMap["keyCode"] = codes
 	}
 	musts := esQuery(infoMap)
-
 	if pageNum == 1 {
 		count = elastic.Count(proposed, proposed, fmt.Sprintf(`{"query": {"bool": {"must": [%s]}}}`, strings.Join(musts, ",")))
 		if count == 0 {
@@ -468,26 +467,28 @@ func esQuery(infoMap map[string]interface{}) []string {
 		keyWordsMusts []string
 		wordsShould   []string
 	)
-	//查询关键词
-	if infoMap["keyWord"] != nil && infoMap["keyWord"] != "" {
+	if infoMap["keyWord"] != "" && infoMap["keyWord"] != nil {
 		keyWord := common.InterfaceToStr(infoMap["keyWord"])
 		for _, v := range strings.Split(keyWord, " ") {
 			keyWordsMusts = append(keyWordsMusts, fmt.Sprintf(`{"multi_match": {"query": "%s","type": "phrase","fields": ["%s"]}}`, v, name))
 		}
-		wordsShould = append(wordsShould, fmt.Sprintf(elastic.NgramMust, strings.Join(keyWordsMusts, ",")))
 	}
-	//查询关键词匹配到的code
-	if infoMap["keyCode"] != nil {
-		keyWord, _ := infoMap["keyCode"].([]string)
-		wordsShould = append(wordsShould, fmt.Sprintf(`{
+
+	if len(keyWordsMusts) > 0 {
+		keyCode, _ := infoMap["keyCode"].([]string)
+		if keyCode != nil && len(keyCode) > 0 { //查询关键词匹配到的code
+			wordsShould = append(wordsShould, fmt.Sprintf(elastic.NgramMust, strings.Join(keyWordsMusts, ",")))
+			wordsShould = append(wordsShould, fmt.Sprintf(`{
           "terms": {
             "category_code": [%s]
           }
-        }`, strings.Join(keyWord, ",")))
-	}
-	if len(keyWordsMusts) > 0 {
-		musts = append(musts, fmt.Sprintf(queryBoolShould, strings.Join(wordsShould, ",")))
+        }`, strings.Join(keyCode, ",")))
+			musts = append(musts, fmt.Sprintf(queryBoolShould, strings.Join(wordsShould, ",")))
+		} else {
+			musts = append(musts, fmt.Sprintf(elastic.NgramMust, strings.Join(keyWordsMusts, ",")))
+		}
 	}
+
 	return musts
 }
 
@@ -532,7 +533,7 @@ FROM
 					m["lasttime"] = t.UnixMilli()
 				}
 			}
-			redis.Put("newother", nzjRedisKey, *dataArr, 3600*24)
+			redis.Put("newother", nzjRedisKey, *dataArr, 3600*12)
 			ds = (*dataArr)[(pageNum-1)*pageSize : pageNum*pageSize]
 		}
 	}

+ 190 - 0
src/jfw/front/recommendationProject.go

@@ -0,0 +1,190 @@
+package front
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	elastic "app.yhyue.com/moapp/jybase/es"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"jy/src/jfw/config"
+	"math/rand"
+	"strings"
+	"time"
+)
+
+const (
+	NewMustSearch             = `{"query":{"bool":{"must":[%s],"must_not":[{"terms":{"toptype":["采购意向","拟建"]}}]}}%s}`
+	biddingIndex, biddingType = "bidding", "bidding"
+	projectSet                = "projectset"
+	qyxy                      = "qyxy"
+)
+
+var (
+	WinnerRecommend, BuyerRecommend []map[string]interface{}
+)
+
+type RecommendationProject struct {
+	*xweb.Action
+	portraitRecommendation xweb.Mapper `xweb:"/front/bootstrap/specification"` //画像登录右侧推荐
+}
+
+func init() {
+	xweb.AddAction(&RecommendationProject{})
+	InitEnterprises()
+}
+
+func (l *RecommendationProject) PortraitRecommendation() {
+	l.GetString("isWinner")
+	l.ServeJson(map[string]interface{}{
+		"error_code": 0,
+		"error_msg":  nil,
+		"data":       config.Sysconfig["bootstrap_specification"],
+	})
+}
+
+func InitEnterprises() {
+	winnerConfig := strings.Split(common.InterfaceToStr(config.Sysconfig["winner"]), ",")
+	WinnerRecommend = getWinnerSeoIdByNameNew("company_name", false, winnerConfig...)
+	buyerConfig := strings.Split(common.InterfaceToStr(config.Sysconfig["buyer"]), ",")
+	BuyerRecommend = getBuyerSeoIdByNameNew(false, buyerConfig...)
+}
+
+// RelevanceData 关联单位
+func RelevanceData(name string, isWinner bool) (randomMaps []map[string]interface{}) {
+	if name == "" {
+		return nil
+	}
+	redisKey := fmt.Sprintf("portrait_relevance_%v_%s", isWinner, name)
+	getFullArr, fromCache := func() (data []map[string]interface{}, fromCache bool) {
+		gVal := redis.Get(RedisNameNew, redisKey)
+		if gVal != nil {
+			redisData := gVal.([]interface{})
+			randomMaps = common.ObjArrToMapArr(redisData)
+			fromCache = true
+			return
+		}
+		data = []map[string]interface{}{}
+		querySql := `{"query": {"bool": {"must": [%s]}},"_source":["buyer","s_winner","entidlist"],"size": 200}`
+		var mustSql string
+		if isWinner {
+			mustSql = fmt.Sprintf(`{"terms": {"entidlist": ["%s"]}},{"exists": {"field": "buyer"}}`, name)
+		} else {
+			mustSql = fmt.Sprintf(`{"match": {"buyer": "%s"}},{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`, name)
+		}
+		getData := elastic.Get(biddingIndex, biddingType, fmt.Sprintf(querySql, mustSql))
+		if getData != nil && len(*getData) > 0 {
+			queryMap := make(map[string]bool)
+			if !isWinner { //采购关联企业 校验正确性
+				var queryArr []string
+				for _, v := range *getData {
+					for _, entId := range gconv.Strings(v["entidlist"]) {
+						if queryMap[entId] {
+							continue
+						}
+						queryArr = append(queryArr, entId)
+						queryMap[entId] = true
+					}
+				}
+				data = getWinnerSeoIdByNameNew("_id", false, queryArr...)
+			} else {
+				var queryArr []string
+				for _, v := range *getData {
+					buyerName := gconv.String(v["buyer"])
+					if queryMap[buyerName] {
+						continue
+					}
+					queryArr = append(queryArr, buyerName)
+					queryMap[buyerName] = true
+				}
+				data = getBuyerSeoIdByNameNew(false, queryArr...)
+			}
+		}
+		return
+	}()
+	if !fromCache {
+		redis.Put(RedisNameNew, redisKey, getFullArr, 60*60*24)
+	}
+	randomMaps = getFullArr
+	if len(getFullArr) > 10 { //大于10 随机取10个
+		rand.Seed(time.Now().UnixNano())
+		start := rand.Intn(len(getFullArr) - 10)
+		randomMaps = getFullArr[start : start+10]
+	}
+	return
+}
+
+// RecommendedData 其他推荐
+// name 名称 province 省份 isWinner 来源是否中标企业画像 false 来源企业画像
+func RecommendedData(name, province string, isWinner bool) (rData []map[string]interface{}) {
+	redisKey := fmt.Sprintf("jyseo_portrait_recommended_%v_%s", isWinner, province)
+	getFullArr, formCache := func() (data []map[string]interface{}, formCache bool) {
+		if name == "" || province == "" || province == "全国" {
+			return
+		}
+		data = []map[string]interface{}{}
+		gVal := redis.Get(RedisNameNew, redisKey)
+		if gVal != nil {
+			redisData := gVal.([]interface{})
+			data = common.ObjArrToMapArr(redisData)
+			formCache = true
+			return
+		}
+
+		sql := fmt.Sprintf(`{"query":{"bool":{"must":[{"term":{"area":"%s"}},%s]}},"sort":[{"lasttime":"desc"}],"_source":["entidlist","buyer"],"from":0,"size":200}`, province, "%s")
+		if isWinner {
+			sql = fmt.Sprintf(sql, `{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`)
+		} else {
+			sql = fmt.Sprintf(sql, `{"exists": {"field": "buyer"}}`)
+		}
+
+		getData := elastic.Get(projectSet, projectSet, sql)
+		if getData != nil && len(*getData) > 0 {
+			queryMap := make(map[string]bool)
+			if isWinner { //采购关联企业 校验正确性
+				var queryArr []string
+				for _, v := range *getData {
+					for _, entId := range gconv.Strings(v["entidlist"]) {
+						if queryMap[entId] {
+							continue
+						}
+						queryArr = append(queryArr, entId)
+						queryMap[entId] = true
+					}
+				}
+				data = getWinnerSeoIdByNameNew("_id", false, queryArr...)
+			} else {
+				var queryArr []string
+				for _, v := range *getData {
+					buyerName := gconv.String(v["buyer"])
+					if queryMap[buyerName] {
+						continue
+					}
+					queryArr = append(queryArr, buyerName)
+					queryMap[buyerName] = true
+				}
+				data = getBuyerSeoIdByNameNew(false, queryArr...)
+			}
+		}
+		return
+	}()
+	if !formCache {
+		redis.Put(RedisNameNew, redisKey, getFullArr, 60*60*24)
+	}
+
+	finalArr := getFullArr
+	if len(finalArr) == 0 {
+		if isWinner {
+			finalArr = WinnerRecommend
+		} else {
+			finalArr = BuyerRecommend
+		}
+	}
+
+	if len(finalArr) > 10 {
+		rand.Seed(time.Now().UnixNano())
+		start := rand.Intn(len(finalArr) - 10)
+		return finalArr[start : start+10]
+	}
+	return finalArr
+}

+ 1341 - 1344
src/jfw/front/shorturl.go

@@ -1,1474 +1,1471 @@
 package front
 
 import (
-    "database/sql"
-    "errors"
-    "fmt"
-    "jy/src/jfw/config"
-    "jy/src/jfw/wx"
-    "log"
-    "math/rand"
-    "net/url"
-    "strconv"
+	"database/sql"
+	"errors"
+	"fmt"
+	"jy/src/jfw/config"
+	"jy/src/jfw/wx"
+	"log"
+	"math/rand"
+	"net/url"
+	"strconv"
 
-    "github.com/gogf/gf/v2/util/gconv"
+	"github.com/gogf/gf/v2/util/gconv"
 
-    "jy/src/jfw/jyutil"
+	"jy/src/jfw/jyutil"
 
-    "app.yhyue.com/moapp/jypkg/public"
+	"app.yhyue.com/moapp/jypkg/public"
 
-    util "app.yhyue.com/moapp/jybase/common"
-    "app.yhyue.com/moapp/jybase/date"
-    mg "app.yhyue.com/moapp/jybase/mongodb"
+	util "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	mg "app.yhyue.com/moapp/jybase/mongodb"
 
-    "regexp"
-    "strings"
-    "time"
+	"regexp"
+	"strings"
+	"time"
 
-    elastic "app.yhyue.com/moapp/jybase/es"
+	elastic "app.yhyue.com/moapp/jybase/es"
 
-    "app.yhyue.com/moapp/jybase/encrypt"
-    "app.yhyue.com/moapp/jybase/go-xweb/xweb"
-    "app.yhyue.com/moapp/jybase/redis"
-    "app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
-    "github.com/SKatiyar/qr"
-    "go.mongodb.org/mongo-driver/bson"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"app.yhyue.com/moapp/jybase/redis"
+	"app.yhyue.com/moapp/jypkg/common/src/qfw/util/jy"
+	"github.com/SKatiyar/qr"
+	"go.mongodb.org/mongo-driver/bson"
 )
 
 type Short struct {
-    *xweb.Action
-    article        xweb.Mapper `xweb:"/article/(\\w+)/(.*).html"` //([pm])
-    qr             xweb.Mapper `xweb:"/biddetail/(\\w+)/qr/(.+)"`
-    replication    xweb.Mapper `xweb:"/front/shorturl/replication"` //用户复制操作记录入库
-    nologinArticle xweb.Mapper `xweb:"/nologin/(\\w+)/(.*).html"`   //([pm]) 无需登录
-    whiteList      xweb.Mapper `xweb:"/initialize/whiteList"`       //白名单初始化
+	*xweb.Action
+	article        xweb.Mapper `xweb:"/article/(\\w+)/(.*).html"` //([pm])
+	qr             xweb.Mapper `xweb:"/biddetail/(\\w+)/qr/(.+)"`
+	replication    xweb.Mapper `xweb:"/front/shorturl/replication"` //用户复制操作记录入库
+	nologinArticle xweb.Mapper `xweb:"/nologin/(\\w+)/(.*).html"`   //([pm]) 无需登录
+	whiteList      xweb.Mapper `xweb:"/initialize/whiteList"`       //白名单初始化
 }
 
 var (
-    mobileReg      = regexp.MustCompile("(?i)(Android|Mobile|Phone)")
-    DateFullLayout = "2006-01-02 15:04:05"
-    Map_stype      = map[string]bool{
-        "content":         true,
-        "entservice":      true,
-        "bdprivate":       true,
-        "mailprivate":     true,
-        "bdcontent":       true,
-        "indexcontent":    true,
-        "advancedProject": true,
-    }
-    //seoAgentReg      = regexp.MustCompile("Baiduspider|360Spider|bingbot|Googlebot")
-    detailNeedMosaic map[string]interface{}
-    TypeCodeMap      = map[string]string{
-        "拟建":     "拟建项目",
-        "采购意向": "采购意向",
-        "预告":     "招标预告",
-        "预审":     "资格预审",
-        "预审结果": "资格预审结果",
-        "论证意见": "论证意见",
-        "需求公示": "需求公示",
-        "招标":     "公开招标",
-        "邀标":     "邀请招标",
-        "询价":     "询价采购",
-        "竞谈":     "竞争性谈判",
-        "单一":     "单一来源采购",
-        "竞价":     "竞价公告",
-        "变更":     "变更公告",
-        "中标":     "中标公示",
-        "成交":     "成交公告",
-        "废标":     "废标公告",
-        "流标":     "流标公告",
-        "合同":     "合同公告信息",
-        "验收":     "验收公告信息",
-        "违规":     "违规信息",
-    }
+	mobileReg      = regexp.MustCompile("(?i)(Android|Mobile|Phone)")
+	DateFullLayout = "2006-01-02 15:04:05"
+	Map_stype      = map[string]bool{
+		"content":         true,
+		"entservice":      true,
+		"bdprivate":       true,
+		"mailprivate":     true,
+		"bdcontent":       true,
+		"indexcontent":    true,
+		"advancedProject": true,
+	}
+	//seoAgentReg      = regexp.MustCompile("Baiduspider|360Spider|bingbot|Googlebot")
+	detailNeedMosaic map[string]interface{}
+	TypeCodeMap      = map[string]string{
+		"拟建":   "拟建项目",
+		"采购意向": "采购意向",
+		"预告":   "招标预告",
+		"预审":   "资格预审",
+		"预审结果": "资格预审结果",
+		"论证意见": "论证意见",
+		"需求公示": "需求公示",
+		"招标":   "公开招标",
+		"邀标":   "邀请招标",
+		"询价":   "询价采购",
+		"竞谈":   "竞争性谈判",
+		"单一":   "单一来源采购",
+		"竞价":   "竞价公告",
+		"变更":   "变更公告",
+		"中标":   "中标公示",
+		"成交":   "成交公告",
+		"废标":   "废标公告",
+		"流标":   "流标公告",
+		"合同":   "合同公告信息",
+		"验收":   "验收公告信息",
+		"违规":   "违规信息",
+	}
 )
 
 func (s *Short) WhiteList() error {
-    ipInitAuthentication := s.GetString("ipInitAuthentication")
-    if ipInitAuthentication == config.Sysconfig["ipInitAuthentication"] {
-        config.IpInit()
-        log.Println("初始化ipInit配置")
-    }
-    return nil
+	ipInitAuthentication := s.GetString("ipInitAuthentication")
+	if ipInitAuthentication == config.Sysconfig["ipInitAuthentication"] {
+		config.IpInit()
+		log.Println("初始化ipInit配置")
+	}
+	return nil
 }
 
 func (s *Short) Article(stype, id string) error {
-    //是否是移动端
-    bm := mobileReg.MatchString(s.Header("User-Agent"))
-    //是否是微信浏览器
-    isWxB := public.CheckWxBrowser(s.Request)
-    //userId, _ := s.GetSession("userId").(string)
-    sess := s.Session().GetMultiple()
-    //未登录用户是否访问的微信浏览器
-    userId, _ := sess["userId"].(string)
-    if userId == "" {
-        if IsWxBrowserContent[stype] {
-            if s.GetString("state") == "wx" {
-                //微信跳回来的
-                if code := s.GetString("code"); code != "" {
-                    if openid := jyutil.Getopenid(code); openid != "" {
-                        if CheckUserIsSubscribe(openid) {
-                            FindUserAndCreateSess(openid, s.Session(), "wx", false, true)
-                            //生session后 重新获取一下
-                            //userId, _ = s.GetSession("userId").(string)
-                            sess = s.Session().GetMultiple()
-                            userId, _ = sess["userId"].(string)
-                        } else if !bm { //未关注用户 pc端到关注页面
-                            log.Println("PC微信端浏览器 未关注用户 访问地址----")
-                            s.Request.Header.Del("Referer")
-                            return s.Redirect("/swordfish/frontPage/user/free/redirect-wx")
-                        } //未关注用户  移动端下面处理
-                    }
-                }
-            } else if isWxB {
-                //所有参数都不再使用,跳到微信验证用户
-                return s.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(s.Site()+s.Url()), "wx"), 302)
-            }
-        }
-    }
-    //PC端未登录用户程序走此逻辑  WX端走原来逻辑
-    if !bm && (stype == "content" || stype == "indexcontent") && userId == "" {
-        //if seoAgentReg.MatchString(s.UserAgent()) {
-        sids := encrypt.CommonDecodeArticle(stype, id)
-        return s.NologinCommon("", stype, id, sids[0])
-        //} else {
-        //	return s.Redirect("/notin/page")
-        //}
-    }
-    return s.LoginCommon(sess, stype, id, bm, false)
+	//是否是移动端
+	bm := mobileReg.MatchString(s.Header("User-Agent"))
+	//是否是微信浏览器
+	isWxB := public.CheckWxBrowser(s.Request)
+	//userId, _ := s.GetSession("userId").(string)
+	sess := s.Session().GetMultiple()
+	//未登录用户是否访问的微信浏览器
+	userId, _ := sess["userId"].(string)
+	if userId == "" {
+		if IsWxBrowserContent[stype] {
+			if s.GetString("state") == "wx" {
+				//微信跳回来的
+				if code := s.GetString("code"); code != "" {
+					if openid := jyutil.Getopenid(code); openid != "" {
+						if CheckUserIsSubscribe(openid) {
+							FindUserAndCreateSess(openid, s.Session(), "wx", false, true)
+							//生session后 重新获取一下
+							//userId, _ = s.GetSession("userId").(string)
+							sess = s.Session().GetMultiple()
+							userId, _ = sess["userId"].(string)
+						} else if !bm { //未关注用户 pc端到关注页面
+							log.Println("PC微信端浏览器 未关注用户 访问地址----")
+							s.Request.Header.Del("Referer")
+							return s.Redirect("/swordfish/frontPage/user/free/redirect-wx")
+						} //未关注用户  移动端下面处理
+					}
+				}
+			} else if isWxB {
+				//所有参数都不再使用,跳到微信验证用户
+				return s.Redirect(fmt.Sprintf(config.Wxoauth, url.QueryEscape(s.Site()+s.Url()), "wx"), 302)
+			}
+		}
+	}
+	//PC端未登录用户程序走此逻辑  WX端走原来逻辑
+	if !bm && (stype == "content" || stype == "indexcontent") && userId == "" {
+		//if seoAgentReg.MatchString(s.UserAgent()) {
+		sids := encrypt.CommonDecodeArticle(stype, id)
+		return s.NologinCommon("", stype, id, sids[0])
+		//} else {
+		//	return s.Redirect("/notin/page")
+		//}
+	}
+	return s.LoginCommon(sess, stype, id, bm)
 }
 
-func (s *Short) LoginCommon(sess map[string]interface{}, stype, id string, bm, isHome bool) error {
-    log.Println(stype, "----stype:---", id)
-    //电脑端 剑鱼快照页面访问
-    /*if stype == "content" && !bm {
-    	//工作桌面内嵌 快照页
-    	//老地址(地址不包含aside)且非工作桌面地址
-    	if !strings.Contains(s.Request.URL.String(), "aside") && !strings.Contains(s.Request.URL.String(), "page_workDesktop") {
-    		paramSuffix := ".html?aside=0"
-    		replaceStr := ".html"
-    		if strings.Contains(s.Request.URL.String(), "?") {
-    			replaceStr = ".html?"
-    			paramSuffix = ".html?aside=0&"
-    		}
-    		//p415 首页改版 三级页登录跳转第一版修改
-    		return s.Redirect(fmt.Sprintf("%s%s%s", config.Sysconfig["workDesktopUrl"].(string), config.Sysconfig["webdomain"].(string), url.QueryEscape(strings.Replace(s.Request.URL.String(), replaceStr, paramSuffix, 1))))
-    		//urlStr := strings.ReplaceAll(s.Request.URL.String(), "nologin", "article")
-    		//return s.Redirect(strings.Replace(urlStr, replaceStr, paramSuffix, 1), 302)
-    	}
-    }*/
-    userId, _ := sess["userId"].(string)
-    if stype == "content" && isHome && !bm { //pc端nologin 页面登录来 添加右侧导航信息
-        tg := &Tags{}
-        s.T["newBidInfoList"] = tg.GetNewBidInfo()
-        s.T["industryInfoList"] = tg.GetConsult()
-        s.T["hotLabelList"] = tg.GetHotLabel(30)
-    }
-    //getsession := s.Session().GetMultiple()
-    //先判断是否有session
-    source := s.GetString("source")
-    disWord := s.GetString("disWord")
-    aboutUrl := "/swordfish/about"
-    //是否已经检查过,默认是检查过-true,分享过来的是未检查过-false
-    //	checkIsSubscribeFlag := true
-    //	if source == "app_infocontentshare" || source == "wx_infocontentshare" {
-    //		checkIsSubscribeFlag = false
-    //	}
-    from_userid := ""
-    if source != "" {
-        aboutUrl += "?source=" + source
-        if strings.Contains(source, "wx_infocontentshare") {
-            decodeArr := encrypt.DecodeArticleId2ByCheck(id)
-            if len(decodeArr) > 1 {
-                from_userid = se.Encode2Hex(GetUserId(decodeArr[1])) //加密用户userid
-            }
-        } else if strings.Contains(source, "app_infocontentshare") {
-            if from := s.GetString("from"); from != "" {
-                from_userid = from
-            }
-        }
-        aboutUrl += "&from=" + from_userid
-    }
-    if !Map_stype[stype] {
-        s.Redirect("/not/nottype", 302)
-        return nil
-    } else if stype == "content" || stype == "bdcontent" || stype == "advancedProject" {
-        if userId == "" { //} && !regclient.MatchString(client) { //没有用户session //搜索引擎让过
-            s.Session().Set("referer", s.Request.RequestURI)
-            if bm { //是否是移动端访问
-                s.Redirect(aboutUrl, 302)
-            } else {
-                if stype == "bdcontent" {
-                    var retMap = make(map[string]interface{})
-                    stype = "content"
-                    _id := encrypt.CommonDecodeArticle(stype, id)[0]
-                    _, _, _, obj := pcVRT(_id, "", stype, true, true)
-                    if obj != nil && len(obj) > 0 {
-                        retMap["_id"] = id
-                        retMap["title"], _ = obj["title"].(string)
-                        retMap["area"], _ = obj["area"].(string)
-                        retMap["subtype"], _ = obj["subtype"].(string)
-                        retMap["subscopeclass"], _ = obj["s_subscopeclass"].(string)
-                        retMap["publishtime"] = util.IntAll(obj["publishtime"])
-                        retMap["keywords"] = KeyWordHandle(obj)
-                        retMap["description"] = DescriptionHandle(stype, obj)
-                    }
-                    s.T["shareid"] = config.Seoconfig["baiduSEM-p"].(string)
-                    s.T["logid"] = config.Seoconfig["baiduSEM-p"].(string)
-                    s.T["obj"] = retMap
-                    s.Render("/pc/biddetail_bd.html", &s.T)
-                } else {
-                    s.Redirect("/notin/page", 302)
-                }
-            }
-            return nil
-        } else if disWord != "" {
-            from_userid = disWordNil(disWord, userId)
-        }
-        if stype == "bdcontent" {
-            stype = "content"
-        }
-    } else if stype == "entservice" { //大客户数据快照展示
-        //se := util.SimpleEncrypt{"entservice"}
-        sid := encrypt.SE3.DecodeString(id)
-        log.Println("----sid:---", sid)
-        if len(sid) == 0 || (len(sid) > 0 && sid == "") { //未登录用户没有权限访问---userId == "" ||   未登录可以访问来自陈 11.29
-            s.Redirect("/notin/page", 302)
-            return nil
-        }
-        catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", userId, stype, sid)
-        if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
-            industry := s.GetString("industry")
-            var shareid = s.GetString("id")
-            if len(shareid) == 0 {
-                shareid = "10"
-            }
-            s.T["logid"] = config.Seoconfig["jysskzy"].(string)
-            s.T["shareid"] = se.EncodeString(shareid)
-            s.T["keywords"] = s.GetString("kds")
-            ssOpenid := sess["s_m_openid"]
-            po, bo, wo, obj := pcVRT(sid, industry, stype, true, true)
-            if obj != nil && len(obj) > 0 {
+func (s *Short) LoginCommon(sess map[string]interface{}, stype, id string, bm bool) error {
+	log.Println(stype, "----stype:---", id)
+	//电脑端 剑鱼快照页面访问
+	if stype == "content" && !bm {
+		//工作桌面内嵌 快照页
+		//老地址(地址不包含aside)且非工作桌面地址
+		if !strings.Contains(s.Request.URL.String(), "aside") && !strings.Contains(s.Request.URL.String(), "page_workDesktop") {
+			tg := &Tags{} //415 第二版 添加右侧推荐 工作台外登录 不在重定向跳转
+			s.T["newBidInfoList"] = tg.GetNewBidInfo()
+			s.T["industryInfoList"] = tg.GetConsult()
+			s.T["hotLabelList"] = tg.GetHotLabel(30)
+			//paramSuffix := ".html?aside=0"
+			//replaceStr := ".html"
+			//if strings.Contains(s.Request.URL.String(), "?") {
+			//	replaceStr = ".html?"
+			//	paramSuffix = ".html?aside=0&"
+			//}
+			////p415 首页改版 三级页登录跳转第一版修改
+			//return s.Redirect(fmt.Sprintf("%s%s%s", config.Sysconfig["workDesktopUrl"].(string), config.Sysconfig["webdomain"].(string), url.QueryEscape(strings.Replace(s.Request.URL.String(), replaceStr, paramSuffix, 1))))
+		}
+	}
+	userId, _ := sess["userId"].(string)
+	//getsession := s.Session().GetMultiple()
+	//先判断是否有session
+	source := s.GetString("source")
+	disWord := s.GetString("disWord")
+	aboutUrl := "/swordfish/about"
+	//是否已经检查过,默认是检查过-true,分享过来的是未检查过-false
+	//	checkIsSubscribeFlag := true
+	//	if source == "app_infocontentshare" || source == "wx_infocontentshare" {
+	//		checkIsSubscribeFlag = false
+	//	}
+	from_userid := ""
+	if source != "" {
+		aboutUrl += "?source=" + source
+		if strings.Contains(source, "wx_infocontentshare") {
+			decodeArr := encrypt.DecodeArticleId2ByCheck(id)
+			if len(decodeArr) > 1 {
+				from_userid = se.Encode2Hex(GetUserId(decodeArr[1])) //加密用户userid
+			}
+		} else if strings.Contains(source, "app_infocontentshare") {
+			if from := s.GetString("from"); from != "" {
+				from_userid = from
+			}
+		}
+		aboutUrl += "&from=" + from_userid
+	}
+	if !Map_stype[stype] {
+		s.Redirect("/not/nottype", 302)
+		return nil
+	} else if stype == "content" || stype == "bdcontent" || stype == "advancedProject" {
+		if userId == "" { //} && !regclient.MatchString(client) { //没有用户session //搜索引擎让过
+			s.Session().Set("referer", s.Request.RequestURI)
+			if bm { //是否是移动端访问
+				s.Redirect(aboutUrl, 302)
+			} else {
+				if stype == "bdcontent" {
+					var retMap = make(map[string]interface{})
+					stype = "content"
+					_id := encrypt.CommonDecodeArticle(stype, id)[0]
+					_, _, _, obj := pcVRT(_id, "", stype, true, true)
+					if obj != nil && len(obj) > 0 {
+						retMap["_id"] = id
+						retMap["title"], _ = obj["title"].(string)
+						retMap["area"], _ = obj["area"].(string)
+						retMap["subtype"], _ = obj["subtype"].(string)
+						retMap["subscopeclass"], _ = obj["s_subscopeclass"].(string)
+						retMap["publishtime"] = util.IntAll(obj["publishtime"])
+						retMap["keywords"] = KeyWordHandle(obj)
+						retMap["description"] = DescriptionHandle(stype, obj)
+					}
+					s.T["shareid"] = config.Seoconfig["baiduSEM-p"].(string)
+					s.T["logid"] = config.Seoconfig["baiduSEM-p"].(string)
+					s.T["obj"] = retMap
+					s.Render("/pc/biddetail_bd.html", &s.T)
+				} else {
+					s.Redirect("/notin/page", 302)
+				}
+			}
+			return nil
+		} else if disWord != "" {
+			from_userid = disWordNil(disWord, userId)
+		}
+		if stype == "bdcontent" {
+			stype = "content"
+		}
+	} else if stype == "entservice" { //大客户数据快照展示
+		//se := util.SimpleEncrypt{"entservice"}
+		sid := encrypt.SE3.DecodeString(id)
+		log.Println("----sid:---", sid)
+		if len(sid) == 0 || (len(sid) > 0 && sid == "") { //未登录用户没有权限访问---userId == "" ||   未登录可以访问来自陈 11.29
+			s.Redirect("/notin/page", 302)
+			return nil
+		}
+		catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", userId, stype, sid)
+		if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
+			industry := s.GetString("industry")
+			var shareid = s.GetString("id")
+			if len(shareid) == 0 {
+				shareid = "10"
+			}
+			s.T["logid"] = config.Seoconfig["jysskzy"].(string)
+			s.T["shareid"] = se.EncodeString(shareid)
+			s.T["keywords"] = s.GetString("kds")
+			ssOpenid := sess["s_m_openid"]
+			po, bo, wo, obj := pcVRT(sid, industry, stype, true, true)
+			if obj != nil && len(obj) > 0 {
 
-                if len(po) > 0 {
-                    s.T["projectOther"] = po
-                }
-                if len(bo) > 0 {
-                    s.T["buyerOther"] = bo
-                }
-                if len(wo) > 0 {
-                    s.T["winnerOther"] = wo
-                }
-                obj["urlpath"] = s.Uri()
-                obj["industry"] = industry
-                if ssOpenid != nil {
-                    obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
-                }
-                //if false && isbid(obj["subtype"]) {
-                //	//bidding表有数据就有,没有不再查此中标企业得其他信息--需求来自数据和质量
-                //	obj["winner_enttel"] = "" //getwinnertel(obj["winner"])
-                //}
-                //判断时间 //如果是seo页面超过时间访问的进入首页
-                comeinTime := time.Unix(util.Int64All(obj["comeintime"]), 0)
-                if stype == "indexcontent" {
-                    if count := public.MQFW.Count("seobidding", map[string]interface{}{"bid": sid}); count <= 0 && comeinTime.Before(time.Now().Add(time.Duration(-util.IntAll(config.Sysconfig["seoBeforeTimeHour"]))*time.Hour)) {
-                        return s.Redirect("/")
-                    }
-                }
-                FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, false)
+				if len(po) > 0 {
+					s.T["projectOther"] = po
+				}
+				if len(bo) > 0 {
+					s.T["buyerOther"] = bo
+				}
+				if len(wo) > 0 {
+					s.T["winnerOther"] = wo
+				}
+				obj["urlpath"] = s.Uri()
+				obj["industry"] = industry
+				if ssOpenid != nil {
+					obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
+				}
+				//if false && isbid(obj["subtype"]) {
+				//	//bidding表有数据就有,没有不再查此中标企业得其他信息--需求来自数据和质量
+				//	obj["winner_enttel"] = "" //getwinnertel(obj["winner"])
+				//}
+				//判断时间 //如果是seo页面超过时间访问的进入首页
+				comeinTime := time.Unix(util.Int64All(obj["comeintime"]), 0)
+				if stype == "indexcontent" {
+					if count := public.MQFW.Count("seobidding", map[string]interface{}{"bid": sid}); count <= 0 && comeinTime.Before(time.Now().Add(time.Duration(-util.IntAll(config.Sysconfig["seoBeforeTimeHour"]))*time.Hour)) {
+						return s.Redirect("/")
+					}
+				}
+				FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, false)
 
-                if obj["projectname"] != nil {
-                    s.SetSession("projectname", obj["projectname"])
-                }
-                if obj["entidlist"] != nil { //大会员中标企业跳转至画像
-                    s_winner := util.ObjToString(obj["s_winner"])
-                    idObjs, _ := obj["entidlist"].([]interface{})
-                    winnerIdArr := []string{}
-                    for _, v := range strings.Split(s_winner, ",") {
-                        if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
-                            continue
-                        }
-                        winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
-                        obj["entIds"] = winnerIdArr
-                    }
-                }
-                if obj["publishtime"] != nil {
-                    obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
-                }
-                s.T["url"] = s.Uri()
-                obj["keywords"] = KeyWordHandle(obj)
-                obj["description"] = DescriptionHandle(stype, obj)
-                s.T["obj"] = obj
-                content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
-                redis.Put(redisLimitation, catchKey, string(content), 60*20)
-                return s.SetBody(content)
-            }
-        } else {
-            return s.SetBody([]byte(res.(string)))
-        }
-    }
-    ssOpenid := sess["s_m_openid"]
-    var (
-        res *map[string]interface{}
-        ok  bool
-    )
-    if userId == "" && ssOpenid != nil {
-        res, ok = mongodb.FindOneByField("user", bson.M{"s_m_openid": ssOpenid, "s_unionid": bson.M{"$ne": ssOpenid}}, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1,"l_vip_starttime":1}`)
-        if ok {
-            userId = mg.BsonIdToSId((*res)["_id"])
-        }
-    } else if userId != "" {
-        //判断用户是否是vip
-        res = jyutil.Compatible.Select(userId, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1,"l_vip_starttime":1}`)
-    }
-    userPower := jy.GetBigVipUserBaseMsg(s.Session(), *config.Middleground)
-    var (
-        isEntnicheNew bool = userPower.EntIsNew                                                           //新版超级订阅
-        isOldVip      bool = false                                                                        //新购超级订阅不能查看拟建项目详情页
-        isVip         bool = userPower.VipStatus > 0                                                      //超级订阅
-        isMember      bool = userPower.Status > 0                                                         //大会员
-        isEntniche    bool = userPower.EntnicheStatus > 0                                                 //商机管理
-        privatedata   bool = userPower.PrivateGD                                                          //广东移动DICT 用户
-        isEntService  bool = userPower.Data.Ent.PowerSource > 0 && userPower.Data.Entniche.IsEntPower > 0 //商机管理服务
-        newCanRead         = false
-    )
-    if res != nil && len(*res) > 0 {
-        if isVip && util.Int64All((*res)["l_vip_starttime"]) < util.Int64All(config.Sysconfig["contextOldVipLimit"]) {
-            isOldVip = true
-        }
-    }
-    //entid := util.Int64All(s.GetSession("entId"))
-    entId := util.IntAll(sess["entId"])
-    if entId > 0 && userPower.EntInfo[entId] != nil {
-        isEntniche = userPower.EntInfo[entId].Status == 1 && userPower.EntInfo[entId].IsPower
-        isEntnicheNew = userPower.EntInfo[entId].IsNew && isEntniche
-        if isEntService = userPower.EntInfo[entId].IsService && userPower.EntInfo[entId].IsPower; isEntService {
-            isEntnicheNew = false
-            isEntniche = false
-        }
-    }
-    if !isEntniche && privatedata {
-        isEntniche = true
-    }
-    s.T["isVip"] = isVip
-    s.T["isMember"] = isMember
-    s.T["isEntniche"] = isEntniche
-    s.T["isEntnicheNew"] = isEntnicheNew
-    s.T["isEntService"] = isEntService
-    if bm {
-        //判断有没有取关,取关的话,跳转到关于剑鱼标讯页面
-        if ssOpenid != nil && ssOpenid != "" {
-            isSubscribe := CheckUserIsSubscribe(ssOpenid.(string))
-            if !isSubscribe {
-                return s.Redirect(aboutUrl, 302)
-            }
-            //之前sessionkeep.go中没有放userId,造成关注有问题
-            if userId == "" {
-                FindUserAndCreateSess(ssOpenid.(string), s.Session(), "wx", false, true)
-            }
-        }
-        surl := s.GetString("url")
-        kds := s.GetString("keywords")
-        industry := s.GetString("industry")
-        var shareopenid, sid string
-        sid_openid := encrypt.CommonDecodeArticle(stype, id)
-        switch len(sid_openid) {
-        case 0:
-            s.Redirect(aboutUrl, 302)
-            return nil
-        default:
-            shareopenid, sid = SwiDef(sid_openid)
-        }
+				if obj["projectname"] != nil {
+					s.SetSession("projectname", obj["projectname"])
+				}
+				if obj["entidlist"] != nil { //大会员中标企业跳转至画像
+					s_winner := util.ObjToString(obj["s_winner"])
+					idObjs, _ := obj["entidlist"].([]interface{})
+					winnerIdArr := []string{}
+					for _, v := range strings.Split(s_winner, ",") {
+						if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
+							continue
+						}
+						winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
+						obj["entIds"] = winnerIdArr
+					}
+				}
+				if obj["publishtime"] != nil {
+					obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
+				}
+				s.T["url"] = s.Uri()
+				obj["keywords"] = KeyWordHandle(obj)
+				obj["description"] = DescriptionHandle(stype, obj)
+				s.T["obj"] = obj
+				content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
+				redis.Put(redisLimitation, catchKey, string(content), 60*20)
+				return s.SetBody(content)
+			}
+		} else {
+			return s.SetBody([]byte(res.(string)))
+		}
+	}
+	ssOpenid := sess["s_m_openid"]
+	var (
+		res *map[string]interface{}
+		ok  bool
+	)
+	if userId == "" && ssOpenid != nil {
+		res, ok = mongodb.FindOneByField("user", bson.M{"s_m_openid": ssOpenid, "s_unionid": bson.M{"$ne": ssOpenid}}, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1,"l_vip_starttime":1}`)
+		if ok {
+			userId = mg.BsonIdToSId((*res)["_id"])
+		}
+	} else if userId != "" {
+		//判断用户是否是vip
+		res = jyutil.Compatible.Select(userId, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1,"l_vip_starttime":1}`)
+	}
+	userPower := jy.GetBigVipUserBaseMsg(s.Session(), *config.Middleground)
+	var (
+		isEntnicheNew bool = userPower.EntIsNew                                                           //新版超级订阅
+		isOldVip      bool = false                                                                        //新购超级订阅不能查看拟建项目详情页
+		isVip         bool = userPower.VipStatus > 0                                                      //超级订阅
+		isMember      bool = userPower.Status > 0                                                         //大会员
+		isEntniche    bool = userPower.EntnicheStatus > 0                                                 //商机管理
+		privatedata   bool = userPower.PrivateGD                                                          //广东移动DICT 用户
+		isEntService  bool = userPower.Data.Ent.PowerSource > 0 && userPower.Data.Entniche.IsEntPower > 0 //商机管理服务
+		newCanRead         = false
+	)
+	if res != nil && len(*res) > 0 {
+		if isVip && util.Int64All((*res)["l_vip_starttime"]) < util.Int64All(config.Sysconfig["contextOldVipLimit"]) {
+			isOldVip = true
+		}
+	}
+	//entid := util.Int64All(s.GetSession("entId"))
+	entId := util.IntAll(sess["entId"])
+	if entId > 0 && userPower.EntInfo[entId] != nil {
+		isEntniche = userPower.EntInfo[entId].Status == 1 && userPower.EntInfo[entId].IsPower
+		isEntnicheNew = userPower.EntInfo[entId].IsNew && isEntniche
+		if isEntService = userPower.EntInfo[entId].IsService && userPower.EntInfo[entId].IsPower; isEntService {
+			isEntnicheNew = false
+			isEntniche = false
+		}
+	}
+	if !isEntniche && privatedata {
+		isEntniche = true
+	}
+	s.T["isVip"] = isVip
+	s.T["isMember"] = isMember
+	s.T["isEntniche"] = isEntniche
+	s.T["isEntnicheNew"] = isEntnicheNew
+	s.T["isEntService"] = isEntService
+	if bm {
+		//判断有没有取关,取关的话,跳转到关于剑鱼标讯页面
+		if ssOpenid != nil && ssOpenid != "" {
+			isSubscribe := CheckUserIsSubscribe(ssOpenid.(string))
+			if !isSubscribe {
+				return s.Redirect(aboutUrl, 302)
+			}
+			//之前sessionkeep.go中没有放userId,造成关注有问题
+			if userId == "" {
+				FindUserAndCreateSess(ssOpenid.(string), s.Session(), "wx", false, true)
+			}
+		}
+		surl := s.GetString("url")
+		kds := s.GetString("keywords")
+		industry := s.GetString("industry")
+		var shareopenid, sid string
+		sid_openid := encrypt.CommonDecodeArticle(stype, id)
+		switch len(sid_openid) {
+		case 0:
+			s.Redirect(aboutUrl, 302)
+			return nil
+		default:
+			shareopenid, sid = SwiDef(sid_openid)
+		}
 
-        if stype == "advancedProject" {
-            //判断此用户是否有打开的权限
-            //newUserId := s.GetSession("base_user_id")
-            newUserId := sess["base_user_id"]
-            pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
-            //访问次数加1
-            if pushData == nil {
-                newCanRead = false
-            } else {
-                public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
-                newCanRead = true
-            }
-        }
-        s.T["keywords"] = kds
-        if shareopenid != "" {
-            s.T["shareopenid"] = shareopenid
-        }
-        myopenid, _ := sess["s_m_openid"].(string)
-        if myopenid == "" {
-            myopenid = shareopenid
-            s.T["openid"] = myopenid //"-1"
-        } else {
-            s.T["openid"] = se.EncodeString(myopenid) //"-1"
-        }
-        //mynickname, _ := s.GetSession("s_nickname").(string)
-        //myavatar, _ := s.GetSession("s_avatar").(string)
-        mynickname := util.ObjToString(sess["s_nickname"])
-        myavatar := util.ObjToString(sess["s_avatar"])
-        s.T["nickname"] = mynickname
-        s.T["avatar"] = myavatar
-        s.T["signature"] = wx.SignJSSDK(s.Site() + s.Url())
-        obj := wxvisitD(sid, userId, myopenid, stype, (isVip && isOldVip) || isMember || isEntniche || newCanRead)
-        canRead := false
-        if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
-            ((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
-            stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
-            canRead = true
-        } else {
-            canRead = SeeDetailLimit(obj, userId, sid)
-        }
-        if newCanRead {
-            canRead = newCanRead
-            s.T["canRead"] = canRead
-        }
-        if len(obj) > 0 {
-            if canRead {
-                FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, true)
-                //免费用户正文手机号替换
-                if obj["site"] == "剑鱼信息发布平台" && !isMember {
-                    //采购电话中标单位电话置空
-                    if util.InterfaceToStr(obj["buyertel"]) != "" {
-                        obj["buyertel"] = "freeView"
-                    }
-                    if util.InterfaceToStr(obj["winnertel"]) != "" {
-                        obj["winnertel"] = "freeView"
-                    }
-                    //正文电话 手机号 邮箱处理
-                    if detail, _ := obj["detail"].(string); detail != "" {
-                        //手机号
-                        re1 := regexp.MustCompile("1[345789]{1}\\d{9}")
-                        detail1 := re1.ReplaceAllString(detail, `<span class="freeView">点击查看</span>`)
-                        code := util.InterfaceToStr(obj["projectcode"])
-                        if code != "" {
-                            detail1 = strings.ReplaceAll(detail1, code, "*********")
-                        }
-                        //座机
-                        re2 := regexp.MustCompile("((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?")
-                        detail2 := re2.ReplaceAllString(detail1, `<span class="freeView">点击查看</span>`)
-                        re4 := regexp.MustCompile("((400)-)(\\d{3,4}-)(\\d{3,})")
-                        detail4 := re4.ReplaceAllString(detail2, `<span class="freeView">点击查看</span>`)
-                        //邮箱
-                        re3 := regexp.MustCompile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)")
-                        detail3 := re3.ReplaceAllString(detail4, `<span class="freeView">点击查看</span>`)
-                        obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
-                    }
-                }
-                if obj["entidlist"] != nil { //大会员中标企业跳转至画像
-                    s_winner := util.ObjToString(obj["s_winner"])
-                    idObjs, _ := obj["entidlist"].([]interface{})
-                    winnerIdArr := []string{}
-                    for _, v := range strings.Split(s_winner, ",") {
-                        if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
-                            continue
-                        }
-                        winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
-                        obj["entIds"] = winnerIdArr
-                    }
-                }
-                if !canRead { //登录拟建&采购不展示遮罩 只打码
-                    //canRead = true
-                    //打码显示引导
-                    otherFilter(obj, userId != "")
-                }
-                s.T["advertcode"] = s.GetString("advertcode")
-            } else {
-                obj = map[string]interface{}{
-                    "title":        obj["title"],
-                    "_id":          obj["_id"],
-                    "subtype":      obj["subtype"],
-                    "originalShow": false,
-                }
-            }
-            //纠错随机回复
-            recoveryRight, _ := config.Sysconfig["recoveryRight"].([]interface{})
-            recVal := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(recoveryRight))
-            s.T["recVal"] = util.ObjToString(recoveryRight[recVal])
-            s.T["advertImg"] = config.Sysconfig["advertImg"]
-            s.T["advertName"] = config.Sysconfig["advertName"]
-            s.T["advertUrl"] = config.Sysconfig["advertUrl"]
-            s.T["canRead"] = canRead
-            obj["industry"] = industry
-            obj["keywords"] = KeyWordHandle(obj)
-            obj["description"] = DescriptionHandle(stype, obj)
-            s.T["obj"] = obj
-            //获取打赏文案
-            s.T["rewardText"], s.T["advertText"] = getRewardText()
-            content, _ := s.Render4Cache("/weixin/wxinfocontent_rec.html", &s.T)
-            return s.SetBody(content)
-        }
-        if surl != "" {
-            return s.Redirect(surl)
-        }
-    } else {
-        sids := encrypt.CommonDecodeArticle(stype, id)
-        if len(sids) == 0 || (len(sids) > 0 && sids[0] == "") {
-            s.Redirect("/notin/page", 302)
-            return nil
-        }
-        sid := sids[0]
-        //免费用户浏览三级页判断留资与浏览次数
-        //indust := s.GetString("industry")
-        if userId != "" && stype == "indexcontent" { //已登录用户直接跳转至正常三级页
-            return s.Redirect(fmt.Sprintf("/article/content/%s.html", encrypt.CommonEncodeArticle("content", sid)))
-        }
-        if stype == "advancedProject" {
-            //判断此用户是否有打开的权限
-            //newUserId := s.GetSession("base_user_id")
-            newUserId := sess["base_user_id"]
-            pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
-            //访问次数加1
-            if pushData == nil {
-                newCanRead = false
-            } else {
-                public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
-                newCanRead = true
-            }
-        }
-        var detailKey = func() string {
-            if (isVip && isOldVip) || isMember || isEntniche || newCanRead || stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" {
-                return "pay" //可以看全部
-            } else if isVip && !isOldVip {
-                return "new_vip_pay" //新版超级订阅不能看 采购意向
-            } else if SeeDetailLimit(nil, userId, sid) {
-                return "saleLeads_free" //未留资 三篇非采购意向信息;留资后同pay
-            } else {
-                return "free" //已经免费查看三篇招标信息,且未留资。任何信息都不能看 有遮罩
-            }
-        }()
-        catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", detailKey, stype, sid)
-        if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
-            redisTimeOut := util.If((isVip && isOldVip) || isMember || isEntniche || newCanRead, detailRedisByPayTimeOut, detailRedisByFreeTimeOut).(int)
-            industry := s.GetString("industry")
-            var shareid = s.GetString("id")
-            if len(shareid) == 0 {
-                shareid = "10"
-            }
-            s.T["logid"] = config.Seoconfig["jysskzy"].(string)
-            s.T["shareid"] = se.EncodeString(shareid)
-            s.T["keywords"] = s.GetString("kds")
-            s.DisableHttpCache()
-            po, bo, wo, obj := pcVRT(sid, industry, stype, isVip || isMember || isEntniche || newCanRead, true)
-            if obj != nil && len(obj) > 0 {
-                var node bool
-                if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理 白名单
-                    ((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
-                    stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
-                    node = true
-                } else {
-                    //_, _, _, objc := pcVRT(sid, indust, stype, isVip || isMember || isEntniche)
-                    node = SeeDetailLimit(obj, userId, sid)
-                }
+		if stype == "advancedProject" {
+			//判断此用户是否有打开的权限
+			//newUserId := s.GetSession("base_user_id")
+			newUserId := sess["base_user_id"]
+			pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
+			//访问次数加1
+			if pushData == nil {
+				newCanRead = false
+			} else {
+				public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
+				newCanRead = true
+			}
+		}
+		s.T["keywords"] = kds
+		if shareopenid != "" {
+			s.T["shareopenid"] = shareopenid
+		}
+		myopenid, _ := sess["s_m_openid"].(string)
+		if myopenid == "" {
+			myopenid = shareopenid
+			s.T["openid"] = myopenid //"-1"
+		} else {
+			s.T["openid"] = se.EncodeString(myopenid) //"-1"
+		}
+		//mynickname, _ := s.GetSession("s_nickname").(string)
+		//myavatar, _ := s.GetSession("s_avatar").(string)
+		mynickname := util.ObjToString(sess["s_nickname"])
+		myavatar := util.ObjToString(sess["s_avatar"])
+		s.T["nickname"] = mynickname
+		s.T["avatar"] = myavatar
+		s.T["signature"] = wx.SignJSSDK(s.Site() + s.Url())
+		obj := wxvisitD(sid, userId, myopenid, stype, (isVip && isOldVip) || isMember || isEntniche || newCanRead)
+		canRead := false
+		if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理
+			((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
+			stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
+			canRead = true
+		} else {
+			canRead = SeeDetailLimit(obj, userId, sid)
+		}
+		if newCanRead {
+			canRead = newCanRead
+			s.T["canRead"] = canRead
+		}
+		if len(obj) > 0 {
+			if canRead {
+				FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, true)
+				//免费用户正文手机号替换
+				if obj["site"] == "剑鱼信息发布平台" && !isMember {
+					//采购电话中标单位电话置空
+					if util.InterfaceToStr(obj["buyertel"]) != "" {
+						obj["buyertel"] = "freeView"
+					}
+					if util.InterfaceToStr(obj["winnertel"]) != "" {
+						obj["winnertel"] = "freeView"
+					}
+					//正文电话 手机号 邮箱处理
+					if detail, _ := obj["detail"].(string); detail != "" {
+						//手机号
+						re1 := regexp.MustCompile("1[345789]{1}\\d{9}")
+						detail1 := re1.ReplaceAllString(detail, `<span class="freeView">点击查看</span>`)
+						code := util.InterfaceToStr(obj["projectcode"])
+						if code != "" {
+							detail1 = strings.ReplaceAll(detail1, code, "*********")
+						}
+						//座机
+						re2 := regexp.MustCompile("((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?")
+						detail2 := re2.ReplaceAllString(detail1, `<span class="freeView">点击查看</span>`)
+						re4 := regexp.MustCompile("((400)-)(\\d{3,4}-)(\\d{3,})")
+						detail4 := re4.ReplaceAllString(detail2, `<span class="freeView">点击查看</span>`)
+						//邮箱
+						re3 := regexp.MustCompile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)")
+						detail3 := re3.ReplaceAllString(detail4, `<span class="freeView">点击查看</span>`)
+						obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
+					}
+				}
+				if obj["entidlist"] != nil { //大会员中标企业跳转至画像
+					s_winner := util.ObjToString(obj["s_winner"])
+					idObjs, _ := obj["entidlist"].([]interface{})
+					winnerIdArr := []string{}
+					for _, v := range strings.Split(s_winner, ",") {
+						if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
+							continue
+						}
+						winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
+						obj["entIds"] = winnerIdArr
+					}
+				}
+				if !canRead { //登录拟建&采购不展示遮罩 只打码
+					//canRead = true
+					//打码显示引导
+					otherFilter(obj, userId != "")
+				}
+				s.T["advertcode"] = s.GetString("advertcode")
+			} else {
+				obj = map[string]interface{}{
+					"title":        obj["title"],
+					"_id":          obj["_id"],
+					"subtype":      obj["subtype"],
+					"originalShow": false,
+				}
+			}
+			//纠错随机回复
+			recoveryRight, _ := config.Sysconfig["recoveryRight"].([]interface{})
+			recVal := rand.New(rand.NewSource(time.Now().UnixNano())).Intn(len(recoveryRight))
+			s.T["recVal"] = util.ObjToString(recoveryRight[recVal])
+			s.T["advertImg"] = config.Sysconfig["advertImg"]
+			s.T["advertName"] = config.Sysconfig["advertName"]
+			s.T["advertUrl"] = config.Sysconfig["advertUrl"]
+			s.T["canRead"] = canRead
+			obj["industry"] = industry
+			obj["keywords"] = KeyWordHandle(obj)
+			obj["description"] = DescriptionHandle(stype, obj)
+			s.T["obj"] = obj
+			//获取打赏文案
+			s.T["rewardText"], s.T["advertText"] = getRewardText()
+			content, _ := s.Render4Cache("/weixin/wxinfocontent_rec.html", &s.T)
+			return s.SetBody(content)
+		}
+		if surl != "" {
+			return s.Redirect(surl)
+		}
+	} else {
+		sids := encrypt.CommonDecodeArticle(stype, id)
+		if len(sids) == 0 || (len(sids) > 0 && sids[0] == "") {
+			s.Redirect("/notin/page", 302)
+			return nil
+		}
+		sid := sids[0]
+		//免费用户浏览三级页判断留资与浏览次数
+		//indust := s.GetString("industry")
+		if userId != "" && stype == "indexcontent" { //已登录用户直接跳转至正常三级页
+			return s.Redirect(fmt.Sprintf("/article/content/%s.html", encrypt.CommonEncodeArticle("content", sid)))
+		}
+		if stype == "advancedProject" {
+			//判断此用户是否有打开的权限
+			//newUserId := s.GetSession("base_user_id")
+			newUserId := sess["base_user_id"]
+			pushData := public.BaseMysql.FindOne("leadproject_push", map[string]interface{}{"user_id": newUserId, "info_id": sid}, "id", "")
+			//访问次数加1
+			if pushData == nil {
+				newCanRead = false
+			} else {
+				public.BaseMysql.UpdateOrDeleteBySql("UPDATE leadproject_push SET  visit_count=visit_count+1 ,lastvisit_time=? WHERE id = ?", time.Now().Format("2006-01-02 15:04:05"), (*pushData)["id"])
+				newCanRead = true
+			}
+		}
+		var detailKey = func() string {
+			if (isVip && isOldVip) || isMember || isEntniche || newCanRead || stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" {
+				return "pay" //可以看全部
+			} else if isVip && !isOldVip {
+				return "new_vip_pay" //新版超级订阅不能看 采购意向
+			} else if SeeDetailLimit(nil, userId, sid) {
+				return "saleLeads_free" //未留资 三篇非采购意向信息;留资后同pay
+			} else {
+				return "free" //已经免费查看三篇招标信息,且未留资。任何信息都不能看 有遮罩
+			}
+		}()
+		catchKey := fmt.Sprintf("jypcdetail_%s_%s_%s", detailKey, stype, sid)
+		if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
+			redisTimeOut := util.If((isVip && isOldVip) || isMember || isEntniche || newCanRead, detailRedisByPayTimeOut, detailRedisByFreeTimeOut).(int)
+			industry := s.GetString("industry")
+			var shareid = s.GetString("id")
+			if len(shareid) == 0 {
+				shareid = "10"
+			}
+			s.T["logid"] = config.Seoconfig["jysskzy"].(string)
+			s.T["shareid"] = se.EncodeString(shareid)
+			s.T["keywords"] = s.GetString("kds")
+			s.DisableHttpCache()
+			po, bo, wo, obj := pcVRT(sid, industry, stype, isVip || isMember || isEntniche || newCanRead, true)
+			if obj != nil && len(obj) > 0 {
+				var node bool
+				if ((isVip && isOldVip) || isMember || isEntniche) || //老版本vip、大会员、商机管理 白名单
+					((isVip && !isOldVip) && (!(util.ObjToString(obj["subtype"]) == "拟建" || util.ObjToString(obj["subtype"]) == "采购意向"))) || //新超级订阅非采购意向”和“拟建项目”
+					stype == "mailprivate" || stype == "indexcontent" || stype == "bdprivate" { //邮箱推送
+					node = true
+				} else {
+					//_, _, _, objc := pcVRT(sid, indust, stype, isVip || isMember || isEntniche)
+					node = SeeDetailLimit(obj, userId, sid)
+				}
 
-                if obj["publishtime"] != nil {
-                    obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
-                }
-                s.T["canRead"] = node
-                if newCanRead {
-                    s.T["canRead"] = newCanRead
-                    node = newCanRead
-                }
-                if node {
-                    if len(po) > 0 {
-                        s.T["projectOther"] = po
-                    }
-                    if len(bo) > 0 {
-                        s.T["buyerOther"] = bo
-                    }
-                    if len(wo) > 0 {
-                        s.T["winnerOther"] = wo
-                    }
-                    //判断时间 //如果是seo页面超过时间访问的进入首页
-                    comeinTime := time.Unix(util.Int64All(obj["comeintime"]), 0)
-                    if stype == "indexcontent" {
-                        if count := public.MQFW.Count("seobidding", map[string]interface{}{"bid": sid}); count <= 0 && comeinTime.Before(time.Now().Add(time.Duration(-util.IntAll(config.Sysconfig["seoBeforeTimeHour"]))*time.Hour)) {
-                            return s.Redirect("/")
-                        }
-                    }
-                    FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, false)
-                    //免费用户正文手机号替换
-                    if obj["site"] == "剑鱼信息发布平台" && !isMember {
-                        //采购电话中标单位电话置空
-                        if util.InterfaceToStr(obj["buyertel"]) != "" {
-                            obj["buyertel"] = "freeView"
-                        }
-                        if util.InterfaceToStr(obj["winnertel"]) != "" {
-                            obj["winnertel"] = "freeView"
-                        }
-                        //正文电话 手机号 邮箱处理
-                        if detail, _ := obj["detail"].(string); detail != "" {
-                            //手机号
-                            re1 := regexp.MustCompile("1[345789]{1}\\d{9}")
-                            detail1 := re1.ReplaceAllString(detail, `<span class="freeView">点击查看</span>`)
-                            code := util.InterfaceToStr(obj["projectcode"])
-                            if code != "" {
-                                detail1 = strings.ReplaceAll(detail1, code, "*********")
-                            }
-                            //座机
-                            re2 := regexp.MustCompile("((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?")
-                            detail2 := re2.ReplaceAllString(detail1, `<span class="freeView">点击查看</span>`)
-                            re4 := regexp.MustCompile("((400)-)(\\d{3,4}-)(\\d{3,})")
-                            detail4 := re4.ReplaceAllString(detail2, `<span class="freeView">点击查看</span>`)
-                            //邮箱
-                            re3 := regexp.MustCompile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)")
-                            detail3 := re3.ReplaceAllString(detail4, `<span class="freeView">点击查看</span>`)
-                            obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
-                        }
-                    }
-                    if obj["projectname"] != nil {
-                        s.SetSession("projectname", obj["projectname"])
-                    }
+				if obj["publishtime"] != nil {
+					obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
+				}
+				s.T["canRead"] = node
+				if newCanRead {
+					s.T["canRead"] = newCanRead
+					node = newCanRead
+				}
+				if node {
+					if len(po) > 0 {
+						s.T["projectOther"] = po
+					}
+					if len(bo) > 0 {
+						s.T["buyerOther"] = bo
+					}
+					if len(wo) > 0 {
+						s.T["winnerOther"] = wo
+					}
+					//判断时间 //如果是seo页面超过时间访问的进入首页
+					comeinTime := time.Unix(util.Int64All(obj["comeintime"]), 0)
+					if stype == "indexcontent" {
+						if count := public.MQFW.Count("seobidding", map[string]interface{}{"bid": sid}); count <= 0 && comeinTime.Before(time.Now().Add(time.Duration(-util.IntAll(config.Sysconfig["seoBeforeTimeHour"]))*time.Hour)) {
+							return s.Redirect("/")
+						}
+					}
+					FieldProcessing(obj, ssOpenid, industry, id, from_userid, userId, stype, false)
+					//免费用户正文手机号替换
+					if obj["site"] == "剑鱼信息发布平台" && !isMember {
+						//采购电话中标单位电话置空
+						if util.InterfaceToStr(obj["buyertel"]) != "" {
+							obj["buyertel"] = "freeView"
+						}
+						if util.InterfaceToStr(obj["winnertel"]) != "" {
+							obj["winnertel"] = "freeView"
+						}
+						//正文电话 手机号 邮箱处理
+						if detail, _ := obj["detail"].(string); detail != "" {
+							//手机号
+							re1 := regexp.MustCompile("1[345789]{1}\\d{9}")
+							detail1 := re1.ReplaceAllString(detail, `<span class="freeView">点击查看</span>`)
+							code := util.InterfaceToStr(obj["projectcode"])
+							if code != "" {
+								detail1 = strings.ReplaceAll(detail1, code, "*********")
+							}
+							//座机
+							re2 := regexp.MustCompile("((0\\d{2,3})-)(\\d{7,8})(-(\\d{3,}))?")
+							detail2 := re2.ReplaceAllString(detail1, `<span class="freeView">点击查看</span>`)
+							re4 := regexp.MustCompile("((400)-)(\\d{3,4}-)(\\d{3,})")
+							detail4 := re4.ReplaceAllString(detail2, `<span class="freeView">点击查看</span>`)
+							//邮箱
+							re3 := regexp.MustCompile("([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)")
+							detail3 := re3.ReplaceAllString(detail4, `<span class="freeView">点击查看</span>`)
+							obj["detail"] = strings.ReplaceAll(strings.ReplaceAll(detail3, `<span class="freeView">点击查看</span><span class="freeView">点击查看</span>`, `<span class="freeView">点击查看</span>`), "*********", code)
+						}
+					}
+					if obj["projectname"] != nil {
+						s.SetSession("projectname", obj["projectname"])
+					}
 
-                    if obj["entidlist"] != nil { //大会员中标企业跳转至画像
-                        s_winner := util.ObjToString(obj["s_winner"])
-                        idObjs, _ := obj["entidlist"].([]interface{})
-                        winnerIdArr := []string{}
-                        for _, v := range strings.Split(s_winner, ",") {
-                            if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
-                                continue
-                            }
-                            winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
-                            obj["entIds"] = winnerIdArr
-                        }
-                    }
-                    if !node {
-                        //打码遮罩
-                        //s.T["canRead"] = true
-                        otherFilter(obj, userId != "")
-                    }
-                } else {
-                    obj = map[string]interface{}{
-                        "title":        obj["title"],
-                        "_id":          obj["_id"],
-                        "subtype":      obj["subtype"],
-                        "stypeadd":     obj["stypeadd"],
-                        "originalShow": false,
-                    }
-                }
+					if obj["entidlist"] != nil { //大会员中标企业跳转至画像
+						s_winner := util.ObjToString(obj["s_winner"])
+						idObjs, _ := obj["entidlist"].([]interface{})
+						winnerIdArr := []string{}
+						for _, v := range strings.Split(s_winner, ",") {
+							if v == "-" || !isInStringArr(util.ObjArrToStringArr(idObjs), v) {
+								continue
+							}
+							winnerIdArr = append(winnerIdArr, encrypt.EncodeArticleId2ByCheck(v))
+							obj["entIds"] = winnerIdArr
+						}
+					}
+					if !node {
+						//打码遮罩
+						//s.T["canRead"] = true
+						otherFilter(obj, userId != "")
+					}
+				} else {
+					obj = map[string]interface{}{
+						"title":        obj["title"],
+						"_id":          obj["_id"],
+						"subtype":      obj["subtype"],
+						"stypeadd":     obj["stypeadd"],
+						"originalShow": false,
+					}
+				}
 
-                obj["urlpath"] = s.Uri()
-                obj["industry"] = industry
-                if ssOpenid != nil {
-                    obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
-                }
-                obj["keywords"] = KeyWordHandle(obj)
-                obj["description"] = DescriptionHandle(stype, obj)
-                s.T["obj"] = obj
-                s.T["url"] = s.Uri()
+				obj["urlpath"] = s.Uri()
+				obj["industry"] = industry
+				if ssOpenid != nil {
+					obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
+				}
+				obj["keywords"] = KeyWordHandle(obj)
+				obj["description"] = DescriptionHandle(stype, obj)
+				s.T["obj"] = obj
+				s.T["url"] = s.Uri()
 
-                content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
-                redis.Put(redisLimitation, catchKey, string(content), redisTimeOut)
-                return s.SetBody(content)
-                //return s.Render("/pc/biddetail_rec.html", &s.T)
-            }
-        } else {
-            return s.SetBody([]byte(res.(string)))
-        }
-    }
-    return nil
+				content, _ := s.Render4Cache("/pc/biddetail_rec.html", &s.T)
+				redis.Put(redisLimitation, catchKey, string(content), redisTimeOut)
+				return s.SetBody(content)
+				//return s.Render("/pc/biddetail_rec.html", &s.T)
+			}
+		} else {
+			return s.SetBody([]byte(res.(string)))
+		}
+	}
+	return nil
 }
 
 func CNode(userId string) bool {
-    if hasRetainedCapital(userId, []string{"jyarticle_see3_plus", "pc_article_member_freeuse", "app_article_member_freeuse", "app_article_member_freeuse", "wx_article_member_freeuse", "h5_article_member_freeuse"}) {
-        return true
-    }
-    rM := map[string]interface{}{}
-    rdata, ok := mongodb.Find("saleLeads", map[string]interface{}{
-        "userid": userId,
-    }, `{"createtime":-1}`, nil, false, 0, 10)
-    if rdata != nil && len(*rdata) > 0 && ok {
-        for _, v := range *rdata {
-            for kk, vv := range v {
-                if vv == nil {
-                    continue
-                }
-                if rM[kk] != nil {
-                    continue
-                }
-                rM[kk] = vv
-            }
-        }
-        delete(rM, "_id")
-        delete(rM, "userid")
-        delete(rM, "createtime")
-        delete(rM, "client")
-    }
-    if userinfo := jyutil.Compatible.Select(userId, `{"s_phone":1,"s_m_phone":1,"s_myemail":1,"s_company":1,"o_jy":1,"o_vipjy":1}`); userinfo != nil && len(*userinfo) > 0 {
-        s_phone := util.ObjToString((*userinfo)["s_phone"])
-        phone := util.If(s_phone == "", util.ObjToString((*userinfo)["s_m_phone"]), s_phone)
-        if rM["phone"] == nil || rM["phone"] == "" {
-            rM["phone"] = phone
-        }
-        if rM["company"] == nil || rM["company"] == "" {
-            rM["company"] = util.ObjToString((*userinfo)["s_company"])
-        }
-    }
-    if rM["name"] != nil && rM["name"] != "" && rM["phone"] != nil && rM["phone"] != "" && rM["company"] != nil && rM["company"] != "" && rM["position"] != nil && rM["position"] != "" && rM["companyType"] != "" {
+	if hasRetainedCapital(userId, []string{"jyarticle_see3_plus", "pc_article_member_freeuse", "app_article_member_freeuse", "app_article_member_freeuse", "wx_article_member_freeuse", "h5_article_member_freeuse"}) {
+		return true
+	}
+	rM := map[string]interface{}{}
+	rdata, ok := mongodb.Find("saleLeads", map[string]interface{}{
+		"userid": userId,
+	}, `{"createtime":-1}`, nil, false, 0, 10)
+	if rdata != nil && len(*rdata) > 0 && ok {
+		for _, v := range *rdata {
+			for kk, vv := range v {
+				if vv == nil {
+					continue
+				}
+				if rM[kk] != nil {
+					continue
+				}
+				rM[kk] = vv
+			}
+		}
+		delete(rM, "_id")
+		delete(rM, "userid")
+		delete(rM, "createtime")
+		delete(rM, "client")
+	}
+	if userinfo := jyutil.Compatible.Select(userId, `{"s_phone":1,"s_m_phone":1,"s_myemail":1,"s_company":1,"o_jy":1,"o_vipjy":1}`); userinfo != nil && len(*userinfo) > 0 {
+		s_phone := util.ObjToString((*userinfo)["s_phone"])
+		phone := util.If(s_phone == "", util.ObjToString((*userinfo)["s_m_phone"]), s_phone)
+		if rM["phone"] == nil || rM["phone"] == "" {
+			rM["phone"] = phone
+		}
+		if rM["company"] == nil || rM["company"] == "" {
+			rM["company"] = util.ObjToString((*userinfo)["s_company"])
+		}
+	}
+	if rM["name"] != nil && rM["name"] != "" && rM["phone"] != nil && rM["phone"] != "" && rM["company"] != nil && rM["company"] != "" && rM["position"] != nil && rM["position"] != "" && rM["companyType"] != "" {
 
-        if rM["position"] != "总裁" && rM["position"] != "总经理" && (rM["branch"] == nil || rM["branch"] == "") {
-            return false
-        }
-        return true
+		if rM["position"] != "总裁" && rM["position"] != "总经理" && (rM["branch"] == nil || rM["branch"] == "") {
+			return false
+		}
+		return true
 
-    }
-    return false
+	}
+	return false
 }
 
 // 查看公告详情次数限制
 func SeeDetailLimit(obj map[string]interface{}, userId, sid string) bool {
-    watchKey := fmt.Sprintf("article_count_%d_%s_%d_%s", time.Now().Year(), time.Now().Month(), time.Now().Day(), userId)
-    subTypeStr, _ := obj["subtype"].(string)
-    if strings.Contains(subTypeStr, "拟建") || strings.Contains(subTypeStr, "采购意向") {
-        return false
-    } else {
-        //检验是否留资
-        if CNode(userId) {
-            return true
-        }
+	watchKey := fmt.Sprintf("article_count_%d_%s_%d_%s", time.Now().Year(), time.Now().Month(), time.Now().Day(), userId)
+	subTypeStr, _ := obj["subtype"].(string)
+	if strings.Contains(subTypeStr, "拟建") || strings.Contains(subTypeStr, "采购意向") {
+		return false
+	} else {
+		//检验是否留资
+		if CNode(userId) {
+			return true
+		}
 
-        if seeRes := redis.Get(redisLimitation, watchKey); seeRes != nil && seeRes != "" {
-            if resVal, _ := seeRes.(string); resVal != "" {
-                sidss := strings.Split(resVal, "_")
-                canRead := config.Sysconfig["canReadNotice"]
-                if len(sidss) < util.IntAll(canRead) {
-                    sidss = append(sidss, sid)
-                    arrs := RemoveDuplicatesAndEmpty(sidss)
-                    newVal := strings.Join(arrs, "_")
-                    redis.Put(redisLimitation, watchKey, newVal, jy.GetExpire())
-                    return true
-                } else {
-                    for _, v := range sidss {
-                        if sid == v {
-                            return true
-                        }
-                    }
-                    return false
-                }
-            }
-        } else {
-            redis.Put(redisLimitation, watchKey, sid, jy.GetExpire())
-            return true
-        }
-    }
-    return false
+		if seeRes := redis.Get(redisLimitation, watchKey); seeRes != nil && seeRes != "" {
+			if resVal, _ := seeRes.(string); resVal != "" {
+				sidss := strings.Split(resVal, "_")
+				canRead := config.Sysconfig["canReadNotice"]
+				if len(sidss) < util.IntAll(canRead) {
+					sidss = append(sidss, sid)
+					arrs := RemoveDuplicatesAndEmpty(sidss)
+					newVal := strings.Join(arrs, "_")
+					redis.Put(redisLimitation, watchKey, newVal, jy.GetExpire())
+					return true
+				} else {
+					for _, v := range sidss {
+						if sid == v {
+							return true
+						}
+					}
+					return false
+				}
+			}
+		} else {
+			redis.Put(redisLimitation, watchKey, sid, jy.GetExpire())
+			return true
+		}
+	}
+	return false
 }
 
 func SwiDef(sid_openid []string) (string, string) {
-    var shareopenid, sid string
-    if len(sid_openid) > 1 {
-        sid = sid_openid[0]
-        shareopenid = sid_openid[1]
-    } else {
-        sid = sid_openid[0]
-    }
-    return shareopenid, sid
+	var shareopenid, sid string
+	if len(sid_openid) > 1 {
+		sid = sid_openid[0]
+		shareopenid = sid_openid[1]
+	} else {
+		sid = sid_openid[0]
+	}
+	return shareopenid, sid
 }
 
 // user 权限获取
 func UserPermission(userId string, ssOpenid interface{}) (bool, bool, bool) {
-    var (
-        res                                      *map[string]interface{}
-        isVip, isMember, isEntniche, privatedata bool
-    )
-    if userId == "" && ssOpenid != nil {
-        res, _ = mongodb.FindOneByField("user", bson.M{"s_m_openid": ssOpenid, "s_unionid": bson.M{"$ne": ssOpenid}}, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1}`)
-        userId = mg.BsonIdToSId((*res)["_id"])
-    } else {
-        //判断用户是否是vip
-        res = jyutil.Compatible.Select(userId, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1}`)
-    }
+	var (
+		res                                      *map[string]interface{}
+		isVip, isMember, isEntniche, privatedata bool
+	)
+	if userId == "" && ssOpenid != nil {
+		res, _ = mongodb.FindOneByField("user", bson.M{"s_m_openid": ssOpenid, "s_unionid": bson.M{"$ne": ssOpenid}}, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1}`)
+		userId = mg.BsonIdToSId((*res)["_id"])
+	} else {
+		//判断用户是否是vip
+		res = jyutil.Compatible.Select(userId, `{"i_vip_status":1,"i_member_status":1,"s_m_phone":1,"s_phone":1}`)
+	}
 
-    isVip = util.IntAll((*res)["i_vip_status"]) == 1 || util.IntAll((*res)["i_vip_status"]) == 2
-    isMember = util.IntAll((*res)["i_member_status"]) > 0
+	isVip = util.IntAll((*res)["i_vip_status"]) == 1 || util.IntAll((*res)["i_vip_status"]) == 2
+	isMember = util.IntAll((*res)["i_member_status"]) > 0
 
-    if phone, _ := util.If(util.ObjToString((*res)["s_phone"]) != "", util.ObjToString((*res)["s_phone"]), util.ObjToString((*res)["s_m_phone"])).(string); phone != "" {
-        isEntniche = public.Mysql.CountBySql(`SELECT count(1) from entniche_user a INNER JOIN entniche_info b on (a.phone=? and a.power=1 and a.ent_id=b.id and b.status>0)`, phone) > 0
-        privatedata = public.Mysql.CountBySql(`select count(1) from privatedata where phone = ?`, phone) > 0
-    }
-    if !isEntniche && privatedata {
-        isEntniche = true
-    }
+	if phone, _ := util.If(util.ObjToString((*res)["s_phone"]) != "", util.ObjToString((*res)["s_phone"]), util.ObjToString((*res)["s_m_phone"])).(string); phone != "" {
+		isEntniche = public.Mysql.CountBySql(`SELECT count(1) from entniche_user a INNER JOIN entniche_info b on (a.phone=? and a.power=1 and a.ent_id=b.id and b.status>0)`, phone) > 0
+		privatedata = public.Mysql.CountBySql(`select count(1) from privatedata where phone = ?`, phone) > 0
+	}
+	if !isEntniche && privatedata {
+		isEntniche = true
+	}
 
-    return isVip, isMember, isEntniche
+	return isVip, isMember, isEntniche
 }
 
 // pc 移动共用字段处理
 func FieldProcessing(obj map[string]interface{}, ssOpenid interface{}, industry, id, from_userid, userId, stype string, b bool) {
-    obj["industry"] = industry
-    if ssOpenid != nil {
-        obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
-    }
-    //判断是否公开联系人信息
-    if util.Int64All(obj["buyerhint"]) == 2 {
-        obj["buyerperson"] = ""
-        obj["buyertel"] = ""
-    }
-    href, _ := obj["href"].(string)
-    if !b {
-        href = strings.Replace(href, "\n", "", -1)
-        if href != "" && !strings.HasPrefix(href, "http") {
-            href = "http://" + href
-        }
-        obj["url"] = href
-    }
-    //P385 查看原文
-    obj["originalShow"] = false
-    if href != "" && userId != "" {
-        obj["originalShow"] = true
-    }
-    //大会员中标企业跳转至画像
-    if obj["entidlist"] != nil {
-        if s_winner := util.ObjToString(obj["s_winner"]); s_winner != "" {
-            entIdArr, winnerMap := []string{}, map[string]interface{}{}
-            swinnerArr := strings.Split(s_winner, ",")
-            eidList, _ := obj["entidlist"].([]interface{})
-            //先查询entlist 如果长度和s_winner不一致 根据企业名称查询id
-            if len(eidList) != len(swinnerArr) {
-                for _, v := range swinnerArr {
-                    winnerMap[v] = ""
-                    //临时更改为企业名称查询企业id
-                    rData := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"bool":{"should":[{"term":{"company_name":"%s"}},{"term":{"hname":"%s"}}],"minimum_should_match":1}},"_source":["name","_id","capital","company_phone"],"size":1}`, v, v))
-                    if rData != nil && len(*rData) == 1 {
-                        if entId := util.ObjToString((*rData)[0]["_id"]); entId != "" {
-                            entIdArr = append(entIdArr, encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"])))
-                            winnerMap[v] = encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"]))
-                        }
-                    }
-                }
-            } else {
-                for k, v := range eidList {
-                    vstr := util.ObjToString(v)
-                    if vstr == "-" {
-                        continue
-                    }
-                    winnerMap[swinnerArr[k]] = encrypt.EncodeArticleId2ByCheck(vstr)
-                }
-            }
-            obj["entId"] = entIdArr
-            obj["winnerMap"] = winnerMap
-        }
-    }
-    //移动端需要处理--剑鱼币
-    if b && from_userid != "" && se.Decode4Hex(from_userid) != "" && se.Decode4Hex(from_userid) != userId && util.ObjToString(obj["subtype"]) != "拟建" { //分享开打的
-        article_id := encrypt.CommonDecodeArticle(stype, id)[0]
-        key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, from_userid, userId)
-        if redis.Incr(redisLimitation, key) == 1 {
-            redis.SetExpire(redisLimitation, key, 60*60*24)
-            err := jy.Publish(public.Mgo_Log, config.Sysconfig["nsq"].(string), config.Sysconfig["nsq_topic"].(string), jy.Jyweb_article_open, se.Decode4Hex(from_userid), jy.Jywx_node1, nil)
-            if err != nil {
-                log.Println("nsq队列写入失败-->", jy.Jyweb_article_open, se.Decode4Hex(from_userid))
-            }
-        }
-    }
+	obj["industry"] = industry
+	if ssOpenid != nil {
+		obj["ucbsId"] = encrypt.EncodeArticleId2ByCheck("ucbs#" + ssOpenid.(string) + "#" + id)
+	}
+	//判断是否公开联系人信息
+	if util.Int64All(obj["buyerhint"]) == 2 {
+		obj["buyerperson"] = ""
+		obj["buyertel"] = ""
+	}
+	href, _ := obj["href"].(string)
+	if !b {
+		href = strings.Replace(href, "\n", "", -1)
+		if href != "" && !strings.HasPrefix(href, "http") {
+			href = "http://" + href
+		}
+		obj["url"] = href
+	}
+	//P385 查看原文
+	obj["originalShow"] = false
+	if href != "" && userId != "" {
+		obj["originalShow"] = true
+	}
+	//大会员中标企业跳转至画像
+	if obj["entidlist"] != nil {
+		if s_winner := util.ObjToString(obj["s_winner"]); s_winner != "" {
+			entIdArr, winnerMap := []string{}, map[string]interface{}{}
+			swinnerArr := strings.Split(s_winner, ",")
+			eidList, _ := obj["entidlist"].([]interface{})
+			//先查询entlist 如果长度和s_winner不一致 根据企业名称查询id
+			if len(eidList) != len(swinnerArr) {
+				for _, v := range swinnerArr {
+					winnerMap[v] = ""
+					//临时更改为企业名称查询企业id
+					rData := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"bool":{"should":[{"term":{"company_name":"%s"}},{"term":{"hname":"%s"}}],"minimum_should_match":1}},"_source":["name","_id","capital","company_phone"],"size":1}`, v, v))
+					if rData != nil && len(*rData) == 1 {
+						if entId := util.ObjToString((*rData)[0]["_id"]); entId != "" {
+							entIdArr = append(entIdArr, encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"])))
+							winnerMap[v] = encrypt.EncodeArticleId2ByCheck(util.ObjToString((*rData)[0]["_id"]))
+						}
+					}
+				}
+			} else {
+				for k, v := range eidList {
+					vstr := util.ObjToString(v)
+					if vstr == "-" {
+						continue
+					}
+					winnerMap[swinnerArr[k]] = encrypt.EncodeArticleId2ByCheck(vstr)
+				}
+			}
+			obj["entId"] = entIdArr
+			obj["winnerMap"] = winnerMap
+		}
+	}
+	//移动端需要处理--剑鱼币
+	if b && from_userid != "" && se.Decode4Hex(from_userid) != "" && se.Decode4Hex(from_userid) != userId && util.ObjToString(obj["subtype"]) != "拟建" { //分享开打的
+		article_id := encrypt.CommonDecodeArticle(stype, id)[0]
+		key := fmt.Sprintf("integral_article_%s_%s_%s", article_id, from_userid, userId)
+		if redis.Incr(redisLimitation, key) == 1 {
+			redis.SetExpire(redisLimitation, key, 60*60*24)
+			err := jy.Publish(public.Mgo_Log, config.Sysconfig["nsq"].(string), config.Sysconfig["nsq_topic"].(string), jy.Jyweb_article_open, se.Decode4Hex(from_userid), jy.Jywx_node1, nil)
+			if err != nil {
+				log.Println("nsq队列写入失败-->", jy.Jyweb_article_open, se.Decode4Hex(from_userid))
+			}
+		}
+	}
 }
 
 // disWord 为空时处理
 func disWordNil(disWord, userId string) string {
-    var from_userid string
-    redisDis := redis.GetStr(redisLimitation, "DIS_"+disWord[1:])
-    if redisDis != "" {
-        suffix := disWord[len(disWord)-3:]
-        //公告三级页处理
-        if suffix == suffix_msgt {
-            effectiveTimeStr := strings.Split(redisDis, "##")[3]
-            effectiveTime, _ := strconv.ParseInt(effectiveTimeStr, 10, 64)
-            //是否计算佣金
-            if time.Now().Unix() <= effectiveTime {
-                belongUserId := strings.Split(redisDis, "##")[1]
-                //if (belongUserId != userId) {
-                public.Mysql.ExecTx("口号使用", func(tx *sql.Tx) bool {
-                    //口号是否使用过
-                    wordInfo := public.Mysql.Find("dis_word", map[string]interface{}{"userId": userId, "password": disWord}, "id", "", 0, 0)
-                    if len((*wordInfo)) == 0 {
-                        //新增口号使用
-                        start_time := time.Now().Format(DateFullLayout)
-                        termValidityInt, _ := strconv.Atoi(fmt.Sprint(config.Sysconfig["termValidity"]))
-                        stop_time := TimeProcessing(time.Now().Format(DateFullLayout), termValidityInt).Format(DateFullLayout)
-                        insert := map[string]interface{}{
-                            "password":      disWord,
-                            "userId":        userId,
-                            "belong_userid": belongUserId,
-                            "start_time":    start_time,
-                            "stop_time":     stop_time,
-                        }
-                        insert_1 := public.Mysql.InsertByTx(tx, "dis_word", insert) //口号使用表
-                        log.Println("插入口号使用表", insert_1)
-                        from_userid = se.Encode2Hex(belongUserId)
-                    }
-                    return true
-                })
-            }
-            //}
-        }
-    }
-    return from_userid
+	var from_userid string
+	redisDis := redis.GetStr(redisLimitation, "DIS_"+disWord[1:])
+	if redisDis != "" {
+		suffix := disWord[len(disWord)-3:]
+		//公告三级页处理
+		if suffix == suffix_msgt {
+			effectiveTimeStr := strings.Split(redisDis, "##")[3]
+			effectiveTime, _ := strconv.ParseInt(effectiveTimeStr, 10, 64)
+			//是否计算佣金
+			if time.Now().Unix() <= effectiveTime {
+				belongUserId := strings.Split(redisDis, "##")[1]
+				//if (belongUserId != userId) {
+				public.Mysql.ExecTx("口号使用", func(tx *sql.Tx) bool {
+					//口号是否使用过
+					wordInfo := public.Mysql.Find("dis_word", map[string]interface{}{"userId": userId, "password": disWord}, "id", "", 0, 0)
+					if len((*wordInfo)) == 0 {
+						//新增口号使用
+						start_time := time.Now().Format(DateFullLayout)
+						termValidityInt, _ := strconv.Atoi(fmt.Sprint(config.Sysconfig["termValidity"]))
+						stop_time := TimeProcessing(time.Now().Format(DateFullLayout), termValidityInt).Format(DateFullLayout)
+						insert := map[string]interface{}{
+							"password":      disWord,
+							"userId":        userId,
+							"belong_userid": belongUserId,
+							"start_time":    start_time,
+							"stop_time":     stop_time,
+						}
+						insert_1 := public.Mysql.InsertByTx(tx, "dis_word", insert) //口号使用表
+						log.Println("插入口号使用表", insert_1)
+						from_userid = se.Encode2Hex(belongUserId)
+					}
+					return true
+				})
+			}
+			//}
+		}
+	}
+	return from_userid
 }
 
 // 检查用户是否关注
 func CheckUserIsSubscribe(openid string) bool {
-    user, ok := mongodb.FindOneByField("user", map[string]interface{}{
-        "i_appid":    2,
-        "s_m_openid": openid,
-        "s_unionid":  map[string]interface{}{"$ne": openid},
-    }, `{"i_ispush":1}`)
-    if ok && user != nil {
-        if (*user)["_id"] == nil || util.IntAllDef((*user)["i_ispush"], 1) == 0 {
-            return false
-        } else {
-            return true
-        }
-    }
-    return false
+	user, ok := mongodb.FindOneByField("user", map[string]interface{}{
+		"i_appid":    2,
+		"s_m_openid": openid,
+		"s_unionid":  map[string]interface{}{"$ne": openid},
+	}, `{"i_ispush":1}`)
+	if ok && user != nil {
+		if (*user)["_id"] == nil || util.IntAllDef((*user)["i_ispush"], 1) == 0 {
+			return false
+		} else {
+			return true
+		}
+	}
+	return false
 }
 
 func (s *Short) Qr(t, id string) error {
-    w := s.ResponseWriter
-    w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
-    w.Header().Set("Pragma", "no-cache")
-    w.Header().Set("Expires", "0")
-    w.Header().Set("Content-Type", "image/png")
-    kds := s.GetString("kds")
-    industry := s.GetString("industry")
-    param := "?scan_source=pc"
-    if t == "force" {
-        param += "&ispcforceshare=1"
-    }
-    if kds != "" {
-        param += "&keywords=" + kds
-    }
-    if industry != "" {
-        param += "&industry=" + industry
-    }
-    data := config.Sysconfig["webdomain"].(string) + "/article/content/" + id + ".html" + param
-    r, _ := qr.Encode(data, qr.M)
-    pngdat := r.PNG()
-    _, err := w.Write(pngdat)
-    return err
+	w := s.ResponseWriter
+	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
+	w.Header().Set("Pragma", "no-cache")
+	w.Header().Set("Expires", "0")
+	w.Header().Set("Content-Type", "image/png")
+	kds := s.GetString("kds")
+	industry := s.GetString("industry")
+	param := "?scan_source=pc"
+	if t == "force" {
+		param += "&ispcforceshare=1"
+	}
+	if kds != "" {
+		param += "&keywords=" + kds
+	}
+	if industry != "" {
+		param += "&industry=" + industry
+	}
+	data := config.Sysconfig["webdomain"].(string) + "/article/content/" + id + ".html" + param
+	r, _ := qr.Encode(data, qr.M)
+	pngdat := r.PNG()
+	_, err := w.Write(pngdat)
+	return err
 }
 
 func (s *Short) Replication() {
-    userId, OK := s.GetSession("userId").(string)
-    if OK && userId != "" {
-        mongodb.Save("copyaction", map[string]interface{}{
-            "userid":     userId,
-            "createtime": time.Now().Unix(),
-            "url":        s.Request.Referer(),
-            "client":     s.Header("User-Agent"),
-        })
-    }
+	userId, OK := s.GetSession("userId").(string)
+	if OK && userId != "" {
+		mongodb.Save("copyaction", map[string]interface{}{
+			"userid":     userId,
+			"createtime": time.Now().Unix(),
+			"url":        s.Request.Referer(),
+			"client":     s.Header("User-Agent"),
+		})
+	}
 }
 
 func isbid(typ interface{}) bool {
-    if typ != nil {
-        subtype := util.ObjToString(typ)
-        if subtype == "中标" || subtype == "合同" || subtype == "成交" {
-            return true
-        }
-    }
-    return false
+	if typ != nil {
+		subtype := util.ObjToString(typ)
+		if subtype == "中标" || subtype == "合同" || subtype == "成交" {
+			return true
+		}
+	}
+	return false
 }
 
 // 中标企业库
 func getwinnertel(company interface{}) string {
-    if company != nil {
-        data, _ := public.Mgo_Ent.FindOne("winner_enterprise", map[string]interface{}{
-            "company_name": util.ObjToString(company),
-        })
-        if (*data)["company_phone"] != nil {
-            return util.ObjToString((*data)["company_phone"])
-        }
-    }
-    return ""
+	if company != nil {
+		data, _ := public.Mgo_Ent.FindOne("winner_enterprise", map[string]interface{}{
+			"company_name": util.ObjToString(company),
+		})
+		if (*data)["company_phone"] != nil {
+			return util.ObjToString((*data)["company_phone"])
+		}
+	}
+	return ""
 }
 
 func GetUserId(openid string) string {
-    data, ok := public.MQFW.FindOne("user", map[string]interface{}{"s_m_openid": openid})
-    if data != nil && len(*data) > 0 && ok {
-        userid := mg.BsonIdToSId((*data)["_id"])
-        return userid
-    }
-    return ""
+	data, ok := public.MQFW.FindOne("user", map[string]interface{}{"s_m_openid": openid})
+	if data != nil && len(*data) > 0 && ok {
+		userid := mg.BsonIdToSId((*data)["_id"])
+		return userid
+	}
+	return ""
 }
 func RemoveDuplicatesAndEmpty(a []string) (ret []string) {
-    a_len := len(a)
-    for i := 0; i < a_len; i++ {
-        if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 {
-            continue
-        }
-        ret = append(ret, a[i])
-    }
-    return
+	a_len := len(a)
+	for i := 0; i < a_len; i++ {
+		if (i > 0 && a[i-1] == a[i]) || len(a[i]) == 0 {
+			continue
+		}
+		ret = append(ret, a[i])
+	}
+	return
 }
 
 // 该节点是否留资
 func hasRetainedCapital(uid string, source []string) bool {
-    if count, err := mongodb.CountByErr("saleLeads", map[string]interface{}{"userid": uid, "source": map[string]interface{}{"$in": source}}); err != nil || count > 0 {
-        return true
-    }
-    return false
+	if count, err := mongodb.CountByErr("saleLeads", map[string]interface{}{"userid": uid, "source": map[string]interface{}{"$in": source}}); err != nil || count > 0 {
+		return true
+	}
+	return false
 }
 
 func isInStringArr(arr []string, key string) bool {
-    for _, v := range arr {
-        if v == key {
-            return true
-        }
-    }
-    return false
+	for _, v := range arr {
+		if v == key {
+			return true
+		}
+	}
+	return false
 }
+
 func ReplaceStringByRegex(str, rule, replace string) (string, error) {
-    reg, err := regexp.Compile(rule)
-    if reg == nil || err != nil {
-        return "", errors.New("正则MustCompile错误:" + err.Error())
-    }
-    return reg.ReplaceAllString(str, replace), nil
+	reg, err := regexp.Compile(rule)
+	if reg == nil || err != nil {
+		return "", errors.New("正则MustCompile错误:" + err.Error())
+	}
+	return reg.ReplaceAllString(str, replace), nil
 }
 
 // 未登录用户进行数据过滤 name 配置文件
 func Filter(obj map[string]interface{}) map[string]interface{} {
-    detail := fmt.Sprint(obj["detail"])
-    mosaicText := fmt.Sprintf(`<span style="color:#2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
-    detailText := fmt.Sprintf(`<span class="noLoginMosaic" style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
-    //for k, _ := range obj {
-    //	if ok, _ := detailNeedMosaic[k].(bool); ok {
-    //		if util.ObjToString(obj[k]) != "" {
-    //			detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), detailText)
-    //		}
-    //		//中标企业信息
-    //		if k == "winnerMap" && obj[k] != nil {
-    //			winnerNewMap := map[string]interface{}{}
-    //			winnerMap := util.ObjToMap(obj[k])
-    //			for _, wv := range *winnerMap {
-    //				winnerNewMap[mosaicText] = wv
-    //			}
-    //			obj[k] = winnerNewMap
-    //		} else {
-    //			obj[k] = mosaicText
-    //		}
-    //	}
-    //}
-    //
-    if detailNeedMosaic == nil {
-        detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
-    }
-    for dk, dv := range detailNeedMosaic {
-        if !dv.(bool) {
-            continue
-        }
-        if obj["package"] != nil {
-            pk := util.ObjToMap(obj["package"])
-            for _, pv := range *pk {
-                if pv != nil {
-                    if page := util.ObjToMap(pv); page != nil {
-                        if (*page)[dk] != nil {
-                            (*page)[dk] = mosaicText
-                        }
-                        delete(*page, "text")
-                    }
-                }
-            }
-        }
-        //if util.ObjToString(obj[dk]) != "" {
-        //	detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
-        //}
-        if util.InterfaceToStr(obj[dk]) != "" {
-            value, b := obj[dk].(float64)
-            if b {
-                replaceStr := fmt.Sprintf("%v", int64(value))
-                detail = strings.ReplaceAll(detail, replaceStr, detailText)
-            } else {
-                detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
-            }
-        }
-        //中标企业信息
-        if dk == "winnerMap" {
-            winnerNewMap := map[string]interface{}{}
-            if obj[dk] != nil {
-                winnerMap := util.ObjToMap(obj[dk])
-                for _, wv := range *winnerMap {
-                    winnerNewMap[mosaicText] = wv
-                }
-            }
-            obj[dk] = winnerNewMap
-        } else {
-            obj[dk] = mosaicText
-        }
-    }
-    obj["detail"] = detail
-    return obj
+	detail := fmt.Sprint(obj["detail"])
+	mosaicText := fmt.Sprintf(`<span style="color:#2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	detailText := fmt.Sprintf(`<span class="noLoginMosaic" style="color: #2ABED1;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	//for k, _ := range obj {
+	//	if ok, _ := detailNeedMosaic[k].(bool); ok {
+	//		if util.ObjToString(obj[k]) != "" {
+	//			detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), detailText)
+	//		}
+	//		//中标企业信息
+	//		if k == "winnerMap" && obj[k] != nil {
+	//			winnerNewMap := map[string]interface{}{}
+	//			winnerMap := util.ObjToMap(obj[k])
+	//			for _, wv := range *winnerMap {
+	//				winnerNewMap[mosaicText] = wv
+	//			}
+	//			obj[k] = winnerNewMap
+	//		} else {
+	//			obj[k] = mosaicText
+	//		}
+	//	}
+	//}
+	//
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
+	for dk, dv := range detailNeedMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		if obj["package"] != nil {
+			pk := util.ObjToMap(obj["package"])
+			for _, pv := range *pk {
+				if pv != nil {
+					if page := util.ObjToMap(pv); page != nil {
+						if (*page)[dk] != nil {
+							(*page)[dk] = mosaicText
+						}
+						delete(*page, "text")
+					}
+				}
+			}
+		}
+		//if util.ObjToString(obj[dk]) != "" {
+		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[dk]), detailText)
+		//}
+		if util.InterfaceToStr(obj[dk]) != "" {
+			value, b := obj[dk].(float64)
+			if b {
+				replaceStr := fmt.Sprintf("%v", int64(value))
+				detail = strings.ReplaceAll(detail, replaceStr, detailText)
+			} else {
+				detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
+			}
+		}
+		//中标企业信息
+		if dk == "winnerMap" {
+			winnerNewMap := map[string]interface{}{}
+			if obj[dk] != nil {
+				winnerMap := util.ObjToMap(obj[dk])
+				for _, wv := range *winnerMap {
+					winnerNewMap[mosaicText] = wv
+				}
+			}
+			obj[dk] = winnerNewMap
+		} else {
+			obj[dk] = mosaicText
+		}
+	}
+	obj["detail"] = detail
+	return obj
 }
 
 // 拟建采购意向用户进行数据过滤 name 配置文件
 func otherFilter(obj map[string]interface{}, isLogin bool) map[string]interface{} {
-    txt := util.If(isLogin, "解锁会员查看", "登陆后解锁会员查看").(string)
-    detail := fmt.Sprint(obj["detail"])
-    mosaicText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
-    detailText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
-    var (
-        projectinfo map[string]interface{}
-    )
+	txt := util.If(isLogin, "解锁会员查看", "登陆后解锁会员查看").(string)
+	detail := fmt.Sprint(obj["detail"])
+	mosaicText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
+	detailText := fmt.Sprintf(`<span class="highlight-text otherMosaic">%s</span>`, txt)
+	var (
+		projectinfo map[string]interface{}
+	)
 
-    var otherMosaic map[string]interface{}
-    if obj["subtype"] == "拟建" {
-        otherMosaic, _ = config.Sysconfig["planBuildMosaic"].(map[string]interface{})
-        projectinfo, _ = obj["projectinfo"].(map[string]interface{}) //1.项目信息打码处理
-    } else if obj["subtype"] == "采购意向" {
-        otherMosaic, _ = config.Sysconfig["purchaseMosaic"].(map[string]interface{})
-        procurementlist, _ := obj["procurementlist"].([]interface{})
-        for _, vs := range procurementlist { //1.采购意向清单数据集打码处理
-            vsMap, _ := vs.(map[string]interface{})
-            for _, vsq := range vsMap {
-                if vs1, ok := vsq.(string); ok && vs1 != "" {
-                    detail = strings.ReplaceAll(detail, util.InterfaceToStr(vsq), detailText)
-                }
-            }
-        }
-        delete(obj, "procurementlist")
-    }
+	var otherMosaic map[string]interface{}
+	if obj["subtype"] == "拟建" {
+		otherMosaic, _ = config.Sysconfig["planBuildMosaic"].(map[string]interface{})
+		projectinfo, _ = obj["projectinfo"].(map[string]interface{}) //1.项目信息打码处理
+	} else if obj["subtype"] == "采购意向" {
+		otherMosaic, _ = config.Sysconfig["purchaseMosaic"].(map[string]interface{})
+		procurementlist, _ := obj["procurementlist"].([]interface{})
+		for _, vs := range procurementlist { //1.采购意向清单数据集打码处理
+			vsMap, _ := vs.(map[string]interface{})
+			for _, vsq := range vsMap {
+				if vs1, ok := vsq.(string); ok && vs1 != "" {
+					detail = strings.ReplaceAll(detail, util.InterfaceToStr(vsq), detailText)
+				}
+			}
+		}
+		delete(obj, "procurementlist")
+	}
 
-    for dk, dv := range otherMosaic {
-        if !dv.(bool) {
-            continue
-        }
-        if vs, ok := projectinfo[dk]; ok && vs != nil && vs != "" {
-            detail = strings.ReplaceAll(detail, util.InterfaceToStr(vs), detailText)
-            projectinfo[dk] = mosaicText
-        }
-        if vs, ok := obj[dk]; ok && vs != nil && vs != "" {
-            value, b := obj[dk].(float64)
-            if b {
-                replaceStr := fmt.Sprintf("%v", int64(value))
-                detail = strings.ReplaceAll(detail, replaceStr, detailText)
-            } else {
-                detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
-            }
-        }
-        obj[dk] = mosaicText
-    }
-    if obj["subtype"] == "拟建" {
-        for k := range projectinfo {
-            if _, ok := otherMosaic[k]; !ok {
-                delete(projectinfo, k)
-            }
-        }
-        obj["projectinfo"] = projectinfo
-    }
-    obj["detail"] = detail
-    return obj
+	for dk, dv := range otherMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		if vs, ok := projectinfo[dk]; ok && vs != nil && vs != "" {
+			detail = strings.ReplaceAll(detail, util.InterfaceToStr(vs), detailText)
+			projectinfo[dk] = mosaicText
+		}
+		if vs, ok := obj[dk]; ok && vs != nil && vs != "" {
+			value, b := obj[dk].(float64)
+			if b {
+				replaceStr := fmt.Sprintf("%v", int64(value))
+				detail = strings.ReplaceAll(detail, replaceStr, detailText)
+			} else {
+				detail = strings.ReplaceAll(detail, util.InterfaceToStr(obj[dk]), detailText)
+			}
+		}
+		obj[dk] = mosaicText
+	}
+	if obj["subtype"] == "拟建" {
+		for k := range projectinfo {
+			if _, ok := otherMosaic[k]; !ok {
+				delete(projectinfo, k)
+			}
+		}
+		obj["projectinfo"] = projectinfo
+	}
+	obj["detail"] = detail
+	return obj
 }
 
 // 未登录用户进行数据过滤 name 配置文件
 func SearchFilter(obj map[string]interface{}) map[string]interface{} {
-    //detail := fmt.Sprint(obj["detail"])
-    //mosaicText := fmt.Sprintf(`<span style="cursor:pointer;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
-    //for k, _ := range obj {
-    //	needMosaic, _ := config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
-    //	if ok, _ := needMosaic[k].(bool); ok {
-    //		//if util.ObjToString(obj[k]) != "" {
-    //		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), mosaicText)
-    //		//	//敏感词过滤
-    //		//}
-    //		if k == "winnerMap" {
-    //			winnerMap, _ := obj[k].(map[string]interface{})
-    //			mosaicMap := map[string]interface{}{}
-    //			for i := 0; i < len(winnerMap); i++ {
-    //				mosaicMap[mosaicText] = mosaicText
-    //			}
-    //			obj["winnerMap"] = mosaicMap
-    //		} else {
-    //			obj[k] = mosaicText
-    //		}
-    //
-    //	}
-    //}
-    //数字打码
-    //detail = RegDetail(detail)
-    //detail = fsw.Repl(detail)
-    //obj["detail"] = detail
+	//detail := fmt.Sprint(obj["detail"])
+	//mosaicText := fmt.Sprintf(`<span style="cursor:pointer;">%s</span>`, util.ObjToString(config.Sysconfig["detailMosaic"]))
+	//for k, _ := range obj {
+	//	needMosaic, _ := config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	//	if ok, _ := needMosaic[k].(bool); ok {
+	//		//if util.ObjToString(obj[k]) != "" {
+	//		//	detail = strings.ReplaceAll(detail, util.ObjToString(obj[k]), mosaicText)
+	//		//	//敏感词过滤
+	//		//}
+	//		if k == "winnerMap" {
+	//			winnerMap, _ := obj[k].(map[string]interface{})
+	//			mosaicMap := map[string]interface{}{}
+	//			for i := 0; i < len(winnerMap); i++ {
+	//				mosaicMap[mosaicText] = mosaicText
+	//			}
+	//			obj["winnerMap"] = mosaicMap
+	//		} else {
+	//			obj[k] = mosaicText
+	//		}
+	//
+	//	}
+	//}
+	//数字打码
+	//detail = RegDetail(detail)
+	//detail = fsw.Repl(detail)
+	//obj["detail"] = detail
 
-    if detailNeedMosaic == nil {
-        detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
-    }
-    for dk, dv := range detailNeedMosaic {
-        if !dv.(bool) {
-            continue
-        }
-        //中标企业信息
-        if dk == "winnerMap" {
-            winnerNewMap := map[string]interface{}{}
-            if obj[dk] != nil {
-                winnerMap := util.ObjToMap(obj[dk])
-                for _, wv := range *winnerMap {
-                    winnerNewMap[util.ObjToString(config.Sysconfig["detailMosaic"])] = wv
-                }
-            }
-            obj[dk] = winnerNewMap
-        } else {
-            obj[dk] = util.ObjToString(config.Sysconfig["detailMosaic"])
-        }
-    }
-    return obj
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
+	for dk, dv := range detailNeedMosaic {
+		if !dv.(bool) {
+			continue
+		}
+		//中标企业信息
+		if dk == "winnerMap" {
+			winnerNewMap := map[string]interface{}{}
+			if obj[dk] != nil {
+				winnerMap := util.ObjToMap(obj[dk])
+				for _, wv := range *winnerMap {
+					winnerNewMap[util.ObjToString(config.Sysconfig["detailMosaic"])] = wv
+				}
+			}
+			obj[dk] = winnerNewMap
+		} else {
+			obj[dk] = util.ObjToString(config.Sysconfig["detailMosaic"])
+		}
+	}
+	return obj
 }
 
 func (s *Short) NologinArticle(stype, id string) error {
-    sess := s.Session().GetMultiple()
-    userId := util.ObjToString(sess["userId"])
-    sids := encrypt.CommonDecodeArticle(stype, id)
-    if len(sids) == 0 || (len(sids) > 0 && sids[0] == "") {
-        s.Redirect("/notin/page", 302)
-        return nil
-    }
+	sess := s.Session().GetMultiple()
+	userId := util.ObjToString(sess["userId"])
+	sids := encrypt.CommonDecodeArticle(stype, id)
+	if len(sids) == 0 || (len(sids) > 0 && sids[0] == "") {
+		s.Redirect("/notin/page", 302)
+		return nil
+	}
 
-    if userId != "" { //已登录用户直接跳转至正常三级页
-        return s.LoginCommon(sess, stype, id, mobileReg.MatchString(s.Header("User-Agent")), true) //是否是移动端
-    }
-    if detailNeedMosaic == nil {
-        detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
-    }
-    return s.NologinCommon(userId, stype, id, sids[0])
+	if userId != "" { //已登录用户直接跳转至正常三级页
+		return s.LoginCommon(sess, stype, id, mobileReg.MatchString(s.Header("User-Agent"))) //是否是移动端
+	}
+	if detailNeedMosaic == nil {
+		detailNeedMosaic, _ = config.Sysconfig["detailNeedMosaic"].(map[string]interface{})
+	}
+	return s.NologinCommon(userId, stype, id, sids[0])
 }
 
 func (s *Short) NologinCommon(userId, stype, id, sid string) error {
-    tg := &Tags{}
-    var ipTrue bool
-    ips := strings.Split(util.GetIp(s.Request), ",")
-    if len(ips) > 0 {
-        ipTrue = config.IpList.Match(ips[0])
-    }
-    isLogin := util.If(userId != "", true, false).(bool)
-    catchKey := fmt.Sprintf("jypcdetail_nologin_%s_%s_%v_%v", stype, sid, ipTrue, isLogin)
-    if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
-        industry := s.GetString("industry")
-        var shareid = s.GetString("id")
-        if len(shareid) == 0 {
-            shareid = "10"
-        }
-        s.T["logid"] = config.Seoconfig["jysskzy"].(string)
-        s.T["shareid"] = se.EncodeString(shareid)
-        //s.T["keywords"] = s.GetString("kds")
-        s.DisableHttpCache()
-        po, bo, wo, obj := pcVRT(sid, industry, stype, false, false)
-        if obj != nil && len(obj) > 0 {
-            // p397 未登录不能查看拟建项目
-            if !ipTrue && (obj["subtype"] == "采购意向" || obj["subtype"] == "拟建") { //未登录拟建 采购意向 遮罩
-                obj = map[string]interface{}{
-                    "title":        obj["title"],
-                    "_id":          obj["_id"],
-                    "subtype":      obj["subtype"],
-                    "stypeadd":     obj["stypeadd"],
-                    "originalShow": false,
-                }
-                s.T["canRead"] = true
-            } else {
-                FieldProcessing(obj, "", industry, id, "", userId, stype, false)
-                if userId == "" {
-                    obj["winnerTitle"] = obj["winner"]
-                    obj["buyerTitle"] = obj["buyer"]
-                    obj["projectnameTitle"] = obj["projectname"]
-                    obj["projectcodeTitle"] = obj["projectcode"]
-                    if !ipTrue { //非白名单用户
-                        obj = Filter(obj)
-                    }
-                    //obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
-                }
-                obj["agency"] = ""
-                if obj["publishtime"] != nil {
-                    obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
-                }
-            }
-            if len(po) > 0 {
-                s.T["projectOther"] = po
-            }
-            if len(bo) > 0 {
-                s.T["buyerOther"] = bo
-            }
-            if len(wo) > 0 {
-                s.T["winnerOther"] = wo
-            }
-            obj["urlpath"] = s.Uri()
-            obj["industry"] = industry
+	tg := &Tags{}
+	var ipTrue bool
+	ips := strings.Split(util.GetIp(s.Request), ",")
+	if len(ips) > 0 {
+		ipTrue = config.IpList.Match(ips[0])
+	}
+	catchKey := fmt.Sprintf("jypcdetail_nologin_%s_%s_%v", stype, sid, ipTrue)
+	if res := redis.Get(redisLimitation, catchKey); res == nil || res == "" {
+		industry := s.GetString("industry")
+		var shareid = s.GetString("id")
+		if len(shareid) == 0 {
+			shareid = "10"
+		}
+		s.T["canRead"] = true
+		s.T["logid"] = config.Seoconfig["jysskzy"].(string)
+		s.T["shareid"] = se.EncodeString(shareid)
+		//s.T["keywords"] = s.GetString("kds")
+		s.DisableHttpCache()
+		po, bo, wo, obj := pcVRT(sid, industry, stype, false, false)
+		if obj != nil && len(obj) > 0 {
+			// p397 未登录不能查看拟建项目
+			if !ipTrue && (obj["subtype"] == "采购意向" || obj["subtype"] == "拟建") { //未登录拟建 采购意向 遮罩
+				obj = map[string]interface{}{
+					"title":        obj["title"],
+					"_id":          obj["_id"],
+					"subtype":      obj["subtype"],
+					"stypeadd":     obj["stypeadd"],
+					"originalShow": false,
+				}
+				s.T["canRead"] = false
+			} else {
+				FieldProcessing(obj, "", industry, id, "", userId, stype, false)
+				if userId == "" {
+					obj["winnerTitle"] = obj["winner"]
+					obj["buyerTitle"] = obj["buyer"]
+					obj["projectnameTitle"] = obj["projectname"]
+					obj["projectcodeTitle"] = obj["projectcode"]
+					if !ipTrue { //非白名单用户
+						obj = Filter(obj)
+					}
+					//obj["description"] = fmt.Sprintf("%s,%s。", obj["title"], baseInfo(obj))
+				}
+				obj["agency"] = ""
+				if obj["publishtime"] != nil {
+					obj["publishtimeShorDate"] = time.Unix(util.Int64All(obj["publishtime"]), 0).Format(date.Date_Short_Layout)
+				}
+			}
+			if len(po) > 0 {
+				s.T["projectOther"] = po
+			}
+			if len(bo) > 0 {
+				s.T["buyerOther"] = bo
+			}
+			if len(wo) > 0 {
+				s.T["winnerOther"] = wo
+			}
+			obj["urlpath"] = s.Uri()
+			obj["industry"] = industry
 
-            obj["keywords"] = KeyWordHandle(obj)
-            obj["description"] = DescriptionHandle("nologin", obj)
-            s.T["obj"] = obj
-            s.T["url"] = s.Uri()
-            s.T["newBidInfoList"] = tg.GetNewBidInfo()
-            s.T["industryInfoList"] = tg.GetConsult()
-            s.T["hotLabelList"] = tg.GetHotLabel(30)
-            s.T["simpleTemplateData"] = map[string]interface{}{
-                "obj": obj,
-            }
-            content, _ := s.Render4Cache("/pc/tags/detail.html", &s.T)
-            redis.Put(redisLimitation, catchKey, string(content), 60*2)
-            return s.SetBody(content)
-        }
-    } else {
-        return s.SetBody([]byte(res.(string)))
-    }
-    return nil
+			obj["keywords"] = KeyWordHandle(obj)
+			obj["description"] = DescriptionHandle("nologin", obj)
+			s.T["obj"] = obj
+			s.T["url"] = s.Uri()
+			s.T["newBidInfoList"] = tg.GetNewBidInfo()
+			s.T["industryInfoList"] = tg.GetConsult()
+			s.T["hotLabelList"] = tg.GetHotLabel(30)
+			s.T["simpleTemplateData"] = map[string]interface{}{
+				"obj": obj,
+			}
+			content, _ := s.Render4Cache("/pc/tags/detail.html", &s.T)
+			redis.Put(redisLimitation, catchKey, string(content), 60*2)
+			return s.SetBody(content)
+		}
+	} else {
+		return s.SetBody([]byte(res.(string)))
+	}
+	return nil
 }
 
 /*
 TDK description
 */
 func baseInfo(obj map[string]interface{}) string {
-    info := ""
-    info += "省份:"
-    //{{if eq .T.obj.area "A"}}全国{{else}}{{.T.obj.area}}{{end}}
-    if area := util.ObjToString(obj["area"]); area == "A" {
-        info += "全国"
-    } else {
-        info += area
-    }
-    info += ",城市:" + util.ObjToString(obj["city"])
-    info += ",招标代理机构:" + util.ObjToString(obj["agency"])
-    info += ",项目名称:" + util.ObjToString(obj["projectname"])
-    info += ",采购单位:" + util.ObjToString(obj["buyer"])
-    info += ",采购联系人:" + util.ObjToString(obj["buyerperson"])
-    info += ",采购电话:" + util.ObjToString(obj["buyertel"])
-    if obj["package"] == nil {
-        info += ",项目预算(元):" + util.ObjToString(obj["budget"])
-    }
-    if util.ObjToString(obj["subtype"]) == "单一" && util.ObjToString(obj["package"]) == "" {
-        info += ",拟定单一来源采购供应商:" + util.ObjToString(obj["winner"])
-    }
-    subtype := util.ObjToString(obj["subtype"])
-    if subtype == "中标" || subtype == "成交" || subtype == "合同" {
-        if obj["winnerMap"] != nil {
-            info += ",中标单位:"
-            i := 0
-            for k, _ := range *util.ObjToMap(obj["winnerMap"]) {
-                i++
-                info += k
-                if i != len(*util.ObjToMap(obj["winnerMap"])) {
-                    info += "、"
-                }
-            }
-        }
-        if obj["bidamount"] != nil {
-            info += ",中标金额(元):" + util.ObjToString(obj["bidamount"])
-        }
+	info := ""
+	info += "省份:"
+	//{{if eq .T.obj.area "A"}}全国{{else}}{{.T.obj.area}}{{end}}
+	if area := util.ObjToString(obj["area"]); area == "A" {
+		info += "全国"
+	} else {
+		info += area
+	}
+	info += ",城市:" + util.ObjToString(obj["city"])
+	info += ",招标代理机构:" + util.ObjToString(obj["agency"])
+	info += ",项目名称:" + util.ObjToString(obj["projectname"])
+	info += ",采购单位:" + util.ObjToString(obj["buyer"])
+	info += ",采购联系人:" + util.ObjToString(obj["buyerperson"])
+	info += ",采购电话:" + util.ObjToString(obj["buyertel"])
+	if obj["package"] == nil {
+		info += ",项目预算(元):" + util.ObjToString(obj["budget"])
+	}
+	if util.ObjToString(obj["subtype"]) == "单一" && util.ObjToString(obj["package"]) == "" {
+		info += ",拟定单一来源采购供应商:" + util.ObjToString(obj["winner"])
+	}
+	subtype := util.ObjToString(obj["subtype"])
+	if subtype == "中标" || subtype == "成交" || subtype == "合同" {
+		if obj["winnerMap"] != nil {
+			info += ",中标单位:"
+			i := 0
+			for k, _ := range *util.ObjToMap(obj["winnerMap"]) {
+				i++
+				info += k
+				if i != len(*util.ObjToMap(obj["winnerMap"])) {
+					info += "、"
+				}
+			}
+		}
+		if obj["bidamount"] != nil {
+			info += ",中标金额(元):" + util.ObjToString(obj["bidamount"])
+		}
 
-        if obj["bidamount"] != nil {
-            info += ",联系方式:" + util.ObjToString(obj["bidamount"])
-        }
-    }
-    return info
+		if obj["bidamount"] != nil {
+			info += ",联系方式:" + util.ObjToString(obj["bidamount"])
+		}
+	}
+	return info
 }
 
 // 分段匹配数字打码
 func RegDetail(html string) string {
-    mosaicText := util.ObjToString(config.Sysconfig["detailMosaicTxt"])
-    reg := regexp.MustCompile("<[^<>]{1,1000}>") //分段正则
-    s := reg.FindAllStringIndex(html, -1)        //全文匹配分段
-    if len(s) > 0 {                              //走分段替换
-        arr := []string{}
-        index := 0
-        for _, v := range s {
-            if len(v) == 2 {
-                // log.Println(html[index:v[0]])
-                txt, _ := ReplaceStringByRegex(html[index:v[0]], "[0-9]+", mosaicText)
-                arr = append(arr, txt) //替换
-                arr = append(arr, html[v[0]:v[1]])
-                index = v[1]
-            }
-        }
-        return strings.Join(arr, "")
-    }
-    return ""
+	mosaicText := util.ObjToString(config.Sysconfig["detailMosaicTxt"])
+	reg := regexp.MustCompile("<[^<>]{1,1000}>") //分段正则
+	s := reg.FindAllStringIndex(html, -1)        //全文匹配分段
+	if len(s) > 0 {                              //走分段替换
+		arr := []string{}
+		index := 0
+		for _, v := range s {
+			if len(v) == 2 {
+				// log.Println(html[index:v[0]])
+				txt, _ := ReplaceStringByRegex(html[index:v[0]], "[0-9]+", mosaicText)
+				arr = append(arr, txt) //替换
+				arr = append(arr, html[v[0]:v[1]])
+				index = v[1]
+			}
+		}
+		return strings.Join(arr, "")
+	}
+	return ""
 }
 
 func KeyWordHandle(obj map[string]interface{}) string {
-    keywordArr := []string{}
-    owner := util.InterfaceToStr(obj["owner"])
-    buyer := util.InterfaceToStr(obj["buyer"])
-    if buyer == "" {
-        buyer = owner
-    }
-    if buyer != "" && buyer != config.Sysconfig["detailMosaicTxt"] {
-        keywordArr = append(keywordArr, buyer)
-    }
-    if util.InterfaceToStr(obj["s_winner"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
-        keywordArr = append(keywordArr, util.InterfaceToStr(obj["s_winner"]))
-    }
-    if obj["purchasinglist"] != nil && obj["purchasinglist"] != "" {
-        i := 0
-        for _, v := range gconv.SliceMap(obj["purchasinglist"]) {
-            if i == 5 {
-                break
-            }
-            if util.InterfaceToStr(v["itemname"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
-                keywordArr = append(keywordArr, util.InterfaceToStr(v["itemname"]))
-                i++
-            }
-        }
-    }
-    if util.InterfaceToStr(obj["subtype"]) != "" && util.InterfaceToStr(obj["subtype"]) != "其它" {
-        keywordArr = append(keywordArr, TypeCodeMap[util.InterfaceToStr(obj["subtype"])])
-    }
-    if util.InterfaceToStr(obj["area"]) != "" {
-        keywordArr = append(keywordArr, util.InterfaceToStr(obj["area"])+"招标")
-    }
-    if util.InterfaceToStr(obj["city"]) != "" {
-        keywordArr = append(keywordArr, util.InterfaceToStr(obj["city"])+"招标")
-    }
-    keywordArr = append(keywordArr, "剑鱼标讯")
-    keyword := strings.Join(keywordArr, ",")
-    return keyword
+	keywordArr := []string{}
+	owner := util.InterfaceToStr(obj["owner"])
+	buyer := util.InterfaceToStr(obj["buyer"])
+	if buyer == "" {
+		buyer = owner
+	}
+	if buyer != "" && buyer != config.Sysconfig["detailMosaicTxt"] {
+		keywordArr = append(keywordArr, buyer)
+	}
+	if util.InterfaceToStr(obj["s_winner"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["s_winner"]))
+	}
+	if obj["purchasinglist"] != nil && obj["purchasinglist"] != "" {
+		i := 0
+		for _, v := range gconv.SliceMap(obj["purchasinglist"]) {
+			if i == 5 {
+				break
+			}
+			if util.InterfaceToStr(v["itemname"]) != "" && util.InterfaceToStr(obj["s_winner"]) != config.Sysconfig["detailMosaicTxt"] {
+				keywordArr = append(keywordArr, util.InterfaceToStr(v["itemname"]))
+				i++
+			}
+		}
+	}
+	if util.InterfaceToStr(obj["subtype"]) != "" && util.InterfaceToStr(obj["subtype"]) != "其它" {
+		keywordArr = append(keywordArr, TypeCodeMap[util.InterfaceToStr(obj["subtype"])])
+	}
+	if util.InterfaceToStr(obj["area"]) != "" {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["area"])+"招标")
+	}
+	if util.InterfaceToStr(obj["city"]) != "" {
+		keywordArr = append(keywordArr, util.InterfaceToStr(obj["city"])+"招标")
+	}
+	keywordArr = append(keywordArr, "剑鱼标讯")
+	keyword := strings.Join(keywordArr, ",")
+	return keyword
 }
 func DescriptionHandle(stype string, obj map[string]interface{}) string {
-    description := ""
-    publishtime := util.Int64All(obj["l_publishtime"])
-    if publishtime == 0 {
-        publishtime = util.Int64All(obj["publishtime"])
-    }
-    pushTime := time.Unix(publishtime, 0)
-    title := util.InterfaceToStr(obj["title"])
-    owner := util.InterfaceToStr(obj["owner"])
-    buyer := util.InterfaceToStr(obj["buyer"])
-    if buyer == "" {
-        buyer = owner
-    }
-    s_winner := util.InterfaceToStr(obj["s_winner"])
-    area := util.InterfaceToStr(obj["area"])
-    city := util.InterfaceToStr(obj["city"])
-    if stype == "bdprivate" {
-        //bdprivate
-        //{项目标题},采购单位:{采购单位名称},成交供应商:{中标企业名称},公告日期:{公告日期}。
-        descriptionArr := []string{}
-        if title != "" {
-            descriptionArr = append(descriptionArr, title)
-        }
-        if buyer != "" {
-            descriptionArr = append(descriptionArr, fmt.Sprintf("采购单位:%s", buyer))
-        }
-        if s_winner != "" {
-            descriptionArr = append(descriptionArr, fmt.Sprintf("成交供应商:%s", s_winner))
-        }
-        if publishtime != 0 {
-            descriptionArr = append(descriptionArr, fmt.Sprintf("公告日期:%s", pushTime.Format("2006年01月02日")))
-        }
-        descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
-        description = strings.Join(descriptionArr, ",")
-    } else {
-        //descriptionStr = "%s,项目所属地区是%s%s,项目采购单位是%s,项目发布时间是%s"
-        descriptionArr := []string{}
-        if title != "" {
-            descriptionArr = append(descriptionArr, title)
-        }
-        if area != "" || city != "" {
-            descriptionArr = append(descriptionArr, fmt.Sprintf("项目所属地区是%s%s", area, city))
-        }
-        if buyer != "" {
-            descriptionArr = append(descriptionArr, fmt.Sprintf("项目采购单位是%s", buyer))
-        }
-        if publishtime != 0 {
-            descriptionArr = append(descriptionArr, fmt.Sprintf("项目发布时间是%s", pushTime.Format("2006年01月02日")))
-        }
-        descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
-        description = strings.Join(descriptionArr, ",")
-    }
-    return description
+	description := ""
+	publishtime := util.Int64All(obj["l_publishtime"])
+	if publishtime == 0 {
+		publishtime = util.Int64All(obj["publishtime"])
+	}
+	pushTime := time.Unix(publishtime, 0)
+	title := util.InterfaceToStr(obj["title"])
+	owner := util.InterfaceToStr(obj["owner"])
+	buyer := util.InterfaceToStr(obj["buyer"])
+	if buyer == "" {
+		buyer = owner
+	}
+	s_winner := util.InterfaceToStr(obj["s_winner"])
+	area := util.InterfaceToStr(obj["area"])
+	city := util.InterfaceToStr(obj["city"])
+	if stype == "bdprivate" {
+		//bdprivate
+		//{项目标题},采购单位:{采购单位名称},成交供应商:{中标企业名称},公告日期:{公告日期}。
+		descriptionArr := []string{}
+		if title != "" {
+			descriptionArr = append(descriptionArr, title)
+		}
+		if buyer != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("采购单位:%s", buyer))
+		}
+		if s_winner != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("成交供应商:%s", s_winner))
+		}
+		if publishtime != 0 {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("公告日期:%s", pushTime.Format("2006年01月02日")))
+		}
+		descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
+		description = strings.Join(descriptionArr, ",")
+	} else {
+		//descriptionStr = "%s,项目所属地区是%s%s,项目采购单位是%s,项目发布时间是%s"
+		descriptionArr := []string{}
+		if title != "" {
+			descriptionArr = append(descriptionArr, title)
+		}
+		if area != "" || city != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目所属地区是%s%s", area, city))
+		}
+		if buyer != "" {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目采购单位是%s", buyer))
+		}
+		if publishtime != 0 {
+			descriptionArr = append(descriptionArr, fmt.Sprintf("项目发布时间是%s", pushTime.Format("2006年01月02日")))
+		}
+		descriptionArr = append(descriptionArr, "查看该项目信息详情请访问剑鱼标讯官网。")
+		description = strings.Join(descriptionArr, ",")
+	}
+	return description
 }

+ 0 - 2
src/web/staticres/common-module/nps-common/css/nps.css

@@ -94,10 +94,8 @@
 /* pc端样式 */
 #npsMain.npsPc{
   margin: 0 auto;
-  width: 1200px;
 }
 #npsMain.npsPc .nps-content{
-  width: 980px;
   height: auto;
   padding: 32px 0;
   background: url('../image/pc_bg.png') no-repeat;

+ 15 - 12
src/web/staticres/css/pc.css

@@ -1418,9 +1418,12 @@ form{
 	display: none;
 }
 /*****************招标详情页*************************/
+.biddetail-content-container {
+	width: 892px;
+	transition: width 0.1s ease;
+}
 .biddetail-content{
 /*	margin: 0px auto;*/
-    width: 940px;
 	background-color: #fff;
 	padding: 42px 40px;
 	margin-left: 0px;
@@ -1692,8 +1695,7 @@ form{
 	margin-left: -20px;
 }
 .otherinfo{
-	margin: 20px left;
-	width: 980px;
+	margin: 20px 0;
 	font-size: 16px;
 }
 .otherinfo ul{
@@ -1734,7 +1736,7 @@ form{
 	margin-right: 10px;
 }
 .otherinfo li .com-title{
-	width: 560px;
+	width: 500px;
 	overflow: hidden;
 	white-space: nowrap;
 	text-overflow: ellipsis;
@@ -4347,6 +4349,7 @@ h6 {
 }*/
 /**dev2.1纠错**/
 .recoveryhead{
+	display: flex;
 	background-color: #FFF;
 /*    height: 50px;*/
 /*    border: 1px solid #ebebeb;*/
@@ -4376,7 +4379,7 @@ h6 {
 	position:fixed;
 	top: 0px;
     margin-top: 0px !important;
-    width: 980px;
+    width: 892px;
 	z-index: 99;
 }
 #tab2{
@@ -4509,14 +4512,14 @@ h6 {
     padding-right: 0px !important;
 }
 .cd-type{
-	width: 300px;
+	width: 260px;
     border-right: 1px solid #EBEBEB;
     padding: 10px;
     background-color: #F4F4F9;
     color: #686868;
 }
 .cd-cont{
-	width: 300px;
+	width: 260px;
 	border-right: 1px solid #EBEBEB;
     padding: 10px;
     font-size: 16px;
@@ -4538,19 +4541,19 @@ h6 {
 }
 .subpck .cont-cont{
 	padding-right: 40px;
-    width: 210px !important;
+    width: 190px !important;
 }
 .bidpck .cont-cont{
 	padding-right: 40px;
-    width: 240px !important;
+    width: 210px !important;
 }
 .winpck .cont-cont{
 	padding-right: 40px;
-    width: 444px !important;
+    width: 344px !important;
 }
 .amountpck .cont-cont{
 	padding-right: 40px;
-    width: 180px !important;
+    width: 150px !important;
 }
 .rec-null{
 	position: absolute;
@@ -4634,7 +4637,7 @@ h6 {
     margin-right: -40px;
 }
 .tab3{
-	width: 500px;
+	flex: 1;
     height: 45px;
     border-bottom: 1px solid #ebebeb;
     float: left;

+ 4 - 0
src/web/staticres/pccss/index_pc.css

@@ -22,6 +22,10 @@
     padding-right: 20px;
 }
 
+.in-iframe .w {
+    width: 1200px!important;
+}
+
 .banner-remark {
     position: relative;
 }

File diff suppressed because it is too large
+ 7 - 74
src/web/staticres/pccss/pc-detail.css


+ 10 - 0
src/web/staticres/public-pc/js/article-content.js

@@ -1048,6 +1048,16 @@ function jumpTab(n){
   return false;
 }
 $(function(){
+  if (goTemplateData.inIframe) {
+    $('.page-detail').addClass('in-iframe-style')
+    $('.in-iframe-dom-show').show()
+    $('.in-iframe-dom-hide').hide()
+    $('.recoveryfat').css({ width: $('.biddetail-content').width() })
+  } else {
+    $('.in-outside-dom-show').show()
+    $('.in-outside-dom-hide').hide()
+    $('.page-detail').addClass('in-outside-style')
+  }
   if ($("#trwidth").find(".preb-exam").length>0){
     $("#exaapprove").show();
   }

+ 7 - 4
src/web/staticres/public-pc/js/header-nav-mini.js

@@ -9,15 +9,21 @@ var headerNavMini = {
   // (这个地方需要注意:这里写的值是第二个头部的真实显示高度。但是在未登陆下,第二个头部其实是不会显示的(高度为0),但是这个变量仍然是72。)
   _headerNavSecondHeight: 72,
   init: function () {
+    this.initStyle()
     this.initEvents()
   },
   initStyle: function () {
+    var _this = this
     if (this.inIframe) {
       this.headerNav.hide()
       this.headerNavContainer.hide()
     } else {
       this.headerNav.show()
     }
+    // 加个延迟让二级导航的slideDown看起来不那么突兀
+    setTimeout(function () {
+      _this.secondHeaderShow()
+    }, 300)
   },
   headerFixed: function (f) {
     if (f) {
@@ -34,10 +40,9 @@ var headerNavMini = {
     // 头部占位
     this.headerNavPlaceholder.height(this._headerNavFixedHeight)
   },
-  // 登陆前不展示。登陆后工作台外的页面顶部统一展示(除了首页)
+  // 工作台外的页面顶部统一展示(除了首页)
   secondHeaderShow: function (login) {
     if (this.inIframe) return
-    if (!login) return
     // exclude中的页面不会显示第二个头部
     var pathname = location.pathname
     var excludeReg = [
@@ -134,9 +139,7 @@ var headerNavMini = {
       $('.login-register-button').show()
       $('.go-to-workspace').hide()
     }
-    this.initStyle()
     this.changeHeaderPlaceholder()
-    this.secondHeaderShow(login)
   },
   changeMenuActive: function (name) {
     this.headerNav.find('[name='+name+']').addClass('active')

+ 1 - 3
src/web/templates/common/pc-header-nav-second.html

@@ -1,6 +1,4 @@
-{{$userId :=(session "userId")}}
-{{$noLogin :=(or (Eq $userId "") (Eq $userId nil))}}
-{{if and (not $noLogin) (not (Eq .Request.URL "/"))}}
+{{if not (Eq .Request.URL "/")}}
 <link rel="stylesheet" href='{{Msg "seo" "cdn"}}/public-pc/css/pc-header-nav-second.css?v={{Msg "seo" "version"}}' />
 <section id="pc-header-nav-second" class="pc-header-nav-second" style="display: none;">
  <div class="pc-header-nav-second-head">

+ 206 - 194
src/web/templates/pc/biddetail_rec.html

@@ -358,8 +358,12 @@
     <!-- 用户留资 -->
     <div id="vue-collect-user-info"></div>
     <div id="vue-collect-bid-info"></div>
+    <section class="w breadcrumb-nav in-outside-dom-show" style="display: none;">
+      <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>
+    </section>
     <div class="main-content" style="width: 1200px; position: relative; margin: 0 auto">
-        <div class="biddetail-content" style="width:980px; margin-left:0px;">
+      <div class="biddetail-content-container">
+        <div class="biddetail-content">
             {{if .T.obj.site}}
             {{if eq .T.obj.site "剑鱼信息发布平台"}}
             <div class="yhfb">用户发布</div>
@@ -842,7 +846,7 @@
             </div> -->
             <div class="cutline"></div>
             <div class="com-prebuilt hidden" style="position:relative;">
-                <div class="mask-zz hidden" style="position:absolute; top:0;width: 900px;padding:0;height: 408px;background-color:white;z-index: 1;">
+                <div class="mask-zz hidden" style="position:absolute; top:0;padding:0;height: 408px;background-color:white;z-index: 1;">
                     <img style="width: 100%;height: 100%" src="/images/pc/pc_mh.png">
                     <div class="mask-zz" style="position:absolute; left: 50%; top: 50%; margin-top: -110px;margin-left: -250px;width: 500px;height: 220px;background-color: white;z-index: 100;border-radius: 10px">
                         <div style="position: relative">
@@ -856,7 +860,7 @@
                         </div>
                     </div>
                 </div>
-                <div class="mask-zzz hidden" style="position:absolute; top:0;width: 900px;padding:0;height: 408px;background-color:white;z-index: 1;">
+                <div class="mask-zzz hidden" style="position:absolute; top:0;padding:0;height: 408px;background-color:white;z-index: 1;">
                     <img style="width: 100%;height: 100%" src="/images/pc/pc_mh.png">
                     <div class="mask-zzz" style="position:absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0);width: 500px;background-color: white;z-index: 100;border-radius: 10px">
                         <div style="position: relative">
@@ -870,7 +874,7 @@
                         </div>
                     </div>
                 </div>
-                <div class="mask-zzz hidden free-equity-mask" style="position:absolute; top:0;width: 900px;padding:0;height: 587px;background-color:white;z-index: 1;">
+                <div class="mask-zzz hidden free-equity-mask" style="position:absolute; top:0;padding:0;height: 587px;background-color:white;z-index: 1;">
                     <img style="width: 100%;height: 100%" src="/images/pc/pc_mh.png">
                     <div class="mask-zzz" style="position:absolute; left: 50%; top: 50%; transform: translate3d(-50%, -50%, 0);width: 632px;background-color: white;z-index: 100;border-radius: 10px">
                         <div style="position: relative">
@@ -1453,138 +1457,29 @@
                 </center>
                 {{if .T.obj.urltop}}<a class="trs" style="color:white"> </a>{{end}}
             </div>
-            <div class="exposure-content-right--group">
-                <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1" style="cursor: default;">
-                    <!--通过下方脚本注入-->
-                </div>
-                <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1-Medical">
-                    <!--通过下方脚本注入-->
-                </div>
-                <script>
-                  /**
-                   * @date 2022-10-15
-                   * 原有右侧曝光广告位区域,业务逻辑已无从确认
-                   * 从代码逻辑上包含排除非启用状态广告(新版已通过Ad 函数支持无需前端判断)、随机展示一个广告
-                   */
-                  {{$s:=(Ad "jy-pccontent-right" -1 .Host)}}
-                  var ADList={{$s}};
-                  var ExcludeList = ""
-                  if (ADList.length>0){
-                    for (var i=0;i<ADList.length;i++ ){
-                      if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
-                        break;
-                      }
-                      var random=Math.floor(Math.random()*ADList.length);
-                      if (ExcludeList.indexOf(random)>-1){
-                        continue;
-                      }
-                      var AD=ADList[random];
-                      if (AD.o_extend != undefined) {
-                        var nowTime = new Date().getTime();
-                        if (AD.o_extend.startTime!=undefined){
-                          var stArr = AD.o_extend.startTime.split("-");
-                          if (stArr.length==6){
-                            var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
-                            var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
-                            //未开始
-                            if (stTime>nowTime){
-                              if (ExcludeList!=""){
-                                ExcludeList +="-"
-                              }
-                              ExcludeList = ExcludeList+ random
-                              continue
-                            }
-                          }
-                        }
-                        if (AD.o_extend.endTime!=undefined){
-                          var etArr = AD.o_extend.endTime.split("-");
-                          if (etArr.length==6){
-                            var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
-                            var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
-                            //已结束
-                            if (etTime<nowTime){
-                              if (ExcludeList!=""){
-                                ExcludeList +="-"
-                              }
-                              ExcludeList = ExcludeList+ random
-                              continue
-                            }
-                          }
-                        }
-                      }
-                      var ADHtml = "";
-                      if(AD.s_pic){
-                        if(AD.s_link){
-                          ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
-                        }
-                        ADHtml += "<img id='pc-article-content-right' src='"+AD.s_pic+"'>";
-                        if(AD.s_link){
-                          ADHtml += "</a>";
-                        }
-                      }else {
-                        ADHtml += AD.s_script;
-                      }
-                      $("#B1").html(ADHtml);
-                      break;
-                    }
-                  }
-                  /**
-                   * @date 2022-10-15
-                   * 医疗卫生标签额外新增右侧曝光广告位区域
-                   */
-
-                  function addIndustryExclusive () {
-                    {{$s_medical:=(Ad "jy-pccontent-right--medical" -1 .Host)}}
-                    var ADListOfMedical = {{$s_medical}} || []
-                    var waitAppendHtml = ''
-
-                    /**
-                     * ADListOfMedical.forEach(function (item) {
-                     *         waitAppendHtml += `
-                     *         <div onclick="adv_statistics(this)" adv_name="${item.s_remark}" class="exposure-content-right" data-has-link="${Boolean(item.s_link)}">
-                     *             <a dataHref="${item.s_link}"> <img src="${item.s_pic}"> </a>
-                     *             <img src="${item.s_pic}">
-                     *         </div>
-                     *       `
-                     *  })
-                     */
-                    ADListOfMedical.forEach(function (item) {
-                      waitAppendHtml += "\n        <div onclick=\"adv_statistics(this)\" adv_name=\"".concat(item.s_remark, "\" class=\"exposure-content-right\" data-has-link=\"").concat(Boolean(item.s_link), "\">\n            <a dataHref=\"").concat(item.s_link, "\"> <img src=\"").concat(item.s_pic, "\"> </a>\n            <img src=\"").concat(item.s_pic, "\">\n        </div>\n      ");
-                    });
 
-                    $('#B1').after(waitAppendHtml)
-                  }
-
-                  try {
-                    if (goTemplateData.params.obj.indadd === 'YLWS' || goTemplateData.params.obj.industry === '医疗卫生') {
-                      addIndustryExclusive()
-                    }
-                  } catch (e) {}
-                </script>
-                <div class="_29p15mchdsg" style="margin-top: 12px"></div>
-
-            </div>
             <!--去掉一键报告排版问题-->
-            <!--<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-        <div class="modal-dialog" style="width: 458px">
-            <div class="modal-content" style="width: 458px;margin: auto;height: 300px;">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-                    <h4 class="modal-title" id="myModalLabel" style="font-size:14px;">请描述排版存在的问题(非必填)</h4>
-                </div>
-                <div class="modal-body" style="height: 181px;">
-                    <textarea class="form-control noresize" id="onekey-value" rows="6" maxlength="200"></textarea>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn" id="onekey">提交</button>
+              <!--<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+                <div class="modal-dialog" style="width: 458px">
+                    <div class="modal-content" style="width: 458px;margin: auto;height: 300px;">
+                        <div class="modal-header">
+                            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+                            <h4 class="modal-title" id="myModalLabel" style="font-size:14px;">请描述排版存在的问题(非必填)</h4>
+                        </div>
+                        <div class="modal-body" style="height: 181px;">
+                            <textarea class="form-control noresize" id="onekey-value" rows="6" maxlength="200"></textarea>
+                        </div>
+                        <div class="modal-footer">
+                            <button type="button" class="btn" id="onekey">提交</button>
+                        </div>
+                    </div>
                 </div>
-            </div>
-        </div>
-    </div>-->
-            <!--S-- NPS评分 --S-->
-            <div id="nps-container"></div>
-            <!--E-- NPS评分 --E-->
-            <div class="otherinfo">
+              </div>-->
+              <!--S-- NPS评分 --S-->
+              <div id="nps-container"></div>
+              <!--E-- NPS评分 --E-->
+
+              <div class="otherinfo">
                 <!--同一个项目的其他招标信息-->
                 {{if .T.projectOther}}
                 <div class="com-title">
@@ -1594,7 +1489,7 @@
                     {{range $k,$v := .T.projectOther}}
                     <li>
                         <div class="com-index">{{$v.index}}.</div>
-                        <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-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$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 or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
@@ -1616,7 +1511,7 @@
                     {{range $k,$v := .T.buyerOther}}
                     <li>
                         <div class="com-index">{{$v.index}}.</div>
-                        <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-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$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 or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
@@ -1638,7 +1533,7 @@
                     {{range $k,$v := .T.winnerOther}}
                     <li>
                         <div class="com-index">{{$v.index}}.</div>
-                        <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-title"><a href="/article/content/{{$v._id}}.html{{if $v.industry}}?industry={{$v.industry}}{{end}}" target="_blank" title="{{$v.title}}">{{$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 or (eq  $v.type "拟建") ( eq  $v.type "采购意向")}}
@@ -1653,73 +1548,190 @@
                     {{end}}
                 </ul>
                 {{end}}
-            </div>
-        </div>
-        <div   onclick="adv_statistics(this)" adv_name="PC快照页-底部"  class="adv-pccontent-bottom" id="B2" style="cursor:default;">
-            <script>
-              {{$s:=(Ad "jy-pccontent-bottom" -1 .Host)}}
-              var ADList={{$s}};
-              var ExcludeList = ""
-              if (ADList.length>0){
-                for (var i=0;i<ADList.length;i++ ){
-                  if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
-                    break;
-                  }
-                  var random=Math.floor(Math.random()*ADList.length);
-                  if (ExcludeList.indexOf(random)>-1){
-                    continue;
-                  }
-                  var AD=ADList[random];
-                  if (AD.o_extend != undefined) {
-                    var nowTime = new Date().getTime();
-                    if (AD.o_extend.startTime!=undefined){
-                      var stArr = AD.o_extend.startTime.split("-");
-                      if (stArr.length==6){
-                        var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
-                        var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
-                        //未开始
-                        if (stTime>nowTime){
-                          if (ExcludeList!=""){
-                            ExcludeList +="-"
+              </div>
+
+              <div onclick="adv_statistics(this)" adv_name="PC快照页-底部"  class="adv-pccontent-bottom" id="B2" style="cursor:default;">
+                <script>
+                  {{$s:=(Ad "jy-pccontent-bottom" -1 .Host)}}
+                  var ADList={{$s}};
+                  var ExcludeList = ""
+                  if (ADList.length>0){
+                    for (var i=0;i<ADList.length;i++ ){
+                      if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
+                        break;
+                      }
+                      var random=Math.floor(Math.random()*ADList.length);
+                      if (ExcludeList.indexOf(random)>-1){
+                        continue;
+                      }
+                      var AD=ADList[random];
+                      if (AD.o_extend != undefined) {
+                        var nowTime = new Date().getTime();
+                        if (AD.o_extend.startTime!=undefined){
+                          var stArr = AD.o_extend.startTime.split("-");
+                          if (stArr.length==6){
+                            var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
+                            var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
+                            //未开始
+                            if (stTime>nowTime){
+                              if (ExcludeList!=""){
+                                ExcludeList +="-"
+                              }
+                              ExcludeList = ExcludeList+ random
+                              continue
+                            }
                           }
-                          ExcludeList = ExcludeList+ random
-                          continue
                         }
-                      }
-                    }
-                    if (AD.o_extend.endTime!=undefined){
-                      var etArr = AD.o_extend.endTime.split("-");
-                      if (etArr.length==6){
-                        var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
-                        var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
-                        //已结束
-                        if (etTime<nowTime){
-                          if (ExcludeList!=""){
-                            ExcludeList +="-"
+                        if (AD.o_extend.endTime!=undefined){
+                          var etArr = AD.o_extend.endTime.split("-");
+                          if (etArr.length==6){
+                            var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
+                            var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
+                            //已结束
+                            if (etTime<nowTime){
+                              if (ExcludeList!=""){
+                                ExcludeList +="-"
+                              }
+                              ExcludeList = ExcludeList+ random
+                              continue
+                            }
                           }
-                          ExcludeList = ExcludeList+ random
-                          continue
                         }
                       }
+                      var ADHtml = "";
+                      if(AD.s_pic){
+                        if(AD.s_link){
+                          ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
+                        }
+                        ADHtml += "<img id='pc-article-content-bottom' src='"+AD.s_pic+"'>";
+                        if(AD.s_link){
+                          ADHtml += "</a>";
+                        }
+                      }else {
+                        ADHtml += AD.s_script;
+                      }
+                      $("#B2").html(ADHtml);
+                      break;
                     }
                   }
-                  var ADHtml = "";
-                  if(AD.s_pic){
-                    if(AD.s_link){
-                      ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
+                </script>
+              </div>
+          </div>
+            <div class="exposure-content-right--group">
+                <!-- 广告位 -->
+                <section class="banner-right-container old-banner">
+                  <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1" style="cursor: default;">
+                      <!--通过下方脚本注入-->
+                  </div>
+                  <div onclick="adv_statistics(this)" adv_name="PC快照页-右部" class="exposure-content-right" id="B1-Medical">
+                      <!--通过下方脚本注入-->
+                  </div>
+                  <script>
+                    /**
+                     * @date 2022-10-15
+                     * 原有右侧曝光广告位区域,业务逻辑已无从确认
+                     * 从代码逻辑上包含排除非启用状态广告(新版已通过Ad 函数支持无需前端判断)、随机展示一个广告
+                     */
+                    {{$s:=(Ad "jy-pccontent-right" -1 .Host)}}
+                    var ADList={{$s}};
+                    var ExcludeList = ""
+                    if (ADList.length>0){
+                      for (var i=0;i<ADList.length;i++ ){
+                        if (ExcludeList!=""&&ExcludeList.split("-").length==ADList.length){
+                          break;
+                        }
+                        var random=Math.floor(Math.random()*ADList.length);
+                        if (ExcludeList.indexOf(random)>-1){
+                          continue;
+                        }
+                        var AD=ADList[random];
+                        if (AD.o_extend != undefined) {
+                          var nowTime = new Date().getTime();
+                          if (AD.o_extend.startTime!=undefined){
+                            var stArr = AD.o_extend.startTime.split("-");
+                            if (stArr.length==6){
+                              var stStr = stArr[0]+"-"+stArr[1]+"-"+stArr[2]+" "+stArr[3]+":"+stArr[4]+":"+stArr[5]
+                              var stTime = new Date(stStr.replace(/-/g, '/')).getTime();
+                              //未开始
+                              if (stTime>nowTime){
+                                if (ExcludeList!=""){
+                                  ExcludeList +="-"
+                                }
+                                ExcludeList = ExcludeList+ random
+                                continue
+                              }
+                            }
+                          }
+                          if (AD.o_extend.endTime!=undefined){
+                            var etArr = AD.o_extend.endTime.split("-");
+                            if (etArr.length==6){
+                              var etStr = etArr[0]+"-"+etArr[1]+"-"+etArr[2]+" "+etArr[3]+":"+etArr[4]+":"+etArr[5]
+                              var etTime = new Date(etStr.replace(/-/g, '/')).getTime();
+                              //已结束
+                              if (etTime<nowTime){
+                                if (ExcludeList!=""){
+                                  ExcludeList +="-"
+                                }
+                                ExcludeList = ExcludeList+ random
+                                continue
+                              }
+                            }
+                          }
+                        }
+                        var ADHtml = "";
+                        if(AD.s_pic){
+                          if(AD.s_link){
+                            ADHtml += "<a dataHref='"+AD.s_link+"' target='_blank'>";
+                          }
+                          ADHtml += "<img id='pc-article-content-right' src='"+AD.s_pic+"'>";
+                          if(AD.s_link){
+                            ADHtml += "</a>";
+                          }
+                        }else {
+                          ADHtml += AD.s_script;
+                        }
+                        $("#B1").html(ADHtml);
+                        break;
+                      }
                     }
-                    ADHtml += "<img id='pc-article-content-bottom' src='"+AD.s_pic+"'>";
-                    if(AD.s_link){
-                      ADHtml += "</a>";
+                    /**
+                     * @date 2022-10-15
+                     * 医疗卫生标签额外新增右侧曝光广告位区域
+                     */
+
+                    function addIndustryExclusive () {
+                      {{$s_medical:=(Ad "jy-pccontent-right--medical" -1 .Host)}}
+                      var ADListOfMedical = {{$s_medical}} || []
+                      var waitAppendHtml = ''
+
+                      /**
+                       * ADListOfMedical.forEach(function (item) {
+                       *         waitAppendHtml += `
+                       *         <div onclick="adv_statistics(this)" adv_name="${item.s_remark}" class="exposure-content-right" data-has-link="${Boolean(item.s_link)}">
+                       *             <a dataHref="${item.s_link}"> <img src="${item.s_pic}"> </a>
+                       *             <img src="${item.s_pic}">
+                       *         </div>
+                       *       `
+                       *  })
+                       */
+                      ADListOfMedical.forEach(function (item) {
+                        waitAppendHtml += "\n        <div onclick=\"adv_statistics(this)\" adv_name=\"".concat(item.s_remark, "\" class=\"exposure-content-right\" data-has-link=\"").concat(Boolean(item.s_link), "\">\n            <a dataHref=\"").concat(item.s_link, "\"> <img src=\"").concat(item.s_pic, "\"> </a>\n            <img src=\"").concat(item.s_pic, "\">\n        </div>\n      ");
+                      });
+
+                      $('#B1').after(waitAppendHtml)
                     }
-                  }else {
-                    ADHtml += AD.s_script;
-                  }
-                  $("#B2").html(ADHtml);
-                  break;
-                }
-              }
-            </script>
+
+                    try {
+                      if (goTemplateData.params.obj.indadd === 'YLWS' || goTemplateData.params.obj.industry === '医疗卫生') {
+                        addIndustryExclusive()
+                      }
+                    } catch (e) {}
+                  </script>
+                </section>
+                <section class="banner-right-container seo-banner">
+                    {{include "/pc/tags/template/aside-news-cards.html"}}
+                </section>
+            </div>
         </div>
         <!-- 商机管理认领-自定义标签弹框 -->
         <div class="tags-box" id="entNicheTags">

+ 8 - 9
src/web/templates/pc/newIndex.html

@@ -47,7 +47,7 @@
           <div class="banner-swiper swiper-container" id="new-pc-index-top-carousel">
             <div class="swiper-wrapper">
               {{range $ad := $ad_1}}
-              <a class="swiper-slide" target="_blank" href="{{$ad.S_link}}">
+              <a class="swiper-slide" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                 <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
               </a>
               {{end}}
@@ -72,7 +72,7 @@
                 <div class="banner-swiper swiper-container" id="new-pc-index-carousel">
                   <div class="swiper-wrapper">
                     {{range $ad := $ad_2}}
-                    <a class="swiper-slide" target="_blank" href="{{$ad.S_link}}">
+                    <a class="swiper-slide" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                       <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                     </a>
                     {{end}}
@@ -97,7 +97,7 @@
               <div class="banner-swiper swiper-container" id="new-pc-index-middle-carousel">
                 <div class="swiper-wrapper">
                   {{range $ad := $ad_3}}
-                  <a class="swiper-slide banner-remark" target="_blank" href="{{$ad.S_link}}">
+                  <a class="swiper-slide banner-remark" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                     <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                   </a>
                   {{end}}
@@ -118,7 +118,7 @@
                 <div class="banner-swiper swiper-container" id="new-pc-index-twenty-three-left">
                   <div class="swiper-wrapper">
                     {{range $ad := $ad_4}}
-                    <a class="swiper-slide banner-remark" target="_blank" href="{{$ad.S_link}}">
+                    <a class="swiper-slide banner-remark" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                       <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                     </a>
                     {{end}}
@@ -133,7 +133,7 @@
                 <div class="banner-swiper swiper-container" id="new-pc-index-twenty-three-right">
                   <div class="swiper-wrapper">
                     {{range $ad := $ad_5}}
-                    <a class="swiper-slide banner-remark" target="_blank" href="{{$ad.S_link}}">
+                    <a class="swiper-slide banner-remark" target="_blank" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
                       <img class="img-banner" src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
                     </a>
                     {{end}}
@@ -208,7 +208,6 @@
       {{include "/common/pcbottom.html"}}
     </div>
   </section>
-
   <script src="//cdn-common.jianyu360.com/cdn/lib/vue/2.7.14/vue.min.js"></script>
   <script src=//cdn-common.jianyu360.com/cdn/lib/svga-web/svga.min.js></script>
   <script src="//cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.7/lib/index.js"></script>
@@ -224,12 +223,12 @@
   {{include "/pc/template/index/index-bottom-float-ad.html"}}
   <!-- 新用户弹窗 -->
   <!-- include "/common/pc_ad_dialog.html" -->
-  <script type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_2023.12.js?v={{Msg "seo" "version"}}'></script>
-  <script defer src=//cdn-common.jianyu360.com/cdn/lib/echarts/4.8.0/echarts.min.js></script>
-  <script defer type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_charts.js?v={{Msg "seo" "version"}}'></script>
   <script>
     haslogin('10')
   </script>
+  <script type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_2023.12.js?v={{Msg "seo" "version"}}'></script>
+  <script defer src=//cdn-common.jianyu360.com/cdn/lib/echarts/4.8.0/echarts.min.js></script>
+  <script defer type="text/javascript" src='{{Msg "seo" "cdn"}}/js/index/index_charts.js?v={{Msg "seo" "version"}}'></script>
 </body>
 
 </html>

+ 1 - 1
src/web/templates/pc/template/index/banner-module-27.html

@@ -5,7 +5,7 @@
   <ul class="banner-module-list-27 clearfix">
     {{range $ad := $ad_27}}
     <li class="banner-module-item-27 banner-remark">
-      <a href="{{$ad.S_link}}" target="_blank">
+      <a {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}} target="_blank">
         <img src='{{$ad.S_pic}}' alt="{{$ad.S_picalt}}">
       </a>
     </li>

+ 69 - 59
src/web/templates/pc/template/index/index-bottom-float-ad.html

@@ -1,63 +1,73 @@
-<div class="pc-index-bottom" style="display: none;">
-  <img class="bottom-member-ad" adv_name="PC首页广告位-底部" src="" alt="底部广告位">
-</div>
-
-<script>
-  $(function () {
-    // 首页底部广告位
-    {{$bottom:=(Ad "jy_pc_index_bottom" -1 .Host)}}
-    var bottom_img = ({{$bottom}})
-
-    // 首页底部样式调整,适配广告位
-    function fixBottomADHeight (type) {
-      var adHeight = $('.pc-index-bottom').height()
-      if (type) {
-        $(".jy_renzheng").css('padding-bottom', adHeight)
-        $(".j-bottom").attr('data-padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')))
-        $(".j-bottom").css('padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')) + adHeight)
-      } else {
-        $(".jy_renzheng").css('padding-bottom', 0)
-        $(".j-bottom").css('padding-bottom', Number($(".j-bottom").attr('data-padding-bottom')))
-      }
-    }
-    $('.pc-index-bottom .bottom-member-ad').on('load', function () {
-      fixBottomADHeight(true)
-    })
-    $('.pc-index-bottom .bottom-member-ad').attr('src', bottom_img[0].s_pic)
-    $('.pc-index-bottom .bottom-member-ad').unbind('click').click(function () {
-      window.open(bottom_img[0].s_link)
-    })
-
-
-    clearInterval(memberTimer)
-    var memberTimer = setInterval(function () {
-      if (window.memberStatus >= 0) {
-        clearInterval(memberTimer)
-      }
-      adBottomFn()
-    }, 2000)
-    function adBottomFn () {
-      if (window.memberStatus > 0) {
-        $('.pc-index-bottom').hide()
-        fixBottomADHeight(false)
-      } else {
-        var top1 = 0;
-        var top2 = 0;
-        var timer = null; 
-        $('.pc-index-bottom').fadeIn()
-        $(document).scroll(function(){
-          clearTimeout(timer)
-          timer = setTimeout(isScrollEnd, 1000);
-          top1 = document.documentElement.scrollTop || document.body.scrollTop;
-          $('.pc-index-bottom').fadeOut()
+{{$bottom:=(Ad "jy_pc_index_bottom" -1 .Host)}}
+{{if $bottom}}
+  {{if gt (len $bottom) 0}}
+    <div class="pc-index-bottom" style="display: none;">
+      <img class="bottom-member-ad" adv_name="PC首页广告位-底部" src="" alt="底部广告位">
+    </div>
+    
+    <script>
+      $(function () {
+        // 首页底部广告位
+        var bottom_img = ({{$bottom}})
+        // 首页底部样式调整,适配广告位
+        function fixBottomADHeight (type) {
+          var adHeight = $('.pc-index-bottom').height()
+          if (type) {
+            $(".jy_renzheng").css('padding-bottom', adHeight)
+            $(".j-bottom").attr('data-padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')))
+            $(".j-bottom").css('padding-bottom', Number($(".j-bottom").css('padding-bottom').replace('px', '')) + adHeight)
+          } else {
+            $(".jy_renzheng").css('padding-bottom', 0)
+            $(".j-bottom").css('padding-bottom', Number($(".j-bottom").attr('data-padding-bottom')))
+          }
+        }
+        $('.pc-index-bottom .bottom-member-ad').on('load', function () {
+          fixBottomADHeight(true)
         })
-        function isScrollEnd() {
-          top2 = document.documentElement.scrollTop || document.body.scrollTop;
-          if(top1 == top2 && (window.memberStatus <= 0 || !window.memberStatus)){
+        if ($.isArray(bottom_img)) {
+          if (bottom_img[0]) {
+            if (bottom_img[0].s_pic) {
+              $('.pc-index-bottom .bottom-member-ad').attr('src', bottom_img[0].s_pic)
+            }
+            if (bottom_img[0].s_link) {
+              $('.pc-index-bottom .bottom-member-ad').unbind('click').click(function () {
+                window.open(bottom_img[0].s_link)
+              })
+            }
+          }
+        }
+    
+        clearInterval(memberTimer)
+        var memberTimer = setInterval(function () {
+          if (window.memberStatus >= 0) {
+            clearInterval(memberTimer)
+          }
+          adBottomFn()
+        }, 2000)
+        function adBottomFn () {
+          if (window.memberStatus > 0) {
+            $('.pc-index-bottom').hide()
+            fixBottomADHeight(false)
+          } else {
+            var top1 = 0;
+            var top2 = 0;
+            var timer = null; 
             $('.pc-index-bottom').fadeIn()
+            $(document).scroll(function(){
+              clearTimeout(timer)
+              timer = setTimeout(isScrollEnd, 1000);
+              top1 = document.documentElement.scrollTop || document.body.scrollTop;
+              $('.pc-index-bottom').fadeOut()
+            })
+            function isScrollEnd() {
+              top2 = document.documentElement.scrollTop || document.body.scrollTop;
+              if(top1 == top2 && (window.memberStatus <= 0 || !window.memberStatus)){
+                $('.pc-index-bottom').fadeIn()
+              }
+            }
           }
         }
-      }
-    }
-  })
-</script>
+      })
+    </script>
+  {{end}}
+{{end}}

+ 1 - 1
src/web/templates/pc/template/index/partners-project-list.html

@@ -5,7 +5,7 @@
   <ul class="partners-project-list clearfix">
     {{range $ad := $ad_5}}
     <li class="partners-project-item">
-      <a href="{{$ad.S_link}}">
+      <a {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}} target="_blank">
         <img src="{{$ad.S_pic}}" alt="{{$ad.S_picalt}}">
       </a>
     </li>

+ 1 - 1
src/web/templates/pc/template/index/user-info-card.html

@@ -43,7 +43,7 @@
     <ul class="user-power-list clearfix">
       {{range $ad := $ad_menu}}
         <li class="user-power-item pointer">
-          <a class="user-power-item-link" href="{{$ad.S_link}}">
+          <a class="user-power-item-link" {{if $ad.S_link}}href="{{$ad.S_link}}"{{end}}>
             <span class="user-power-item-icon">
               <img src="{{$ad.S_pic}}" alt="{{$ad.S_picalt}}">
             </span>

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